unit fbalanceventas;

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.StdCtrls,
    Vcl.ExtCtrls, Vcl.DBCtrls, Vcl.Grids,
  Vcl.DBGrids, Vcl.Menus,  Vcl.Tabs, Vcl.ComCtrls, Vcl.Mask, 
    Vcl.ExtDlgs, Vcl.Imaging.jpeg, frxClass, frxDBSet,
  frxExportPDF, frxBarcode, Vcl.Buttons, VCLTee.TeEngine, VCLTee.Series,
  VCLTee.TeeData, VCLTee.TeeProcs, VCLTee.Chart, VCLTee.DBChart,ShellApi,
  Vcl.OleCtrls,IdHTTP,mshtml, SHDocVw, wgssSTU_TLB,SignatureForm,
  Vcl.ToolWin, Vcl.ImgList,dateutils,
  Vcl.OleServer,  ComObj, Excel2000, IdIOHandler, IdIOHandlerSocket,
  IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdMessage, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
  IdMessageClient, IdSMTPBase, IdSMTP;

type
  Tbalanceventas = class(TForm)
    Panel1: TPanel;
    qcampanyas: TFDQuery;
    qbalanceventas: TFDQuery;
    dsqcampanayas: TDataSource;
    dsbalanceventas: TDataSource;
    listaagrupacion: TComboBox;
    listaordenacion: TComboBox;
    qcampanyasid: TIntegerField;
    qcampanyasidempresa: TIntegerField;
    qcampanyasid_anterior: TIntegerField;
    qcampanyasdescripcion: TWideStringField;
    qcampanyasfechainicio: TDateField;
    qcampanyasfechafin: TDateField;
    qcampanyasult_pesada: TIntegerField;
    listacampanyas: TDBLookupComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    grdatos: TDBGrid;
    Checkdetallado: TCheckBox;
    Panel2: TPanel;
    Button1: TButton;
    Button2: TButton;
    btfiltrar: TButton;
    SaveDialog1: TSaveDialog;
    qbalanceventasidcliente: TIntegerField;
    qbalanceventasnomcliente: TWideStringField;
    qbalanceventasserie: TWideStringField;
    qbalanceventasidfactura: TIntegerField;
    qbalanceventasfecha: TDateField;
    qbalanceventasidarticulo: TWideStringField;
    qbalanceventaslote: TWideStringField;
    qbalanceventascantidad: TFloatField;
    qbalanceventasprecio: TFloatField;
    qbalanceventasbase: TFloatField;
    qbalanceventastipoiva: TFloatField;
    qbalanceventasiva: TFloatField;
    qbalanceventasdescuento: TFloatField;
    qbalanceventastotaldescuento: TFloatField;
    qbalanceventastotal: TFloatField;
    qbalanceventasparcela: TWideStringField;
    qbalanceventasmprima: TWideStringField;
    informedb: TfrxDBDataset;
    informes: TfrxReport;
    qbalanceventasobtentor: TWideStringField;
    Label4: TLabel;
    listaseries: TDBLookupComboBox;
    qseries: TFDQuery;
    dsqseries: TDataSource;
    qserieside: TIntegerField;
    qseriesid: TWideStringField;
    qseriesfechainicio: TDateField;
    qseriesfechafin: TDateField;
    qseriesnum_pedcliente: TIntegerField;
    qseriesnum_albaran: TIntegerField;
    qseriesnum_factura: TIntegerField;
    qseriesnum_expedicion: TIntegerField;
    qseriesnum_pedproveedor: TIntegerField;
    qseriesimp_albaran: TWideStringField;
    qseriesimp_factura: TWideStringField;
    qseriesactivo: TIntegerField;
    qseriesnum_presupuesto: TIntegerField;
    qseriesseriecontable: TWideStringField;
    procedure FormShow(Sender: TObject);
    procedure btfiltrarClick(Sender: TObject);
    procedure CheckdetalladoClick(Sender: TObject);
    procedure listaagrupacionChange(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure listaordenacionChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  balanceventas: Tbalanceventas;

implementation

{$R *.dfm}
procedure Tbalanceventas.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 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
  if (ProgressBarXls <> nil) then
    ProgressBarInit;

  // 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.columns[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
      if DBGrid.columns[J].Visible then
      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 Tbalanceventas.btfiltrarClick(Sender: TObject);
var dia,mes,anyo:word;
    finicio,ffin,serie:string;
    grupo,orden:integer;
begin
    decodedate(qcampanyasfechainicio.asdatetime,anyo,mes,dia);
    finicio:=''''+inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia)+'''';
    decodedate(qcampanyasfechafin.asdatetime,anyo,mes,dia);
    ffin:=''''+inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia)+'''';
    serie:=''''+qseriesid.AsString+'''';
    if checkdetallado.Checked then
    begin
      grupo:=-1;
      orden:=-1;
      qbalanceventas.Close;
      qbalanceventas.SQL.Clear;
      qbalanceventas.SQL.Add('select * from vista_balanceventas where serie='+serie+' and fecha>='+finicio+' and fecha<='+ffin);

    end else
    begin
       grupo:=listaagrupacion.ItemIndex;
       orden:=listaordenacion.ItemIndex;
       qbalanceventas.Close;
       qbalanceventas.SQL.Clear;
       qbalanceventas.SQL.Add('select idcliente,nomcliente,serie,idfactura,fecha,idarticulo,lote,sum(cantidad) as cantidad,precio,sum(base) as base,tipoiva,sum(iva) as iva,descuento,sum(totaldescuento) as totaldescuento,sum(total) as total,parcela,mprima,obtentor ');
       qbalanceventas.SQL.Add(' from vista_balanceventas where serie='+serie+' and fecha>='+finicio+' and fecha<='+ffin);

    end;
    case grupo of
       0:begin
          qbalanceventas.SQL.Add(' group by mprima ');
       end;
       1:begin
          qbalanceventas.SQL.Add(' group by parcela ');
       end;
       2:begin
          qbalanceventas.SQL.Add(' group by idcliente');
       end;
       3:begin
          qbalanceventas.SQL.Add(' group by idfactura ');
       end;
    end;
    case orden of
       0:begin
          qbalanceventas.SQL.Add(' order by mprima ');
       end;
       1:begin
          qbalanceventas.SQL.Add(' order by parcela ');
       end;
       2:begin
          qbalanceventas.SQL.Add(' order by idcliente ');
       end;
       3:begin
          qbalanceventas.SQL.Add(' order by idfactura ');
       end;
    end;
    qbalanceventas.open;
end;

procedure Tbalanceventas.Button1Click(Sender: TObject);
begin
    informedb.Datasource:=dsbalanceventas;
 {   if edit2.text<>'' then
    begin
       dmestadisticas.qproduccionimpresion.close;
       dmestadisticas.qproduccionimpresion.sql.clear;
       dmestadisticas.qproduccionimpresion.sql.add('select *  from ea_pesadas ea where  codigoR='+''''+'R'+edit2.Text+''''+' order by ea.destino,ea.id_envase,ea.fecha,ea.id,ea.mprima');
       dmestadisticas.qproduccion.Open;

    end;
 }
    case listaagrupacion.ItemIndex of
    0:begin
    informes.Report.Clear;
    informes.LoadFromFile('c:\agrigest\informes\balancemasasvariedad.fr3');
    informes.Variables.Variables['TITULO']:=QUOTEDSTR('Balance de masas por variedad '+qcampanyasdescripcion.AsString);
    informes.Variables.Variables['AGRUPACION']:=QUOTEDSTR('Variedad');

    end;
    1:begin
    informes.Report.Clear;
    informes.LoadFromFile('c:\agrigest\informes\balancemasasparcela.fr3');
    informes.Variables.Variables['TITULO']:=QUOTEDSTR('Balance de masas por parcela '+qcampanyasdescripcion.AsString);
    informes.Variables.Variables['AGRUPACION']:=QUOTEDSTR('Parcela');

    end;
    2:begin
    informes.Report.Clear;
    informes.LoadFromFile('c:\agrigest\informes\balancemasascliente.fr3');
    informes.Variables.Variables['TITULO']:=QUOTEDSTR('Balance de masas por cliente '+qcampanyasdescripcion.AsString);
    informes.Variables.Variables['AGRUPACION']:=QUOTEDSTR('Cliente');

    end;
    3:begin
    informes.Report.Clear;
    informes.LoadFromFile('c:\agrigest\informes\balancemasasdetallado.fr3');
    informes.Variables.Variables['TITULO']:=QUOTEDSTR('Balance de masas detallado '+qcampanyasdescripcion.AsString);
    end;
    end;

//    informes.Report.FileName:=TMES.Text+' ' + qjornalestrabajador.asstring;
    informes.ShowReport();
    informes.Clear

end;

procedure Tbalanceventas.Button2Click(Sender: TObject);
var archivo:string;
begin

    savedialog1.FileName:='BALANCE-DE-MASAS.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
    try
    Exportaraexcel(archivo,'BALANCE-DE-MASAS',grdatos);
    finally
      showmessage('Los datos han sido exportados correctamente a '+archivo);
    end;

end;

procedure Tbalanceventas.CheckdetalladoClick(Sender: TObject);
begin
if checkdetallado.Checked then
   begin
      grdatos.columns[0].Visible:=true;
      grdatos.columns[1].Visible:=true;
      grdatos.columns[2].Visible:=true;
      grdatos.columns[3].Visible:=true;
      grdatos.columns[4].Visible:=true;
      grdatos.columns[5].Visible:=true;
      grdatos.columns[6].Visible:=true;
      grdatos.columns[7].Visible:=true;
      grdatos.columns[8].Visible:=true;
      grdatos.columns[9].Visible:=true;
      grdatos.columns[10].Visible:=true;
      grdatos.columns[11].Visible:=true;
      grdatos.columns[12].Visible:=true;
      grdatos.columns[13].Visible:=true;
      grdatos.columns[14].Visible:=true;
      grdatos.columns[15].Visible:=true;
      grdatos.columns[16].Visible:=true;
   end else
         case listaagrupacion.ItemIndex of
         0:begin
            grdatos.columns[0].Visible:=true;
            grdatos.columns[1].Visible:=false;
            grdatos.columns[2].Visible:=false;
            grdatos.columns[3].Visible:=false;
            grdatos.columns[4].Visible:=false;
            grdatos.columns[5].Visible:=false;
            grdatos.columns[6].Visible:=true;
            grdatos.columns[7].Visible:=false;
            grdatos.columns[8].Visible:=false;
            grdatos.columns[9].Visible:=true;
            grdatos.columns[10].Visible:=false;
            grdatos.columns[11].Visible:=true;
            grdatos.columns[12].Visible:=false;
            grdatos.columns[13].Visible:=false;
            grdatos.columns[14].Visible:=false;
            grdatos.columns[15].Visible:=false;
            grdatos.columns[16].Visible:=true;
         end;
         1:begin
            grdatos.columns[0].Visible:=true;
            grdatos.columns[1].Visible:=false;
            grdatos.columns[2].Visible:=false;
            grdatos.columns[3].Visible:=false;
            grdatos.columns[4].Visible:=false;
            grdatos.columns[5].Visible:=false;
            grdatos.columns[6].Visible:=false;
            grdatos.columns[7].Visible:=true;
            grdatos.columns[8].Visible:=false;
            grdatos.columns[9].Visible:=true;
            grdatos.columns[10].Visible:=false;
            grdatos.columns[11].Visible:=true;
            grdatos.columns[12].Visible:=false;
            grdatos.columns[13].Visible:=false;
            grdatos.columns[14].Visible:=false;
            grdatos.columns[15].Visible:=false;
            grdatos.columns[16].Visible:=true;
         end;
         2:begin

            grdatos.columns[0].Visible:=false;
            grdatos.columns[1].Visible:=false;
            grdatos.columns[2].Visible:=false;
            grdatos.columns[3].Visible:=false;
            grdatos.columns[4].Visible:=false;
            grdatos.columns[5].Visible:=false;
            grdatos.columns[6].Visible:=false;
            grdatos.columns[7].Visible:=true;
            grdatos.columns[8].Visible:=false;
            grdatos.columns[9].Visible:=false;
            grdatos.columns[10].Visible:=true;
            grdatos.columns[11].Visible:=false;
            grdatos.columns[12].Visible:=true;
            grdatos.columns[13].Visible:=false;
            grdatos.columns[14].Visible:=false;
            grdatos.columns[15].Visible:=true;
         end;
   end;
end;

procedure Tbalanceventas.FormShow(Sender: TObject);
begin
  qcampanyas.Open;
  qseries.Open;
  listaseries.KeyValue:=qseriesid.AsInteger;
  listacampanyas.KeyValue:=qcampanyasid.AsString;
//  qbalanceventas.Open;
end;

procedure Tbalanceventas.listaagrupacionChange(Sender: TObject);
begin
btfiltrar.Click;
      case listaagrupacion.ItemIndex of
         0:begin
            grdatos.columns[0].Visible:=false;
            grdatos.columns[1].Visible:=false;
            grdatos.columns[2].Visible:=false;
            grdatos.columns[3].Visible:=false;
            grdatos.columns[4].Visible:=false;
            grdatos.columns[5].Visible:=false;
            grdatos.columns[6].Visible:=true;
            grdatos.columns[7].Visible:=true;
            grdatos.columns[8].Visible:=false;
            grdatos.columns[9].Visible:=false;
            grdatos.columns[10].Visible:=true;
            grdatos.columns[11].Visible:=false;
            grdatos.columns[12].Visible:=true;
            grdatos.columns[13].Visible:=false;
            grdatos.columns[14].Visible:=true;
            grdatos.columns[15].Visible:=false;
            grdatos.columns[16].Visible:=false;
            grdatos.columns[17].Visible:=true;
         end;
         1:begin
            grdatos.columns[0].Visible:=false;
            grdatos.columns[1].Visible:=false;
            grdatos.columns[2].Visible:=false;
            grdatos.columns[3].Visible:=false;
            grdatos.columns[4].Visible:=false;
            grdatos.columns[5].Visible:=false;
            grdatos.columns[6].Visible:=false;
            grdatos.columns[7].Visible:=false;
            grdatos.columns[8].Visible:=true;
            grdatos.columns[9].Visible:=false;
            grdatos.columns[10].Visible:=true;
            grdatos.columns[11].Visible:=false;
            grdatos.columns[12].Visible:=true;
            grdatos.columns[13].Visible:=false;
            grdatos.columns[14].Visible:=true;
            grdatos.columns[15].Visible:=false;
            grdatos.columns[16].Visible:=false;
            grdatos.columns[17].Visible:=true;
         end;
         2:begin
            grdatos.columns[0].Visible:=false;
            grdatos.columns[1].Visible:=false;
            grdatos.columns[2].Visible:=false;
            grdatos.columns[3].Visible:=false;
            grdatos.columns[4].Visible:=false;
            grdatos.columns[5].Visible:=false;
            grdatos.columns[6].Visible:=false;
            grdatos.columns[7].Visible:=false;
            grdatos.columns[8].Visible:=false;
            grdatos.columns[9].Visible:=true;
            grdatos.columns[10].Visible:=true;
            grdatos.columns[11].Visible:=false;
            grdatos.columns[12].Visible:=true;
            grdatos.columns[13].Visible:=false;
            grdatos.columns[14].Visible:=true;
            grdatos.columns[15].Visible:=false;
            grdatos.columns[16].Visible:=false;
            grdatos.columns[17].Visible:=true;
         end;
      end;
   end;
procedure Tbalanceventas.listaordenacionChange(Sender: TObject);
begin
btfiltrar.Click;
end;

end.
