unit fconsumosfito;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.DBCtrls, Data.DB,
  ZAbstractDataset, ZDataset, ZAbstractRODataset, Vcl.Grids, Vcl.DBGrids,
  Vcl.ComCtrls, comobj,excel2000,Vcl.ExtCtrls;

type
  Tconsumosfito = class(TForm)
    Panel1: TPanel;
    finicio: TDateTimePicker;
    ffin: TDateTimePicker;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Panel2: TPanel;
    Panel3: TPanel;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    qconsumostratamientos: TZQuery;
    qultimoinventario: TZReadOnlyQuery;
    qultimoinventarioide: TIntegerField;
    qultimoinventariofecha: TDateField;
    qultimoinventarioregularizado: TIntegerField;
    dsqultimoinventario: TDataSource;
    Panel4: TPanel;
    Button2: TButton;
    Button1: TButton;
    Button3: TButton;
    Button4: TButton;
    dsqconsumostratamientos: TDataSource;
    GroupBox1: TGroupBox;
    checkinventario: TRadioButton;
    checkhistorico: TRadioButton;
    qconsumos: TZReadOnlyQuery;
    qconsumosidaf: TIntegerField;
    qconsumoside: TIntegerField;
    qconsumosdescripcion: TWideStringField;
    qconsumosregistro: TWideStringField;
    qconsumosfamilia: TWideStringField;
    qconsumosconsumo: TFloatField;
    qconsumoscompras: TFloatField;
    qconsumosPM_stock: TFloatField;
    qconsumosunidad_medida: TWideStringField;
    Panel5: TPanel;
    Panel6: TPanel;
    qstockinventario: TZReadOnlyQuery;
    qstockhistorico: TZReadOnlyQuery;
    comboinventarios: TDBLookupComboBox;
    qidconsumo: TZReadOnlyQuery;
    qidconsumoid: TLargeintField;
    dsqstockinventario: TDataSource;
    qstockhistoricostock_final: TFloatField;
    qstockinventariostock_final: TFloatField;
    qconsumostratamientosid: TIntegerField;
    qconsumostratamientoside: TIntegerField;
    qconsumostratamientosidaf: TIntegerField;
    qconsumostratamientosdescripcion_af: TWideStringField;
    qconsumostratamientosregistro: TWideStringField;
    qconsumostratamientosstock_anterior: TFloatField;
    qconsumostratamientosconsumo_periodo: TFloatField;
    qconsumostratamientoscompras_periodo: TFloatField;
    qconsumostratamientosregularizacion: TFloatField;
    qconsumostratamientosstock_final: TFloatField;
    qconsumostratamientosunidades: TWideStringField;
    qconsumostratamientosprecio_medio: TFloatField;
    qconsumostratamientosvalor_stock: TFloatField;
    qconsumostratamientosfecha_inicio: TDateField;
    qconsumostratamientosfecha_fin: TDateField;
    qhistoricoconsumos: TZReadOnlyQuery;
    dsqhistoricoconsumos: TDataSource;
    combohistoricos: TDBLookupComboBox;
    dsqhistoricoconsumos2: TDataSource;
    qhistoricoconsumos2: TZReadOnlyQuery;
    qhistoricoconsumosfecha_inicio: TDateField;
    qhistoricoconsumosfecha_fin: TDateField;
    qhistoricoconsumosid: TIntegerField;
    qhistoricoconsumoside: TIntegerField;
    qhistoricoconsumos2fecha_inicio: TDateField;
    qhistoricoconsumos2fecha_fin: TDateField;
    qhistoricoconsumos2id: TIntegerField;
    qhistoricoconsumos2ide: TIntegerField;
    qborrar: TZReadOnlyQuery;
    qconsumoscodigo: TWideStringField;
    qconsumostratamientoscodigo: TWideStringField;
    qconsumostratamientosfamilia: TWideStringField;
    SaveDialog1: TSaveDialog;
    procedure Button4Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure dsqhistoricoconsumosDataChange(Sender: TObject; Field: TField);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);
  end;

var
  consumosfito: Tconsumosfito;

implementation

{$R *.dfm}
procedure tconsumosfito.ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar);

  procedure ProgressBarInit;
  begin
    ProgressBarXls.Max := DBGrid.DataSource.DataSet.RecordCount;
    ProgressBarXls.Position := 0;
    ProgressBarXls.Visible := True;
  end;

const
  xlWBATworksheet = -4167;
var
  Excel, WorkBook, WorkSheet: OleVariant;
  I, J: Integer;
  PBookmark: TBookmark;
begin
  // Guardar la posición 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
  if (ProgressBarXls <> nil) then
    ProgressBarInit;

  // Crear instancia de la aplicación 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 están 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 según su tipo
    for J := 0 to DBGrid.FieldCount -1 do
      case DBGrid.Fields[J].DataType of
        ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsInteger;
        ftBCD, ftFloat, ftCurrency: // Numérico 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 según su tamaño
  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 Tconsumosfito.Button1Click(Sender: TObject);
var  archivo:string;
begin
  SaveDialog1.FileName := 'ESTADO DE STOCKS.xlsx';
  SaveDialog1.Execute();
  archivo := SaveDialog1.FileName;
    if dbgrid2.Visible then
    begin
        try
        Exportaraexcel(archivo,'ESTADO DE STOCKS',dbgrid2);
        finally
          showmessage('Los datos han sido exportados correctamente');
        end;
    end;

end;

procedure Tconsumosfito.Button3Click(Sender: TObject);
begin
  qborrar.Prepare;
  qborrar.ParamByName('ID').AsInteger:=qhistoricoconsumosid.asinteger;
  qborrar.ExecSQL;
  qhistoricoconsumos.Refresh;
  qhistoricoconsumos2.Refresh;
end;

procedure Tconsumosfito.Button4Click(Sender: TObject);
var vstock:real;
begin
    qidconsumo.Close;
    qidconsumo.Open;
    qstockhistorico.Close;
    qstockhistorico.Prepare;
    qstockhistorico.ParamByName('IDANTERIOR').AsInteger:=0;
    qstockhistorico.ParamByName('IDAF').AsInteger:=0;
    qstockhistorico.open;
    qstockinventario.Close;
    qstockinventario.Prepare;
    qstockinventario.ParamByName('FECHA').AsDATE:=DATE();
    qstockinventario.ParamByName('IDAF').AsInteger:=0;
    qstockinventario.open;

    qconsumos.Close;
    qconsumos.Prepare;
    qconsumos.ParamByName('FINICIO').AsDate:=finicio.Date;
    qconsumos.ParamByName('FFIN').AsDate:=ffin.Date;
    qconsumos.Open;
    while not qconsumos.Eof do
    begin
      if checkhistorico.Checked then
      begin
        qstockhistorico.Prepare;
        qstockhistorico.ParamByName('IDANTERIOR').AsInteger:=qhistoricoconsumos2id.AsInteger;
        qstockhistorico.ParamByName('IDAF').AsInteger:=qconsumosidaf.AsInteger;
        qstockhistorico.refresh;
        vstock:=qstockhistoricostock_final.asfloat;
        if qstockhistorico.RecordCount=0 then
        begin
          qstockinventario.Prepare;
          qstockinventario.ParamByName('FECHA').Asdate:=qultimoinventariofecha.AsDateTime;
          qstockinventario.ParamByName('IDAF').AsInteger:=qconsumosidaf.AsInteger;
          qstockinventario.refresh;
          vstock:=qstockinventariostock_final.asfloat;
        end;
      end;
      if checkinventario.Checked then
      begin
        qstockinventario.Prepare;
        qstockinventario.ParamByName('FECHA').Asdate:=qultimoinventariofecha.AsDateTime;
        qstockinventario.ParamByName('IDAF').AsInteger:=qconsumosidaf.AsInteger;
        qstockinventario.refresh;
        vstock:=qstockinventariostock_final.asfloat;
        if qstockinventario.RecordCount=0 then
        begin
          qstockhistorico.Prepare;
          qstockhistorico.ParamByName('IDANTERIOR').AsInteger:=qhistoricoconsumos2id.AsInteger;
          qstockhistorico.ParamByName('IDAF').AsInteger:=qconsumosidaf.AsInteger;
          qstockhistorico.refresh;
          vstock:=qstockhistoricostock_final.asfloat;
        end;
      end;
      qconsumostratamientos.Open;
      qconsumostratamientos.Append;
      qconsumostratamientosid.value:=qidconsumoid.AsInteger;
      qconsumostratamientoside.value:=qconsumoside.AsInteger;
      qconsumostratamientosidaf.value:=qconsumosidaf.AsInteger;
      qconsumostratamientoscodigo.value:=qconsumoscodigo.Asstring;
      qconsumostratamientosdescripcion_af.value:=qconsumosdescripcion.AsString;
      qconsumostratamientosfamilia.value:=qconsumosfamilia.AsString;
      qconsumostratamientosregistro.value:=qconsumosregistro.AsString;
      qconsumostratamientosstock_anterior.value:=vstock;
      qconsumostratamientosconsumo_periodo.value:=qconsumosconsumo.AsFloat;
      qconsumostratamientoscompras_periodo.value:=qconsumoscompras.AsFloat;
      qconsumostratamientosregularizacion.value:=0;
      qconsumostratamientosprecio_medio.value:=qconsumospm_stock.AsFloat;
      qconsumostratamientosfecha_inicio.value:=finicio.Date;
      qconsumostratamientosfecha_fin.value:=ffin.Date;
      qconsumostratamientosunidades.value:=qconsumosunidad_medida.AsString;
      qconsumostratamientos.Post;
      qconsumos.next;
    end;
//    qconsumostratamientos.Refresh;
    qhistoricoconsumos.Refresh;
    qhistoricoconsumos2.Refresh;
end;

procedure Tconsumosfito.dsqhistoricoconsumosDataChange(Sender: TObject;
  Field: TField);
begin
  qconsumostratamientos.Close;
  qconsumostratamientos.Prepare;
  qconsumostratamientos.ParamByName('ID').AsInteger:=qhistoricoconsumosid.AsInteger;
  qconsumostratamientos.Open;
end;

procedure Tconsumosfito.FormShow(Sender: TObject);
begin
  finicio.Date:=date();
  ffin.Date:=date();
  qstockhistorico.Open;
  qultimoinventario.Open;
  qhistoricoconsumos2.Open;
  qhistoricoconsumos.Open;
  comboinventarios.KeyValue:=qultimoinventariofecha.AsDateTime;
  combohistoricos.KeyValue:=qhistoricoconsumos2fecha_inicio.AsDateTime;
end;

end.
