Ver Mensaje Individual
  #4  
Antiguo 23-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita