Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-05-2020
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Problemas con FORMAT y SUM

Estoy intentando hacer algo simple como mostrar en un DBGrid una columna como Currency.
Si bien lo he logrado exitosamente en otras oportunidades, esta vez es un campo calculado y no lo puedo hacer andar.
La consulta es esta:
Código Delphi [-]
      Modulo.Consulta.Active := FALSE;
      Modulo.Consulta.SQL.Clear;
      Modulo.Consulta.SQL.Add('SELECT Month(Fecha)as Mes, SUM(Total) as Total FROM Ventas');
      Modulo.Consulta.SQL.Add('WHERE Year(Fecha) = :pFecha');
      Modulo.Consulta.SQL.Add('GROUP BY Month(Fecha)');
      Modulo.Consulta.Parameters.ParamByName('pFecha').Value := Edit_Anio.Text;
      Modulo.Consulta.Active := TRUE;
He probado las siguientes opciones:


Opción 1:
Código Delphi [-]
Modulo.Consulta.SQL.Add('SELECT Month(Fecha)as Mes, FORMAT(SUM(Total),"Currency") as Total FROM Ventas');
Resultado: El DBGrid no muestra nada en esa columna

Opción 2:
Código Delphi [-]
Modulo.Consulta.SQL.Add('SELECT Month(Fecha)as Mes, CCur(SUM(Total)) as Total FROM Ventas');
Resultado: El DBGrid muestra los resultados igual que en la consulta original

Opción 3: Varios intentos en el evento DrawCell con cosas del siguiente estilo
Código Delphi [-]
DBGrid_Ventas.Fields[1].SetFieldType(ftCurrency);
Resultado: Idem anterior.

Estoy trabajando en Delphi 7, con ADO y base de datos en Access.

¿En que le puedo estar errando?.

Gracias de antemano!
Responder Con Cita
  #2  
Antiguo 01-06-2020
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.738
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
¿Has probado modificando la propiedad DisplayFormat del campo?
Esto evita que tengas que hacer cosas raras en el SQL.

No tengo Delphi a mano en este momento, pero esta es la idea:
Código Delphi [-]
  FieldByName('TOTAL').DisplayFormat := '0.00';
  // o como lo muestras en tu código
  DBGrid_Ventas.Fields[1].DisplayFormat := '0.00';
Responder Con Cita
  #3  
Antiguo 01-06-2020
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Antes que nada, ¡gracias por contestar!


Recuerdo haber probado la propiedad DisplayFormat y estoy casi seguro que lo hice también en el evento DrawCell.
Por las dudas lo voy a probar de nuevo en la tarde, que de tantas cosas que leí y probé tengo un lío importante en la cabeza.
Responder Con Cita
  #4  
Antiguo 01-06-2020
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 20
kuan-yiu Va camino a la fama
Creo que tienes que definir los campos de forma persistente en la query (también sirve en un ClientDataSet) y ahí puedes indicar que es tipo Currency. Lo hice hace tiempo pero no lo encuentro y lo estoy diciendo de memoria por lo que no recuerdo si deberás tocar también DisplayFormat para que se representen como desees.
Si el campo es calculado después de la consulta (cualquier cosa distinta de fkData) es cuando no es posible definirlo como Currency pero en tu caso es una de las columnas de la query por lo que debería funcionar.
Responder Con Cita
  #5  
Antiguo 02-06-2020
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.738
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Este es un ejemplo real que tengo en mi código:
No son campos persistentes, por lo que tengo que explicitamente decirle que tipo de campo es.
Lo que busco es que las fechas no muestren la hora y los valores numéricos se muestren con dos decimales y separador de miles.
Código Delphi [-]
procedure TDMEmpleado.xEmpleadoAfterOpen(DataSet: TDataSet);
begin
  // Formato de campos
  with xEmpleado do
  begin
     TDateField(FieldByName('FECHA_NACIMIENTO')).DisplayFormat := 'dd/mm/yyyy';
     TDateField(FieldByName('FECHA_ANTIGUEDAD')).DisplayFormat := 'dd/mm/yyyy';
     TDateField(FieldByName('FECHA_INICIO_CONTRATO')).DisplayFormat := 'dd/mm/yyyy';
     TDateField(FieldByName('FECHA_FIN_CONTRATO')).DisplayFormat := 'dd/mm/yyyy';
     TDateField(FieldByName('FECHA_VENCIMIENTO_EPI')).DisplayFormat := 'dd/mm/yyyy';
     TDateField(FieldByName('FECHA_VALIDEZ_CURSO')).DisplayFormat := 'dd/mm/yyyy';
     TDateField(FieldByName('FECHA_ENTREGA_MATERIAL_PRESTADO')).DisplayFormat := 'dd/mm/yyyy';
     TDateField(FieldByName('FECHA_REVISION_MEDICA')).DisplayFormat := 'dd/mm/yyyy';

     TNumericField(FieldByName('PORC_JORNADA')).DisplayFormat := ',0.00';
     TNumericField(FieldByName('HORAS_ANUALES')).DisplayFormat := ',0.00';
  end;

  // Tablas unidas mediante DataSource
  xEpi.Open;
  xCurso.Open;
  xMaterialPrestado.Open;
  xDocumento.Open;
  xRevisionMedica.Open;

[...]

Este código lo he puesto en el AfterOpen porque los campos son dinámicos.
En el caso de tener campos estáticos, pongo el código de formato en el OnCreate del DataModule.
He visto que para DataSets grandes es mucho más rápido tener los formatos puestos antes de abrirlos.
Responder Con Cita
  #6  
Antiguo 02-06-2020
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.738
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Este es otro código que encontré.
En este caso no conozco los campos que saldrán, pues el SQL lo proporciona el usuario.
Es parte de una extracción de datos.

Código Delphi [-]
procedure TDMExtraccionDatos.Ejecutar;
var
  i : integer;
begin
  with xResultado do
  begin
     DisableControls;
     try
        Close;
        Open;

        // Agrego DisplayFormat segun el tipo de campo
        for i := 0 to FieldCount - 1 do
        begin
           with Fields[i] do
           begin
              if DataType in [ftSmallint, ftInteger, ftWord] then
                 TIntegerField(Fields[i]).DisplayFormat := '0'
              else
              if DataType in [ftFloat, ftCurrency] then
                 TFloatField(Fields[i]).DisplayFormat := ',0.000'
              else
              if DataType in [ftDateTime, ftDate, ftTime] then
                 TDateTimeField(Fields[i]).DisplayFormat := 'dd/mm/yyyy hh:nn:ss';
           end;
        end;
     finally
        EnableControls;
     end;
  end;
end;
Responder Con Cita
Respuesta



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
Problemas con Format y OldValue gluglu Varios 1 11-07-2008 23:37:13
Problemas con Format() RoyTan Varios 7 10-02-2008 20:15:24
Format %s error FunBit Varios 2 07-12-2005 16:48:48
Problema con format santiago14 Varios 1 18-08-2005 20:29:18
problemas con format y array!!! adfa OOP 2 30-08-2003 03:18:29


La franja horaria es GMT +2. Ahora son las 10:29:14.


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
Copyright 1996-2007 Club Delphi