FastReport i warunkowe kolorowanie komórki DBCrossTab

0

Cześć zrobiłem raport posługując się DBCrossTab. I wszystko działa. Ale muszę dodać nową funkcjonalność w postaci zaznaczania niektórych komórek.

Konkretnie pewne komórki mają mieć czerwony kolor tła.
I teraz tak. Próbowałem robić to w kodzie FastReporta, ale się okazuje, że w tym momencie dane są już zaczytane i nie mogę sprawdzić wartości, która mnie interesuje.

Próbowałem też za pomocą conditional highlight, ale wtedy raport się tworzył, tworzył i końca nie było widać. W końcu się nie zrobił.

Macie jakieś pomysły?

0

OK, wymyśliłem - zostawiam rozwiązanie i moje obserwacje dla potomności.

Problem: Jak warunkowo pokolorować komóki w DBCrossTab biorąc pod uwagę dane z datasetu nie będące wartością tych kolumn.

Czyli np. mamy w datasecie 2 pola. Jedno to: VAL, drugie isRed. Val przypisujemy do komórki w DBCrossTab, natomiast na podstawie isRed ustalamy, czy tło komórki ma być czerwone.

Nie da się tego zrobić w prosty sposób:
(fastScript:)

if <frxDBDataset."isRed"> = 1 then Memo.Color:=clRed;

gdyż w tym momencie dataset jest ustawiony na ostatnim rekordzie i zawsze odczytamy pole z ostatniego rekordu.

Więc teraz trzeba się posiłkować kodem w Delphi.

W metodzie AfterOpen swojego Datasetu tworzymy i wypełniamy tablicę, którą następnie przekazujemy do skryptu FastReporta:

var
  reds: array of byte;
  i: integer;
begin
  setLength(reds, BaseQuery.RecordCount);
  
  i:=low(reds);
  BaseQuery.First;
  while not BaseQuery.Eof do
  begin
    reds[i]:=BaseQuery.FieldByName('isRed').AsInteger;

    i:=i+1;
    BaseQuery.Next;
  end;

  //teraz przekazuję tą tablicę do raportu
  frxReport.Script.Variables['reds']:=reds;
end;

Oczywiście w raporcie NIE MOŻE BYĆ zmiennej o nazwie REDS.

Następnie w kodzie raportu oprogramowujemy to wszystko w zdarzeniu OnProntCell komponentu DBCrossTab

(fastScript:)

procedure DBCross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
var
  i, colCount: integer                                           
begin
    colCount:=DBCross1.ColCount; // -1, jeśli ostatną kolumną jest total

//obliczamy odpowiedni wyraz w tablicy reds na podstawie kolumny i wiersza
    i:=RowIndex * ColCount + columnIndex; 

    if reds[i] = 1 then Memo.Color:=clRed;                
end;  

I to wszystko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1