unit falbaranes;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Data.DB,
  ZAbstractRODataset, ZAbstractDataset, ZDataset, Vcl.DBCtrls,datos, Vcl.Mask,
  Vcl.Grids, Vcl.DBGrids, Vcl.ComCtrls, frxClass, frxDBSet,  ComObj, Excel2000,
  frxExportPDF, frxExportBaseDialog, System.Math, Vcl.Menus;
type
  Talbaranes = class(TForm)
    Panel1: TPanel;
    Panel4: TPanel;
    btAcancelar: TButton;
    btAmodificar: TButton;
    btAborrar: TButton;
    btAnuevo: TButton;
    btAguardar: TButton;
    Panel2: TPanel;
    dsalbaranes: TDataSource;
    dsalbaranesdetalle: TDataSource;
    albaranes: TZQuery;
    albaranesdetalle: TZQuery;
    Panel3: TPanel;
    comboserie: TDBLookupComboBox;
    qseries: TZQuery;
    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;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    DBEdit1: TDBEdit;
    comboclientes: TDBLookupComboBox;
    combodestinos: TDBLookupComboBox;
    Label5: TLabel;
    DBEdit2: TDBEdit;
    dsqclientes: TDataSource;
    qclientes: TZQuery;
    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;
    dsqdestinos: TDataSource;
    qdestinos: TZQuery;
    qdestinoscodigo: TWideStringField;
    qdestinosidcliente: TIntegerField;
    qdestinosidempresa: TIntegerField;
    qdestinosdescripcion: TWideStringField;
    qdestinosseleccionado: TIntegerField;
    qdestinosactivo: TIntegerField;
    qdestinosdireccion: TWideStringField;
    qdestinospoblacion: TWideStringField;
    qdestinoscodpost: TWideStringField;
    qdestinosprovincia: TWideStringField;
    Label6: TLabel;
    Label7: TLabel;
    DBText3: TDBText;
    DBText4: TDBText;
    DBText5: TDBText;
    DBText6: TDBText;
    DBText7: TDBText;
    DBText8: TDBText;
    DBText9: TDBText;
    DBText10: TDBText;
    qclientespais: TWideStringField;
    qdestinospais: TWideStringField;
    DBText11: TDBText;
    DBText12: TDBText;
    DBText13: TDBText;
    DBText14: TDBText;
    DBText15: TDBText;
    dsqpedidos: TDataSource;
    qpedidos: TZQuery;
    dsqpedidosdetalle: TDataSource;
    qpedidosdetalle: TZQuery;
    qpedidosdetalleid: TIntegerField;
    qpedidosdetalleide: TIntegerField;
    qpedidosdetalleidpedido: TIntegerField;
    qpedidosdetalleidcliente: TIntegerField;
    qpedidosdetalleidproductocli: TWideStringField;
    qpedidosdetalleidenvase: TWideStringField;
    qpedidosdetalledesc_envase: TWideStringField;
    qpedidosdetalledesc_producto: TWideStringField;
    qpedidosdetallecantidad: TFloatField;
    qpedidosdetallecantidadservida: TFloatField;
    qpedidosdetallepalets: TIntegerField;
    qpedidosdetalleref: TWideStringField;
    qpedidosdetalleean: TWideStringField;
    qpedidosdetallemarca: TWideStringField;
    qpedidosdetalleobservaciones: TWideStringField;
    qpedidosdetalleidcajapropia: TWideStringField;
    qpedidosid: TIntegerField;
    qpedidoside: TIntegerField;
    qpedidosidcliente: TIntegerField;
    qpedidosiddestino: TWideStringField;
    qpedidosfecha_pedido: TDateField;
    qpedidosfecha_entrega: TDateField;
    qpedidoscliente: TWideStringField;
    qpedidosdestino: TWideStringField;
    dsqalbaranesiva: TDataSource;
    qalbaranesiva: TZQuery;
    albaranesid: TIntegerField;
    albaranesidempresa: TIntegerField;
    albaranesidcliente: TIntegerField;
    albaranesiddestino: TWideStringField;
    albaranesnif: TWideStringField;
    albaranesdireccion: TWideStringField;
    albaranespoblacion: TWideStringField;
    albaranesprovincia: TWideStringField;
    albaranescodpost: TWideStringField;
    albaranesfecha: TDateField;
    albaranesreferencia: TWideStringField;
    albaranestelefono: TWideStringField;
    albaranesnomcliente: TWideStringField;
    albaranespaiscliente: TWideStringField;
    albaranesnomdestino: TWideStringField;
    albaranesdirecciondestino: TWideStringField;
    albaranespoblaciondestino: TWideStringField;
    albaranescodpostdestino: TWideStringField;
    albaranesprovinciadestino: TWideStringField;
    albaranespaisdestino: TWideStringField;
    albaranesneto: TFloatField;
    albaranestotal: TFloatField;
    albaranesfacturado: TIntegerField;
    albaranesdocumento: TWideStringField;
    dsqpedidos2: TDataSource;
    dsqpedidosdetalle2: TDataSource;
    qpedidosdetalle2: TZQuery;
    qpedidos2: TZQuery;
    IntegerField8: TIntegerField;
    IntegerField9: TIntegerField;
    IntegerField10: TIntegerField;
    WideStringField11: TWideStringField;
    DateField1: TDateField;
    DateField2: TDateField;
    WideStringField12: TWideStringField;
    WideStringField13: TWideStringField;
    Panel5: TPanel;
    qalbaranesivaidalbaran: TIntegerField;
    qalbaranesivaide: TIntegerField;
    qalbaranesivabase: TFloatField;
    qalbaranesivatipo: TFloatField;
    qalbaranesivaiva: TFloatField;
    Panel6: TPanel;
    DBGrid1: TDBGrid;
    albaranesdescuento_lin: TFloatField;
    albaranesdescuento_com: TFloatField;
    albaranesdescuento_pp: TFloatField;
    albaranesdescuento_total: TFloatField;
    albaranestotaliva: TFloatField;
    Label9: TLabel;
    DBEdit4: TDBEdit;
    Label12: TLabel;
    DBEdit7: TDBEdit;
    Label13: TLabel;
    DBEdit8: TDBEdit;
    Label14: TLabel;
    DBEdit9: TDBEdit;
    btaimprimir: TButton;
    btaimportar: TButton;
    btafacturar: TButton;
    DBGrid2: TDBGrid;
    Panel7: TPanel;
    Button4: TButton;
    qpedidosdetalle2id: TIntegerField;
    qpedidosdetalle2ide: TIntegerField;
    qpedidosdetalle2idpedido: TIntegerField;
    qpedidosdetalle2idcliente: TIntegerField;
    qpedidosdetalle2idproductocli: TWideStringField;
    qpedidosdetalle2idenvase: TWideStringField;
    qpedidosdetalle2desc_envase: TWideStringField;
    qpedidosdetalle2desc_producto: TWideStringField;
    qpedidosdetalle2cantidad: TFloatField;
    qpedidosdetalle2cantidadservida: TFloatField;
    qpedidosdetalle2palets: TIntegerField;
    qpedidosdetalle2ref: TWideStringField;
    qpedidosdetalle2ean: TWideStringField;
    qpedidosdetalle2marca: TWideStringField;
    qpedidosdetalle2observaciones: TWideStringField;
    qpedidosdetalle2idcajapropia: TWideStringField;
    DBCheckBox1: TDBCheckBox;
    DBMemo1: TDBMemo;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    DBGrid3: TDBGrid;
    btasiguiente: TButton;
    btaanterior: TButton;
    infalbaran: TfrxDBDataset;
    infdetallealbaran: TfrxDBDataset;
    infalbaranivas: TfrxDBDataset;
    informe: TfrxReport;
    albaranesobservaciones: TWideStringField;
    Label15: TLabel;
    DBMemo2: TDBMemo;
    qaux: TZQuery;
    albaranesidfactura: TIntegerField;
    qalbaranesivaserie: TWideStringField;
    qseriesimp_albaran: TWideStringField;
    qseriesimp_factura: TWideStringField;
    albaranesserie: TWideStringField;
    qpedidosdetalleidalbaran: TWideStringField;
    qpedidosdetalleidexpedicion: TWideStringField;
    qpedidosdetalle2idalbaran: TWideStringField;
    qpedidosdetalle2idexpedicion: TWideStringField;
    albaranesbultos: TFloatField;
    albaraneskilos: TFloatField;
    albaranesidformapago: TIntegerField;
    Label16: TLabel;
    comboformapago: TDBLookupComboBox;
    dsqformaspago: TDataSource;
    qformaspago: TZQuery;
    qformaspagoide: TIntegerField;
    qformaspagoid: TIntegerField;
    qformaspagocodigo: TWideStringField;
    qformaspagodescripcion: TWideStringField;
    qformaspagodias: TIntegerField;
    qclientesidformapago: TIntegerField;
    listaimpresion: TComboBox;
    albaranesdetalleidempresa: TIntegerField;
    albaranesdetalleidalbaran: TIntegerField;
    albaranesdetallecantidad: TFloatField;
    albaranesdetalleprecio: TFloatField;
    albaranesdetalledescuento: TFloatField;
    albaranesdetallebase: TFloatField;
    albaranesdetallecal: TWideStringField;
    albaranesdetallebultos: TFloatField;
    albaranesdetalletipoiva: TFloatField;
    albaranesdetalleiva: TFloatField;
    albaranesdetalletotal: TFloatField;
    albaranesdetalleid: TIntegerField;
    albaranesdetalletotaldescuento: TFloatField;
    albaranesdetalleserie: TWideStringField;
    albaranesdetalleidarticulo: TWideStringField;
    albaranesdetallelote: TWideStringField;
    qarticulos: TZReadOnlyQuery;
    dsqarticulos: TDataSource;
    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;
    qtipos_iva: TZReadOnlyQuery;
    dsqtiposiva: TDataSource;
    qtipos_ivaid: TIntegerField;
    qtipos_ivadescripcion: TWideStringField;
    qtipos_ivatipo: TIntegerField;
    qtipos_ivatipo_req: TFloatField;
    albaranescoste_transporte: TFloatField;
    costetrans: TDBEdit;
    Label17: TLabel;
    qalbaranesclientes: TZReadOnlyQuery;
    dsqalbaranesclientes: TDataSource;
    albaranesdetallecoste_transporte: TFloatField;
    albaranesdetallecoste_otros: TFloatField;
    Panel11: TPanel;
    gridalbaranesaexcel: TDBGrid;
    SaveDialog1: TSaveDialog;
    qclientesexento_iva: TIntegerField;
    Label18: TLabel;
    DBEdit10: TDBEdit;
    albaranespeso_bruto: TFloatField;
    albaranesprov_transporte: TWideStringField;
    qpedidospedidocliente: TWideStringField;
    qpedidos2pedidocliente: TWideStringField;
    frxPDFExport1: TfrxPDFExport;
    dsfacturas: TDataSource;
    dsfacturasdetalle: TDataSource;
    facturasdetalle: TZQuery;
    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;
    facturasdetalleserie: TWideStringField;
    facturasdetallebultos: TFloatField;
    facturas: TZQuery;
    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;
    facturasserie: TWideStringField;
    facturasbultos: TFloatField;
    facturaskilos: TFloatField;
    facturasidformapago: TIntegerField;
    facturascobrado: TIntegerField;
    Edit1: TEdit;
    Label19: TLabel;
    Button1: TButton;
    Label20: TLabel;
    combocuenta: TDBLookupComboBox;
    Label21: TLabel;
    qclientescomision: TFloatField;
    qcuentas: TZReadOnlyQuery;
    dsqcuentas: TDataSource;
    albaranescc_pago: TWideStringField;
    albaranesccid: TIntegerField;
    albaranescccuentabancaria: TWideStringField;
    qcuentaside: TIntegerField;
    qcuentasid: TIntegerField;
    qcuentasbanco: TWideStringField;
    qcuentascciban: TWideStringField;
    qcuentasccentidad: TWideStringField;
    qcuentasccoficina: TWideStringField;
    qcuentasccdc: TWideStringField;
    qcuentascccc: TWideStringField;
    Label22: TLabel;
    albaranescomision: TFloatField;
    albaraneskilosventa: TFloatField;
    Label8: TLabel;
    DBEdit3: TDBEdit;
    Label10: TLabel;
    DBEdit5: TDBEdit;
    albaranesnumpalets: TFloatField;
    albaranesdeca_codigo: TWideStringField;
    comision: TDBEdit;
    DBText1: TDBText;
    DBText2: TDBText;
    DBText16: TDBText;
    DBText17: TDBText;
    DBText18: TDBText;
    albaranesdetallecoste_comision: TFloatField;
    Button2: TButton;
    Button5: TButton;
    Panel8: TPanel;
    Panel9: TPanel;
    Edit2: TEdit;
    Label11: TLabel;
    Label23: TLabel;
    dsqseries2: TDataSource;
    qseries2: TZReadOnlyQuery;
    comboserie2: TDBLookupComboBox;
    RadioGroup1: TRadioGroup;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Panel10: TPanel;
    Label24: TLabel;
    Label34: TLabel;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    Label35: TLabel;
    Panel12: TPanel;
    Label32: TLabel;
    Button8: TButton;
    DBGrid4: TDBGrid;
    Panel13: TPanel;
    Label25: TLabel;
    Button6: TButton;
    DBGrid5: TDBGrid;
    Edit3: TEdit;
    Edit4: TEdit;
    qseries2ide: TIntegerField;
    qseries2id: TWideStringField;
    qseries2fechainicio: TDateField;
    qseries2fechafin: TDateField;
    qseries2num_pedcliente: TIntegerField;
    qseries2num_albaran: TIntegerField;
    qseries2num_factura: TIntegerField;
    qseries2num_expedicion: TIntegerField;
    qseries2num_pedproveedor: TIntegerField;
    qseries2imp_albaran: TWideStringField;
    qseries2imp_factura: TWideStringField;
    qseries2activo: TIntegerField;
    qseries2num_presupuesto: TIntegerField;
    qseriesactivo: TIntegerField;
    qseriesnum_presupuesto: TIntegerField;
    Panel14: TPanel;
    Button3: TButton;
    btaduplicar: TButton;
    albaranesdetalledescripcion: TWideStringField;
    albaranesdetallepesobruto: TFloatField;
    qpedidosdetalledesc_envpropio: TWideStringField;
    qpedidosdetalleidcalidad: TWideStringField;
    qpedidosdetalleidacabado: TWideStringField;
    qpedidosdetalledesc_calidad: TWideStringField;
    qpedidosdetalledesc_acabado: TWideStringField;
    qpedidosdetalleidformatopropio: TIntegerField;
    qpedidosdetalledesc_formatopropio: TWideStringField;
    Button7: TButton;
    comboformulario: TDBLookupComboBox;
    qformularios: TZReadOnlyQuery;
    dsqformularios: TDataSource;
    qformularioside: TIntegerField;
    qformulariosid: TIntegerField;
    qformulariosformulario: TWideStringField;
    qformulariosdescripcion: TWideStringField;
    qformulariosaplicar_a: TWideStringField;
    qformulariospordefecto: TIntegerField;
    Label26: TLabel;
    DBLookupComboBox1: TDBLookupComboBox;
    albaranesdetalleidfactura: TIntegerField;
    qalbaranesclientesserie: TWideStringField;
    qalbaranesclientesid: TIntegerField;
    qalbaranesclientesidempresa: TIntegerField;
    qalbaranesclientesidcliente: TIntegerField;
    qalbaranesclientesiddestino: TWideStringField;
    qalbaranesclientesnif: TWideStringField;
    qalbaranesclientesdireccion: TWideStringField;
    qalbaranesclientespoblacion: TWideStringField;
    qalbaranesclientesprovincia: TWideStringField;
    qalbaranesclientescodpost: TWideStringField;
    qalbaranesclientesfecha: TDateField;
    qalbaranesclientesreferencia: TWideStringField;
    qalbaranesclientestelefono: TWideStringField;
    qalbaranesclientesnomcliente: TWideStringField;
    qalbaranesclientespaiscliente: TWideStringField;
    qalbaranesclientesnomdestino: TWideStringField;
    qalbaranesclientesdirecciondestino: TWideStringField;
    qalbaranesclientespoblaciondestino: TWideStringField;
    qalbaranesclientescodpostdestino: TWideStringField;
    qalbaranesclientesprovinciadestino: TWideStringField;
    qalbaranesclientespaisdestino: TWideStringField;
    qalbaranesclientesneto: TFloatField;
    qalbaranesclientestotal: TFloatField;
    qalbaranesclientesfacturado: TIntegerField;
    qalbaranesclientesdocumento: TWideStringField;
    qalbaranesclientesdescuento_lin: TFloatField;
    qalbaranesclientesdescuento_com: TFloatField;
    qalbaranesclientesdescuento_pp: TFloatField;
    qalbaranesclientesdescuento_total: TFloatField;
    qalbaranesclientestotaliva: TFloatField;
    qalbaranesclientesobservaciones: TWideStringField;
    qalbaranesclientesidfactura: TIntegerField;
    qalbaranesclientesbultos: TFloatField;
    qalbaranesclienteskilos: TFloatField;
    qalbaranesclientesidformapago: TIntegerField;
    qalbaranesclientescc_pago: TWideStringField;
    qalbaranesclientescoste_transporte: TFloatField;
    qalbaranesclientespeso_bruto: TFloatField;
    qalbaranesclientesprov_transporte: TWideStringField;
    qalbaranesclientesccid: TIntegerField;
    qalbaranesclientescccuentabancaria: TWideStringField;
    qalbaranesclientescomision: TFloatField;
    qalbaranesclienteskilosventa: TFloatField;
    qalbaranesclientesnumpalets: TFloatField;
    qalbaranesclientesid_1: TIntegerField;
    qalbaranesclientesidempresa_1: TIntegerField;
    qalbaranesclientesserie_1: TWideStringField;
    qalbaranesclientesidalbaran: TIntegerField;
    qalbaranesclientesidarticulo: TWideStringField;
    qalbaranesclientesdescripcion: TWideStringField;
    qalbaranesclientescal: TWideStringField;
    qalbaranesclienteslote: TWideStringField;
    qalbaranesclientesbultos_1: TFloatField;
    qalbaranesclientescantidad: TFloatField;
    qalbaranesclientesprecio: TFloatField;
    qalbaranesclientesdescuento: TFloatField;
    qalbaranesclientestotaldescuento: TFloatField;
    qalbaranesclientesbase: TFloatField;
    qalbaranesclientestipoiva: TFloatField;
    qalbaranesclientesiva: TFloatField;
    qalbaranesclientestotal_1: TFloatField;
    qalbaranesclientescoste_transporte_1: TFloatField;
    qalbaranesclientescoste_otros: TFloatField;
    qalbaranesclientescoste_comision: TFloatField;
    qalbaranesclientespesobruto: TFloatField;
    qalbaranesclientesidfactura_1: TIntegerField;
    qalbaranesclientesparcela: TWideStringField;
    Label27: TLabel;
    DBEdit6: TDBEdit;
    facturascomision: TFloatField;
    facturascoste_transporte: TFloatField;
    facturasdetallecoste_transporte: TFloatField;
    facturasdetallecoste_otros: TFloatField;
    facturasdetallecoste_comision: TFloatField;
    Label28: TLabel;
    DBEdit11: TDBEdit;
    albaranesdetallepalets: TFloatField;
    qedi_cabalbaran: TZReadOnlyQuery;
    qedi_cabalbarancampo: TWideStringField;
    qedi_cabalbarantipo: TWideStringField;
    qedi_cabalbaranlongitud: TFloatField;
    qedi_cabalbaranpos_inicio: TIntegerField;
    qedi_cabalbaranpos_fin: TIntegerField;
    Button9: TButton;
    qedi_detalbaran: TZReadOnlyQuery;
    qedi_embalbaran: TZReadOnlyQuery;
    qedi_lugaresentrega: TZReadOnlyQuery;
    qedi_marcasembalaje: TZReadOnlyQuery;
    qedi_detalbarancampo: TWideStringField;
    qedi_detalbarantipo: TWideStringField;
    qedi_detalbaranlongitud: TFloatField;
    qedi_detalbaranpos_inicio: TIntegerField;
    qedi_detalbaranpos_fin: TIntegerField;
    qedi_embalbarancampo: TWideStringField;
    qedi_embalbarantipo: TWideStringField;
    qedi_embalbaranlongitud: TFloatField;
    qedi_embalbaranpos_inicio: TIntegerField;
    qedi_embalbaranpos_fin: TIntegerField;
    qedi_lugaresentregacampo: TWideStringField;
    qedi_lugaresentregatipo: TWideStringField;
    qedi_lugaresentregalongitud: TFloatField;
    qedi_lugaresentregapos_inicio: TIntegerField;
    qedi_lugaresentregapos_fin: TIntegerField;
    qedi_marcasembalajecampo: TWideStringField;
    qedi_marcasembalajetipo: TWideStringField;
    qedi_marcasembalajelongitud: TFloatField;
    qedi_marcasembalajepos_inicio: TIntegerField;
    qedi_marcasembalajepos_fin: TIntegerField;
    qedicabecera: TZReadOnlyQuery;
    qediembalajes: TZReadOnlyQuery;
    qedilocalizaciones: TZReadOnlyQuery;
    qedilinalbaran: TZReadOnlyQuery;
    qedicabeceraIDCAB: TWideStringField;
    qedicabeceraNUMDES: TIntegerField;
    qedicabeceraTIPO: TWideStringField;
    qedicabeceraFECDES: TDateField;
    qedicabeceraFECENT: TDateField;
    qedicabeceraNUMALB: TWideStringField;
    qedicabeceraFECALB: TDateField;
    qedicabeceraNUMPED: TWideStringField;
    qedicabeceraORIGEN: TWideStringField;
    qedicabeceraDESTINO: TWideStringField;
    qedicabeceraPROVEEDO: TWideStringField;
    qedicabeceraCOMPRADO: TWideStringField;
    qedicabeceraRECEPTOR: TWideStringField;
    qedicabeceraTOTQTY: TFloatField;
    qedicabeceraFECENV: TDateField;
    qedicabeceracodprov: TWideStringField;
    qedicabeceraNOMBREEMISOR: TWideStringField;
    qedicabeceraNIFEMISOR: TWideStringField;
    qedicabeceraNOMBRERECEPTOR: TWideStringField;
    qedicabeceraNOMBRECOMPRADOR: TWideStringField;
    qedicabeceraNOMBREPROVEEDOR: TWideStringField;
    qedicabeceraNOMBREPTOENTREGA: TWideStringField;
    qedicabeceraDIRECCIONEMISOR: TWideStringField;
    qedicabeceraPOBLACIONEMISOR: TWideStringField;
    qedicabeceraPROVINCIAEMISOR: TWideStringField;
    qedicabeceraCPEMISOR: TWideStringField;
    qedicabeceraDIRECCIONCOMPRADOR: TWideStringField;
    qedicabeceraPOBLACIONCOMPRADOR: TWideStringField;
    qedicabeceraPROVINCIACOMPRADOR: TWideStringField;
    qedicabeceraCPCOMPRADOR: TWideStringField;
    qedicabeceraDIRECCIONPTOENTREGA: TWideStringField;
    qedicabeceraPOBLACIONPTOENTREGA: TWideStringField;
    qedicabeceraPROVINCIAPTOENTREGA: TWideStringField;
    qedicabeceraCPPTOENTREGA: TWideStringField;
    qedicabeceraDIRECCIONRECEPTOR: TWideStringField;
    qedicabeceraPOBLACIONRECEPTOR: TWideStringField;
    qedicabeceraPROVINCIARECEPTOR: TWideStringField;
    qedicabeceraCPRECEPTOR: TWideStringField;
    qedicabeceraNIFPROVEEDOR: TWideStringField;
    qedicabeceraIMPTOTBRUTO: TFloatField;
    qedicabeceraIMPTOTNETO: TFloatField;
    qedicabeceraMONEDA: TWideStringField;
    qedicabeceraPESOBRUTOT: TFloatField;
    qedicabeceraPESONETTOT: TFloatField;
    qedicabeceraNUMTOTBUL: TFloatField;
    qedicabeceraMEDIOTRAN: TWideStringField;
    qedicabeceraORDENADOR: TWideStringField;
    qedilinalbaranIDCAB: TWideStringField;
    qedilinalbaranIDEMB: TWideStringField;
    qedilinalbaranCPSO: TFloatField;
    qedilinalbaranIDLIN: TWideStringField;
    qedilinalbaranEAN: TWideStringField;
    qedilinalbaranREFPROV: TWideStringField;
    qedilinalbaranNUMEXP: TFloatField;
    qedilinalbaranDESCRIP: TWideStringField;
    qedilinalbaranCENVFAC: TFloatField;
    qedilinalbaranCUEXP: TFloatField;
    qedilinalbaranUNICANT: TWideStringField;
    qedilinalbaranNUMPED: TWideStringField;
    qedilinalbaranNUMALB: TWideStringField;
    qedilinalbaranSSCC: TWideStringField;
    qedilinalbaranFECENV: TDateField;
    qedilinalbaranFECCON: TDateField;
    qedilinalbaranLOTE: TWideStringField;
    qedilinalbaranCANTLOC1: TFloatField;
    qedilinalbaranNOMBREPTOENTREGA: TWideStringField;
    qedilinalbaranFECPED: TDateField;
    qedilinalbaranFECALB: TDateField;
    qedilinalbaranPESTOTLIN: TFloatField;
    qedilinalbaranFECCADET: TDateField;
    qedilinalbaranPESOBRUTO: TFloatField;
    qedilinalbaranPESONETO: TFloatField;
    qediembalajesIDCAB: TWideStringField;
    qediembalajesIDEMB: TWideStringField;
    qediembalajesCPSO: TWideStringField;
    qediembalajesCPSPADRE: TWideStringField;
    qediembalajesCANTEMB: TLargeintField;
    qediembalajesTIPEMB: TWideStringField;
    qediembalajesDESCEMB: TWideStringField;
    qediembalajesPAGRET: TWideStringField;
    qediembalajesSSCC1: TWideStringField;
    qediembalajesBULTPALET: TFloatField;
    qediembalajesFORMATO: TWideStringField;
    qediembalajesIDLIN: TWideStringField;
    qediembalajesIDMARCA: TWideStringField;
    qediembalajesMARCA1: TWideStringField;
    qediembalajesFECENV: TDateField;
    qediembalajesLOTE: TWideStringField;
    qedilocalizacionesIDCAB: TWideStringField;
    qedilocalizacionesIDEMB: TFloatField;
    qedilocalizacionesIDLIN: TWideStringField;
    qedilocalizacionesIDLOC: TWideStringField;
    qedilocalizacionesLUGAR: TWideStringField;
    qedilocalizacionesFECENV: TDateField;
    qedilocalizacionesCANTIDAD: TFloatField;
    qedilocalizacionesCANTKGM: TFloatField;
    qedilocalizacionesNOMBREPTOENTREGA: TWideStringField;
    qedilocalizacionesUMEDIDA: TWideStringField;
    qedicabeceraFECPED: TDateField;
    qedicabeceraDPTO: TWideStringField;
    qedicabeceraALBARANCLIENTE: TWideStringField;
    qedilinalbaranALBARANCLIENTE: TWideStringField;
    qedilinalbaranTEXTO4: TWideStringField;
    qedilinalbaranTEXTO5: TWideStringField;
    qedicabeceraULTCONS: TWideStringField;
    qedilinalbaranNUMEXP2: TWideStringField;
    Label29: TLabel;
    ComboBox1: TComboBox;
    qpedidosdetalleunidadescaja: TIntegerField;
    qpedidosdetallefecha_caducidad: TDateField;
    qpedidosdetalleprecio: TFloatField;
    qalbaraneslotes: TZQuery;
    qalbaranespalets: TZQuery;
    qalbaranespaletsid: TIntegerField;
    qalbaranespaletside: TIntegerField;
    qalbaranespaletsids: TWideStringField;
    qalbaranespaletsida: TIntegerField;
    qalbaranespaletscantidad: TIntegerField;
    qalbaranespaletstipo_palet: TWideStringField;
    qalbaraneslotesid: TIntegerField;
    qalbaranesloteside: TIntegerField;
    qalbaraneslotesids: TWideStringField;
    qalbaraneslotesida: TIntegerField;
    qalbaranesloteslote: TWideStringField;
    qalbaraneslotesvariedad: TWideStringField;
    dsalbaranespalets: TDataSource;
    dsalbarnaeslotes: TDataSource;
    Panel15: TPanel;
    DBGrid6: TDBGrid;
    DBGrid7: TDBGrid;
    Panel16: TPanel;
    qinsertarfacturasdetalles: TZQuery;
    albaranesdetallegrupo: TZQuery;
    albaranesdetallegrupoidempresa: TIntegerField;
    albaranesdetallegrupoidalbaran: TIntegerField;
    albaranesdetallegrupocantidad: TFloatField;
    albaranesdetallegrupoprecio: TFloatField;
    albaranesdetallegrupodescuento: TFloatField;
    albaranesdetallegrupobase: TFloatField;
    albaranesdetallegrupodescripcion: TWideStringField;
    albaranesdetallegrupocal: TWideStringField;
    albaranesdetallegrupopalets: TFloatField;
    albaranesdetallegrupobultos: TFloatField;
    albaranesdetallegrupotipoiva: TFloatField;
    albaranesdetallegrupoiva: TFloatField;
    albaranesdetallegrupototal: TFloatField;
    albaranesdetallegrupoid: TIntegerField;
    albaranesdetallegrupoidarticulo: TWideStringField;
    albaranesdetallegrupototaldescuento: TFloatField;
    albaranesdetallegrupolote: TWideStringField;
    albaranesdetallegruposerie: TWideStringField;
    albaranesdetallegrupocoste_transporte: TFloatField;
    albaranesdetallegrupocoste_otros: TFloatField;
    albaranesdetallegrupocoste_comision: TFloatField;
    albaranesdetallegrupopesobruto: TFloatField;
    albaranesdetallegrupoidfactura: TIntegerField;
    albaranesdetallepais: TWideStringField;
    albaranesdetalleenvase: TWideStringField;
    albaranesdetallereferencia: TWideStringField;
    albaranesdetalleean: TWideStringField;
    albaranesdetalleunidadescaja: TIntegerField;
    albaranesdetallegrupopais: TWideStringField;
    albaranesdetallegrupoenvase: TWideStringField;
    albaranesdetallegruporeferencia: TWideStringField;
    albaranesdetallegrupoean: TWideStringField;
    albaranesdetallegrupounidadescaja: TIntegerField;
    Panel17: TPanel;
    Button10: TButton;
    Panel18: TPanel;
    Button11: TButton;
    albaranesdetallemprima: TWideStringField;
    albaranesdetalleparcela: TWideStringField;
    albaranesdetalleformato: TWideStringField;
    albaranesdetallegg: TIntegerField;
    btadeca: TButton;
    btadecaDetalle: TButton;
    btnSelTransporte: TButton;
    albaranesdetallegrupogg: TIntegerField;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure fechaalbaranEnter(Sender: TObject);
    procedure btAnuevoClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure dsalbaranesStateChange(Sender: TObject);
    procedure comboclientesCloseUp(Sender: TObject);
    procedure combodestinosCloseUp(Sender: TObject);
    procedure btAguardarClick(Sender: TObject);
    procedure albaranesdetalleBeforePost(DataSet: TDataSet);
    procedure Button4Click(Sender: TObject);
    procedure albaranesdetalleAfterPost(DataSet: TDataSet);
    procedure btaimportarClick(Sender: TObject);
    procedure btaanteriorClick(Sender: TObject);
    procedure btasiguienteClick(Sender: TObject);
    procedure btaimprimirClick(Sender: TObject);
    procedure btAmodificarClick(Sender: TObject);
    procedure btAcancelarClick(Sender: TObject);
    procedure btAborrarClick(Sender: TObject);
    procedure dsalbaranesDataChange(Sender: TObject; Field: TField);
    procedure fechaalbaranCloseUp(Sender: TObject);
    procedure albaranesBeforePost(DataSet: TDataSet);
    procedure DBGrid3TitleClick(Column: TColumn);
    procedure DBGrid2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBGrid2ColExit(Sender: TObject);
    procedure qarticulosBeforeOpen(DataSet: TDataSet);
    procedure Button3Click(Sender: TObject);
    procedure DBGrid3DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure albaranesdetalleAfterDelete(DataSet: TDataSet);
    procedure albaranesdetalleBeforeDelete(DataSet: TDataSet);
    procedure btafacturarClick(Sender: TObject);
    procedure btadecaClick(Sender: TObject);
    procedure btnSelTransporteClick(Sender: TObject);
    procedure MenuItemVehiculoClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Edit1Enter(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure comboserie2CloseUp(Sender: TObject);
    procedure dsqseries2DataChange(Sender: TObject; Field: TField);
    procedure comboserieCloseUp(Sender: TObject);
    procedure btaduplicarClick(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid2CellClick(Column: TColumn);
    procedure DBGrid3DblClick(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure albaranesBeforeDelete(DataSet: TDataSet);
    procedure qalbaraneslotesAfterInsert(DataSet: TDataSet);
    procedure qalbaranespaletsAfterInsert(DataSet: TDataSet);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);
  procedure RecalcularTotalesAlbaran(AIdEmpresa: Integer; const ASerie: string; AIdAlbaran: Integer);
  procedure RecalcularTotalesFactura(AIdEmpresa: Integer; const ASerie: string; AIdFactura: Integer);
  end;

var
  albaranes: Talbaranes;
  filtro,iddetalle:string;
  vidempresa,vidarticulo:string;
implementation

{$R *.dfm}

uses fselectpedidos, fbuscararticulos, dlgduplicar, ftraza_materiales2, uDecaEmisionAlbaranes,
  uDecaConfig,
  {$IF CompilerVersion >= 27.0}
  System.JSON;
  {$ELSE}
  Data.DBXJSON;
  {$IFEND}
procedure Talbaranes.Edit1Enter(Sender: TObject);
begin
    edit1.Text:='';
end;

procedure Talbaranes.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 Talbaranes.albaranesBeforeDelete(DataSet: TDataSet);
begin
   case dm.PedirConfirmacion('¿Confirma que desea borrar este albaran?',true,true,false) of
        mrno:Abort;
   end;
end;

procedure Talbaranes.albaranesBeforePost(DataSet: TDataSet);
begin
    if albaranes.state in [dsinsert,dsedit] then
    begin
        if albaranes.state in [dsinsert] then
        begin
          albaranesnumpalets.value:=0;
        end;

        qclientes.Close;
        qdestinos.Close;
        qdestinos.LinkedFields:='Idempresa;idcliente';
        qdestinos.MasterFields:='Idempresa;id';
        qdestinos.Mastersource:=dsqclientes;
        qclientes.open;
        qdestinos.Open;
    end;
end;

procedure Talbaranes.albaranesdetalleAfterDelete(DataSet: TDataSet);
var serie,id,idalbaran,pesobruto,pesoneto,pesonetoteorico,numpalets:string;
begin
    serie:=albaranesserie.AsString;
    id:=albaranesid.AsString;
    idalbaran:=serie+'/'+id;
    RecalcularTotalesAlbaran(albaranesidempresa.AsInteger, serie, StrToIntDef(id, 0));
    qalbaranesiva.Refresh;
    if iddetalle<>'' then albaranesdetalle.Locate('id',iddetalle,[locaseinsensitive]) else albaranesdetalle.Last;
    qaux.SQL.Clear;
    qaux.SQL.Add('select * from  ea_pesadas where idalbaran='+''''+idalbaran+''''+' and idempresa='+albaranesidempresa.asstring);
    qaux.open;
    if qaux.RecordCount>0 then
    begin
      qaux.SQL.Clear;
      qaux.SQL.Add('select sum(peso_bruto-tara0),sum(peso_neto),sum(peso_neto_teorico),sum(num_palets) from  ea_pesadas where idalbaran='+''''+idalbaran+''''+' and idempresa='+albaranesidempresa.asstring);
      qaux.open;
      pesobruto:=qaux.fields[0].asstring;
      pesobruto:=stringreplace(pesobruto,',','.',[rfreplaceall]);
      pesoneto:=qaux.fields[1].asstring;
      pesoneto:=stringreplace(pesoneto,',','.',[rfreplaceall]);
      pesonetoteorico:=qaux.fields[2].asstring;
      pesonetoteorico:=stringreplace(pesonetoteorico,',','.',[rfreplaceall]);
      numpalets:=qaux.fields[3].asstring;
      numpalets:=stringreplace(numpalets,',','.',[rfreplaceall]);
      qaux.SQL.Clear;
      qaux.SQL.Add('update albaranes set peso_bruto='+pesobruto+',kilos=+'+pesoneto+',kilosventa='+pesonetoteorico+',numpalets=+'+numpalets+' where serie='+''''+serie+''''+' and id='+id+' and idempresa='+albaranesidempresa.AsString);;
      qaux.execsql;

    end else
    begin
      qaux.SQL.Clear;
      qaux.SQL.Add('update albaranes set peso_bruto=0,kilos=0,kilosventa=0,numpalets=0 where serie='+''''+serie+''''+' and id='+id+' and idempresa='+albaranesidempresa.AsString);;
      qaux.execsql;
    end;
    albaranes.refresh;
    albaranes.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]);
end;

procedure Talbaranes.albaranesdetalleAfterPost(DataSet: TDataSet);
var serie,id,idalbaran,pesobruto,pesoneto,pesonetoteorico,numpalets:string;
begin
    serie:=albaranesserie.AsString;
    id:=albaranesid.AsString;
    idalbaran:=serie+'/'+id;
    RecalcularTotalesAlbaran(albaranesidempresa.AsInteger, serie, StrToIntDef(id, 0));
    qalbaranesiva.Refresh;

    qaux.SQL.Clear;
    qaux.SQL.Add('select * from  ea_pesadas where idalbaran='+''''+idalbaran+''''+' and idempresa='+albaranesidempresa.asstring);
    qaux.open;
    if qaux.RecordCount>0 then
    begin
      qaux.SQL.Clear;
      qaux.SQL.Add('select sum(peso_bruto-tara0),sum(peso_neto),sum(peso_neto_teorico),(select max(palets) from albaranes_detalles where idalbaran='+id+' and serie='+serie+') as numpalets from  ea_pesadas where idalbaran='+''''+idalbaran+''''+' and idempresa='+albaranesidempresa.asstring);
      qaux.open;
      pesobruto:=qaux.fields[0].asstring;
      pesobruto:=stringreplace(pesobruto,',','.',[rfreplaceall]);
      pesoneto:=qaux.fields[1].asstring;
      pesoneto:=stringreplace(pesoneto,',','.',[rfreplaceall]);
      pesonetoteorico:=qaux.fields[2].asstring;
      pesonetoteorico:=stringreplace(pesonetoteorico,',','.',[rfreplaceall]);
      numpalets:=qaux.fields[3].asstring;
      numpalets:=stringreplace(numpalets,',','.',[rfreplaceall]);
      qaux.SQL.Clear;
      qaux.SQL.Add('update albaranes set peso_bruto='+pesobruto+',kilos=+'+pesoneto+',kilosventa='+pesonetoteorico+',numpalets=+'+numpalets+' where serie='+''''+serie+''''+' and id='+id+' and idempresa='+albaranesidempresa.AsString);;
      qaux.execsql;

    end;
    albaranes.refresh;
    albaranes.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]) ;
    if iddetalle<>'' then albaranesdetalle.Locate('id',iddetalle,[locaseinsensitive]) else albaranesdetalle.Last;
end;

procedure Talbaranes.albaranesdetalleBeforeDelete(DataSet: TDataSet);
begin
   case dm.PedirConfirmacion('¿Confirma que desea borrar esta línea de albaran?',true,true,false) of
        mrno:Abort;
   end;
   vidempresa:=albaranesdetalleidempresa.AsString;
   vidarticulo:=albaranesdetalleidarticulo.asstring;
end;

procedure Talbaranes.albaranesdetalleBeforePost(DataSet: TDataSet);
var iva,descuento:real;
begin
    iddetalle:=albaranesdetalleid.asstring;
    if albaranesdetalletipoiva.AsString='' then albaranesdetalletipoiva.Value:=0;
    if albaranesdetalledescuento.AsString='' then albaranesdetalledescuento.Value:=0;
    if albaranesdetallelote.AsString<>'' then
    begin
       if (albaranesdetallecoste_otros.asstring='') or albaranesdetallegg.IsNull then
       begin
         qaux.Close;
         qaux.SQL.Clear;
         qaux.SQL.Add('select coste_kg_ref, tiene_gg from parcelas where (codpar,empresa) in (select parcela,idempresa from lotes where codigo='+albaranesdetallelote.AsString+')');
         qaux.Open;
         if qaux.RecordCount > 0 then
         begin
           if albaranesdetallecoste_otros.asstring='' then
             albaranesdetallecoste_otros.Value:=qaux.Fields[0].AsFloat;
           if albaranesdetallegg.IsNull then
           begin
             if qaux.FieldByName('tiene_gg').AsInteger = 1 then
               albaranesdetallegg.AsInteger := 1
             else
               albaranesdetallegg.AsInteger := 0;
           end;
         end;
       end;
    end;
    if albaranesdetallegg.IsNull then
      albaranesdetallegg.AsInteger := 0;
    albaranesdetalleidempresa.Value:=albaranesidempresa.AsInteger;
    albaranesdetalleidalbaran.Value:=albaranesid.AsInteger;
    albaranesdetalleserie.Value:=albaranesserie.Asstring;
    albaranesdetallebase.Value:=roundto(albaranesdetalleprecio.AsFloat*albaranesdetallecantidad.AsFloat, -2);
    descuento:=roundto(albaranesdetallebase.AsFloat*(albaranesdetalledescuento.AsFloat/100), -2);
    albaranesdetalletotaldescuento.value:=descuento;
    albaranesdetalletotal.Value:=roundto(albaranesdetallebase.Asfloat-descuento, -2);
    iva:=roundto(albaranesdetalletotal.AsFloat*(albaranesdetalletipoiva.AsFloat/100), -2);
    albaranesdetalleiva.Value:=iva;
    if albaranesdetalle.State in [dsedit] then iddetalle:=albaranesdetalleid.AsString else iddetalle:='';
end;

procedure Talbaranes.btAborrarClick(Sender: TObject);
begin
    if albaranes.recordcount>0 then
    begin
    if albaranesfacturado.AsInteger=0 then
      BEGIN
          albaranes.Delete;
          albaranesdetalle.Refresh;
          qpedidos.Refresh;
          qpedidos2.Refresh;
          qpedidosdetalle.Refresh;
          qpedidosdetalle2.Refresh;
          qalbaranesiva.refresh;

      END  else showmessage('¡¡¡ ALBARAN FACTURADO NO SE PUEDE BORRAR ¡¡¡');
    end;
end;

procedure Talbaranes.btAcancelarClick(Sender: TObject);
begin
    albaranes.Cancel;
    panel3.Enabled:=false;
end;

procedure Talbaranes.btaduplicarClick(Sender: TObject);
var serie,fecha,idalbaran:string;
begin
    serie:=albaranesserie.asstring;
    fecha:=albaranesfecha.Asstring;
    idalbaran:=albaranesid.Asstring;
    idempresa:=albaranesidempresa.AsString;
    fdlgduplicar := Tfdlgduplicar.Create(nil);
    try
      dlgduplicar.idserie:=serie;
      dlgduplicar.fecha:=fecha;
      dlgduplicar.idempresa:=idempresa;
      dlgduplicar.idalbaran:=idalbaran;
      fdlgduplicar.showmodal();
    finally
      fdlgduplicar.Free;
      qseries2.Locate('id',idserie,[locaseinsensitive]);
      albaranes.refresh;
      albaranesdetalle.Refresh;
      albaranes.Locate('serie,id',vararrayof([idserie,idalbaran]),[locaseinsensitive])
    end;
end;

procedure Talbaranes.RecalcularTotalesAlbaran(AIdEmpresa: Integer; const ASerie: string; AIdAlbaran: Integer);
var
  LQuery: TZQuery;
begin
  if (AIdEmpresa <= 0) or (ASerie = '') or (AIdAlbaran <= 0) then Exit;
  LQuery := TZQuery.Create(nil);
  try
    LQuery.Connection := DM.DBagrigest;
    // 1. Limpiar desglose de IVA anterior del albaran
    LQuery.SQL.Text := 'DELETE FROM albaranes_iva WHERE ide = :ide AND serie = :serie AND idalbaran = :idalbaran';
    LQuery.ParamByName('ide').AsInteger := AIdEmpresa;
    LQuery.ParamByName('serie').AsString := ASerie;
    LQuery.ParamByName('idalbaran').AsInteger := AIdAlbaran;
    LQuery.ExecSQL;

    // 2. Insertar desglose de bases y tipos de IVA con redondeo a 2 decimales
    LQuery.SQL.Clear;
    LQuery.SQL.Add('INSERT INTO albaranes_iva (serie, idalbaran, ide, base, tipo, iva) ');
    LQuery.SQL.Add('SELECT serie, idalbaran, idempresa, ');
    LQuery.SQL.Add('       ROUND(SUM(COALESCE(total, 0)), 2) AS base, ');
    LQuery.SQL.Add('       COALESCE(tipoiva, 0) AS tipo, ');
    LQuery.SQL.Add('       ROUND(SUM(COALESCE(total, 0)) * (COALESCE(tipoiva, 0) / 100), 2) AS iva ');
    LQuery.SQL.Add('FROM albaranes_detalles ');
    LQuery.SQL.Add('WHERE idempresa = :ide AND serie = :serie AND idalbaran = :idalbaran ');
    LQuery.SQL.Add('  AND COALESCE(cantidad, 0) <> 0 ');
    LQuery.SQL.Add('GROUP BY tipoiva ');
    LQuery.SQL.Add('ORDER BY tipoiva DESC');
    LQuery.ParamByName('ide').AsInteger := AIdEmpresa;
    LQuery.ParamByName('serie').AsString := ASerie;
    LQuery.ParamByName('idalbaran').AsInteger := AIdAlbaran;
    LQuery.ExecSQL;

    // 3. Actualizar totales en cabecera albaranes
    LQuery.SQL.Clear;
    LQuery.SQL.Add('UPDATE albaranes a ');
    LQuery.SQL.Add('SET a.descuento_lin = COALESCE((SELECT ROUND(SUM(totaldescuento), 2) FROM albaranes_detalles WHERE idempresa = a.idempresa AND serie = a.serie AND idalbaran = a.id), 0), ');
    LQuery.SQL.Add('    a.neto = COALESCE((SELECT ROUND(SUM(total), 2) FROM albaranes_detalles WHERE idempresa = a.idempresa AND serie = a.serie AND idalbaran = a.id AND COALESCE(cantidad, 0) <> 0), 0), ');
    LQuery.SQL.Add('    a.totaliva = COALESCE((SELECT ROUND(SUM(iva), 2) FROM albaranes_iva WHERE ide = a.idempresa AND serie = a.serie AND idalbaran = a.id), 0), ');
    LQuery.SQL.Add('    a.descuento_total = COALESCE(a.descuento_lin, 0) + COALESCE(a.descuento_com, 0) + COALESCE(a.descuento_pp, 0), ');
    LQuery.SQL.Add('    a.total = COALESCE((SELECT ROUND(SUM(total), 2) FROM albaranes_detalles WHERE idempresa = a.idempresa AND serie = a.serie AND idalbaran = a.id AND COALESCE(cantidad, 0) <> 0), 0) + ');
    LQuery.SQL.Add('              COALESCE((SELECT ROUND(SUM(iva), 2) FROM albaranes_iva WHERE ide = a.idempresa AND serie = a.serie AND idalbaran = a.id), 0) - ');
    LQuery.SQL.Add('              COALESCE(a.descuento_com, 0) - COALESCE(a.descuento_pp, 0) ');
    LQuery.SQL.Add('WHERE a.idempresa = :ide AND a.serie = :serie AND a.id = :idalbaran');
    LQuery.ParamByName('ide').AsInteger := AIdEmpresa;
    LQuery.ParamByName('serie').AsString := ASerie;
    LQuery.ParamByName('idalbaran').AsInteger := AIdAlbaran;
    LQuery.ExecSQL;
  finally
    LQuery.Free;
  end;
end;

procedure Talbaranes.RecalcularTotalesFactura(AIdEmpresa: Integer; const ASerie: string; AIdFactura: Integer);
var
  LQuery: TZQuery;
begin
  if (AIdEmpresa <= 0) or (ASerie = '') or (AIdFactura <= 0) then Exit;
  LQuery := TZQuery.Create(nil);
  try
    LQuery.Connection := DM.DBagrigest;
    // 1. Limpiar desglose de IVA anterior de la factura
    LQuery.SQL.Text := 'DELETE FROM facturas_iva WHERE ide = :ide AND serie = :serie AND idfactura = :idfactura';
    LQuery.ParamByName('ide').AsInteger := AIdEmpresa;
    LQuery.ParamByName('serie').AsString := ASerie;
    LQuery.ParamByName('idfactura').AsInteger := AIdFactura;
    LQuery.ExecSQL;

    // 2. Insertar desglose de bases, tipos de IVA y recargo de equivalencia con redondeo a 2 decimales
    LQuery.SQL.Clear;
    LQuery.SQL.Add('INSERT INTO facturas_iva (serie, idfactura, ide, base, tipo, iva, re, tipore) ');
    LQuery.SQL.Add('SELECT serie, idfactura, idempresa, ');
    LQuery.SQL.Add('       ROUND(SUM(COALESCE(total, 0)), 2) AS base, ');
    LQuery.SQL.Add('       COALESCE(tipoiva, 0) AS tipo, ');
    LQuery.SQL.Add('       ROUND(SUM(COALESCE(total, 0)) * (COALESCE(tipoiva, 0) / 100), 2) AS iva, ');
    LQuery.SQL.Add('       ROUND(SUM(COALESCE(total, 0)) * (COALESCE(tipore, 0) / 100), 2) AS re, ');
    LQuery.SQL.Add('       COALESCE(tipore, 0) AS tipore ');
    LQuery.SQL.Add('FROM facturas_detalles ');
    LQuery.SQL.Add('WHERE idempresa = :ide AND serie = :serie AND idfactura = :idfactura ');
    LQuery.SQL.Add('  AND COALESCE(cantidad, 0) <> 0 ');
    LQuery.SQL.Add('GROUP BY tipoiva, tipore ');
    LQuery.SQL.Add('ORDER BY tipoiva DESC');
    LQuery.ParamByName('ide').AsInteger := AIdEmpresa;
    LQuery.ParamByName('serie').AsString := ASerie;
    LQuery.ParamByName('idfactura').AsInteger := AIdFactura;
    LQuery.ExecSQL;

    // 3. Actualizar totales en cabecera facturas
    LQuery.SQL.Clear;
    LQuery.SQL.Add('UPDATE facturas f ');
    LQuery.SQL.Add('SET f.descuento_lin = COALESCE((SELECT ROUND(SUM(totaldescuento), 2) FROM facturas_detalles WHERE idempresa = f.idempresa AND serie = f.serie AND idfactura = f.id), 0), ');
    LQuery.SQL.Add('    f.neto = COALESCE((SELECT ROUND(SUM(total), 2) FROM facturas_detalles WHERE idempresa = f.idempresa AND serie = f.serie AND idfactura = f.id AND COALESCE(cantidad, 0) <> 0), 0), ');
    LQuery.SQL.Add('    f.totaliva = COALESCE((SELECT ROUND(SUM(iva), 2) FROM facturas_iva WHERE ide = f.idempresa AND serie = f.serie AND idfactura = f.id), 0), ');
    LQuery.SQL.Add('    f.totalre = COALESCE((SELECT ROUND(SUM(re), 2) FROM facturas_iva WHERE ide = f.idempresa AND serie = f.serie AND idfactura = f.id), 0), ');
    LQuery.SQL.Add('    f.descuento_total = COALESCE(f.descuento_lin, 0) + COALESCE(f.descuento_com, 0) + COALESCE(f.descuento_pp, 0), ');
    LQuery.SQL.Add('    f.total = COALESCE((SELECT ROUND(SUM(total), 2) FROM facturas_detalles WHERE idempresa = f.idempresa AND serie = f.serie AND idfactura = f.id AND COALESCE(cantidad, 0) <> 0), 0) + ');
    LQuery.SQL.Add('              COALESCE((SELECT ROUND(SUM(iva), 2) FROM facturas_iva WHERE ide = f.idempresa AND serie = f.serie AND idfactura = f.id), 0) + ');
    LQuery.SQL.Add('              COALESCE((SELECT ROUND(SUM(re), 2) FROM facturas_iva WHERE ide = f.idempresa AND serie = f.serie AND idfactura = f.id), 0) - ');
    LQuery.SQL.Add('              COALESCE(f.descuento_com, 0) - COALESCE(f.descuento_pp, 0) ');
    LQuery.SQL.Add('WHERE f.idempresa = :ide AND f.serie = :serie AND f.id = :idfactura');
    LQuery.ParamByName('ide').AsInteger := AIdEmpresa;
    LQuery.ParamByName('serie').AsString := ASerie;
    LQuery.ParamByName('idfactura').AsInteger := AIdFactura;
    LQuery.ExecSQL;
  finally
    LQuery.Free;
  end;
end;

procedure Talbaranes.btadecaClick(Sender: TObject);

  function ExtraerDecaDeObs(const AObs: string): string;
  var
    p1, p2: Integer;
  begin
    Result := '';
    p1 := Pos('[DeCA:', AObs);
    if p1 = 0 then p1 := Pos('[DECA:', AObs);
    if p1 > 0 then
    begin
      p2 := Pos(']', Copy(AObs, p1, Length(AObs)));
      if p2 > 6 then
        Result := Trim(Copy(AObs, p1 + 6, p2 - 7));
    end;
    if (Result = '') and (Pos('DECA-', AObs) > 0) then
    begin
      p1 := Pos('DECA-', AObs);
      Result := Copy(AObs, p1, 45);
      p2 := Pos(' ', Result);
      if p2 > 0 then Result := Copy(Result, 1, p2 - 1);
      p2 := Pos(']', Result);
      if p2 > 0 then Result := Copy(Result, 1, p2 - 1);
      Result := Trim(Result);
    end;
  end;

  function ObtenerCodigoDecaAlbaran(AIdEmp: Integer; const ASerie: string; AId: Integer): string;
  begin
    Result := '';
    if albaranes.FindField('deca_codigo') <> nil then
      Result := Trim(albaranes.FieldByName('deca_codigo').AsString);

    if (Result = '') and (albaranes.FindField('observaciones') <> nil) then
      Result := ExtraerDecaDeObs(albaranes.FieldByName('observaciones').AsString);

    if Result = '' then
    begin
      try
        qaux.Close;
        qaux.SQL.Text := 'SELECT deca_codigo, observaciones FROM albaranes WHERE idempresa = :emp AND serie = :ser AND id = :id LIMIT 1';
        qaux.ParamByName('emp').AsInteger := AIdEmp;
        qaux.ParamByName('ser').AsString := ASerie;
        qaux.ParamByName('id').AsInteger := AId;
        qaux.Open;
        if not qaux.IsEmpty then
        begin
          if (qaux.FindField('deca_codigo') <> nil) and (Trim(qaux.FieldByName('deca_codigo').AsString) <> '') then
            Result := Trim(qaux.FieldByName('deca_codigo').AsString)
          else if qaux.FindField('observaciones') <> nil then
            Result := ExtraerDecaDeObs(qaux.FieldByName('observaciones').AsString);
        end;
        qaux.Close;
      except
      end;
    end;
  end;

var
  LList: TAlbaranItemList;
  LItem: TAlbaranItem;
  i: Integer;
begin
  if albaranes.RecordCount = 0 then
  begin
    ShowMessage('No hay ningún albarán activo para emitir el documento DeCA.');
    Exit;
  end;

  // 1. Si estamos en la pestaña Listado (TabSheet2) y hay selección en DBGrid3
  if (PageControl1.ActivePage = TabSheet2) and (DBGrid3.SelectedRows.Count > 0) then
  begin
    SetLength(LList, DBGrid3.SelectedRows.Count);
    albaranes.DisableControls;
    try
      for i := 0 to DBGrid3.SelectedRows.Count - 1 do
      begin
        albaranes.Bookmark := DBGrid3.SelectedRows[i];
        LItem.IdEmpresa := albaranesidempresa.AsInteger;
        LItem.Id := albaranesid.AsInteger;
        LItem.Serie := albaranesserie.AsString;
        LItem.Documento := albaranesdocumento.AsString;
        LItem.Fecha := albaranesfecha.AsDateTime;
        LItem.Cliente := albaranesnomcliente.AsString;
        LItem.NifCliente := albaranesnif.AsString;
        LItem.Destino := albaranesnomdestino.AsString;
        LItem.Direccion := albaranesdirecciondestino.AsString;
        LItem.CP := albaranescodpostdestino.AsString;
        LItem.Poblacion := albaranespoblaciondestino.AsString;
        LItem.Provincia := albaranesprovinciadestino.AsString;
        LItem.Matricula := albaranesprov_transporte.AsString;
        LItem.Palets := 0;
        LItem.Bultos := albaranesbultos.AsFloat;
        if (albaranes.FindField('peso_bruto') <> nil) and (albaranespeso_bruto.AsFloat > 0) then
          LItem.Kilos := albaranespeso_bruto.AsFloat
        else
          LItem.Kilos := albaraneskilos.AsFloat;
        LItem.DecaCodigo := ObtenerCodigoDecaAlbaran(LItem.IdEmpresa, LItem.Serie, LItem.Id);
        LList[i] := LItem;
      end;
    finally
      albaranes.EnableControls;
    end;
  end
  else
  begin
    // 2. Albarán individual actual
    SetLength(LList, 1);
    LItem.IdEmpresa := albaranesidempresa.AsInteger;
    LItem.Id := albaranesid.AsInteger;
    LItem.Serie := albaranesserie.AsString;
    LItem.Documento := albaranesdocumento.AsString;
    LItem.Fecha := albaranesfecha.AsDateTime;
    LItem.Cliente := albaranesnomcliente.AsString;
    LItem.NifCliente := albaranesnif.AsString;
    LItem.Destino := albaranesnomdestino.AsString;
    LItem.Direccion := albaranesdirecciondestino.AsString;
    LItem.CP := albaranescodpostdestino.AsString;
    LItem.Poblacion := albaranespoblaciondestino.AsString;
    LItem.Provincia := albaranesprovinciadestino.AsString;
    LItem.Matricula := albaranesprov_transporte.AsString;
    LItem.Palets := 0;
    LItem.Bultos := albaranesbultos.AsFloat;
    if (albaranes.FindField('peso_bruto') <> nil) and (albaranespeso_bruto.AsFloat > 0) then
      LItem.Kilos := albaranespeso_bruto.AsFloat
    else
      LItem.Kilos := albaraneskilos.AsFloat;
    LItem.DecaCodigo := ObtenerCodigoDecaAlbaran(LItem.IdEmpresa, LItem.Serie, LItem.Id);
    LList[0] := LItem;
  end;

  // 3. Abrir el proceso de cumplimentación y emisión DeCA
  TfDecaEmisionAlbaranes.Ejecutar(Self, LList);

  if albaranes.Active then
    albaranes.Refresh;
end;

procedure Talbaranes.MenuItemVehiculoClick(Sender: TObject);
var
  LValor: string;
begin
  if Sender is TMenuItem then
  begin
    LValor := TMenuItem(Sender).Hint;
    if LValor = '' then
      LValor := TMenuItem(Sender).Caption;

    if albaranes.Active then
    begin
      if not (albaranes.State in [dsEdit, dsInsert]) then
        albaranes.Edit;
      albaranesprov_transporte.AsString := LValor;
    end;
  end;
end;

procedure Talbaranes.btnSelTransporteClick(Sender: TObject);
var
  LMenu: TPopupMenu;
  LItem, LSubItem: TMenuItem;
  LQry: TZQuery;
  LPoint: TPoint;
  LMat, LRem, LCond, LNom, LNif: string;
  LConfig: TDecaConfig;
  LJsonVeh, LJsonCon: string;
  LVal, LArrVal: TJSONValue;
  LObj: TJSONObject;
  LArr: TJSONArray;
  i: Integer;
  LVehCargados, LConCargados: Boolean;

  function GetValStr(AObj: TJSONObject; const AKey: string): string;
  var
    P: TJSONPair;
  begin
    Result := '';
    if AObj = nil then Exit;
    P := AObj.Get(AKey);
    if (P <> nil) and (P.JsonValue <> nil) and not (P.JsonValue is TJSONNull) then
      Result := P.JsonValue.Value;
  end;

begin
  LMenu := TPopupMenu.Create(Self);
  LVehCargados := False;
  LConCargados := False;

  // 1. Intentar cargar desde el servicio DeCA Cloud REST API
  CargarDecaConfig(LConfig);
  if ObtenerPresetsVehiculos(LConfig, LJsonVeh) then
  begin
    try
      LVal := TJSONObject.ParseJSONValue(LJsonVeh);
      if Assigned(LVal) and (LVal is TJSONObject) then
      try
        LArrVal := TJSONObject(LVal).Get('vehiculos').JsonValue;
        if Assigned(LArrVal) and (LArrVal is TJSONArray) then
        begin
          LArr := TJSONArray(LArrVal);
          if LArr.Size > 0 then
          begin
            LVehCargados := True;
            LItem := TMenuItem.Create(LMenu);
            LItem.Caption := 'Veh'#237'culos y Conductores (Flota)';
            LItem.Enabled := False;
            LMenu.Items.Add(LItem);

            for i := 0 to LArr.Size - 1 do
            begin
              if LArr.Get(i) is TJSONObject then
              begin
                LObj := TJSONObject(LArr.Get(i));
                LMat := Trim(GetValStr(LObj, 'matricula_tractora'));
                LRem := Trim(GetValStr(LObj, 'matricula_remolque'));
                LCond := Trim(GetValStr(LObj, 'conductor_nombre'));

                if LMat <> '' then
                begin
                  LSubItem := TMenuItem.Create(LMenu);
                  LSubItem.Caption := LMat;
                  if LRem <> '' then
                    LSubItem.Caption := LSubItem.Caption + ' + ' + LRem;
                  if LCond <> '' then
                    LSubItem.Caption := LSubItem.Caption + ' (' + LCond + ')';

                  LSubItem.Hint := LMat;
                  LSubItem.OnClick := MenuItemVehiculoClick;
                  LMenu.Items.Add(LSubItem);
                end;
              end;
            end;
          end;
        end;
      finally
        LVal.Free;
      end;
    except
    end;
  end;

  if ObtenerPresetsContactos(LConfig, 'TRANSPORTISTA', LJsonCon) then
  begin
    try
      LVal := TJSONObject.ParseJSONValue(LJsonCon);
      if Assigned(LVal) and (LVal is TJSONObject) then
      try
        LArrVal := TJSONObject(LVal).Get('contactos').JsonValue;
        if Assigned(LArrVal) and (LArrVal is TJSONArray) then
        begin
          LArr := TJSONArray(LArrVal);
          if LArr.Size > 0 then
          begin
            LConCargados := True;
            if LMenu.Items.Count > 0 then
            begin
              LItem := TMenuItem.Create(LMenu);
              LItem.Caption := '-';
              LMenu.Items.Add(LItem);
            end;

            LItem := TMenuItem.Create(LMenu);
            LItem.Caption := 'Empresas Transportistas';
            LItem.Enabled := False;
            LMenu.Items.Add(LItem);

            for i := 0 to LArr.Size - 1 do
            begin
              if LArr.Get(i) is TJSONObject then
              begin
                LObj := TJSONObject(LArr.Get(i));
                LNom := Trim(GetValStr(LObj, 'nombre'));
                LNif := Trim(GetValStr(LObj, 'nif'));

                if LNom <> '' then
                begin
                  LSubItem := TMenuItem.Create(LMenu);
                  LSubItem.Caption := LNom;
                  if LNif <> '' then
                    LSubItem.Caption := LSubItem.Caption + ' [' + LNif + ']';
                  LSubItem.Hint := LNom;
                  LSubItem.OnClick := MenuItemVehiculoClick;
                  LMenu.Items.Add(LSubItem);
                end;
              end;
            end;
          end;
        end;
      finally
        LVal.Free;
      end;
    except
    end;
  end;

  // 2. Fallback SQL directo si no se cargaron por REST
  if (not LVehCargados) or (not LConCargados) then
  begin
    LQry := TZQuery.Create(nil);
    try
      LQry.Connection := DM.DBagrigest;

      if not LVehCargados then
      try
        LQry.SQL.Text := 'SELECT matricula_tractora, matricula_remolque, conductor_nombre FROM deca.deca_vehiculos WHERE activo = 1 ORDER BY actualizado_en DESC';
        LQry.Open;
        if not LQry.IsEmpty then
        begin
          LItem := TMenuItem.Create(LMenu);
          LItem.Caption := 'Veh'#237'culos y Conductores (Flota)';
          LItem.Enabled := False;
          LMenu.Items.Add(LItem);

          while not LQry.Eof do
          begin
            LMat := Trim(LQry.FieldByName('matricula_tractora').AsString);
            LRem := Trim(LQry.FieldByName('matricula_remolque').AsString);
            LCond := Trim(LQry.FieldByName('conductor_nombre').AsString);

            LSubItem := TMenuItem.Create(LMenu);
            LSubItem.Caption := LMat;
            if LRem <> '' then
              LSubItem.Caption := LSubItem.Caption + ' + ' + LRem;
            if LCond <> '' then
              LSubItem.Caption := LSubItem.Caption + ' (' + LCond + ')';

            LSubItem.Hint := LMat;
            LSubItem.OnClick := MenuItemVehiculoClick;
            LMenu.Items.Add(LSubItem);

            LQry.Next;
          end;
        end;
        LQry.Close;
      except
      end;

      if not LConCargados then
      try
        LQry.SQL.Text := 'SELECT nombre, nif FROM deca.deca_contactos WHERE activo = 1 AND tipo IN ("TRANSPORTISTA", "AMBOS") ORDER BY nombre ASC';
        LQry.Open;
        if not LQry.IsEmpty then
        begin
          if LMenu.Items.Count > 0 then
          begin
            LItem := TMenuItem.Create(LMenu);
            LItem.Caption := '-';
            LMenu.Items.Add(LItem);
          end;

          LItem := TMenuItem.Create(LMenu);
          LItem.Caption := 'Empresas Transportistas';
          LItem.Enabled := False;
          LMenu.Items.Add(LItem);

          while not LQry.Eof do
          begin
            LSubItem := TMenuItem.Create(LMenu);
            LSubItem.Caption := Trim(LQry.FieldByName('nombre').AsString);
            if Trim(LQry.FieldByName('nif').AsString) <> '' then
              LSubItem.Caption := LSubItem.Caption + ' [' + Trim(LQry.FieldByName('nif').AsString) + ']';
            LSubItem.Hint := Trim(LQry.FieldByName('nombre').AsString);
            LSubItem.OnClick := MenuItemVehiculoClick;
            LMenu.Items.Add(LSubItem);

            LQry.Next;
          end;
        end;
        LQry.Close;
      except
      end;

    finally
      LQry.Free;
    end;
  end;

  if LMenu.Items.Count = 0 then
  begin
    LMenu.Free;
    ShowMessage('No hay veh'#237'culos ni transportistas registrados a'#250'n en la base de datos DeCA.');
    Exit;
  end;

  LPoint.X := 0;
  LPoint.Y := btnSelTransporte.Height;
  LPoint := btnSelTransporte.ClientToScreen(LPoint);
  LMenu.Popup(LPoint.X, LPoint.Y);
end;

procedure Talbaranes.btafacturarClick(Sender: TObject);
type
  TAlbItem = record
    Id: Integer;
    Fecha: TDateTime;
    Observaciones: string;
    Comision: Double;
    CosteTransporte: Double;
  end;
var
  LSerie, LEmpresaStr, LIdFacturaStr, LIdAlbaranStr, LObservaciones: string;
  LAlbaranes: TArray<TAlbItem>;
  LIdCliente, LIdEmpresa, LIdFactura, i: Integer;
  LNomCliente, LNomDestino, LNif, LDir, LPob, LProv, LCodPost, LPais, LIdDestino: string;
  LIdFormaPago: Integer;
  LRef, LTel: string;
  LTotalComision, LTotalCosteTrans: Double;
  LQuery: TZQuery;
  LAlbaranDoc, LFacturaDoc: string;
begin
  if albaranes.RecordCount = 0 then Exit;

  // Comprobar si estamos en la pestaña Listado con selección múltiple de albaranes
  if (PageControl1.ActivePage = TabSheet2) and (DBGrid3.SelectedRows.Count > 1) then
  begin
    // =========================================================================
    // FACTURACIÓN MÚLTIPLE DE VARIOS ALBARANES SELECCIONADOS
    // =========================================================================
    SetLength(LAlbaranes, DBGrid3.SelectedRows.Count);
    LIdCliente := 0;
    LIdEmpresa := 0;
    LSerie := '';
    LTotalComision := 0;
    LTotalCosteTrans := 0;
    LObservaciones := '';

    albaranes.DisableControls;
    try
      for i := 0 to DBGrid3.SelectedRows.Count - 1 do
      begin
        albaranes.GotoBookmark(DBGrid3.SelectedRows[i]);
        if i = 0 then
        begin
          LIdCliente := albaranesidcliente.AsInteger;
          LIdEmpresa := albaranesidempresa.AsInteger;
          LSerie := albaranesserie.AsString;
          LNomCliente := albaranesnomcliente.AsString;
          LNomDestino := albaranesnomdestino.AsString;
          LNif := albaranesnif.AsString;
          LDir := albaranesdireccion.AsString;
          LPob := albaranespoblacion.AsString;
          LProv := albaranesprovincia.AsString;
          LCodPost := albaranescodpost.AsString;
          LPais := albaranespaiscliente.AsString;
          LIdDestino := albaranesiddestino.AsString;
          LIdFormaPago := albaranesidformapago.AsInteger;
          LRef := albaranesreferencia.AsString;
          LTel := albaranestelefono.AsString;
        end
        else
        begin
          if (albaranesidcliente.AsInteger <> LIdCliente) then
          begin
            ShowMessage('Todos los albaranes seleccionados deben pertenecer al mismo cliente.');
            Exit;
          end;
          if (albaranesidempresa.AsInteger <> LIdEmpresa) or (albaranesserie.AsString <> LSerie) then
          begin
            ShowMessage('Todos los albaranes seleccionados deben pertenecer a la misma empresa y serie.');
            Exit;
          end;
        end;

        if (albaranesfacturado.AsInteger = 1) or (albaranesidfactura.AsInteger > 0) then
        begin
          ShowMessage('El albarán nº ' + albaranesserie.AsString + '/' + albaranesid.AsString + ' ya se encuentra facturado.');
          Exit;
        end;

        LAlbaranes[i].Id := albaranesid.AsInteger;
        LAlbaranes[i].Fecha := albaranesfecha.AsDateTime;
        LAlbaranes[i].Observaciones := albaranesobservaciones.AsString;
        LAlbaranes[i].Comision := albaranescomision.AsFloat;
        LAlbaranes[i].CosteTransporte := albaranescoste_transporte.AsFloat;
        LTotalComision := LTotalComision + albaranescomision.AsFloat;
        LTotalCosteTrans := LTotalCosteTrans + albaranescoste_transporte.AsFloat;
        if Trim(albaranesobservaciones.AsString) <> '' then
        begin
          if LObservaciones <> '' then LObservaciones := LObservaciones + ' / ';
          LObservaciones := LObservaciones + albaranesobservaciones.AsString;
        end;
      end;
    finally
      albaranes.EnableControls;
    end;

    if dm.PedirConfirmacion(Format('¿Desea facturar los %d albaranes seleccionados en una única factura?', [Length(LAlbaranes)]), True, True, False) <> mrYes then
      Exit;

    // Obtener número de factura desde series_numericas
    qaux.Close;
    qaux.SQL.Clear;
    qaux.SQL.Add('SELECT num_factura FROM series_numericas WHERE ide = ' + IntToStr(LIdEmpresa) + ' AND id = ''' + LSerie + '''');
    qaux.Open;
    LIdFactura := qaux.Fields[0].AsInteger;
    LIdFacturaStr := IntToStr(LIdFactura);
    LEmpresaStr := IntToStr(LIdEmpresa);
    LFacturaDoc := LSerie + '/' + LIdFacturaStr;

    // Crear cabecera de factura
    facturas.Open;
    facturas.Append;
    facturasidempresa.Value := LIdEmpresa;
    facturasserie.Value := LSerie;
    facturasid.Value := LIdFactura;
    facturasiddestino.Value := LIdDestino;
    facturasidcliente.Value := LIdCliente;
    facturasnif.Value := LNif;
    facturasdireccion.Value := LDir;
    facturaspoblacion.Value := LPob;
    facturasprovincia.Value := LProv;
    facturascodpost.Value := LCodPost;
    facturasfecha.Value := Date;
    facturasreferencia.Value := LRef;
    facturastelefono.Value := LTel;
    facturasnomcliente.Value := LNomCliente;
    facturaspaiscliente.Value := LPais;
    facturasnomdestino.Value := LNomDestino;
    facturasidformapago.Value := LIdFormaPago;
    facturasdirecciondestino.Value := LDir;
    facturaspoblaciondestino.Value := LPob;
    facturascodpostdestino.Value := LCodPost;
    facturasprovinciadestino.Value := LProv;
    facturaspaisdestino.Value := LPais;
    facturasobservaciones.Value := LObservaciones;
    facturascomision.Value := LTotalComision;
    facturascoste_transporte.Value := LTotalCosteTrans;
    facturas.Post;

    // Incrementar número en series_numericas
    qaux.Close;
    qaux.SQL.Clear;
    qaux.SQL.Add('UPDATE series_numericas SET num_factura = num_factura + 1 WHERE ide = ' + LEmpresaStr + ' AND id = ''' + LSerie + '''');
    qaux.ExecSQL;

    LQuery := TZQuery.Create(nil);
    try
      LQuery.Connection := DM.DBagrigest;
      for i := 0 to High(LAlbaranes) do
      begin
        LIdAlbaranStr := IntToStr(LAlbaranes[i].Id);
        LAlbaranDoc := LSerie + '/' + LIdAlbaranStr;

        // 1. Insertar línea de título del albarán
        LQuery.SQL.Clear;
        LQuery.SQL.Add('INSERT INTO facturas_detalles (idempresa, serie, idfactura, idalbaran, descripcion, tipoiva, tipore, cantidad, precio, base, totaldescuento, total, iva, re) ');
        LQuery.SQL.Add('VALUES (:empresa, :serie, :factura, :albaran, :descrip, 0, 0, 0, 0, 0, 0, 0, 0, 0)');
        LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
        LQuery.ParamByName('serie').AsString := LSerie;
        LQuery.ParamByName('factura').AsInteger := LIdFactura;
        LQuery.ParamByName('albaran').AsInteger := LAlbaranes[i].Id;
        LQuery.ParamByName('descrip').AsString := 'Albaran ' + LIdAlbaranStr + ' de fecha:' + DateToStr(LAlbaranes[i].Fecha);
        LQuery.ExecSQL;

        // 2. Copiar líneas de albaranes_detalles
        LQuery.SQL.Clear;
        LQuery.SQL.Add('INSERT INTO facturas_detalles (idempresa, serie, idfactura, idarticulo, descripcion, cal, lote, bultos, cantidad, precio, descuento, totaldescuento, ');
        LQuery.SQL.Add('base, tipoiva, iva, total, coste_transporte, coste_comision, coste_otros, palets, idalbaran, pesobruto, pais, envase, referencia, ean, unidadescaja, mprima, parcela, formato, gg) ');
        LQuery.SQL.Add('SELECT :empresa AS idempresa, :serie AS serie, :factura AS idfactura, idarticulo, descripcion, cal, lote, bultos, cantidad, precio, descuento, totaldescuento, ');
        LQuery.SQL.Add('base, tipoiva, iva, total, coste_transporte, coste_comision, coste_otros, palets, idalbaran, pesobruto, pais, envase, referencia, ean, unidadescaja, mprima, parcela, formato, gg ');
        LQuery.SQL.Add('FROM albaranes_detalles ');
        LQuery.SQL.Add('WHERE idempresa = :empresa AND serie = :serie AND idalbaran = :albaran');
        LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
        LQuery.ParamByName('serie').AsString := LSerie;
        LQuery.ParamByName('factura').AsInteger := LIdFactura;
        LQuery.ParamByName('albaran').AsInteger := LAlbaranes[i].Id;
        LQuery.ExecSQL;

        // 3. Actualizar albaranes_detalles
        LQuery.SQL.Clear;
        LQuery.SQL.Add('UPDATE albaranes_detalles SET idfactura = :factura WHERE idempresa = :empresa AND serie = :serie AND idalbaran = :albaran');
        LQuery.ParamByName('factura').AsInteger := LIdFactura;
        LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
        LQuery.ParamByName('serie').AsString := LSerie;
        LQuery.ParamByName('albaran').AsInteger := LAlbaranes[i].Id;
        LQuery.ExecSQL;

        // 4. Actualizar albarán
        LQuery.SQL.Clear;
        LQuery.SQL.Add('UPDATE albaranes SET facturado = 1, idfactura = :factura, documento = :doc WHERE idempresa = :empresa AND serie = :serie AND id = :albaran');
        LQuery.ParamByName('factura').AsInteger := LIdFactura;
        LQuery.ParamByName('doc').AsString := 'Factura Nº: ' + LIdFacturaStr;
        LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
        LQuery.ParamByName('serie').AsString := LSerie;
        LQuery.ParamByName('albaran').AsInteger := LAlbaranes[i].Id;
        LQuery.ExecSQL;

        // 5. Actualizar pedidosdetalle
        LQuery.SQL.Clear;
        LQuery.SQL.Add('UPDATE pedidosdetalle SET idexpedicion = :expedicion WHERE idalbaran = :albaranDoc');
        LQuery.ParamByName('expedicion').AsString := LFacturaDoc;
        LQuery.ParamByName('albaranDoc').AsString := LAlbaranDoc;
        LQuery.ExecSQL;

        // 6. Actualizar ea_pesadas
        LQuery.SQL.Clear;
        LQuery.SQL.Add('UPDATE ea_pesadas SET id_palet2 = ''FACTURANDO'', idfactura = :expedicion WHERE idalbaran = :albaranDoc AND idempresa = :empresa');
        LQuery.ParamByName('expedicion').AsString := LFacturaDoc;
        LQuery.ParamByName('albaranDoc').AsString := LAlbaranDoc;
        LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
        LQuery.ExecSQL;
      end;

      // Recalcular totales de la nueva factura
      RecalcularTotalesFactura(LIdEmpresa, LSerie, LIdFactura);

      // Actualizar pesos acumulados en facturas
      LQuery.SQL.Clear;
      LQuery.SQL.Add('UPDATE facturas f ');
      LQuery.SQL.Add('SET peso_bruto = COALESCE((SELECT SUM(peso_bruto - tara0) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0), ');
      LQuery.SQL.Add('    kilos = COALESCE((SELECT SUM(peso_neto) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0), ');
      LQuery.SQL.Add('    kilosventa = COALESCE((SELECT SUM(peso_neto_teorico) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0), ');
      LQuery.SQL.Add('    numpalets = COALESCE((SELECT SUM(num_palets) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0) ');
      LQuery.SQL.Add('WHERE f.idempresa = :empresa AND f.serie = :serie AND f.id = :factura');
      LQuery.ParamByName('facturaDoc').AsString := LFacturaDoc;
      LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
      LQuery.ParamByName('serie').AsString := LSerie;
      LQuery.ParamByName('factura').AsInteger := LIdFactura;
      LQuery.ExecSQL;
    finally
      LQuery.Free;
    end;

    ShowMessage('¡¡¡ FACTURA CREADA CORRECTAMENTE CON EL NÚMERO: ' + LSerie + '/' + LIdFacturaStr + ' AGRUPANDO ' + IntToStr(Length(LAlbaranes)) + ' ALBARANES !!!');
  end
  else
  begin
    // =========================================================================
    // FACTURACIÓN INDIVIDUAL DE UN SOLO ALBARÁN
    // =========================================================================
    if (albaranesfacturado.AsInteger = 1) or (albaranesidfactura.AsInteger > 0) then
    begin
      ShowMessage('Este albarán ya se encuentra facturado.');
      Exit;
    end;

    LIdEmpresa := albaranesidempresa.AsInteger;
    LSerie := albaranesserie.AsString;
    LIdAlbaranStr := albaranesid.AsString;
    LEmpresaStr := IntToStr(LIdEmpresa);
    LAlbaranDoc := LSerie + '/' + LIdAlbaranStr;

    // Obtener número de factura
    qaux.Close;
    qaux.SQL.Clear;
    qaux.SQL.Add('SELECT num_factura FROM series_numericas WHERE ide = ' + LEmpresaStr + ' AND id = ''' + LSerie + '''');
    qaux.Open;
    LIdFactura := qaux.Fields[0].AsInteger;
    LIdFacturaStr := IntToStr(LIdFactura);
    LFacturaDoc := LSerie + '/' + LIdFacturaStr;

    facturas.Open;
    facturas.Append;
    facturasidempresa.Value := LIdEmpresa;
    facturasserie.Value := LSerie;
    facturasid.Value := LIdFactura;
    facturasiddestino.Value := albaranesiddestino.AsString;
    facturasidcliente.Value := albaranesidcliente.AsInteger;
    facturasnif.Value := albaranesnif.AsString;
    facturasdireccion.Value := albaranesdireccion.AsString;
    facturaspoblacion.Value := albaranespoblacion.AsString;
    facturasprovincia.Value := albaranesprovincia.AsString;
    facturascodpost.Value := albaranescodpost.AsString;
    facturasfecha.Value := Date;
    facturasreferencia.Value := albaranesreferencia.AsString;
    facturastelefono.Value := albaranestelefono.AsString;
    facturasnomcliente.Value := albaranesnomcliente.AsString;
    facturaspaiscliente.Value := albaranespaiscliente.AsString;
    facturasnomdestino.Value := albaranesnomdestino.AsString;
    facturasidformapago.Value := albaranesidformapago.AsInteger;
    facturasdirecciondestino.Value := albaranesdirecciondestino.AsString;
    facturaspoblaciondestino.Value := albaranespoblaciondestino.AsString;
    facturascodpostdestino.Value := albaranescodpostdestino.AsString;
    facturasprovinciadestino.Value := albaranesprovinciadestino.AsString;
    facturaspaisdestino.Value := albaranespaisdestino.AsString;
    facturasobservaciones.Value := albaranesobservaciones.AsString;
    facturascomision.Value := albaranescomision.Value;
    facturascoste_transporte.Value := albaranescoste_transporte.Value;
    facturas.Post;

    // Incrementar número en series_numericas
    qaux.Close;
    qaux.SQL.Clear;
    qaux.SQL.Add('UPDATE series_numericas SET num_factura = num_factura + 1 WHERE ide = ' + LEmpresaStr + ' AND id = ''' + LSerie + '''');
    qaux.ExecSQL;

    LQuery := TZQuery.Create(nil);
    try
      LQuery.Connection := DM.DBagrigest;
      // 1. Línea informativa de título
      LQuery.SQL.Clear;
      LQuery.SQL.Add('INSERT INTO facturas_detalles (idempresa, serie, idfactura, idalbaran, descripcion, tipoiva, tipore, cantidad, precio, base, totaldescuento, total, iva, re) ');
      LQuery.SQL.Add('VALUES (:empresa, :serie, :factura, :albaran, :descrip, 0, 0, 0, 0, 0, 0, 0, 0, 0)');
      LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
      LQuery.ParamByName('serie').AsString := LSerie;
      LQuery.ParamByName('factura').AsInteger := LIdFactura;
      LQuery.ParamByName('albaran').AsInteger := StrToInt(LIdAlbaranStr);
      LQuery.ParamByName('descrip').AsString := 'Albaran ' + LIdAlbaranStr + ' de fecha:' + albaranesfecha.AsString;
      LQuery.ExecSQL;

      // 2. Copiar líneas de albaranes_detalles
      LQuery.SQL.Clear;
      LQuery.SQL.Add('INSERT INTO facturas_detalles (idempresa, serie, idfactura, idarticulo, descripcion, cal, lote, bultos, cantidad, precio, descuento, totaldescuento, ');
      LQuery.SQL.Add('base, tipoiva, iva, total, coste_transporte, coste_comision, coste_otros, palets, idalbaran, pesobruto, pais, envase, referencia, ean, unidadescaja, mprima, parcela, formato, gg) ');
      LQuery.SQL.Add('SELECT :empresa AS idempresa, :serie AS serie, :factura AS idfactura, idarticulo, descripcion, cal, lote, bultos, cantidad, precio, descuento, totaldescuento, ');
      LQuery.SQL.Add('base, tipoiva, iva, total, coste_transporte, coste_comision, coste_otros, palets, idalbaran, pesobruto, pais, envase, referencia, ean, unidadescaja, mprima, parcela, formato, gg ');
      LQuery.SQL.Add('FROM albaranes_detalles ');
      LQuery.SQL.Add('WHERE idempresa = :empresa AND serie = :serie AND idalbaran = :albaran');
      LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
      LQuery.ParamByName('serie').AsString := LSerie;
      LQuery.ParamByName('factura').AsInteger := LIdFactura;
      LQuery.ParamByName('albaran').AsInteger := StrToInt(LIdAlbaranStr);
      LQuery.ExecSQL;

      // 3. Actualizar albaranes_detalles
      LQuery.SQL.Clear;
      LQuery.SQL.Add('UPDATE albaranes_detalles SET idfactura = :factura WHERE idempresa = :empresa AND serie = :serie AND idalbaran = :albaran');
      LQuery.ParamByName('factura').AsInteger := LIdFactura;
      LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
      LQuery.ParamByName('serie').AsString := LSerie;
      LQuery.ParamByName('albaran').AsInteger := StrToInt(LIdAlbaranStr);
      LQuery.ExecSQL;

      // 4. Actualizar albarán
      LQuery.SQL.Clear;
      LQuery.SQL.Add('UPDATE albaranes SET facturado = 1, idfactura = :factura, documento = :doc WHERE idempresa = :empresa AND serie = :serie AND id = :albaran');
      LQuery.ParamByName('factura').AsInteger := LIdFactura;
      LQuery.ParamByName('doc').AsString := 'Factura Nº: ' + LIdFacturaStr;
      LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
      LQuery.ParamByName('serie').AsString := LSerie;
      LQuery.ParamByName('albaran').AsInteger := StrToInt(LIdAlbaranStr);
      LQuery.ExecSQL;

      // 5. Actualizar pedidosdetalle
      LQuery.SQL.Clear;
      LQuery.SQL.Add('UPDATE pedidosdetalle SET idexpedicion = :expedicion WHERE idalbaran = :albaranDoc');
      LQuery.ParamByName('expedicion').AsString := LFacturaDoc;
      LQuery.ParamByName('albaranDoc').AsString := LAlbaranDoc;
      LQuery.ExecSQL;

      // 6. Actualizar ea_pesadas
      LQuery.SQL.Clear;
      LQuery.SQL.Add('UPDATE ea_pesadas SET id_palet2 = ''FACTURANDO'', idfactura = :expedicion WHERE idalbaran = :albaranDoc AND idempresa = :empresa');
      LQuery.ParamByName('expedicion').AsString := LFacturaDoc;
      LQuery.ParamByName('albaranDoc').AsString := LAlbaranDoc;
      LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
      LQuery.ExecSQL;

      // Recalcular totales de la nueva factura
      RecalcularTotalesFactura(LIdEmpresa, LSerie, LIdFactura);

      // Actualizar pesos acumulados en facturas
      LQuery.SQL.Clear;
      LQuery.SQL.Add('UPDATE facturas f ');
      LQuery.SQL.Add('SET peso_bruto = COALESCE((SELECT SUM(peso_bruto - tara0) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0), ');
      LQuery.SQL.Add('    kilos = COALESCE((SELECT SUM(peso_neto) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0), ');
      LQuery.SQL.Add('    kilosventa = COALESCE((SELECT SUM(peso_neto_teorico) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0), ');
      LQuery.SQL.Add('    numpalets = COALESCE((SELECT SUM(num_palets) FROM ea_pesadas WHERE idfactura = :facturaDoc AND idempresa = f.idempresa), 0) ');
      LQuery.SQL.Add('WHERE f.idempresa = :empresa AND f.serie = :serie AND f.id = :factura');
      LQuery.ParamByName('facturaDoc').AsString := LFacturaDoc;
      LQuery.ParamByName('empresa').AsInteger := LIdEmpresa;
      LQuery.ParamByName('serie').AsString := LSerie;
      LQuery.ParamByName('factura').AsInteger := LIdFactura;
      LQuery.ExecSQL;
    finally
      LQuery.Free;
    end;

    ShowMessage('¡¡¡ FACTURA CREADA CORRECTAMENTE CON EL NÚMERO: ' + LSerie + '/' + LIdFacturaStr + ' !!!');
  end;

  albaranes.Refresh;
  albaranes.Locate('idempresa,serie,id', VarArrayOf([LEmpresaStr, LSerie, LIdAlbaranStr]), [loCaseInsensitive]);
  albaranesdetalle.Refresh;
end;

procedure Talbaranes.btAguardarClick(Sender: TObject);
var id,empresa,serie:string;
    insertando:integer;
    cantidad,coste_trans,total,comision:real;
begin
    empresa:=albaranesidempresa.AsString;
    id:=albaranesid.AsString;
    serie:=albaranesserie.AsString;
    if albaranes.State in [dsinsert] then insertando:=1 else insertando:=0;
    albaranescccuentabancaria.Value:=qcuentasbanco.asstring+' '+qcuentascciban.asstring+qcuentasccentidad.asstring+qcuentasccoficina.asstring+qcuentasccdc.asstring+qcuentascccc.asstring;
    //albaranescomision.value:=qclientescomision.asfloat;
    albaranes.Post;
    if insertando=1 then
    begin
      qseries.edit;
      qseriesnum_albaran.Value:=qseriesnum_albaran.AsInteger+1;
      qseries.Post;
    end;
    if insertando=0 then
    begin
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('select sum(cantidad),sum(total) from albaranes_detalles where lote is not null and idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring);
      qaux.Open;
      cantidad:=qaux.Fields[0].AsFloat;
      total:=qaux.Fields[1].AsFloat;
      if (cantidad>0) and (albaranescoste_transporte.AsFloat>0) then
      begin
        coste_trans:=albaranescoste_transporte.AsFloat/cantidad;
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('update albaranes_detalles set coste_transporte=cantidad*'+stringreplace(floattostr(coste_trans),',','.',[rfreplaceall])+' where lote is not null and idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring+' and idarticulo<>(select codcomision from empresa where id='+albaranesidempresa.AsString+') and idarticulo<>(select codtransporte from empresa where id='+albaranesidempresa.AsString+')');
        qaux.execsql;

      end;
      comision:=albaranescomision.AsFloat/100;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update albaranes_detalles set coste_comision=total*'+stringreplace(floattostr(comision),',','.',[rfreplaceall])+' where idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring+' and idarticulo<>(select codcomision from empresa where id='+albaranesidempresa.AsString+') and idarticulo<>(select codtransporte from empresa where id='+albaranesidempresa.AsString+')');
      qaux.execsql;

    end;
    albaranesdetalle.open;
    albaranesdetalle.Refresh;
    albaranesdetalle.Last;
    albaranes.Refresh;
    albaranes.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]);
    qalbaranesiva.Open;
    qalbaranesiva.Refresh;
    panel3.Enabled:=false;
    comboserie2.keyvalue:=qseriesid.AsString;
    albaranes.Close;
    albaranes.SQL.Clear;
    albaranes.SQL.Add('select * from albaranes where serie='+''''+qseriesid.AsString+''''+' order by serie desc,id desc');
    albaranes.Open;
    albaranes.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]);

end;

procedure Talbaranes.btAmodificarClick(Sender: TObject);
begin
    if albaranesfacturado.AsInteger=0 then
    BEGIN
        panel3.Enabled:=true;
        albaranes.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;
        comboserie.Enabled:=true;
        comboclientes.Enabled:=true;
        combodestinos.Enabled:=true;
        comboformapago.Enabled:=true;
        dbedit1.Enabled:=true;
        dbmemo2.Enabled:=true;
        dbedit2.Enabled:=true;
        dbgrid2.Enabled:=true;
    END  else
    begin
       panel3.enabled:=true;
       comboserie.Enabled:=false;
       comboclientes.Enabled:=false;
       combodestinos.Enabled:=false;
       comboformapago.Enabled:=false;
       dbedit1.Enabled:=false;
       dbmemo2.Enabled:=false;
       dbedit2.Enabled:=false;
       //dbgrid2.Enabled:=false;
       costetrans.enabled:=true;
       comision.Enabled:=true;
       costetrans.SetFocus;
    end
end;

procedure Talbaranes.btAnuevoClick(Sender: TObject);
begin
    panel3.Enabled:=true;
    comboserie.SetFocus;
    comboserie.KeyValue:=qseriesid.Asstring;
    //fechaalbaran.Date:=date;

    albaranes.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;
    albaranesdetalle.Close;
    qalbaranesiva.close;
    albaranesfecha.Value:=date;
end;

procedure Talbaranes.btaimprimirClick(Sender: TObject);
var filtro,documento,formapago,pedidos,fechacarga,desg_ivas,base,iva,tipo,lotes,palets,variedades,cant_palets:string;
    fecha:tdate;
begin
    if listaimpresion.ItemIndex=0 then
    begin

       dsalbaranesdetalle.DataSet:=albaranesdetallegrupo;
       {.SQL.Add('select idempresa,idalbaran,sum(cantidad) as cantidad,precio,descuento,sum(base) as base,descripcion,cal,sum(palets) as palets,sum(bultos) as bultos,tipoiva,sum(iva) as iva,sum(total) as total,id,'+''''''+' as idarticulo,sum(totaldescuento) as totaldescuento,'+''''''+' as lote,serie,coste_transporte,coste_otros');
       albaranesdetalle.SQL.Add(',coste_comision,sum(pesobruto) as pesobruto,idfactura from albaranes_detalles group by idempresa,idalbaran,descripcion,cal,precio order by id');}

    end;
    if listaimpresion.ItemIndex=1 then
    begin

       dsalbaranesdetalle.DataSet:=albaranesdetalle;

{       albaranesdetalle.Close;
       albaranesdetalle.SQL.Clear;
       albaranesdetalle.SQL.Add('select * from albaranes_detalles order by id');
       albaranesdetalle.open;}
    end;

    filtro:='id=';
    filtro:=filtro+albaranesid.asstring;
    filtro:=filtro+' and serie='+''''+albaranesserie.AsString+'''';
    if comboformulario.KeyValue=null then documento:=qseriesimp_albaran.AsString
      else documento:=qformulariosformulario.AsString;
    albaranes.Filter:=filtro;
    albaranes.filtered:=true;
    fecha:=albaranesfecha.AsDateTime;
    fecha:=fecha+qformaspagodias.asinteger;
    formapago:='FORMA DE PAGO: '+qformaspagodescripcion.AsString+' FECHA DE VENCIMIENTO EL '+DATETOSTR(FECHA);
    if albaranesccid.AsString<>'' then
    begin
    {  qaux.SQL.Clear;
      qaux.SQL.Add('SELECT concat(banco,'+''''+' '+''''+',cciban,'+''''+'-'+''''+',ccentidad,'+''''+'-'+''''+',ccoficina,'+''''+'-'+''''+',ccdc,'+''''+'-'+''''+',cccc) FROM cuentas_bancarias where ide='+albaranesidempresa.AsString+' and id='+albaranesccid.asstring);
      qaux.open;}
      formapago:=formapago+'  '+qaux.Fields[0].asstring;
    end;
    qalbaranesiva.First;
    desg_ivas:='';
    while not qalbaranesiva.Eof do
    begin
    if qalbaranesivabase.AsFloat<>0 then
      begin
         tipo:=format('%2d',[qalbaranesivatipo.asinteger]);
         base:=format('%10.2f',[qalbaranesivabase.Asfloat]);
         iva:=format('%8.2f',[qalbaranesivaiva.asfloat]);
         desg_ivas:=desg_ivas+tipo+' '+iva;
      end;
      qalbaranesiva.Next;
    end;
    qalbaraneslotes.First;
    lotes:='';
    variedades:='';
    while not qalbaraneslotes.Eof do
    begin
      lotes:=lotes+qalbaranesloteslote.AsString+#13+#10;
      variedades:=variedades+qalbaraneslotesvariedad.AsString+#13+#10;
      qalbaraneslotes.Next;
    end;
    qalbaranespalets.First;
    palets:='';
    cant_palets:='';
    while not qalbaranespalets.Eof do
    begin
      palets:=palets+qalbaranespaletstipo_palet.AsString+#13+#10;
      cant_palets:=cant_palets+qalbaranespaletscantidad.asstring+#13+#10;
//      palets:=palets+qalbaranespaletstipo_palet.asstring+#9+#9+qalbaranespaletscantidad.AsString+#13+#10;
      qalbaranespalets.Next;
    end;

    pedidos:='';
    qaux.SQL.Clear;
    qaux.SQL.Add('SELECT pedidocliente,fecha_carga FROM pedidos where (id,ide) in (select idpedido,ide from pedidosdetalle where idalbaran='+''''+albaranesserie.AsString+'/'+albaranesid.AsString+''''+')');
    qaux.open;
    while not qaux.Eof do
    begin
      pedidos:=pedidos+' '+qaux.Fields[0].AsString;
      qaux.Next;
    end;
    fechacarga:=qaux.Fields[1].AsString;


    infalbaran.Datasource:=dsalbaranes;
    infdetallealbaran.Datasource:=dsalbaranesdetalle;
    infalbaranivas.Datasource:=dsqalbaranesiva;
    informe.Report.Clear;
    informe.LoadFromFile('c:\agrigest\informes\'+documento+'.fr3');
    informe.Variables.Variables['FORMAPAGO']:=QUOTEDSTR(formapago);
    informe.Variables.Variables['PEDIDOS']:=QUOTEDSTR(pedidos);
    informe.Variables.Variables['FECHACARGA']:=QUOTEDSTR(fechacarga);
    informe.Variables.Variables['DESGIVAS']:=QUOTEDSTR(desg_ivas);
    informe.Variables.Variables['LOTES']:=QUOTEDSTR(lotes);
    informe.Variables.Variables['PALETS']:=QUOTEDSTR(palets);
    informe.Variables.Variables['CANTIDAD']:=QUOTEDSTR(cant_palets);
    informe.Variables.Variables['VARIEDAD']:=QUOTEDSTR(variedades);
    informe.ShowReport();
    informe.Clear;
//    informe.Variables.Variables['TITULO']:=QUOTEDSTR(panel100.Caption);

    albaranes.filtered:=false;
    dsalbaranesdetalle.DataSet:=albaranesdetalle;
{    albaranesdetalle.Close;
    albaranesdetalle.SQL.Clear;
    albaranesdetalle.SQL.Add('select * from albaranes_detalles order by id');
    albaranesdetalle.open;}

end;

procedure Talbaranes.btaimportarClick(Sender: TObject);
var serie,idalbaran:string;
begin
    serie:=albaranesserie.AsString;
    idalbaran:=albaranesid.AsString;
    seleccionarpedidos := Tseleccionarpedidos.Create(nil);
    try
      seleccionarpedidos.showmodal();
    finally
      seleccionarpedidos.Free;
      albaranes.refresh;
      albaranes.Locate('serie,id',vararrayof([serie,idalbaran]),[locaseinsensitive])

    end;
end;

procedure Talbaranes.Button10Click(Sender: TObject);
begin
  qalbaraneslotes.Delete;
end;

procedure Talbaranes.Button11Click(Sender: TObject);
begin
  qalbaranespalets.delete;
end;

procedure Talbaranes.Button1Click(Sender: TObject);
var
  precio, serie, id: string;
  i: integer;
  LPrecioVal: Double;
begin
  serie := albaranesserie.AsString;
  id := albaranesid.AsString;
  if Trim(edit1.Text) = '' then Exit;
  precio := stringreplace(Trim(edit1.Text), '.', ',', [rfreplaceall]);
  if not TryStrToFloat(precio, LPrecioVal) then
  begin
    ShowMessage('El precio introducido no es válido.');
    Exit;
  end;

  if albaranesdetalle.RecordCount > 0 then
  begin
    albaranesdetalle.DisableControls;
    try
      if dbgrid2.Selectedrows.Count > 0 then
      begin
        for i := 0 to dbgrid2.Selectedrows.Count - 1 do
        begin
          albaranesdetalle.GotoBookmark(dbgrid2.selectedrows[i]);
          albaranesdetalle.Edit;
          albaranesdetalleprecio.Value := LPrecioVal;
          albaranesdetalle.Post;
        end;
      end
      else
      begin
        albaranesdetalle.First;
        while not albaranesdetalle.Eof do
        begin
          if albaranesdetallecantidad.AsFloat > 0 then
          begin
            albaranesdetalle.Edit;
            albaranesdetalleprecio.Value := LPrecioVal;
            albaranesdetalle.Post;
          end;
          albaranesdetalle.Next;
        end;
      end;
    finally
      albaranesdetalle.EnableControls;
    end;

    // Recalcular totales e IVA del albarán de una sola vez
    RecalcularTotalesAlbaran(albaranesidempresa.AsInteger, serie, StrToIntDef(id, 0));
    albaranesdetalle.Refresh;
    albaranes.Refresh;
    albaranes.Locate('serie,id', VarArrayOf([serie, id]), [loCaseInsensitive]);
    qalbaranesiva.Refresh;
  end;
end;

procedure Talbaranes.Button2Click(Sender: TObject);
var id,codcomision,empresa,serie:string;
    coste_trans,cantidad,comision:real;
begin
   codcomision:=dm.tempresacodcomision.AsString;
   empresa:=albaranesidempresa.AsString;
   serie:=albaranesserie.AsString;
   id:=albaranesid.AsString;
   albaranesdetalle.Append;
   albaranesdetalleidarticulo.Value:=codcomision;
   filtro:=albaranesdetalleidarticulo.asstring;
   qarticulos.Close;
   qarticulos.Open;
   if qarticulos.RecordCount>0 then
   begin
     qtipos_iva.Open;
     albaranesdetalledescripcion.value:=qarticulosdescripcion.AsString;
     if qclientesexento_iva.AsInteger=0 then albaranesdetalletipoiva.value:=qtipos_ivatipo.Asfloat
      else albaranesdetalletipoiva.value:=0;
   end;

   albaranesdetallecantidad.Value:=-1;
   albaranesdetalleprecio.Value:=albaranesneto.AsFloat*(albaranescomision.AsFloat/100);
   albaranesdetalle.Post;
   qaux.Close;
   qaux.SQL.Clear;
   qaux.SQL.Add('select sum(cantidad),sum(total) from albaranes_detalles where lote is not null and idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring);
   qaux.Open;
   cantidad:=qaux.Fields[0].AsFloat;
   if (cantidad>0) and (albaranescoste_transporte.AsFloat>0) then
      begin
        coste_trans:=albaranescoste_transporte.AsFloat/cantidad;
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('update albaranes_detalles set coste_transporte=cantidad*'+stringreplace(floattostr(coste_trans),',','.',[rfreplaceall])+' where lote is not null and idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring+' and idarticulo<>(select codcomision from empresa where id='+albaranesidempresa.AsString+') and idarticulo<>(select codtransporte from empresa where id='+albaranesidempresa.AsString+')');
        qaux.execsql;
      end;
      comision:=albaranescomision.AsFloat/100;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update albaranes_detalles set coste_comision=total*'+stringreplace(floattostr(comision),',','.',[rfreplaceall])+' where idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring+' and idarticulo<>(select codcomision from empresa where id='+albaranesidempresa.AsString+') and idarticulo<>(select codtransporte from empresa where id='+albaranesidempresa.AsString+')');
      qaux.execsql;

    albaranes.Refresh;
    albaranes.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]);
    albaranesdetalle.Refresh;
    albaranesdetalle.Last;
    qalbaranesiva.Refresh;

end;

procedure Talbaranes.Button3Click(Sender: TObject);
var  archivo:string;
begin
    qalbaranesclientes.Close;
    qalbaranesclientes.SQL.Clear;
    qalbaranesclientes.SQL.Add('(select a.*,ad.*,l.parcela from albaranes a,albaranes_detalles ad,lotes l where l.idempresa=ad.idempresa and l.codigo=ad.lote and a.idempresa=ad.idempresa and a.serie=ad.serie and a.id=ad.idalbaran and a.serie='+''''+qseries2id.AsString+''''+') ');
    qalbaranesclientes.SQL.Add(' union ALL ');
    qalbaranesclientes.SQL.Add('(select a.*,ad.*,'+''''+' '+''''+' as parcela from albaranes a,albaranes_detalles ad where ad.lote is null and a.idempresa=ad.idempresa and a.serie=ad.serie and a.id=ad.idalbaran and a.serie='+''''+qseries2id.AsString+''''+') order by fecha desc');
    qalbaranesclientes.open;
    savedialog1.FileName:='ALBARANES CLIENTES.xlsx';
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
    try
    Exportaraexcel(archivo,'ALBARANES',gridalbaranesaexcel);
    finally
      showmessage('Los datos han sido exportados correctamente');
    end;

end;

procedure Talbaranes.Button4Click(Sender: TObject);
var serie,id:string;
begin
    if albaranesdetalle.recordcount>0 then
    begin
        serie:=albaranesserie.AsString;
        id:=albaranesid.AsString;
        albaranesdetalle.Delete;
        albaranesdetalle.Refresh;
//        albaranes.Refresh;
//        albaranes.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive,lopartialkey]);
        qalbaranesiva.Refresh;
    end;
end;

procedure Talbaranes.Button5Click(Sender: TObject);
var id,codtransporte,empresa,serie:string;
    coste_trans,cantidad,comision:real;
begin
   id:=albaranesid.AsString;
   empresa:=albaranesidempresa.AsString;
   serie:=albaranesserie.AsString;
   codtransporte:=dm.tempresacodtransporte.AsString;
   albaranesdetalle.Append;
   albaranesdetalleidarticulo.Value:=codtransporte;
   filtro:=albaranesdetalleidarticulo.asstring;
   qarticulos.Close;
   qarticulos.Open;
   if qarticulos.RecordCount>0 then
   begin
     qtipos_iva.Open;
     albaranesdetalledescripcion.value:=qarticulosdescripcion.AsString;
     if qclientesexento_iva.AsInteger=0 then albaranesdetalletipoiva.value:=qtipos_ivatipo.Asfloat
      else albaranesdetalletipoiva.value:=0;
   end;
   albaranesdetallecantidad.Value:=-1;
   albaranesdetalleprecio.Value:=albaranescoste_transporte.AsFloat;
   albaranesdetalle.Post;
   qaux.Close;
   qaux.SQL.Clear;
   qaux.SQL.Add('select sum(cantidad),sum(total) from albaranes_detalles where lote is not null and idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring);
   qaux.Open;
   cantidad:=qaux.Fields[0].AsFloat;

   if (cantidad>0) and (albaranescoste_transporte.AsFloat>0) then
      begin
        coste_trans:=albaranescoste_transporte.AsFloat/cantidad;

        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('update albaranes_detalles set coste_transporte=cantidad*'+stringreplace(floattostr(coste_trans),',','.',[rfreplaceall])+' where lote is not null and idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring+' and idarticulo<>(select codcomision from empresa where id='+albaranesidempresa.AsString+') and idarticulo<>(select codtransporte from empresa where id='+albaranesidempresa.AsString+')');
        qaux.execsql;

      end;
      comision:=albaranescomision.AsFloat/100;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update albaranes_detalles set coste_comision=total*'+stringreplace(floattostr(comision),',','.',[rfreplaceall])+' where idempresa='+empresa+' and serie='+''''+serie+''''+' and idalbaran='+albaranesid.asstring+' and idarticulo<>(select codcomision from empresa where id='+albaranesidempresa.AsString+') and idarticulo<>(select codtransporte from empresa where id='+albaranesidempresa.AsString+')');
      qaux.execsql;

    albaranes.Refresh;
    albaranes.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]);
    albaranesdetalle.Refresh;
    albaranesdetalle.Last;
    qalbaranesiva.Refresh;


end;

procedure Talbaranes.Button7Click(Sender: TObject);
begin
    traza_materiales2 := Ttraza_materiales2.Create(nil);
    try
      traza_materiales2.qpesadas.close;
      traza_materiales2.qpesadas.SQL.Clear;
      traza_materiales2.qpesadas.SQL.Add('select mat.idea,mat.idea2,mat.idaf,af.descripcion,mat.cantidad,mat.lote,e.documento as doc_compra,p.nombre as proveedor,:documento as documento from ea_materiales mat ,articulosf af,entradas_detalle ed,entradas e,proveedores p  where');
      traza_materiales2.qpesadas.SQL.Add('mat.idaf=af.id and mat.ide=af.idempresa and  mat.idaf=ed.id_propio and mat.lote=ed.lote and ed.identrada=e.id and mat.ide=e.idempresa and e.idproveedor=p.id and');
      traza_materiales2.qpesadas.SQL.Add(' (ide,idea,idea2) in (select idempresa,id,idea from ea_pesadas where idalbaran=:documento) order by idaf,idea,idea2');
      traza_materiales2.qpesadas.ParamByName('documento').AsString:=albaranesserie.AsString+'/'+albaranesid.AsString;
      traza_materiales2.qpesadas.prepare;
      traza_materiales2.qpesadas.open;
      traza_materiales2.DBGrid2.Columns[0].Title.caption:='Albaran';
      traza_materiales2.showmodal();
    finally
      traza_materiales2.Free;
    end;

end;

procedure Talbaranes.Button9Click(Sender: TObject);
var cabecera,embalajes,lineas,localizaciones,marcas:textfile;
    campo,tipo,ruta,archivo,cadena,parteentera,partedecimal,linea,vdia,vmes,vanyo:string;
    largo,num_envases,num_bultos:real;
    i,largototal,decimales,encontrado,numlinea,idenvase:integer;
    dia,mes,anyo:word;
begin
  SaveDialog1.FileName := 'CABALB.TXT';
  SaveDialog1.Execute();
  ruta:= extractfilepath(savedialog1.filename);
  try
    assignfile(cabecera, ruta+'CABALB.TXT');
    rewrite(cabecera);
    assignfile(embalajes, ruta+'EMBALB.TXT');
    rewrite(embalajes);
    assignfile(lineas, ruta+'LINALB.TXT');
    rewrite(lineas);
    assignfile(localizaciones, ruta+'LOCALB.TXT');
    rewrite(localizaciones);
    assignfile(marcas, ruta+'MARCALB.TXT');
    rewrite(marcas);
    if dbgrid3.SelectedRows.Count>0 then
    for i := 0 to dbgrid3.Selectedrows.Count - 1 do
      begin
        albaranes.GotoBookmark ((dbgrid3.selectedrows[i]));
        qedicabecera.close;
        qedicabecera.Prepare;
        qedicabecera.ParamByName('SERIE').Asstring:=albaranesserie.asstring;
        qedicabecera.ParamByName('ALBARAN').Asinteger:=albaranesid.asinteger;
        qedicabecera.open;
        qediembalajes.Close;
        qediembalajes.Prepare;
        qediembalajes.ParamByName('ALBARAN').AsString:=albaranesserie.AsString+'/'+albaranesid.AsString;
        qediembalajes.Open;
        qedilocalizaciones.close;
        qedilocalizaciones.Prepare;
        qedilocalizaciones.ParamByName('SERIE').Asstring:=albaranesserie.asstring;
        qedilocalizaciones.ParamByName('ALBARAN').Asinteger:=albaranesid.asinteger;
        qedilocalizaciones.open;
        qedilinalbaran.close;
        qedilinalbaran.Prepare;
        qedilinalbaran.ParamByName('SERIE').Asstring:=albaranesserie.asstring;
        qedilinalbaran.ParamByName('ALBARAN').Asinteger:=albaranesid.asinteger;
        qedilinalbaran.open;
 ///// CABECERA ALBARAN
    qedi_cabalbaran.Open;
    qedi_cabalbaran.First;
    linea:='';
    while not qedi_cabalbaran.Eof do
    begin
      campo:=qedi_cabalbarancampo.AsString;
      largo:=qedi_cabalbaranlongitud.AsFloat;
      cadena:=formatfloat('#####.0',largo);
      parteentera:= copy(cadena,0,pos(',',cadena)-1);
      largototal:=strtoint(parteentera);
      partedecimal:= copy(cadena,pos(',',cadena)+1,length(Cadena));
      decimales:=strtoint(partedecimal);
      tipo:=qedi_cabalbarantipo.AsString;
      cadena:='';
      if tipo='X' then
      begin
        //campo:=copy(campo,0,largototal-1);
        if campo='IDCAB' then
        begin
             cadena:=qedicabeceraidcab.AsString;
        end;
        if campo='NUMDES' then
        begin
             cadena:=qedicabeceranumdes.AsString;
        end;
        if campo='TIPO' then
        begin
             cadena:=qedicabeceratipo.AsString;
        end;
        if campo='FUNCION' then
        begin
             cadena:='9';
        end;
        if campo='DPTO' then
        begin
             cadena:=qedicabeceradpto.asstring;
        end;
        if campo='FECDES' then
        begin
          decodedate(qedicabecerafecdes.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='FECPED' then
        begin
          decodedate(qedicabecerafecped.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='FECENT' then
        begin
          decodedate(qedicabecerafecent.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='NUMALB' then
        begin
          if qedicabeceraalbarancliente.AsString<>'' then cadena:=qedicabeceraalbarancliente.AsString else cadena:=qedicabeceranumalb.AsString;
        end;
        if campo='FECALB' then
        begin
          decodedate(qedicabecerafecalb.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='NUMPED' then
        begin
             cadena:=qedicabeceranumped.AsString;
        end;
        if campo='ORIGEN' then
        begin
             cadena:=qedicabeceraorigen.AsString;
        end;
        if campo='DESTINO' then
        begin
             cadena:=qedicabeceradestino.AsString;
        end;
        if campo='PROVEEDO' then
        begin
           cadena:=qedicabeceraorigen.AsString;
           //cadena:=qedicabeceraproveedo.AsString;
        end;
        if campo='COMPRADO' then
        begin
             cadena:=qedicabeceracomprado.AsString;
        end;
        if campo='RECEPTOR' then
        begin
             cadena:=qedicabecerareceptor.Asstring;
        end;
        if campo='FECENV' then
        begin
          decodedate(qedicabecerafecenv.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='CODPROV' then
        begin
             cadena:=qedicabeceracodprov.AsString;
        end;
        if campo='NOMBREEMISOR' then
        begin
             cadena:=qedicabeceranombreemisor.asstring;
        end;
        if campo='NIFEMISOR' then
        begin
             cadena:=qedicabeceranifemisor.asstring;
        end;
        if campo='NIFPROVEEDOR' then
        begin
             cadena:=qedicabeceranifemisor.asstring;
        end;
        if campo='PAISPROVEEDOR' then
        begin
             cadena:='ESP';
        end;
        if campo='NOMBRERECEPTOR' then
        begin
             cadena:=qedicabeceranombrereceptor.asstring;
        end;
        if campo='NOMBRECOMPRADOR' then
        begin
             cadena:=qedicabeceranombrecomprador.asstring;
        end;
        if campo='NOMBREPROVEEDOR' then
        begin
            cadena:=qedicabeceranombreemisor.asstring;
            //cadena:=qedicabeceranombreproveedor.asstring;
        end;
        if campo='NOMBREPTOENTREGA' then
        begin
             cadena:=qedicabeceranombreptoentrega.asstring;
        end;
        if campo='DIRECCIONEMISOR' then
        begin
             cadena:=qedicabeceradireccionemisor.asstring;
        end;
        if campo='POBLACIONEMISOR' then
        begin
             cadena:=qedicabecerapoblacionemisor.asstring;
        end;
        if campo='PROVINCIAEMISOR' then
        begin
             cadena:=qedicabeceraprovinciaemisor.asstring;
        end;
        if campo='CPEMISOR' then
        begin
             cadena:=qedicabeceracpemisor.asstring;
        end;
        if campo='DIRECCIONPROVEEDOR' then
        begin
             cadena:=qedicabeceradireccionemisor.asstring;
        end;
        if campo='POBLACIONPROVEEDOR' then
        begin
             cadena:=qedicabecerapoblacionemisor.asstring;
        end;
        if campo='PROVINCIAPROVEEDOR' then
        begin
             cadena:=qedicabeceraprovinciaemisor.asstring;
        end;
        if campo='CPPROVEEDOR' then
        begin
             cadena:=qedicabeceracpemisor.asstring;
        end;
        if campo='DIRECCIONCOMPRADOR' then
        begin
             cadena:=qedicabeceradireccioncomprador.asstring;
        end;
        if campo='POBLACIONCOMPRADOR' then
        begin
             cadena:=qedicabecerapoblacioncomprador.asstring;
        end;
        if campo='PROVINCIACOMPRADOR' then
        begin
             cadena:=qedicabeceraprovinciacomprador.asstring;
        end;
        if campo='CPCOMPRADOR' then
        begin
             cadena:=qedicabeceracpcomprador.asstring;
        end;
        if campo='DIRECCIONPTOENTREGA' then
        begin
             cadena:=qedicabeceradireccionptoentrega.asstring;
        end;
        if campo='POBLACIONPTOENTREGA' then
        begin
             cadena:=qedicabecerapoblacionptoentrega.asstring;
        end;
        if campo='PROVINCIAPTOENTREGA' then
        begin
             cadena:=qedicabeceraprovinciaptoentrega.asstring;
        end;
        if campo='CPPTOENTREGA' then
        begin
             cadena:=qedicabeceracpptoentrega.asstring;
        end;
        if campo='DIRECCIONRECEPTOR' then
        begin
             cadena:=qedicabeceradireccionreceptor.asstring;
        end;
        if campo='POBLACIONRECEPTOR' then
        begin
             cadena:=qedicabecerapoblacionreceptor.asstring;
        end;
        if campo='PROVINCIARECEPTOR' then
        begin
             cadena:=qedicabeceraprovinciareceptor.asstring;
        end;
        if campo='CPRECEPTOR' then
        begin
             cadena:=qedicabeceracpreceptor.asstring;
        end;
        if campo='NIFPROVEEDOR' then
        begin
            cadena:=qedicabeceranifemisor.asstring;
            //cadena:=qedicabeceranifproveedor.asstring;
        end;
        if campo='MONEDA' then
        begin
             cadena:=qedicabeceramoneda.asstring;
        end;
        if campo='MEDIOTRAN' then
        begin
             cadena:=qedicabeceramediotran.asstring;
        end;
        if campo='ORDENADOR' then
        begin
             cadena:=qedicabeceraordenador.asstring;
        end;
        if campo='NOMCONREC' then
        begin
             cadena:='PERECEDEROS';
        end;
        if campo='ULTCONS' then
        begin
             cadena:=qedicabeceraultcons.asstring;
        end;
        cadena:=copy(cadena,0,largototal);
        linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
      end;
      if tipo='N' then
      begin
        largo:=0;
        if campo='TOTQTY' then
        begin
             largo:=qedicabeceratotqty.Asfloat;
        end;
        if campo='IMPTOTBRUTO' then
        begin
             largo:=qedicabeceraimptotbruto.Asfloat;
        end;
        if campo='IMPTOTNETO' then
        begin
             largo:=qedicabeceraimptotneto.Asfloat;
        end;
        if campo='PESOBRUTOT' then
        begin
             largo:=qedicabecerapesobrutot.Asfloat;
        end;
        if campo='PESONETTOT' then
        begin
             largo:=qedicabecerapesonettot.Asfloat;
        end;
        if campo='NUMTOTBUL' then
        begin
             largo:=qedicabeceranumtotbul.Asfloat;
        end;
        if largo>0 then
          begin
            case decimales of
              0:cadena:=formatfloat('#####',largo);
              1:cadena:=formatfloat('#####.0',largo);
              2:cadena:=formatfloat('#####.00',largo);
              3:cadena:=formatfloat('#####.000',largo);
              4:cadena:=formatfloat('#####.0000',largo);
              5:cadena:=formatfloat('#####.00000',largo);
            end;
    //        cadena:=floattostrf(largo,ffGeneral,largototal,decimales);
            linea:=linea+ StringOfChar('0', largototal - length(cadena))+cadena;
            end else
          begin
             cadena:='';
             cadena:=copy(cadena,0,largototal);
             linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
          end;
      end;
      qedi_cabalbaran.next;
    end;
    writeln(cabecera, linea );
/////   EMBALAJES

    idenvase:=1;
    while not qediembalajes.eof do
    begin
      qedi_embalbaran.Open;
      qedi_embalbaran.First;
      linea:='';
      while not qedi_embalbaran.Eof do
      begin
        campo:=qedi_embalbarancampo.AsString;
        largo:=qedi_embalbaranlongitud.AsFloat;
        cadena:=formatfloat('#####.0',largo);
        parteentera:= copy(cadena,0,pos(',',cadena)-1);
        largototal:=strtoint(parteentera);
        partedecimal:= copy(cadena,pos(',',cadena)+1,length(Cadena));
        decimales:=strtoint(partedecimal);
        tipo:=qedi_embalbarantipo.AsString;
        cadena:='';
        if tipo='X' then
        begin
        if campo='IDCAB' then
        begin
             cadena:=qediembalajesidcab.asstring;
        end;
        if campo='IDEMB' then
        begin
             cadena:=qediembalajescpso.asstring;
{             cadena:=inttostr(idenvase);
             if qediembalajescpso.AsString='1' then
             begin
                idenvase:=idenvase+1;
             end;}
        end;
        if campo='CPS' then
        begin
          cadena:=qediembalajescpso.asstring;
{             if pos('PALET',qediembalajesdescemb.asstring)>0 then
             begin
                cadena:='1';//qediembalajescpso.asstring;
             end else
             begin
                cadena:=inttostr(numlinea);
                if qediembalajescpso.AsString='1' then
                begin
                   numlinea:=numlinea+1;
                end;
            end;}
        end;
        if campo='CPSPADRE' then
        begin
             if pos('PALET',qediembalajesdescemb.asstring)>0 then
             begin
                cadena:='';//qediembalajescpso.asstring;
             end else cadena:='1';
        end;
        if campo='TIPEMB' then
        begin
          encontrado:=0;
             cadena:=qediembalajesdescemb.asstring;
             if encontrado=0 then encontrado:=pos('CARTON',cadena);
             if encontrado>0 then
             begin
               cadena:='CT';
               encontrado:=-1;
             end;
             if encontrado=0 then encontrado:=pos('PALET',cadena);
             if encontrado>0 then cadena:='09';
             if encontrado=0 then cadena:='CS';
        end;
        if campo='DESCEMB' then
        begin
             cadena:=qediembalajesdescemb.asstring;
        end;
        if campo='PAGRET' then
        begin
             cadena:=qediembalajespagret.asstring;

        end;
        if campo='SSCC1' then
        begin
             if pos('PALET',qediembalajesdescemb.asstring)>0 then
             begin
                cadena:='';//qediembalajescpso.asstring;
             end else
             cadena:=qediembalajessscc1.asstring;
        end;
        if campo='FORMATO' then
        begin
             cadena:=qediembalajesformato.asstring;
        end;
        cadena:=copy(cadena,0,largototal);
        linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
        end;
        if tipo='N' then
        begin
          largo:=0;
          if campo='CANTEMB' then
          begin
//               num_envases:=num_envases+qediembalajescantemb.Asfloat;
               num_envases:=qediembalajescantemb.Asfloat;
               largo:=num_envases;
          end;
          if campo='BULTPALET' then
          begin
               num_bultos:=qediembalajesbultpalet.Asfloat;
//               num_bultos:=num_bultos+qediembalajesbultpalet.Asfloat;
               largo:=num_bultos
          end;
          if largo>0 then
          begin
            case decimales of
              0:cadena:=formatfloat('#####',largo);
              1:cadena:=formatfloat('#####.0',largo);
              2:cadena:=formatfloat('#####.00',largo);
              3:cadena:=formatfloat('#####.000',largo);
              4:cadena:=formatfloat('#####.0000',largo);
              5:cadena:=formatfloat('#####.00000',largo);
            end;
    //        cadena:=floattostrf(largo,ffGeneral,largototal,decimales);
            linea:=linea+ StringOfChar('0', largototal - length(cadena))+cadena;
          end else
          begin
             cadena:='';
             cadena:=copy(cadena,0,largototal);
             linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
          end;

        end;
        qedi_embalbaran.next;
      end;

      writeln(embalajes, linea );
      qediembalajes.Next;

    end;
/////    MARCAS
    qediembalajes.First;
    numlinea:=1;
    while not qediembalajes.eof do
    begin
      qedi_marcasembalaje.Open;
      qedi_marcasembalaje.First;
      linea:='';
      while not qedi_marcasembalaje.Eof do
      begin
        campo:=qedi_marcasembalajecampo.AsString;
        largo:=qedi_marcasembalajelongitud.AsFloat;
        cadena:=formatfloat('#####.0',largo);
        parteentera:= copy(cadena,0,pos(',',cadena)-1);
        largototal:=strtoint(parteentera);
        partedecimal:= copy(cadena,pos(',',cadena)+1,length(Cadena));
        decimales:=strtoint(partedecimal);
        tipo:=qedi_marcasembalajetipo.AsString;
        cadena:='';
        if tipo='X' then
        begin
        if campo='IDCAB' then
        begin
             cadena:=qediembalajesidcab.asstring;
        end;
        if campo='IDEMB' then
        begin
             cadena:=qediembalajescpso.asstring;
        end;
        if campo='IDLIN' then
        begin
             cadena:='0';//inttostr(numlinea);//qediembalajesidLIN.asstring;

        end;
        if campo='IDMARCA' then
        begin
          cadena:=inttostr(numlinea);//qediembalajesidMARCA.asstring;
        end;
        if campo='MARCA1' then
        begin
             cadena:=qediembalajesMARCA1.asstring;
        end;
        if campo='SSCC' then
        begin
             if pos('PALET',qediembalajesdescemb.asstring)>0 then
             begin
                cadena:='';//qediembalajescpso.asstring;
             end else
             cadena:=qediembalajessscc1.asstring;
        end;
        if campo='FECENV' then
        begin
          decodedate(qediembalajesfecenv.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          if pos('PALET',qediembalajesdescemb.asstring)>0 then
          begin
            cadena:='';//qediembalajescpso.asstring;
          end else
             cadena:=vanyo+vmes+vdia;
        end;
        if campo='LOTE' then
        begin
             cadena:=qediembalajesLOTE.asstring;
        end;

        cadena:=copy(cadena,0,largototal);
        linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
        end;
        if tipo='N' then
        begin
          largo:=0;
          if largo>0 then
          begin
            case decimales of
              0:cadena:=formatfloat('#####',largo);
              1:cadena:=formatfloat('#####.0',largo);
              2:cadena:=formatfloat('#####.00',largo);
              3:cadena:=formatfloat('#####.000',largo);
              4:cadena:=formatfloat('#####.0000',largo);
              5:cadena:=formatfloat('#####.00000',largo);
            end;
    //        cadena:=floattostrf(largo,ffGeneral,largototal,decimales);
            linea:=linea+ StringOfChar('0', largototal - length(cadena))+cadena;
            end else
          begin
             cadena:='';
             cadena:=copy(cadena,0,largototal);
             linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
          end;
        end;
        qedi_marcasembalaje.next;
      end;

      writeln(marcas, linea );
      qediembalajes.Next;
      numlinea:=numlinea+1;
    end;
////LINEAS ALBARAN
    qedilinalbaran.First;
    numlinea:=1;
    idenvase:=2;
    while not qedilinalbaran.eof do
    begin
      qedi_detalbaran.Open;
      qedi_detalbaran.First;
      linea:='';

      while not qedi_detalbaran.Eof do
      begin
        campo:=qedi_detalbarancampo.AsString;
        largo:=qedi_detalbaranlongitud.AsFloat;
        cadena:=formatfloat('#####.0',largo);
        parteentera:= copy(cadena,0,pos(',',cadena)-1);
        largototal:=strtoint(parteentera);
        partedecimal:= copy(cadena,pos(',',cadena)+1,length(Cadena));
        decimales:=strtoint(partedecimal);
        tipo:=qedi_detalbarantipo.AsString;
        cadena:='';
        if tipo='X' then
        begin
        if campo='IDCAB' then
        begin
             cadena:=qedilinalbaranidcab.asstring;
        end;
        if campo='IDEMB' then
        begin
             cadena:=qedilinalbarancpso.asstring;
{             cadena:=inttostr(idenvase);
             if qedilinalbarancpso.AsString='1' then
             begin
                idenvase:=idenvase+1;
             end;}
        end;
        if campo='IDLIN' then
        begin
             cadena:=inttostr(numlinea);//qedilinalbaranidlin.asstring;
             numlinea:=numlinea+1;
        end;
        if campo='EAN' then
        begin
             cadena:=qedilinalbaranean.asstring;
        end;
        if campo='NUMEXP' then
        begin
           if qedilinalbarannumexp2.AsString='' then cadena:=qedilinalbarannumexp.asstring
             else cadena:=qedilinalbarannumexp2.asstring;
        end;
        if campo='DESCRIP' then
        begin
             cadena:=qedilinalbarandescrip.asstring;
        end;
        if campo='TIPART' then
        begin
             cadena:='CU';
        end;
        if campo='NUMPED' then
        begin
             cadena:=qedilinalbarannumped.asstring;
        end;
        if campo='NUMALB' then
        begin
          if qedilinalbaranalbarancliente.AsString<>'' then cadena:=qedilinalbaranalbarancliente.AsString else cadena:=qedilinalbarannumalb.asstring;
        end;
        if campo='SSCC1' then
        begin
             cadena:=qedilinalbaransscc.asstring;
        end;
        if campo='FECENV' then
        begin
          decodedate(qedilinalbaranfecenv.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='LOTE' then
        begin
             cadena:=qedilinalbaranLOTE.asstring;
        end;
        if campo='DESTINO' then
        begin
             cadena:=qedilinalbarannombreptoentrega.asstring;
        end;
        if campo='FECPED' then
        begin
          decodedate(qedilinalbaranfecped.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='FECALB' then
        begin
          decodedate(qedilinalbaranfecalb.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='FECCADET' then
        begin
          decodedate(qedilinalbaranfeccadet.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='REFPROV' then
        begin
             cadena:=qedilinalbaranrefprov.asstring;
        end;
        if campo='UNICANT' then
        begin
             cadena:=qedilinalbaranunicant.asstring;
        end;
        if campo='TEXTO4' then
        begin
             cadena:=qedilinalbarantexto4.asstring;
        end;
        if campo='TEXTO5' then
        begin
             cadena:=qedilinalbarantexto5.asstring;
        end;
        if campo='FECCON' then
        begin
          decodedate(qedilinalbaranfeccon.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;


        cadena:=copy(cadena,0,largototal);
        linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
        end;
        if tipo='N' then
        begin
          largo:=0;
          if campo='CENVFAC' then
          begin
               largo:=qedilinalbarancenvfac.Asfloat;
          end;
          if campo='CUEXP' then
          begin
               if qedilinalbarancuexp.Asfloat=0 then largo:=1 else largo:=qedilinalbarancuexp.Asfloat;
          end;
          if campo='CANTLOC1' then
          begin
               largo:=qedilinalbarancantloc1.Asfloat;
          end;
          if campo='PESTOTLIN' then
          begin
               if qedilinalbarancuexp.Asfloat=0 then largo:=qedilinalbaranpestotlin.Asfloat else largo:=0;
          end;
          if campo='PESOBRUTO' then
          begin
               largo:=qedilinalbaranpesobruto.Asfloat;
          end;
          if campo='PESONETO' then
          begin
               largo:=qedilinalbaranpesoneto.Asfloat;
          end;
          if largo>0 then
          begin
            case decimales of
              0:cadena:=formatfloat('#####',largo);
              1:cadena:=formatfloat('#####.0',largo);
              2:cadena:=formatfloat('#####.00',largo);
              3:cadena:=formatfloat('#####.000',largo);
              4:cadena:=formatfloat('#####.0000',largo);
              5:cadena:=formatfloat('#####.00000',largo);
            end;
    //        cadena:=floattostrf(largo,ffGeneral,largototal,decimales);
            linea:=linea+ StringOfChar('0', largototal - length(cadena))+cadena;
            end else
          begin
             cadena:='';
             cadena:=copy(cadena,0,largototal);
             linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
          end;
        end;
        qedi_detalbaran.next;
      end;

      writeln(lineas, linea );
      qedilinalbaran.Next;
    end;
/// LOCALIZACIONES
///
    qedilocalizaciones.First;
    numlinea:=1;
    while not qedilocalizaciones.eof do
    begin
      qedi_lugaresentrega.Open;
      qedi_lugaresentrega.First;
      linea:='';
      while not qedi_lugaresentrega.Eof do
      begin
        campo:=qedi_lugaresentregacampo.AsString;
        largo:=qedi_lugaresentregalongitud.AsFloat;
        cadena:=formatfloat('#####.0',largo);
        parteentera:= copy(cadena,0,pos(',',cadena)-1);
        largototal:=strtoint(parteentera);
        partedecimal:= copy(cadena,pos(',',cadena)+1,length(Cadena));
        decimales:=strtoint(partedecimal);
        tipo:=qedi_lugaresentregatipo.AsString;
        cadena:='';
        if tipo='X' then
        begin
        if campo='IDCAB' then
        begin
             cadena:=qedilocalizacionesidcab.asstring;
        end;
        if campo='IDEMB' then
        begin
             cadena:=qedilocalizacionesidemb.asstring;
        end;
        if campo='IDLIN' then
        begin
             cadena:=inttostr(numlinea);//qedilocalizacionesidlin.asstring;
             numlinea:=numlinea+1;
        end;
        if campo='IDLOC' then
        begin
             cadena:=qedilocalizacionesidloc.asstring;
        end;
        if campo='LUGAR' then
        begin
             cadena:=qedilocalizacioneslugar.asstring;
        end;
        if campo='FECHAENT' then
        begin
          decodedate(qedilocalizacionesfecenv.AsDateTime,anyo,mes,dia);
          vdia:=inttostr(dia);
          vdia:=StringOfChar('0', 2 - length(vdia))+vdia;
          vmes:=inttostr(mes);
          vmes:=StringOfChar('0', 2 - length(vmes))+vmes;
          vanyo:=inttostr(anyo);
          vanyo:=StringOfChar('0', 2 - length(vanyo))+vanyo;
          cadena:=vanyo+vmes+vdia;
        end;
        if campo='NOMBREPTOENTREGA' then
        begin
             cadena:=qedilocalizacionesnombreptoentrega.asstring;
        end;
        if campo='UMEDIDA' then
        begin
             cadena:=qedilocalizacionesumedida.asstring;
        end;
        cadena:=copy(cadena,0,largototal);
        linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
        end;
        if tipo='N' then
        begin
          largo:=0;
          if campo='CANTIDAD' then
          begin
               largo:=qedilocalizacionescantidad.Asfloat;
          end;
          if campo='CANTKGM' then
          begin
               largo:=qedilocalizacionescantkgm.Asfloat;
          end;
          if largo>0 then
          begin
            case decimales of
              0:cadena:=formatfloat('#####',largo);
              1:cadena:=formatfloat('#####.0',largo);
              2:cadena:=formatfloat('#####.00',largo);
              3:cadena:=formatfloat('#####.000',largo);
              4:cadena:=formatfloat('#####.0000',largo);
              5:cadena:=formatfloat('#####.00000',largo);
            end;
    //        cadena:=floattostrf(largo,ffGeneral,largototal,decimales);
            linea:=linea+ StringOfChar('0', largototal - length(cadena))+cadena;
            end else
          begin
             cadena:='';
             cadena:=copy(cadena,0,largototal);
             linea:= linea + cadena + StringOfChar(' ', largototal - length(cadena));
          end;
        end;
        qedi_lugaresentrega.next;
      end;

      writeln(localizaciones, linea );
      qedilocalizaciones.Next
    end;
   end


    finally
    closefile(cabecera);
    closefile(embalajes);
    closefile(lineas);
    closefile(localizaciones);
    closefile(marcas);
    showmessage('Los datos han sido exportados correctamente');

  end;
end;

procedure Talbaranes.btasiguienteClick(Sender: TObject);
begin
    albaranes.Prior;
end;

procedure Talbaranes.btaanteriorClick(Sender: TObject);
begin
    albaranes.next;
end;

procedure Talbaranes.DBGrid2ColExit(Sender: TObject);
begin
  if albaranesdetalle.State in [dsedit,dsinsert] then
  begin
    if dbgrid2.SelectedIndex=0 then
    begin
        filtro:=albaranesdetalleidarticulo.asstring;
        qarticulos.Close;
        qarticulos.Open;
        if qarticulos.RecordCount>0 then
        begin
           qtipos_iva.Open;
           albaranesdetalledescripcion.value:=qarticulosdescripcion.AsString;
           if qclientesexento_iva.AsInteger<>0 then albaranesdetalletipoiva.value:=qtipos_ivatipo.Asfloat
            else albaranesdetalletipoiva.value:=0;
        end;
    end;

    if (dbgrid2.SelectedField <> nil) and SameText(dbgrid2.SelectedField.FieldName, 'lote') then
    begin
      if (albaranesdetallelote.AsString <> '') and (albaranesdetallegg.IsNull or (albaranesdetallegg.AsInteger = 0)) then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('select tiene_gg from parcelas where (codpar,empresa) in (select parcela,idempresa from lotes where codigo=' + albaranesdetallelote.AsString + ')');
        qaux.Open;
        if (qaux.RecordCount > 0) and (qaux.Fields[0].AsInteger = 1) then
          albaranesdetallegg.AsInteger := 1;
      end;
    end;
  end;

end;

procedure Talbaranes.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DrawRect: TRect;
  DrawState: UINT;
begin
  if albaranesdetalleidfactura.AsString <> '' then
  begin
    dbgrid2.Canvas.brush.Color := verde;
  end;

  if (Column.Field <> nil) and SameText(Column.FieldName, 'gg') then
  begin
    dbgrid2.Canvas.FillRect(Rect);
    DrawRect := Rect;
    if DrawRect.Right - DrawRect.Left > 14 then
    begin
      DrawRect.Left := Rect.Left + ((Rect.Right - Rect.Left - 14) div 2);
      DrawRect.Right := DrawRect.Left + 14;
    end;
    if DrawRect.Bottom - DrawRect.Top > 14 then
    begin
      DrawRect.Top := Rect.Top + ((Rect.Bottom - Rect.Top - 14) div 2);
      DrawRect.Bottom := DrawRect.Top + 14;
    end;

    if Column.Field.AsInteger = 1 then
      DrawState := DFCS_BUTTONCHECK or DFCS_CHECKED
    else
      DrawState := DFCS_BUTTONCHECK;

    DrawFrameControl(dbgrid2.Canvas.Handle, DrawRect, DFC_BUTTON, DrawState);
    Exit;
  end;

  dbgrid2.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure Talbaranes.DBGrid2CellClick(Column: TColumn);
begin
  if (Column.Field <> nil) and SameText(Column.FieldName, 'gg') then
  begin
    if (albaranesfacturado.AsInteger = 0) and (albaranesdetalleidfactura.AsString = '') then
    begin
      if albaranesdetalle.State in [dsBrowse] then
      begin
        albaranesdetalle.Edit;
        if albaranesdetallegg.AsInteger = 1 then
          albaranesdetallegg.AsInteger := 0
        else
          albaranesdetallegg.AsInteger := 1;
        albaranesdetalle.Post;
      end
      else if albaranesdetalle.State in [dsEdit, dsInsert] then
      begin
        if albaranesdetallegg.AsInteger = 1 then
          albaranesdetallegg.AsInteger := 0
        else
          albaranesdetallegg.AsInteger := 1;
      end;
    end;
  end;
end;

procedure Talbaranes.DBGrid2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_SPACE) and (dbgrid2.SelectedField <> nil) and SameText(dbgrid2.SelectedField.FieldName, 'gg') then
  begin
    if (albaranesfacturado.AsInteger = 0) and (albaranesdetalleidfactura.AsString = '') then
    begin
      if albaranesdetalle.State in [dsBrowse] then
      begin
        albaranesdetalle.Edit;
        if albaranesdetallegg.AsInteger = 1 then
          albaranesdetallegg.AsInteger := 0
        else
          albaranesdetallegg.AsInteger := 1;
        albaranesdetalle.Post;
      end
      else if albaranesdetalle.State in [dsEdit, dsInsert] then
      begin
        if albaranesdetallegg.AsInteger = 1 then
          albaranesdetallegg.AsInteger := 0
        else
          albaranesdetallegg.AsInteger := 1;
      end;
      Key := 0;
      Exit;
    end;
  end;

  if (key=115) then
    begin
      buscararticulos := Tbuscararticulos.Create(nil);
      try
        fbuscararticulos.padre:=albaranes.Name;
        fbuscararticulos.filtro:=albaranesdetalleidarticulo.AsString;
        buscararticulos.Edit1.Text:=albaranesdetalleidarticulo.AsString;
        buscararticulos.showmodal();
      finally
        if albaranesdetalle.State in [dsbrowse] then albaranesdetalle.Edit;
        albaranesdetalleidarticulo.Value:=buscararticulos.qarticuloscodigo.AsString;
        albaranesdetalledescripcion.value:=buscararticulos.qarticulosdescripcion.AsString;
        albaranesdetalletipoiva.value:=buscararticulos.qtipos_ivatipo.Asfloat;
        buscararticulos.Free;
      end;
    end;
end;

procedure Talbaranes.DBGrid3DblClick(Sender: TObject);
begin
    pagecontrol1.TabIndex:=0;
end;

procedure Talbaranes.DBGrid3DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if albaranesfacturado.asinteger=0 then
    begin
        dbgrid3.Canvas.brush.Color := rojo;
    end;
    if albaranesfacturado.asinteger=1 then
    begin
        dbgrid3.Canvas.brush.Color := verde;
    end;

    dbgrid3.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure Talbaranes.DBGrid3TitleClick(Column: TColumn);
var
  st:ZAbstractRODataset.TSortType;
begin
  st:=albaranes.SortType;
  albaranes.SortedFields:=Column.FieldName+',fecha';
  If st = stAscending then albaranes.SortType:=stDescending else albaranes.SortType:=stAscending;
  dsalbaranes.DataSet.First;

end;

procedure Talbaranes.comboserie2CloseUp(Sender: TObject);
begin
    albaranes.Close;
    albaranes.SQL.Clear;
    albaranes.SQL.Add('select * from albaranes where serie='+''''+qseries2id.AsString+''''+' order by serie desc,id desc');
    albaranes.Open;
//    albaranes.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive]);
end;

procedure Talbaranes.comboserieCloseUp(Sender: TObject);
begin
    if albaranes.State in [dsedit,dsinsert] then
    begin
      albaranesid.Value:=qseriesnum_albaran.AsInteger;
      dbedit2.SetFocus;
    end;
end;

procedure Talbaranes.comboclientesCloseUp(Sender: TObject);
begin
    albaranesnomcliente.value:=qclientesnombre.Asstring;
    albaranesnif.value:=qclientesnif.Asstring;
    albaranesdireccion.value:=qclientesdireccion.Asstring;
    albaranesprovincia.value:=qclientesprovincia.Asstring;
    albaranespoblacion.value:=qclientespoblacion.Asstring;
    albaranescodpost.value:=qclientescodpost.Asstring;
    albaranespaiscliente.value:=qclientespais.Asstring;
    albaranesidformapago.Value:=qclientesidformapago.asinteger;
    albaranescomision.Value:=qclientescomision.AsFloat;
end;

procedure Talbaranes.combodestinosCloseUp(Sender: TObject);
begin
    albaranesnomdestino.value:=qdestinosdescripcion.Asstring;
    albaranesdirecciondestino.value:=qdestinosdireccion.Asstring;
    albaranesprovinciadestino.value:=qdestinosprovincia.Asstring;
    albaranescodpostdestino.value:=qdestinoscodpost.Asstring;
    albaranespoblaciondestino.Value:=qdestinospoblacion.AsString;
    albaranespaisdestino.value:=qdestinospais.Asstring;
end;

procedure Talbaranes.dsalbaranesDataChange(Sender: TObject; Field: TField);
begin
if (albaranes.State in [dsbrowse]) and (albaranes.recordcount>0) then
begin
    qpedidos2.Close;
    qpedidos2.SQL.Clear;
    qpedidos2.SQL.Add('select p.id,p.ide,p.idcliente,p.iddestino,p.fecha_pedido,p.fecha_entrega,c.nombre_corto as cliente,d.descripcion as destino,p.pedidocliente from pedidos p,clientes c,clientes_destinos d where');
    qpedidos2.SQL.Add(' p.ide=c.idempresa and p.idcliente=c.id and p.ide=d.idempresa and p.idcliente=d.idcliente and p.iddestino=d.codigo and');
    qpedidos2.SQL.Add(' p.id in (select pd.idpedido from pedidosdetalle pd where pd.idalbaran='+''''+albaranesserie.asstring+'/'+albaranesid.AsString+''''+')');
    qpedidos2.Open;
    qpedidosdetalle2.close;
    qpedidosdetalle2.SQL.Clear;
    qpedidosdetalle2.SQL.Add('select * from pedidosdetalle where idalbaran='+''''+albaranesserie.asstring+'/'+albaranesid.AsString+'''');
    qpedidosdetalle2.Open;
    qclientes.Close;
    qclientes.SQL.Clear;
    qclientes.SQL.Add('select * from clientes where idempresa='+albaranesidempresa.asstring+' and id='+albaranesidcliente.asstring);
    qclientes.open;
    qdestinos.Close;
    qdestinos.SQL.Clear;
    qdestinos.SQL.Add('select * from clientes_destinos where idempresa='+albaranesidempresa.asstring+' and idcliente='+albaranesidcliente.asstring+' and codigo='+''''+albaranesiddestino.asstring+'''');
    qdestinos.open;
    albaranesdetalle.Close;
    albaranesdetalle.prepare;
    albaranesdetalle.ParamByName('empresa').AsInteger:=albaranesidempresa.AsInteger;
    albaranesdetalle.ParamByName('serie').AsString:=albaranesserie.AsString;
    albaranesdetalle.ParamByName('albaran').AsInteger:=albaranesid.AsInteger;
    albaranesdetalle.open;

    albaranesdetallegrupo.Close;
    albaranesdetallegrupo.prepare;
    albaranesdetallegrupo.ParamByName('empresa').AsInteger:=albaranesidempresa.AsInteger;
    albaranesdetallegrupo.ParamByName('serie').AsString:=albaranesserie.AsString;
    albaranesdetallegrupo.ParamByName('albaran').AsInteger:=albaranesid.AsInteger;
    albaranesdetallegrupo.open;

    qalbaraneslotes.Close;
    qalbaraneslotes.Prepare;
    qalbaraneslotes.ParamByName('EMPRESA').AsInteger:=albaranesidempresa.AsInteger;
    qalbaraneslotes.ParamByName('SERIE').AsString:=albaranesserie.Asstring;
    qalbaraneslotes.ParamByName('ALBARAN').AsInteger:=albaranesid.AsInteger;
    qalbaraneslotes.Open;
    qalbaranespalets.Close;
    qalbaranespalets.Prepare;
    qalbaranespalets.ParamByName('EMPRESA').AsInteger:=albaranesidempresa.AsInteger;
    qalbaranespalets.ParamByName('SERIE').AsString:=albaranesserie.Asstring;
    qalbaranespalets.ParamByName('ALBARAN').AsInteger:=albaranesid.AsInteger;
    qalbaranespalets.Open;
    if albaranesfacturado.AsInteger=1 then
    begin
        btafacturar.enabled:=false;
    end else
    begin
        btafacturar.enabled:=true;
        dbgrid2.Enabled:=true;
    end;
    if albaranesccid.AsString='' then
    begin
        dbtext1.Visible:=false;
        dbtext2.Visible:=false;
        dbtext16.Visible:=false;
        dbtext17.Visible:=false;
        dbtext18.Visible:=false;
    end else
    begin
        dbtext1.Visible:=true;
        dbtext2.Visible:=true;
        dbtext16.Visible:=true;
        dbtext17.Visible:=true;
        dbtext18.Visible:=true;
    end;

end;
end;

procedure Talbaranes.dsalbaranesStateChange(Sender: TObject);
begin
    if albaranes.State in [dsedit,dsinsert] then
    begin
        btanuevo.Enabled:=false;
        btamodificar.Enabled:=false;
        btaborrar.Enabled:=false;
        btacancelar.Enabled:=true;
        btaguardar.Enabled:=true;
        btaanterior.Enabled:=false;
        btasiguiente.Enabled:=false;
        btaimportar.Enabled:=false;
        btaimprimir.Enabled:=false;
        btafacturar.Enabled:=false;
        btadeca.Enabled:=false;
        if Assigned(btadecaDetalle) then btadecaDetalle.Enabled:=false;
        qdestinos.Close;
        qclientes.Close;
        qdestinos.LinkedFields:='Idempresa;idcliente';
        qdestinos.MasterFields:='Idempresa;id';
        qdestinos.Mastersource:=dsqclientes;
        qclientes.open;
        qdestinos.Open;
    end else
    begin
        btanuevo.Enabled:=true;
        btamodificar.Enabled:=true;
        btaborrar.Enabled:=true;
        btacancelar.Enabled:=false;
        btaguardar.Enabled:=false;
        btaanterior.Enabled:=true;
        btasiguiente.Enabled:=true;
        btaimportar.Enabled:=true;
        btaimprimir.Enabled:=true;
        btafacturar.Enabled:=true;
        btadeca.Enabled:=true;
        if Assigned(btadecaDetalle) then btadecaDetalle.Enabled:=true;
        qclientes.Close;
        qdestinos.Close;
        qdestinos.LinkedFields:='';
        qdestinos.MasterFields:='';
        qdestinos.Mastersource:=nil;
        qclientes.open;
        qdestinos.Open;

    end;
end;

procedure Talbaranes.dsqseries2DataChange(Sender: TObject; Field: TField);
begin
    albaranes.Close;
    albaranes.SQL.Clear;
    albaranes.SQL.Add('select * from albaranes where serie='+''''+qseries2id.AsString+''''+' order by serie desc,id desc');
    albaranes.Open;
end;

procedure Talbaranes.fechaalbaranCloseUp(Sender: TObject);
begin
//    albaranesfecha.Value:=fechaalbaran.Date;
end;

procedure Talbaranes.fechaalbaranEnter(Sender: TObject);
begin
//     if albaranes.State in [dsinsert] then albaranesfecha.Value:=fechaalbaran.Date;
//   if albaranes.State in [dsedit] then fechaalbaran.Date:=albaranesfecha.Value;
end;

procedure Talbaranes.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if (activecontrol is tdbgrid) then
    begin
        if Key = 13 then  Key :=9;
    end;

end;

procedure Talbaranes.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 Talbaranes.FormShow(Sender: TObject);
begin
    dm.tempresa.Open;
    qseries.Close;
    qseries2.Close;
    qdestinos.Close;
    qclientes.Close;
    qpedidos.Close;
    qpedidos2.close;
    qpedidosdetalle.Close;
    qpedidosdetalle2.Close;
    albaranes.Close;
    albaranesdetalle.Close;
    qalbaranesiva.Close;
    qformaspago.Close;
    qarticulos.Close;
    qtipos_iva.Close;
    qcuentas.Close;
    qformularios.Close;

    qseries.open;
    qseries2.Open;
    qdestinos.open;
    qclientes.open;
    qpedidos.open;
    qpedidos2.open;
    qpedidosdetalle.open;
    qpedidosdetalle2.open;
    albaranes.Close;
    albaranes.SQL.Clear;
    albaranes.SQL.Add('select * from albaranes where serie='+''''+qseries2id.AsString+''''+' order by serie desc,id desc');
    albaranes.Open;
    albaranesdetalle.open;
    qalbaranesiva.open;
    qformaspago.open;
    qarticulos.open;
    qtipos_iva.open;
    qcuentas.open;
    qformularios.Open;
    pagecontrol1.TabIndex:=1;
    comboserie2.KeyValue:=qseries2id.Asstring;
    comboformulario.KeyValue:=null;
end;

procedure Talbaranes.qalbaraneslotesAfterInsert(DataSet: TDataSet);
begin
    qalbaranesloteside.Value:=albaranesidempresa.AsInteger;
    qalbaraneslotesids.Value:=albaranesserie.AsString;
    qalbaraneslotesida.Value:=albaranesid.AsInteger;
end;

procedure Talbaranes.qalbaranespaletsAfterInsert(DataSet: TDataSet);
begin
    qalbaranespaletside.Value:=albaranesidempresa.AsInteger;
    qalbaranespaletsids.Value:=albaranesserie.AsString;
    qalbaranespaletsida.Value:=albaranesid.AsInteger;

end;

procedure Talbaranes.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;

end.
