PDA

View Full Version : سوال: مشکل با شمارش رکورد در adodataset



soft-c
چهارشنبه 06 اردیبهشت 1391, 11:07 صبح
adodataset11.Close;
adodataset11.CommandText:='select id from hesab where (cost>='''+Edit5.Text+''')';
adodataset11.Open;;
j:=adodataset11.RecordCount;
for i := 0 to j-1 do
begin
adoquery11.Close;
adoquery11.SQL.Clear;
adoquery11.SQL.Text:='insert into hazineh values ('''+SolarDatePicker1.Text+''' ,'''+Edit5.Text+''',''20'','''+adodataset11.Fields[i].AsString+''') ';
adoquery11.ExecSQL;


end;

نمی دونم چرا در کد بالا وقتی i یک می شود خطای out of bound می گیره در صورتیکه 2 تا رکورد پیدا می کنه

سعید صابری
چهارشنبه 06 اردیبهشت 1391, 11:48 صبح
در کدام خط کرسر به رکورد بعدی انتقال پیدا میکنه؟
شما نوشتین adodataset11.Fields[i] یعنی فیلد 1 و 2 و... را بخوان نه رکورد 1 و 2 و...

select id from hesab و در اینجا هم یک فیلد انتخاب شده یعنی fiels[0] پس
برای field[1] و بیشتر ارور خواهد گرفت

mohsen24000
چهارشنبه 06 اردیبهشت 1391, 11:50 صبح
در اینجا i بیانگر شمارشگر تعداد رکوردهاست بعد شما اومدید از اون بعنوان تعداد فیلدها استفاده کردید!!؟

soft-c
چهارشنبه 06 اردیبهشت 1391, 16:08 عصر
از کدام ویژگی میشه برای رکورد استفاده کرد ؟
تشکر

tiphooo
چهارشنبه 06 اردیبهشت 1391, 17:10 عصر
اگر شما می خواهید تک تک رکوردها ی adodataset11 را در جدول hazineh درج کنید به جای For از while استفاده کنید
به صورت
adodataset11.Close;
adodataset11.CommandText:='select id from hesab where (cost>='''+Edit5.Text+''')';
adodataset11.Open;;

while not dodataset11.eof do
begin
adoquery11.Close;
adoquery11.SQL.Clear;
adoquery11.SQL.Text:='insert into hazineh values ('''+SolarDatePicker1.Text+''' ,'''+Edit5.Text+''',''20'','''+adodataset11.Fields[0].AsString+''') ';
adoquery11.ExecSQL;
adodataset11.next;

end;

اگر می خواهید تک تک فیلدها را وارد کنید


adodataset11.Close;
adodataset11.CommandText:='select id from hesab where (cost>='''+Edit5.Text+''')';
adodataset11.Open;;
j:=adodataset11.FieldCount;
for i := 0 to j-1 do
begin
adoquery11.Close;
adoquery11.SQL.Clear;
adoquery11.SQL.Text:='insert into hazineh values ('''+SolarDatePicker1.Text+''' ,'''+Edit5.Text+''',''20'','''+adodataset11.Fields[i].AsString+''') ';
adoquery11.ExecSQL;


end;

یعنی به جای RecordCount از FieldCount استفاده کنید
ولی اگر منظورتان حالت اول است که کلا نیازی به این کار ها نیست و با یک دستور INSERT و به جای اینکه از Values استفاده کنید مقادیر adodataset11 را به صورت یک دستور select انجام دهید و نیازی به پیمایش تک تک رکوردها نیست
به این صورت

with adoquery11 do
begin
close;
SQL.Clear;
SQL.Text:='INSERT INTO hazineh SELECT '+ 'QuotedStr(SolarDatePicker1.Text)+','+Edit5.Text+' ,20,id FROM Hesab WHERE Cost >='+Edit5.Text;
ExecSQL;
end;


و دیگر نیازی به سایر کدها نیست