PDA

View Full Version : ايجاد يك ستون محاسباتي در DBGRID و مقدار دهي در كد نويسي داخل برنامه



sempaisaleh
سه شنبه 19 اسفند 1393, 12:21 عصر
با سلام خدمت دوستان
من يه DBGRID دارم كه به Adoquery وصل شده و 5 تا ستون داره حالا مي خوام يك ستون ششم اضافه كنم كه بياد با جستجو توي يك جدول ديگه مقدار دهي بشه.
به عنوان مثال بيام يك حلقه ايجاد كنم از يك تا تعداد ركوردها بعد بگم برو يه جستجو بزن يه مقدار رو برگردون تو اين ستون جديد بذار.

for I := 1 to ADOQuery1.RecordCount do
begin
ADOQuery3.Close;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('SELECT S_DTL_FCT.OD_CD, SUM(S_DTL_FCT.QUANTITY) AS meghdar_msaraf FROM S_DTL_FCT INNER JOIN');
ADOQuery3.SQL.Add('S_HED_FCT ON S_DTL_FCT.id = S_HED_FCT.id WHERE (S_HED_FCT.ACC_YEAR = '+sal+') and (S_HED_FCT.FACT_DATE between '+QuotedStr(date20)+' and '+QuotedStr(date0)+') AND (S_HED_FCT.FLAG = 5)');
ADOQuery3.SQL.Add('GROUP BY S_DTL_FCT.OD_CD HAVING (S_DTL_FCT.OD_CD = '+dbedit3.Text+')');
ADOQuery3.ExecSQL;
ADOQuery3.Open;
DBGrid1.Fields[5].Value:=dbedit2.Text;
ADOQuery1.Next;
end;
تو اين مثال Dbedit2 به adoquery3 وصل و مقداري از اون كوئري رو مياره تو ستون جديد. مشكل اينجاست كه اين ستون جديد رو بايد از چه نوعي بذارم. يا fieldName رو چي بذارم. وقتي چيزي نميذارم ارور ميده.

یوسف زالی
سه شنبه 19 اسفند 1393, 13:13 عصر
سلام.
در DBGrid اضافه نمی کنید بلکه در DataSet فیلد اضافه می کنید.
یک فیلد محاسباتی اضافه می کنید و در رویداد OnCalcFields دیتاست پرش می کنید.
می تونید فیلد رو از نوع Lookup بگیرید و با دستاست دیگه ای join کنید..
در کل کار باید روی دیتاست باشه نه گرید یا جای دیگه.

sempaisaleh
سه شنبه 19 اسفند 1393, 15:26 عصر
به اين شكل تغيير دادم و گذاشتم ولي بازم ارور ميده.

for I := 1 to ADOQuery1.RecordCount do
begin
ADOQuery3.Close;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('SELECT S_DTL_FCT.OD_CD, SUM(S_DTL_FCT.QUANTITY) AS meghdar_msaraf FROM S_DTL_FCT INNER JOIN');
ADOQuery3.SQL.Add('S_HED_FCT ON S_DTL_FCT.id = S_HED_FCT.id WHERE (S_HED_FCT.ACC_YEAR = '+sal+') and (S_HED_FCT.FACT_DATE between '+QuotedStr(date20)+' and '+QuotedStr(date0)+') AND (S_HED_FCT.FLAG = 5) and (S_DTL_FCT.OD_CD ='+QuotedStr(dbedit3.Text)+')');
ADOQuery3.SQL.Add('GROUP BY S_DTL_FCT.OD_CD');
ADOQuery3.ExecSQL;
ADOQuery3.Open;
ADOQuery1.DataSetField[5]:=ADOQuery3.DataSetField[5];
// DBGrid1.Fields[5].Value:=dbedit2.Text;
ADOQuery1.Next;
end;
اين ارور رو ميده


First chance exception at $0067F2E3. Exception class $C0000005 with message 'access violation at 0x0067f2e3: read of address 0x00000000'. Process Panel_For.exe (3256)

یوسف زالی
سه شنبه 19 اسفند 1393, 16:22 عصر
دوست عزیز رویدادش کو؟؟؟؟
اگر در رویداد دارید اضافه می کنید خودش برای هر ردیف یک بار ران می شه و نیازی به حلقه نیست.

sempaisaleh
چهارشنبه 20 اسفند 1393, 08:41 صبح
اينم رويدادش

procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
ADOQuery3.Close;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('SELECT S_DTL_FCT.OD_CD, SUM(S_DTL_FCT.QUANTITY) AS meghdar_msaraf FROM S_DTL_FCT INNER JOIN');
ADOQuery3.SQL.Add('S_HED_FCT ON S_DTL_FCT.id = S_HED_FCT.id WHERE (S_HED_FCT.ACC_YEAR = '+sal+') and (S_HED_FCT.FACT_DATE between '+QuotedStr(date20)+' and '+QuotedStr(date0)+') AND (S_HED_FCT.FLAG = 5) and (S_DTL_FCT.OD_CD ='+QuotedStr(dbedit3.Text)+')');
ADOQuery3.SQL.Add('GROUP BY S_DTL_FCT.OD_CD');
ADOQuery3.ExecSQL;
ADOQuery3.Open;
ADOQuery1.DataSetField[5]:=ADOQuery3.DataSetField[5];
end;
هيچ فرقي هم نكرد باز از خط زير ارور ميگيره.


ADOQuery1.DataSetField[5]:=ADOQuery3.DataSetField[5];

یوسف زالی
چهارشنبه 20 اسفند 1393, 10:34 صبح
ایرادات فعلی:
- هرگز همزمان Exec و Open نکنید.
- تا جایی که بشود از نوشتن مجدد کوئری امتناع کنید.

ایرادات احتمالی:
- از وجود فیلد ها مطمئن شوید، و تا جایی که بشود آنها را به اسم بنویسید.
- وجود فیلد مجاسباتی را مجدد چک کنید.

من جای شما بودم این طور می نوشتم:


.
.
ADOQuery3.sql.text := 'select * from TBL where some parameters';
.
.
{in the event handler}
ADOQuery3.close;
ADOQuery3.parameters.parambyname('...').value := ...
ADOQuery3.parameters.parambyname('...').value := ...
ADOQuery3.parameters.parambyname('...').value := ...
ADOQuery3.open;


ADOQuery1MyCalcField.Value := ADOQuery3AField.Value;
{end of event handler proc}

sempaisaleh
چهارشنبه 20 اسفند 1393, 11:22 صبح
سلام
مرسي از كمك تون
مشكل ارور حل شد و جواب هم درسته فقط يك مشكل ديگه كه بوجود اومده اينه كه ركورد ها رو يكي در ميون پر نميكنه.

یوسف زالی
چهارشنبه 20 اسفند 1393, 11:30 صبح
احتمالا برای رکورد اول خروجی نال می شه.
و این به کوئری تون بر می گرده.

sempaisaleh
چهارشنبه 20 اسفند 1393, 12:12 عصر
هيچ كدوم از خروجي ها نال نيستن. ضمنا دو باره كه به عنوان رفرش تو برنامه و بدست آمدم گزارش جديد همين كوئري رو ران ميكنم اوليشم پر ميكنه. ولي باز يكي در ميون پر نميكنه.

یوسف زالی
چهارشنبه 20 اسفند 1393, 12:16 عصر
بیشتر از این نمی تونم راهنمایی کنم. بیشتر از این دیگه باید سورس رو دید.
BreakPoint بگذارید و تریس کنید ببینید که چه اتفاقی می افته.