unit fcontrolproduccion;

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, 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: TFDQuery;
    dsarticulos: TDataSource;
    dsqentradas: TDataSource;
    qentradas: TFDQuery;
    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: TFDQuery;
    qsalidas2: TFDQuery;
    dsqentradas2: TDataSource;
    dsqsalidas2: TDataSource;
    Panel5: TPanel;
    DBGrid63: TDBGrid;
    Panel6: TPanel;
    qentradas2fechatrabajo: TDateField;
    qentradas2lote: TIntegerField;
    qentradas2origen: TWideStringField;
    qentradas2mprima: TWideStringField;
    qentradas2num_palets: TFloatField;
    qentradas2envases: TFloatField;
    qentradas2pesoneto: TFloatField;
    qentradas2peso_neto_venta: TFloatField;
    qentradas2iddestino: TIntegerField;
    qsalidas2fecha: TDateField;
    qsalidas2lote: TIntegerField;
    qsalidas2id_envase: TWideStringField;
    qsalidas2num_palets: TFloatField;
    qsalidas2num_envases: TFloatField;
    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 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 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 produccin 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:TFDQuerySortType;
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.
