{ =============================================================================== Copyright (©) 2002. 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: 26-01-2003 Versión actual: 1.0.1 Fecha versión actual: 07-06-2003 =============================================================================== Modificaciones: Fecha Comentarios --------------------------------------------------------------------------- 07-06-2003 Se almacenaba correctamente el valor 'TIPOENTRADA' en la tabla cuando era una salida. Siempre ponía 'E'. =============================================================================== } unit DetalleLibro; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, RdxBotones, StdCtrls, RdxMemo, RdxComboBox, RdxCampos, ExtCtrls, RdxTitulos, ComCtrls, RdxCheckBox, Grids, DBGrids, RdxPaneles, RdxBarras, Db, RdxFrame, RdxDBFrame, RXDBCtrl, RdxPageControl, IB, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxEdit, cxDBData, cxClasses, cxControls, RxMemDS, Configuracion, cxMemo, cxDBEdit, cxContainer, cxTextEdit, cxMaskEdit, cxButtonEdit, AdvPanel, cxDropDownEdit, cxCalendar, RdxFrameDetallesLibro, Entidades, RdxEmpresaActiva; type TfrDetalleLibro = class(TRdxFrameDetallesLibro) pnlCuerpo: TPanel; brDoble: TRdxBarraInferior; bGuardar: TRdxBoton; bCancelar: TRdxBoton; brSimple: TRdxBarraInferior; bSalir: TRdxBoton; pnlTitulo: TRdxPanelTituloOperacion; dsDetallesLibro: TDataSource; pnlDetalleLibro: TAdvPanel; eNumEntrada: TLabel; eCuantia: TLabel; eFechaEntrada: TLabel; eDescripcion: TLabel; NumeroEntrada: TcxDBButtonEdit; Cuantia: TcxDBTextEdit; Descripcion: TcxDBMemo; FechaEntrada: TcxDBDateEdit; procedure bAceptarClick(Sender: TObject); procedure bSalirClick(Sender: TObject); procedure bCancelarClick(Sender: TObject); procedure CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); private //Por si en un futuro permitimos introducir el codigo de entrada a mano procedure asignarCodigoCajaA; procedure asignarCodigoCajaB; procedure asignarCodigoBancoA; procedure asignarCodigoBancoB; protected procedure ActivarModoAnadir; override; procedure ActivarModoModificar; override; procedure ActivarModoConsultar; override; function AnadirDatos : Boolean; override; function ModificarDatos : Boolean; override; function CancelarAnadir : Boolean; override; function CancelarModificar : Boolean; override; function ComprobarDatos : Boolean; override; procedure VerModal; override; procedure FreeContenido; override; procedure SetNumEntrada (Value : Variant); override; procedure BuscarNumEntrada; override; procedure CuantiaSetText(Sender: TField; const Text: String); public constructor Create (AOwner : TComponent); override; destructor Destroy; override; published end; var frDetalleLibro: TfrDetalleLibro; implementation {$R *.DFM} uses IBCustomDataSet, Mensajes, Variants, BaseDatos, StrFunc, Constantes, Excepciones, IBErrorCodes, Literales, TablaLibros, DetallesLibro, TablaEmpresas; //////////////////////////////////////////////////////////////////////////////// // PRIVATE //////////////////////////////////////////////////////////////////////////////// procedure TfrDetalleLibro.asignarCodigoCajaA; begin { if (Length(NumeroEntrada.Text) = 0) then NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoCajaA; if (dmTablaLibros.validarCodigoCajaA(NumeroEntrada.Text)) then begin NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoCajaA(NumeroEntrada.Text); if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; end else begin VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; } end; procedure TfrDetalleLibro.asignarCodigoCajaB; begin { if (Length(NumeroEntrada.Text) = 0) then NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoCajaB; if (dmTablaLibros.validarCodigoCajaB(NumeroEntrada.Text)) then begin NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoCajaB(NumeroEntrada.Text); if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; end else begin VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; } end; procedure TfrDetalleLibro.asignarCodigoBancoA; begin { if (Length(NumeroEntrada.Text) = 0) then NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoBancoA; if (dmTablaLibros.validarCodigoBancoA(NumeroEntrada.Text)) then begin NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoBancoA(NumeroEntrada.Text); if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; end else begin VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; } end; procedure TfrDetalleLibro.asignarCodigoBancoB; begin { if (Length(NumeroEntrada.Text) = 0) then NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoBancoB; if (dmTablaLibros.validarCodigoBancoB(NumeroEntrada.Text)) then begin NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoBancoB(NumeroEntrada.Text); if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; end else begin VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]); NumeroEntrada.SetFocus; end; } end; //////////////////////////////////////////////////////////////////////////////// // PROTECTED //////////////////////////////////////////////////////////////////////////////// procedure TfrDetalleLibro.ActivarModoAnadir; var CodNuevo : Variant; begin dsDetallesLibro.AutoEdit := True; NumeroEntrada.Properties.Buttons[0].Visible := False; NumeroEntrada.Properties.ReadOnly := True; FechaEntrada.Properties.ReadOnly := False; Cuantia.Properties.ReadOnly := False; try if (TipoLibro = 'C') then CodNuevo := dmTablaLibros.DarNuevoCodigoCaja else if (TipoLibro = 'B') then CodNuevo := dmTablaLibros.DarNuevoCodigoBanco else VerMensaje('LOG: fallo gordo con los contadores de libros'); with TablaDetallesLibro do begin Close; Prepare; Open; Insert; FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; FieldByName('TIPOLIBRO').AsString := TipoLibro; FieldByName('NUMENTRADA').AsString := CodNuevo; FieldByName('TIPOENTRADA').AsString := 'E'; FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha; FieldByName('USUARIO').AsString := dmBaseDatos.Usuario; FieldByName('FECHAENTRADA').AsDateTime := dmBaseDatos.DarFecha; FieldByName('CUANTIA').AsString := '0'; FieldByName('CUANTIA').OnSetText := CuantiaSetText; end; dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro); Visible := True; Descripcion.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrDetalleLibro.ActivarModoModificar; begin dsDetallesLibro.AutoEdit := True; NumeroEntrada.Properties.Buttons[0].Visible := True; NumeroEntrada.Properties.ReadOnly := True; FechaEntrada.Properties.ReadOnly := True; Cuantia.Properties.ReadOnly := True; try with TablaDetallesLibro do begin Prepare; Open; if RecordCount = 0 then begin VerMensajeFmt(msgLibNoExisteEnt, [NumEntrada]); CancelarAnadir; CloseFrame; Exit; end; // Bloquear la entrada Edit; Post; Edit; end; dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro); Visible := True; bGuardar.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrDetalleLibro.ActivarModoConsultar; begin dsDetallesLibro.AutoEdit := False; NumeroEntrada.Properties.Buttons[0].Visible := True; try with TablaDetallesLibro do begin Prepare; Open; if RecordCount = 0 then begin VerMensajeFmt(msgLibNoExisteEnt, [NumEntrada]); CancelarAnadir; CloseFrame; Exit; end; end; dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro); Visible := True; bSalir.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrDetalleLibro.AnadirDatos : boolean; var Importe : Double; begin Result := False; try if Entidad = entEntLibro then begin Importe := TablaDetallesLibro.FieldByName('CUANTIA').AsFloat; TablaDetallesLibro.FieldByName('TIPOENTRADA').AsString := CTE_ENT; end else if Entidad = entSalLibro then begin Importe := (-1) * TablaDetallesLibro.FieldByName('CUANTIA').AsFloat; TablaDetallesLibro.FieldByName('TIPOENTRADA').AsString := CTE_SAL; end else VerMensaje('LOG:Error no esta asignada la entidad'); TablaDetallesLibro.FieldByName('IMPORTEANT').AsFloat := dmTablaLibros.darUltimoImportePos(TipoLibro); TablaDetallesLibro.FieldByName('IMPORTEPOS').AsFloat := TablaDetallesLibro.FieldByName('IMPORTEANT').AsFloat + Importe; TablaDetallesLibro.FieldByName('CUANTIA').AsFloat := Importe; TablaDetallesLibro.Post; TipoLibro := TablaDetallesLibro.FieldByName('TIPOLIBRO').AsString; NumEntrada := TablaDetallesLibro.FieldByName('NUMENTRADA').AsString; if (TipoLibro = 'C') then dmTablaLibros.IncrementarCodigoCaja else if (TipoLibro = 'B') then dmTablaLibros.IncrementarCodigoBanco else VerMensaje('LOG: fallo gordo con los contadores de libros'); Commit; TablaDetallesLibro.Close; Result := True; except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin VerMensajeFmt(msgLibNumEntRepetida, [NumEntrada.DataBinding.Field.AsString]); TablaDetallesLibro.Edit; end else TratarExcepcion(E); end; on E : Exception do TratarExcepcion(E); end; end; function TfrDetalleLibro.ModificarDatos : boolean; begin Result := False; try TablaDetallesLibro.Post; Commit; TablaDetallesLibro.Close; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : VerMensajeFmt(msgLibEntBloqueada, [NumeroEntrada.DataBinding.Field.AsString]); else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; function TfrDetalleLibro.CancelarAnadir: Boolean; begin Result := False; try RollBack; TablaDetallesLibro.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrDetalleLibro.ComprobarDatos: Boolean; begin Result := False; if EsCadenaVacia(Descripcion.Text) then begin VerMensaje(msgLibFaltaDescEnt); Descripcion.SetFocus; Exit; end; Result := True; end; procedure TfrDetalleLibro.VerModal; begin if (ContenidoModal is TRdxFrameDetallesLibro) then (ContenidoModal as TRdxFrameDetallesLibro).TipoLibro := TipoLibro; (ContenidoModal as TRdxFrameDetallesLibro).NumEntrada := NumEntrada; inherited; end; procedure TfrDetalleLibro.FreeContenido; begin if (ContenidoModal is TRdxFrameDetallesLibro) then begin TipoLibro := (ContenidoModal as TRdxFrameDetallesLibro).TipoLibro; NumEntrada := (ContenidoModal as TRdxFrameDetallesLibro).NumEntrada; ActivarModo; end; inherited FreeContenido; end; procedure TfrDetalleLibro.BuscarNumEntrada; begin if Transaccion = NIL then exit; try TablaDetallesLibro.Close; // Buscar la fila a tratar si es necesario if not esCadenaVacia(TipoLibro) and not esCadenaVacia(NumEntrada) then begin TablaDetallesLibro.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; TablaDetallesLibro.ParamByName('TIPOLIBRO').AsString := TipoLibro; TablaDetallesLibro.ParamByName('NUMENTRADA').AsString := NumEntrada; end; TablaDetallesLibro.Prepare; TablaDetallesLibro.Open; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrDetalleLibro.CuantiaSetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then begin Sender.AsString := '0'; exit; end; try if StrToFloat(Text) < 0 then begin VerMensaje (msgImportePositivo); Sender.AsFloat := (-1) * StrToFloat(Text) end else Sender.AsString := Text; except on E : EConvertError do begin Sender.AsString := '0' end; end; end; //////////////////////////////////////////////////////////////////////////////// // PUBLIC //////////////////////////////////////////////////////////////////////////////// constructor TfrDetalleLibro.Create (AOwner : TComponent); begin inherited Create(AOwner); BaseDatos := dmBaseDatos.BD; Transaccion := dmBaseDatos.Transaccion; TablaDetallesLibro := TIBDataSet.Create(Self); dsDetallesLibro.DataSet := TablaDetallesLibro; with TablaDetallesLibro do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaLibros.sqlConsultarDetalleLibro); InsertSQL.Assign(dmTablaLibros.sqlInsertarDetalleLibro); ModifySQL.Assign(dmTablaLibros.sqlModificarDetalleLibro); DeleteSQL.Assign(dmTablaLibros.sqlEliminarDetalleLibro); RefreshSQL.Assign(dmTablaLibros.sqlConsultarDetalleLibro); end; end; destructor TfrDetalleLibro.Destroy; begin TablaDetallesLibro.Close; TablaDetallesLibro.UnPrepare; TablaDetallesLibro.Free; inherited; end; procedure TfrDetalleLibro.bAceptarClick(Sender: TObject); begin if (RealizarOperacion) then CloseFrame; end; procedure TfrDetalleLibro.bSalirClick(Sender: TObject); begin try Rollback; CloseFrame; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrDetalleLibro.bCancelarClick(Sender: TObject); begin if (TratarCambios = IDOK) then CloseFrame; end; procedure TfrDetalleLibro.CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin if (TratarCambios = IDCANCEL) then exit; ContenidoModal := TfrDetallesLibro.Create(Self); end; function TfrDetalleLibro.CancelarModificar: Boolean; begin Result := False; try RollBack; TablaDetallesLibro.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrDetalleLibro.SetNumEntrada(Value: Variant); begin inherited; if VarIsNull(Value) then exit; if (Modo <> Anadir) then begin if (TablaDetallesLibro.FieldByName('CUANTIA').AsFloat < 0) then Entidad := entSalLibro else Entidad := entEntLibro; end; end; end.