This repository has been archived on 2024-11-29. You can view files and clone it, but cannot push or open issues or pull requests.
Tecsitel_FactuGES/Clientes/AlbaranCliente.pas
2007-06-21 15:47:20 +00:00

1423 lines
41 KiB
ObjectPascal

{
===============================================================================
Copyright (©) 2001. 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: 01-10-2001
Versión actual: 1.1.7
Fecha versión actual: 08-03-2004
===============================================================================
Modificaciones:
Fecha Comentarios
---------------------------------------------------------------------------
15-10-2001 Se ha eliminado el campo 'Descripcion' porque no se usa en
albaranes. En su lugar se han colocado los campos de importes
y se ha eliminado la etiqueta 'Importes'.
15-10-2001 Se han añadido las comprobaciones para el campo 'IVA' y para
el campo 'Descuento' porque no estaban.
27-10-2001 Se ha arreglado un fallo que al añadir un concepto estando
en la última fila lo hacia por encima del registro, no por
debajo.
29-10-2001 Cuando se elimina un concepto con <CTRL+Supr> hay que
volver a recalcular el importe total del albarán.
30-10-2001 Se ha utilizado una tabla de memoria para tratar la lista
de detalles del albarán.
31-10-2001 Se han añadido los campos IMPORTEDESCUENTO e IMPORTEIVA.
27-11-2001 Recuperar la unidad de medida del artículo.
07-02-2002 Desactivada la opción de 'CancelOnExit' del grid.
24-02-2002 En la ventana modal de artículos seleccionar, si es posible,
la fila con el último material seleccionado.
02-03-2002 En el contenido se pueden añadir muchos materiales a la vez.
07-04-2002 Se ha adaptado para la transacción única.
09-04-2002 En las funciones 'CancelarAnadir', 'CancelarModificar',
'CancelarEliminar', 'AnadirDatos', 'ModificarDatos', y
'EliminarDatos' cerrar todas las tablas que se usen.
09-04-2002 En el evento 'bCancelarClick' llamar a la función
'TratarCambios' en vez de 'DescartarOperacion'.
05-05-2002 En el procedimiento 'SetCodigoArticulo' no se daba un mensaje
de error cuando el artículo no existía.
06-05-2002 Adaptación al grid 'TdxDBGrid'.
21-08-2002 P237. Revisar los botones de 'Eliminar' y 'Eliminar todo'
para que al pulsar 'Esc' cancele la operación y no la
ejecute como ahora.
21-08-2002 P238. Revisar el grid de los detalles para que se pueda
borrar un código de artículo cuando ya se ha introducido.
14-09-2002 P242. Sacar una ventana modal para editar el
texto de un concepto.
24-09-2002 Se producía una excepción si el cursos estaba en el código
del albarán, se pulsaba la tecla 'Esc' y se elegía 'No'.
El frame estaba oculto pero saltaba el evento OnExit del
campo de código de factura.
21-12-2002 Se ha eliminado un error con el campo 'PROVINCIA'. Al estar
situado en ese campo y dar Esc para salir se puede producir
una excepción.
08-03-2003 Se han puesto componentes con calendario.
08-03-2004 p272. Adaptación a multiempresa.
===============================================================================
}
unit AlbaranCliente;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
RdxFrameAlbaranes, Grids, DBGrids, RdxBotones, RdxTitulos, StdCtrls,
RdxMemo, RdxCampos, ExtCtrls, Tipos, RxMemDS,
RdxComboBox, RdxPaneles, RdxBarras, RXDBCtrl, ComCtrls, Configuracion,
dxCntner, dxEditor, dxExEdtr, dxEdLib, dxDBELib, Db, dxTL, dxDBCtrl,
dxDBGrid, RdxPageControl, cxControls, cxContainer, cxEdit, cxTextEdit,
cxMaskEdit, cxDropDownEdit, cxCalendar, cxDBEdit, cxButtonEdit;
type
TfrAlbaranCliente = class(TRdxFrameAlbaranes)
brSalir: TRdxBarraInferior;
bSalir: TRdxBoton;
brGuardar: TRdxBarraInferior;
bGuardar: TRdxBoton;
bCancelar: TRdxBoton;
pnlScroll: TRdxScrollPanel;
pnlAlbaran: TRdxPanel;
cDatosAlbaran: TRdxCabecera;
eCodigo: TLabel;
Codigo: TRdxDBEdit;
eFechaAlta: TLabel;
eUsuario: TLabel;
Usuario: TRdxDBEdit;
pnlTitulo: TRdxPanelTituloOperacion;
RdxPanel1: TRdxPanel;
Paginas: TRdxPagesControl;
pagCliente: TTabSheet;
pnlCliente: TRdxPanel;
eCodigoCliente: TLabel;
eNIFCIF: TLabel;
eNombre: TLabel;
eDireccion: TLabel;
eNumero: TLabel;
ePiso: TLabel;
ePoblacion: TLabel;
eCodigoPostal: TLabel;
eProvincia: TLabel;
ePersona: TLabel;
eTelefono1: TLabel;
eFax: TLabel;
NIF: TRdxDBEdit;
Nombre: TRdxDBEdit;
Calle: TRdxDBEdit;
Numero: TRdxDBEdit;
Piso: TRdxDBEdit;
Poblacion: TRdxDBEdit;
CodigoPostal: TRdxDBEdit;
Provincia: TRdxDBEdit;
PersonaContacto: TRdxDBEdit;
Telefono: TRdxDBEdit;
Fax: TRdxDBEdit;
pagContenido: TTabSheet;
pnlGridArticulos: TPanel;
dsAlbaran: TDataSource;
dsDetallesAlbaran: TDataSource;
pnlBarraGrid: TRdxPanel;
bAnadir: TRdxBoton;
bEliminar: TRdxBoton;
bEliminarTodo: TRdxBoton;
pagImportes: TTabSheet;
pnlImporteAlbaran: TRdxPanel;
Label4: TLabel;
eDto: TLabel;
eIVA: TLabel;
Label6: TLabel;
Shape1: TShape;
BaseImponible: TRdxDBEdit;
Descuento: TRdxDBEdit;
IVA: TRdxDBEdit;
ImporteTotal: TRdxDBEdit;
ImporteDescuento: TRdxDBEdit;
ImporteIVA: TRdxDBEdit;
gridDetalles: TdxDBGrid;
FechaAlta: TcxDBDateEdit;
CodCliente: TcxDBButtonEdit;
procedure CodigoButtonClick(Sender: TObject);
procedure CodigoExit(Sender: TObject);
procedure ProvinciaButtonClick(Sender: TObject);
procedure PoblacionButtonClick(Sender: TObject);
procedure bAnadirClick(Sender: TObject);
procedure bEliminarClick(Sender: TObject);
procedure bEliminarTodoClick(Sender: TObject);
procedure bSalirClick(Sender: TObject);
procedure bGuardarClick(Sender: TObject);
procedure bCancelarClick(Sender: TObject);
procedure CodClientePropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption;
var Error: Boolean);
procedure CodClientePropertiesButtonClick(Sender: TObject;
AButtonIndex: Integer);
private
FCodigoProvincia : Variant;
FCodigoPoblacion : Variant;
FCodigoCliente : Variant;
FCodigoArticulo : Variant;
FTablaDetallesMem : TRxMemoryData;
procedure CalcularTotalDetalle;
procedure CalcularTotalAlbaran;
procedure ActivarEventosCampos;
procedure BorrarDetalles;
procedure BorrarDetallesIB;
procedure SalvarDetalles;
procedure CargarDetalles;
procedure DetalleAfterDelete (DataSet: TDataSet);
procedure IVASetText(Sender: TField; const Text: String);
procedure DtoSetText(Sender: TField; const Text: String);
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 FCodigoCliente 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;
property CodigoAlbaran;
procedure ProvinciaSetText(Sender: TField; const Text: String);
procedure GridBotonCodigoArticuloClick(Sender: TObject);
procedure CodigoArticuloDetalleSetText(Sender: TField; const Text: String);
procedure DtoDetalleSetText(Sender: TField; const Text: String);
procedure CantidadDetalleSetText(Sender: TField; const Text: String);
procedure PrecioDetalleSetText(Sender: TField; const Text: String);
procedure GridBotonDescripcionClick(Sender: TObject);
end;
var
frAlbaranCliente: TfrAlbaranCliente;
implementation
{$R *.DFM}
uses
TablaAlbaranesCliente, BaseDatos, IB, StrFunc, Mensajes, NumFunc,
TablaArticulos, TablaClientes, TablaProvincias, TablaPoblaciones,
RdxFrameArticulos, RdxFrameClientes, RdxFrameProvincias, RdxFramePoblaciones,
AlbaranesClientes, Articulos, IBCustomDataSet, Clientes, Provincias,
Poblaciones, Excepciones, IBErrorCodes, dxDBTLCL, EditorDescripcion,
RdxEmpresaActiva, Literales;
{ TfrAlbaranCliente }
procedure TfrAlbaranCliente.ActivarModoAnadir;
var
CodNuevo : Variant;
begin
dsAlbaran.AutoEdit := True;
dsDetallesAlbaran.AutoEdit := True;
Codigo.VerBoton := False;
Codigo.ReadOnly := False;
CodCliente.Properties.Buttons[0].Visible := True;
CodCliente.Properties.OnValidate := CodClientePropertiesValidate;
Provincia.VerBoton := True;
Poblacion.VerBoton := True;
ActivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoArticuloClick;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonDescripcionClick;
pnlBarraGrid.Visible := True;
try
{ Antes de aplicar la caché hay que asegurarse de que la
tabla está cerrada. }
TablaAlbaranes.DisableControls;
{ Inicializar la tabla de albaranes }
TablaAlbaranes.Close;
CodNuevo := dmTablaAlbaranesCliente.DarNuevoCodigo;
with TablaAlbaranes do
begin
CachedUpdates := True;
Prepare;
Open;
FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
EnableControls;
Insert;
FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
end;
Codigo.Field.asString := CodNuevo;
FechaAlta.DataBinding.Field.AsString := DateToStr(Date);
Usuario.Field.AsString := dmBaseDatos.Usuario;
{ Inicializar la tabla de detalles }
with TablaDetallesAlbaranes do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
ParamByName('CODIGOALBARAN').AsString := CodNuevo;
Prepare;
Open;
end;
with TablaDetallesMem do
begin
Close;
Open;
ActivarEventosCampos;
end;
dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrAlbaranCliente.ActivarModoConsultar;
begin
dsAlbaran.AutoEdit := False;
dsDetallesAlbaran.AutoEdit := False;
Codigo.VerBoton := True;
CodCliente.Properties.Buttons[0].Visible := False;
CodCliente.Properties.OnValidate := nil;
Provincia.VerBoton := False;
Poblacion.VerBoton := False;
DesactivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
pnlBarraGrid.Visible := False;
try
TablaAlbaranes.Prepare;
TablaAlbaranes.Open;
if TablaAlbaranes.RecordCount = 0 then
begin
VerMensajeFmt(msgAlbNoExisteAlb, [CodigoAlbaran]);
CloseFrame;
Exit;
end;
TablaAlbaranes.Cancel;
with TablaDetallesAlbaranes do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran;
Prepare;
Open;
Cancel;
end;
with TablaDetallesMem do
begin
Close;
Open;
Cancel;
CargarDetalles;
end;
dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrAlbaranCliente.ActivarModoEliminar;
begin
dsAlbaran.AutoEdit := False;
dsDetallesAlbaran.AutoEdit := False;
Codigo.VerBoton := True;
CodCliente.Properties.Buttons[0].Visible := False;
CodCliente.Properties.OnValidate := nil;
Provincia.VerBoton := False;
Poblacion.VerBoton := False;
DesactivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
pnlBarraGrid.Visible := False;
try
TablaAlbaranes.Prepare;
TablaAlbaranes.Open;
if TablaAlbaranes.RecordCount = 0 then
begin
VerMensajeFmt(msgAlbNoExisteAlb, [CodigoAlbaran]);
CancelarEliminar;
CloseFrame;
Exit;
end;
TablaAlbaranes.Cancel;
with TablaDetallesAlbaranes do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran;
Prepare;
Open;
Cancel;
end;
with TablaDetallesMem do
begin
Close;
Open;
Cancel;
CargarDetalles;
end;
dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrAlbaranCliente.ActivarModoModificar;
begin
dsAlbaran.AutoEdit := True;
dsDetallesAlbaran.AutoEdit := True;
Codigo.VerBoton := True;
Codigo.ReadOnly := True;
CodCliente.Properties.Buttons[0].Visible := True;
CodCliente.Properties.OnValidate := CodClientePropertiesValidate;
Provincia.VerBoton := True;
Poblacion.VerBoton := True;
ActivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoArticuloClick;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonDescripcionClick;
pnlBarraGrid.Visible := True;
try
{ Antes de aplicar la caché hay que asegurarse de que la
tabla está cerrada. }
TablaAlbaranes.Prepare;
TablaAlbaranes.Open;
TablaAlbaranes.FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
if TablaAlbaranes.RecordCount = 0 then
begin
VerMensajeFmt(msgAlbNoExisteAlb, [CodigoAlbaran]);
CancelarModificar;
CloseFrame;
Exit;
end;
TablaAlbaranes.Edit;
TablaAlbaranes.Post;
TablaAlbaranes.Edit;
with TablaDetallesAlbaranes do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran;
Prepare;
Open;
end;
with TablaDetallesMem do
begin
Close;
Open;
CargarDetalles;
ActivarEventosCampos;
CalcularTotalAlbaran;
end;
dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
begin
case E.IBErrorCode of
isc_lock_conflict : begin
VerMensajeFmt(msgAlbBloqueado, [CodigoAlbaran]);
CancelarModificar;
CloseFrame;
Exit;
end
else
TratarExcepcion(E);
end;
end;
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrAlbaranCliente.AnadirDatos: Boolean;
var
NumConcepto : Integer;
begin
Result := False;
try
CalcularTotalAlbaran;
NumConcepto := 0;
TablaAlbaranes.Post;
TablaAlbaranes.ApplyUpdates;
BorrarDetallesIB;
SalvarDetalles;
dmTablaAlbaranesCliente.IncrementarCodigo;
FCodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
Commit;
TablaAlbaranes.Close;
TablaDetallesAlbaranes.Close;
TablaDetallesMem.Close;
TablaAlbaranes.CachedUpdates := False;
Result := True;
except
on E : EIBError do begin
if E.IBErrorCode = isc_unique_key_violation then begin
VerMensajeFmt(msgAlbCodAlbRepetido, [Codigo.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;
TablaDetallesMem.DisableControls;
TablaAlbaranes.Close;
TablaDetallesAlbaranes.Close;
// Buscar la fila a tratar si es necesario
if not VarIsNull(FCodigoAlbaran) then
begin
TablaAlbaranes.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
TablaAlbaranes.ParamByName('CODIGO').AsString := FCodigoAlbaran;
TablaDetallesAlbaranes.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
TablaDetallesAlbaranes.ParamByName('CODIGOALBARAN').AsString := FCodigoAlbaran;
end;
TablaAlbaranes.Prepare;
TablaAlbaranes.Open;
TablaDetallesAlbaranes.Prepare;
TablaDetallesAlbaranes.Open;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
BorrarDetalles;
CargarDetalles;
dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
dmTablaAlbaranesCliente.InicializarTablaDetalles(@TablaDetallesMem);
TablaAlbaranes.EnableControls;
TablaDetallesMem.EnableControls;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
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('TOTAL').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;
procedure TfrAlbaranCliente.CalcularTotalDetalle;
var
auxCantidad,
auxPrecio,
auxTotal : double;
begin
with TablaDetallesMem do
begin
auxCantidad := FieldByName('CANTIDAD').AsFloat;
auxPrecio := FieldByName('PRECIOUNIDAD').AsFloat;
auxTotal := auxCantidad * auxPrecio;
FieldByName('TOTAL').AsFloat := auxTotal;
end;
end;
function TfrAlbaranCliente.CancelarAnadir: Boolean;
begin
Result := False;
try
TablaDetallesMem.Close;
TablaAlbaranes.Close;
TablaDetallesAlbaranes.Close;
TablaAlbaranes.CancelUpdates;
RollBack;
TablaAlbaranes.CachedUpdates := False;
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
TablaDetallesMem.Close;
TablaAlbaranes.Close;
TablaDetallesAlbaranes.Close;
RollBack;
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
TablaDetallesMem.Close;
TablaAlbaranes.Close;
TablaDetallesAlbaranes.Close;
RollBack;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrAlbaranCliente.CantidadDetalleSetText(Sender: TField;
const Text: String);
begin
try
if EsCadenaVacia(Text) then
Sender.AsString := '1'
else
Sender.AsString := Text;
CalcularTotalDetalle;
CalcularTotalAlbaran;
except
on E : EConvertError do
VerMensaje(msgCantidadNoValida);
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrAlbaranCliente.CodigoArticuloDetalleSetText(Sender: TField;
const Text: String);
var
Codigo : String;
begin
if (EsCadenaVacia(Text)) then
begin
Sender.AsString := '';
exit;
end;
Codigo := Trim(Text);
if (dmTablaArticulos.validarCodigo(Codigo)) then
Codigo := dmTablaArticulos.formatearCodigo(Codigo)
else
raise Exception.CreateFmt(msgArtCodArtIncorrecto, [Codigo]);
Sender.AsString := Codigo;
CodigoArticulo := Codigo;
end;
function TfrAlbaranCliente.ComprobarDatos: Boolean;
begin
Result := False;
if EsCadenaVacia(FechaAlta.DataBinding.Field.AsString) then
begin
VerMensaje(msgAlbFaltaFechaAlta);
FechaAlta.SetFocus;
Exit;
end;
if EsCadenaVacia(Nombre.Field.AsString) then
begin
VerMensaje(msgAlbFaltaNombreCli);
Paginas.ActivePageIndex := 0;
Nombre.SetFocus;
Exit;
end;
if TablaDetallesMem.IsEmpty then
begin
VerMensaje(msgAlbFaltaArticulos);
Paginas.ActivePageIndex := 1;
gridDetalles.SetFocus;
Exit
end;
Result := True;
end;
constructor TfrAlbaranCliente.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCodigoProvincia := NULL;
FCodigoPoblacion := NULL;
FCodigoCliente := NULL;
FCodigoArticulo := NULL;
Entidad := entAlbaranCliente;
ConfigurarFrame(Self, Self.Entidad);
BaseDatos := dmBaseDatos.BD;
Transaccion := dmBaseDatos.Transaccion;
Transaccion.DefaultDatabase := BaseDatos;
TablaAlbaranes := TIBDataSet.Create(Self);
TablaDetallesAlbaranes := TIBDataSet.Create(Self);
TablaDetallesMem := TRxMemoryData.Create(Self);
dsAlbaran.DataSet := TablaAlbaranes;
dsDetallesAlbaran.DataSet := TablaDetallesMem;
with TablaAlbaranes do
begin
Database := BaseDatos;
Transaction := Transaccion;
SelectSQL.Assign(dmTablaAlbaranesCliente.sqlConsultarAlbaran);
InsertSQL.Assign(dmTablaAlbaranesCliente.sqlInsertarAlbaran);
ModifySQL.Assign(dmTablaAlbaranesCliente.sqlModificarAlbaran);
DeleteSQL.Assign(dmTablaAlbaranesCliente.sqlEliminarAlbaran);
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;
try
TablaDetallesMem.CopyStructure(TablaDetallesAlbaranes);
TablaDetallesMem.FieldByName('CODIGOEMPRESA').Required := False;
TablaDetallesMem.FieldByName('CODIGOALBARAN').Required := False;
TablaDetallesMem.FieldByName('NUMCONCEPTO').Required := False;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
dmTablaAlbaranesCliente.InicializarGridDetalles(gridDetalles);
Paginas.ActivePage := pagCliente;
end;
destructor TfrAlbaranCliente.Destroy;
begin
gridDetalles.DataSource := NIL;
TablaDetallesMem.Close;
TablaDetallesMem.Free;
TablaAlbaranes.Close;
TablaAlbaranes.UnPrepare;
TablaAlbaranes.Free;
TablaDetallesAlbaranes.Close;
TablaDetallesAlbaranes.Unprepare;
TablaDetallesAlbaranes.Free;
inherited;
end;
procedure TfrAlbaranCliente.DtoDetalleSetText(Sender: TField;
const Text: String);
begin
try
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else begin
ValidarDto(Text);
Sender.AsString := Text;
end;
CalcularTotalDetalle;
CalcularTotalAlbaran;
except
on E : EConvertError do
VerMensaje(msgDtoNoValido);
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrAlbaranCliente.EliminarDatos: Boolean;
begin
Result := False;
try
TablaAlbaranes.Delete;
Commit;
BorrarDetalles;
TablaAlbaranes.Close;
TablaDetallesAlbaranes.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do
begin
case E.IBErrorCode of
isc_lock_conflict : VerMensajeFmt(msgAlbBloqueado, [Codigo.Field.AsString]);
else
TratarExcepcion(E);
end;
end;
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrAlbaranCliente.FreeContenido;
var
Contador : integer;
ListaCodigos : TStringList;
begin
if (ContenidoModal is TRdxFrameAlbaranes) then begin
CodigoAlbaran := (ContenidoModal as TRdxFrameAlbaranes).CodigoAlbaran;
ActivarModo;
end;
if (ContenidoModal is TRdxFrameArticulos) then
begin
ListaCodigos := (ContenidoModal as TRdxFrameArticulos).ListaArticulos;
for Contador := 0 to ListaCodigos.Count - 1 do
begin
CodigoArticulo := ListaCodigos.Strings[Contador];
bAnadirClick(Self);
end;
TablaDetallesMem.Cancel;
end;
if (ContenidoModal is TfrEditorDescripcion) then
begin
TablaDetallesMem.FieldByName('DESCRIPCION').AsString := (ContenidoModal as TfrEditorDescripcion).Texto;
TablaDetallesMem.Post;
TablaDetallesMem.Edit;
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;
procedure TfrAlbaranCliente.GridBotonCodigoArticuloClick(Sender: TObject);
begin
TablaDetallesMem.Edit;
ContenidoModal := TfrArticulos.Create(Self);
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.PrecioDetalleSetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else
Sender.AsString := Text;
CalcularTotalDetalle;
CalcularTotalAlbaran;
end;
procedure TfrAlbaranCliente.SetCodigoArticulo(Value: Variant);
var
DatosArticulo : TDatosArticulo;
begin
if VarIsNull(Value) then
exit;
if Value = '' then
exit;
DatosArticulo := TDatosArticulo.Create;
DatosArticulo.Codigo := Value;
try
if dmTablaArticulos.darDatosArticulo(DatosArticulo) then
begin
with TablaDetallesMem do
begin
Edit;
FieldByName('CODIGOARTICULO').AsString := DatosArticulo.Codigo;
FieldByName('DESCRIPCION').AsString := DatosArticulo.Descripcion;
FieldByName('CANTIDAD').AsString := '1';
FieldByName('UNIDADESMEDIDA').AsString := DatosArticulo.Unidadesmedida;
FieldByName('PRECIOUNIDAD').AsString := DatosArticulo.Precio;
FieldByName('TOTAL').AsString := DatosArticulo.Precio;
Post;
end;
FCodigoArticulo := Value;
CalcularTotalAlbaran;
end
else
raise Exception.CreateFmt(msgArtCodArtNoExiste, [Value]);
finally
DatosArticulo.Free;
end;
end;
procedure TfrAlbaranCliente.SetCodigoCliente(Value: Variant);
var
DatosCliente : TDatosCliente;
begin
if VarIsNull(Value) then
exit;
FCodigoCliente := Value;
DatosCliente := TDatosCliente.Create;
try
DatosCliente.Codigo := FCodigoCliente;
dmTablaClientes.darDatosCliente(DatosCliente);
CodCliente.DataBinding.Field.AsString := DatosCliente.Codigo;
NIF.Field.AsString := DatosCliente.Nifcif;
Nombre.Field.AsString := DatosCliente.Nombre;
PersonaContacto.Field.AsString := DatosCliente.PersonaContacto;
Telefono.Field.AsString := DatosCliente.Telefono1;
Fax.Field.AsString := DatosCliente.Fax;
Calle.Field.AsString := DatosCliente.Calle;
Numero.Field.AsString := DatosCliente.Numero;
Piso.Field.AsString := DatosCliente.Piso;
CodigoPostal.Field.AsString := DatosCliente.CodigoPostal;
Poblacion.Field.AsString := DatosCliente.Poblacion;
Provincia.Field.AsString := DatosCliente.Provincia;
IVA.Field.AsString := DatosCliente.IVA;
Descuento.Field.AsString := DatosCliente.Descuento;
FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(DatosCliente.Provincia);
CalcularTotalAlbaran;
finally
DatosCliente.Free;
end;
end;
procedure TfrAlbaranCliente.SetCodigoPoblacion(Value: Variant);
begin
if (not VarIsNull(FCodigoPoblacion)) and (FCodigoPoblacion = Value) then
exit;
if (not VarIsNull(Value)) then
begin
FCodigoPoblacion := Value;
Poblacion.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
end;
end;
procedure TfrAlbaranCliente.SetCodigoProvincia(Value: Variant);
begin
if (not VarIsNull(FCodigoProvincia)) and (FCodigoProvincia = Value) then
exit;
if (not VarIsNull(Value)) then
begin
FCodigoProvincia := Value;
Provincia.Field.AsString := dmTablaProvincias.darNombreProvincia(FCodigoProvincia);
end;
end;
procedure TfrAlbaranCliente.VerModal;
begin
if (ContenidoModal is TRdxFramePoblaciones) then
(ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
if (ContenidoModal is TRdxFrameArticulos) then
(ContenidoModal as TRdxFrameArticulos).CodigoArticulo := CodigoArticulo;
if (ContenidoModal is TfrEditorDescripcion) then
(ContenidoModal as TfrEditorDescripcion).Texto := TablaDetallesMem.FieldByName('DESCRIPCION').AsString;
inherited;
end;
procedure TfrAlbaranCliente.CodigoButtonClick(Sender: TObject);
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.CodigoExit(Sender: TObject);
begin
if (Modo <> Anadir) or (Visible = false) then
Exit;
if EsCadenaVacia(Codigo.Text) then
Codigo.Field.AsString := dmTablaAlbaranesCliente.darNuevoCodigo;
if (dmTablaAlbaranesCliente.validarCodigo(Codigo.Text)) then
begin
Codigo.Field.asString := dmTablaAlbaranesCliente.formatearCodigo(Codigo.Text);
if (dmTablaAlbaranesCliente.ExisteCodigo(EmpresaActiva.Codigo, Codigo.Text)) then begin
VerMensajeFmt(msgAlbCodAlbRepetido, [Codigo.Text]);
Codigo.SetFocus;
end;
end
else begin
VerMensajeFmt(msgAlbCodAlbIncorrecto, [Codigo.Text]);
Codigo.SetFocus;
end;
end;
procedure TfrAlbaranCliente.ProvinciaButtonClick(Sender: TObject);
begin
CaptionModal := 'Lista de provincias';
WidthModal := 280;
HeightModal := 460;
ContenidoModal := TfrProvincias.Create(Self);
end;
procedure TfrAlbaranCliente.PoblacionButtonClick(Sender: TObject);
begin
if (VarIsNull(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.bAnadirClick(Sender: TObject);
begin
try
with TablaDetallesMem do
begin
DisableControls;
Next;
if EOF then
Append
else
Insert;
EnableControls;
end;
Paginas.ActivePage := pagContenido;
gridDetalles.SetFocus;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrAlbaranCliente.bEliminarClick(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.bEliminarTodoClick(Sender: TObject);
begin
if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then
Exit;
BorrarDetalles;
CalcularTotalAlbaran;
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.bCancelarClick(Sender: TObject);
begin
if (TratarCambios = IDOK) then
CloseFrame;
end;
procedure TfrAlbaranCliente.ActivarEventosCampos;
begin
with TablaAlbaranes do
begin
FieldByName('IVA').OnSetText := IVASetText;
FieldByName('DESCUENTO').OnSetText := DtoSetText;
end;
with TablaDetallesMem do
begin
FieldByName('CODIGOARTICULO').OnSetText := CodigoArticuloDetalleSetText;
FieldByName('CANTIDAD').OnSetText := CantidadDetalleSetText;
FieldByName('PRECIOUNIDAD').OnSetText := PrecioDetalleSetText;
AfterDelete := DetalleAfterDelete;
end;
end;
procedure TfrAlbaranCliente.DetalleAfterDelete(DataSet: TDataSet);
begin
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;
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 begin
if Fields[NumeroCampo].FieldName = 'CODIGOALBARAN' then
TablaDetallesAlbaranes.Fields[NumeroCampo].AsString := Codigo.Field.AsString
else
if Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then
TablaDetallesAlbaranes.Fields[NumeroCampo].AsInteger := NumConcepto
else
TablaDetallesAlbaranes.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString;
end;
end;
TablaDetallesAlbaranes.Post;
Next;
NumConcepto := NumConcepto + 1;
end;
EnableControls;
end;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
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.GridBotonDescripcionClick(Sender: TObject);
begin
TablaDetallesMem.Edit;
WidthModal := 420;
HeightModal := 435;
ModoModal := Modo;
ContenidoModal := TfrEditorDescripcion.Create(Self);
end;
procedure TfrAlbaranCliente.ProvinciaSetText(Sender: TField;
const Text: String);
begin
FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(Text);
Sender.AsString := Text;
end;
procedure TfrAlbaranCliente.CodClientePropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
if not (Modo in [Anadir, Modificar]) then
Exit;
if EsCadenaVacia(DisplayValue) then
Exit;
if (dmTablaClientes.ValidarCodigo(DisplayValue)) then begin
//Comprueba que le numero es lo sufucientemente pequeño para ser un entero
if not EsInteger(DisplayValue) then
begin
VerMensajeFmt(msgCliCodCliIncorrecto,[DisplayValue]);
DisplayValue := '0';
CodCliente.SetFocus;
end
else
begin
DisplayValue := dmTablaClientes.FormatearCodigo(DisplayValue);
if (dmTablaClientes.ExisteCodigo(DisplayValue)) then
CodigoCliente := DisplayValue
else begin
VerMensajeFmt(msgCliCodCliNoExiste, [DisplayValue]);
Paginas.ActivePageIndex := 0;
CodCliente.SetFocus;
end;
end;
end
else begin
VerMensajeFmt(msgCliCodCliIncorrecto, [CodCliente.Text]);
Paginas.ActivePageIndex := 0;
CodCliente.SetFocus;
end;
end;
procedure TfrAlbaranCliente.CodClientePropertiesButtonClick(
Sender: TObject; AButtonIndex: Integer);
begin
ContenidoModal := TfrClientes.Create(Self);
end;
end.