unit fimpresionmovimientos;

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
  Tinfmovimientos = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    DBGrid1: TDBGrid;
    qmovimientos: TFDQuery;
    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 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 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:TFDQuerySortType;
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.
