Changeset 6 for trunk/FormMain.pas


Ignore:
Timestamp:
Apr 13, 2026, 2:01:36 PM (2 weeks ago)
Author:
chronos
Message:
  • Modified: EDC related code split into EdcProject unit.
  • Added: Partial loading of spot prices.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FormMain.pas

    r5 r6  
    55uses
    66  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls,
    7   EditBtn, TAGraph, TASeries, Generics.Collections, Generics.Defaults,
     7  EditBtn, Menus, TAGraph, TASeries, Generics.Collections, Generics.Defaults,
    88  DateUtils, Ean, Translator, ApplicationInfo, RegistryEx, PersistentForm,
    9   Theme, Common, XML, DOM, XMLRead, XMLWrite;
     9  Theme, Common, XML, DOM, XMLRead, EdcProject;
    1010
    1111type
     
    2020    ButtonIntervalRight: TButton;
    2121    ButtonIntervalLeft: TButton;
    22     ButtonLoad: TButton;
    2322    Chart1: TChart;
    2423    Chart1LineSeries1: TLineSeries;
     
    4443    ListView1: TListView;
    4544    ListView2: TListView;
     45    MainMenu1: TMainMenu;
    4646    Memo1: TMemo;
     47    MenuItem1: TMenuItem;
     48    MenuItem2: TMenuItem;
     49    MenuItem3: TMenuItem;
    4750    PageControl1: TPageControl;
    4851    PersistentForm1: TPersistentForm;
     
    5659    procedure ButtonIntervalLeftClick(Sender: TObject);
    5760    procedure ButtonIntervalRightClick(Sender: TObject);
    58     procedure ButtonLoadClick(Sender: TObject);
    5961    procedure CheckBoxShowResultChange(Sender: TObject);
    6062    procedure ComboBoxEanSelect(Sender: TObject);
     
    6567    procedure FormDestroy(Sender: TObject);
    6668    procedure FormShow(Sender: TObject);
     69    procedure MenuItem2Click(Sender: TObject);
     70    procedure MenuItem3Click(Sender: TObject);
    6771    procedure TabSheetOverviewShow(Sender: TObject);
    6872    procedure TabSheetChartShow(Sender: TObject);
     
    7276    procedure Translator1Translate(Sender: TObject);
    7377  private
    74     Eans: TEans;
    7578    IntervalFrom: TDateTime;
    7679    IntervalTo: TDateTime;
     
    8083    OwnersFileName: string;
    8184    ShowResult: Boolean;
    82     function FileNameFilter(FileName: string): Boolean;
     85    EdcProject: TEdcProject;
     86    procedure LoadReports;
    8387    function MeasureToFloat(Value: Double; Interval: Double): Double;
    8488    function MeasureToStr(Value: Double): string;
    85     procedure CreateEan(Number, Owner: string; Kind: TEanKind);
    8689    procedure LoadConfig;
    8790    procedure Report;
    8891    procedure ReloadListViewOverview;
    8992    procedure ReloadListViewData;
    90     procedure LoadOwners(FileName: string);
    91     procedure LoadEdcReport(FileName: string);
    9293    procedure ReloadChart;
    9394    function GetIntervalLength: TDateTime;
     
    113114
    114115resourcestring
    115   STotalSupply = 'Total supply';
    116   STotalConsumtion = 'Total consumption';
    117116  SEAN = 'EAN';
    118117  SOwner = 'Owner';
     
    124123  SMonth = 'Month';
    125124  SYear = 'Year';
    126   SWrongFileFormat = 'Wrong file format';
    127125
    128126{ TFormMain }
    129 
    130 function TFormMain.FileNameFilter(FileName: string): Boolean;
    131 begin
    132   Result := ExtractFileExt(FileName) = '.csv';
    133 end;
    134 
    135 procedure TFormMain.ButtonLoadClick(Sender: TObject);
    136 var
    137   Reports: TStringList;
    138   I: Integer;
    139 begin
    140   LoadOwners(OwnersFileName);
    141 
    142   Reports := TStringList.Create;
    143   try
    144     SearchFiles(Reports, ReportsDir, FileNameFilter);
    145     for I := 0 to Reports.Count - 1 do
    146       LoadEdcReport(Reports[I]);
    147   finally
    148     Reports.Free;
    149   end;
    150 
    151   for I := 0 to Eans.Count - 1 do
    152     Eans[I].Values.Sort(TComparer<TEanValue>.Construct(Eans[I].Values.Comparer));
    153 
    154   CreateEan('', STotalSupply, ekSupply);
    155   CreateEan('', STotalConsumtion, ekConsumption);
    156 
    157   if (Eans.Count > 0) and (Eans[0].Values.Count > 0) then
    158     IntervalTo := Eans[0].Values.Last.Time + 15 * OneMinute;
    159   UpdateInterval;
    160   UpdateInterface;
    161 end;
    162127
    163128procedure TFormMain.CheckBoxShowResultChange(Sender: TObject);
     
    212177begin
    213178  PageControl1.TabIndex := 0;
    214   Eans := TEans.Create;
     179  EdcProject := TEdcProject.Create;
    215180  LoadConfig;
    216181end;
     
    219184begin
    220185  SaveConfig;
    221   FreeAndNil(Eans);
     186  FreeAndNil(EdcProject);
    222187end;
    223188
    224189procedure TFormMain.FormShow(Sender: TObject);
    225190begin
    226   ButtonLoadClick(nil);
     191  LoadReports;
     192end;
     193
     194procedure TFormMain.MenuItem2Click(Sender: TObject);
     195begin
     196  LoadReports;
     197end;
     198
     199procedure TFormMain.MenuItem3Click(Sender: TObject);
     200begin
     201  EdcProject.SpotPrices.LoadSpotPrices(StrToDate('1.4.2026'));
    227202end;
    228203
     
    234209procedure TFormMain.TabSheetChartShow(Sender: TObject);
    235210begin
    236   Eans.LoadToStrings(ComboBoxEan.Items, True);
    237   if (ComboBoxEan.Items.Count > 1) and (ComboBoxEan.ItemIndex = -1) then ComboBoxEan.ItemIndex := 1;
    238   Eans.LoadToStrings(ComboBoxEan2.Items, True);
    239   Eans.LoadToStrings(ComboBoxEan3.Items, True);
     211  EdcProject.Eans.LoadToStrings(ComboBoxEan.Items, True);
     212  if (ComboBoxEan.Items.Count > 1) and (ComboBoxEan.ItemIndex = -1) then
     213    ComboBoxEan.ItemIndex := 1;
     214  EdcProject.Eans.LoadToStrings(ComboBoxEan2.Items, True);
     215  EdcProject.Eans.LoadToStrings(ComboBoxEan3.Items, True);
    240216  ReloadChart;
    241217end;
     
    243219procedure TFormMain.TabSheetDataShow(Sender: TObject);
    244220begin
    245   Eans.LoadToStrings(ComboBoxEanData.Items);
     221  EdcProject.Eans.LoadToStrings(ComboBoxEanData.Items);
    246222  if (ComboBoxEanData.Items.Count > 0) and (ComboBoxEanData.ItemIndex = -1) then
    247223    ComboBoxEanData.ItemIndex := 0;
     
    272248  ComboBoxPeriod.Items[Integer(prYear)] := SYear;
    273249  Ean.Translate;
     250end;
     251
     252procedure TFormMain.LoadReports;
     253begin
     254  EdcProject.LoadFromFile(OwnersFileName);
     255  EdcProject.Import(ReportsDir);
     256
     257  if (EdcProject.Eans.Count > 0) and (EdcProject.Eans[0].Values.Count > 0) then
     258    IntervalTo := EdcProject.Eans[0].Values.Last.Time + 15 * OneMinute;
     259  UpdateInterval;
     260  UpdateInterface;
    274261end;
    275262
     
    290277end;
    291278
    292 procedure TFormMain.CreateEan(Number, Owner: string; Kind: TEanKind);
    293 var
    294   Ean: TEan;
    295   Values: TDictionary<TDateTime, TEanValue>;
    296   ValuesArray: TArray<TPair<TDateTime, TEanValue>>;
    297   I: Integer;
    298   E: Integer;
    299   Value: TEanValue;
    300 begin
    301   Ean := TEan.Create;
    302   Ean.Number := Number;
    303   Ean.Owner := Owner;
    304   Ean.Kind := Kind;
    305 
    306   Values := TDictionary<TDateTime, TEanValue>.Create;
    307   for E := 0 to Eans.Count - 1 do
    308   if Eans[E].Kind = Kind then begin
    309     for I := 0 to Eans[E].Values.Count - 1 do begin
    310       if Values.TryGetValue(Eans[E].Values[I].Time, Value) then begin
    311         Value.ValueIn := Value.ValueIn + Eans[E].Values[I].ValueIn;
    312         Value.ValueOut := Value.ValueOut + Eans[E].Values[I].ValueOut;
    313         Values[Eans[E].Values[I].Time] := Value;
    314       end else begin
    315         Values.Add(Eans[E].Values[I].Time, TEanValue.Create(0, Eans[E].Values[I].ValueIn, Eans[E].Values[I].ValueOut));
    316       end;
    317     end;
    318   end;
    319 
    320   ValuesArray := Values.ToArray;
    321   for I := 0 to Values.Count - 1 do begin
    322     Ean.Values.Add(TEanValue.Create(ValuesArray[I].Key, ValuesArray[I].Value.ValueIn, ValuesArray[I].Value.ValueOut));
    323   end;
    324   Ean.Values.Sort(TComparer<TEanValue>.Construct(Ean.Values.Comparer));
    325 
    326   Values.Free;
    327 
    328   Eans.Add(Ean);
    329 end;
    330 
    331279procedure TFormMain.Report;
    332280var
     
    337285  try
    338286    Memo1.Lines.Clear;
    339     for I := 0 to Eans.Count - 1 do begin
    340       Memo1.Lines.Add(SEAN + ': ' + Eans[I].Number);
    341       Memo1.Lines.Add(SOwner + ': ' + Eans[I].Owner);
    342       TotalIn := Eans[I].GetTotalIn(IntervalFrom, IntervalTo);
    343       TotalOut := Eans[I].GetTotalOut(IntervalFrom, IntervalTo);
     287    for I := 0 to EdcProject.Eans.Count - 1 do
     288    with EdcProject.Eans[I] do begin
     289      Memo1.Lines.Add(SEAN + ': ' + Number);
     290      Memo1.Lines.Add(SOwner + ': ' + Owner);
     291      TotalIn := GetTotalIn(IntervalFrom, IntervalTo);
     292      TotalOut := GetTotalOut(IntervalFrom, IntervalTo);
    344293      Memo1.Lines.Add(SMeasured + ': ' + IntToStr(Trunc(TotalIn)));
    345294      Memo1.Lines.Add(SResult + ': ' + IntToStr(Trunc(TotalOut)));
    346295      if TotalIn <> 0 then
    347       Memo1.Lines.Add(SShared + ': ' + IntToStr(Trunc(Eans[I].GetShared(IntervalFrom, IntervalTo))) + ' %');
     296      Memo1.Lines.Add(SShared + ': ' + IntToStr(Trunc(GetShared(IntervalFrom, IntervalTo))) + ' %');
    348297      Memo1.Lines.Add('');
    349298    end;
     
    361310  try
    362311    ListView1.Items.Clear;
    363     for I := 0 to Eans.Count - 1 do
    364     with Eans[I] do begin
     312    for I := 0 to EdcProject.Eans.Count - 1 do
     313    with EdcProject.Eans[I] do begin
    365314      ListItem := ListView1.Items.Add;
    366315      ListItem.Caption := Number;
     
    401350      ListView2.EndUpdate;
    402351    end;
    403   end;
    404 end;
    405 
    406 procedure TFormMain.LoadOwners(FileName: string);
    407 var
    408   Ean: TEan;
    409   Doc: TXMLDocument;
    410   RootNode: TDOMNode;
    411   NewNode: TDOMNode;
    412   Node2: TDOMNode;
    413 const
    414   EdcProjectName = 'EdcProject';
    415   EansName = 'Eans';
    416   EanName = 'Ean';
    417 begin
    418   ReadXMLFile(Doc, FileName);
    419   Eans.Clear;
    420   with Doc do
    421   try
    422     if Doc.DocumentElement.NodeName <> EdcProjectName then
    423       raise Exception.Create(SWrongFileFormat);
    424     RootNode := Doc.DocumentElement;
    425 
    426     NewNode := RootNode.FindNode(EansName);
    427     if Assigned(NewNode) then begin
    428       Node2 := NewNode.FirstChild;
    429       while Assigned(Node2) and (Node2.NodeName = EanName) do begin
    430         Ean := TEan.Create;
    431         Ean.Number := ReadString(Node2, 'Number', '');
    432         Ean.Owner := ReadString(Node2, 'Owner', '');
    433         Ean.DistributionTariff := ReadString(Node2, 'DistributionTariff', '');
    434         Ean.PriceLow := ReadDouble(Node2, 'PriceLow', 0);
    435         Ean.PriceHigh := ReadDouble(Node2, 'PriceHigh', 0);
    436         Ean.PriceSpot := ReadDouble(Node2, 'PriceSpot', 0);
    437         Eans.Add(Ean);
    438         Node2 := Node2.NextSibling;
    439       end;
    440     end;
    441   finally
    442     FreeAndNil(Doc);
    443   end;
    444 end;
    445 
    446 procedure TFormMain.LoadEdcReport(FileName: string);
    447 var
    448   R: Integer;
    449   C: Integer;
    450   CSVDoc: TCSVDocument;
    451   TimeFrom: TDateTime;
    452   TimeTo: TDateTime;
    453   CellValueIn: Double;
    454   CellValueOut: Double;
    455   Ean: TEan;
    456   EanKind: TEanKind;
    457   Number: string;
    458   BufferedFileStream: TBufferedFileStream;
    459 begin
    460   CSVDoc := TCSVDocument.Create;
    461   try
    462     CSVDoc.Delimiter := ';';
    463     //BufferedFileStream := TBufferedFileStream.Create(FileName, fmOpenRead);
    464     //CSVDoc.LoadFromStream(BufferedFileStream);
    465     CSVDoc.LoadFromFile(FileName);
    466     //BufferedFileStream.Free;
    467 
    468     for C := 0 to ((CSVDoc.ColCount[0] - 3) div 2) - 1 do begin
    469       Number := CSVDoc.Cells[3 + C * 2, 0];
    470       if Copy(Number, 1, 3) = 'IN-' then Number := Copy(Number, 4, MaxInt);
    471       if Copy(Number, 1, 4) = 'OUT-' then Number := Copy(Number, 5, MaxInt);
    472       if Copy(Number, Length(Number) - 1, 2) = '-D' then begin
    473         EanKind := ekSupply;
    474         Number := Copy(Number, 1, Length(Number) - 2);
    475       end;
    476       if Copy(Number, Length(Number) - 1, 2) = '-O' then begin
    477         EanKind := ekConsumption;
    478         Number := Copy(Number, 1, Length(Number) - 2);
    479       end;
    480       Ean := Eans.SearchByNumber(Number);
    481       if not Assigned(Ean) then begin
    482         Ean := TEan.Create;
    483         Ean.Number := Number;
    484         Eans.Add(Ean);
    485       end;
    486       Ean.Kind := EanKind;
    487 
    488       for R := 1 to CSVDoc.RowCount - 1 do begin
    489         TimeFrom := StrToDate(CSVDoc.Cells[0, R]) + StrToTime(CSVDoc.Cells[1, R]);
    490         TimeTo := StrToDate(CSVDoc.Cells[0, R]) + StrToTime(CSVDoc.Cells[2, R]);
    491 
    492         CellValueIn := 0;
    493         if TryStrToFloat(CSVDoc.Cells[3 + C * 2, R], CellValueIn) then begin
    494           if EanKind = ekConsumption then CellValueIn := -CellValueIn;
    495         end;
    496 
    497         CellValueOut := 0;
    498         if TryStrToFloat(CSVDoc.Cells[3 + C * 2 + 1, R], CellValueOut) then begin
    499           if EanKind = ekConsumption then CellValueOut := -CellValueOut;
    500         end;
    501 
    502         Ean.Values.Add(TEanValue.Create(TimeFrom, CellValueIn, CellValueOut));
    503       end;
    504     end;
    505   finally
    506     CSVDoc.Free;
    507352  end;
    508353end;
Note: See TracChangeset for help on using the changeset viewer.