stgGatherDm.pas 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. unit stgGatherDm;
  2. // ½á¹ûչʾ£¬ÄÚ´æ±í
  3. interface
  4. uses
  5. SysUtils, Classes, stgGatherCacheData, sdDB, sdProvider, stgGatherUtils;
  6. type
  7. TstgGatherData = class(TDataModule)
  8. smpGatherTree: TsdMemoryProvider;
  9. sddGatherTree: TsdDataSet;
  10. sdvGatherTree: TsdDataView;
  11. smpSubTenders: TsdMemoryProvider;
  12. sddSubTenders: TsdDataSet;
  13. sdvSubTenders: TsdDataView;
  14. smpBillsDetail: TsdMemoryProvider;
  15. sddBillsDetail: TsdDataSet;
  16. sdvBillsDetail: TsdDataView;
  17. sdmErrorDetail: TsdMemoryProvider;
  18. sddErrorDetail: TsdDataSet;
  19. sdvErrorDetail: TsdDataView;
  20. procedure sdvBillsDetailGetText(var Text: String;
  21. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  22. DisplayText: Boolean);
  23. procedure sdvBillsDetailFilterRecord(ARecord: TsdDataRecord;
  24. var Allow: Boolean);
  25. procedure sdvGatherTreeCurrentChanged(ARecord: TsdDataRecord);
  26. procedure sdvGatherTreeGetText(var Text: String;
  27. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  28. DisplayText: Boolean);
  29. procedure sdvErrorDetailFilterRecord(ARecord: TsdDataRecord;
  30. var Allow: Boolean);
  31. procedure sdvSubTendersCurrentChanged(ARecord: TsdDataRecord);
  32. procedure sdvErrorDetailGetText(var Text: String;
  33. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  34. DisplayText: Boolean);
  35. private
  36. procedure LoadSubTenders(ACacheData: TstgGatherCacheData);
  37. procedure LoadGatherTreeNodeDetail(ANode: TstgGatherTreeNode);
  38. procedure LoadGatherTreeNode(ANode: TstgGatherTreeNode);
  39. procedure LoadGatherTree(ACacheData: TstgGatherCacheData);
  40. procedure LoadError(AError: TstgErrorInfo);
  41. procedure LoadErrors(ACacheData: TstgGatherCacheData);
  42. public
  43. procedure LoadGatherData(ACacheData: TstgGatherCacheData);
  44. end;
  45. implementation
  46. uses
  47. Variants, DB, ConditionalDefines;
  48. {$R *.dfm}
  49. { TstgGatherData }
  50. procedure TstgGatherData.LoadGatherData(ACacheData: TstgGatherCacheData);
  51. begin
  52. LoadSubTenders(ACacheData);
  53. LoadGatherTree(ACacheData);
  54. LoadErrors(ACacheData);
  55. sdvGatherTree.Active := True;
  56. sdvBillsDetail.Active := True;
  57. sdvBillsDetail.RefreshFilter;
  58. sdvSubTenders.Active := True;
  59. sdvErrorDetail.Active := True;
  60. sdvErrorDetail.RefreshFilter;
  61. end;
  62. procedure TstgGatherData.LoadGatherTree(ACacheData: TstgGatherCacheData);
  63. var
  64. i: Integer;
  65. vNode:TstgGatherTreeNode;
  66. begin
  67. if _IsDebugView then
  68. ACacheData.GatherTree.SaveTreeToFile('E:\stgGatherTree.txt');
  69. for i := 0 to ACacheData.GatherTree.CacheNodes.Count - 1 do
  70. begin
  71. vNode := TstgGatherTreeNode(ACacheData.GatherTree.CacheNodes.Items[i]);
  72. LoadGatherTreeNode(vNode);
  73. end;
  74. end;
  75. procedure TstgGatherData.LoadGatherTreeNode(ANode: TstgGatherTreeNode);
  76. var
  77. Rec: TsdDataRecord;
  78. begin
  79. Rec := sddGatherTree.Add;
  80. Rec.ValueByName('ID').AsInteger := ANode.ID;
  81. Rec.ValueByName('ParentID').AsInteger := ANode.ParentID;
  82. Rec.ValueByName('NextSiblingID').AsInteger := ANode.NextSiblingID;
  83. Rec.ValueByName('Code').AsString := ANode.Code;
  84. Rec.ValueByName('B_Code').AsString := ANode.B_Code;
  85. Rec.ValueByName('Name').AsString := ANode.Name;
  86. Rec.ValueByName('Units').AsString := ANode.Units;
  87. Rec.ValueByName('IsSubTender').AsBoolean := ANode.IsSubTender;
  88. Rec.ValueByName('IsSumBase').AsBoolean := ANode.IsSumBase;
  89. Rec.ValueByName('IsLeaf').AsBoolean := ANode.IsLeaf;
  90. Rec.ValueByName('DealQuantity').AsFloat := ANode.Gather.DealQuantity;
  91. Rec.ValueByName('DealTotalPrice').AsFloat := ANode.Gather.DealTotalPrice;
  92. Rec.ValueByName('QcQuantity').AsFloat := ANode.Gather.QcQuantity;
  93. Rec.ValueByName('QcTotalPrice').AsFloat := ANode.Gather.QcTotalPrice;
  94. Rec.ValueByName('QcBGLCode').AsString := ANode.Gather.QcBGLCode;
  95. Rec.ValueByName('QcBGLNum').AsString := ANode.Gather.QcBGLNum;
  96. if ANode.Children.Count = 0 then
  97. LoadGatherTreeNodeDetail(ANode);
  98. end;
  99. procedure TstgGatherData.LoadGatherTreeNodeDetail(
  100. ANode: TstgGatherTreeNode);
  101. var
  102. iSub, iDetail: Integer;
  103. vSub: TstgSubTenderStageData;
  104. vDetail: TstgSubTenderDetailData;
  105. Rec: TsdDataRecord;
  106. sSubTenderName: string;
  107. begin
  108. for iSub := 0 to ANode.SubTenderCount - 1 do
  109. begin
  110. vSub := ANode.SubTender[iSub];
  111. for iDetail := 0 to vSub.DetailCount - 1 do
  112. begin
  113. vDetail := vSub.Detail[iDetail];
  114. Rec := sddBillsDetail.Add;
  115. Rec.ValueByName('BillsID').AsInteger := ANode.ID;
  116. Rec.ValueByName('TenderID').AsInteger := vSub.SubTenderID;
  117. Rec.ValueByName('TenderName').AsString := '';
  118. Rec.ValueByName('SerialNo').AsInteger := vDetail.SerialNo;
  119. Rec.ValueByName('DealQuantity').AsFloat := vDetail.DetailStage.DealQuantity;
  120. Rec.ValueByName('DealTotalPrice').AsFloat := vDetail.DetailStage.DealTotalPrice;
  121. Rec.ValueByName('QcQuantity').AsFloat := vDetail.DetailStage.QcQuantity;
  122. Rec.ValueByName('QcTotalPrice').AsFloat := vDetail.DetailStage.QcTotalPrice;
  123. Rec.ValueByName('QcBGLCode').AsString := vDetail.DetailStage.QcBGLCode;
  124. Rec.ValueByName('QcBGLNum').AsString := vDetail.DetailStage.QcBGLNum;
  125. end;
  126. end;
  127. end;
  128. procedure TstgGatherData.LoadSubTenders(ACacheData: TstgGatherCacheData);
  129. var
  130. i: Integer;
  131. vSubTender: TstgGatherSubTender;
  132. Rec: TsdDataRecord;
  133. begin
  134. for i := 0 to ACacheData.SubTenderCount - 1 do
  135. begin
  136. vSubTender := ACacheData.SubTender[i];
  137. Rec := sddSubTenders.Add;
  138. Rec.ValueByName('ID').AsInteger := vSubTender.ID;
  139. Rec.ValueByName('Name').AsString := vSubTender.Rec.ValueByName('Name').AsString;
  140. end;
  141. end;
  142. procedure TstgGatherData.sdvBillsDetailGetText(var Text: String;
  143. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  144. DisplayText: Boolean);
  145. function GetTenderName(ATenderID: Integer): string;
  146. begin
  147. Result := VarToStrDef(sddSubTenders.Lookup('ID', ATenderID, 'Name'), '');
  148. end;
  149. begin
  150. if DisplayText and (AColumn.FieldName = 'TenderName') then
  151. Text := GetTenderName(ARecord.ValueByName('TenderID').asInteger);
  152. end;
  153. procedure TstgGatherData.sdvBillsDetailFilterRecord(ARecord: TsdDataRecord;
  154. var Allow: Boolean);
  155. begin
  156. if Assigned(sdvGatherTree.Current) then
  157. Allow := ARecord.ValueByName('BillsID').AsInteger = sdvGatherTree.Current.ValueByName('ID').AsInteger
  158. else
  159. Allow := False;
  160. end;
  161. procedure TstgGatherData.sdvGatherTreeCurrentChanged(
  162. ARecord: TsdDataRecord);
  163. begin
  164. sdvBillsDetail.RefreshFilter;
  165. end;
  166. procedure TstgGatherData.sdvGatherTreeGetText(var Text: String;
  167. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  168. DisplayText: Boolean);
  169. begin
  170. if (AValue.DataType = ftFloat) and (AValue.AsFloat = 0) then
  171. begin
  172. Text := '';
  173. end;
  174. end;
  175. procedure TstgGatherData.LoadErrors(ACacheData: TstgGatherCacheData);
  176. var
  177. i: Integer;
  178. begin
  179. for i := 0 to ACacheData.ErrorCount - 1 do
  180. LoadError(ACacheData.Error[i]);
  181. end;
  182. procedure TstgGatherData.sdvErrorDetailFilterRecord(ARecord: TsdDataRecord;
  183. var Allow: Boolean);
  184. begin
  185. if Assigned(sdvSubTenders.Current) then
  186. Allow := ARecord.ValueByName('TenderID').AsInteger = sdvSubTenders.Current.ValueByName('ID').AsInteger
  187. else
  188. Allow := False;
  189. end;
  190. procedure TstgGatherData.LoadError(AError: TstgErrorInfo);
  191. function GetSubTenderSerialNo(ANode: TstgGatherTreeNode; ATenderID: Integer): Integer;
  192. var
  193. vSource: TstgSubTenderStageData;
  194. begin
  195. vSource := ANode.FindSubTender(ATenderID);
  196. if Assigned(vSource) then
  197. Result := vSource.Detail[0].SerialNo;
  198. end;
  199. var
  200. i, j, k: Integer;
  201. vRelaDetail: TstgGatherTreeNode;
  202. vRelaDetailStage: TstgSubTenderStageData;
  203. Rec: TsdDataRecord;
  204. begin
  205. for i := 0 to AError.DetailCount - 1 do
  206. begin
  207. vRelaDetail := AError.Detail[i];
  208. for j := 0 to vRelaDetail.SubTenderCount - 1 do
  209. begin
  210. vRelaDetailStage := vRelaDetail.SubTender[j];
  211. for k := 0 to vRelaDetailStage.DetailCount - 1 do
  212. begin
  213. Rec := sddErrorDetail.Add;
  214. Rec.ValueByName('TenderID').AsInteger := vRelaDetail.SubTender[j].SubTenderID;
  215. Rec.ValueByName('RelaCode').AsString := AError.RelaNode.Code + AError.RelaNode.B_Code;
  216. if AError.RelaNode.IsLeaf then
  217. Rec.ValueByName('RelaSerialNo').AsInteger := vRelaDetailStage.Detail[k].SerialNo
  218. else
  219. Rec.ValueByName('RelaSerialNo').AsInteger := GetSubTenderSerialNo(AError.RelaNode, vRelaDetailStage.SubTenderID);
  220. Rec.ValueByName('DetailCode').AsString := vRelaDetail.Code + vRelaDetail.B_Code;
  221. Rec.ValueByName('DetailSerialNo').AsInteger := vRelaDetailStage.Detail[k].SerialNo;
  222. Rec.ValueByName('ErrorType').AsInteger := AError.ErrorType;
  223. end;
  224. end;
  225. end;
  226. end;
  227. procedure TstgGatherData.sdvSubTendersCurrentChanged(
  228. ARecord: TsdDataRecord);
  229. begin
  230. sdvErrorDetail.RefreshFilter;
  231. end;
  232. procedure TstgGatherData.sdvErrorDetailGetText(var Text: String;
  233. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  234. DisplayText: Boolean);
  235. function GetTenderName(ATenderID: Integer): string;
  236. begin
  237. Result := VarToStrDef(sddSubTenders.Lookup('ID', ATenderID, 'Name'), '');
  238. end;
  239. begin
  240. if DisplayText then
  241. begin
  242. if (AColumn.FieldName = 'TenderName') then
  243. Text := GetTenderName(ARecord.ValueByName('TenderID').asInteger)
  244. else if (AColumn.FieldName = 'ErrorType') then
  245. Text := GetErrorTypeText(AValue.AsInteger);
  246. end;
  247. end;
  248. end.