ReportInteractInfo.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. unit ReportInteractInfo;
  2. interface
  3. uses
  4. Classes, ScFileArchiver, XmlDoc, XmlIntf;
  5. Type
  6. TInteractInfo = class
  7. private
  8. FTemplateFile: string;
  9. FInteractFlag: Integer;
  10. FInteractSubFlag: Integer;
  11. FMemoryStream: TMemoryStream;
  12. FAudits: TStringList;
  13. FSql: string;
  14. FSpecialProjGatherTypes: TStringList;
  15. procedure LoadReportTemplate;
  16. procedure LoadAuditor(AXmlNode: IXMLNode);
  17. procedure LoadSql(AXmlNode: IXMLNode);
  18. procedure LoadSpecialProjGatherTypes(AXmlNode: IXMLNode);
  19. procedure LoadInteractInfo(AXmlNode: IXMLNode);
  20. procedure LoadXmlFromStream;
  21. public
  22. constructor Create(const AFileName: string);
  23. destructor Destroy; override;
  24. property Audits: TStringList read FAudits;
  25. property Sql: string read FSql;
  26. property SpecialProjGatherTypes: TStringList read FSpecialProjGatherTypes;
  27. end;
  28. implementation
  29. uses
  30. UtilMethods;
  31. { TInteractInfo }
  32. constructor TInteractInfo.Create(const AFileName: string);
  33. begin
  34. FTemplateFile := AFileName;
  35. FAudits := TStringList.Create;
  36. FSpecialProjGatherTypes := TStringList.Create;
  37. LoadReportTemplate;
  38. LoadXmlFromStream;
  39. end;
  40. destructor TInteractInfo.Destroy;
  41. begin
  42. FMemoryStream.Free;
  43. inherited;
  44. end;
  45. procedure TInteractInfo.LoadAuditor(AXmlNode: IXMLNode);
  46. var
  47. vAudits: IXMLNodeList;
  48. vAudit: IXMLNode;
  49. i: Integer;
  50. begin
  51. if AXmlNode = nil then Exit;
  52. vAudits := AXmlNode.ChildNodes;
  53. for i := 0 to vAudits.Count - 1 do
  54. begin
  55. vAudit := AXmlNode.ChildNodes.Nodes[i];
  56. if vAudit.HasAttribute('职位') then
  57. FAudits.Add(vAudit.Attributes['职位']);
  58. end;
  59. end;
  60. procedure TInteractInfo.LoadInteractInfo(AXmlNode: IXMLNode);
  61. var
  62. XmlNode: IXMLNode;
  63. begin
  64. XmlNode := AXmlNode.ChildNodes.FindNode('附加信息');
  65. LoadAuditor(XmlNode.ChildNodes.FindNode('审核意见'));
  66. LoadSql(XmlNode.ChildNodes.FindNode('查询语句'));
  67. LoadSpecialProjGatherTypes(XmlNode.ChildNodes.FindNode('特殊汇总项目'));
  68. end;
  69. procedure TInteractInfo.LoadReportTemplate;
  70. var
  71. vArchiver: TReportArchiver;
  72. begin
  73. vArchiver := TReportArchiver.Create;
  74. vArchiver.FileName := FTemplateFile;
  75. FMemoryStream := vArchiver.Extract;
  76. end;
  77. procedure TInteractInfo.LoadSpecialProjGatherTypes(AXmlNode: IXMLNode);
  78. var
  79. vSpecialProjs: IXMLNodeList;
  80. vSpecialProj: IXMLNode;
  81. i: Integer;
  82. begin
  83. if AXmlNode = nil then Exit;
  84. vSpecialProjs := AXmlNode.ChildNodes;
  85. for i := 0 to vSpecialProjs.Count - 1 do
  86. begin
  87. vSpecialProj := vSpecialProjs.Nodes[i];
  88. if vSpecialProj.HasAttribute('类型') then
  89. FSpecialProjGatherTypes.Add(vSpecialProj.Attributes['类型']);
  90. end;
  91. end;
  92. procedure TInteractInfo.LoadSql(AXmlNode: IXMLNode);
  93. begin
  94. if AXmlNode = nil then Exit;
  95. if AXmlNode.HasAttribute('Sql语句') then
  96. FSql := AXmlNode.Attributes['Sql语句'];
  97. end;
  98. procedure TInteractInfo.LoadXmlFromStream;
  99. var
  100. FXmlDocument: IXMLDocument;
  101. begin
  102. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  103. try
  104. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  105. if not Assigned(FMemoryStream) then Exit;
  106. FXmlDocument.LoadFromStream(FMemoryStream);
  107. LoadInteractInfo(FXmlDocument.DocumentElement);
  108. finally
  109. FXmlDocument := nil;
  110. end;
  111. end;
  112. end.