﻿unit fimpresionmovimientos;

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;

type
  Tinfmovimientos = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    DBGrid1: TDBGrid;
    qmovimientos: TZReadOnlyQuery;
    dsqmovimientos: TDataSource;
    Panel4: TPanel;
    Panel3: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    btimprimir: TButton;
    btexcel: TButton;
    RadioGroup1: TRadioGroup;
    rentradas: TRadioButton;
    rsalidas: TRadioButton;
    qmovimientosid: TIntegerField;
    qmovimientosfecha: TDateField;
    qmovimientosfechatrabajo: TDateField;
    qmovimientosparcela: TWideStringField;
    qmovimientosmprima: TWideStringField;
    qmovimientosmprima_p: TWideStringField;
    qmovimientosid_envase: TWideStringField;
    qmovimientosnum_envases: TIntegerField;
    qmovimientoscliente: TWideStringField;
    qmovimientosciudad: TWideStringField;
    qmovimientospeso_neto: TFloatField;
    qmovimientospeso_neto_teorico: TFloatField;
    qmovimientospeso_medio: TFloatField;
    qmovimientostemperatura: TFloatField;
    qmovimientoslote: TIntegerField;
    Button1: TButton;
    informedb: TfrxDBDataset;
    informes: TfrxReport;
    SaveDialog1: TSaveDialog;
    qmovimientosidalbaran: TWideStringField;
    qmovimientospeso_bruto: TFloatField;
    qmovimientoscalibrecalidad: TIntegerField;
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure btimprimirClick(Sender: TObject);
    procedure rentradasClick(Sender: TObject);
    procedure rsalidasClick(Sender: TObject);
    procedure btexcelClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  infmovimientos: Tinfmovimientos;

implementation

{$R *.dfm}

uses principal;
procedure Tinfmovimientos.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 Tinfmovimientos.btexcelClick(Sender: TObject);
var  archivo:string;
begin
    savedialog1.FileName:='ENTRADAS-SALIDAS.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;

    try
    Exportaraexcel(archivo,'ENTRADAS-SALIDAS',DBGRID1);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;
end;

procedure Tinfmovimientos.btimprimirClick(Sender: TObject);
begin

    informedb.Datasource:=dsqmovimientos;
    informes.Report.Clear;
    informes.LoadFromFile('c:\agrigest\informes\entradas-salidas.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 Tinfmovimientos.Button1Click(Sender: TObject);
var comillas,espacio,desde,hasta:string;
    dia,mes,anyo:word;
    tdia,tmes,tanyo:string;
begin
    comillas:='''';
    espacio:=comillas+' '+comillas;
    decodedate(fdesde.date,anyo,mes,dia);
    tdia:=floattostr(dia);
    tmes:=floattostr(mes);
    tanyo:=floattostr(anyo);
    desde:=comillas+tanyo+'-'+tmes+'-'+tdia+comillas;
    decodedate(fhasta.date,anyo,mes,dia);
    tdia:=floattostr(dia);
    tmes:=floattostr(mes);
    tanyo:=floattostr(anyo);
    hasta:=comillas+tanyo+'-'+tmes+'-'+tdia+comillas;

    if rentradas.Checked then
    begin
        qmovimientos.Close;
        qmovimientos.SQL.Clear;
        qmovimientos.SQL.Add('(select v.id,v.fecha,v.fechatrabajo,v.parcela,v.mprima as mprima,v.mprima_p as mprima_p,v.id_envase,v.num_envases,v.destino as cliente,');
        qmovimientos.SQL.Add(espacio+' as ciudad,v.peso_bruto,v.peso_neto,v.peso_neto_teorico,v.peso_medio,v.temperatura,v.lote,v.idalbaran,v.calibrecalidad ');
        qmovimientos.SQL.Add(' from v_ea_pesadaslotes v where v.idea>0 and ');
        qmovimientos.SQL.Add(' v.fecha>='+desde+' and fecha<='+hasta);
        qmovimientos.SQL.Add(' and v.pedidocliente is null)');
        qmovimientos.SQL.Add(' UNION ALL');
        qmovimientos.SQL.Add('(select v.id,v.fecha,v.fechatrabajo,v.parcela,v.mprima as mprima,v.mprima_p as mprima_p,v.id_envase,v.num_envases,c.nombre as cliente,');
        qmovimientos.SQL.Add(' p.iddestino as ciudad,v.peso_bruto,v.peso_neto,v.peso_neto_teorico,v.peso_medio,v.temperatura,v.lote,v.idalbaran,v.calibrecalidad ');
        qmovimientos.SQL.Add(' from v_ea_pesadaslotes v, pedidos p,clientes c where v.idea>0 and ');
        qmovimientos.SQL.Add(' v.fecha>=+'+desde+' and fecha<='+hasta);
        qmovimientos.SQL.Add(' and v.pedidocliente is not null and v.pedidocliente=p.id and p.idcliente=c.id)');
        qmovimientos.SQL.Add(' order by mprima,lote,id desc, fecha');
        qmovimientos.Open;


    end;
    if rsalidas.Checked then
    begin
        qmovimientos.Close;
        qmovimientos.SQL.Clear;
        qmovimientos.SQL.Add('(select v.id,v.fecha,v.fechatrabajo,v.parcela,v.mprima as mprima,v.mprima_p as mprima_p,v.id_envase,v.num_envases,v.destino as cliente,');
        qmovimientos.SQL.Add(espacio+' as ciudad,v.peso_bruto,v.peso_neto,v.peso_neto_teorico,v.peso_medio,v.temperatura,v.lote,v.idalbaran,v.calibrecalidad ');
        qmovimientos.SQL.Add(' from v_ea_pesadaslotes v where (v.idea=0 or v.iddestino in (select id from almacenes where final=1)) and v.iddestino<>0 and v.iddestino in (select id from almacenes where produccion=0) and ');
        qmovimientos.SQL.Add(' v.fecha>='+desde+' and fecha<='+hasta);
        qmovimientos.SQL.Add(' and v.pedidocliente is null) ');
        qmovimientos.SQL.Add(' UNION ALL');
        qmovimientos.SQL.Add('((select v.id,v.fecha,v.fechatrabajo,v.parcela,v.mprima as mprima,v.mprima_p as mprima_p,v.id_envase,v.num_envases,c.nombre as cliente,p.iddestino as ciudad,');
        qmovimientos.SQL.Add(' v.peso_bruto,v.peso_neto,v.peso_neto_teorico,v.peso_medio,v.temperatura,v.lote,v.idalbaran,v.calibrecalidad');
        qmovimientos.SQL.Add(' from v_ea_pesadaslotes v, pedidos p,clientes c where (v.idea=0 or v.iddestino in (select id from almacenes where final=1)) and v.iddestino<>0 and v.iddestino in (select id from almacenes where produccion=0) and ');
        qmovimientos.SQL.Add(' v.fecha>='+desde+' and fecha<='+hasta);
        qmovimientos.SQL.Add(' and v.pedidocliente is not null and v.pedidocliente=p.id and p.idcliente=c.id))');
        qmovimientos.SQL.Add(' order by mprima_p,lote,id desc, fecha');
        qmovimientos.Open;
    end;

end;

procedure Tinfmovimientos.DBGrid1TitleClick(Column: TColumn);
var
  st:ZAbstractRODataset.TSortType;
begin
  st:=qmovimientos.SortType;
  qmovimientos.SortedFields:=Column.FieldName;
  If st = stAscending then qmovimientos.SortType:=stDescending else qmovimientos.SortType:=stAscending;
  dsqmovimientos.DataSet.First;

end;

procedure Tinfmovimientos.FormKeyPress(Sender: TObject; var Key: Char);
var formatos:tformatsettings;
punto:string;
begin
    GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatos);
    punto:=formatos.DecimalSeparator;
    if punto=',' then
    begin
        if (key='.') and (activecontrol is tdbgrid) then
        begin
            key:=','
        end;
        if (key='.') and (activecontrol is tedit) then
        begin
           if  (activecontrol as tedit).Name='thoras' then key:=',';
           if  (activecontrol as tedit).Name='edimporte' then key:=',';
           if  (activecontrol as tedit).Name='edjhoras' then key:=',';
           if  (activecontrol as tedit).Name='lprecio' then key:=',';
           if  (activecontrol as tedit).Name='edjprecio' then key:=',';
           if  (activecontrol as tedit).Name='limporteanticipos' then key:=',';
        end;
    end;
    if (key=#13) then
    begin
        Perform(WM_NextDLGCtl,0,0);
        key:=#0;
    end;

end;

procedure Tinfmovimientos.FormShow(Sender: TObject);
begin
    fdesde.Date:=date;
    fhasta.Date:=date;
end;

procedure Tinfmovimientos.rentradasClick(Sender: TObject);
begin
    qmovimientos.Close;
end;

procedure Tinfmovimientos.rsalidasClick(Sender: TObject);
begin
    qmovimientos.Close;
end;

end.
