PDA

View Full Version : یک مشکل عجیب



parhizkar2000
دوشنبه 26 اردیبهشت 1384, 23:23 عصر
سلام
من یک بانک اطلاعتی دارم که تعدادی از رکوردها رو با یه شر ط خاص میخوهام ازش حذف کنم روال کار به این صورت



Table1.First;
while not Table.eof() do
begin
if (شرط مورد نظر) then
begin
Table1.Delete;
Table1.Refresh;
end;
Table1.Next;
end;{while}

این کد باید ظاهرا درست کار کنه . ولی وقتی به Next میرسه دو رکورد میره جلو و باعث میشه که نصف رکوردها حذف بشند.
حالا وقتی این کد رو طوری تغییر میدهم که بانک رو از آخر به اول پیمایش کنه درست کار میکنه و لی رکورد اخر بانک (رکورد اولی که باید حذف بشه ) رو حذف نمی کنه . تا حالا توی هیچ برنامه ای این مشکل رو نداشتم . ضمنا بانکها یDBISAM می باشند.
((ضمنا اگه میشه راهنمایی کنید چطوری کد رو از سمت چپ بنویسم . چون اینطوری بد بنظر میرسه))

jafari1
دوشنبه 26 اردیبهشت 1384, 23:37 عصر
دوست عزیر
ممکن است با حذف هر رکورد کنترل به صورت خودکار به رکورد بعدی برود و احتیاجی به next نباشد

parhizkar2000
دوشنبه 26 اردیبهشت 1384, 23:42 عصر
ممکنه و یا واقعا اینطوری . پس چرا وقتی از آخر به اول میایم .رکورد آخر حذف نمیشه؟

nilufari
سه شنبه 27 اردیبهشت 1384, 00:18 صبح
من فکر میکنم نیازی نیست Refresh را داخل حلقه قرار بدی ؛ چون هم سرعت کارتو پایین میاره و هم مکان پوینترتو عوض میکنه ... پس Refresh رو خارج حلقه قرار بده.

hr110
سه شنبه 27 اردیبهشت 1384, 06:47 صبح
زمانی که شما یک رکورد را حذف میکنید مثل این است که در یک صف یک آیتم حذف میشود و تمامی ایتمهای بعدی یک خانه به عقب باز میگردند به این صورت کنترل به جلو نمیرود بله داده ها به عقب بازمیگردند.
بنابراین کد شما به این شکل خواهد شد:


Table1.First;
while not Table1.EOF do
begin
if (شرط) then
Table1.Delete else
Table1.Next;
end;


چند توصیه:
1- کدهایتان را با استفاده از کلید "Code" زیباتر بنویسید/کد شما را اصلاح کردم/
2- خوبه که شما با استفاده از یک کوئری این کار را انجام دهید. در هر حال شرط شما بروی مقادیر فیلدهای جدول میباشد بنابراین باید شما بتوانید دستور Query مربوطه را هم ایجاد کنید.

javidtaheri
سه شنبه 27 اردیبهشت 1384, 18:48 عصر
آقا با دستور فیلتر رکورد ها را مجزا کن
سپس این کد را بنویس
for i:= 0 to Table1.RecordCount-1 do
begin
Table1.delete;
end;

parhizkar2000
سه شنبه 27 اردیبهشت 1384, 23:21 عصر
با تشکر از کلیه دوستان همونطور که دوست عزیز مون هم گفتند بعد از پاک شدن هر رکورد رکوردهای دیگه به عقب بر می گردندو بعد از Next باعث میشه که اشاره گر به دو رکورد بعد از رکورد خذف شده بره .
برای Query که گفتید آیا از DBISAMQUERY میشه استفاده کرد . مثلا دستور Delete رو بکار برد؟