unit ffacturas;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.DBGrids, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.Mask, Vcl.ExtCtrls, Vcl.ComCtrls, Data.DB,math,
  ZAbstractRODataset, ZAbstractDataset, ZDataset, frxClass, frxDBSet,datos,  ComObj, Excel2000;

type
  Tfacturas = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Panel1: TPanel;
    Panel4: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button5: TButton;
    Button6: TButton;
    Panel2: TPanel;
    Label6: TLabel;
    Label7: TLabel;
    DBText3: TDBText;
    DBText4: TDBText;
    DBText5: TDBText;
    DBText6: TDBText;
    DBText7: TDBText;
    DBText8: TDBText;
    DBText9: TDBText;
    DBText10: TDBText;
    DBText11: TDBText;
    DBText12: TDBText;
    DBText13: TDBText;
    DBText14: TDBText;
    DBText15: TDBText;
    Panel3: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label15: TLabel;
    DBEdit1: TDBEdit;
    DBLookupComboBox2: TDBLookupComboBox;
    DBLookupComboBox3: TDBLookupComboBox;
    DBEdit2: TDBEdit;
    DBCheckBox1: TDBCheckBox;
    DBMemo1: TDBMemo;
    DBMemo2: TDBMemo;
    Panel5: TPanel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Panel6: TPanel;
    DBGrid1: TDBGrid;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    DBEdit7: TDBEdit;
    DBEdit8: TDBEdit;
    DBEdit9: TDBEdit;
    DBGrid2: TDBGrid;
    Panel7: TPanel;
    Button4: TButton;
    TabSheet2: TTabSheet;
    DBGrid3: TDBGrid;
    PageControl2: TPageControl;
    TabSheet3: TTabSheet;
    Panel8: TPanel;
    Panel9: TPanel;
    btfcancelar: TButton;
    btfmodificar: TButton;
    btfborrar: TButton;
    btfnuevo: TButton;
    btfguardar: TButton;
    btfimprimir: TButton;
    btfimportar: TButton;
    btfsiguiente: TButton;
    btfanterior: TButton;
    Panel10: TPanel;
    Label16: TLabel;
    Label17: TLabel;
    DBText1: TDBText;
    DBText2: TDBText;
    DBText16: TDBText;
    DBText17: TDBText;
    DBText18: TDBText;
    DBText19: TDBText;
    DBText20: TDBText;
    DBText21: TDBText;
    DBText22: TDBText;
    DBText23: TDBText;
    DBText24: TDBText;
    DBText25: TDBText;
    DBText26: TDBText;
    paneldatos: TPanel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    comboseries: TDBLookupComboBox;
    DBEdit10: TDBEdit;
    comboclientes: TDBLookupComboBox;
    combodestinos: TDBLookupComboBox;
    DBEdit11: TDBEdit;
    DBMemo4: TDBMemo;
    Panel12: TPanel;
    Label24: TLabel;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    Label29: TLabel;
    Label30: TLabel;
    Panel13: TPanel;
    DBGrid4: TDBGrid;
    DBEdit12: TDBEdit;
    DBEdit13: TDBEdit;
    DBEdit14: TDBEdit;
    DBEdit15: TDBEdit;
    DBEdit16: TDBEdit;
    DBEdit17: TDBEdit;
    DBEdit18: TDBEdit;
    DBGrid5: TDBGrid;
    Panel14: TPanel;
    Button16: TButton;
    TabSheet4: TTabSheet;
    DBGrid6: TDBGrid;
    infdetallefactura: TfrxDBDataset;
    inffactura: TfrxDBDataset;
    inffacturaivas: TfrxDBDataset;
    informe: TfrxReport;
    dsfacturas: TDataSource;
    facturas: TZQuery;
    dsfacturasdetalle: TDataSource;
    facturasdetalle: TZQuery;
    dsqseries: TDataSource;
    dsqclientes: TDataSource;
    qclientes: TZQuery;
    qseries: TZQuery;
    dsqdestinos: TDataSource;
    qdestinos: TZQuery;
    qdestinoscodigo: TWideStringField;
    qdestinosidcliente: TIntegerField;
    qdestinosidempresa: TIntegerField;
    qdestinosdescripcion: TWideStringField;
    qdestinosseleccionado: TIntegerField;
    qdestinosactivo: TIntegerField;
    qdestinosdireccion: TWideStringField;
    qdestinospoblacion: TWideStringField;
    qdestinoscodpost: TWideStringField;
    qdestinosprovincia: TWideStringField;
    qdestinospais: TWideStringField;
    dsqfacturasiva: TDataSource;
    qfacturasiva: TZQuery;
    qalbaranes: TZQuery;
    qalbaranesdetalle: TZQuery;
    dsqalbaranes: TDataSource;
    dsqalbaranesdetalle: TDataSource;
    facturasid: TIntegerField;
    facturasidempresa: TIntegerField;
    facturasidcliente: TIntegerField;
    facturasiddestino: TWideStringField;
    facturasnif: TWideStringField;
    facturasdireccion: TWideStringField;
    facturaspoblacion: TWideStringField;
    facturasprovincia: TWideStringField;
    facturascodpost: TWideStringField;
    facturasfecha: TDateField;
    facturasreferencia: TWideStringField;
    facturastelefono: TWideStringField;
    facturasnomcliente: TWideStringField;
    facturaspaiscliente: TWideStringField;
    facturasnomdestino: TWideStringField;
    facturasdirecciondestino: TWideStringField;
    facturaspoblaciondestino: TWideStringField;
    facturascodpostdestino: TWideStringField;
    facturasprovinciadestino: TWideStringField;
    facturaspaisdestino: TWideStringField;
    facturasneto: TFloatField;
    facturastotal: TFloatField;
    facturasdocumento: TWideStringField;
    facturasdescuento_lin: TFloatField;
    facturasdescuento_com: TFloatField;
    facturasdescuento_pp: TFloatField;
    facturasdescuento_total: TFloatField;
    facturastotaliva: TFloatField;
    facturasobservaciones: TWideStringField;
    facturasdetalleid: TIntegerField;
    facturasdetalleidempresa: TIntegerField;
    facturasdetalleidfactura: TIntegerField;
    facturasdetalleidarticulo: TWideStringField;
    facturasdetalledescripcion: TWideStringField;
    facturasdetallecal: TWideStringField;
    facturasdetallelote: TWideStringField;
    facturasdetallecantidad: TFloatField;
    facturasdetalleprecio: TFloatField;
    facturasdetalledescuento: TFloatField;
    facturasdetalletotaldescuento: TFloatField;
    facturasdetallebase: TFloatField;
    facturasdetalletipoiva: TFloatField;
    facturasdetalleiva: TFloatField;
    facturasdetalletotal: TFloatField;
    qserieside: TIntegerField;
    qseriesid: TWideStringField;
    qseriesfechainicio: TDateField;
    qseriesfechafin: TDateField;
    qseriesnum_pedcliente: TIntegerField;
    qseriesnum_albaran: TIntegerField;
    qseriesnum_factura: TIntegerField;
    qseriesnum_expedicion: TIntegerField;
    qseriesnum_pedproveedor: TIntegerField;
    qclientesid: TIntegerField;
    qclientesIdempresa: TIntegerField;
    qclientesnif: TWideStringField;
    qclientesnombre: TWideStringField;
    qclientesnombre_corto: TWideStringField;
    qclientesdireccion: TWideStringField;
    qclientespoblacion: TWideStringField;
    qclientescodpost: TWideStringField;
    qclientesprovincia: TWideStringField;
    qclientestelefono: TWideStringField;
    qclientestelefono2: TWideStringField;
    qclientesmovil: TWideStringField;
    qclientesemail: TWideStringField;
    qclientespersonacontacto: TWideStringField;
    qclientescodigomercado: TIntegerField;
    qclientesactivo: TIntegerField;
    qclientesobservaciones: TWideStringField;
    qclientesccontable: TIntegerField;
    qclientesdescuento: TFloatField;
    qclientespais: TWideStringField;
    qalbaranesid: TIntegerField;
    qalbaranesidempresa: TIntegerField;
    qalbaranesidcliente: TIntegerField;
    qalbaranesiddestino: TWideStringField;
    qalbaranesnif: TWideStringField;
    qalbaranesdireccion: TWideStringField;
    qalbaranespoblacion: TWideStringField;
    qalbaranesprovincia: TWideStringField;
    qalbaranescodpost: TWideStringField;
    qalbaranesfecha: TDateField;
    qalbaranesreferencia: TWideStringField;
    qalbaranestelefono: TWideStringField;
    qalbaranesnomcliente: TWideStringField;
    qalbaranespaiscliente: TWideStringField;
    qalbaranesnomdestino: TWideStringField;
    qalbaranesdirecciondestino: TWideStringField;
    qalbaranespoblaciondestino: TWideStringField;
    qalbaranescodpostdestino: TWideStringField;
    qalbaranesprovinciadestino: TWideStringField;
    qalbaranespaisdestino: TWideStringField;
    qalbaranesneto: TFloatField;
    qalbaranestotal: TFloatField;
    qalbaranesfacturado: TIntegerField;
    qalbaranesdocumento: TWideStringField;
    qalbaranesdescuento_lin: TFloatField;
    qalbaranesdescuento_com: TFloatField;
    qalbaranesdescuento_pp: TFloatField;
    qalbaranesdescuento_total: TFloatField;
    qalbaranestotaliva: TFloatField;
    qalbaranesobservaciones: TWideStringField;
    qalbaranesidfactura: TIntegerField;
    qalbaranesdetalleid: TIntegerField;
    qalbaranesdetalleidempresa: TIntegerField;
    qalbaranesdetalleidalbaran: TIntegerField;
    qalbaranesdetalleidarticulo: TWideStringField;
    qalbaranesdetalledescripcion: TWideStringField;
    qalbaranesdetallecal: TWideStringField;
    qalbaranesdetallelote: TWideStringField;
    qalbaranesdetallecantidad: TFloatField;
    qalbaranesdetalleprecio: TFloatField;
    qalbaranesdetalledescuento: TFloatField;
    qalbaranesdetalletotaldescuento: TFloatField;
    qalbaranesdetallebase: TFloatField;
    qalbaranesdetalletipoiva: TFloatField;
    qalbaranesdetalleiva: TFloatField;
    qalbaranesdetalletotal: TFloatField;
    dsqalbaranes2: TDataSource;
    qalbaranes2: TZQuery;
    dsqalbaranesdetalle2: TDataSource;
    qalbaranesdetalle2: TZQuery;
    qfacturasivaidfactura: TIntegerField;
    qfacturasivaide: TIntegerField;
    qfacturasivabase: TFloatField;
    qfacturasivatipo: TFloatField;
    qfacturasivaiva: TFloatField;
    qalbaranes2id: TIntegerField;
    qalbaranes2idempresa: TIntegerField;
    qalbaranes2idcliente: TIntegerField;
    qalbaranes2iddestino: TWideStringField;
    qalbaranes2nif: TWideStringField;
    qalbaranes2direccion: TWideStringField;
    qalbaranes2poblacion: TWideStringField;
    qalbaranes2provincia: TWideStringField;
    qalbaranes2codpost: TWideStringField;
    qalbaranes2fecha: TDateField;
    qalbaranes2referencia: TWideStringField;
    qalbaranes2telefono: TWideStringField;
    qalbaranes2nomcliente: TWideStringField;
    qalbaranes2paiscliente: TWideStringField;
    qalbaranes2nomdestino: TWideStringField;
    qalbaranes2direcciondestino: TWideStringField;
    qalbaranes2poblaciondestino: TWideStringField;
    qalbaranes2codpostdestino: TWideStringField;
    qalbaranes2provinciadestino: TWideStringField;
    qalbaranes2paisdestino: TWideStringField;
    qalbaranes2neto: TFloatField;
    qalbaranes2total: TFloatField;
    qalbaranes2facturado: TIntegerField;
    qalbaranes2documento: TWideStringField;
    qalbaranes2descuento_lin: TFloatField;
    qalbaranes2descuento_com: TFloatField;
    qalbaranes2descuento_pp: TFloatField;
    qalbaranes2descuento_total: TFloatField;
    qalbaranes2totaliva: TFloatField;
    qalbaranes2observaciones: TWideStringField;
    qalbaranes2idfactura: TIntegerField;
    qalbaranesdetalle2id: TIntegerField;
    qalbaranesdetalle2idempresa: TIntegerField;
    qalbaranesdetalle2idalbaran: TIntegerField;
    qalbaranesdetalle2idarticulo: TWideStringField;
    qalbaranesdetalle2descripcion: TWideStringField;
    qalbaranesdetalle2cal: TWideStringField;
    qalbaranesdetalle2lote: TWideStringField;
    qalbaranesdetalle2cantidad: TFloatField;
    qalbaranesdetalle2precio: TFloatField;
    qalbaranesdetalle2descuento: TFloatField;
    qalbaranesdetalle2totaldescuento: TFloatField;
    qalbaranesdetalle2base: TFloatField;
    qalbaranesdetalle2tipoiva: TFloatField;
    qalbaranesdetalle2iva: TFloatField;
    qalbaranesdetalle2total: TFloatField;
    qaux: TZQuery;
    facturasserie: TWideStringField;
    facturasdetalleserie: TWideStringField;
    qalbaranes2serie: TWideStringField;
    qalbaranesdetalle2serie: TWideStringField;
    qalbaranesserie: TWideStringField;
    qalbaranesdetalleserie: TWideStringField;
    qfacturasivaserie: TWideStringField;
    qseriesimp_albaran: TWideStringField;
    qseriesimp_factura: TWideStringField;
    facturasbultos: TFloatField;
    facturaskilos: TFloatField;
    facturasidformapago: TIntegerField;
    Label31: TLabel;
    comboformapago: TDBLookupComboBox;
    qformaspago: TZQuery;
    dsqformaspago: TDataSource;
    qformaspagoide: TIntegerField;
    qformaspagoid: TIntegerField;
    qformaspagocodigo: TWideStringField;
    qformaspagodescripcion: TWideStringField;
    qformaspagodias: TIntegerField;
    qclientesidformapago: TIntegerField;
    qalbaranesdetallebultos: TFloatField;
    qalbaranesdetalle2bultos: TFloatField;
    dsqarticulos: TDataSource;
    qarticulos: TZReadOnlyQuery;
    qtipos_iva: TZReadOnlyQuery;
    DataSource1: TDataSource;
    qtipos_ivaid: TIntegerField;
    qtipos_ivadescripcion: TWideStringField;
    qtipos_ivatipo: TIntegerField;
    qtipos_ivatipo_req: TFloatField;
    qarticulosidempresa: TIntegerField;
    qarticulosid: TIntegerField;
    qarticuloscodigo: TWideStringField;
    qarticulosdescripcion: TWideStringField;
    qarticulosfamilia: TIntegerField;
    qarticulosprovhab: TIntegerField;
    qarticulostipoiva: TIntegerField;
    qarticulospreciocoste: TFloatField;
    qarticulosmargen: TFloatField;
    qarticulosbeneficio: TFloatField;
    qarticulospvp: TFloatField;
    qarticulosstock: TFloatField;
    qarticulosult_preciocompra: TFloatField;
    qarticulosfacturable: TIntegerField;
    qarticulosobservaciones: TWideStringField;
    qarticulosimagen: TBlobField;
    qarticulosactivo: TIntegerField;
    qarticulosvalor_almacen: TFloatField;
    qarticulosstock_minimo: TFloatField;
    qarticulosavisar_stock: TIntegerField;
    qarticuloscontrolar_traza: TIntegerField;
    qarticulospeso: TFloatField;
    listaimpresion: TComboBox;
    facturasdetallebultos: TFloatField;
    Panel11: TPanel;
    Button3: TButton;
    gridfacturasaexcel: TDBGrid;
    qfacturasclientes: TZReadOnlyQuery;
    qfacturasclientesserie: TWideStringField;
    qfacturasclientesid: TIntegerField;
    qfacturasclientesidempresa: TIntegerField;
    qfacturasclientesidcliente: TIntegerField;
    qfacturasclientesiddestino: TWideStringField;
    qfacturasclientesnif: TWideStringField;
    qfacturasclientesdireccion: TWideStringField;
    qfacturasclientespoblacion: TWideStringField;
    qfacturasclientesprovincia: TWideStringField;
    qfacturasclientescodpost: TWideStringField;
    qfacturasclientesfecha: TDateField;
    qfacturasclientesreferencia: TWideStringField;
    qfacturasclientestelefono: TWideStringField;
    qfacturasclientesnomcliente: TWideStringField;
    qfacturasclientespaiscliente: TWideStringField;
    qfacturasclientesnomdestino: TWideStringField;
    qfacturasclientesdirecciondestino: TWideStringField;
    qfacturasclientespoblaciondestino: TWideStringField;
    qfacturasclientescodpostdestino: TWideStringField;
    qfacturasclientesprovinciadestino: TWideStringField;
    qfacturasclientespaisdestino: TWideStringField;
    qfacturasclientesneto: TFloatField;
    qfacturasclientestotal: TFloatField;
    qfacturasclientesfacturado: TIntegerField;
    qfacturasclientesdocumento: TWideStringField;
    qfacturasclientesdescuento_lin: TFloatField;
    qfacturasclientesdescuento_com: TFloatField;
    qfacturasclientesdescuento_pp: TFloatField;
    qfacturasclientesdescuento_total: TFloatField;
    qfacturasclientestotaliva: TFloatField;
    qfacturasclientesobservaciones: TWideStringField;
    qfacturasclientesbultos: TFloatField;
    qfacturasclienteskilos: TFloatField;
    qfacturasclientesidformapago: TIntegerField;
    qfacturasclientesserie_1: TWideStringField;
    qfacturasclientesidfactura: TIntegerField;
    qfacturasclienteside: TIntegerField;
    qfacturasclientesbase: TFloatField;
    qfacturasclientestipo: TFloatField;
    qfacturasclientesiva: TFloatField;
    dsqfacturasclientes: TDataSource;
    SaveDialog1: TSaveDialog;
    qclientesexento_iva: TIntegerField;
    facturascobrado: TIntegerField;
    DBCheckBox2: TDBCheckBox;
    Panel15: TPanel;
    listaclientes: TZQuery;
    listaclientesnif: TWideStringField;
    listaclientesnomcliente: TWideStringField;
    combolistcliente: TDBLookupComboBox;
    combolistdestinos: TDBLookupComboBox;
    listadestinos: TZQuery;
    dslistadestinos: TDataSource;
    dslistacliente: TDataSource;
    listadestinosnomdestino: TWideStringField;
    Button7: TButton;
    Label32: TLabel;
    Label33: TLabel;
    Label34: TLabel;
    Label35: TLabel;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    procedure dsfacturasStateChange(Sender: TObject);
    procedure dsfacturasDataChange(Sender: TObject; Field: TField);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure btfimportarClick(Sender: TObject);
    procedure btfnuevoClick(Sender: TObject);
    procedure comboseriesCloseUp(Sender: TObject);
    procedure comboseriesEnter(Sender: TObject);
    procedure comboclientesEnter(Sender: TObject);
    procedure comboclientesCloseUp(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure combodestinosEnter(Sender: TObject);
    procedure combodestinosCloseUp(Sender: TObject);
    procedure btfborrarClick(Sender: TObject);
    procedure btfmodificarClick(Sender: TObject);
    procedure btfguardarClick(Sender: TObject);
    procedure facturasdetalleBeforePost(DataSet: TDataSet);
    procedure facturasdetalleAfterPost(DataSet: TDataSet);
    procedure Button16Click(Sender: TObject);
    procedure DBGrid6TitleClick(Column: TColumn);
    procedure btfcancelarClick(Sender: TObject);
    procedure btfanteriorClick(Sender: TObject);
    procedure btfsiguienteClick(Sender: TObject);
    procedure btfimprimirClick(Sender: TObject);
    procedure DBGrid5KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBGrid5ColExit(Sender: TObject);
    procedure qarticulosBeforeOpen(DataSet: TDataSet);
    procedure Button3Click(Sender: TObject);
    procedure TabSheet4Show(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  facturas: Tfacturas;
  filtro,iddetalle:string;

implementation

{$R *.dfm}

uses fselectalbaranes,fbuscararticulos;
procedure TFacturas.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 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
  if (ProgressBarXls <> nil) then
    ProgressBarInit;

  // 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 Tfacturas.btfcancelarClick(Sender: TObject);
begin
    facturas.Cancel;
    paneldatos.Enabled:=false;
end;

procedure Tfacturas.btfguardarClick(Sender: TObject);
var empresa,serie:string;
begin
    empresa:=facturasidempresa.AsString;
    serie:=facturasserie.AsString;
    qaux.sql.clear;
    facturas.Post;
    qaux.sql.clear;
    qaux.SQL.Add('select max(id) from facturas where idempresa='+empresa+' and serie='+''''+serie+'''');
    qaux.Open;
    qseries.edit;
    qseriesnum_factura.Value:=qaux.Fields[0].AsInteger+1;
    qseries.Post;
    facturasdetalle.open;
    qfacturasiva.open;
    facturas.Refresh;
    facturasdetalle.Refresh;
    qfacturasiva.Refresh;
    paneldatos.Enabled:=false;
end;

procedure Tfacturas.btfimportarClick(Sender: TObject);
begin
    seleccionaralbaranes := Tseleccionaralbaranes.Create(nil);
    try
      seleccionaralbaranes.showmodal();
    finally
      seleccionaralbaranes.Free;
    end;
    facturas.Refresh;
    qfacturasiva.refresh;
end;

procedure Tfacturas.btfimprimirClick(Sender: TObject);
var filtro,documento,formapago:string;
    desg_ivas,tipo,base,iva:string;
    x:integer;
    fecha:tdate;
begin
    if listaimpresion.ItemIndex=0 then
    begin
       facturasdetalle.Close;
       facturasdetalle.SQL.Clear;
       facturasdetalle.SQL.Add('select idempresa,idfactura,sum(cantidad) as cantidad,precio,descuento,sum(base) as base,descripcion,cal,sum(bultos) as bultos,tipoiva,sum(iva) as iva,sum(total) as total,id,'+''''''+' as idarticulo,sum(totaldescuento) as totaldescuento,'+''''''+' as lote,serie ');
       facturasdetalle.SQL.Add(' from facturas_detalles group by idempresa,idfactura,descripcion,cal,precio');
       facturasdetalle.open;
    end;
    if listaimpresion.ItemIndex=1 then
    begin
       facturasdetalle.Close;
       facturasdetalle.SQL.Clear;
       facturasdetalle.SQL.Add('select * from facturas_detalles');
       facturasdetalle.open;
    end;
    filtro:='id=';
    filtro:=filtro+facturasid.asstring;
    filtro:=filtro+' and serie='+''''+ facturasserie.AsString+'''';
    documento:=qseriesimp_factura.asstring;
    facturas.Filter:=filtro;
    facturas.filtered:=true;
    fecha:=facturasfecha.AsDateTime;
    fecha:=fecha+qformaspagodias.asinteger;
    formapago:='FORMA DE PAGO: '+qformaspagodescripcion.AsString+' FECHA DE VENCIMIENTO EL '+DATETOSTR(FECHA);
    qfacturasiva.First;
    desg_ivas:='';
    while not qfacturasiva.Eof do
    begin
    if qfacturasivabase.AsFloat>0 then
      begin
         tipo:=format('%2d',[qfacturasivatipo.asinteger]);
         base:=format('%10.2f',[qfacturasivabase.Asfloat]);
         iva:=format('%8.2f',[qfacturasivaiva.asfloat]);
         desg_ivas:=desg_ivas+tipo+base+iva+' ';
      end;
      qfacturasiva.Next;
    end;
    inffactura.Datasource:=dsfacturas;
    infdetallefactura.Datasource:=dsfacturasdetalle;
    inffacturaivas.Datasource:=dsqfacturasiva;
    informe.Report.Clear;
    informe.LoadFromFile('c:\agrigest\informes\'+documento+'.fr3');
    informe.Variables.Variables['FORMAPAGO']:=QUOTEDSTR(formapago);
    informe.Variables.Variables['DESGIVAS']:=QUOTEDSTR(desg_ivas);

    informe.ShowReport();
    informe.Clear;
//    informe.Variables.Variables['TITULO']:=QUOTEDSTR(panel100.Caption);
    facturas.filtered:=false;

end;

procedure Tfacturas.btfmodificarClick(Sender: TObject);
begin
    paneldatos.Enabled:=true;
    facturas.Edit;
    qclientes.Close;
    qclientes.SQL.Clear;
    qclientes.SQL.Add('select * from clientes order by nombre');
    qclientes.open;
    qdestinos.Close;
    qdestinos.SQL.Clear;
    qdestinos.SQL.Add('select * from clientes_destinos order by descripcion');
    qdestinos.open;
end;

procedure Tfacturas.btfanteriorClick(Sender: TObject);
begin
    facturas.Next;
end;

procedure Tfacturas.btfborrarClick(Sender: TObject);
begin
    facturasdetalle.open;
    if facturas.recordcount>0 then
    begin
        facturas.Delete;
        facturasdetalle.Refresh;
        qalbaranes.Refresh;
        qalbaranes2.Refresh;
        qalbaranesdetalle.Refresh;
        qalbaranesdetalle2.Refresh;
        qfacturasiva.refresh;
    end;
end;

procedure Tfacturas.btfnuevoClick(Sender: TObject);
begin
    paneldatos.Enabled:=true;
    comboseries.SetFocus;
    comboseries.KeyValue:=qseriesid.Asstring;
    //fechaalbaran.Date:=date;

    facturas.Append;
    qclientes.Close;
    qclientes.SQL.Clear;
    qclientes.SQL.Add('select * from clientes order by nombre');
    qclientes.open;
    qdestinos.Close;
    qdestinos.SQL.Clear;
    qdestinos.SQL.Add('select * from clientes_destinos order by descripcion');
    qdestinos.open;
    facturasdetalle.Close;
    qfacturasiva.close;
    facturasfecha.Value:=date;
end;

procedure Tfacturas.btfsiguienteClick(Sender: TObject);
begin
    facturas.Prior;
end;

procedure Tfacturas.Button16Click(Sender: TObject);
var serie,id:string;
begin
    if facturasdetalle.recordcount>0 then
    begin
        serie:=facturasserie.AsString;
        id:=facturasid.AsString;
        facturasdetalle.Delete;
//1        facturas.Refresh;
//        facturas.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive,lopartialkey]);
        qfacturasiva.Refresh;
    end;
end;

procedure Tfacturas.Button3Click(Sender: TObject);
var  archivo:string;
begin
    qfacturasclientes.Close;
    qfacturasclientes.SQL.Clear;
    qfacturasclientes.SQL.Add('select * from facturas f,facturas_iva fi where f.idempresa=fi.ide and f.serie=fi.serie and f.id=fi.idfactura order by f.serie,fecha desc,f.id desc');
    qfacturasclientes.open;
    savedialog1.FileName:='FACTURAS CLIENTES.xls';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
    try
    Exportaraexcel(archivo,'facturas',gridfacturasaexcel);
    finally
      showmessage('Los datos han sido exportados correctamente');

    end;

end;

procedure Tfacturas.comboseriesCloseUp(Sender: TObject);
begin
    facturasid.value:=qseriesnum_factura.AsInteger;
end;

procedure Tfacturas.comboseriesEnter(Sender: TObject);
begin
    comboseries.DropDown;
end;

procedure Tfacturas.DBGrid5ColExit(Sender: TObject);
begin

  if facturasdetalle.State in [dsedit,dsinsert] then
  begin
    if dbgrid5.SelectedIndex=0 then
    begin
        filtro:=facturasdetalleidarticulo.asstring;
        qarticulos.Close;
        qarticulos.Open;
        if qarticulos.RecordCount>0 then
        begin
           qtipos_iva.Open;
           facturasdetalledescripcion.value:=qarticulosdescripcion.AsString;
           if qclientesexento_iva.AsInteger=0 then facturasdetalletipoiva.value:=qtipos_ivatipo.Asfloat
            else facturasdetalletipoiva.value:=0;
           qtipos_ivatipo.Asfloat;
        end;
    end;
  end;

end;

procedure Tfacturas.DBGrid5KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if (key=115) then
    begin
      buscararticulos := Tbuscararticulos.Create(nil);
      try
        fbuscararticulos.padre:=facturas.Name;
        fbuscararticulos.filtro:=facturasdetalleidarticulo.AsString;
        buscararticulos.Edit1.Text:=facturasdetalleidarticulo.AsString;
        buscararticulos.showmodal();
      finally
        if facturasdetalle.State in [dsbrowse] then facturasdetalle.Edit;
        facturasdetalleidarticulo.Value:=buscararticulos.qarticuloscodigo.AsString;
        facturasdetalledescripcion.value:=buscararticulos.qarticulosdescripcion.AsString;
        facturasdetalletipoiva.value:=buscararticulos.qtipos_ivatipo.Asfloat;
        buscararticulos.Free;
      end;
    end;

end;

procedure Tfacturas.DBGrid6TitleClick(Column: TColumn);
var
  st:ZAbstractRODataset.TSortType;
begin
  st:=facturas.SortType;
  facturas.SortedFields:=Column.FieldName;
  If st = stAscending then facturas.SortType:=stDescending else facturas.SortType:=stAscending;
  dsfacturas.DataSet.First;

end;

procedure Tfacturas.comboclientesCloseUp(Sender: TObject);
begin
    facturasnomcliente.value:=qclientesnombre.Asstring;
    facturasnif.value:=qclientesnif.Asstring;
    facturasdireccion.value:=qclientesdireccion.Asstring;
    facturasprovincia.value:=qclientesprovincia.Asstring;
    facturaspoblacion.Value:=qclientespoblacion.AsString;
    facturascodpost.value:=qclientescodpost.Asstring;
    facturaspaiscliente.value:=qclientespais.Asstring;
    facturasidformapago.Value:=qclientesidformapago.asinteger;
end;

procedure Tfacturas.comboclientesEnter(Sender: TObject);
begin
   comboclientes.dropdown;
end;

procedure Tfacturas.combodestinosCloseUp(Sender: TObject);
begin
    facturasnomdestino.value:=qdestinosdescripcion.Asstring;
    facturasdirecciondestino.value:=qdestinosdireccion.Asstring;
    facturasprovinciadestino.value:=qdestinosprovincia.Asstring;
    facturaspoblaciondestino.Value:=qdestinospoblacion.AsString;
    facturascodpostdestino.value:=qdestinoscodpost.Asstring;
    facturaspaisdestino.value:=qdestinospais.Asstring;
end;

procedure Tfacturas.combodestinosEnter(Sender: TObject);
begin
    combodestinos.DropDown;
end;

procedure Tfacturas.dsfacturasDataChange(Sender: TObject; Field: TField);
begin
if (facturas.State in [dsbrowse]) and (facturas.recordcount>0) then
begin
    qalbaranes2.Close;
    qalbaranes2.SQL.Clear;
    qalbaranes2.SQL.Add('select * from albaranes where');
    qalbaranes2.SQL.Add(' idfactura='+facturasid.AsString+' and serie='+''''+facturasserie.AsString+''''+' and idempresa='+facturasidempresa.AsString+' order by serie desc, id desc');
    qalbaranes2.Open;
    qclientes.Close;
    qclientes.SQL.Clear;
    qclientes.SQL.Add('select * from clientes where idempresa='+facturasidempresa.asstring+' and id='+facturasidcliente.asstring);
    qclientes.open;
    qdestinos.Close;
    qdestinos.SQL.Clear;
    qdestinos.SQL.Add('select * from clientes_destinos where idempresa='+facturasidempresa.asstring+' and idcliente='+facturasidcliente.asstring+' and codigo='+''''+facturasiddestino.asstring+'''');
    qdestinos.open;
end;
end;
procedure Tfacturas.dsfacturasStateChange(Sender: TObject);
begin
    if facturas.State in [dsedit,dsinsert] then
    begin
        btfnuevo.Enabled:=false;
        btfmodificar.Enabled:=false;
        btfborrar.Enabled:=false;
        btfcancelar.Enabled:=true;
        btfguardar.Enabled:=true;
        qdestinos.Close;
        qclientes.Close;
        qdestinos.LinkedFields:='Idempresa;idcliente';
        qdestinos.MasterFields:='Idempresa;id';
        qdestinos.Mastersource:=dsqclientes;
        qclientes.open;
        qdestinos.Open;
    end else
    begin
        btfnuevo.Enabled:=true;
        btfmodificar.Enabled:=true;
        btfborrar.Enabled:=true;
        btfcancelar.Enabled:=false;
        btfguardar.Enabled:=false;
        qclientes.Close;
        qdestinos.Close;
        qdestinos.LinkedFields:='';
        qdestinos.MasterFields:='';
        qdestinos.Mastersource:=nil;
        qclientes.open;
        qdestinos.Open;

    end;
end;

procedure Tfacturas.facturasdetalleAfterPost(DataSet: TDataSet);
var serie,id:string;
begin
    serie:=facturasserie.AsString;
    id:=facturasid.AsString;
    facturas.Refresh;
    facturas.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive]);
    qfacturasiva.Refresh;
    if iddetalle<>'' then facturasdetalle.Locate('id',iddetalle,[locaseinsensitive]) else facturasdetalle.Last;

end;

procedure Tfacturas.facturasdetalleBeforePost(DataSet: TDataSet);
var iva,descuento:real;
begin
    if facturasdetalletipoiva.AsString='' then facturasdetalletipoiva.Value:=0;
    if facturasdetalledescuento.AsString='' then facturasdetalledescuento.Value:=0;
    facturasdetalleserie.Value:=facturasserie.Asstring;
    facturasdetallebase.Value:=roundto(facturasdetalleprecio.AsFloat*facturasdetallecantidad.AsFloat,-2);

    descuento:=roundto(facturasdetallebase.AsFloat*(facturasdetalledescuento.AsFloat/100),-2);
    facturasdetalletotaldescuento.value:=descuento;
    facturasdetalletotal.Value:=roundto(facturasdetallebase.Asfloat-descuento,-2);
    iva:=roundto(facturasdetalletotal.AsFloat*(facturasdetalletipoiva.AsFloat/100),-2);
    facturasdetalleiva.Value:=iva;
    if facturasdetalle.State in [dsedit] then iddetalle:=facturasdetalleid.AsString else iddetalle:='';


end;

procedure Tfacturas.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if (activecontrol is tdbgrid) then
    begin
        if Key = 13 then Key :=9;
    end;

end;

procedure Tfacturas.FormKeyPress(Sender: TObject; var Key: Char);
var formatos:tformatsettings;
punto:string;
begin
    GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatos);
    punto:=formatos.DecimalSeparator;
    if punto=',' then
    begin
        key:=upcase(key);
        if (key='.') and (activecontrol is tdbedit) then
        begin
           if  (activecontrol as tdbedit).Field.DataType in [ftfloat,ftCurrency,ftbcd,ftfmtbcd] then key:=','
        end;
        if (key='.') and (activecontrol is tdbgrid) then
        begin
            key:=',';
        end;
    end;
    if (activecontrol is tdbgrid) then
    begin
        if Key = #13 then Key :=#9;
    end;

    if (key=#13) then
    begin
        Perform(WM_NextDLGCtl,0,0);
        key:=#0;
    end;
end;

procedure Tfacturas.FormShow(Sender: TObject);
begin
    dm.tempresa.Open;
    qseries.Close;
    qdestinos.Close;
    qclientes.Close;
    qalbaranes.Close;
    qalbaranes2.close;
    qalbaranesdetalle.Close;
    qalbaranesdetalle2.Close;
    facturas.Close;
    facturasdetalle.Close;
    qfacturasiva.Close;
    qformaspago.Close;
    qarticulos.Close;
    qtipos_iva.Close;

    qseries.open;
    qdestinos.open;
    qclientes.open;
    qalbaranes.open;
    qalbaranes2.open;
    qalbaranesdetalle.open;
    qalbaranesdetalle2.open;
    facturas.open;
    facturasdetalle.open;
    qfacturasiva.open;
    qformaspago.open;
    qarticulos.open;
    qtipos_iva.open;
end;

procedure Tfacturas.qarticulosBeforeOpen(DataSet: TDataSet);
var filtrolocal:string;
begin
    filtrolocal:='';
    filtrolocal:=' and (descripcion like('+''''+'%'+filtro+'%'+''''+') or codigo like('+''''+'%'+filtro+'%'+''''+'))';
    qarticulos.SQL.Clear;
    qarticulos.SQL.Add('select * from articulosf where activo=1 and facturable=1'+filtrolocal+' order by descripcion');

end;

procedure Tfacturas.TabSheet4Show(Sender: TObject);
begin
    fdesde.Date:=date();
    fhasta.Date:=date();
    facturas.Close;
    facturas.SQL.Clear;
    facturas.SQL.Add('select * from facturas order by serie desc,id desc');
    facturas.Open;
    listaclientes.Close;
    listadestinos.Close;
    listaclientes.Open;
    listadestinos.Open;
end;

end.
