source: trunk/EdcProject.pas

Last change on this file was 12, checked in by chronos, 13 days ago
  • Added: Min/max interval position navigation buttons.
  • Modified: Remember last interval position.
File size: 6.4 KB
Line 
1unit EdcProject;
2
3interface
4
5uses
6 Classes, SysUtils, Generics.Collections, Generics.Defaults, XML, DateUtils,
7 Ean, DOM, XMLRead, XMLWrite, Common, CsvDocument,
8 SpotPrice;
9
10type
11
12 { TEdcProject }
13
14 TEdcProject = class
15 private
16 procedure CreateEan(Number, Owner, Address: string; Kind: TEanKind);
17 function FileNameFilter(FileName: string): Boolean;
18 procedure LoadEdcReport(FileName: string);
19 public
20 SpotPrices: TSpotPrices;
21 Eans: TEans;
22 procedure ImportReports(ReportsDir: string);
23 procedure LoadFromFile(FileName: string);
24 procedure SaveToFile(FileName: string);
25 constructor Create;
26 destructor Destroy; override;
27 end;
28
29
30implementation
31
32resourcestring
33 SWrongFileFormat = 'Wrong file format';
34 STotal = 'Total';
35
36const
37 EdcProjectName = 'EdcProject';
38
39function TEdcProject.FileNameFilter(FileName: string): Boolean;
40begin
41 Result := ExtractFileExt(FileName) = '.csv';
42end;
43
44procedure TEdcProject.ImportReports(ReportsDir: string);
45var
46 Reports: TStringList;
47 I: Integer;
48begin
49 for I := 0 to Eans.Count - 1 do
50 Eans[I].Values.Clear;
51
52 Reports := TStringList.Create;
53 try
54 SearchFiles(Reports, ReportsDir, FileNameFilter);
55 for I := 0 to Reports.Count - 1 do
56 LoadEdcReport(Reports[I]);
57 finally
58 Reports.Free;
59 end;
60
61 for I := 0 to Eans.Count - 1 do
62 Eans[I].Values.Sort(TComparer<TEanValue>.Construct(Eans[I].Values.Comparer));
63
64 CreateEan('', STotal, '', ekSupply);
65 CreateEan('', STotal, '', ekConsumption);
66end;
67
68procedure TEdcProject.LoadFromFile(FileName: string);
69var
70 Doc: TXMLDocument;
71 RootNode: TDOMNode;
72 NewNode: TDOMNode;
73begin
74 Eans.Clear;
75 SpotPrices.Clear;
76 ReadXMLFile(Doc, FileName);
77 with Doc do
78 try
79 if Doc.DocumentElement.NodeName <> EdcProjectName then
80 raise Exception.Create(SWrongFileFormat);
81 RootNode := Doc.DocumentElement;
82
83 NewNode := RootNode.FindNode(EansName);
84 if Assigned(NewNode) then
85 Eans.LoadFromXmlNode(NewNode);
86
87 NewNode := RootNode.FindNode(SpotPricesName);
88 if Assigned(NewNode) then
89 SpotPrices.LoadFromXmlNode(NewNode);
90 finally
91 FreeAndNil(Doc);
92 end;
93end;
94
95procedure TEdcProject.SaveToFile(FileName: string);
96var
97 Doc: TXMLDocument;
98 RootNode: TDOMNode;
99 NewNode: TDOMNode;
100begin
101 Doc := TXMLDocument.Create;
102 with Doc do try
103 RootNode := CreateElement(EdcProjectName);
104 AppendChild(RootNode);
105
106 if Eans.Count > 0 then begin
107 NewNode := RootNode.OwnerDocument.CreateElement(EansName);
108 RootNode.AppendChild(NewNode);
109 Eans.SaveToXmlNode(NewNode);
110 end;
111
112 if SpotPrices.Count > 0 then begin
113 NewNode := RootNode.OwnerDocument.CreateElement(SpotPricesName);
114 RootNode.AppendChild(NewNode);
115 SpotPrices.SaveToXmlNode(NewNode);
116 end;
117
118 if ExtractFileDir(FileName) <> '' then
119 ForceDirectories(ExtractFileDir(FileName));
120 WriteXMLFile(Doc, FileName);
121 finally
122 FreeAndNil(Doc);
123 end;
124end;
125
126constructor TEdcProject.Create;
127begin
128 Eans := TEans.Create;
129 SpotPrices := TSpotPrices.Create;
130end;
131
132destructor TEdcProject.Destroy;
133begin
134 FreeAndNil(SpotPrices);
135 FreeAndNil(Eans);
136 inherited;
137end;
138
139procedure TEdcProject.LoadEdcReport(FileName: string);
140var
141 R: Integer;
142 C: Integer;
143 CSVDoc: TCSVDocument;
144 Date: TDateTime;
145 TimeFrom: TDateTime;
146 TimeTo: TDateTime;
147 CellValueIn: Currency;
148 CellValueOut: Currency;
149 Ean: TEan;
150 EanKind: TEanKind;
151 Number: string;
152 A: Currency;
153begin
154 CSVDoc := TCSVDocument.Create;
155 try
156 CSVDoc.Delimiter := ';';
157 CSVDoc.LoadFromFile(FileName);
158
159 for C := 0 to ((CSVDoc.ColCount[0] - 3) div 2) - 1 do begin
160 Number := CSVDoc.Cells[3 + C * 2, 0];
161 if Copy(Number, 1, 3) = 'IN-' then Number := Copy(Number, 4, MaxInt);
162 if Copy(Number, 1, 4) = 'OUT-' then Number := Copy(Number, 5, MaxInt);
163 if Copy(Number, Length(Number) - 1, 2) = '-D' then begin
164 EanKind := ekSupply;
165 Number := Copy(Number, 1, Length(Number) - 2);
166 end;
167 if Copy(Number, Length(Number) - 1, 2) = '-O' then begin
168 EanKind := ekConsumption;
169 Number := Copy(Number, 1, Length(Number) - 2);
170 end;
171 Ean := Eans.SearchByNumber(Number);
172 if not Assigned(Ean) then begin
173 Ean := TEan.Create;
174 Ean.Number := Number;
175 Eans.Add(Ean);
176 end;
177 Ean.Kind := EanKind;
178
179 Ean.Values.Capacity := Ean.Values.Count + CSVDoc.RowCount;
180
181 for R := 1 to CSVDoc.RowCount - 1 do begin
182 Date := StrToDate(CSVDoc.Cells[0, R]);
183 TimeFrom := Date + StrToTime(CSVDoc.Cells[1, R]);
184 TimeTo := Date + StrToTime(CSVDoc.Cells[2, R]);
185
186 CellValueIn := 0;
187 if TryStrToCurr(CSVDoc.Cells[3 + C * 2, R], CellValueIn) then begin
188 if EanKind = ekConsumption then CellValueIn := -CellValueIn;
189 end;
190
191 CellValueOut := 0;
192 if TryStrToCurr(CSVDoc.Cells[3 + C * 2 + 1, R], CellValueOut) then begin
193 if EanKind = ekConsumption then CellValueOut := -CellValueOut;
194 end else CellValueOut := CellValueIn;
195
196 Ean.Values.Add(TEanValue.Create(TimeFrom, CellValueIn, CellValueOut));
197 end;
198 end;
199 finally
200 CSVDoc.Free;
201 end;
202end;
203
204procedure TEdcProject.CreateEan(Number, Owner, Address: string; Kind: TEanKind);
205var
206 Ean: TEan;
207 Values: TDictionary<TDateTime, TEanValue>;
208 ValuesArray: TArray<TPair<TDateTime, TEanValue>>;
209 I: Integer;
210 E: Integer;
211 Value: TEanValue;
212begin
213 Ean := Eans.SearchByOwnerKind(Owner, Kind);
214 if not Assigned(Ean) then begin
215 Ean := TEan.Create;
216 Ean.Number := Number;
217 Ean.Owner := Owner;
218 Ean.Address := Address;
219 Ean.Kind := Kind;
220 Eans.Add(Ean);
221 end;
222
223 Ean.Values.Clear;
224
225 Values := TDictionary<TDateTime, TEanValue>.Create;
226 for E := 0 to Eans.Count - 1 do
227 if Eans[E].Kind = Kind then begin
228 for I := 0 to Eans[E].Values.Count - 1 do begin
229 if Values.TryGetValue(Eans[E].Values[I].Time, Value) then begin
230 Value.ValueIn := Value.ValueIn + Eans[E].Values[I].ValueIn;
231 Value.ValueOut := Value.ValueOut + Eans[E].Values[I].ValueOut;
232 Values[Eans[E].Values[I].Time] := Value;
233 end else begin
234 Values.Add(Eans[E].Values[I].Time, TEanValue.Create(0, Eans[E].Values[I].ValueIn, Eans[E].Values[I].ValueOut));
235 end;
236 end;
237 end;
238
239 ValuesArray := Values.ToArray;
240 Ean.Values.Capacity := Values.Count;
241 for I := 0 to Values.Count - 1 do begin
242 Ean.Values.Add(TEanValue.Create(ValuesArray[I].Key, ValuesArray[I].Value.ValueIn, ValuesArray[I].Value.ValueOut));
243 end;
244 Ean.Values.Sort(TComparer<TEanValue>.Construct(Ean.Values.Comparer));
245
246 Values.Free;
247end;
248
249end.
250
Note: See TracBrowser for help on using the repository browser.