Skip to main navigation Skip to main content Skip to page footer
unit BudgetForm;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  DataModule,
  Data.DB,
  Vcl.StdCtrls,
  Vcl.Grids,
  Vcl.DBGrids,
  Vcl.ExtCtrls,
  Vcl.GraphUtil,
  FlatDesignColorsFull,
  TL.Components;

type
  TfrmBudget = class(TLForm)
    Panel1: TPanel;
    LDBGrid1: TLDBGrid;
    Panel2: TPanel;
    Button1: TButton;
    Panel3: TPanel;
    LDBGrid2: TLDBGrid;
    Panel4: TPanel;
    LDBGrid3: TLDBGrid;
    procedure Button1Click(Sender: TObject);
    procedure LDBGrid3KeyDown(
       Sender : TObject;
       var Key: Word;
       Shift  : TShiftState);
    procedure LDBGrid3DrawColumnCell(
       Sender    : TObject;
       const Rect: TRect;
       DataCol   : Integer;
       Column    : TColumn;
       State     : TGridDrawState);
    procedure LDBGrid2DrawColumnCell(
       Sender    : TObject;
       const Rect: TRect;
       DataCol   : Integer;
       Column    : TColumn;
       State     : TGridDrawState);
    private
      { Private declarations }
      procedure QueryInsert;
    public
      { Public declarations }
      procedure InitGrids;
  end;

var
  frmBudget: TfrmBudget;

implementation

{$R *.dfm}

uses
  BudgetEditForm;

procedure TfrmBudget.InitGrids;
  begin
    Self.LDBGrid1.SetColumnAttr;
    Self.LDBGrid2.SetColumnAttr;
    Self.LDBGrid3.SetColumnAttr;
    Self.LDBGrid2.Columns[0].Width := Self.LDBGrid3.Columns[0].Width + Self.LDBGrid3.Columns[1].Width;
  end;

procedure TfrmBudget.QueryInsert;
  var
    iAffectedRows: Integer;
    JaarID       : Integer;
    { TODO 1 -oTL -cFeature :
      Als er Subcategorieën worden toegevoegd met eventueel nieuwe Categorieën,
      dan automatisch de budgetten aanvullen met deze records.
      SET @Subcategorie = 124;

      INSERT IGNORE INTO Budget (Budget.JaarID, Budget.CategorieID, Budget.SubcategorieID)
      SELECT BudgetJaar.ID, Categorie.ID, Subcategorie.ID
      FROM
      Categorie
      JOIN Subcategorie ON Categorie.ID = Subcategorie.CategorieID
      JOIN BudgetJaar
      WHERE
      Subcategorie.ID = @Subcategorie;
    }
  begin
    dm.CommandAppendBudgetJaar.CommandText :=
       'INSERT IGNORE INTO Budget (Budget.JaarID, Budget.CategorieID, Budget.SubcategorieID) ' +
       'SELECT :Jaar, Categorie.ID, Subcategorie.ID ' + 'FROM ' + '  Categorie ' +
       '  JOIN Subcategorie ON Categorie.ID = Subcategorie.CategorieID;';
    JaarID := dm.DataSetBudgetJaar.FieldByName('ID').Value;
    dm.CommandAppendBudgetJaar.Execute(
       iAffectedRows,
       VarArrayOf([JaarID]));
  end;

procedure TfrmBudget.Button1Click(Sender: TObject);
  var
    j: Integer;
  begin
    try
      dm.DataSetBudgetJaar.Last;
      j := dm.DataSetBudgetJaar.FieldByName('Jaar').AsInteger;
      if j <> 0
      then
        inc(j)
      else
        j := CurrentYear;

      { TODO 1 -oTL -cFeature :
        Init procedure toevoegen
        Query maken om alle jaren in het mutatie bestand te vinden
        Als er nog geen Budget record voor dat jaar is er een aanmaken
        SQL 'SELECT DISTINCT YEAR(Datum) AS Jaar FROM Mutaties ORDER BY Jaar ASC;' }
      // for j:= 2016 to 2023 do
      // begin

      dm.DataSetBudgetJaar.Append;
      dm.DataSetBudgetJaar.FieldByName('Jaar').AsInteger := j;
      dm.DataSetBudgetJaar.Post;
      QueryInsert;

      // end;

      dm.DataSetBudget.Active       := False;
      dm.DataSetBudget.Active       := True;
      dm.DataSetBudgetTotaal.Active := False;
      dm.DataSetBudgetTotaal.Active := True;
      dm.DataSetBudgetEdit.Active   := False;
      dm.DataSetBudgetEdit.Active   := True;

      Self.LDBGrid2.Refresh;
      InitGrids;
    except
      dm.DataSetBudgetJaar.CancelUpdates;
    end;
  end;

procedure TfrmBudget.LDBGrid2DrawColumnCell(
   Sender    : TObject;
   const Rect: TRect;
   DataCol   : Integer;
   Column    : TColumn;
   State     : TGridDrawState);
  var
    Field  : TField;
    Grid   : TLDBGrid;
    DataSet: TDataSet;
    R      : TRect;
  begin
    if Sender is TLDBGrid
    then
    begin
      // Create some local variables to write more readable code
      Grid    := (Sender as TLDBGrid);
      DataSet := Grid.DataSource.DataSet;
      Field   := Column.Field;

      R := Rect;
      InflateRect(
         R,
         - 10,
         - 15);

      if Assigned(Field) and (DataCol = 0)
      then // Only color description column
      begin
        case DataSet.RecNo of
          1: // Inkomsten
            if not (gdSelected in State)
            then
              Grid.Canvas.Brush.Color := clGreen_sea_100
            else
              Grid.Canvas.Brush.Color := clGreen_sea_200;
          2: // Vaste lasten
            if not (gdSelected in State)
            then
              Grid.Canvas.Brush.Color := clAlizarin_100
            else
              Grid.Canvas.Brush.Color := clAlizarin_200;
          3: // Variabele lasten
            if not (gdSelected in State)
            then
              Grid.Canvas.Brush.Color := clMidnight_blue_100
            else
              Grid.Canvas.Brush.Color := clMidnight_blue_200;
          4: // Totaal
            if not (gdSelected in State)
            then
              Grid.Canvas.Brush.Color := clMidnight_blue_100
            else
              Grid.Canvas.Brush.Color := clMidnight_blue_200
        end;

        // Always use black for selected (highlighted) rows in desciption column
        if (gdSelected in State)
        then
        begin
          Grid.Canvas.Font.Color := clBlack;
          Grid.Canvas.Font.Style := [fsBold];
        end;

      end;

      Grid.Canvas.FillRect(Rect);
      Grid.DefaultDrawColumnCell(
         R,
         DataCol,
         Column,
         State);

      // Decorate Total row)
      if (DataSet.RecNo = 4)
      then
      begin

        if (gdSelected in State) and (Field.DataType = ftFloat)
        then
          Grid.Canvas.Font.Color := clWhite // Default behavior for numbers
        else
          Grid.Canvas.Font.Color := clBlack;  // Description always black
        Grid.Canvas.Font.Style   := [fsBold]; // Total row in Bold

        Grid.Canvas.FillRect(Rect);
        // Grid.DefaultDrawColumnCell(R, DataCol, Column, State);

        // Black line above total row
        // Grid.Canvas.Pen.Color:= clBlack; // clpeter_river_500);
        // Grid.Canvas.Pen.Width:= 15;
        // Grid.Canvas.MoveTo(Rect.Left, Rect.Bottom+5);
        // Grid.Canvas.LineTo(Rect.Right, Rect.Bottom+5);
        Grid.TotalRow := True;
      end
      else
      begin // White lines for all other rows
        // Grid.Canvas.Pen.Color:= clWhite;
        // Grid.Canvas.Pen.Width:= 3;
        // Grid.Canvas.MoveTo(Rect.Left, Rect.Top);
        // Grid.Canvas.LineTo(Rect.Right, Rect.Top);
      end;
    end;
  end;

procedure TfrmBudget.LDBGrid3DrawColumnCell(
   Sender    : TObject;
   const Rect: TRect;
   DataCol   : Integer;
   Column    : TColumn;
   State     : TGridDrawState);
  begin
    if Sender is TLDBGrid
    then
    begin
      if Assigned(Column.Field) and ((Column.Title.Caption = 'Categorie') or (Column.Title.Caption = 'Subcategorie'))
      then
      begin
        if ((Sender as TLDBGrid).DataSource.DataSet.FieldByName('Inkomsten').AsInteger = 1)
        then
        begin
          if not (gdSelected in State)
          then
            (Sender as TLDBGrid).Canvas.Brush.Color := clGreen_sea_100
          else
            (Sender as TLDBGrid).Canvas.Brush.Color := clGreen_sea_200;
        end
        else if ((Sender as TLDBGrid).DataSource.DataSet.FieldByName('Vaste kosten').AsInteger = 1)
        then
        begin
          if not (gdSelected in State)
          then
            (Sender as TLDBGrid).Canvas.Brush.Color := clAlizarin_100
          else
            (Sender as TLDBGrid).Canvas.Brush.Color := clAlizarin_200
        end
        else
        begin
          if not (gdSelected in State)
          then
            (Sender as TLDBGrid).Canvas.Brush.Color := clMidnight_blue_100
          else
            (Sender as TLDBGrid).Canvas.Brush.Color := clMidnight_blue_200;
        end;
        if (gdSelected in State)
        then
        begin
          (Sender as TLDBGrid).Canvas.Font.Color := clBlack;
          (Sender as TLDBGrid).Canvas.Font.Style := [fsBold];
        end;
      end;
    end;
  end;

procedure TfrmBudget.LDBGrid3KeyDown(
   Sender : TObject;
   var Key: Word;
   Shift  : TShiftState);
  var
    Bookmark: TBookmark;
  begin
    if (Key = VK_F2)
    then
    begin
      case frmBudgetEdit.ShowModal of
        mrOk:
          begin
            Bookmark := Self.LDBGrid3.DataSource.DataSet.Bookmark;
            if dm.DataSetBudgetEdit.State = dsEdit
            then
              dm.DataSetBudgetEdit.Post;
            Self.LDBGrid3.DataSource.DataSet.Active := False;
            Self.LDBGrid3.DataSource.DataSet.Active := True;
            Self.LDBGrid2.DataSource.DataSet.Active := False;
            Self.LDBGrid2.DataSource.DataSet.Active := True;
            InitGrids;
            Self.LDBGrid3.DataSource.DataSet.Bookmark := Bookmark;
          end;
        mrCancel:
          begin
            dm.DataSetBudgetEdit.Cancel;
          end;
      end;
    end;

  end;

end.