unit stgGclSubGatherFile; // 导入导出汇总结果 interface uses stgGclSubGatherFileDm, ADODB, sdDB, stgGclGatherDm, SysUtils, StageDm, mDataRecord; type TstgGclSubGatherFileHelper = class private FTempFile: string; FConnection: TADOConnection; FGatherData: TstgGclSubGatherData; public constructor Create; destructor Destroy; override; procedure Open(const AFileName: string); procedure Close; procedure SaveTo(const AFileName: string); property Connection: TADOConnection read FConnection; property GatherData: TstgGclSubGatherData read FGatherData; end; TstgGclSubGatherFileExportor = class(TstgGclSubGatherFileHelper) private procedure LoadMemoryRecord(ARec: TsdDataRecord); procedure LoadMemoryGatherData(AGatherData: TstgGclGatherData); public procedure ExportGatherDataTo(AGatherData: TstgGclGatherData; const AFileName: string); end; TstgGclSubGatherFileImportor = class(TstgGclSubGatherFileHelper) private procedure ClearOldData(AStageData: TStageData); procedure ImportGatherData(AStageData: TStageData); public procedure ImportGatherDataTo(AStageData: TStageData; const AFileName: string); end; implementation uses UtilMethods, ZhAPI, Connections, stgGclTables, ScAutoUpdateUnit, Math; { TstgGclSubGatherFileExportor } procedure TstgGclSubGatherFileExportor.ExportGatherDataTo( AGatherData: TstgGclGatherData; const AFileName: string); begin Open(GetEmptyDataBaseFileName); try LoadMemoryGatherData(AGatherData); finally SaveTo(AFileName); end; end; procedure TstgGclSubGatherFileExportor.LoadMemoryRecord(ARec: TsdDataRecord); var vRec: TsdDataRecord; begin vRec := GatherData.sddBills.Add; vRec.ValueByName('B_Code').AsString := ARec.ValueByName('B_Code').AsString; vRec.ValueByName('Name').AsString := ARec.ValueByName('Name').AsString; vRec.ValueByName('Units').AsString := ARec.ValueByName('Units').AsString; vRec.ValueByName('Price').AsFloat := ARec.ValueByName('Price').AsFloat; vRec.ValueByName('DealQuantity').AsFloat := ARec.ValueByName('DealQuantity').AsFloat; vRec.ValueByName('DealTotalPrice').AsFloat := ARec.ValueByName('DealTotalPrice').AsFloat; vRec.ValueByName('QcQuantity').AsFloat := ARec.ValueByName('QcQuantity').AsFloat; vRec.ValueByName('QcTotalPrice').AsFloat := ARec.ValueByName('QcTotalPrice').AsFloat; vRec.ValueByName('QcBGLCode').AsString := ARec.ValueByName('QcBGLCode').AsString; vRec.ValueByName('QcBGLNum').AsString := ARec.ValueByName('QcBGLNum').AsString; end; procedure TstgGclSubGatherFileExportor.LoadMemoryGatherData( AGatherData: TstgGclGatherData); var i: Integer; vRec: TsdDataRecord; begin GatherData.sddBills.BeginUpdate; try for i := 0 to AGatherData.sddGatherGcl.RecordCount - 1 do begin vRec := AGatherData.sddGatherGcl.Records[i]; LoadMemoryRecord(vRec); end; finally GatherData.sddBills.EndUpdate; end; end; { TstgGclSubGatherFileHelper } procedure TstgGclSubGatherFileHelper.Close; begin FConnection.Close; if FileExists(FTempFile) then DeleteFile(FTempFile); end; constructor TstgGclSubGatherFileHelper.Create; begin FConnection := TADOConnection.Create(nil); FConnection.LoginPrompt := False; FGatherData := TstgGclSubGatherData.Create(nil); end; destructor TstgGclSubGatherFileHelper.Destroy; begin Close; FGatherData.Free; FConnection.Free; inherited; end; procedure TstgGclSubGatherFileHelper.Open(const AFileName: string); procedure UpdateDataTables; var Updater: TScUpdater; begin Updater := TScUpdater.Create; try Updater.ForceUpdate := True; Updater.Open('', FConnection, '', ''); Updater.AddTableDef(sStgGclBills, @tdStgGclBills, Length(tdStgGclBills), False, False); Updater.ExcuteUpdate; finally Updater.Free; end; end; begin FTempFile := GetTempFileName; CopyFileOrFolder(AFileName, FTempFile); FConnection.ConnectionString := Format(SAdoConnectStr, [FTempFile]); FConnection.Open; UpdateDataTables; GatherData.Open(FConnection); end; procedure TstgGclSubGatherFileHelper.SaveTo(const AFileName: string); begin FGatherData.Save; CopyFileOrFolder(FTempFile, AFileName); end; { TstgGclSubGatherFileImportor } procedure TstgGclSubGatherFileImportor.ClearOldData(AStageData: TStageData); var i: Integer; vRec: TStageRecord; begin for i := 0 to AStageData.sddStage.RecordCount - 1 do begin vRec := TStageRecord(AStageData.sddStage.Records[i]); vRec.DealQuantity.AsFloat := 0; vRec.DealTotalPrice.AsFloat := 0; vRec.DealFlag.AsInteger := 0; vRec.DealFormula.AsString := ''; vRec.EndDealQuantity.AsFloat := vRec.PreDealQuantity.AsFloat; vRec.EndDealTotalPrice.AsFloat := vRec.PreDealTotalPrice.AsFloat; end; end; procedure TstgGclSubGatherFileImportor.ImportGatherData( AStageData: TStageData); var i: Integer; vOrgRec: TsdDataRecord; vStageRec: TStageRecord; begin for i := 0 to GatherData.sddBills.RecordCount - 1 do begin vOrgRec := GatherData.sddBills.Records[i]; if vOrgRec.ValueByName('IsSumBase').AsBoolean and vOrgRec.ValueByName('IsLeaf').AsBoolean then begin vStageRec := AStageData.StageRecordWithAdd(vOrgRec.ValueByName('ID').AsInteger); vStageRec.DealQuantity.AsFloat := vOrgRec.ValueByName('DealQuantity').AsFloat; end; end; end; procedure TstgGclSubGatherFileImportor.ImportGatherDataTo( AStageData: TStageData; const AFileName: string); begin Open(AFileName); AStageData.sddStage.BeginUpdate; AStageData.BeforeBatchOperation; try ClearOldData(AStageData); ImportGatherData(AStageData); finally AStageData.AfterBatchOperation; AStageData.sddStage.EndUpdate; end; end; end.