# پایگاه‌های داده > سایر پایگاه‌های داده > Foxpro >  مشکل سرعت در بانکهای دارای رکورد میلیونی

## lanjmiras

سلام 
1) چگونه میتوان با سرعت بالا از بانکهائی که دارای رکوردهای میلیونی هستند ، گزارش گرفت ؟(ایندکس سازی بطور کامل جواب نمیدهد)
2) آیا با دستور خاصی میتوان Regional and languages سیستم را به زبان Arabic تغییر داد؟

----------


## amir.azimi2000

با سلام .
1) بهترین و مطمئن ترین کار استفاده از دستورات Sql و یا اسفاده از Query Designer خود فاکس پرو است .

----------


## arashkhaan2002

اگر برنامه تک کاربره و بانک ها روی همان کامپیوتر هست ، دستور SELECT-SQL تنها راهه و اگر تحت شبکه کار میکنید هم از VIEW و SQL با هم استفاده کنید.

----------


## lanjmiras

سلام 
اگر شما از دستورات SQL هم استفاده کنید تنها زمانی سرعت گزارش بالا خواهد بود که در قسمت Where آن دقیقاً از همان شکل ایندکس استفاده کنید در غیر اینصورت سرعت کند است .
مثلاً شما ایندکسی بر اساس فیلد تاریخ ساخته اید و در شرط گزارش میگوئید که تاریخ مساوی x  باشد . 
حتی اگر بگوئید که  '88'=(Substr(tarikh,1,2 و ایندکس شما براساس tarikh باشد باز هم سرعت گزارش بسیار پائین است .

----------


## amir.azimi2000

سلام .
خودت جواب سوال خودت را دادی .
شما دقیقا براساس پارامتری که میخواهی گزارش بسازی ، ایندکس هم بساز . مثلا در مثال فوق بر اساس
Substr(tarikh,1,2 یک شاخص بساز.
موفق باشی.

----------


## lanjmiras

تعداد گزارشهای مورد نیاز خیلی زیاد است و اگر قرار باشد بر اساس هر گزارش یک ایندکس مشابه ترکیبی بسازیم حجم فایل CDX بسیار بالا میشود و مشکلات دیگری ایجاد میگردد بنابراین این روش مناسب نیست

----------


## Parmida48

چرا جداولتون رو تکه تکه نمیکنین ؟
مثلا اگر برنامتون یک برنامه حسابداریه ، میتونین آرشیو اصلی تونو  برای هر سال در یک جدول جدا قرار بدین ، به این ترتیب   حتی اگه از ابزارهای معمولی هم استفاده کنین سرعت سیستمتون در حد قابل قبولی خواهد بود .
اگه برنامتون تحت شیکه س میتونین گزارشات رو بصورت موقت با استفاده از شماره ایستگاه بسازید .
به این ترتیب تعداد فایلهای بلااستفاده ، حتی اگه پاکشون هم نکنین از شمار تعداد ایستگاههای کاری بالاتر نمیره .
بای .

----------


## سعید حمیدیانفر

سلام 
چه اجباری دارید که به هر قیمت ممکن میخواین از جداول VFP استفاده کنید. ما به راحتی میتونیم به سایر متور های دیتابیس کانکت بشیم و از قدرت اونها در VFP لذت ببریم 

مثلا شما با چند دستور ساده میتونید به یک دیتا بیس ms sql2005 متصل بشید و جداولش رو بصورت یک کرسر تو برنامتون مدیریت کنید . 
اگه تمایل دارین بفرمایید تا جزئیات بیشتری رو عرض کنم .

----------


## arashkhaan2002

سلام حمید جان اگه میشه روش کار رو با جزئیات و مثال بذار اگه تجربه کردی و در صورت امکان خود نرم افزار sql رو هم بزار چون خیلی ها این کار واسشون جالبه .

----------


## سعید حمیدیانفر

اجالتا این مقاله رو ببینید
مربوط به مدتها پیشه که زحمتشو دوستان عزیزمون آقای رضا توکل  و آقای حسین زاده کشیدن
نحوه برقراری ارتباط با  mysql  هست بهمراه جزئیات و ابزارهای لازم 

http://www.binyazprograms.com/indexfa.php?page=article&stid=11
مقاله جالبیه 

فقط یک نکته 
احتمالا برای دانلود کردن mysql به مشکل بر بخورید بخاطر مسائل تحریم و ...
التبه اگه تحریم هم نمی بودیم فرقی نمیکرد توصیه میکنم این نرم افزار رو دانلود کنید تا براحتی هر چه تمام تر مای اسکیو ال رو براتون نصب کنه 
http://downloads.sourceforge.net/project/xampp/XAMPP%20Windows/1.7.2/xampp-win32-1.7.2.exe
نرم افزار xampp براتون وب سرور آپاچی و همچنین دیتابیس سرور Mysql رو در محیط ویندوز نصب و راه اندازی میکنه 


ان شاء الله تو اولین فرصت یه مقاله برای ارتباط با ms sql 2005  آماده میکنم تا دوستان استفاده کنن

----------


## arashkhaan2002

لینک xampp.exe رو پیدا نمیکنه!!

----------


## arashkhaan2002

من کمی با VFPODBC کارکرم کارش عین کار با همین mysql هستش . میخوام ببینم وقتی من از طریق VFPODBC به یه شاخه از بانک های فاکس وصل میشم ، و ازشون ویوی کامل میگیرم و با ویو کار میکنم ، سرعت کار با بانک روی شبکه بالا میره یا نه؟ آیا کسی با ویوی خود فاکس از طریق VFPODBC کارکرده؟ کی میدونه شاید از SQL هم بهتر جواب بده..

----------


## سعید حمیدیانفر

دوست عزیز 
قطعا سرعت کار با جداول فاکس وقتی مستقیما با هاش کار میکنید بالاتره 
odbc یک رابط بین انجین مورد نظر شما (access mysql mssql,...) هست با فاکس که به مراتب سرعت کار رو پایین میاره 

بنا بر این تا مجبور نشدیم ازش استفاده نمیکنیم 
حالا سوال اینجاست که چه وقتی و چرا مجبور میشیم از جداول فاکس استفاده نکنیم ؟

وقتی که روی شبکه کار میکنیم و به دلایل امنیتی file sharing نداریم 
وقتی که حجم رکوردها و داده هامون بالا تر از 1 گیگا بایت و یا 2 میلیون رکورد میشه 

تو این شرایط برای اینکه قدرت سایر انجینهای بانک اطلاعاتی رو در اختیار بگیریم تنها راهمون استفاده از odbc است 
و بهترین نتیجه رو (بنا به تجربه خودم و دوستانی که کار کردن) استفاده از vfp با my sql به شرط اینکه دیتابیس سرور windows باشه . و در صورت استفاده از سیستم عامل لینوکس mysql ترجیح داده میشه 

*ضمنا ما به هیچ طریقی نمیتونیم از دیتا بیس فاکس روی شبکه بدون فایل شیرینگ استفاده کنیم چون file base است .*

----------


## arashkhaan2002

اینطور که شما میفرمائید پس فلسفه وجود VFP ODBC (dbf driver ) و همچنین Remote view برای اتصال راه دور به بانک های فاکس زیر سوال میره که؟ یعنی بدرد نمیخورن واقعا؟

----------


## سعید حمیدیانفر

> اینطور که شما میفرمائید پس فلسفه وجود VFP ODBC (dbf driver ) و همچنین Remote view برای اتصال راه دور به بانک های فاکس زیر سوال میره که؟ یعنی بدرد نمیخورن واقعا؟


چرا اتفاقا به درد میخورن 
اما ظاهرا بنده نتونستم خوب منظورم رو منتقل کنم 
فلسفه وجودی VFP ODBC dbf Driver یک کاربرد داره 
و REMOTE VIEW یه کاربرد دیگه 

معمولا برای اینکه شما بتونید از طریق واسط ODBC به یک موتور (انجین) بانک اطلاعاتی متصل بشید میباید درایور مخصوص اون انجین رو رو سیستم نصب بفرمایید ا اونوقت بتونید از ODBC استفاده کنید VFP ODBC dbf Driver وقتی کاربرد داره که شما بخوای از یک برنامه (که با زبانی غیر از فاکس مینویسید ) به یک جدول یا بانک اطلاعاتی VFP ازتباط برقرا کنید . 
اما remot view زمانی استفاده میشه که برعکس این قضیه اتفاق می افته یعنی برنامه رو با VFP نوشتی و میخواید به دیتابیس sql یا access وصل بشید . که در این صورت هم حتما باید درایور odbc مخصوص mysql رو سیستم نصب باشه . 

*بنا براین odbc نمیتونه ماهیت file base بودن یک دیتابیس انجین مثل فاکس رو تغییر بده که ما بتونیم مانند sql server بهش وصل بشیم .*

----------


## arashkhaan2002

یسیار عالی ممنون از توضیحاتتون ، فعلامشکل من از نظر سرعت حل شده چون با توجه به اینکه من در کل برنامه ام فقط از دستورات sqlاستفاده کرده ام و مشکل کندی شدید داشتم به توصیه یکی از دوستان روی کلیه فیلدهای مهم ایندکس ساختم و سرعت به صورت فوق العاده ای بالا رفت .
پس اگر هم در سالهای آتی سرعت افتاد میتونم بانک هامو بیارم رو sql و با ایجاد Remote View به همون نامها بدون دست زدن به برنامه ام با اونها کارکنم چون اسامی بانکها در برنامه ام به صورت پارامتری تعریف شده . 

مشکلی که الان دارم اینه که بدلیل شبکه نامناسب و حجم کار بالا هنگام شماره سند دادن هنگام ثبت گاها پیش میومد که در فاصله بین شماره دهی سند (یافتن شماره آخرین سند +1) و دستور Insert کاربر دیگری هم میرفت و همین شماره رو میگرفت (چون کاربر اول هنوز شماره اش ثبت نشده ) و دو سند متفاوت یک شماره میگرفت ، و همچنین اختلالاتی که گاها هنگام ثبت به وجود میومد ، مجبور شدم موقع شماره دهی و ثبت ، از دستور Flock() استفاده کنم . و چون هنگام ویرایش اسناد رکورد رو با دستور Rlock() قفل میکنم نتیجتا وقتی کسی داره کار ویرایش انجام میده دستور Flock() واسه عملیات ثبت F میشه و کاربر نمیتونه سندشو ثبت کنه تا کاربر ویرایش کننده از سند بیرون بیاد . درسته که امنیت کار بالا رفته و دیگه مشکلی تو اطلاعات پیش نیومده ولی کاربرا خیلی اذیت میشن و معترضا .
شما راه حلی دارید واسه این کار؟

----------


## سعید حمیدیانفر

تو برنامه های تحت شبکه  مثل برنامه شما معمولا شماره سند رو بعد از درج رکورد به کاربر اعلام میکنه . و این باعث میشه مدت زمان لازم برای lock کردن در هنگام درج به حد اقل برسه . شما برای استفاده از این روش مشکلی دارید ؟

----------


## arashkhaan2002

بله 

اگه دو کاربر همزمان دگمه ثبت رو بزنند ، هر دو کلاینت همزمان میرن ببینن شماره سند آخر چنده  ، تا یکی بهش اضافه کنند بشه شماره خودشون ، پس گزارشی به این شکل میگیرن 

select max(no) from snd.dbf into cursor m_no;
.
مثلا بهش شماره 5 رو به عنوان آخرین شماره سند ثبت شده میده
.
.
.
.
یک سری دستورات
.
.
0
بعدش در آخر دستور اینسرت
insert into snd.dbf no value (m_no.max_no+1);

که اینجا شماره سند رو با شماره 6 براش اینسرت میکنه

اگر در حالی که کلاینت اول داره این سلسله دستورات رو انجام میده و در مراحل انجام دستورات قسمت نقطه چین باشه و کلاینت دوم همین دستوراتو اجرا کنه ، به کلاینت دوم هم گزارش شماره 5 میده و بنابراین کلاینت دوم هم سندش رو با شماه 6 ثبت میکنه !!

----------


## arashkhaan2002

ضمنا سوال دیگه من این بود که من برای *ثبت* برای پیش نیومدن تلاقی توضیح داده شده در بالا *Flock*() میکنم ، ولی مشکلی که پیش میاد اینه که اگه کسی در حال ویرایش اسناد قبلی باشه (چون در هنگام ویرایش اسناد ، رکورد رو *Rlock*() میکنم ) اونوقت نمیتونه *flock*() کنه و عملیات ثبت رو انجام نمیده و کاربر رو دربدر میکنه که کی در حال ویرایشه بگه بیاد بیرون! شما چکار میکنید واسه ثبت و ویرایش؟!

----------


## farhad_shiri_ex

اولا چرا فیلد شماره سند را Auto Inc قرار نداده اید که وظیفه کنترل کد تکراری توسط خود فاکس انجام شود چون منهم دقیقا همین کار رو انجام داده ام و مشکلی ندارم.
و حتی اگر از این روش هم استفاده نکرده اید می توانید از روش خود فاکس برای (Ins-del-Upd)  استفاده کنید در صورت تمایل بیشتر توضیح بدهم. 
و حتی باز هم از این دو روش استفاده نکرده اید می توانید در زمانی که یک کلاینت در خواست کد جدید کرد پروسه ایجاد کد را lock کنید تا در صورت درخواست مجدد از طرف کلاینت دیگر با مشکل مواجه نشوید می توانید از حلقه سعی و خطا استفاده نمایید تا زمانی که پروسه کد گیری توسط کلاینت اول تمام شود و بلافاصله به درخواست کننده دوم کد تعلق گیرد.

----------


## arashkhaan2002

من از فاکس 7 استفاده میکنم بخاطر سرعت بسیار بالاترش بخصوص در شبکه نسبت به فاکس 9 بنابراین استفاده از فیلد Auto increase منتفیه .
در مورد این روش هایی دیگه اگه ممکنه بیستر با مثال توضیح بدید ممنون.

----------


## rezaTavak

خودتون AutoInc بسازید در triger اضافه شدن رکورد یک جدول اطلاعاتی داشته باشید که بزرگنرین عدد در آن ذخیره شود سپس به ازای هر درخواست یکی به این عدد اضافه کنید. البته اگر ذخیره انجام نشود مثل autoinc یکسری عدد از بین می‌رود.

----------


## arashkhaan2002

یعنی همه دوستان از Auto inc واسه شماره دهیاشون استفاده میکنن؟ 

حالا اگر من بخوام از طریق برنامه ی فاکسی که نوشتم و بانک های DBF ام به صورت SHARE روی شبکه Workgroup استفاده میشه ، از طریق شبکه اینترانت یا لیز لاین کلاینتی رو به سرور وصل کنم ، آیا Remote view کارساز هست که واسه گزارس گیری های SQLام (که از دستورات SQL استفاده کردم) فاکس نخواد کل دیتا رو از روی بکشه و کلی طول بده؟ دوستان تجربه ای یا راه کاری عملی دارن؟ خود فاکس چه سولوشنی میده؟

----------


## سعید حمیدیانفر

> حالا اگر من بخوام از طریق برنامه ی فاکسی که نوشتم و بانک های DBF ام به صورت SHARE روی شبکه Workgroup استفاده میشه ، از طریق شبکه اینترانت یا لیز لاین کلاینتی رو به سرور وصل کنم ، آیا Remote view کارساز هست


اگه رو همچين شبكه اي امكان File Sharing داشته باشيد (كه توصيه ميشه بخاطر مسائل امنيتي نداشته باشيد) نيازي به remote View نيست . 




> که واسه گزارس گیری های SQLام (که از دستورات SQL استفاده کردم) فاکس نخواد کل دیتا رو از روی بکشه و کلی طول بده؟ دوستان تجربه ای یا راه کاری عملی دارن؟ خود فاکس چه سولوشنی میده؟


برا اين مورد هم شما ميتونيد در ابتداي برنامه كليه جداول رو در چند ناحيه كاري use كنيد و هر جاي برنامه كه نياز به هر مقدار اطلاعات داشتيد با استفاده از دستور select * from <tblname> where into cursor 
كارتون رو راه بندازيد

----------


## nima_9m

با سلام
یکی دیگه از راههای نصب سرور آپاچی نصب wamp server هستش که رایگانه و mysql رو هم نصب میکنه اینم آدرس www.wampserver.com/en/download.php

----------


## arashkhaan2002

خوب الان هم دارم همین کار رو میکنم بانک ها رو تو ناحیه های کاری با آدرس روی سرور اول برنامه فعال میکنم به این شکل
select 2
use '\\server\sds\sanad.dbf' share

اما وقتی از دستورات SQL استفاده میکنم بازم به جای <tblname> که شما فرمودید میذارم
'\\server\sds\sanad.dbf' 
یعنی دستور SQL به این شکل میشه
select * from '\\server\sds\sanad.dbf' where into cursor test;
که خوب باز میره کل اطلاعات رو از روی سرور میکشه و گزارش رو از توش در میاره.
یعنی شما میفرمائید وقتی با دستور اول که در ناحیه 2 بانک رو از آدرسی که روی سرور هست use میکنه 
دیگه تو دستور SQL لازم نیست مسیر کامل رو بدم فقط اسم بانک رو بدم خودش اطلاعات رو از مسیری که در ناحیه 2 فعاله از حافظه میخونه ؟ یعنی اینطوری 
select * from sanad.dbf where into cursor test;
??!!  درست متوجه شدم؟

----------


## yunes_prg

با سلام 
شما میتونی از index  و سپس seek کردن رکودها که یک روش جستجوی باینری هست استفاده کنی

----------


## arashkhaan2002

دوست عزیز آقای حمیدیانفر این سوال آخری منو جواب ندادین هنوز؟
ضمنا تفاوت 2 دستور flush , tableupdate رو میخواستم بودنم ، بعد از دستور Insert موقع ثبت کدومشون رو بگذارم؟

----------


## سعید حمیدیانفر

> یعنی شما میفرمائید وقتی با دستور اول که در ناحیه 2 بانک رو از آدرسی که روی سرور هست use میکنه 
> دیگه تو دستور SQL لازم نیست مسیر کامل رو بدم فقط اسم بانک رو بدم خودش اطلاعات رو از مسیری که در ناحیه 2 فعاله از حافظه میخونه ؟ یعنی اینطوری 
> select * from sanad.dbf where into cursor test;
> ??!!  درست متوجه شدم؟


بله دقیقا همینطوره ولی برای اینکه کل اطلاعات رو از سرور درخواست نکنه باید شرط where رو محدود کنید و رکوردهایی که نیاز دارید

----------


## arashkhaan2002

دوست عزیز 
1- این مورد رو چک کردم جواب نداد اگه در دستور select-SQL مسیر فایل ، DBF روی سرور نباشه ، از DBF مسیر جاری اطلاعات میاره.
2- مشکل جدید که دارم اگر این حالت هم که فرمودید جواب میداد بازم مشکل داشتیم چون اکثر اوقات *اطلاعات داخل حافظه* *کلاینت* (مثلا در ناحیه 2 یک dbf یوز شده) حتی من دستور set refresh  to 1,1 هم گذاشتم به لحظه نیست و اگر کسی روی یک کلاینت سندی بزنه گاها اتفاق میوفته که کلاینت های دیگه اونو نمیبینن یا بدتر از اون با همون شماره (چون نمیبیننش) سند ثبت میکنن و سندها قاطی یا سند اولیه حذف میشه !
این مشکل وقتی از دستور select Max(field_name) from '\\server\sds\sanad.dbf برای پیدا کردن بزرگترین شماره سند استفاده میکنی کمتر بروز میکنه چون میره از روی خود سرور میخونه البته سرعت کار پائینه ولی دیروز من به جای این دستور ، چون رو فیلد شماره سند cdx داشتم ، از دو دستورselect 2, سپس go botom واسه پیدا کردن بزرگترین شماره سند و اضافه کردن عدد 1 برای ایجاد شماره سند جدید استفاده کردم به جای دستور select max(field_name اغلب سیستمها به مشکل خوردن و شماره های پرت و پلا و چند شماره قبل از آخرین شماره رو به عنوان بزرگترین شماره بعد از دستور go bottom بر گردونده!!! جالبش اینجاست که در بعضی قسمتها فقط یک سیستم داشته سند میزده!!!!!!
خلاصه حسابی آبروم رفته نمیدونم علت چیه.
ضمنا هنگام ثبت اطلاعات ابتدا flock میکنم با Insert اطلاعات رو ثبت و بعدش هم flush force کردهunlock میکنم.
*لطفا هرکس میتونه کمک کنه.*
*ممنون*

----------

