StageCompareDm.pas 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. unit StageCompareDm;
  2. {--------------------------------------
  3. 为减少内存占用,项目(当期数据)打开时,该单元不打开
  4. 仅在界面切换至审核比较数据时,更新加载该单元数据,当界面再次切换,应关闭该单元。
  5. 缺陷:每次用户点击切换界面至审核比较时,将消耗较多时间
  6. --------------------------------------}
  7. interface
  8. uses
  9. SysUtils, Classes, sdDB, sdProvider, ADODB;
  10. const
  11. TableDeleteSql = 'Drop Table StageCompare';
  12. TableCreateSql = 'Select BillsID, GatherQuantity As Quantity0, GatherTotalPrice As TotalPrice0,'+
  13. ' GatherQuantity As Quantity1, GatherTotalPrice As TotalPrice1,'+
  14. ' GatherQuantity As Quantity2, GatherTotalPrice As TotalPrice2,'+
  15. ' GatherQuantity As Quantity3, GatherTotalPrice As TotalPrice3,'+
  16. ' GatherQuantity As Quantity4, GatherTotalPrice As TotalPrice4,'+
  17. ' GatherQuantity As Quantity5, GatherTotalPrice As TotalPrice5,'+
  18. ' GatherQuantity As Quantity6, GatherTotalPrice As TotalPrice6,'+
  19. ' GatherQuantity As Quantity7, GatherTotalPrice As TotalPrice7,'+
  20. ' GatherQuantity As Quantity8, GatherTotalPrice As TotalPrice8,'+
  21. ' GatherQuantity As Quantity9, GatherTotalPrice As TotalPrice9,'+
  22. ' GatherQuantity As Quantity10, GatherTotalPrice As TotalPrice10,'+
  23. ' GatherQuantity As Quantity11, GatherTotalPrice As TotalPrice11,'+
  24. ' GatherQuantity As Quantity12, GatherTotalPrice As TotalPrice12,'+
  25. ' GatherQuantity As Quantity13, GatherTotalPrice As TotalPrice13,'+
  26. ' GatherQuantity As Quantity14, GatherTotalPrice As TotalPrice14'+
  27. ' Into StageCompare From Refer Where 1=2';
  28. KeyCreateSql = 'Alter Table StageCompare Add Constraint PrimaryKey Primary Key (BillsID)';
  29. InsertSql = 'Insert Into StageCompare (BillsID, Quantity%d, TotalPrice%d)'+
  30. ' Select BillsID, GatherQuantity, GatherTotalPrice'+
  31. ' From %s';
  32. UpdateSql = 'Update StageCompare As S, %s As A'+
  33. ' Set S.Quantity%d = A.GatherQuantity, S.TotalPrice%d = A.GatherTotalPrice'+
  34. ' Where S.BillsID = A.BillsID';
  35. type
  36. TStageCompareData = class(TDataModule)
  37. sdpStageCompare: TsdADOProvider;
  38. sddStageCompare: TsdDataSet;
  39. private
  40. FPhaseData: TObject;
  41. function CheckCompareExist: Boolean;
  42. procedure ExecuteSql(const ASql: string);
  43. procedure ReloadAllCompareData;
  44. procedure InsertLastesyStageData(AIndex: Integer; const ATableName: string);
  45. procedure UpdateHistoryStageData(AIndex: Integer; const ATableName: string);
  46. public
  47. constructor Create(APhaseData: TObject);
  48. destructor Destroy; override;
  49. procedure Open;
  50. procedure Close;
  51. function HasPhaseData(AID: Integer): Boolean;
  52. end;
  53. implementation
  54. uses
  55. PhaseData;
  56. {$R *.dfm}
  57. { TStageCompareData }
  58. function TStageCompareData.CheckCompareExist: Boolean;
  59. var
  60. Tables: TStrings;
  61. begin
  62. Tables := TStringList.Create;
  63. try
  64. TPhaseData(FPhaseData).ADOConnection.GetTableNames(Tables);
  65. Result := Tables.IndexOf('StageCompare') > -1;
  66. finally
  67. Tables.Free;
  68. end;
  69. end;
  70. procedure TStageCompareData.Close;
  71. begin
  72. sddStageCompare.Close;
  73. end;
  74. constructor TStageCompareData.Create(APhaseData: TObject);
  75. begin
  76. inherited Create(nil);
  77. FPhaseData := APhaseData;
  78. sdpStageCompare.Connection := TPhaseData(FPhaseData).ADOConnection;
  79. end;
  80. destructor TStageCompareData.Destroy;
  81. begin
  82. inherited;
  83. end;
  84. procedure TStageCompareData.ExecuteSql(const ASql: string);
  85. var
  86. FQuery: TADOQuery;
  87. begin
  88. FQuery := TADOQuery.Create(nil);
  89. try
  90. FQuery.Connection := TPhaseData(FPhaseData).ADOConnection;
  91. FQuery.SQL.Clear;
  92. FQuery.SQL.Add(ASql);
  93. FQuery.ExecSQL;
  94. finally
  95. FQuery.Free;
  96. end;
  97. end;
  98. function TStageCompareData.HasPhaseData(AID: Integer): Boolean;
  99. var
  100. Rec: TsdDataRecord;
  101. begin
  102. Result := False;
  103. Rec := sddStageCompare.FindKey('idxID', AID);
  104. if not Assigned(Rec) then Exit;
  105. Result := (Rec.ValueByName('TotalPrice0').AsFloat <> 0)
  106. or (Rec.ValueByName('TotalPrice1').AsFloat <> 0)
  107. or (Rec.ValueByName('TotalPrice2').AsFloat <> 0)
  108. or (Rec.ValueByName('TotalPrice3').AsFloat <> 0)
  109. or (Rec.ValueByName('TotalPrice4').AsFloat <> 0)
  110. or (Rec.ValueByName('TotalPrice5').AsFloat <> 0)
  111. or (Rec.ValueByName('TotalPrice6').AsFloat <> 0)
  112. or (Rec.ValueByName('TotalPrice7').AsFloat <> 0)
  113. or (Rec.ValueByName('TotalPrice8').AsFloat <> 0)
  114. or (Rec.ValueByName('TotalPrice9').AsFloat <> 0)
  115. or (Rec.ValueByName('TotalPrice10').AsFloat <> 0)
  116. or (Rec.ValueByName('TotalPrice11').AsFloat <> 0)
  117. or (Rec.ValueByName('TotalPrice12').AsFloat <> 0)
  118. or (Rec.ValueByName('TotalPrice13').AsFloat <> 0)
  119. or (Rec.ValueByName('TotalPrice14').AsFloat <> 0);
  120. end;
  121. procedure TStageCompareData.InsertLastesyStageData(AIndex: Integer;
  122. const ATableName: string);
  123. var
  124. sSql: string;
  125. begin
  126. sSql := Format(InsertSql, [AIndex, AIndex, ATableName]);
  127. ExecuteSql(sSql);
  128. end;
  129. procedure TStageCompareData.Open;
  130. begin
  131. ReloadAllCompareData;
  132. sddStageCompare.Open;
  133. if not Assigned(sddStageCompare.FindIndex('idxID')) then
  134. sddStageCompare.AddIndex('idxID', 'BillsID');
  135. end;
  136. procedure TStageCompareData.ReloadAllCompareData;
  137. var
  138. iStage: Integer;
  139. begin
  140. if CheckCompareExist then
  141. ExecuteSql(TableDeleteSql);
  142. ExecuteSql(TableCreateSql);
  143. ExecuteSql(KeyCreateSql);
  144. with TPhaseData(FPhaseData) do
  145. begin
  146. InsertLastesyStageData(AuditCount, StageTableName[AuditCount]);
  147. if AuditCount > 0 then
  148. for iStage := 0 to AuditCount - 1 do
  149. UpdateHistoryStageData(iStage, StageTableName[iStage]);
  150. end;
  151. end;
  152. procedure TStageCompareData.UpdateHistoryStageData(AIndex: Integer;
  153. const ATableName: string);
  154. var
  155. sSql: string;
  156. begin
  157. sSql := Format(UpdateSql, [ATableName, AIndex, AIndex]);
  158. ExecuteSql(sSql);
  159. end;
  160. end.