Hello,
Here is my code
Code: Select all
function TfrmUtilBase.UpdateTblAffectDataStatus(prjt:string;dt_tm_deb,dt_tm_fin:TDateTime):boolean;
var
dt_tm:TDateTime;
yr,mnth,day,hr,min,sec,msec,nb_trbn,cpt:word;
code_status,nom_status,fam_arret_cnstrctr,fam_arret_valorem:string;
ibcqry_status:TIBCQuery;
s:string;
begin
cpt:=0;
ibcqry_status:=TIBCQuery.Create(nil);
ibcqry_status.Connection:=frmMain.IbcCnnx;
ibcqry_status.AutoCommit:=FALSE;
result:=TRUE;
//Decode la date pour commencer à hr:00:00; Par exemple si dt_tm_deb= 10/09/08 06:25:00
//on commence le 10/09/08 06:00:00
DecodeDateTime(dt_tm_deb,yr,mnth,day,hr,min,sec,msec);
dt_tm:=EncodeDateTime(yr,mnth,day,hr,0,0,0);
//Trouve le nombre de turbines pour le projet
frmMain.IBCQryRd.SQL.Text:='Select NB_TURBINE from PROJET where NOM_PROJET='+AnsiQuotedStr(prjt,'''');
frmMain.IBCQryRd.Open;
nb_trbn:=frmMain.IBCQryRd.FieldByName('NB_TURBINE').AsInteger;
//Si transaction ouverte ferme avec un Rollback
if frmMain.IBCTrnsctnRd.Active=TRUE then
frmMain.IBCTrnsctnRd.Rollback;
//Appel de la procédure stockée qui rempli par pas de 10'
frmMain.IBCQryRd.SQL.Text:='SELECT * FROM P_DATA_STEP_10MIN(:DATE_DEBUT, :DATE_FIN,:NB_TURBINE,:PRJT )';
frmMain.IBCQryRd.Prepare;
frmMain.IBCQryRd.ParamByName('PRJT').AsString:=prjt;
frmMain.IBCQryRd.ParamByName('NB_TURBINE').AsInteger:=nb_trbn;
frmMain.IBCQryRd.ParamByName('DATE_DEBUT').AsDateTime:=dt_tm;
frmMain.IBCQryRd.ParamByName('DATE_FIN').AsDateTime:=dt_tm_fin;
frmMain.IBCQryRd.Open;
if not frmMain.IBCTrnsctnWrt.Active then
begin
frmMain.IBCQryWrt.SQL.Text:='UPDATE OR INSERT INTO AFFECT_DATA_STATUS (DATE_HEURE, NOM_PROJET, REF_TURBINE_VALOREM, VITESSE_VENT_NACELLE, PUISS_ACTIVE_PRODUITE,'
+' TEMP_EXTERIEUR, CODE_STATUS, NOM_STATUS, FAMILLE_ARRET_CNSTRCTR, FAMILLE_ARRET_VALOREM, FAMILLE_ARRET_VALOREM_CORRIGE)'
+' VALUES( :DATE_HEURE, :NOM_PROJET, :REF_TURBINE_VALOREM, :VITESSE_VENT_NACELLE, :PUISS_ACTIVE_PRODUITE, :TEMP_EXTERIEUR, :CODE_STATUS,'
+' :NOM_STATUS, :FAMILLE_ARRET_CNSTRCTR, :FAMILLE_ARRET_VALOREM, :FAMILLE_ARRET_VALOREM_CORRIGE)'
+'matching(NOM_PROJET,REF_TURBINE_VALOREM,DATE_HEURE)';
frmMain.IBCTrnsctnWrt.StartTransaction;
frmMain.IBCQryWrt.Prepare;
//Parcours de la plage des date par pas de 10'
while (not frmMain.IBCQryRd.Eof) and (frmProgress.BoolAnnul=FALSE) do
begin
frmUpdtMnCrntAffectDataStatus.Label1.Caption:=InttoStr(frmMain.IBCQryRd.RecNo);
if (cpt mod 500)=0 then
Application.ProcessMessages;
//trouve le status dominant
try
FindStatusDominant(ibcqry_status,code_status,nom_status,fam_arret_cnstrctr,fam_arret_valorem,prjt,frmMain.IBCQryRd.FieldByName('TURBINE').AsString,
frmMain.IBCQryRd.FieldByName('DATE_HEURE').AsDateTime);
except
showmessage('PROBLEME');
end;
try
frmMain.IBCQryWrt.ParamByName('DATE_HEURE').AsDateTime:=frmMain.IBCQryRd.FieldByName('DATE_HEURE').AsDateTime;
frmMain.IBCQryWrt.ParamByName('NOM_PROJET').AsString:=prjt;
try
frmMain.IBCQryWrt.ParamByName('REF_TURBINE_VALOREM').AsString:=frmMain.IBCQryRd.FieldByName('TURBINE').AsString;
except
showmessage('TURBINE');
end;
frmMain.IBCQryWrt.ParamByName('VITESSE_VENT_NACELLE').AsFloat:=frmMain.IBCQryRd.FieldByName('VIT_VENT').AsFloat;
frmMain.IBCQryWrt.ParamByName('PUISS_ACTIVE_PRODUITE').AsFloat:=frmMain.IBCQryRd.FieldByName('PUISS_ACTIVE').AsFloat;
frmMain.IBCQryWrt.ParamByName('TEMP_EXTERIEUR').AsFloat:=frmMain.IBCQryRd.FieldByName('TEMP_EXT').AsFloat;
frmMain.IBCQryWrt.ParamByName('CODE_STATUS').AsString:=code_status;
frmMain.IBCQryWrt.ParamByName('NOM_STATUS').AsString:=nom_status;
frmMain.IBCQryWrt.ParamByName('FAMILLE_ARRET_CNSTRCTR').AsString:=fam_arret_cnstrctr;
frmMain.IBCQryWrt.ParamByName('FAMILLE_ARRET_VALOREM').AsString:=fam_arret_valorem;
frmMain.IBCQryWrt.ParamByName('FAMILLE_ARRET_VALOREM_CORRIGE').AsString:=fam_arret_valorem;
frmMain.IBCQryWrt.Execute;
except
on E:EIBCError do
begin
frmMain.IBCTrnsctnWrt.Rollback;
result:=false;
//Mémorise la donnée en cas d'erreur pour la mettre dans le fichier txt
s:='AFFECT DATA STATUS '+prjt+' '+frmMain.IBCQryRd.FieldByName('TURBINE').AsString+' '+frmMain.IBCQryRd.FieldByName('DATE_HEURE').AsString;
//complete le fichier d'erreur
frmFileData.FillFileError(s);
exit;
end;
end;//fin du try except
//frmMain.IBCTrnsctnWrt.Commit; if commit here bug at 60000 records
frmMain.IBCQryRd.Next;
Inc(cpt);
end;//fin boucle while parcours de la plage
frmMain.IBCTrnsctnWrt.Commit; //if commmit here bug at 75000 records
end;//fin du if transactino active
frmMain.IBCQryRd.UnPrepare;
frmMain.IBCQryWrt.UnPrepare;
//Si transaction ouverte ferme avec un Rollback
if frmMain.IBCTrnsctnRd.Active=TRUE then
frmMain.IBCTrnsctnRd.Rollback;
FreeAndNil(ibcqry_status);
When iIBCQryRd.Recno reach 60000, access to frmMain.IBCQryRd.FieldByName('TURBINE') return an error.
With the debugger if i want to read the value i have an access violation.
If i place the commit after the while loop, the bug reach at 75000.
If i don't do update or insert but still doing the while loop by writing
IBCQryRd.FieldByName('TURBINE').AsString in a text file there is no problem.
The select return more than 200 000 records.
Thank you for help
Regards