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;
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;
    Label8: TLabel;
    DBEdit3: TDBEdit;
    Label9: TLabel;
    DBEdit4: TDBEdit;
    Label10: TLabel;
    DBEdit5: TDBEdit;
    Label11: TLabel;
    DBEdit6: 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;
    albaranesdetalledescripcion: TWideStringField;
    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;
    DataSource1: 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;
    Button3: TButton;
    gridalbaranesaexcel: TDBGrid;
    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;
    qalbaranesclientescoste_transporte: 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;
    SaveDialog1: TSaveDialog;
    qalbaranesclientesparcela: TWideStringField;
    qclientesexento_iva: 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 comboserieCloseUp(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 comboclientesEnter(Sender: TObject);
    procedure combodestinosEnter(Sender: TObject);
    procedure comboserieEnter(Sender: TObject);
    procedure albaranesBeforePost(DataSet: TDataSet);
    procedure DBGrid3TitleClick(Column: TColumn);
    procedure DBGrid2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure TabSheet2Enter(Sender: TObject);
    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);
  private
    { Private declarations }
  public
    { Public declarations }
  procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);
  end;

var
  albaranes: Talbaranes;
  filtro,iddetalle:string;
  vidempresa,vidarticulo:string;
implementation

{$R *.dfm}

uses fselectpedidos,fbuscararticulos;
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.albaranesBeforePost(DataSet: TDataSet);
begin
    if albaranes.state in [dsinsert,dsedit] then
    begin
        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);
begin
   qaux.Close;
   qaux.SQL.Clear;
   qaux.SQL.Add('select * from entradas_detalle where stock>0 and idempresa='+vidempresa+' and idearticulo='+vidarticulo+' order by id');
end;

procedure Talbaranes.albaranesdetalleAfterPost(DataSet: TDataSet);
var serie,id:string;
begin
    serie:=albaranesserie.AsString;
    id:=albaranesid.AsString;
    albaranes.Refresh;
    albaranes.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive]);
    qalbaranesiva.Refresh;
    if iddetalle<>'' then albaranesdetalle.Locate('id',iddetalle,[locaseinsensitive]) else albaranesdetalle.Last;
end;

procedure Talbaranes.albaranesdetalleBeforeDelete(DataSet: TDataSet);
begin
   vidempresa:=albaranesdetalleidempresa.AsString;
   vidarticulo:=albaranesdetalleidarticulo.asstring;
end;

procedure Talbaranes.albaranesdetalleBeforePost(DataSet: TDataSet);
var iva,descuento:real;
begin
    if albaranesdetalletipoiva.AsString='' then albaranesdetalletipoiva.Value:=0;
    if albaranesdetalledescuento.AsString='' then albaranesdetalledescuento.Value:=0;
    if (albaranesdetallelote.AsString<>'') and (albaranesdetallecoste_otros.asstring='') then
    begin
       qaux.Close;
       qaux.SQL.Clear;
       qaux.SQL.Add('select coste_kg_ref from parcelas where (codpar,empresa) in (select parcela,idempresa from lotes where codigo='+albaranesdetallelote.AsString+')');
       qaux.Open;
       albaranesdetallecoste_otros.Value:=qaux.Fields[0].AsFloat;
    end;

    albaranesdetalleserie.Value:=albaranesserie.Asstring;
    albaranesdetallebase.Value:=albaranesdetalleprecio.AsFloat*albaranesdetallecantidad.AsFloat;
    descuento:=albaranesdetallebase.AsFloat*(albaranesdetalledescuento.AsFloat/100);
    albaranesdetalletotaldescuento.value:=descuento;
    albaranesdetalletotal.Value:=albaranesdetallebase.Asfloat-descuento;
    iva:=albaranesdetalletotal.AsFloat*(albaranesdetalletipoiva.AsFloat/100);
    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.btAguardarClick(Sender: TObject);
var empresa,serie:string;
    insertando:integer;
    cantidad,coste_trans:real;
begin
    empresa:=albaranesidempresa.AsString;
    serie:=''''+albaranesserie.AsString+'''';
    if albaranes.State in [dsinsert] then insertando:=1 else insertando:=0;
    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) 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='+stringreplace(floattostr(coste_trans),',','.',[rfreplaceall])+' where lote is not null and idempresa='+empresa+' and serie='+serie+' and idalbaran='+albaranesid.asstring);
        qaux.execsql;
      end;
    end;
    albaranesdetalle.open;
    qalbaranesiva.open;
    albaranes.Refresh;
    albaranesdetalle.Refresh;
    qalbaranesiva.Refresh;
    panel3.Enabled:=false;
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;
       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:string;
    fecha:tdate;
begin
    if listaimpresion.ItemIndex=0 then
    begin
       albaranesdetalle.Close;
       albaranesdetalle.SQL.Clear;
       albaranesdetalle.SQL.Add('select idempresa,idalbaran,sum(cantidad) as cantidad,precio,descuento,sum(base) as base,descripcion,cal,sum(bultos) as bultos,tipoiva,sum(iva) as iva,sum(total) as total,id,'+''''''+' as idarticulo,sum(totaldescuento) as totaldescuento,'+''''''+' as lote,serie,coste_transporte,coste_otros ');
       albaranesdetalle.SQL.Add(' from albaranes_detalles group by idempresa,idalbaran,descripcion,cal,precio');
       albaranesdetalle.open;
    end;
    if listaimpresion.ItemIndex=1 then
    begin
       albaranesdetalle.Close;
       albaranesdetalle.SQL.Clear;
       albaranesdetalle.SQL.Add('select * from albaranes_detalles');
       albaranesdetalle.open;
    end;

    filtro:='id=';
    filtro:=filtro+albaranesid.asstring;
    filtro:=filtro+' and serie='+''''+albaranesserie.AsString+'''';
    documento:=qseriesimp_albaran.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);

    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.ShowReport();
    informe.Clear;
//    informe.Variables.Variables['TITULO']:=QUOTEDSTR(panel100.Caption);
    albaranes.filtered:=false;
    albaranesdetalle.Close;
    albaranesdetalle.SQL.Clear;
    albaranesdetalle.SQL.Add('select * from albaranes_detalles');
    albaranesdetalle.open;

end;

procedure Talbaranes.btaimportarClick(Sender: TObject);
begin
    seleccionarpedidos := Tseleccionarpedidos.Create(nil);
    try
      seleccionarpedidos.showmodal();
    finally
      seleccionarpedidos.Free;
    end;
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) ');
    qalbaranesclientes.SQL.Add(' union ');
    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) order by fecha desc');
    qalbaranesclientes.open;
    savedialog1.FileName:='ALBARANES CLIENTES.xls';
    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;
//        albaranes.Refresh;
//        albaranes.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive,lopartialkey]);
        qalbaranesiva.Refresh;
    end;
end;

procedure Talbaranes.btasiguienteClick(Sender: TObject);
begin
    albaranes.prior;
end;

procedure Talbaranes.btaanteriorClick(Sender: TObject);
begin
    albaranes.next;
end;

procedure Talbaranes.comboserieCloseUp(Sender: TObject);
begin
    albaranesid.value:=qseriesnum_albaran.AsInteger;
end;

procedure Talbaranes.comboserieEnter(Sender: TObject);
begin
    comboserie.DropDown;
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;
  end;

end;

procedure Talbaranes.DBGrid2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    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.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;
  If st = stAscending then albaranes.SortType:=stDescending else albaranes.SortType:=stAscending;
  dsalbaranes.DataSet.First;

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:=qclientesprovincia.Asstring;
    albaranescodpost.value:=qclientescodpost.Asstring;
    albaranespaiscliente.value:=qclientespais.Asstring;
    albaranesidformapago.Value:=qclientesidformapago.asinteger;
end;

procedure Talbaranes.comboclientesEnter(Sender: TObject);
begin
   combodestinos.dropdown;
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.combodestinosEnter(Sender: TObject);
begin
   comboformapago.dropdown;
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 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;
    if albaranesfacturado.AsInteger=1 then
    begin
        //dbgrid2.Enabled:=false;
    end else dbgrid2.Enabled:=true;
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;
        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;
        qclientes.Close;
        qdestinos.Close;
        qdestinos.LinkedFields:='';
        qdestinos.MasterFields:='';
        qdestinos.Mastersource:=nil;
        qclientes.open;
        qdestinos.Open;

    end;
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;
    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;

    qseries.open;
    qdestinos.open;
    qclientes.open;
    qpedidos.open;
    qpedidos2.open;
    qpedidosdetalle.open;
    qpedidosdetalle2.open;
    albaranes.open;
    albaranesdetalle.open;
    qalbaranesiva.open;
    qformaspago.open;
    qarticulos.open;
    qtipos_iva.open;

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;

procedure Talbaranes.TabSheet2Enter(Sender: TObject);
var serie,id:string ;
begin
    serie:=albaranesserie.AsString;
    id:=albaranesid.AsString;
    albaranes.Close;
    albaranes.SQL.Clear;
    albaranes.SQL.Add('select * from albaranes order by serie desc,id desc');
    albaranes.Open;
    albaranes.Locate('serie;id',vararrayof([serie,id]),[locaseinsensitive]);

end;

end.
