Lo que necesitas es pivotar una tabla, es decir, en base a un campo, hacer girar la tabla para que:
- Lo que son filas se muestren como columnas.
- Lo que son columnas, se muestren como filas.
Yo al menos para Firebird y componentes MDOLIB no encontré el homólogo a Decision Cube que traía el BDE, así que eché manos de un procedimiento almacenado.
En mi caso requería 15 columnas (una quincena), en cada columna devuelvo el idPedido (cero si no ha habido ningún pedido).
El Store procedure siempre tendrá 31 columnas, (el máximo de cualquier mes) numeradas, por ejemplo: dia1 dia2 dia3...dia31, dentro del SP, se busca las fechas en que se ha realizado un pedido, y a cada columna se le asigna el Id del Pedido:
Código:
dia1 dia2 dia3
35 332 0
Si pides el mes de febrero, querrá decir que el 01/02/2007 se ha hecho un pedido cuyo IdPedido = 35, el día 3 no se hizo ningún pedido y por eso tiene el valor cero.
Yo he usado un DBGrid normal con DefaultDraw a false, así puedo pintar a voluntad en cualquier celda, está pensado para pintar 2 líneas dentro de cada celda, pero puedes modificarlo.
El código para pintar cada celda es este:
Código Delphi
[-]
procedure TfrmCaja.frgridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var Text1, Text2 :string;
Formated: Integer;
CampoObra :TField;
procedure WriteText(Grid: TDBGrid; ACanvas: TCanvas; const ARect: TRect;
const Line1, Line2: string; Format: Word);
const
DX = 2;
DY = 2;
var
S: array[0..255] of Char;
begin
with Grid, ACanvas, ARect do
begin
case Format of
DT_LEFT:begin
ExtTextOut(Handle, Left + DX, Top + DY,
ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Line1), Length(Line1), nil);
ExtTextOut(Handle, (Right - TextWidth(Line2)) div 2, Top + 20,
ETO_CLIPPED, @ARect, StrPCopy(S, Line2), Length(Line2), nil);
end;
DT_RIGHT:begin
ExtTextOut(Handle, Right - TextWidth(Line1) - 3,Top + DY,
ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Line1), Length(Line1), nil);
ExtTextOut(Handle, Left + dx, Top + 20,
ETO_CLIPPED, @ARect, StrPCopy(S, Line2), Length(Line2), nil);
end;
DT_CENTER: ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div 2,
Top + DY, ETO_OPAQUE or ETO_CLIPPED, @ARect,
StrPCopy(S, Text), Length(Text), nil);
end;
end;
end;
begin
with frgrid do
begin
if column.FieldName = 'NOMBRE' then
begin
Text1 :=qrysalariosnombre.AsString;
text2 :=qrySalariosCategoria.AsString;
Formated := DT_LEFT;
end
writetext(frgrid , frgrid.Canvas, rect,Text1,text2,Formated);
end;
Para seleccionar varias columnas, tendrás que ingeniartelas, por ejemplo pintando el fondo de color azul (simulando que está seleccionada) y guardando la fecha en un array of TDateTime (por ejemplo)
Son líneas generales, si neceistas algo más avisa.