PDA

Ver la Versión Completa : Llenar Clase con DataSet


Jvilomar
24-03-2009, 14:00:46
Saludos mis queridos amigos,

Tengo una duda. Quisiera saber, si es posible popular una clase dada, ejemplo :

Type
TClientes = Class
Private
fID: Int;
fNombres: String;
fApellidos: String;
procedure SetApellidos(const Value: String);
procedure SetCedula(const Value: String);
procedure SetID(const Value: Int);
Published
Property Nombres : String Read fNombres Write SetNombres;
Property Apellidos : String Read fApellidos Write SetApellidos;
Property ID : Int Read fId Write SetID;
elefono2;
End;

......


Bueno la idea es crear un metodo que me cargue los datos en mi clase atendiendo a una consulta, mi campo clave seria el ID. y de ser posible si se le hace una modificacion a cualquiera de los valores de las propiedades de mi clase poder hacer la actualizacion de igual manera.

Muchas Gracias.

Neftali [Germán.Estévez]
24-03-2009, 14:35:42
Dado que tienes las propiedades como published, puedes hacer un método del estilo:


procedure ChargeValues(Cli:TBaseClase; DataSet:TDataSet);


NOTA: Como ves te he puesto el los parámetros TBaseClase en lugar de TCliente, ya que creo que para lo que estás haciendo es mejor que Todas tus clases de negocio hereden de una clase base donde poder implementar Métodos y propiedades comunes a todos

Volviendo al método. Por un lado puedes recorrer los campos (Fields) del Dataset utilizando métodos como GetFieldsList, GetFieldsNames,... Y para acceder a las propiedades de tu clase puedes utilizar RTTI (Acceder a las propiedades de un componente vía RTTI (http://neftali.clubdelphi.com/?p=38)).
Entre unas y otras deberías poder cargar los datos en tu clase.

Jvilomar
24-03-2009, 14:57:45
Gracias Neftali,

Imaginate que mi clase Base es tClientes, este metodo entonces aceptaria como parametro una instancia de mi clase y me la devolveria con los valores obtenidos de la consulta? Perdona mi Ignoracia, pero es que nunca me habia detenido a trabajar con POO y siempre hacia todo crudo. Pero eh pensado en implementar una Clase Generica de Clientes la cual pueda utilizar en cualquier aplicacion que utilize clientes. Espero haberme explicado bien. es Decir imaginemos que mi clase la cargo por medio del ID como seria para llamar el metodo?


Procedure Consultar
Begin

Clientes : ClientesBase;
Var
Clientes := ClientesBase.Create;
Clientes.CargarDatos( .... )
End;


Seria algo asi no?

Neftali [Germán.Estévez]
24-03-2009, 15:50:01
Seria algo asi no?

Sí perfectamente podría ser así.
Simplemente, que yo ese método CargarDatos lo programaría en la clase Base, para que te sirva para todas las clases; Si lo haces utilizando RTTI, como te he explicado antes, te servirá tanto para TClientes, TProveedores, TMonedas o TCarritoDelHelado.

Si quieres prueba a implementarlo en TCliente (ahora te será más sencillo para comenzar), pero debes tener presente que la idea final es Abstraerlo a la Clase Base, para que no tengas que programarlo en todas.

JoseAntonio
26-03-2009, 21:47:33
Hola, yo anduve haciendo experimentos en ese aspecto durante mis ratos libres, aqui un ejemplo, espero que le sirva

procedure TPadre.loadFromDB(CodPadre: String);
var
SQLStr: string;
ADataSet: TDataSet;
begin
sqlStr:= 'select * from padre where codpadre = ' + QuotedStr(CodPadre);
TDMDBManager.GetSQLDataSet(SQLStr, ADataSet); // Clase que genera Datasets
fCodPadre := ADataset.fieldByName('CODPADRE').AsString;
fNombres := AdataSet.FieldbyName('NOMBRESPADRE').AsString;
fSexo := ADataSet.FieldbyName('SEXO').AsInteger;
fTipoDocumento := ADataSet.FieldByName('TIPODOCUMENTO').AsInteger;
fEstadoCivil := ADataSet.FieldByName('ESTADOCIVIL').AsInteger;
fFechaNac := ADataSet.FieldbyName('FECHANACIMIENTO').AsDateTime;
fDescPadre := ADataSet.FieldByName('DESCPADRE').AsString;
LoadChilds; // para leer los hijos
end;

Neftali [Germán.Estévez]
27-03-2009, 10:12:16
aqui un ejemplo, espero que le sirva

A algo así me refería yo, pero de forma genérica para que sirve para cualquier clase del Modelo. ;)

Jvilomar
27-03-2009, 12:57:09
HOla, gracias por Responder, eh estado leyendo un poco de POO y ahora eh comprendido muchas cosas. y tengo ciertas ideas de como manejar todo eso de Abstraccion, Polimorfismo, Encapsulamiento etc, Aplicandolo a lo que deseo hacer.

Muchas gracias, cuando tenga algo concreto lo posteare por aqui mismo para que me den su Valiosa opinion.

Gracias.

JoseAntonio
27-03-2009, 20:32:49
A algo así me refería yo, pero de forma genérica para que sirve para cualquier clase del Modelo. ;)

Yo tambien pensaba averiguar un metodo asi, pero a la hora de la hora, aunque se ahorra lineas de codigo, se pierde flexibilidad y resulta mejor el meter manos a la obra y escribir el codigo a mano, en todo caso, seria interesante usar alguna herramienta generadora de codigo para el mapeo.

Neftali [Germán.Estévez]
30-03-2009, 11:00:56
pero a la hora de la hora, aunque se ahorra lineas de codigo, se pierde flexibilidad y resulta mejor el meter manos a la obra y escribir el codigo a mano, en todo caso, seria interesante usar alguna herramienta generadora de codigo para el mapeo.

Pues perdóname, pero no estoy de acuerdo en absoluto.
Cuando llegues a 1180 clases (como tengo yo ahora) y tengas que añadir ese código 1180 veces ya me dirás si te resulta "tan mejor" ir escribiendo código a mana...:D:D:D

Dejando eso de banda, meter código "a mano" como tú dices no tiene porqué ser mucho menos flexible (si se hacen las cosas bien) (*). Por otro lado, si se hace bien te aporta estandarización del código, reducción de errores (más reducción cuanto mayor sea el número de clases) y una infinita ganancia de tiempo a la hora de corregir y modificar ese código.

(*) Piensa que un método genérico siempre se podrá "sobreescribir" en el caso de que te haga falta.

Además no sólo hablamos del método LoadFromDB, sino que a medida que vayas evolucionando en tu programa te aparecerán códigos como InsertarDb, EliminarDB, ClonarObjeto, AssignarObjeto, ExportarObjeto,...
Sólo hay que ir multiplicando...

JoseAntonio
30-03-2009, 21:39:01
Pues perdóname, pero no estoy de acuerdo en absoluto.
Cuando llegues a 1180 clases (como tengo yo ahora) y tengas que añadir ese código 1180 veces ya me dirás si te resulta "tan mejor" ir escribiendo código a mana...:D:D:D

Yo no suelo mapear todas las tablas en clases salvo las mas importantes, por eso dudo que llegue alguna vez a 1180, y ademas los proyectos que desarrollo procuro simplificarlos al maximo, sin embargo si es cierto que a veces resulta tedioso escribir el mapeo a clases en cada aplicacion por eso existen 3 opciones:

1) hacer el codigo del mapeo uno mismo codificandolo "en duro"
2) Utilizar alguna herramienta propia o de terceros que genere el codigo del mapeo, que luego se tendra que compilar, depurar, modificar etc.
3) Utilizar procedimientos que remplace las lineas de codigo del mapeo en en unas cuantas lineas de codigo, generalizando el proceso para futuras aplicaciones.

de las 3 me inclino por la primera y en un futuro por la segunda opcion, pero la tercera la descarto ya que mi corta experiencia como programador me ha enseñado que no existen procedimientos salvadores que remplazan lineas de codigo, al fin y si lo hacen de alguna forma, es sacrificando versatilidad y eso es algo que no va con mi estilo.


Dejando eso de banda, meter código "a mano" como tú dices no tiene porqué ser mucho menos flexible (si se hacen las cosas bien) (*). Por otro lado, si se hace bien te aporta estandarización del código, reducción de errores (más reducción cuanto mayor sea el número de clases) y una infinita ganancia de tiempo a la hora de corregir y modificar ese código.

(*) Piensa que un método genérico siempre se podrá "sobreescribir" en el caso de que te haga falta.

Además no sólo hablamos del método LoadFromDB, sino que a medida que vayas evolucionando en tu programa te aparecerán códigos como InsertarDb, EliminarDB, ClonarObjeto, AssignarObjeto, ExportarObjeto,...
Sólo hay que ir multiplicando...

Actualmente yo utilizo InsertarDb, EliminarDB, ClonarObjeto, AssignarObjeto, ExportarObjeto, codificandolo "en duro", claro esta yo no hago una clase por cada tabla en mi base de datos, solo aplico esa metodologia con las clases mas importantes, saludos