unit ftraza_materiales;

interface

uses
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client, uFireDacHelper,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB,  
  Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls, frxClass,frxDBSet,Excel2000,  ComObj,
  Vcl.DBCtrls, frxExportCSV, frxExportPDF;

type
  Ttraza_materiales = class(TForm)
    Panel4: TPanel;
    btexcel: TButton;
    SaveDialog1: TSaveDialog;
    dsqpesadas2: TDataSource;
    qpesadas2: TFDQuery;
    qpesadas2proveedor: TWideStringField;
    qpesadas2documento: TWideStringField;
    qpesadas2codigo: TWideStringField;
    qpesadas2lote: TWideStringField;
    qpesadas2id: TIntegerField;
    qpesadas2idea: TIntegerField;
    qpesadas2fecha: TDateField;
    qpesadas2iddestino: TWideStringField;
    qpesadas2origen: TWideStringField;
    qpesadas2idorigen: TIntegerField;
    qpesadas2parcela: TWideStringField;
    qpesadas2lotes_detalle: TWideStringField;
    qpesadas2idalbaran: TWideStringField;
    qpesadas2nombre: TWideStringField;
    qpesadas2pedidocliente: TWideStringField;
    qpesadas2destino: TWideStringField;
    qpesadas2factura: TWideStringField;
    Panel2: TPanel;
    DBGrid2: TDBGrid;
    qpesadas: TFDQuery;
    qpesadasproveedor: TWideStringField;
    qpesadasdocumento: TWideStringField;
    qpesadascodigo: TWideStringField;
    qpesadaslote: TWideStringField;
    qpesadasid: TIntegerField;
    qpesadasidea: TIntegerField;
    qpesadasfecha: TDateField;
    qpesadasiddestino: TWideStringField;
    qpesadasorigen: TWideStringField;
    qpesadasidorigen: TIntegerField;
    qpesadasparcela: TWideStringField;
    qpesadaslotes_detalle: TWideStringField;
    qpesadasidalbaran: TWideStringField;
    qpesadasfactura: TWideStringField;
    qpesadasnombre: TWideStringField;
    qpesadaspedidocliente: TWideStringField;
    qpesadasdestino: TWideStringField;
    procedure btexcelClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  traza_materiales: Ttraza_materiales;

implementation

{$R *.dfm}
procedure Ttraza_materiales.ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar);
const
  xlWBATworksheet = -4167;
var
  Excel, WorkBook, WorkSheet: OleVariant;
  I, J: Integer;
  PBookmark: TBookmark;
begin
  // Guardar la posicin en la DB y desactivar que se mueva el registro
  PBookmark := DBGrid.DataSource.DataSet.GetBookmark;
  DBGrid.DataSource.DataSet.DisableControls;
  DBGrid.DataSource.DataSet.First;

  // Comprobar si existe el component TProgressBar

  // Crear instancia de la aplicacin Excel
  Excel := CreateOleObject('Excel.Application');

  // Evitar que nos pregunte si deseamos sobreescribir el archivo
  Excel.DisplayAlerts := False;

  // Agregar libro de trabajo
  WorkBook := Excel.Workbooks.Add(xlWBATWorksheet);

  // Tomar una referencia a la hoja creada
  WorkSheet := WorkBook.WorkSheets[1];

  // Se  describe el nombre de la hoja
  WorkSheet.Name := SheetName;

  // Llenamos las celdas
  //    Toma en cuenta que las columnas y filas empiezan en 1, y que en el
  // WorkSheet.Cells[I, J], I es la fila y J es la columna.

  //   Extrae los nombres de los campos del DBGrid y los coloca en el primer registro,
  // excluyendo los campos que estn ocultos
  for J := 0 to DBGrid.FieldCount -1 do
    if DBGrid.Fields[J].Visible then
    begin
      // Poner la fuente de letra en Negrita
      WorkSheet.Cells[1, J +1].Font.Bold := True;
      // Centrar la celda
//      WorkSheet.Cells[1, J +1].HorizontalAlignment := xlCenter;
      // Asignamos Valor del titulo del DBrid
      WorkSheet.Cells[1, J +1] := DBGrid.Columns[J].Title.Caption;
    end;

  // Guardar los registros
  for I := 0 to DBGrid.DataSource.DataSet.RecordCount -1 do
  begin
    // Identificamos los campos y lo grabamos segn su tipo
    for J := 0 to DBGrid.FieldCount -1 do
      case DBGrid.Fields[J].DataType of
        ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numrico
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsInteger;
        ftBCD, ftFloat, ftCurrency: // Numrico con decimales
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsFloat;
        ftDateTime, ftDate, ftTime: // Fecha y Hora
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsDateTime;
        else // Todo lo demas caracteres
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsString;
      end;

    // Saltamos de registro
    DBGrid.DataSource.DataSet.Next;

    // Comprobar si existe el component TProgressBar
    if (ProgressBarXls <> nil) then
      ProgressBarXls.Position := ProgressBarXls.Position +1;
  end;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarXls.Visible := False;

  // Redimensionar todas las celdas para que esten segn su tamao
  WorkSheet.Cells.Columns.AutoFit;

  // Guardar el archivo
  WorkBook.SaveAs(FileNameXLS);

  // Cierra el archivo
  WorkBook.Close(FileNameXLS);

  // Salir de Excel
  Excel.Quit;

  // posicionar el registro donde estaba
  DBGrid.DataSource.DataSet.GotoBookmark(PBookmark);
  DBGrid.DataSource.DataSet.FreeBookmark(PBookmark);
  DBGrid.DataSource.DataSet.EnableControls;
end;

procedure Ttraza_materiales.FormShow(Sender: TObject);
begin
//    qpesadas2.open;
end;

procedure Ttraza_materiales.btexcelClick(Sender: TObject);
var  archivo:string;
begin
    savedialog1.FileName:='TRAZABILIDAD MATERIALES.xls';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;

    try
    Exportaraexcel(archivo,'PESADAS',DBGRID2);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;

end;

end.
