Возможно средствами программы: добавляйте колонки, строки и данные в таблицу в с помощью скриптов.
Пример, который использует два запроса для формирования кросс-таблицы:
procedure UpdateStatistic(Grid: TdbStringGridEx);
var
WorkmanData: TDataSet;
WorkmanData2: TDataSet;
col, row : integer;
s: string;
ShiftCount: integer;
ShiftProc: integer;
MaxSP: integer;
begin
SQLQuery('select workman.id, workman.code, ( select count(id) from shiftbook where shiftbook.id_workman = workman.id ) as shift from workman order by code',WorkmanData);
SQLQuery('select * from workman order by code',WorkmanData2);
MaxSP := SQLExecute('select IntersectionRate from config');
// ShowMessage( INTTOSTR(MaxSP) );
Grid.Columns.Clear;
try
Grid.Columns.Add(TNxTextColumn);
except
end;
Grid.Columns[0].Width := 40;
Grid.FixedCols := 1;
Grid.Columns[0].Color := clbtnFace;
while not WorkmanData.Eof do
begin
try
Grid.Columns.Add(TNxTextColumn);
except
end;
Grid.Columns[Grid.Columns.count-1].Header.Caption := WorkmanData.FieldByName('code').asString;
Grid.Columns[Grid.Columns.count-1].Color := clWhite;
Grid.Columns[Grid.Columns.count-1].Width := 40;
Grid.AddRow;
Grid.Cells[0, Grid.RowCount-1] := WorkmanData.FieldByName('code').asString;
//
WorkManData.next;
end;
row := 0;
WorkmanData.First;
while not WorkmanData.Eof do
begin
col := 1;
WorkmanData2.First;
while not WorkmanData2.Eof do
begin
if WorkmanData.FieldByName('id').asString = WorkmanData2.FieldByName('id').asString then
Grid.Cells[col, row] := '-'
else
begin
// совместные выходы
s := ' select count(*) from shiftbook left join shiftbook as sb2 on sb2.id_shift = shiftbook.id_shift'+
' where shiftbook.id_workman = '+WorkmanData.FieldByName('id').asString+' and sb2.id_workman = '+WorkmanData2.FieldByName('id').asString;
ShiftCount := SQLExecute(s);
if WorkManData.FieldByName('shift').asInteger = 0 then
ShiftProc := 0
else
ShiftProc := trunc( ShiftCount / WorkManData.FieldByName('shift').asInteger * 100 );
//
Grid.Cells[col, row] := inttostr(ShiftProc)+'%';
if ShiftProc > MaxSP then
Grid.Cell[col, row].color := RGB(255,200,200);
end;
col := col + 1;
WorkManData2.next;
end;
//
row := row + 1;
WorkManData.next;
end;
end;
P.S. С помощью запроса тоже можно, но сам запрос придётся генерировать с помощью скриптов, а результат не всегда будет гарантирован.
Визуальное программирование:
блог и
телеграм-канал.