ورود

View Full Version : مشكل در دستور parametr ارسال شده به adoquery



sempaisaleh
یک شنبه 27 بهمن 1392, 13:51 عصر
با سلام خدمت دوستان
من يه تكه كد ارم كه يه select رو روي ديتابيس زدم. ولي يه مشكلي كه دارم اينه كه وقتي برنامه رو اجرا ميكنم وقتي مي خوات اين كد ها رو اجرا كنه ميگه مثلا "paramroz1 not found" در صورتي كه اين پارامتر در دستورات استفاده شده.

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT SUM(jam) AS jam, meghdar, GROUPOD_NM');
ADOQuery1.SQL.Add('FROM (SELECT S_GROUPOD.GROUPOD_NM, SUM(S_DTL_FCT.QUANTITY * S_ODS.vazn / 1000) AS jam, (Ahdaf.meghdar_to / 30 * :paramrooz) AS meghdar');
ADOQuery1.SQL.Add(' FROM S_HED_FCT INNER JOIN');
ADOQuery1.SQL.Add(' S_DTL_FCT ON S_HED_FCT.id = S_DTL_FCT.id INNER JOIN');
ADOQuery1.SQL.Add(' S_ODS ON S_ODS.OD_CD = S_DTL_FCT.OD_CD INNER JOIN');
ADOQuery1.SQL.Add(' S_GROUPOD ON S_GROUPOD.GROUPOD_CD = S_ODS.GROUPOD_CD INNER JOIN');
ADOQuery1.SQL.Add(' S_Markaz ON S_Markaz.Markaz_CD = S_HED_FCT.MARKAZ_CD INNER JOIN');
ADOQuery1.SQL.Add(' Ahdaf ON S_GROUPOD.GROUPOD_CD = Ahdaf.mahsool_gro_cd');
ADOQuery1.SQL.Add(' WHERE (S_HED_FCT.ACC_YEAR = :paramsal11) AND ((S_HED_FCT.Stock_cd = 1) OR');
ADOQuery1.SQL.Add(' (S_HED_FCT.Stock_cd = 2) OR');
ADOQuery1.SQL.Add(' (S_HED_FCT.Stock_cd = 16) OR');
ADOQuery1.SQL.Add(' (S_HED_FCT.Stock_cd = 30)) AND (S_HED_FCT.FLAG = 2) AND (S_HED_FCT.FACT_DATE >= :paramdate11) AND');
ADOQuery1.SQL.Add(' (S_HED_FCT.FACT_DATE <= :paramdate12) AND (S_Markaz.Markaz_CD = :paramgoroh11) AND (Ahdaf.markaz_cd = :paramgoroh12) AND (Ahdaf.sal = :paramsal12) AND');
ADOQuery1.SQL.Add(' (Ahdaf.mah = :parammah1)');
ADOQuery1.SQL.Add(' GROUP BY S_GROUPOD.GROUPOD_NM, Ahdaf.meghdar_to');
ADOQuery1.SQL.Add(' UNION');
ADOQuery1.SQL.Add(' SELECT *');
ADOQuery1.SQL.Add(' FROM OPENQUERY(TADBIR_ASAK,');
ADOQuery1.SQL.Add(' ''SELECT S_GROUPOD.GROUPOD_NM, SUM(S_DTL_FCT.QUANTITY * S_ODS.vazn / 1000) AS jam,');
ADOQuery1.SQL.Add(' (Ahdaf.meghdar_to / 30 * :paramroz1) AS meghdar');
ADOQuery1.SQL.Add(' FROM S_HED_FCT INNER JOIN');
ADOQuery1.SQL.Add(' S_DTL_FCT ON S_HED_FCT.id = S_DTL_FCT.id INNER JOIN');
ADOQuery1.SQL.Add(' S_ODS ON S_ODS.OD_CD = S_DTL_FCT.OD_CD INNER JOIN');
ADOQuery1.SQL.Add(' S_GROUPOD ON S_GROUPOD.GROUPOD_CD = S_ODS.GROUPOD_CD INNER JOIN');
ADOQuery1.SQL.Add(' S_Markaz ON S_Markaz.Markaz_CD = S_HED_FCT.MARKAZ_CD INNER JOIN');
ADOQuery1.SQL.Add(' Ahdaf ON S_GROUPOD.GROUPOD_CD = Ahdaf.mahsool_gro_cd');
ADOQuery1.SQL.Add(' WHERE (S_HED_FCT.ACC_YEAR = :paramsal21) AND (S_HED_FCT.Stock_cd = 9) AND (S_HED_FCT.FLAG = 2)');
ADOQuery1.SQL.Add(' AND (S_HED_FCT.FACT_DATE >= :paramdate21) AND (S_HED_FCT.FACT_DATE <= :paramdate22) AND');
ADOQuery1.SQL.Add(' (S_Markaz.Markaz_CD = :paramgoroh21) AND (Ahdaf.markaz_cd = :paramgoroh22) AND (Ahdaf.sal = :paramsal22) AND');
ADOQuery1.SQL.Add(' (Ahdaf.mah = :parammah2)');
ADOQuery1.SQL.Add(' GROUP BY S_GROUPOD.GROUPOD_NM, Ahdaf.meghdar_to'')');
ADOQuery1.SQL.Add(' Rowset_1) cte1');
ADOQuery1.SQL.Add('GROUP BY meghdar, GROUPOD_NM');
ADOQuery1.Parameters.ParamByName('paramrooz').Valu e := trim(ComboBox3.Text);
ADOQuery1.Parameters.ParamByName('paramsal11').Val ue := trim('13'+ComboBox2.Text);
ADOQuery1.Parameters.ParamByName('paramsal12').Val ue := trim('13'+ComboBox2.Text);
if ComboBox1.ItemIndex+1>9 then
begin
ADOQuery1.Parameters.ParamByName('paramdate11').Va lue := trim(ComboBox2.Text+'/'+inttostr(ComboBox1.ItemIndex+1)+'/01');
ADOQuery1.Parameters.ParamByName('paramdate12').Va lue := trim(ComboBox2.Text+'/'+inttostr(ComboBox1.ItemIndex+1)+'/'+ComboBox3.Text);
end;
if ComboBox1.ItemIndex+1<10 then
begin
ADOQuery1.Parameters.ParamByName('paramdate11').Va lue := trim(ComboBox2.Text+'/0'+inttostr(ComboBox1.ItemIndex+1)+'/01');
ADOQuery1.Parameters.ParamByName('paramdate12').Va lue := trim(ComboBox2.Text+'/0'+inttostr(ComboBox1.ItemIndex+1)+'/'+ComboBox3.Text);
end;
ADOQuery1.Parameters.ParamByName('paramgoroh11').V alue := dbedit4.Text;
ADOQuery1.Parameters.ParamByName('paramgoroh12').V alue := dbedit4.Text;
ADOQuery1.Parameters.ParamByName('parammah1').Valu e := trim(inttostr(ComboBox1.ItemIndex+1));
ADOQuery1.Parameters.ParamByName('paramroz1').Valu e := trim(ComboBox3.Text);
ADOQuery1.Parameters.ParamByName('paramsal21').Val ue := trim('13'+ComboBox2.Text);
if ComboBox1.ItemIndex+1>9 then
begin
ADOQuery1.Parameters.ParamByName('paramdate21').Va lue := trim(ComboBox2.Text+'/'+inttostr(ComboBox1.ItemIndex+1)+'/01');
ADOQuery1.Parameters.ParamByName('paramdate22').Va lue := trim(ComboBox2.Text+'/'+inttostr(ComboBox1.ItemIndex+1)+'/'+ComboBox3.Text);
end;
if ComboBox1.ItemIndex+1<10 then
begin
ADOQuery1.Parameters.ParamByName('paramdate21').Va lue := trim(ComboBox2.Text+'/0'+inttostr(ComboBox1.ItemIndex+1)+'/01');
ADOQuery1.Parameters.ParamByName('paramdate22').Va lue := trim(ComboBox2.Text+'/0'+inttostr(ComboBox1.ItemIndex+1)+'/'+ComboBox3.Text);
end;
ADOQuery1.Parameters.ParamByName('paramgoroh21').V alue := dbedit4.Text;
ADOQuery1.Parameters.ParamByName('paramgoroh22').V alue := dbedit4.Text;
ADOQuery1.Parameters.ParamByName('paramsal22').Val ue := trim('13'+ComboBox2.Text);
ADOQuery1.Parameters.ParamByName('parammah2').Valu e := trim(inttostr(ComboBox1.ItemIndex+1));
ADOQuery1.ExecSQL;
ADOQuery1.Open;
ADOQuery1.Active:=true;

دلفــي
یک شنبه 27 بهمن 1392, 19:15 عصر
شما از پارامتر paramroz1 در کدهاتون استفاده کردید و لی به احتمال زیاد این پارامتر در جدول یا کوئری که از آن اطلاعات رو می خونید یا اصلا وجود نداره و یا اینکه از لحاظ تایپی اونجا اسم این پارامتر رو یه چیز دیگه تایپ کردید ، برای فهمیدن این موضوع کافیه در صفحه طراحی فرم روی AdoQuery مورد نظر دابل کلیک کنید و از قسمت New گزینه ی Add All Field رو بزنید (البته قبلش در قسمت sql از جدولتون انتخاب مورد نظر را انجام بدید ، مثلا select * from TableName و بعدش Adoquery رو Active کنید) ، با این کار نام همه ی فیلدهاتون در لیست فیلدها نشان داده میشود و شما می توانید بفهمید پارامتر شما در آن لیست موجود هست یا نه و اگر هست از لحاظ نوشتاری چگونه تایپ شده است .

sempaisaleh
دوشنبه 28 بهمن 1392, 09:47 صبح
شما از پارامتر paramroz1 در کدهاتون استفاده کردید و لی به احتمال زیاد این پارامتر در جدول یا کوئری که از آن اطلاعات رو می خونید یا اصلا وجود نداره و یا اینکه از لحاظ تایپی اونجا اسم این پارامتر رو یه چیز دیگه تایپ کردید ، برای فهمیدن این موضوع کافیه در صفحه طراحی فرم روی AdoQuery مورد نظر دابل کلیک کنید و از قسمت New گزینه ی Add All Field رو بزنید (البته قبلش در قسمت sql از جدولتون انتخاب مورد نظر را انجام بدید ، مثلا select * from TableName و بعدش Adoquery رو Active کنید) ، با این کار نام همه ی فیلدهاتون در لیست فیلدها نشان داده میشود و شما می توانید بفهمید پارامتر شما در آن لیست موجود هست یا نه و اگر هست از لحاظ نوشتاری چگونه تایپ شده است .
با سلام
درست، حرف شما متين
ولي مشكل اينجاست كه چرا نمياره.
تمامي پارامترهايي كه در اين تكه كد هستند رو اصلا نمياره يا اينجوري بگم پيدا نميكنه.
ADOQuery1.SQL.Add(' SELECT *');
ADOQuery1.SQL.Add(' FROM OPENQUERY(TADBIR_ASAK,');
ADOQuery1.SQL.Add(' ''SELECT S_GROUPOD.GROUPOD_NM, SUM(S_DTL_FCT.QUANTITY * S_ODS.vazn / 1000) AS jam,');
ADOQuery1.SQL.Add(' (Ahdaf.meghdar_to / 30 * :paramroz1) AS meghdar');
ADOQuery1.SQL.Add(' FROM S_HED_FCT INNER JOIN');
ADOQuery1.SQL.Add(' S_DTL_FCT ON S_HED_FCT.id = S_DTL_FCT.id INNER JOIN');
ADOQuery1.SQL.Add(' S_ODS ON S_ODS.OD_CD = S_DTL_FCT.OD_CD INNER JOIN');
ADOQuery1.SQL.Add(' S_GROUPOD ON S_GROUPOD.GROUPOD_CD = S_ODS.GROUPOD_CD INNER JOIN');
ADOQuery1.SQL.Add(' S_Markaz ON S_Markaz.Markaz_CD = S_HED_FCT.MARKAZ_CD INNER JOIN');
ADOQuery1.SQL.Add(' Ahdaf ON S_GROUPOD.GROUPOD_CD = Ahdaf.mahsool_gro_cd');
ADOQuery1.SQL.Add(' WHERE (S_HED_FCT.ACC_YEAR = :paramsal21) AND (S_HED_FCT.Stock_cd = 9) AND (S_HED_FCT.FLAG = 2)');
ADOQuery1.SQL.Add(' AND (S_HED_FCT.FACT_DATE >= :paramdate21) AND (S_HED_FCT.FACT_DATE <= :paramdate22) AND');
ADOQuery1.SQL.Add(' (S_Markaz.Markaz_CD = :paramgoroh21) AND (Ahdaf.markaz_cd = :paramgoroh22) AND (Ahdaf.sal = :paramsal22) AND');
ADOQuery1.SQL.Add(' (Ahdaf.mah = :parammah2)');
ADOQuery1.SQL.Add(' GROUP BY S_GROUPOD.GROUPOD_NM, Ahdaf.meghdar_to'')');
ADOQuery1.SQL.Add(' Rowset_1) cte1');


يا همون خطوط 18 تا 33

یوسف زالی
دوشنبه 28 بهمن 1392, 16:33 عصر
سلام.
به جای این کار چرا از یک SP استفاده نمی کنید؟
خیلی راحت تر و دیباگ اون بهتر انجام می شه.

sempaisaleh
سه شنبه 29 بهمن 1392, 07:01 صبح
سلام.
به جای این کار چرا از یک SP استفاده نمی کنید؟
خیلی راحت تر و دیباگ اون بهتر انجام می شه.
با سلام
شرمنده تا حالا با sp كار نكردم. چطور ميشه پارامتر بهش فرستاد. يعني بعضي از مقادير از برنامه دلفي گرفته بشه؟

یوسف زالی
سه شنبه 29 بهمن 1392, 10:19 صبح
در محیط اس کیو ال می نویسید، طریقش رو خودم در تالار مربوطه توضیح داده ام، بعد با یک شی ADOStoredProc بهش متصل می شید و پارامترهاش رو مقدار می دید.
سعیتون رو کنید، موارد اشکالتون رو همبن جا بپرسید.