Ir al contenido


Foto

Consulta SQL y exportar a Excel - detalle en Fechas


  • Por favor identifícate para responder
3 respuestas en este tema

#1 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 13 septiembre 2017 - 07:07

Estimados buenas tardes..

 

Tengo el siguiente código, en donde después de realizar una consulta SQL donde en unos de sus campos muestra fechas, en un formato dd/mm/aaaa, al exportarlo a excel con este código, las fechas (alguna) me aparecen en formato al revés mm/dd/aaaa, sabrían por que es ese detalle?


delphi
  1. procedure TFListaSrv.Excel1Click(Sender: TObject);
  2. var
  3. excel:Variant;
  4. fila,columna:Integer;
  5. Data : TDataSet;
  6. begin
  7. // Realizamos la consulta
  8. with DMod1.ADOQueryCL do
  9. begin
  10. Active:= False;
  11. Close;
  12. SQL.Clear;
  13. SQL.Add(TSQL);
  14. Open;
  15. Active:= True;
  16. // ---------------------------------
  17. ClientDataSet1.Close;
  18. ClientDataSet1.SetProvider(DMod1.DataSetProviderCL);
  19. ClientDataSet1.Open;
  20. // ---------------------------------
  21. End;
  22. // ----------------------------
  23. // ----------------------------
  24. msInfo('Se iniciará el Proceso de Exportación a Excel, Por favor sea paciente mientras finaliza.','Exportación a Excel');
  25. Screen.Cursor:=crHourGlass;
  26. // ----------------------------------------
  27. // Inicia el Proceso de Exportación a Excel
  28. // ----------------------------------------
  29. try
  30. excel:=CreateOleObject('Excel.Application');
  31. except
  32. Screen.Cursor:=crDefault;
  33. msError('Excel no se pudo iniciar, la posible causa sea que el Programa MS Excel no este instalado, favor de Verificar.','Error Interno..');
  34. exit;
  35. end;
  36. excel.Visible:=true;
  37.  
  38. Data:=DMod1.ADOQueryCL; // Componente usado Table/Query
  39. Data.First;
  40. fila:=1;
  41. excel.Workbooks.Add;
  42. //Poner los títulos
  43. for columna := 0 to Data.FieldCount-1 do
  44. begin
  45. excel.Cells[fila,columna + 1].Value:=Data.fields[columna].DisplayName;
  46. end;
  47. fila:=2;
  48.  
  49. //Desenganchar controles para agilizar
  50. Data.DisableControls;
  51. try
  52. Screen.Cursor:=crHourGlass;
  53. while not(Data.eof) do
  54. begin
  55. for columna := 0 to Data.FieldCount-1 do
  56. excel.Cells[fila,columna + 1].Value:=trim(Data.Fields[Columna].asString);
  57. Data.Next;
  58. fila:= fila + 1;
  59. end;
  60. Except
  61. Screen.Cursor:=crDefault;
  62. msError('Atención, se produjo un error en la exportación, Favor de Notificar al Adminisrador.','Error');
  63. DMod1.ADOQueryCtrlONT.Close;
  64. DMod1.ADOConnection1.Close;
  65. DMod1.ADOConnection1.Connected:= False;
  66. Exit;
  67. end;
  68. Screen.Cursor:=crDefault;
  69. msInfo('El Proceso de exportación a Excel a Finalizado.','Listo..');
  70. Data.EnableControls;
  71. end;

La consulta SQL la almaceno en la variable TSQL.

 

Uso Mariadb como motor de almacenamiento y componente ADO para realizar la consulta.

 

la consulta se hace de la siguiente manera ,,


delphi
  1. with DMod1.ADOQueryCL do
  2. begin
  3. Active:= False;
  4. Close;
  5. SQL.Clear;
  6. SQL.Add('SELECT ctrlont.INDEX_ID as ID , ctrlont.FRAME_ID as FRAME, ctrlont.SLOT_ID as SLOT, ctrlont.PORT_ID as PUERTO, ctrlont.ONT_ID as ONT, ctrlont.CONT_CL as CONTRATO, clientes.NOM_CL as NOMBRE, clientes.APPAT_CL as A_PATERNO, ');
  7. SQL.Add('clientes.APMAT_CL as A_MATERNO, ctrlont.ZONA_CL as ZONA, ctrlont.COLOR_CL as COLOR, clientes.COL_CL AS COLONIA, clientes.CALLE_CL as CALLE, ctrlont.poste as POSTE, onts.ESTATUS_ONT as ESTATUS , ');
  8. SQL.Add('CAST(IF(onts.ESTATUS_ONT="ACTIVO",ctrlont.FECHA_ALTA,ctrlont.FECHA_SUSPEN) as Date) as FECHA, ctrlont.PAQT_SRV as PAQT, onts.MAC_ONT as DIR_MAC, onts.MOD_ONT as MODELO, onts.IP_ONT as DIR_IP, ctrlont.VLAN_ID as VLAN, ctrlont.FOLIO ');
  9. SQL.Add('FROM CTRLONT ');
  10. SQL.Add('INNER JOIN clientes ON ctrlont.FOLIO = clientes.FOLIO ');
  11. SQL.Add('INNER JOIN onts ON ctrlont.FOLIO = onts.FOLIO ');
  12. SQL.Add('ORDER BY ctrlont.INDEX_ID ASC ');
  13. Open;
  14. Active:= True;
  15. end;

Mi detalle como ya mencioné es que el campo ctrlont.FECHA_ALTA o ctrlont.FECHA_SUSPEN al exportarla, ALGUNAS me aparecen en otro tipo de presentación de formato.

 

 

 


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 septiembre 2017 - 12:32

¿Qué tipos de datos es el campo de fecha?, de todos modos, formateala en la misma consulta, y desde delphi haces lo siguiente:


delphi
  1. excel.Columns[columna + 1].NumberFormat := AnsiString('dd/mm/yyyy');

Otra opción es que debes validar el tipo de datos, si es string mandalo como string, si es fecha como datetime y así...algo como:


delphi
  1. case Data.Fields[Columna].DataType of
  2. ftDateTime,
  3. ftDate: excel.Cells[fila,columna + 1].value := Data.Fields[Columna].asDateTime;
  4. ftString: excel.Cells[fila,columna + 1].value := Trim(Data.Fields[Columna].asString);
  5. ftInteger: excel.Cells[fila,columna + 1].value := Data.Fields[Columna].asInteger;
  6. //Y así....
  7. end;

Me decanto por ésta última.

 

Saludos.


  • 0

#3 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 14 septiembre 2017 - 05:02

¿Qué tipos de datos es el campo de fecha?, de todos modos, formateala en la misma consulta, y desde delphi haces lo siguiente:


delphi
  1. excel.Columns[columna + 1].NumberFormat := AnsiString('dd/mm/yyyy');

Otra opción es que debes validar el tipo de datos, si es string mandalo como string, si es fecha como datetime y así...algo como:


delphi
  1. case Data.Fields[Columna].DataType of
  2. ftDateTime,
  3. ftDate: excel.Cells[fila,columna + 1].value := Data.Fields[Columna].asDateTime;
  4. ftString: excel.Cells[fila,columna + 1].value := Trim(Data.Fields[Columna].asString);
  5. ftInteger: excel.Cells[fila,columna + 1].value := Data.Fields[Columna].asInteger;
  6. //Y así....
  7. end;

Me decanto por ésta última.

 

Saludos.

 

El campo es tipo Date, me dio una duda mas bien una curiosidad, desde la conulta SQL que se hace desde delphi, se puede dar el formato? .. cómo sería para darle desde alli ese formato. ya que en la BD esta de la clásica forma aaaa/mm/dd.


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 septiembre 2017 - 05:22

DATE_FORMAT, prefiero la segunda forma que te propongo validando el tipo de datos


  • 0




IP.Board spam blocked by CleanTalk.