Ver Mensaje Individual
  #1  
Antiguo 29-02-2012
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Reputación: 17
gustavosv Va por buen camino
Método retorna Set de datos

Hola, hace unos días preguntaba en éste foro sobre el tema de 'Abstraccción', y las respuestas que generosamente me bridaron implican un estudio juicioso del tema, y bueno, como no solo del amor vive el hombre (hay que generar dinero), decidí tomar un camino intermedio mientras tanto.

La historia es que estoy trabajando en un proyecto de bases de datos que de antemano quiero que me sirva tanto para una empresa pequeña que solo quiera usar una BD como MS Access o para otra más grande que ya se le mida a temas como MySQL, entonces pensé en 3 capas, front al usuario (concepto visual) por un lado, unas clases que me representen las tablas de la BD y todas las acciones que se necesiten sobre ellas (segunda capa) y otras clases que encapsulen la conexión al servidor , las consultas SELECT y los CRUDs (tercera capa), pensando que en ésta última sea la única a la que tenga que 'meterle mano' al cambiar de una BD a otra.

En éste punto me enredé y lancé un hilo "Abstracción en BD" y quienes escribieron en ese post hablaron de Persistencia, ORM y enlaces muy enriquecedor que pienso leer, pero como decía, el tiempo me acosa, debo hacer entregas y tengo fecha límite, por lo que tomé un camino intermedio, decidí hacer solo 2 capas, visual y clases de tablas de la BD con sus funciones y métodos que tienen dentro de ellas las SQL usando ADO.

Ahora el asunto es que espero que el método 'BuscarListaClientes' de la clase TCliente me retorne un conjunto o set de datos, p.ej. todos los clientes de una ciudad, y no he logrado conseguirlo, he intentado que el método 'BuscarListaClientes' devuelva un DataSource, un ClientDataSet y nada me funciona. El código que anexo es para llenar un DBGrid con la lista de Agentes Comerciales de la empresa:
Código Delphi [-]
En la forma Fpedidos:
procedure TFPedidos.Button1Click(Sender: TObject);
var
  vdatos: TDataSource;
begin
  vdatos := TDataSource.Create(nil);
  vdatos := oAgenteCial.Leer(FPrincipal.oConexion.GetConexion);
  DBGrid1.DataSource := vdatos;
end;

En la clase:

function TAgenteCial.Leer(AConexion: TADOConnection): TDataSource;
var
  vCommandText: string;
  vDatos: TADOQuery;
begin
  Result := nil;
  vDatos := TADOQuery.Create(nil);
  vDataSource := TDataSource.Create(vDatos);
  vDatos.Connection := AConexion;
  vCommandText := 'SELECT venId, venNombre FROM GEN_Vendedores ';

  vDatos.SQL.Text := vCommandText;
  try
    vDatos.Active := True;
    if not vDatos.Eof then
      Result := vDatos.DataSource;
  finally
    FreeAndNil(vDatos);
  end;
end;

El problema es que no recibo el set de datos, y como decía he intentado con varios componentes y marca exception class $C0000005 access violation at 0x09-...


Alguien ha resuelto algo similar ?
Responder Con Cita