Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-01-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
Delphius Va camino a la fama
Basicamente la idea es que el campo "Colorear" alterne entre 1 y 0. Se va recorriendo la consulta ordenada por fecha y asiento almacenando los valores en una variable. Si resulta ser que el valor del asiento del actual registro es distinto al de la variable se altera el valor del campo colorear por su "negado". En otro caso queda el valor anterior.

Luego, cuando se va pintando el DBGrid, se evalúa el valor del campo Colorear y si 1 o 0 se establece un color o otro y se pinta.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #2  
Antiguo 06-01-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
Delphius Va camino a la fama
Ha... y como PLUS , la técnica que me inspiró roman da incluso para trabajar con más de dos colores.

Siendo N la cantidad de colores, podemos alternar cíclicamente los colores haciendo algo como:

Código Delphi [-]
ColorElegido = Color mod N;

Siendo Color una variable que se incrementa cuando se cumple la condición:
Código Delphi [-]
(Asiento <> var_Asiento)

Espero que se entienda la idea

De ese modo tendremos que el valor del hipotético campo "Colorear" irá alternando desde 0 a N-1 cada vez que detecte un nuevo asiento.

EDITO:
Esto se ha convertido en un monólogo

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 06-01-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.671
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Buenísima la idea, lo he probado y funciona perfectamente .... ... ... peeerooooo... ... ... no me sirve
No puedo usar un procedimiento almacenado porque en pantalla el usuario selecciona una serie de opciones de filtro y el select sql se crea dinámicamente
No se me ocurre cómo pasar ese select a un procedimiento, salvo crear el procedure dinámicamente, lanzarlo y borrarlo después. Hacer un "create or alter procedure"... ... ... puede ser

Código Delphi [-]
procedure TFapuntes.CargarDiario(iParametro: integer);
var
  cSql : string;
begin
{ TODO 3 -oampc -cControlar : Hace falta controlar los tipos de usuarios, por si tiene permisos para verlos o no. }
  DMapuntes.QRdiario.Close;
  cSql := 'select * from tbapuntes where codigoempresa= :codigoempresa and ejercicio= :ejercicio ';
  case iParametro of
    0,1,2,3,4: cSql := cSql + ' and codigoestadoapunte=2 ';  // 1.definitivo  2.borrador
    5: cSql := cSql + ' and codigoestadoapunte=1 ';  // 1.definitivo  2.borrador
  end;
  case iParametro of
    0,2,3: cSql := cSql+' and fechaasiento  between :fechadesde and :fechahasta ';
    1: cSql := cSql+' and fechacreacion= :fechacreacion and horacreacion>= :horacreacion ';
  end;
  case iParametro of
    4: cSql := cSql + ' and (codigousuariocreacion='+IntToStr(fmain._iCodigoUsuario_)+
                       ' or codigousuariomodificacion='+IntToStr(fmain._iCodigoUsuario_)+')';
  end;
  cSql := cSql + ' order by codigoempresa, ejercicio, numeroasiento, lineaasiento';
  //
  DMapuntes.QRdiario.SelectSQL.Text := cSql;
  //
  DMapuntes.QRdiario.Params[0].AsInteger := Fmain._iCodigoEmpresa_;
  DMapuntes.QRdiario.Params[1].AsInteger := Fmain._iCodigoEjercicio_;
  //
  case iParametro of
    0:begin  // cd_config
        DMapuntes.QRdiario.Params[2].AsDate := edDfecD.Date;
        DMapuntes.QRdiario.Params[3].AsDate := edDfecH.Date;
      end;
    1:begin  // cd_sesion
        DMapuntes.QRdiario.Params[2].AsDate := Trunc(fmain._dFechaInicioSesion_);
        DMapuntes.QRdiario.Params[3].AsTime := Frac (fmain._dFechaInicioSesion_);
      end;
    2:begin  // cd_hoy
        DMapuntes.QRdiario.Params[2].AsDate := getFechaServidor;
        DMapuntes.QRdiario.Params[3].AsDate := getFechaServidor;
      end;
    3:begin  // cd_ftrabajo
        DMapuntes.QRdiario.Params[2].AsDate := fmain._dFechaTrabajo_;
        DMapuntes.QRdiario.Params[3].AsDate := fmain._dFechaTrabajo_;
      end;
  end;
  //
  DMapuntes.QRdiario.Open;
  //
  grDiario.SetFocus;
end;
Responder Con Cita
  #4  
Antiguo 06-01-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Dicho a bote pronto, ¿no puedes hacer un procedimiento almacenado al que le pases como parámetros los filtros que escoge el usuario?

// Saludos
Responder Con Cita
  #5  
Antiguo 06-01-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
Delphius Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
Dicho a bote pronto, ¿no puedes hacer un procedimiento almacenado al que le pases como parámetros los filtros que escoge el usuario?

// Saludos
Pues yo creería que si. No veo porqué no trasladar los parámetros y filtros de entrada al SP y después hacer simplemente algo como

Código SQL [-]
select * from MiProcedimientoAlmacenado(Param1, Param2 ....)

Para tener el conjunto de datos.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 06-01-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.671
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Sí, en teoría, sí. El caso es que tengo ya la cabeza como un bombo dándole vueltas a esto desde hace varios días, voy a comer algo y desenchufo un rato, a ver si después lo veo más claro.
Gracias!!!!!!
Responder Con Cita
  #7  
Antiguo 06-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
Pues yo creería que si. No veo porqué no trasladar los parámetros y filtros de entrada al SP y después hacer simplemente algo como

Código SQL [-]
select * from MiProcedimientoAlmacenado(Param1, Param2 ....)

Para tener el conjunto de datos.

Saludos,
De hecho en Firebird un procedimiento almacenado puede ser usado como un select cualquiera, eligiendo los campos y las condiciones que deben complirse para devolver cierto grupo de registros. Incluso se le puede establecer un orden. El único inconveniente es que es un poco más lento que cualquier otro select hecho directamente sobre una tabla.

Código SQL [-]
select from campo1, campo2, campo3 from procedimiento_almacenado where campo1=condificion_usuario order by campo_n

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #8  
Antiguo 06-01-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Huelo que estamos llegando a tocarlo con la punta de los dedos...

Casi lo tenemos ...
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #9  
Antiguo 07-01-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo lo he logrado con el código que puse anteriormente. (Modificado un poco)




Resumiendo:
Poner AutoCalcFields = False;
Creando un campo calculado
Creando el evento OnCalcFields

Código Delphi [-]
{En el DataModule}
{Campo calculado SOMBRA integer}
{Propiedad AutoCalcFields=False}
{Variable global al DataModule (private de DMMayor) Sobra boolean}
{Variable global al DataModule (private de DMMayor) ValorAnterior string}

procedure TDMMayor.xMayorBeforeOpen(DataSet: TDataSet);
begin
   Sombra := False;
   ValorAnterior := '';
end;

procedure TDMMayor.xMayorCalcFields(DataSet: TDataSet);
begin
   {El campo calculado se inicializa a 0. Solo recalculo si es este valor}
   {ValorAnterior siempre guarda el valor del ultimo registro}

   {Si todavía no he establecido el valor del campo calculado}
   if (DataSet.FieldByName('SOMBRA').AsInteger = 0) then
   begin
      {Si el valor cambia, alterno el valor de Sombra}
      if (ValorAnterior <> DataSet.FieldByName('ASIENTO').AsString) then
      begin
         Sombra := not Sombra;
         ValorAnterior := DataSet.FieldByName('ASIENTO').AsString;
      end;
      
      if (Sombra) then
         DataSet.FieldByName('SOMBRA').AsInteger := 1
      else
         DataSet.FieldByName('SOMBRA').AsInteger := 2;
   end;
end;

{En el Formulario}

procedure TFCMayor.DBGConsultaDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: integer; Column: TColumn; State: TGridDrawState);
begin
  with TDBGrid(Sender) do
  begin
     if (gdFocused in State) then //Si tiene el foco
     begin
        Canvas.Font.Color := clWhite;
        Canvas.Brush.Color := clHighlight;
     end
     else
     begin
        {Sombra puede ser 1 o 2. Si está a 0 no esta establecido}
        if (DataSource.DataSet.FieldByName('SOMBRA').AsInteger = 2) then
        begin
           Canvas.Font.Color := clBlack;
           Canvas.Brush.Color := clYellow;
        end
        else
        begin
           Canvas.Font.Color := clBlack;
           Canvas.Brush.Color := clInfoBk;
        end;
     end;
     DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;

Última edición por duilioisola fecha: 07-01-2011 a las 11:02:30.
Responder Con Cita
  #10  
Antiguo 07-01-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Ahora estoy pensando en agregar una variable más:
CampoOrden para saber por qué campo está ordenado el DataSet y así poder compararlo con la variable ValorAnterior.

Código Delphi [-]
{Global al DataModule CampoOrden string}

procedure TDMMayor.xMayorCalcFields(DataSet: TDataSet);
begin
   {El campo calculado se inicializa a 0. Solo recalculo si es este valor}
   {ValorAnterior siempre guarda el valor del ultimo registro}

   {Si todavía no he establecido el valor del campo calculado}
   if (DataSet.FieldByName('SOMBRA').AsInteger = 0) then
   begin
      {Si el valor cambia, alterno el valor de Sombra}
      if (ValorAnterior <> DataSet.FieldByName(CampoOrden).AsString) then
      begin
         Sombra := not Sombra;
         ValorAnterior := DataSet.FieldByName(CampoOrden).AsString;
      end;
      
      if (Sombra) then
         DataSet.FieldByName('SOMBRA').AsInteger := 1
      else
         DataSet.FieldByName('SOMBRA').AsInteger := 2;
   end;
end;

procedure Ordenar(Orden : string);
begin
   CampoOrden := Orden;
   {Cambiar ORDER BY de SelectSQL}
   xMayor.SelectSQL.Text := SLQBase; {select * from ... where ...}
   xMayor.SelectSQL.Text := xMayor.SelectSQL.Text + ' ORDER BY ' + CampoOrden;
end;
Responder Con Cita
  #11  
Antiguo 07-01-2011
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 947
Poder: 25
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Revisando todos los post se me ocurrio hacer lo siguiente...

Me recorde que cuando en la grilla uno realiza seleccion de registros internamente se utiliza un TList para almacenar los bookmark de los registros seleccionados, debido a eso pense en utilizar un TStrings para almacenar la informacion que se requiere por cada registro.

Este es el resultado, tome el codigo del amigo duilioisola y le hice algunos cambios...

Código Delphi [-]
 public
    { Public declarations }
    Sombra:Boolean;
    List:TStrings;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
   index:Integer;
begin
      with TDBGrid(Sender) do
      begin
         if (gdFocused in State) then //Si tiene el foco
         begin
            Canvas.Font.Color := clWhite;
            Canvas.Brush.Color := clHighlight;
         end
         else
         begin
//Busco el Asiento en el List            
Index:=List.IndexOf(DataSource.DataSet.FieldByName('ASIENTO').AsString);
//Obtengo el valor boolean para realizar la pregunta...
            if Boolean(List.Objects[index]) then
            begin
               Canvas.Font.Color := clBlack;
               Canvas.Brush.Color := clYellow;
            end
            else
            begin
               Canvas.Font.Color := clBlack;
               Canvas.Brush.Color := clInfoBk;
            end;
         end;
         DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     List:=TStringList.Create; //Creo el list que almacenara los datos de cada rfegistro...
     
     Table1.Active:=True;
end;

procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
   Sombra := True;
end;

procedure TForm1.Table1CalcFields(DataSet: TDataSet);
var
   Index:Integer;
begin
      //Verifico si el Asiento ya esta en la List...
     Index:=List.IndexOf(DataSet.FieldByName('ASIENTO').AsString);
     if Index=-1 then
     begin
          //AL no encontrase en List lo agrego con el valor booleano de sombra...
          List.AddObject(DataSet.FieldByName('ASIENTO').AsString, Pointer(Sombra) );
          Sombra := not Sombra;
     end;
end;

Por supuesto faltan las validaciones...
Saludos cordiales

Última edición por cloayza fecha: 07-01-2011 a las 21:04:04.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Alternar dos colores en las lineas de un DBGrid. jealousy OOP 4 07-05-2014 15:45:23
colores en un dbgrid frf_84 Gráficos 2 07-12-2004 12:14:57
dbgrid con colores Giniromero Conexión con bases de datos 7 08-07-2004 16:26:29
dbgrid en colores sebas Conexión con bases de datos 2 09-07-2003 09:16:14
Colores en una DBGrid REDCOM Varios 2 26-05-2003 20:42:58


La franja horaria es GMT +2. Ahora son las 03:40:07.


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