﻿unit fcontrolproduccion;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, ZAbstractRODataset, ZDataset,
  Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls, frxClass,frxDBSet,Excel2000,  ComObj,
  Vcl.DBCtrls, frxExportCSV, frxExportPDF, frxExportBaseDialog;
type
  Tcontrolproduccion = class(TForm)
    Panel1: TPanel;
    Panel4: TPanel;
    btimprimir: TButton;
    btexcel: TButton;
    Button1: TButton;
    Panel3: TPanel;
    Label1: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    fdesde: TDateTimePicker;
    comboarticulos: TDBLookupComboBox;
    controlproduccion: TRadioGroup;
    chkarticulos: TRadioButton;
    Panel2: TPanel;
    DBGrid1: TDBGrid;
    qarticulos: TZReadOnlyQuery;
    dsarticulos: TDataSource;
    dsqentradas: TDataSource;
    qentradas: TZReadOnlyQuery;
    informes: TfrxReport;
    informedb: TfrxDBDataset;
    qentradasid: TLargeintField;
    qentradasfecha: TDateField;
    qentradashora: TTimeField;
    qentradasmesa: TWideStringField;
    qentradasbascula: TWideStringField;
    qentradasidt: TIntegerField;
    qentradasembasadora: TWideStringField;
    qentradasmateria_prima: TWideStringField;
    qentradasproducto: TWideStringField;
    qentradastara: TFloatField;
    qentradaspeso_teorico: TFloatField;
    qentradaspeso_real: TFloatField;
    qentradasdescripcion: TWideStringField;
    frxPDFExport1: TfrxPDFExport;
    frxCSVExport1: TfrxCSVExport;
    qarticuloscodigo: TWideStringField;
    qarticulosdescripcion: TWideStringField;
    SaveDialog1: TSaveDialog;
    Label2: TLabel;
    fhasta: TDateTimePicker;
    RadioButton1: TRadioButton;
    Panel120: TPanel;
    Button43: TButton;
    Panel130: TPanel;
    Panel121: TPanel;
    Button44: TButton;
    Panel141: TPanel;
    DBGrid62: TDBGrid;
    qentradas2: TZReadOnlyQuery;
    qsalidas2: TZReadOnlyQuery;
    dsqentradas2: TDataSource;
    dsqsalidas2: TDataSource;
    Panel5: TPanel;
    DBGrid63: TDBGrid;
    Panel6: TPanel;
    qentradas2fechatrabajo: TDateField;
    qentradas2lote: TIntegerField;
    qentradas2origen: TWideStringField;
    qentradas2mprima: TWideStringField;
    qentradas2num_palets: TLargeintField;
    qentradas2envases: TLargeintField;
    qentradas2pesoneto: TFloatField;
    qentradas2peso_neto_venta: TFloatField;
    qentradas2iddestino: TIntegerField;
    qsalidas2fecha: TDateField;
    qsalidas2lote: TIntegerField;
    qsalidas2id_envase: TWideStringField;
    qsalidas2num_palets: TLargeintField;
    qsalidas2num_envases: TLargeintField;
    qsalidas2peso_neto: TFloatField;
    qsalidas2peso_neto_venta: TFloatField;
    qsalidas2idorigen: TIntegerField;
    qentradas2DESTINO: TWideStringField;
    qsalidas2ORIGEN: TWideStringField;
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure chkarticulosClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btimprimirClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure btexcelClick(Sender: TObject);
    procedure fdesdeChange(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
    procedure Button43Click(Sender: TObject);
    procedure Button44Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  controlproduccion: Tcontrolproduccion;

implementation

{$R *.dfm}
procedure Tcontrolproduccion.ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar);
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

  // 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 Tcontrolproduccion.fdesdeChange(Sender: TObject);
begin
    qarticulos.Close;
    qarticulos.Prepare;
    qarticulos.ParamByName('PDESDE').AsDate:=fdesde.Date;
    qarticulos.ParamByName('PHASTA').AsDate:=fhasta.Date;
    qarticulos.Open;
    qentradas2.Close;
    qentradas2.Prepare;
    qentradas2.ParamByName('PDESDE').AsDate:=fdesde.Date;
    qentradas2.ParamByName('PHASTA').AsDate:=fhasta.Date;
    qentradas2.Open;
    qsalidas2.Close;
    qsalidas2.Prepare;
    qsalidas2.ParamByName('PDESDE').AsDate:=fdesde.Date;
    qsalidas2.ParamByName('PHASTA').AsDate:=fhasta.Date;
    qsalidas2.Open;
end;

procedure Tcontrolproduccion.btexcelClick(Sender: TObject);
var  archivo:string;
begin
    savedialog1.FileName:='ENTRADAS DE MATERIALES.xls';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;

    try
    Exportaraexcel(archivo,'ENTRADAS',DBGRID1);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;

end;

procedure Tcontrolproduccion.btimprimirClick(Sender: TObject);
begin
    informedb.Datasource:=dsqentradas;
    informes.Report.Clear;
    informes.LoadFromFile('c:\agrigest\informes\infcontrolproduccion.fr3');
    informes.Variables.Variables['TITULO']:=QUOTEDSTR('Control de producción de Almacen a fecha: '+datetostr(fdesde.date));
    informes.ShowReport();
    informes.Clear
end;

procedure Tcontrolproduccion.Button1Click(Sender: TObject);
var dia,mes,anyo:word;
    tdia,tmes,tanyo,tfdesde:string;
begin
    decodedate(fdesde.Date,anyo,mes,dia);
    tfdesde:=''''+inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia)+'''';
    qentradas.Close;
    qentradas.Prepare;
    qentradas.ParamByName('PDESDE').AsDate:=fdesde.Date;
    qentradas.ParamByName('PHASTA').AsDate:=fhasta.Date;
    qentradas.ParamByName('PPRODUCTO').Asstring:=qarticuloscodigo.AsString;
    qentradas.open;
{
    qentradas.SQL.Clear;
    qentradas.SQL.Add('select p.*,pr.descripcion from produccion p,productos pr where p.producto=pr.codigo and fecha='+tfdesde+' and p.producto='+''''+qarticuloscodigo.AsString+'''');
    qentradas.SQL.Add(' order by fecha desc, hora desc');
    qentradas.open;}
end;

procedure Tcontrolproduccion.Button43Click(Sender: TObject);
var  archivo:string;
begin

    savedialog1.FileName:=stringreplace(('ENTRADAS.xlsx'),'/','-',[rfreplaceall]);
    savedialog1.Execute();
    archivo:=savedialog1.FileName;

    try
        Exportaraexcel(archivo,'entradas',DBGRID63);
    finally
      showmessage('Los datos han sido exportados correctamente');
    end;
end;

procedure Tcontrolproduccion.Button44Click(Sender: TObject);
var  archivo:string;
begin

    savedialog1.FileName:=stringreplace(('SALIDAS.xlsx'),'/','-',[rfreplaceall]);
    savedialog1.Execute();
    archivo:=savedialog1.FileName;

    try
        Exportaraexcel(archivo,'entradas',DBGRID62);
    finally
      showmessage('Los datos han sido exportados correctamente');
    end;
end;

procedure Tcontrolproduccion.chkarticulosClick(Sender: TObject);
begin
    comboarticulos.Visible:=true;
    panel5.Visible:=false;
    panel6.Visible:=true;
    panel6.BringToFront;
    panel4.Visible:=true;

end;

procedure Tcontrolproduccion.DBGrid1TitleClick(Column: TColumn);
var
  st:ZAbstractRODataset.TSortType;
begin
  st:=qentradas.SortType;
  qentradas.SortedFields:=Column.FieldName;
  If st = stAscending then qentradas.SortType:=stDescending else qentradas.SortType:=stAscending;
  dsqentradas.DataSet.First;

end;

procedure Tcontrolproduccion.FormShow(Sender: TObject);
begin
    qentradas.Close;
    qarticulos.Close;
    fdesde.Date:=date();
    fhasta.Date:=date();
end;

procedure Tcontrolproduccion.RadioButton1Click(Sender: TObject);
begin
    panel6.Visible:=false;
    panel5.Visible:=true;
    panel5.BringToFront;
    comboarticulos.Visible:=false;
    panel4.Visible:=false;
end;

end.
