Cita:
Empezado por javicho_villa
...defino en archivo .pas las clases que defino, por ejemplo: Modelo_Cliente.pas. Aquí defino las clase TCliente. en otro archivo .pas llamado Cx_Cliente, defino funciones que me devuelvan valores consultando la base de datos
...
este procedimiento lo repito para cualquier tabla por ejemplo para las ventas tengo una clase TVenta guardado en un archivo Modelo_Venta, ademas de los procedimientos y funciones en un archivo Cx_Venta donde me conecto a la base de datos y hago consultas y modificaciones a la tabla venta.
...
Lo que quiero hacer es lo mismo pero un solo archivo donde pueda invocar los valores de cualquier tabla, es decir si es Cliente, Venta, etc, pero usando los objetos pertinentes.
|
Lo ideal sería que tuvieras un objeto que defina cada objeto de clase, Modelo_Cliente.pas (
TCliente), Modelo_Venta.pas (
TVenta),... y que tal como dices, puedas tener centralizado en un único lugar el procedimiento que recupera los campos de una tabla en el objeto correspondiente.
Tal como lo tienes ahora, el problema es que, debes tener en algún sitio la correlación entre los campos de la tabla y las propiedades de cada objeto. como no la tienes en ningún sitio, implementas un procedimiento por cada una de esas parejas (Cx_Cliente, Cx_Venta,...).
Creo que puedes conseguir eso, en la propia clase TCliente, TVenta,... utilizando
RTTI y
atributos.
De esa forma en un único lugar (procedimiento/función) podrás cargar los campos de la tabla en el objeto relacionado.
Sería algo así:
Código Delphi
[-]
type
TBaseObject = class
...
protected
procedure FillObjectFromdataBase;
end;
[AttTableName('CLIENTES')]
TCliente = class (TBaseObject)
private
FiFormaPago: String;
FiRazonSocial: string;
FiId_Cliente: integer;
published
[AttrFieldName('ID')]
[AttrDescripcion('Identificador del cliente')
property iId_Cliente:integer read FiId_Cliente;
[AttrFieldName('RazonSocial')]
[AttrDescripcion('Razón social del cliente')
property iRazonSocial:string read FiRazonSocial;
[AttrFieldName('FormaPago')]
[AttrDescripcion('Forma de pago del cliente')
property iFormaPago:String read FiFormaPago;
...
end;
[AttrTableName('VENTAS')]
TVentas = class (TBaseObject)
published
[AttrFieldName('ID')]
[AttrDescripcion('Identificador del cliente asiciado à la venta')
property iId_Venta:integer read FiId_Venta;
[AttrFieldName('ID_venta')]
[AttrDescripcion('Identificador del cliente asiciado à la venta')
property iId_Cliente:integer read FiId_Cliente;
...
end;
El procedmiento:
Código Delphi
[-]procedure FillObjectFromdataBase;
Definido en la clase base (TBaseObject) debería poder acceder al atributo de cada clase (AttTableName) para conocer la tabla, y a las propiedades published del objeto vía RTTI.
Para cada propiedad puedes conocer su atributo (AttrFieldName) para acceder al campo.
De esta forma, podrías utilizar:
Código Delphi
[-]
var
cli:Tcliente;
venta:TVentas;
begin
...
cli.FillObjectFromdataBase;
...
venta.FillObjectFromdataBase;
...
Bueno, más o menos esa es la idea. No se si me he explicado bien.
Tienes información sobre cómo definir atributos aquí:
http://docwiki.embarcadero.com/RADSt...tom_Attributes
Cómo acceder a ellos en runtime:
http://docwiki.embarcadero.com/RADSt...es_at_Run_Time