Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Trabajar con grids (https://www.clubdelphi.com/foros/showthread.php?t=40596)

Vlady 21-02-2007 19:27:11

Trabajar con grids
 
Tengo el siguiente inconveniente tengo una tabla de proveedores no es muy grande alrededor de 40 quisiera trabajar estos en una DBGrid en donde me aparezca el nombre del proveedor y las columnas sean los dias del mes, de tal forma que el usuario del sistema pueda realizar un un pedido al proveedor seleccionando el día en que se realiza el pedido, mi problema radica en que deseo que se puedan realizar varios pedidos en varios dias al mismo provedor, es decir que se puedan seleccionar varias celdas del mismo proveedor en diferentes dias y al realizar el pedido cambie de color el dbgrid o el StringGrid.

No se con cual de los dos trabajar ya que igual los dias del mes no estan en la tabla y se pueden dibujar en tiempo de ejecución, si alguien me puede dar pistas sobre este tema de los dbgrids les agradeceria infinitamente.

Gracias

Tabajo con delphi7 y firebird 2.0

AGAG4 21-02-2007 19:54:28

Quieres pintar todo el grid????

Vlady 23-02-2007 18:46:37

Solo quiero pintar los dias en que hubo pedidos selccionando el proveedor y el día

Lepe 23-02-2007 19:25:15

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.


La franja horaria es GMT +2. Ahora son las 07:52:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi