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 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
Cita:
Empezado por Aleca Ver Mensaje
Casimiro, una pregunta, porque necesitas hacerlo de esta forma?
Quizá es muy simple mi respuesta pero yo diría que para poder distinguir fácilmente los grupos

// Saludos
Responder Con Cita
  #2  
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
Pues sí, para separar los distintos asientos:



Dibujar es fácil, funciona perfecto con todos los ejemplos que han puesto todos los compañeros, el problema viene cuando te mueves por el grid arriba y abajo, llegas al final y al principio, etc.

El ejemplo de Román no he podido probarlo porque desconozco el tema de las variables de usuario en firebird, estoy buscando información al respecto.
Responder Con Cita
  #3  
Antiguo 06-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 24
Aleca Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Quizá es muy simple mi respuesta pero yo diría que para poder distinguir fácilmente los grupos

// Saludos
lo preguntaba por que a lo mejor puede haber otra solución de acuerdo al objetivo que tenga.
Por las dudas...
Saludos
__________________
Aleca
Responder Con Cita
  #4  
Antiguo 06-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 24
Aleca Va por buen camino
a ver, otra pregunta tonta, puede haber muchos registros?
lo pregunto porque creo que hay que anclar el color de la fila con el registro.
__________________
Aleca
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
El procedimiento almacenado para Firebird sería algo como este (probado en una tabla de prueba que tengo):

Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE PINTAR_TABLA 
RETURNS (
    NEW_COLOREAR INTEGER,
    NEW_FECHA DATE,
    NEW_NOMBRE VARCHAR(30),
    NEW_ID INTEGER)
AS
DECLARE VARIABLE VAR_COLOREAR INTEGER;
DECLARE VARIABLE VAR_ID INTEGER;
begin
  /* Procedure Text */
  var_colorear = 0;
  var_id = 0; /* sería el campo asiento */
  for select ID, NOMBRE, FECHA from tabla1 order by ID, FECHA, NOMBRE
  into :new_id, :new_nombre, :new_fecha
  do
    /* calculamos */
    begin
      if (var_id <> :new_id) then var_colorear = 1 - var_colorear;
      new_colorear = var_colorear;
      var_id = :new_id;
      suspend;
    end
end
^

SET TERM ; ^

GRANT SELECT ON TABLA1 TO PROCEDURE PINTAR_TABLA;

GRANT EXECUTE ON PROCEDURE PINTAR_TABLA TO SYSDBA;

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
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
  #7  
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
  #8  
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
  #9  
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
  #10  
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
  #11  
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
  #12  
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
  #13  
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 01:06:18.


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