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.