Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-03-2009
Jvilomar Jvilomar is offline
Miembro
 
Registrado: mar 2004
Ubicación: Republica Dominicana
Posts: 97
Poder: 21
Jvilomar Va por buen camino
Post Llenar Clase con DataSet

Saludos mis queridos amigos,

Tengo una duda. Quisiera saber, si es posible popular una clase dada, ejemplo :
Código Delphi [-]
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.
__________________
El conocimiento es un Patrimonio Universal....
Responder Con Cita
  #2  
Antiguo 24-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Dado que tienes las propiedades como published, puedes hacer un método del estilo:

Código Delphi [-]
  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).
Entre unas y otras deberías poder cargar los datos en tu clase.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 24-03-2009
Jvilomar Jvilomar is offline
Miembro
 
Registrado: mar 2004
Ubicación: Republica Dominicana
Posts: 97
Poder: 21
Jvilomar Va por buen camino
Thumbs up

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?

Código Delphi [-]
Procedure Consultar Begin Clientes : ClientesBase; Var Clientes := ClientesBase.Create; Clientes.CargarDatos( .... ) End;

Seria algo asi no?
__________________
El conocimiento es un Patrimonio Universal....
Responder Con Cita
  #4  
Antiguo 24-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Jvilomar Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 26-03-2009
Avatar de JoseAntonio
JoseAntonio JoseAntonio is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lima - Ciudad de los Reyes.
Posts: 87
Poder: 19
JoseAntonio Va por buen camino
Post

Hola, yo anduve haciendo experimentos en ese aspecto durante mis ratos libres, aqui un ejemplo, espero que le sirva

Código Delphi [-]
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;
__________________
nuestro carácter está reflejado en cada línea de código que escribimos.
Responder Con Cita
  #6  
Antiguo 27-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por JoseAntonio Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 27-03-2009
Jvilomar Jvilomar is offline
Miembro
 
Registrado: mar 2004
Ubicación: Republica Dominicana
Posts: 97
Poder: 21
Jvilomar Va por buen camino
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.
__________________
El conocimiento es un Patrimonio Universal....
Responder Con Cita
  #8  
Antiguo 27-03-2009
Avatar de JoseAntonio
JoseAntonio JoseAntonio is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lima - Ciudad de los Reyes.
Posts: 87
Poder: 19
JoseAntonio Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
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.
__________________
nuestro carácter está reflejado en cada línea de código que escribimos.
Responder Con Cita
  #9  
Antiguo 30-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por JoseAntonio Ver Mensaje
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...

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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 30-03-2009
Avatar de JoseAntonio
JoseAntonio JoseAntonio is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lima - Ciudad de los Reyes.
Posts: 87
Poder: 19
JoseAntonio Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
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...
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.

Cita:
Empezado por Neftali Ver Mensaje
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
__________________
nuestro carácter está reflejado en cada línea de código que escribimos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Copiar el contenido de un DataSet a otro DataSet Javi2 Varios 82 22-11-2022 09:26:16
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
Actualizar un dataset desde otro dataset jafera Conexión con bases de datos 17 18-12-2008 23:57:10
llenar un combo pzhero .NET 3 07-06-2004 20:13:35
llenar sqlclientdataset jgutti Conexión con bases de datos 5 18-12-2003 18:42:35


La franja horaria es GMT +2. Ahora son las 01:36:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi