Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Envio de Resultado de un AdoQuery (https://www.clubdelphi.com/foros/showthread.php?t=13371)

MITOPE 17-08-2004 04:36:43

Envio de Resultado de un AdoQuery
 
Hola a todos, quisiera que por favor me ayuden a mejorar este código, el problema que tengo es que al destuir (QsqlClienteOpcional) aparentemente tambien se destruye (QsqlSistema) y ya no me deja usar ningún metodo de la clase TSistema. La Clase TSistema es una especie de Clase Servidora. Tambien, no se si esta bien la forma como mando la información del query(QsqlSitema) al formulario o hay otra mejor forma de hacerlo, que la verdad lo hice de pura intuición, Espero me puedan dar sugerencias, para mejorar mi código.

Base de datos: Sql 2000
Delphi 6.0

Este es el Código del metodo que utilizo para traer la informacion de la base de datos

Código:

function TSistema.DevuelveClienteOpcional(pCita: String): TAdoQuery;
begin
  with QsqlSistema do
  begin
        Close;
        Parameters.Clear;
        Parameters.AddParameter.Name:='Cita';
        Parameters.ParamByName('Cita').Value:=pCita;
        SQL.Text:= 'Select * from CitaOpcional'+
                          ' Where IdCita= :Cita';
        ParamCheck:= True;
        Open;
        Result:= QsqlSistema;
  end;
end;

El formulario(FrmCita) que recibe la información tiene el siguiente código

Código:


procedure TFrmCita.MuestraClienteOpcional;
var QsqlClienteOpcional: TADOQuery;
begin
  QsqlClienteOpcional:= TADOQuery.Create(Owner);
  QsqlClienteOpcional.Connection:= AdocCita;
  QsqlClienteOpcional:= Sistema.DevuelveClienteOpcional(FCita);
  with QsqlClienteOpcional do
  begin
        EdtOpcApPaterno.Text:= FieldByName('ApellidoPaterno').AsString;
        EdtOpcNombres.Text:=FieldByName('NombreCliente').AsString;
        EdtOpcTFijo.Text:=FieldByName('TelefonoFijoCo').AsString;
        EdtOpcTCelular.Text:=FieldByName('TelefonoCelularCO').AsString;
        EdtOpcHora.Text:=FieldByName('HoraReserva').AsString;
        Destroy;
  end;
end;

Gracias a Todos de antemano.

jachguate 17-08-2004 07:31:42

Hola.

Creo que tenes un problema de concepto. Las variables "objeto" en delphi no son mas que apuntadores, con una sintaxis simplificada. De esta cuenta, que en tu procedimiento DevuelveClienteOpcional, al hacer

Result := QsqlSistema;

Lo que estas haciendo realmente es devolver una referencia a QsqlSistema, y por tanto, al asignar esta referencia a QsqlClienteOpcional y luego destruir el objeto, en realidad estas destruyendo QsqlSistema, puesto que ambos apuntan al mismo objeto.

Si lo que queres es tener un objeto totalmente independiente, has de crearlo dentro del primer procedimiento, que debiera quedar algo como:

Código Delphi [-]
function TSistema.DevuelveClienteOpcional(pCita: String): TAdoQuery;
begin
  result := TAdoQuery.Create;  // es probable que necesite parámetros... ver ayuda
  // hacé aqui las asignaciones del database y lo que haga falta con un adoQuery.
  with result do
  begin
    Close;
    // esto no se si es realmente necesario... 
    //¿el adoquery no agrega automáticamente los parámetros?
    Parameters.Clear;
    Parameters.AddParameter.Name:='Cita';
    Parameters.ParamByName('Cita').Value:=pCita;
    SQL.Text:= 'Select * from CitaOpcional'+
               ' Where IdCita= :Cita';
    ParamCheck:= True;    
    Open;
  end;
end;

La otra rutina no necesitaría, en este caso, ningún cambio.

No uso ado, asi que he dejado simplemente algunos comentarios que supongo vos sabras interpretar y sustituir por el código apropiado.

Hasta luego.

;)

MITOPE 17-08-2004 17:28:34

Ok . Jose antonio, ahora entiendo, hay alguna otra forma de mandar la informacion del AdoQuery QsqlSistema a mi formulario sin tener que crear otro AdoQuery en este..

Gracias , por tu respuesta , me aclaró mas el panorama

jachguate 17-08-2004 17:43:56

Hola.

En primer lugar aclaro que me llamo Juan Antonio.

Luego, ¿que significa "mandar la informacion"?

:confused:

MITOPE 19-08-2004 01:13:30

Perdon por la demora , me referia a otra forma de enviar la informacion de la clase TSistena a el formularioGracias.

jachguate 19-08-2004 06:47:57

Lo siento, pero desde mi posición "enviar la información", significa lo mismo que "mandar la información"... y esto es: muchas cosas posibles y nada concreto.

Cómo no está claro, asumiré que queres copiar los datos de los registros del query1 al query2, lo que podes hacer con un ciclo algo asi:

Código Delphi [-]
  query1.first;
  while not query1.eof do
  begin
    query2.insert;
    query2.fieldbyname('campo').Value := Query1.Fieldbyname('campo').Value;
    query2.post;
    query1.next;
  end;

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 06:13:47.

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