Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #3  
Antiguo 07-04-2011
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 835
Poder: 24
gatosoft Va camino a la fama
Amigo elarys, te doy un par de sugerencias, sin ser experto en el tema de capas...

** Te recomiendo utilizar TClientDataset. Esta es una herramienta muy poderosa que te sirve como interface entre tus componentes de "la capa de datos" y las demás capas. Sin importar que componentes de acceso a datos estes utilizando: ADO, ZEOS, dbexpress, etc.

De esta manera tu codigo en las capas superiores no lo tendras que tocar cuando quieras cambiar de base de datos... Es decir, podrías pensar a futuro, en "enchufar" tu aplicación a una base de datos y no en "migrar" de motor. (Obivamente todo tiene sus limites y excepciones)

** Te recomiendo utilizar los componentes dbExpress, aunque cada uno tiene sus gustos y preferencias, pero por mi parte pienso que tienen como ventaja principal, que son componentes nativos de Delphi, y que junto al TClientDataset Embarcadero le esta trabajando bastante orientandolos por a la tecnología DataSnap.

** Utiliza la ventaja del polimorfismo que te brinda la POO. Puedes redefinir tus métodos independiente del comoponete de acceso a datos que utilices. Por ejemplo, hasta donde veo, podrias reemplazar todos tus TADOQuery por TDataset o en últimas por un TClientDatset (que tambien podría tomarse como genérico). Por ejemplo

Código Delphi [-]
procedure TDocuments.SetRecord(qryTMP:TADOQuery);
begin
  Self.FId_Document := qryTMP.Fields.FieldByName('Id_Document').AsInteger;
  Self.FFormat_Code := qryTMP.Fields.FieldByName('Format_Code').AsString;
  Self.FDescription := qryTMP.Fields.FieldByName('Description').AsString;
end;

deberia quedar:

Código Delphi [-]
procedure TDocuments.SetRecord(qryTMP:TDataset);
begin
  Self.FId_Document := qryTMP.Fields.FieldByName('Id_Document').AsInteger;
  Self.FFormat_Code := qryTMP.Fields.FieldByName('Format_Code').AsString;
  Self.FDescription := qryTMP.Fields.FieldByName('Description').AsString;
end;

de esta manera cuando migres puedes llamar esta funcion pasando un componente ADO, Zeos, o dbExpress


** Las funciones ConsultarSQL y EjecutarSQL no deberían compartir unidad con tus clases principales (Tdocuments y TDocumentsList), estas debrían estar en un Datamodule y ademas no deberían ser globales, sino que deberían ser parte del propio Datamodule.

** No veo necesario que tus funciones EjecutarSQL y ConsultarSQL deban conectarse cada vez que las requieras... podrías mantener una conexión activa de forma permanente y pasarla como parámetro a tus dos funciones. Tambien es útil si manejas varias bases de datos:

Código Delphi [-]
function EjecutarSQL(conn: TSqlConnection; StrSQL: string; claDatos:TDatos):TDataset;

El componente TSqlConnection hace parte de dbexpress, pero puedes utilizar cualquiera, como te dije con estos componentes puedes trabajar varias bases de datos como SQL Server, MySQL, PostgreSQL, DB2, ORACLE... entre otras.

** En cuanto a tus clase principales (TDocuments y TDocumentsList), te recomiendo "liberarlas" de sentencias SQL. y pasar finalmente todo este codigo a un datamodule, haciendo llamadas a procedimeintos.

Código Delphi [-]
procedure TDocuments.SaveModified;
begin
  SetParameter;
  ElDataModule.ActualizarDocuento(claDatos);
end;

En el caso de tu funcion búesqueda

Código Delphi [-]
procedure TDocumentsList.Busqueda(TDocu:TDocuments);
var
  Documents:TDocuments;
begin
  if not assigned (TDocu) then
    TDocu := TDocuments.Create;

  ElDatamodule.RealizarBusqueda(TDocu, qryTMP); // Aqui haces todo lo relacionado 
                                                // al SQL o al motor de base de datos
                               
  while not qryTMP.Eof do
  begin
    Documents := TDocuments.Create;
    Documents.SetRecord(qryTMP);
    FDocuments.Add(Documents);    
    qryTMP.Next;
  end;//while  
end;

De esta manera independizas (un poco) la logica de negocio de la forma como buscas... es decir, el dia de mañana en lugar de realizar la busqueda via SQL, podrias utilizar un porcedimiento almacenado, o cualquier otra funcionalidad que tu motor escogido te ofrezca. y no tendrias por que tocar la logica que plantea tu clase...


Finalmente, el Datamodule será el componente duro, pues alli estarán "las tripas" de la aplicación... es alli donde sabras como te conectas a tu BD.

espero que te sirva,

un saludo,
Responder Con Cita
 



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
Pasar datos a una clase de un WS gcaffe Internet 1 17-12-2010 16:42:52
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
¿¿Es posible pasar una clase como parámetro con el modificador var?? PaFernan99 OOP 3 09-02-2009 18:49:00
Clase jakuna OOP 2 30-08-2007 21:50:35
...la clase... Jure Humor 0 27-07-2004 20:00:47


La franja horaria es GMT +2. Ahora son las 03:46:18.


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