{ =============================================================================== Copyright (©) 2005. Rodax Software. =============================================================================== Los contenidos de este fichero son propiedad de Rodax Software titular del copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado, en su totalidad o en parte, con el permiso escrito de Rodax Software, o de acuerdo con los términos y condiciones establecidas en el acuerdo/contrato bajo el que se suministra. ----------------------------------------------------------------------------- Web: www.rodax-software.com =============================================================================== Fecha primera versión: 30-09-2005 Versión actual: 1.0.0 Fecha versión actual: 30-09-2005 =============================================================================== Modificaciones: Fecha Comentarios --------------------------------------------------------------------------- =============================================================================== } unit AlbaranCliente; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, RdxBotones, RdxTitulos, StdCtrls, RdxMemo, RdxCampos, ExtCtrls, RdxComboBox, RdxPaneles, RdxBarras, ComCtrls, RdxRichEdit, RXDBCtrl, RdxFrame, RdxPageControl, Db, RdxRadioButton, RxMemDS, IBCustomDataSet, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxEdit, cxDBData, cxGridLevel, cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, Configuracion, cxContainer, cxTextEdit, cxMaskEdit, cxDropDownEdit, cxCalendar, cxDBEdit, cxButtonEdit, cxMemo, cxSpinEdit, AdvPanel, ActnList, Menus, am2000menuitem, am2000popupmenu, am2000, RdxCheckBox, cxCheckBox, cxCalc, cxCurrencyEdit, RdxFrameAlbaranesCliente, RdxEmpresaActiva, am2000utils, cxDataStorage; type TfrAlbaranCliente = class(TRdxFrameAlbaranesCliente) brSalir: TRdxBarraInferior; bSalir: TRdxBoton; brGuardar: TRdxBarraInferior; bGuardar: TRdxBoton; bCancelar: TRdxBoton; Titulo: TRdxPanelTituloOperacion; dsAlbaran: TDataSource; dsDetallesAlbaranes: TDataSource; pnlCuerpo: TPanel; pnlDatosAlbaran: TAdvPanel; eCodigo: TLabel; Label1: TLabel; Codigo: TcxDBButtonEdit; FechaAlbaran: TcxDBDateEdit; pnlGrid: TAdvPanel; Paginas: TRdxPagesControl; pagCliente: TTabSheet; pagContenido: TTabSheet; pnlGridArticulos: TPanel; pnlBarraGrid: TPanel; bAnadirCon: TRdxBoton; bEliminar: TRdxBoton; bEliminarTodo: TRdxBoton; gridDetalles: TcxGrid; VistaDetalles: TcxGridDBTableView; gridDetallesLevel1: TcxGridLevel; pagObservaciones: TTabSheet; RdxPanel4: TPanel; Label3: TLabel; RdxPanel5: TPanel; Observaciones: TcxDBMemo; Label2: TLabel; CodCliente: TcxDBButtonEdit; eNIFCIF: TLabel; NIFCIF: TcxDBTextEdit; eNombre: TLabel; Nombre: TcxDBTextEdit; eDireccion: TLabel; Calle: TcxDBTextEdit; eProvincia: TLabel; Provincia: TcxDBButtonEdit; ePoblacion: TLabel; Poblacion: TcxDBButtonEdit; eTelefono1: TLabel; Telefono1: TcxDBTextEdit; eTelefono2: TLabel; Telefono2: TcxDBTextEdit; eNumero: TLabel; Numero: TcxDBTextEdit; ePiso: TLabel; Piso: TcxDBTextEdit; eCodigoPostal: TLabel; CodigoPostal: TcxDBTextEdit; eFax: TLabel; Fax: TcxDBTextEdit; eMovil2: TLabel; Movil2: TcxDBTextEdit; eMovil1: TLabel; Movil1: TcxDBTextEdit; ePersona: TLabel; PersonaContacto: TcxDBTextEdit; ActionList1: TActionList; actAnadirConcepto: TAction; actEliminar: TAction; actEliminarTodo: TAction; pnlImportes: TAdvPanel; Label7: TLabel; Label8: TLabel; Panel1: TPanel; Label5: TLabel; Label9: TLabel; BaseImponible: TcxDBTextEdit; ImporteTotal: TcxDBTextEdit; ImporteDescuento: TcxDBTextEdit; ImporteIVA: TcxDBTextEdit; RdxPanel1: TRdxPanel; Label10: TLabel; Label11: TLabel; Shape2: TShape; Panel2: TPanel; Descuento: TcxDBTextEdit; IVA: TcxDBTextEdit; procedure bCancelarClick(Sender: TObject); procedure bSalirClick(Sender: TObject); procedure bGuardarClick(Sender: TObject); procedure CodigoExit(Sender: TObject); procedure CodClienteExit(Sender: TObject); procedure CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure CodClientePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure actAnadirConceptoExecute(Sender: TObject); procedure actEliminarExecute(Sender: TObject); procedure actEliminarTodoExecute(Sender: TObject); procedure actEliminarUpdate(Sender: TObject); procedure actEliminarTodoUpdate(Sender: TObject); private FCodigoProvincia : Variant; FCodigoPoblacion : Variant; FCodigoCliente : Variant; FCodigoArticulo : Variant; FTablaDetallesMem : TRxMemoryData; procedure CalcularTotalDetalle; procedure CalcularTotalAlbaran; procedure ActivarEventosCampos; procedure DesactivarEventosCampos; procedure CodCliSetText(Sender: TField; const Text: String); procedure IVASetText(Sender: TField; const Text: String); procedure DtoSetText(Sender: TField; const Text: String); procedure RESetText(Sender: TField; const Text: String); procedure BorrarDetalles; procedure SalvarDetalles; procedure CargarDetalles; procedure BorrarDetallesIB; procedure ReordenarDetallesMem; procedure IntercambiarDetallesMem(PosCon1, PosCon2 : Integer); procedure DetalleAfterDelete (DataSet: TDataSet); procedure GridBotonCodigoArticuloClick(Sender: TObject; AButtonIndex: Integer); procedure CodigoArticuloDetalleSetText(Sender: TField; const Text: String); procedure ReferenciaArticuloDetalleSetText(Sender: TField; const Text: String); procedure CantidadDetalleSetText(Sender: TField; const Text: String); procedure PrecioDetalleSetText(Sender: TField; const Text: String); procedure ProvinciaSetText(Sender: TField; const Text: String); procedure DetallesAfterInsert(DataSet: TDataSet); procedure GridBotonReferenciaArticuloClick(Sender: TObject; AButtonIndex: Integer); function GetCodigoCliente: Variant; protected procedure ActivarModoAnadir; override; procedure ActivarModoModificar; override; procedure ActivarModoConsultar; override; procedure ActivarModoEliminar; override; function AnadirDatos : Boolean; override; function ModificarDatos : Boolean; override; function EliminarDatos : Boolean; override; function CancelarAnadir : Boolean; override; function CancelarModificar : Boolean; override; function CancelarEliminar : Boolean; override; function ComprobarDatos : Boolean; override; procedure VerModal; override; procedure SetCodigoProvincia (Value : Variant); virtual; procedure SetCodigoPoblacion (Value : Variant); virtual; procedure SetCodigoCliente (Value : Variant); procedure SetCodigoArticulo (Value : Variant); procedure FreeContenido; override; procedure BuscarAlbaran; override; public property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia; property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion; property CodigoCliente : Variant read GetCodigoCliente write SetCodigoCliente; property CodigoArticulo : Variant read FCodigoArticulo write SetCodigoArticulo; constructor Create (AOwner : TComponent); override; destructor Destroy; override; published property TablaAlbaranes; property TablaDetallesAlbaranes; property TablaDetallesMem : TRxMemoryData read FTablaDetallesMem write FTablaDetallesMem; end; var frAlbaranCliente: TfrAlbaranCliente; implementation {$R *.DFM} uses Variants, Entidades, AlbaranesClientes, BaseDatos, IBDatabase, Mensajes, Clientes, RdxFrameProvincias, RdxFramePoblaciones, TablaTrimestres, TablaProvincias, Provincias, Poblaciones, TablaClientes, RdxFrameClientes, IB, Articulos, RdxFrameArticulos, TablaArticulos, Constantes, StrFunc, TablaPoblaciones, TablaFormasPago, NumFunc, IBSQL, Excepciones, IBErrorCodes, Literales, ElegirDireccionCliente, TablaAlbaranesCliente, TablaEmpresas; procedure TfrAlbaranCliente.bCancelarClick(Sender: TObject); begin if (TratarCambios = IDOK) then CloseFrame; end; procedure TfrAlbaranCliente.bSalirClick(Sender: TObject); begin try Rollback; CloseFrame; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.bGuardarClick(Sender: TObject); begin if (RealizarOperacion) then CloseFrame; end; procedure TfrAlbaranCliente.ActivarEventosCampos; begin with TablaAlbaranes do begin FieldByName('CODIGOCLIENTE').OnSetText := CodCliSetText; FieldByName('IVA').OnSetText := IVASetText; FieldByName('DESCUENTO').OnSetText := DtoSetText; end; with TablaDetallesMem do begin FieldByName('CODIGOARTICULO').OnSetText := CodigoArticuloDetalleSetText; FieldByName('REFERENCIA').OnSetText := ReferenciaArticuloDetalleSetText; FieldByName('CANTIDAD').OnSetText := CantidadDetalleSetText; FieldByName('IMPORTEUNIDAD').OnSetText := PrecioDetalleSetText; AfterDelete := DetalleAfterDelete; AfterInsert := DetallesAfterInsert; end; with VistaDetalles do begin TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := GridBotonCodigoArticuloClick; TcxButtonEditProperties(GetColumnByFieldName('REFERENCIA').Properties).OnButtonClick := GridBotonReferenciaArticuloClick; end; end; procedure TfrAlbaranCliente.ActivarModoAnadir; var CodNuevo : Variant; begin dsAlbaran.AutoEdit := True; dsDetallesAlbaranes.AutoEdit := True; pnlBarraGrid.Visible := True; Codigo.Properties.Buttons[0].Visible := False; Codigo.Properties.ReadOnly := False; CodCliente.Properties.Buttons[0].Visible := True; Poblacion.Properties.Buttons[0].Visible := True; Provincia.Properties.Buttons[0].Visible := True; try CodNuevo := dmTablaAlbaranesCliente.DarNuevoCodigo; with TablaAlbaranes do begin Close; Prepare; Open; FieldByName('PROVINCIA').OnSetText := ProvinciaSetText; Insert; Codigo.DataBinding.Field.AsString := CodNuevo; FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha; FieldByName('USUARIO').AsString := dmBaseDatos.Usuario; //FieldByName('IVA').AsString := EmpresaActiva.IvaDefecto; <-- los albaranes no tienen IVA FechaAlbaran.DataBinding.Field.AsDateTime := dmBaseDatos.DarFecha; end; with TablaDetallesAlbaranes do begin Close; ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; ParamByName('CODIGOALBARAN').AsString := CodNuevo; Prepare; Open; end; with TablaDetallesMem do begin Close; Open; if not IsEmpty then Edit; end; dmTablaAlbaranesCliente.InicializarTabla(@TablaAlbaranes); dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem); ActivarEdicionGridDetalles(gridDetalles); ActivarEventosCampos; Visible := True; FechaAlbaran.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.ActivarModoConsultar; begin dsAlbaran.AutoEdit := False; dsDetallesAlbaranes.AutoEdit := False; pnlBarraGrid.Visible := False; Codigo.Properties.Buttons[0].Visible := True; CodCliente.Properties.Buttons[0].Visible := False; Poblacion.Properties.Buttons[0].Visible := False; Provincia.Properties.Buttons[0].Visible := False; try with TablaAlbaranes do begin Prepare; Open; if RecordCount = 0 then begin VerMensajeFmt(msgCliNoExisteFac, [CodigoAlbaran]); CloseFrame; Exit; end; Cancel; end; with TablaDetallesAlbaranes do begin Close; Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran; Prepare; Open; Cancel; end; with TablaDetallesMem do begin Close; Open; Cancel; CargarDetalles; end; dmTablaAlbaranesCliente.InicializarTabla(@TablaAlbaranes); dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem); DesactivarEventosCampos; DesactivarEdicionGridDetalles(gridDetalles); Visible := True; FechaAlbaran.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.ActivarModoEliminar; begin dsAlbaran.AutoEdit := False; dsDetallesAlbaranes.AutoEdit := False; pnlBarraGrid.Visible := False; Codigo.Properties.Buttons[0].Visible := True; CodCliente.Properties.Buttons[0].Visible := False; Poblacion.Properties.Buttons[0].Visible := False; Provincia.Properties.Buttons[0].Visible := False; try with TablaAlbaranes do begin Prepare; Open; if RecordCount = 0 then begin VerMensajeFmt(msgCliNoExisteFac, [CodigoAlbaran]); CancelarEliminar; CloseFrame; Exit; end; Cancel; end; with TablaDetallesAlbaranes do begin Close; Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran; Prepare; Open; Cancel; end; with TablaDetallesMem do begin Close; Open; Cancel; CargarDetalles; end; dmTablaAlbaranesCliente.InicializarTabla(@TablaAlbaranes); dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem); DesactivarEventosCampos; DesactivarEdicionGridDetalles(gridDetalles); Visible := True; FechaAlbaran.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.ActivarModoModificar; var CodPreAlb : String; CodCargo : string; begin dsAlbaran.AutoEdit := True; dsDetallesAlbaranes.AutoEdit := True; pnlBarraGrid.Visible := True; Codigo.Properties.Buttons[0].Visible := True; Codigo.Properties.ReadOnly := True; CodCliente.Properties.Buttons[0].Visible := True; Poblacion.Properties.Buttons[0].Visible := True; Provincia.Properties.Buttons[0].Visible := True; try with TablaAlbaranes do begin Prepare; Open; FieldByName('PROVINCIA').OnSetText := ProvinciaSetText; if RecordCount = 0 then begin VerMensajeFmt(msgCliNoExisteFacPro, [CodigoAlbaran]); CancelarModificar; CloseFrame; Exit; end; Edit; Post; Edit; end; with TablaDetallesAlbaranes do begin Close; Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran; Prepare; Open; end; with TablaDetallesMem do begin Close; Open; CargarDetalles; end; dmTablaAlbaranesCliente.InicializarTabla(@TablaAlbaranes); dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem); CalcularTotalAlbaran; ActivarEdicionGridDetalles(gridDetalles); FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Provincia.Text); ActivarEventosCampos; Visible := True; FechaAlbaran.SetFocus; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : begin VerMensajeFmt(msgCliFacProBloqueado, [CodigoAlbaran]); CancelarModificar; CloseFrame; Exit; end else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; function TfrAlbaranCliente.AnadirDatos: Boolean; begin try CalcularTotalAlbaran; TablaAlbaranes.Post; BorrarDetallesIB; SalvarDetalles; dmTablaAlbaranesCliente.IncrementarCodigo; Commit; FCodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString; TablaAlbaranes.Close; TablaDetallesAlbaranes.Close; TablaDetallesMem.Close; Result := True; except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin VerMensajeFmt(msgCliCodFacProRepetido, [Codigo.DataBinding.Field.AsString]); TablaAlbaranes.Edit; end else TratarExcepcion(E); end; on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.BuscarAlbaran; begin if Transaccion = NIL then exit; try TablaAlbaranes.DisableControls; TablaDetallesAlbaranes.DisableControls; TablaDetallesMem.DisableControls; TablaAlbaranes.Close; TablaDetallesAlbaranes.Close; TablaDetallesMem.Close; // Buscar la fila a tratar si es necesario if not EsCadenaVacia(FCodigoAlbaran) then begin TablaAlbaranes.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; TablaAlbaranes.ParamByName('CODIGO').AsString := FCodigoAlbaran; TablaDetallesAlbaranes.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; TablaDetallesAlbaranes.Params.ByName('CODIGOALBARAN').AsString := FCodigoAlbaran; end; TablaAlbaranes.Prepare; TablaAlbaranes.Open; TablaDetallesAlbaranes.Prepare; TablaDetallesAlbaranes.Open; TablaDetallesMem.Close; TablaDetallesMem.Open; CargarDetalles; dmTablaAlbaranesCliente.InicializarTabla(@TablaAlbaranes); dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem); TablaAlbaranes.EnableControls; TablaDetallesAlbaranes.EnableControls; TablaDetallesMem.EnableControls; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.CalcularTotalDetalle; var auxCantidad, auxPrecio, auxTotal : double; begin with TablaDetallesMem do begin Edit; auxCantidad := FieldByName('CANTIDAD').AsFloat; auxPrecio := FieldByName('IMPORTEUNIDAD').AsFloat; auxTotal := (auxCantidad * auxPrecio); FieldByName('IMPORTETOTAL').AsFloat := auxTotal; end; CalcularTotalAlbaran; end; procedure TfrAlbaranCliente.CalcularTotalAlbaran; var BaseImponible, ImporteIVA, ImporteDto, ImporteTotal : Double; FDetallesBookmark : string; begin BaseImponible := 0; ImporteTotal := 0; with TablaDetallesMem do begin DisableControls; FDetallesBookmark := Bookmark; try First; while not EOF do begin BaseImponible := BaseImponible + FieldByName('IMPORTETOTAL').AsFloat; Next; end; ImporteDto := BaseImponible * (TablaAlbaranes.FieldByName('DESCUENTO').AsFloat/100); ImporteTotal := BaseImponible - ImporteDto; ImporteIVA := ImporteTotal * (TablaAlbaranes.FieldByName('IVA').AsFloat/100); ImporteTotal := ImporteTotal + ImporteIVA; TablaAlbaranes.FieldByName('BASEIMPONIBLE').AsFloat := BaseImponible; TablaAlbaranes.FieldByName('IMPORTEDESCUENTO').AsFloat := ImporteDto; TablaAlbaranes.FieldByName('IMPORTEIVA').AsFloat := ImporteIVA; TablaAlbaranes.FieldByName('IMPORTETOTAL').AsFloat := ImporteTotal; finally Bookmark := FDetallesBookmark; EnableControls; end; end; end; function TfrAlbaranCliente.CancelarAnadir: Boolean; begin Result := False; try RollBack; TablaDetallesMem.Close; TablaAlbaranes.Close; TablaDetallesAlbaranes.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrAlbaranCliente.CancelarEliminar: Boolean; begin Result := False; try RollBack; TablaAlbaranes.Close; TablaDetallesAlbaranes.Close; TablaDetallesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrAlbaranCliente.CancelarModificar: Boolean; begin Result := False; try RollBack; TablaDetallesMem.Close; TablaAlbaranes.Close; TablaDetallesAlbaranes.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrAlbaranCliente.ComprobarDatos: Boolean; begin Result := False; if EsCadenaVacia(FechaAlbaran.DataBinding.Field.AsString) then begin VerMensaje(msgCliFaltaFechaAlta); FechaAlbaran.SetFocus; Exit; end; if Modo = Anadir then begin if EsCadenaVacia(CodCliente.DataBinding.Field.AsString) then begin VerMensaje(msgCliFaltaCodCli); Paginas.ActivePageIndex := 0; CodCliente.SetFocus; Exit; end end else begin if EsCadenaVacia(Nombre.DataBinding.Field.AsString) then begin VerMensaje(msgCliFaltaNombreCli); Paginas.ActivePageIndex := 0; Nombre.SetFocus; Exit; end end; if TablaDetallesMem.IsEmpty then begin VerMensaje(msgCliFaltaArticulos); Paginas.ActivePage := pagContenido; gridDetalles.SetFocus; Exit; end; Result := True; end; constructor TfrAlbaranCliente.Create(AOwner: TComponent); begin inherited Create(AOwner); Entidad := entAlbaranCliente; FCodigoProvincia := NULL; FCodigoPoblacion := NULL; FCodigoCliente := NULL; FCodigoArticulo := NULL; BaseDatos := dmBaseDatos.BD; Transaccion := dmBaseDatos.Transaccion; dmTablaArticulos.ArtModelo := entArticulo; TablaAlbaranes := TIBDataSet.Create(Self); TablaDetallesAlbaranes := TIBDataSet.Create(Self); TablaDetallesMem := TRxMemoryData.Create(Self); dsAlbaran.DataSet := TablaAlbaranes; dsDetallesAlbaranes.DataSet := TablaDetallesMem; with TablaAlbaranes do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaAlbaranesCliente.sqlConsultar); InsertSQL.Assign(dmTablaAlbaranesCliente.sqlInsertar); ModifySQL.Assign(dmTablaAlbaranesCliente.sqlModificar); DeleteSQL.Assign(dmTablaAlbaranesCliente.sqlEliminar); end; with TablaDetallesAlbaranes do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaAlbaranesCliente.sqlConsultarGridDetalles); InsertSQL.Assign(dmTablaAlbaranesCliente.sqlInsertarDetalles); ModifySQL.Assign(dmTablaAlbaranesCliente.sqlModificarDetalles); DeleteSQL.Assign(dmTablaAlbaranesCliente.sqlEliminarDetalles); end; with TablaDetallesMem do begin CopyStructure(TablaDetallesAlbaranes); FieldByName('CODIGOALBARAN').Required := False; FieldByName('NUMCONCEPTO').Required := False; end; dmTablaAlbaranesCliente.InicializarGridDetalles(gridDetalles); Paginas.ActivePage := pagCliente; end; destructor TfrAlbaranCliente.Destroy; begin TablaDetallesMem.Close; TablaDetallesMem.Free; TablaAlbaranes.Close; TablaAlbaranes.UnPrepare; TablaAlbaranes.Free; TablaDetallesAlbaranes.Close; TablaDetallesAlbaranes.Unprepare; TablaDetallesAlbaranes.Free; inherited; end; function TfrAlbaranCliente.EliminarDatos: Boolean; begin Result := False; try if dmTablaAlbaranesCliente.EsUltima(Codigo.DataBinding.Field.AsString) then dmTablaAlbaranesCliente.DecrementarCodigo; TablaAlbaranes.Delete; BorrarDetalles; Commit; TablaAlbaranes.Close; TablaDetallesAlbaranes.Close; TablaDetallesMem.Close; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : VerMensajeFmt(msgCliFacProBloqueado, [Codigo.DataBinding.Field.AsString]); else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.FreeContenido; var Contador : integer; AListaCodigos : TStringList; begin if (ContenidoModal is TRdxFrameAlbaranesCliente) then begin CodigoAlbaran := (ContenidoModal as TRdxFrameAlbaranesCliente).CodigoAlbaran; ActivarModo; end; if (ContenidoModal is TfrArticulos) then begin //CodigoArticulo := (ContenidoModal as TRdxFrameArticulos).CodigoArticulo; AListaCodigos := (ContenidoModal as TfrArticulos).ListaArticulos; for Contador := AListaCodigos.Count - 1 downto 0 do begin CodigoArticulo := AListaCodigos.Strings[Contador]; actAnadirConcepto.Execute; end; TablaDetallesMem.Delete; end; if (ContenidoModal is TRdxFrameClientes) then CodigoCliente := (ContenidoModal as TRdxFrameClientes).CodigoCliente; if (ContenidoModal is TRdxFrameProvincias) then CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia; if (ContenidoModal is TRdxFramePoblaciones) then begin CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia; CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion; end; inherited FreeContenido; end; function TfrAlbaranCliente.ModificarDatos: Boolean; begin Result := False; try CalcularTotalAlbaran; TablaAlbaranes.Post; BorrarDetallesIB; SalvarDetalles; Commit; TablaAlbaranes.Close; TablaDetallesAlbaranes.Close; TablaDetallesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.SetCodigoArticulo(Value: Variant); var CodigoAux : String; DatosArticulo : TDatosArticulo; begin if (EsCadenaVacia(Value)) then begin FCodigoArticulo := CodigoAux; Exit; end; CodigoAux := Trim(Value); if (dmTablaArticulos.ValidarCodigo(CodigoAux)) then begin CodigoAux := dmTablaArticulos.FormatearCodigo(CodigoAux); if (dmTablaArticulos.ExisteCodigo(CodigoAux)) then FCodigoArticulo := CodigoAux else begin raise Exception.CreateFmt(msgDatosCodArtNoExiste, [CodigoAux]); end; end else begin raise Exception.CreateFmt(msgDatosCodArtIncorrecto, [CodigoAux]); Exit; end; DatosArticulo := TDatosArticulo.Create(CodigoAux); try with TablaDetallesMem do begin Edit; FieldByName('CODIGOALBARAN').AsString := Codigo.DataBinding.Field.AsString; FieldByName('NUMCONCEPTO').AsString := dmTablaAlbaranesCliente.FormatearNumConcepto(IntToStr(RecNo)); FieldByName('CODIGOARTICULO').AsString := DatosArticulo.Codigo; FieldByName('REFERENCIA').AsString := DatosArticulo.Referencia; FieldByName('DESCRIPCION').AsString := DatosArticulo.Descripcion; FieldByName('IMPORTEUNIDAD').AsFloat := DatosArticulo.Precio; if EsCadenaVacia(FieldByName('CANTIDAD').AsString) then FieldByName('CANTIDAD').AsString := '1'; Post; gridDetalles.Refresh; CalcularTotalDetalle; end; FCodigoArticulo := Value; finally DatosArticulo.Free; end; end; procedure TfrAlbaranCliente.SetCodigoCliente(Value: Variant); var DatosCliente : TDatosCliente; CodAux : Variant; DireccionElegida : TDireccionElegida; NumSucursal : Integer; begin if EsCadenaVacia(Value) then exit; CodAux := Trim(Value); if (dmTablaClientes.ValidarCodigo(CodAux)) then begin CodAux := dmTablaClientes.FormatearCodigo(CodAux); if (dmTablaClientes.ExisteCodigo(CodAux)) then FCodigoCliente := CodAux else begin VerMensajeFmt(msgCliCodCliNoExiste, [CodAux]); Paginas.ActivePageIndex := 0; CodCliente.SetFocus; Exit; end; end else begin VerMensajeFmt(msgCliCodCliIncorrecto, [CodAux]); Paginas.ActivePageIndex := 0; CodCliente.SetFocus; Exit; end; DatosCliente := TDatosCliente.Create(FCodigoCliente); try CodCliente.DataBinding.Field.AsString := DatosCliente.Codigo; if DatosCliente.Sucursales.Count > 0 then begin frElegirDireccionCliente := TfrElegirDireccionCliente.Create(Self); try frElegirDireccionCliente.Cliente := DatosCliente; frElegirDireccionCliente.ShowModal; DireccionElegida := frElegirDireccionCliente.DireccionSeleccionada; NumSucursal := frElegirDireccionCliente.NumSucursal; finally frElegirDireccionCliente.Free; end; end else DireccionElegida := dePrincipal; if DireccionElegida = dePrincipal then begin NIFCIF.DataBinding.Field.AsString := DatosCliente.Nifcif; Nombre.DataBinding.Field.AsString := DatosCliente.Nombre; Calle.DataBinding.Field.AsString := DatosCliente.Calle; Numero.DataBinding.Field.AsString := DatosCliente.Numero; Piso.DataBinding.Field.AsString := DatosCliente.Piso; Provincia.DataBinding.Field.AsString := DatosCliente.Provincia; FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(DatosCliente.Provincia); Poblacion.DataBinding.Field.AsString := DatosCliente.Poblacion; CodigoPostal.DataBinding.Field.AsString := DatosCliente.CodigoPostal; Telefono1.DataBinding.Field.AsString := DatosCliente.Telefono1; Telefono2.DataBinding.Field.AsString := DatosCliente.Telefono2; Movil1.DataBinding.Field.AsString := DatosCliente.Movil1; Movil2.DataBinding.Field.AsString := DatosCliente.Movil2; Fax.DataBinding.Field.AsString := DatosCliente.Fax; PersonaContacto.DataBinding.Field.AsString := DatosCliente.PersonaContacto; end else begin with DatosCliente.Sucursales do begin NIFCIF.DataBinding.Field.AsString := Sucursal[NumSucursal].Nifcif; Nombre.DataBinding.Field.AsString := Sucursal[NumSucursal].Nombre; Calle.DataBinding.Field.AsString := Sucursal[NumSucursal].Calle; Numero.DataBinding.Field.AsString := Sucursal[NumSucursal].Numero; Piso.DataBinding.Field.AsString := Sucursal[NumSucursal].Piso; Provincia.DataBinding.Field.AsString := Sucursal[NumSucursal].Provincia; FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Sucursal[NumSucursal].Provincia); Poblacion.DataBinding.Field.AsString := Sucursal[NumSucursal].Poblacion; CodigoPostal.DataBinding.Field.AsString := Sucursal[NumSucursal].CodigoPostal; Telefono1.DataBinding.Field.AsString := Sucursal[NumSucursal].Telefono1; Telefono2.DataBinding.Field.AsString := Sucursal[NumSucursal].Telefono2; Movil1.DataBinding.Field.AsString := Sucursal[NumSucursal].Movil1; Movil2.DataBinding.Field.AsString := Sucursal[NumSucursal].Movil2; Fax.DataBinding.Field.AsString := Sucursal[NumSucursal].Fax; PersonaContacto.DataBinding.Field.AsString := Sucursal[NumSucursal].PersonaContacto; end; end; finally DatosCliente.Free; end; end; procedure TfrAlbaranCliente.SetCodigoPoblacion(Value: Variant); begin if (not EsCadenaVacia(Value)) then begin FCodigoPoblacion := Value; Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion); end; end; procedure TfrAlbaranCliente.SetCodigoProvincia(Value: Variant); begin if (not EsCadenaVacia(Value)) then begin FCodigoProvincia := Value; Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia); end; end; procedure TfrAlbaranCliente.VerModal; begin if (ContenidoModal is TRdxFramePoblaciones) then (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia; if (ContenidoModal is TRdxFrameClientes) then (ContenidoModal as TRdxFrameClientes).CodigoCliente := CodigoCliente; if (ContenidoModal is TfrArticulos) then begin FCodigoArticulo := TablaDetallesMem.FieldByName('CODIGOARTICULO').AsString; if not EsCadenaVacia(FCodigoArticulo) then (ContenidoModal as TfrArticulos).CodigoArticulo := FCodigoArticulo; end; inherited; end; procedure TfrAlbaranCliente.CantidadDetalleSetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '1' else Sender.AsString := Text; CalcularTotalDetalle; end; procedure TfrAlbaranCliente.CodigoArticuloDetalleSetText(Sender: TField; const Text: String); var Codigo : String; begin Sender.AsString := Text; CodigoArticulo := Text; end; procedure TfrAlbaranCliente.GridBotonCodigoArticuloClick(Sender: TObject; AButtonIndex: Integer); begin TablaDetallesMem.Edit; ContenidoModal := TfrArticulos.Create(Self); gridDetalles.SetFocus; end; procedure TfrAlbaranCliente.PrecioDetalleSetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then begin Sender.AsString := '0'; exit; end; if Entidad = entAbonoCliente then begin try if StrToFloat(Text) > 0 then begin VerMensaje (msgImporteNegativo); Sender.AsFloat := (-1) * StrToFloat(Text) end else Sender.AsString := Text; except on E : EConvertError do begin Sender.AsString := '0' end; end; end else Sender.AsString := Text; CalcularTotalDetalle; end; procedure TfrAlbaranCliente.CodigoExit(Sender: TObject); begin if (Modo <> Anadir) or (Visible = false) then Exit; if not EsCadenaVacia(Codigo.Text) then begin if (dmTablaAlbaranesCliente.validarCodigo(Codigo.Text)) then begin Codigo.DataBinding.Field.AsString := dmTablaAlbaranesCliente.FormatearCodigo(Codigo.Text); if (dmTablaAlbaranesCliente.ExisteCodigo(Codigo.Text)) then begin VerMensajeFmt(msgCliCodFacProRepetido, [Codigo.Text]); Codigo.SetFocus; end; end else begin VerMensajeFmt(msgCliCodFacProIncorrecto, [Codigo.Text]); Codigo.SetFocus; end end else Codigo.DataBinding.Field.AsString := dmTablaAlbaranesCliente.DarNuevoCodigo; end; procedure TfrAlbaranCliente.CodClienteExit(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then Exit; end; procedure TfrAlbaranCliente.DtoSetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '0' else begin ValidarDto(Text); Sender.AsString := Text; end; CalcularTotalAlbaran; end; procedure TfrAlbaranCliente.IVASetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '0' else begin ValidarIVA(Text); Sender.AsString := Text; end; CalcularTotalAlbaran; end; procedure TfrAlbaranCliente.BorrarDetalles; begin with TablaDetallesMem do begin DisableControls; EmptyTable; EnableControls; end; end; procedure TfrAlbaranCliente.BorrarDetallesIB; begin with TablaDetallesAlbaranes do begin if IsEmpty then Exit; DisableControls; Last; while not BOF do begin Delete; Prior; end; if not IsEmpty then Delete; EnableControls; end; end; procedure TfrAlbaranCliente.CargarDetalles; var NumeroCampo : Integer; begin with TablaDetallesMem do begin if TablaDetallesAlbaranes.IsEmpty then Exit; DisableControls; TablaDetallesAlbaranes.First; while not TablaDetallesAlbaranes.EOF do begin Append; for NumeroCampo := 0 to TablaDetallesAlbaranes.FieldCount-1 do Fields[NumeroCampo].AsString := TablaDetallesAlbaranes.Fields[NumeroCampo].AsString; Post; TablaDetallesAlbaranes.Next; end; First; EnableControls; end; end; procedure TfrAlbaranCliente.SalvarDetalles; var NumeroCampo : Integer; NumConcepto : Integer; begin try with TablaDetallesMem do begin if IsEmpty then Exit; NumConcepto := 0; DisableControls; First; while not EOF do begin TablaDetallesAlbaranes.Append; for NumeroCampo := 0 to FieldCount-1 do begin if Fields[NumeroCampo].FieldName = 'CODIGOEMPRESA' then TablaDetallesAlbaranes.Fields[NumeroCampo].AsInteger := EmpresaActiva.Codigo else if Fields[NumeroCampo].FieldName = 'CODIGOALBARAN' then TablaDetallesAlbaranes.Fields[NumeroCampo].AsString := Codigo.DataBinding.Field.AsString else if Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then TablaDetallesAlbaranes.Fields[NumeroCampo].AsString := dmTablaAlbaranesCliente.FormatearNumConcepto(IntToStr(NumConcepto)) else TablaDetallesAlbaranes.Fields[NumeroCampo].AsVariant := Fields[NumeroCampo].AsVariant; end; TablaDetallesAlbaranes.Post; Next; NumConcepto := NumConcepto + 1; end; EnableControls; end except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin TablaDetallesAlbaranes.Delete; TablaDetallesMem.EnableControls; end; raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message); end; end; end; procedure TfrAlbaranCliente.DetalleAfterDelete(DataSet: TDataSet); begin CalcularTotalAlbaran; end; procedure TfrAlbaranCliente.ProvinciaSetText(Sender: TField; const Text: String); begin FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Text); Sender.AsString := Text; end; procedure TfrAlbaranCliente.CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin if (TratarCambios = IDCANCEL) then Exit; { Esto es porque en modo 'Modificar' hacemos un cambio y pulsamos este botón se cierra la tabla y si en el frame hijo (el del grid) damos a cancelar, FCodigoAlbaran es NULL y da error al activar modo porque no se inicializa los parámetros de la sql. Lo hace BuscarAlbaran. } if not TablaAlbaranes.Active then BuscarAlbaran; ContenidoModal := TfrAlbaranesClientes.Create(Self); end; procedure TfrAlbaranCliente.CodClientePropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin ContenidoModal := TfrClientes.Create(Self); end; procedure TfrAlbaranCliente.ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin CaptionModal := msgListaProvincias; WidthModal := 280; HeightModal := 460; ContenidoModal := TfrProvincias.Create(Self); end; procedure TfrAlbaranCliente.PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin if EsCadenaVacia(CodigoProvincia) then begin VerMensaje(msgSinProvincia); Paginas.ActivePageIndex := 0; Provincia.SetFocus; Exit; end; CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]); WidthModal := 280; HeightModal := 460; ContenidoModal := TfrPoblaciones.Create(Self); end; procedure TfrAlbaranCliente.DetallesAfterInsert(DataSet: TDataSet); begin DataSet.FieldByName('DESCRIPCION').AsString := #13+#13+#13; end; procedure TfrAlbaranCliente.actAnadirConceptoExecute(Sender: TObject); begin try with TablaDetallesMem do begin //DisableControls; Next; if EOF then Append else begin Prior; Insert; end; //EnableControls; end; Paginas.ActivePage := pagContenido; gridDetalles.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrAlbaranCliente.actEliminarExecute(Sender: TObject); begin if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then Exit; if TablaDetallesMem.RecordCount = 0 then begin { Hacemos un cancel de la tabla por si el registro actual estuviera recien creado } TablaDetallesMem.Cancel; Exit end; try TablaDetallesMem.Delete; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; CalcularTotalAlbaran; end; procedure TfrAlbaranCliente.actEliminarTodoExecute(Sender: TObject); begin if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then Exit; BorrarDetalles; CalcularTotalAlbaran; end; procedure TfrAlbaranCliente.ReordenarDetallesMem; var NumConcepto : Integer; CurBookmark: string; begin try with TablaDetallesMem do begin if IsEmpty then Exit; NumConcepto := RecordCount; DisableControls; CurBookmark := Bookmark; Last; while not BOF do begin Edit; FieldByName('NUMCONCEPTO').AsString := dmTablaAlbaranesCliente.FormatearNumConcepto(IntToStr(NumConcepto)); Post; Dec(NumConcepto); Prior; end; Bookmark := CurBookmark; EnableControls; end except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then TablaDetallesMem.EnableControls; raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message); end; end; end; procedure TfrAlbaranCliente.IntercambiarDetallesMem(PosCon1, PosCon2: Integer); var NumCon1, NumCon2 : Variant; begin try with TablaDetallesMem do begin DisableControls; RecNo := PosCon1; NumCon1 := FieldByName('NUMCONCEPTO').AsString; RecNo := PosCon2; NumCon2 := FieldByName('NUMCONCEPTO').AsString; // Intercambio los concepto Edit; FieldByName('NUMCONCEPTO').AsString := NumCon1; Post; RecNo := PosCon1; Edit; FieldByName('NUMCONCEPTO').AsString := NumCon2; Post; EnableControls; ReordenarDetallesMem; end; except TablaDetallesMem.EnableControls; end; end; function TfrAlbaranCliente.GetCodigoCliente: Variant; begin if TablaAlbaranes.Active then Result := TablaAlbaranes.FieldByName('CODIGOCLIENTE').AsVariant else Result := NULL; end; procedure TfrAlbaranCliente.RESetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '0' else begin ValidarDto(Text); Sender.AsString := Text; end; CalcularTotalAlbaran; end; procedure TfrAlbaranCliente.DesactivarEventosCampos; begin with TablaAlbaranes do begin FieldByName('CODIGOCLIENTE').OnSetText := NIL; FieldByName('IVA').OnSetText := NIL; FieldByName('DESCUENTO').OnSetText := NIL; end; with TablaDetallesMem do begin FieldByName('CODIGOARTICULO').OnSetText := NIL; if FindField('REFERENCIA') <> NIL then FieldByName('REFERENCIA').OnSetText := NIL; FieldByName('CANTIDAD').OnSetText := NIL; FieldByName('IMPORTEUNIDAD').OnSetText := NIL; AfterDelete := NIL; AfterInsert := NIL; end; with VistaDetalles do begin if GetColumnByFieldName('CODIGOARTICULO') <> NIL then TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := NIL; if GetColumnByFieldName('REFERENCIA') <> NIL then TcxButtonEditProperties(GetColumnByFieldName('REFERENCIA').Properties).OnButtonClick := NIL; end; end; procedure TfrAlbaranCliente.CodCliSetText(Sender: TField; const Text: String); begin Sender.AsString := Text; CodigoCliente := Text; end; procedure TfrAlbaranCliente.actEliminarUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (TablaDetallesMem.RecordCount = 0); end; procedure TfrAlbaranCliente.actEliminarTodoUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (TablaDetallesMem.RecordCount = 0); end; procedure TfrAlbaranCliente.ReferenciaArticuloDetalleSetText( Sender: TField; const Text: String); var ReferenciaAux : String; CodigoArtAux : String; begin Sender.AsString := Text; ReferenciaAux := Text; if (dmTablaArticulos.DarCodigoArt(ReferenciaAux, CodigoArtAux)) then CodigoArticulo := CodigoArtAux else begin raise Exception.CreateFmt(msgDatosRefArtNoExiste, [ReferenciaAux]); end; end; procedure TfrAlbaranCliente.GridBotonReferenciaArticuloClick( Sender: TObject; AButtonIndex: Integer); begin TablaDetallesMem.Edit; ContenidoModal := TfrArticulos.Create(Self); gridDetalles.SetFocus; end; end.