PDA

View Full Version : اجرای برنامه بعد از اتمام تعهد درج در جدول اکسس



fazel-d
شنبه 22 فروردین 1394, 11:45 صبح
داخل کد برنامه یکسری عملیات insert در بانک اکسس دارم. بعد از این کد ها، دستورات مربوط به گزارش گیری اجرا می شن.
منتها فکر می کنم که دستورات مربوط به گزارش به صورت ذاتی تووی یه thread جداگانه اجرا میشه. چرا که هنوز کار عملیات درج تمام نشده و درج هنوز commit نشده دستورات گزارش گیری اجرا میشن و در گزارش همه اطلاعات درج شده را نشون نمی ده.
در ضمن گزارش بر اساس اطلاعاتی انجام میشه که اخیرا دارن درج میشن
s:= 'INSERT INTO TBWOR VALUES (:DSW_ID , :DSW_YY , :DSW_MM , :DSW_LISTNO '+ ', :DSW_ID1 , :DSW_FNAME , :DSW_LNAME , :DSW_DNAME , :DSW_IDNO , :DSW_IDPLC , :DSW_IDATE '+
', :DSW_BDATE , :DSW_SEX , :DSW_NAT , :DSW_OCP , :DSW_SDATE , :DSW_EDATE '+
', :DSW_DD , :DSW_ROOZ , :DSW_MAH , :DSW_MAZ , :DSW_MASH , :DSW_TOTL , :DSW_BIME , :DSW_PRATE , :DSW_JOB , :PER_NATCOD)';


//DisableControls;
with dbGridList.DataSource.DataSet do
begin
First;
while not (Eof) do
begin
qryTemp.SQL.Clear;
qryTemp.SQL.Add(s);
qryTemp.Parameters.ParamByName('DSW_ID').Value := txtCompCod.Text;
qryTemp.Parameters.ParamByName('DSW_YY').Value := Copy(txtYear.Text,3,2);
qryTemp.Parameters.ParamByName('DSW_MM').Value := txtMonth.Text;
qryTemp.Parameters.ParamByName('DSW_LISTNO').Value := txtListNo.Text;
qryTemp.Parameters.ParamByName('DSW_ID1').Value := FieldByName('insid').Value;
qryTemp.Parameters.ParamByName('DSW_FNAME').Value := dbGridList.DataSource.DataSet.FieldByName('nam').V alue;
qryTemp.Parameters.ParamByName('DSW_LNAME').Value := dbGridList.DataSource.DataSet.FieldByName('family' ).Value;
qryTemp.Parameters.ParamByName('DSW_DNAME').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_IDNO').Value := dbGridList.DataSource.DataSet.FieldByName('idcard' ).Value;
qryTemp.Parameters.ParamByName('DSW_IDPLC').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_IDATE').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_BDATE').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_SEX').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_NAT').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_OCP').Value := dbGridList.DataSource.DataSet.FieldByName('jobtitl e').Value;
qryTemp.Parameters.ParamByName('DSW_SDATE').Value := Copy(dbGridList.DataSource.DataSet.FieldByName('st artdate').Value , 3 ,8);
qryTemp.Parameters.ParamByName('DSW_EDATE').Value := Copy(dbGridList.DataSource.DataSet.FieldByName('en ddate').Value , 3 , 8);
qryTemp.Parameters.ParamByName('DSW_DD').Value := dbGridList.DataSource.DataSet.FieldByName('days'). Value;
qryTemp.Parameters.ParamByName('DSW_ROOZ').Value := dbGridList.DataSource.DataSet.FieldByName('rozanep ay').Value;
qryTemp.Parameters.ParamByName('DSW_MAH').Value := dbGridList.DataSource.DataSet.FieldByName('mahanep ay').Value;
qryTemp.Parameters.ParamByName('DSW_MAZ').Value := dbGridList.DataSource.DataSet.FieldByName('mazaya' ).Value;
qryTemp.Parameters.ParamByName('DSW_MASH').Value := dbGridList.DataSource.DataSet.FieldByName('totalma sh').Value;
qryTemp.Parameters.ParamByName('DSW_TOTL').Value := dbGridList.DataSource.DataSet.FieldByName('totalma sh').Value;
qryTemp.Parameters.ParamByName('DSW_BIME').Value := dbGridList.DataSource.DataSet.FieldByName('InsCont rib').Value;
qryTemp.Parameters.ParamByName('DSW_PRATE').Value := '27';
qryTemp.Parameters.ParamByName('DSW_JOB').Value := dbGridList.DataSource.DataSet.FieldByName('jobcod' ).Value;
qryTemp.Parameters.ParamByName('PER_NATCOD').Value := dbGridList.DataSource.DataSet.FieldByName('natcod' ).Value;


numRowAffected := 0;
if qryTemp.ExecSQL = 1 then;
Next;
end;
end;

و کد گزارش گیری
with frxReport do begin
LoadFromFile(GetCurrentDir + '\Reports\RPT.fr3',True);


frConnection := FindComponent('frConnection') as TfrxADODatabase;
frConnection.DatabaseName := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source='+
GetCurrentDir + '\Database\DBpardisk.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";' +
'Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;' +
'Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";' +
'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;'+
'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';


if not frConnection.Connected then
frConnection.Connected := True;


ShowReport(True);
end;

یوسف زالی
شنبه 22 فروردین 1394, 12:26 عصر
سلام.
کد درج اطلاعاتتون به نظر سلامت می رسه،
processmessage هم نداره.
به نظر نمی رسه ایرادی داشته باشه.
چگونه این دو تکه کد رو اجرا می کنید؟ برای هر کدوم دکمه دارید یا این که در رویدادی تایمری چیزی گذاشتید؟
این که گزارش ترد هست یا نه، ارتباطی به مشکل شما نداره. چون داره بعد از دستور شما اجرا می شه، نه قبلش.

fazel-d
شنبه 22 فروردین 1394, 13:24 عصر
هر دو تا توو یه دکمه و بدون ترد اجرا میشن.. تست که کردم وقتی هنوز آخرین رکورد درج نشده.. گزارش نشون داده میشه و در واقع آخرین رکوردی که باید در جدول درج بشه رو در گزارش نمیاره

یوسف زالی
شنبه 22 فروردین 1394, 13:37 عصر
رویداد خاصی روی رکورد ها ندارید؟

fazel-d
شنبه 22 فروردین 1394, 19:36 عصر
رویداد خاصی روی رکورد ها ندارید؟
نه...
كد كامل مربوط به دكمه
procedure TfrmDetailWorks.btnPrintClick(Sender: TObject);
var
s: string;
frConnection : TfrxADODatabase;
numRowAffected : integer;
begin
//try
qryTemp := TADOQuery.Create(qryTemp);
//delete records on TBKAR
s := 'DELETE FROM TBKAR';
try
with qryTemp do
begin
SQL.Text := s;
Connection := adoConnection;
ExecSQL;
end;
except
on E:EADOError do
Application.MessageBox('ÎØÇ ÏÑ ÇíÇå ÏÇÏå!!! ÌÏæá ˜ÇѐÇå ÞÇÈá ÍÐÝ äãí ÈÇÔÏ. ÈÇ ãÏíÑ ÓíÓÊã ÊãÇÓ ÈíÑíÏ'
,strTitleMSG , MB_OK or MB_ICONERROR);
end;


// insert info in TBKAR
s:= 'INSERT INTO TBKAR VALUES (:DSK_ID , :DSK_NAME , :DSK_FARM , :DSK_ADRS '+
', :DSK_KIND , :DSK_YY , :DSK_MM , :DSK_LISTNO , :DSK_DISC , :DSK_NUM , :DSK_TDD '+
', :DSK_TROOZ , :DSK_TMAH , :DSK_TMAZ , :DSK_TMASH , :DSK_TTOTL , :DSK_TBIME '+
', :DSK_TKOSO , :DSK_BIC , :DSK_RATE , :DSK_PRATE , :DSK_BIMH , :MON_PYM )';
try
with qryTemp do
begin
Connection:= adoConnection;
SQL.Clear;
SQL.Add(s);
Parameters.ParamByName('DSK_ID').Value := txtCompCod.Text;
Parameters.ParamByName('DSK_NAME').Value := txtCompNam.Text;
Parameters.ParamByName('DSK_FARM').Value := txtCompNam.Text;
Parameters.ParamByName('DSK_ADRS').Value := EmptyStr;
Parameters.ParamByName('DSK_KIND').Value := '1';
Parameters.ParamByName('DSK_YY').Value := Copy(txtYear.Text,3,2);
Parameters.ParamByName('DSK_MM').Value := txtMonth.Text;
Parameters.ParamByName('DSK_LISTNO').Value := txtListNo.Text;
Parameters.ParamByName('DSK_DISC').Value := EmptyStr;
Parameters.ParamByName('DSK_NUM').Value := IntToStr(dbGridList.DataSource.DataSet.RecordCount );
Parameters.ParamByName('DSK_TDD').Value := txtDays.Text;
Parameters.ParamByName('DSK_TROOZ').Value := StringReplace(txtSumDaily.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;
Parameters.ParamByName('DSK_TMAH').Value := StringReplace(txtSumMonthly.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;;
Parameters.ParamByName('DSK_TMAZ').Value := StringReplace(txtSumMazaya.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;;
Parameters.ParamByName('DSK_TMASH').Value := StringReplace(txtSumMashmool.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;;
Parameters.ParamByName('DSK_TTOTL').Value := StringReplace(txtSumMashmool.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;;
Parameters.ParamByName('DSK_TBIME').Value := StringReplace(txtInsContribute.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;;
Parameters.ParamByName('DSK_TKOSO').Value := StringReplace(txtBossContribute.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;;
Parameters.ParamByName('DSK_BIC').Value := StringReplace(txtUnEmployement.Text ,',' ,EmptyStr,[rfReplaceAll , rfIgnoreCase]) ;;
Parameters.ParamByName('DSK_RATE').Value := '27';
Parameters.ParamByName('DSK_PRATE').Value := '0';
Parameters.ParamByName('DSK_BIMH').Value := '0';
Parameters.ParamByName('MON_PYM').Value := txtNoContract.Text;

ExecSQL;
end;
except
on E:EADOError do
Application.MessageBox('ÎØÇ ÏÑ ÇíÇå ÏÇÏå!!! Çã˜Çä ÏÑÌ ÇØáÇÚÇÊ ÏÑ ÌÏæá ˜ÇѐÇå äãí ÈÇÔÏ'
,strTitleMSG , MB_OK or MB_ICONERROR);
end;

//delete records on TBWOR
s := 'DELETE FROM TBWOR';
try
with qryTemp do
begin
SQL.Text := s;
Connection := adoConnection;
ExecSQL;
end;
except
on E:EADOError do
Application.MessageBox('ÎØÇ ÏÑ ÇíÇå ÏÇÏå!!! ÌÏæá ˜ÇјäÇä ÞÇÈá ÍÐÝ äãí ÈÇÔÏ. ÈÇ ãÏíÑ ÓíÓÊã ÊãÇÓ ÈíÑíÏ'
,strTitleMSG , MB_OK or MB_ICONERROR);
end;

// insert info in TBWOR
//try
qryTemp.Connection:= adoConnection;
s:= 'INSERT INTO TBWOR VALUES (:DSW_ID , :DSW_YY , :DSW_MM , :DSW_LISTNO '+
', :DSW_ID1 , :DSW_FNAME , :DSW_LNAME , :DSW_DNAME , :DSW_IDNO , :DSW_IDPLC , :DSW_IDATE '+
', :DSW_BDATE , :DSW_SEX , :DSW_NAT , :DSW_OCP , :DSW_SDATE , :DSW_EDATE '+
', :DSW_DD , :DSW_ROOZ , :DSW_MAH , :DSW_MAZ , :DSW_MASH , :DSW_TOTL , :DSW_BIME , :DSW_PRATE , :DSW_JOB , :PER_NATCOD)';

//DisableControls;
with dbGridList.DataSource.DataSet do
begin
First;
while not (Eof) do
begin
qryTemp.SQL.Clear;
qryTemp.SQL.Add(s);
qryTemp.Parameters.ParamByName('DSW_ID').Value := txtCompCod.Text;
qryTemp.Parameters.ParamByName('DSW_YY').Value := Copy(txtYear.Text,3,2);
qryTemp.Parameters.ParamByName('DSW_MM').Value := txtMonth.Text;
qryTemp.Parameters.ParamByName('DSW_LISTNO').Value := txtListNo.Text;
qryTemp.Parameters.ParamByName('DSW_ID1').Value := FieldByName('insid').Value;
qryTemp.Parameters.ParamByName('DSW_FNAME').Value := dbGridList.DataSource.DataSet.FieldByName('nam').V alue;
qryTemp.Parameters.ParamByName('DSW_LNAME').Value := dbGridList.DataSource.DataSet.FieldByName('family' ).Value;
qryTemp.Parameters.ParamByName('DSW_DNAME').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_IDNO').Value := dbGridList.DataSource.DataSet.FieldByName('idcard' ).Value;
qryTemp.Parameters.ParamByName('DSW_IDPLC').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_IDATE').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_BDATE').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_SEX').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_NAT').Value := EmptyStr;
qryTemp.Parameters.ParamByName('DSW_OCP').Value := dbGridList.DataSource.DataSet.FieldByName('jobtitl e').Value;
qryTemp.Parameters.ParamByName('DSW_SDATE').Value := Copy(dbGridList.DataSource.DataSet.FieldByName('st artdate').Value , 3 ,8);
qryTemp.Parameters.ParamByName('DSW_EDATE').Value := Copy(dbGridList.DataSource.DataSet.FieldByName('en ddate').Value , 3 , 8);
qryTemp.Parameters.ParamByName('DSW_DD').Value := dbGridList.DataSource.DataSet.FieldByName('days'). Value;
qryTemp.Parameters.ParamByName('DSW_ROOZ').Value := dbGridList.DataSource.DataSet.FieldByName('rozanep ay').Value;
qryTemp.Parameters.ParamByName('DSW_MAH').Value := dbGridList.DataSource.DataSet.FieldByName('mahanep ay').Value;
qryTemp.Parameters.ParamByName('DSW_MAZ').Value := dbGridList.DataSource.DataSet.FieldByName('mazaya' ).Value;
qryTemp.Parameters.ParamByName('DSW_MASH').Value := dbGridList.DataSource.DataSet.FieldByName('totalma sh').Value;
qryTemp.Parameters.ParamByName('DSW_TOTL').Value := dbGridList.DataSource.DataSet.FieldByName('totalma sh').Value;
qryTemp.Parameters.ParamByName('DSW_BIME').Value := dbGridList.DataSource.DataSet.FieldByName('InsCont rib').Value;
qryTemp.Parameters.ParamByName('DSW_PRATE').Value := '27';
qryTemp.Parameters.ParamByName('DSW_JOB').Value := dbGridList.DataSource.DataSet.FieldByName('jobcod' ).Value;
qryTemp.Parameters.ParamByName('PER_NATCOD').Value := dbGridList.DataSource.DataSet.FieldByName('natcod' ).Value;

numRowAffected := 0;
if qryTemp.ExecSQL = 1 then;
Next;
end;
end;
//next;
//end;
//EnableControls;
//end;
{except
on E:EADOError do
Application.MessageBox('ÎØÇ ÏÑ ÇíÇå ÏÇÏå!!! Çã˜Çä ÏÑÌ ÇØáÇÚÇÊ ÏÑ ÌÏæá ˜ÇјäÇä äãí ÈÇÔÏ'
,strTitleMSG , MB_OK or MB_ICONERROR);
end; }

//finally
//qryTemp.Close;
//end;

//try
// initiate to reporting
//begin
with frxReport do
begin
LoadFromFile(GetCurrentDir + '\Reports\RPT.fr3',True);

frConnection := FindComponent('frConnection') as TfrxADODatabase;
frConnection.DatabaseName := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source='+
GetCurrentDir + '\Database\DBpardisk.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";' +
'Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;' +
'Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";' +
'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;'+
'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';

if not frConnection.Connected then
frConnection.Connected := True;

ShowReport(True);
end;
{except
on E:EADOError do
Application.MessageBox('ÎØÇ ÏÑ Ç'
,strTitleMSG , MB_OK or MB_ICONERROR);
end; }
end;



در واقع قبل از اينكه اطلاعات آخرين رديف از DBGrdi رو به پارامترها پاس كنه، اطلاعات درون جدول به گزارش ارسال مي شن...
مثلا اگه DBGrid شما 6 سطر باشه، گزارش صرفا 5 سطر اول رو نشون مي ده...

زماني هم كه جدول رو باز كزدم و break point رو بر روي كد زير قرار دادم، متوجه شدم كه هنوز ركورد آخري هنوز به جدول اضافه نشده

frConnection := FindComponent('frConnection') as TfrxADODatabase;
به همين خاطر احتمال دادم دادم كه كدهاي فست ريپورت در نخ جداگانه اي اجرا ميشن.

حالا كاري كه من مي خوام انجام بدم اينه كه بعد از اتمام عمليات درج، گزارش اجرا بشه.

یوسف زالی
شنبه 22 فروردین 1394, 20:08 عصر
تنها موردی که به نظرم میاد اینه که در کوئری اینسرت شما executeoption ست شده باشه.
ولی برای اطمینان قبل از ارسال به گزارش، دیتاست های مربوطه رو requery کنید.

fazel-d
شنبه 22 فروردین 1394, 22:35 عصر
تنها موردی که به نظرم میاد اینه که در کوئری اینسرت شما executeoption ست شده باشه.
ولی برای اطمینان قبل از ارسال به گزارش، دیتاست های مربوطه رو requery کنید.

بله داخل try مربوط به اجراي گزارش مجدد جدول رو select كردم
try
// initiate to reporting
with frxReport do
begin
LoadFromFile(GetCurrentDir + '\Reports\RPT.fr3',True);

with qryTemp do
begin
Connection := adoConnection;
sql.Text := 'select * from tbkar';
Open;
end;

with qryTemp do
begin
Connection := adoConnection;
sql.Text := 'select * from tbwor';
Open;
end;


frConnection := FindComponent('frConnection') as TfrxADODatabase;
frConnection.DatabaseName := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source='+
GetCurrentDir + '\Database\DBpardisk.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";' +
'Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;' +
'Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";' +
'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;'+
'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';

frTBKAR := FindComponent('frTblKar') as TfrxADOTable;
frTBKAR.Database := frConnection;
frTBKAR.TableName := 'TBKAR';

frTBWOR := FindComponent('frTblWor') as TfrxADOTable;
frTBWOR.Database := frConnection;
frTBWOR.TableName := 'TBWOR';

if not frConnection.Connected then
frConnection.Connected := True;

ShowReport(True);
end;
except
on E:EADOError do
Application.MessageBox('ÎØÇ ÏÑ Ç'
,strTitleMSG , MB_OK or MB_ICONERROR);
end;

یوسف زالی
شنبه 22 فروردین 1394, 23:24 عصر
باز هم درست نشد؟

ret_ie
شنبه 22 فروردین 1394, 23:55 عصر
با سلام و احترام، به اعتقاد بنده قسمت پیمایش گرید رو تو یک حلقه for به تعداد رکوردها بنویسید راحت تره. مستحضرید که رکورد اول پردازش میشه و سپس Next و اگه به آخر نرسیده باشه رکورد در دست پردازش میشه. خوب وقتی که در مثال شما (وجود 6 رکورد) رکورد شماره 5 پردازش میشه، بعد از Next عملا ما به ته می رسیم و شرط EOF اجازه پردازش رکورد 6 رو نمیده.

در خصوص احتمالی که دادید هم باید بگم که فرمایش شما برای بنده تازگی داشت. که اگر هم حق با شما باشه باز به عنوان یک راه حل پیشنهادی میتونید قسمت دوم رو در یک شرط If قرار داده و منوط به اتمام کامل قسمت قبل کنید.
تجربه کوچک این حقیر همیشه نشون داده که مهارت و هنر در ساده سازی مسایله.

fazel-d
یک شنبه 23 فروردین 1394, 19:39 عصر
بله مشكل حل شد..
اما بايد بگم كه اگه گريد 6 ركورد داشته باشه... بايد شش بار loop بزنه.. و وقتي به 7 رسيد شرط برقرار نشه و از حلقه خارج شه و بعد بره سر وقت گزارش....

اما مسئله اين بود هنوز ركورد ششم تو جدول درج نشده بود، گزارش گيري اجرا مي شد و اين تاخير بخاطر اين بود كه ارتباط عمليات درج با بانك به پايان نرسيده بود.


دور از انتظار هم نيست كه ذاتا initilization مربوط به گزارش در نخ مجزايي اجرا بشه... حداقل بخاطر افزايش سرعت!!!