stgSubGatherFile.pas 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. unit stgSubGatherFile;
  2. // µ¼Èëµ¼³ö»ã×ܽá¹û
  3. interface
  4. uses
  5. stgSubGatherFileDm, ADODB, sdDB, stgGatherDm, SysUtils, StageDm, mDataRecord;
  6. type
  7. TstgSubGatherFileHelper = class
  8. private
  9. FTempFile: string;
  10. FConnection: TADOConnection;
  11. FGatherData: TstgSubGatherData;
  12. public
  13. constructor Create;
  14. destructor Destroy; override;
  15. procedure Open(const AFileName: string);
  16. procedure Close;
  17. procedure SaveTo(const AFileName: string);
  18. property Connection: TADOConnection read FConnection;
  19. property GatherData: TstgSubGatherData read FGatherData;
  20. end;
  21. TstgSubGatherFileExportor = class(TstgSubGatherFileHelper)
  22. private
  23. procedure LoadMemoryRecord(ARec: TsdDataRecord);
  24. procedure LoadMemoryGatherData(AGatherData: TstgGatherData);
  25. public
  26. procedure ExportGatherDataTo(AGatherData:TstgGatherData; const AFileName: string);
  27. end;
  28. TstgSubGatherFileImportor = class(TstgSubGatherFileHelper)
  29. private
  30. procedure ClearOldData(AStageData: TStageData);
  31. procedure ImportGatherData(AStageData: TStageData);
  32. public
  33. procedure ImportGatherDataTo(AStageData: TStageData; const AFileName: string);
  34. end;
  35. implementation
  36. uses
  37. UtilMethods, ZhAPI, Connections, stgTables, ScAutoUpdateUnit, Math;
  38. { TstgSubGatherFileExportor }
  39. procedure TstgSubGatherFileExportor.ExportGatherDataTo(
  40. AGatherData: TstgGatherData; const AFileName: string);
  41. begin
  42. Open(GetEmptyDataBaseFileName);
  43. try
  44. LoadMemoryGatherData(AGatherData);
  45. finally
  46. SaveTo(AFileName);
  47. end;
  48. end;
  49. procedure TstgSubGatherFileExportor.LoadMemoryRecord(ARec: TsdDataRecord);
  50. var
  51. vRec: TsdDataRecord;
  52. begin
  53. vRec := GatherData.sddBills.Add;
  54. vRec.ValueByName('ID').AsInteger := ARec.ValueByName('ID').AsInteger;
  55. vRec.ValueByName('ParentID').AsInteger := ARec.ValueByName('ParentID').AsInteger;
  56. vRec.ValueByName('NextSiblingID').AsInteger := ARec.ValueByName('NextSiblingID').AsInteger;
  57. vRec.ValueByName('Code').AsString := ARec.ValueByName('Code').AsString;
  58. vRec.ValueByName('B_Code').AsString := ARec.ValueByName('B_Code').AsString;
  59. vRec.ValueByName('Name').AsString := ARec.ValueByName('Name').AsString;
  60. vRec.ValueByName('Units').AsString := ARec.ValueByName('Units').AsString;
  61. vRec.ValueByName('IsSumBase').AsBoolean := ARec.ValueByName('IsSumBase').AsBoolean;
  62. vRec.ValueByName('IsLeaf').AsBoolean := ARec.ValueByName('IsLeaf').AsBoolean;
  63. vRec.ValueByName('DealQuantity').AsFloat := ARec.ValueByName('DealQuantity').AsFloat;
  64. vRec.ValueByName('DealTotalPrice').AsFloat := ARec.ValueByName('DealTotalPrice').AsFloat;
  65. vRec.ValueByName('QcQuantity').AsFloat := ARec.ValueByName('QcQuantity').AsFloat;
  66. vRec.ValueByName('QcTotalPrice').AsFloat := ARec.ValueByName('QcTotalPrice').AsFloat;
  67. vRec.ValueByName('QcBGLCode').AsString := ARec.ValueByName('QcBGLCode').AsString;
  68. vRec.ValueByName('QcBGLNum').AsString := ARec.ValueByName('QcBGLNum').AsString;
  69. end;
  70. procedure TstgSubGatherFileExportor.LoadMemoryGatherData(
  71. AGatherData: TstgGatherData);
  72. var
  73. i: Integer;
  74. vRec: TsdDataRecord;
  75. begin
  76. GatherData.sddBills.BeginUpdate;
  77. try
  78. for i := 0 to AGatherData.sddGatherTree.RecordCount - 1 do
  79. begin
  80. vRec := AGatherData.sddGatherTree.Records[i];
  81. LoadMemoryRecord(vRec);
  82. end;
  83. finally
  84. GatherData.sddBills.EndUpdate;
  85. end;
  86. end;
  87. { TstgSubGatherFileHelper }
  88. procedure TstgSubGatherFileHelper.Close;
  89. begin
  90. FConnection.Close;
  91. if FileExists(FTempFile) then
  92. DeleteFile(FTempFile);
  93. end;
  94. constructor TstgSubGatherFileHelper.Create;
  95. begin
  96. FConnection := TADOConnection.Create(nil);
  97. FConnection.LoginPrompt := False;
  98. FGatherData := TstgSubGatherData.Create(nil);
  99. end;
  100. destructor TstgSubGatherFileHelper.Destroy;
  101. begin
  102. Close;
  103. FGatherData.Free;
  104. FConnection.Free;
  105. inherited;
  106. end;
  107. procedure TstgSubGatherFileHelper.Open(const AFileName: string);
  108. procedure UpdateDataTables;
  109. var
  110. Updater: TScUpdater;
  111. begin
  112. Updater := TScUpdater.Create;
  113. try
  114. Updater.ForceUpdate := True;
  115. Updater.Open('', FConnection, '', '');
  116. Updater.AddTableDef(sStgBills, @tdStgBills, Length(tdStgBills), False, False);
  117. Updater.ExcuteUpdate;
  118. finally
  119. Updater.Free;
  120. end;
  121. end;
  122. begin
  123. FTempFile := GetTempFileName;
  124. CopyFileOrFolder(AFileName, FTempFile);
  125. FConnection.ConnectionString := Format(SAdoConnectStr, [FTempFile]);
  126. FConnection.Open;
  127. UpdateDataTables;
  128. GatherData.Open(FConnection);
  129. end;
  130. procedure TstgSubGatherFileHelper.SaveTo(const AFileName: string);
  131. begin
  132. FGatherData.Save;
  133. CopyFileOrFolder(FTempFile, AFileName);
  134. end;
  135. { TstgSubGatherFileImportor }
  136. procedure TstgSubGatherFileImportor.ClearOldData(AStageData: TStageData);
  137. var
  138. i: Integer;
  139. vRec: TStageRecord;
  140. begin
  141. for i := 0 to AStageData.sddStage.RecordCount - 1 do
  142. begin
  143. vRec := TStageRecord(AStageData.sddStage.Records[i]);
  144. vRec.DealQuantity.AsFloat := 0;
  145. vRec.DealTotalPrice.AsFloat := 0;
  146. vRec.DealFlag.AsInteger := 0;
  147. vRec.DealFormula.AsString := '';
  148. // to do clear QuantityChange Data, reCalculate ExecutionRate & UsedQuantity
  149. //vRec.QcQuantity.AsFloat := 0;
  150. //vRec.QcTotalPrice.AsFloat := 0;
  151. //vRec.QcFlag.AsInteger := 0;
  152. //vRec.QcFormula.AsString := '';
  153. //vRec.QcBGLCode.AsString := '';
  154. //vRec.QcBGLNum.AsString := '';
  155. vRec.EndDealQuantity.AsFloat := vRec.PreDealQuantity.AsFloat;
  156. vRec.EndDealTotalPrice.AsFloat := vRec.PreDealTotalPrice.AsFloat;
  157. //vRec.EndQcQuantity.AsFloat := vRec.PreQcQuantity.AsFloat;
  158. //vRec.EndQcTotalPrice.AsFloat := vRec.PreQcTotalPrice.AsFloat;
  159. //vRec.EndQcBGLCode.AsString := vRec.PreQcBGLCode.AsString;
  160. //vRec.EndQcBGLNum.AsString := vRec.PreQcBGLNum.AsString;
  161. end;
  162. end;
  163. procedure TstgSubGatherFileImportor.ImportGatherData(
  164. AStageData: TStageData);
  165. var
  166. i: Integer;
  167. vOrgRec: TsdDataRecord;
  168. vStageRec: TStageRecord;
  169. begin
  170. for i := 0 to GatherData.sddBills.RecordCount - 1 do
  171. begin
  172. vOrgRec := GatherData.sddBills.Records[i];
  173. if vOrgRec.ValueByName('IsSumBase').AsBoolean and vOrgRec.ValueByName('IsLeaf').AsBoolean then
  174. begin
  175. vStageRec := AStageData.StageRecordWithAdd(vOrgRec.ValueByName('ID').AsInteger);
  176. vStageRec.DealQuantity.AsFloat := vOrgRec.ValueByName('DealQuantity').AsFloat;
  177. end;
  178. end;
  179. end;
  180. procedure TstgSubGatherFileImportor.ImportGatherDataTo(
  181. AStageData: TStageData; const AFileName: string);
  182. begin
  183. Open(AFileName);
  184. AStageData.sddStage.BeginUpdate;
  185. AStageData.BeforeBatchOperation;
  186. try
  187. ClearOldData(AStageData);
  188. ImportGatherData(AStageData);
  189. finally
  190. AStageData.AfterBatchOperation;
  191. AStageData.sddStage.EndUpdate;
  192. end;
  193. end;
  194. end.