ورود

View Full Version : یه مشکل عجیب در دلفی



mskm100
چهارشنبه 18 مهر 1386, 23:54 عصر
سلام دوستان

من یه برنامه نوشتم که با خط تلفن کار می کنه و به این صورته که وقتی زنگ می خوره از جدول اشتراک ها مشترکی رو که دارای اون شماره تلفن هست رو به طور اوتوماتیک در دفتر روزانه ثبت می کنه که البته این دفتر روزانه هم خودش یه جدول با تعدادی فیلد . قسمت درج و ثبت اون اشتراک در جدول روزانه با کمک یه adotable انجام می شد که تا سه ، چهار مه هم در جایی تست شد و هیچ مشکلی نداشت ، تنها مشکلی که وجود داشت این بود که مثلا وقتی حدود 2500 یا بیشتر رکورد در این جدول ثبت می شد برنامه مدتی طول می کشید تا بالا بیاد ، برای حل این مشکل از adoquery استفاده کردم و کاری کردم تا فقط اطلاعات روز جاری رو نشون بده و هر وقت به روزهای قبلی یا بعدی رفت اطلاعات اون ها رو نشون بده البته این کار باعث نشد تا سرعت بالا اومدن برنامه بهتر بشه و زمانی سرعت بالا اومدن اون خوبه که تعداد رکوردها کم باشه که اصولا بعد از استفاده از adoquery تعداد رکوردهای کمی باید در رم بارگذاری بشه و سرعت برنامه بهتر بشه این یه مشکل و مشکل دوم اینکه از وقتی این برنامه با adoquery کار می کنه و قسمت درج و ثبت اوتوماتیکش هم با adoquery کار می کنه یه مشکل جدید هم پیدا شده و اون اینه که برنامه فقط حدود 7 یا 8 روز درست کار می کنه و بعد از این مدت به هیچ عنوان چیزی رو ثبت نمیکنه و جالب اینکه error ی هم نمیده در حالی که قبلا وقتی با adotable کار می کرد این مشکل رو نداشت و فقط تنها مشکلش کند بال اومدن برنامه بعد از ثبت حدود 2500 رکورد بود اگه راهنماییم کنید خیلی ممنون می شم
در ضمن من برای تغییر دستوراتی که دارای اسم adotable مربوطه به adoquery بودن از find and replace استفاده کردم که فکر نمی کنم هیچ ربطی به این موضوع داشته باشه چون اگر اینجوری بود یک روز هم نباید درست کار می کرد .

vcldeveloper
پنج شنبه 19 مهر 1386, 04:41 صبح
برای حل این مشکل از adoquery استفاده کردم و کاری کردم تا فقط اطلاعات روز جاری رو نشون بده و هر وقت به روزهای قبلی یا بعدی رفت اطلاعات اون ها رو نشون بده البته این کار باعث نشد تا سرعت بالا اومدن برنامه بهتر بشه و زمانی سرعت بالا اومدن اون خوبه که تعداد رکوردها کم باشه که اصولا بعد از استفاده از adoquery تعداد رکوردهای کمی باید در رم بارگذاری بشه و سرعت برنامه بهتر بشه
چطوری تعداد رکوردهای لود شده در AdoQuery را محدود کردید؟ اگر لازم نیست که کوئری از همان لحظه اول شروع برنامه اجرا شود، بهتر است آن را Active نکنید، تا زمانی که به داده های آن احتیاج دارید.


یه مشکل جدید هم پیدا شده و اون اینه که برنامه فقط حدود 7 یا 8 روز درست کار می کنه و بعد از این مدت به هیچ عنوان چیزی رو ثبت نمیکنه و جالب اینکه error ی هم نمیده در حالی که قبلا وقتی با adotable کار می کرد این مشکل رو نداشت
اینم بر می گرده به کوئریی که نوشتید. متن کوئری خود را اینجا قرار بدید.

champion
پنج شنبه 19 مهر 1386, 22:21 عصر
ایا توی کوئری join دارین ؟‌ البته برای بالا بردن سرعت کارهای زیادی میشه انجام داد مثلا پیش نهاد میکنم اگه اطلاعات خودتون رو توی گرید نمایش میدین اون رو page / Page لود کنید به جای واکشی مثلا 2000 رکورد ولی برای رفع مشکل اول حتما کوئری تون رو بنویسید تا ببینیم

mskm100
جمعه 20 مهر 1386, 00:52 صبح
with ADOQuery8,SQL do
begin
Clear;
Add('select * from dailynote');
Add('where datee='''+ADOTable3.fieldbyname('datee').AsString+ '''');
Open;
end;

یعنی عملا با این کد فقط رکوردهای مربوط به روز جاری در رم بارگزاری میشه که حدود 100 رکورد و این نسبت به adotable که همون اول حدود 3000 رکورد رو بارگزاری میکنه سریعتر باید انجام بشه .

mskm100
جمعه 20 مهر 1386, 00:56 صبح
if ADOQuery2.FieldByName('moshtel').AsString=g2 then
begin
Form12.ADOQuery8.Insert;
Form12.ADOQuery8.FieldByName('moshnum').AsInteger: =ADOQuery2.FieldByName('moshnum').AsInteger;
Form12.ADOQuery8.FieldByName('mname').AsString:=AD OQuery2.FieldByName('moshname').AsString;
Form12.ADOQuery8.FieldByName('sour').AsString:=ADO Query2.FieldByName('moshadd').AsString;
Form12.ADOQuery8.FieldByName('tel').AsString:=ADOQ uery2.FieldByName('moshtel').AsString;
Form12.ADOQuery8.Post;
end

اینم دستور درج و ثبت اوتوماتیک پس از تماس تلفنی این adoquery همون adoquery دستور قبلیه با این تفاوت که در یک فرم دیگه ازش استفاده شده این دستورات فقط حدود 7 یا 8 روز درست کار می کنه بعد دیگه هیچی رو ثبت نمی کنه حتی به صورت دستی

vcldeveloper
جمعه 20 مهر 1386, 02:08 صبح
یعنی عملا با این کد فقط رکوردهای مربوط به روز جاری در رم بارگزاری میشه که حدود 100 رکورد و این نسبت به adotable که همون اول حدود 3000 رکورد رو بارگزاری میکنه سریعتر باید انجام بشه .با توجه به اینکه DataSet های شما در فرم های مختلف پخش هستند، این احتمال وجود داره که در زمان لود شدن برنامه، فرمهایی که بصورت Auto Create هستند، دارای DataSet فعالی باشند که تعداد رکوردهای زیادی را از سرور درخواست کند. بهنر بود که اولا برای DataSet های خود نام های مناسب تری انتخاب می کردید و آنها را در یک DataModule قرار می دادید.
نکته دوم هم اینکه بجای خط زیر در SQL خود:

Add('where datee='''+ADOTable3.fieldbyname('datee').AsString+ '''');از Parameter استفاده کنید:


AdoQuey2.SQL.Text := SELECT * From Table WHERE Date = :Param1

و به پارامتر خود مقدار بدهید:


AdoQuery2.Close;
AdoQuey2.Parameters.ParamByName('Param1').AsString := '86/06/06';
AdoQuery2.Open;

mskm100
جمعه 04 آبان 1386, 13:39 عصر
آقای کشاورز من این کد ها رو نوشتم ولی از این کد ها error میگیره SELECT * From Table WHERE Date این را هم بین تک کوتیشن گذاشتم ولی درست نشد اگه یه نمونه برام بذارین ممنون میشم

vahid64
جمعه 04 آبان 1386, 14:43 عصر
اگه کدها رو کپی پیست کردی که خب کدهای غلط تایپی دارند
مثلاً کد :

AdoQuey2.SQL.Text := SELECT * From Table WHERE Date = :Param1
Adoquery2 اشتباهاً AdoQuey2 نوشته شده

اما اگه مشکل شما این هم نیست و با text مشکل دارید از همون کد خودتون استفاده کنید

AdoQuery2.SQL.Add('SELECT * From Table WHERE Date = :Param1');

SYNDROME
جمعه 04 آبان 1386, 15:53 عصر
ولی از این کد ها error میگیره SELECT * From Table WHERE Date

پیغام خطا را بنویسید.
موفق باشید