function TReportBase.CreateDbProcedure(AReportModule:TReportModule;AProcName:string;
out ADOStoredProc: TADOStoredProc): Boolean;
var
StrList: TStrings;
s,sPar,sMessage,sValue,sParameter: string;
i, iIndex: integer;
begin
Result := False;
if AProcName='' then exit;
iIndex := Pos('(', AProcName);
if iIndex > 0 then
begin
sMessage:='開始執行存盤程序:'+AProcName+'引數(';
if ADOStoredProc<>nil then FreeAndnil(ADOStoredProc);
ADOStoredProc := TADOStoredProc.Create(nil);
StrList := TStringList.Create;
try
ADOStoredProc.Connection := FDataConnect.SqlCnn;
ADOStoredProc.Parameters.Clear;
ADOStoredProc.CommandTimeout := 1200;
ADOStoredProc.ProcedureName := copy(AProcName, 1, iIndex - 1);
s := copy(AProcName, iIndex + 1, MaxInt);
s := StringReplace(s, ')', '', []);
StrToStrings(s, ',', StrList);
for i := 0 to StrList.Count - 1 do
begin
sParameter:=trim(StrList[i]);
if (AReportModule.ConfigDataSet.DataSet<>nil) and (AReportModule.ConfigDataSet.DataSet.FindField(sParameter)<>nil) then
begin
AReportModule.ConfigDataSet.DataSet.First;
AReportModule.ConfigDataSet.DataSet.MoveBy(AReportModule.ConfigDataSet.Row);
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 255,
AReportModule.ConfigDataSet.DataSet.FieldbyName(sParameter).AsString);
sMessage:=sMessage+ AReportModule.ConfigDataSet.DataSet.FieldbyName(sParameter).AsString+',';
end else if sParameter='StartYear' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 4, AReportModule.Year);
sMessage:=sMessage+AReportModule.Year+',';
end else if sParameter='Year' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 4, AReportModule.Year);
sMessage:=sMessage+AReportModule.Year+',';
end else if sParameter='Month' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 4, AReportModule.Month);
sMessage:=sMessage+AReportModule.Month+',';
end else if sParameter='ProjectCode' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 500, AReportModule.ProjectCode);
sMessage:=sMessage+AReportModule.ProjectCode+',';
end else if sParameter='TermCode' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 500, AReportModule.TermCode);
sMessage:=sMessage+AReportModule.TermCode+',';
end else if sParameter='UnitCode' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 500, AReportModule.UnitCode);
sMessage:=sMessage+AReportModule.TermCode+',';
end else if sParameter='Version' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 500, AReportModule.Version);
sMessage:=sMessage+AReportModule.Version+',';
end else if sParameter='YS_SGT_MAIN_FK' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 500, AReportModule.Expand_FK);
sMessage:=sMessage+AReportModule.Expand_FK+',';
end else if sParameter='Expand_FK' then
begin
ADOStoredProc.Parameters.CreateParameter('@' + StrList[i], ftString, pdInput, 500, AReportModule.Expand_FK);
sMessage:=sMessage+AReportModule.Expand_FK+',';
end else if pos('=', sParameter)>0 then
begin
sPar:=copy(StrList[i],1,pos('=',sParameter)-1);
sValue:=copy(StrList[i],pos('=',sParameter)+1,MaxInt);
ADOStoredProc.Parameters.CreateParameter('@'+sPar,ftString, pdInput, 2,sValue );
sMessage:=sMessage+sParameter+',';
end;
end;
sMessage:=sMessage+');';
if Assigned(FOnProcLogEvent) then
FOnProcLogEvent(Self,sMessage);
try
ADOStoredProc.ExecProc;
Result:=true;
except on E: Exception do
begin
if Assigned(FOnProcLogEvent) then
FOnProcLogEvent(Self,'執行存盤程序出錯,錯誤存盤程序名稱"'+AReportModule.ProcName+'"錯誤資訊'+ E.Message);
FreeAndNil(ADOStoredProc);
Result:=False;
Exit;
end;
end;
try
ADOStoredProc.Active := true;
if ADOStoredProc.RecordCount>0 then
begin
FOnProcLogEvent(Self,'存盤程序成功回傳資料集');
end else
begin
FOnProcLogEvent(Self,'存盤程序回傳資料集失敗');
end;
except on E: Exception do
begin
if Assigned(FOnProcLogEvent) then
FOnProcLogEvent(Self,'存盤程序沒有資料集回傳,錯誤資訊:'+e.Message);
FreeAndNil(ADOStoredProc);
Result:=False;
Exit;
end;
end;
finally
StrList.Free;
end;
end;
end;
這是怎么回事,急需解決,先謝過大家了!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110202.html
標籤:VCL組件開發及應用
