unit fimpresionarticuloscomponentes;

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;

type
  Tinfarticulos = class(TForm)
    Panel1: TPanel;
    todosarticulos: TCheckBox;
    DBGrid1: TDBGrid;
    qarticulos: TFDQuery;
    dsqarticulos: TDataSource;
    DBGrid2: TDBGrid;
    qarticulosidempresa: TIntegerField;
    qarticulosid: TIntegerField;
    qarticuloscodigo: TWideStringField;
    qarticulosdescripcion: TWideStringField;
    qarticulosfamilia: TIntegerField;
    qarticulosprovhab: TIntegerField;
    qarticulostipoiva: TIntegerField;
    qarticulospreciocoste: TFloatField;
    qarticulosmargen: TFloatField;
    qarticulosbeneficio: TFloatField;
    qarticulospvp: TFloatField;
    qarticulosstock: TFloatField;
    qarticulosult_preciocompra: TFloatField;
    qarticulosfacturable: TIntegerField;
    qarticulosobservaciones: TWideStringField;
    qarticulosimagen: TBlobField;
    qarticulosactivo: TIntegerField;
    qarticulosvalor_almacen: TFloatField;
    qarticulosstock_minimo: TFloatField;
    qarticulosavisar_stock: TIntegerField;
    qarticuloscontrolar_traza: TIntegerField;
    qarticulospeso: TFloatField;
    qarticulosnomfamilia: TWideStringField;
    qarticulosnomproveedor: TWideStringField;
    btimprimir: TButton;
    btexcel: TButton;
    informes: TfrxReport;
    informedb: TfrxDBDataset;
    SaveDialog1: TSaveDialog;
    procedure todosarticulosClick(Sender: TObject);
    procedure btimprimirClick(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure FormShow(Sender: TObject);
    procedure btexcelClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  infarticulos: Tinfarticulos;

implementation

{$R *.dfm}
procedure Tinfarticulos.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 Tinfarticulos.btexcelClick(Sender: TObject);
var  archivo:string;
begin
    savedialog1.FileName:='ARTICULOS-COMPONENTES.xls';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;

    try
    Exportaraexcel(archivo,'ARTICULOS-COMPONENTES',DBGRID1);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;
end;

procedure Tinfarticulos.btimprimirClick(Sender: TObject);
begin
    informedb.Datasource:=dsqarticulos;
    informes.Report.Clear;
    informes.LoadFromFile('c:\agrigest\informes\listado-articulos.fr3');
//    if rentradas.Checked then     informes.Variables.Variables['TITULO']:=QUOTEDSTR('Listado de entradas desde el '+datetostr(fdesde.Date)+' hasta el '+datetostr(fhasta.Date) );
//    if rsalidas.Checked then     informes.Variables.Variables['TITULO']:=QUOTEDSTR('Listado de salidas desde el '+datetostr(fdesde.Date)+' hasta el '+datetostr(fhasta.Date) );
    informes.ShowReport();
    informes.Clear
end;

procedure Tinfarticulos.DBGrid1TitleClick(Column: TColumn);
var
  st:TFDQuerySortType;
begin
  st:=qarticulos.SortType;
  qarticulos.SortedFields:=Column.FieldName;
  If st = stAscending then qarticulos.SortType:=stDescending else qarticulos.SortType:=stAscending;
  dsqarticulos.DataSet.First;
end;

procedure Tinfarticulos.FormShow(Sender: TObject);
begin
    qarticulos.Open;
end;

procedure Tinfarticulos.todosarticulosClick(Sender: TObject);
begin
    if todosarticulos.Checked then
    begin
      qarticulos.Close;
      qarticulos.SQL.Clear;
      qarticulos.SQL.Add('select a.*,f.descripcion as nomfamilia,p.nombre_corto as nomproveedor from articulosf a,familias f,proveedores p where a.idempresa=f.idempresa and a.idempresa=p.idempresa and a.familia=f.id and a.provhab=p.id order by a.descripcion');
      qarticulos.Open;
    end else
    begin
      qarticulos.Close;
      qarticulos.SQL.Clear;
      qarticulos.SQL.Add('select a.*,f.descripcion as nomfamilia,p.nombre_corto as nomproveedor from articulosf a,familias f,proveedores p where a.activo=1 and a.idempresa=f.idempresa and a.idempresa=p.idempresa and a.familia=f.id and a.provhab=p.id order by a.descripcion');
      qarticulos.Open;
    end;
end;

end.
