Commit adbcae38caf067e0cc6ecceceac93fb29d2b7fec

Authored by Carlos Picanco
1 parent 88e0f1df
Exists in master

implement report reader

Showing 1 changed file with 117 additions and 0 deletions   Show diff stats
units/report_reader.pas 0 → 100644
... ... @@ -0,0 +1,117 @@
  1 +unit report_reader;
  2 +
  3 +{$mode objfpc}{$H+}
  4 +
  5 +interface
  6 +
  7 +uses
  8 + Classes, SysUtils;
  9 +
  10 +type
  11 +
  12 + TRowRange = record
  13 + Low,
  14 + High : integer;
  15 + end;
  16 +
  17 + { TReportReader }
  18 +
  19 + TReportReader = class
  20 + private
  21 + FLastRowsX : integer;
  22 + FRows : TStringList;
  23 + FCols : TStringList;
  24 + FRowRange: TRowRange;
  25 + FUseRange: Boolean;
  26 + function GetColumnOf(AName: string): TStringList;
  27 + procedure RangeAsLastXRows;
  28 + public
  29 + constructor Create;
  30 + destructor Destroy; override;
  31 + procedure Append(ARow : string);
  32 + procedure Clean;
  33 + procedure SetXLastRows(X:integer);
  34 + property Range : TRowRange read FRowRange;
  35 + property UseRange : Boolean read FUseRange write FUseRange;
  36 + property ColumnOf[AName:string]:TStringList read GetColumnOf;
  37 + end;
  38 +
  39 +implementation
  40 +
  41 +uses strutils;
  42 +
  43 +{ TReportReader }
  44 +
  45 +function TReportReader.GetColumnOf(AName: string): TStringList;
  46 +var
  47 + c,
  48 + i : integer;
  49 + Row : string;
  50 +begin
  51 + Result := TStringList.Create;
  52 + c := FCols.IndexOf(AName);
  53 + if c > -1 then
  54 + if FUseRange and (FRowRange.Low <= FRowRange.High) and (FRowRange.Low > 0) then
  55 + for i := FRowRange.Low to FRowRange.High do
  56 + Result.Append(ExtractDelimited(c+1, FRows[i],[#9,#10]))
  57 + else
  58 + for Row in FRows do
  59 + Result.Append(ExtractDelimited(c+1, Row,[#9,#10]));
  60 +end;
  61 +
  62 +constructor TReportReader.Create;
  63 +begin
  64 + inherited Create;
  65 + FUseRange := False;
  66 + FRows := TStringList.Create;
  67 + FCols := TStringList.Create;
  68 + FCols.Delimiter := #9;
  69 + FCols.StrictDelimiter := True;
  70 +end;
  71 +
  72 +destructor TReportReader.Destroy;
  73 +begin
  74 + FRows.Free;
  75 + FCols.Free;
  76 + inherited Destroy;
  77 +end;
  78 +
  79 +procedure TReportReader.Append(ARow: string);
  80 +begin
  81 + if FCols.Count = 0 then
  82 + FCols.DelimitedText := ARow
  83 + else
  84 + begin
  85 + FRows.Append(ARow);
  86 + RangeAsLastXRows;
  87 + end;
  88 +end;
  89 +
  90 +procedure TReportReader.Clean;
  91 +begin
  92 + FCols.Clear;
  93 + FRows.Clear;
  94 +end;
  95 +
  96 +procedure TReportReader.SetXLastRows(X: integer);
  97 +begin
  98 + FLastRowsX:=X;
  99 + RangeAsLastXRows;
  100 +end;
  101 +
  102 +procedure TReportReader.RangeAsLastXRows;
  103 +begin
  104 + FRowRange.High := FRows.Count-1;
  105 + FRowRange.Low := FRows.Count-FLastRowsX;
  106 + {$IFDEF DEBUG}
  107 + if FRowRange.Low > FRowRange.High then
  108 + WriteLn('Warning: FRowRange.Low > FRowRange.High, range will not be used');
  109 +
  110 + if FRowRange.Low < 0 then
  111 + WriteLn('Warning: FRowRange.Low < 0, range will not be used');
  112 + {$ENDIF}
  113 +end;
  114 +
  115 +
  116 +end.
  117 +
... ...