ReportInteractInfo.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. public
  21. constructor Create(const AFileName: string);
  22. destructor Destroy; override;
  23. procedure LoadXmlFromStream;
  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. FAudits.Clear;
  53. vAudits := AXmlNode.ChildNodes;
  54. for i := 0 to vAudits.Count - 1 do
  55. begin
  56. vAudit := AXmlNode.ChildNodes.Nodes[i];
  57. if vAudit.HasAttribute('职位') then
  58. FAudits.Add(vAudit.Attributes['职位']);
  59. end;
  60. end;
  61. procedure TInteractInfo.LoadInteractInfo(AXmlNode: IXMLNode);
  62. var
  63. XmlNode: IXMLNode;
  64. begin
  65. XmlNode := AXmlNode.ChildNodes.FindNode('附加信息');
  66. LoadAuditor(XmlNode.ChildNodes.FindNode('审核意见'));
  67. LoadSql(XmlNode.ChildNodes.FindNode('查询语句'));
  68. LoadSpecialProjGatherTypes(XmlNode.ChildNodes.FindNode('特殊汇总项目'));
  69. end;
  70. procedure TInteractInfo.LoadReportTemplate;
  71. var
  72. vArchiver: TReportArchiver;
  73. begin
  74. vArchiver := TReportArchiver.Create;
  75. vArchiver.FileName := FTemplateFile;
  76. FMemoryStream := vArchiver.Extract;
  77. end;
  78. procedure TInteractInfo.LoadSpecialProjGatherTypes(AXmlNode: IXMLNode);
  79. var
  80. vSpecialProjs: IXMLNodeList;
  81. vSpecialProj: IXMLNode;
  82. i: Integer;
  83. begin
  84. if AXmlNode = nil then Exit;
  85. FSpecialProjGatherTypes.Clear;
  86. vSpecialProjs := AXmlNode.ChildNodes;
  87. for i := 0 to vSpecialProjs.Count - 1 do
  88. begin
  89. vSpecialProj := vSpecialProjs.Nodes[i];
  90. if vSpecialProj.HasAttribute('类型') then
  91. FSpecialProjGatherTypes.Add(vSpecialProj.Attributes['类型']);
  92. end;
  93. end;
  94. procedure TInteractInfo.LoadSql(AXmlNode: IXMLNode);
  95. begin
  96. if AXmlNode = nil then Exit;
  97. if AXmlNode.HasAttribute('Sql语句') then
  98. FSql := AXmlNode.Attributes['Sql语句'];
  99. end;
  100. procedure TInteractInfo.LoadXmlFromStream;
  101. var
  102. FXmlDocument: IXMLDocument;
  103. begin
  104. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  105. try
  106. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  107. if not Assigned(FMemoryStream) then Exit;
  108. FXmlDocument.LoadFromStream(FMemoryStream);
  109. LoadInteractInfo(FXmlDocument.DocumentElement);
  110. finally
  111. FXmlDocument := nil;
  112. end;
  113. end;
  114. end.