Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-04-2012
antigrondona antigrondona is offline
Miembro
 
Registrado: ene 2010
Posts: 47
Poder: 0
antigrondona Va por buen camino
Query en procedimiento

Hola amigos, mi problema es que utilizo los query (adoquery) en procedimientos para luego invocarlos. Como esas rutinas van en una unidad no incorporo los componentes (adoquery) a los formularios, entonces lo que quiero hacer es utilizar los query como variables locales y devolver el resultado en alguna otra. Me están dando dolores de cabeza, al compilar hay errores en memoria.
Lo que hago es más o menos lo siguiente

var
query1,query2:TADOquery; las declaro

luego las creo con query1.TADOQuery.Create(query1) y hago la consulta.

Seguro que me falta algo, además quisiera liberar la var al finalizar (query1.free), pero también me dió problemas.

Saludos, espero respuestas.
Responder Con Cita
  #2  
Antiguo 23-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por antigrondona Ver Mensaje
query1.TADOQuery.Create(query1)
¿Por qué no pones exactamente cómo es que creas el componente. Esta sentencia que pones es imposible.

// Saludos
Responder Con Cita
  #3  
Antiguo 24-04-2012
Northern Northern is offline
Miembro
 
Registrado: ene 2006
Posts: 211
Poder: 19
Northern Va por buen camino
Cita:
Empezado por antigrondona Ver Mensaje
Hola amigos, mi problema es que utilizo los query (adoquery) en procedimientos para luego invocarlos. Como esas rutinas van en una unidad no incorporo los componentes (adoquery) a los formularios, entonces lo que quiero hacer es utilizar los query como variables locales y devolver el resultado en alguna otra. Me están dando dolores de cabeza, al compilar hay errores en memoria.
Lo que hago es más o menos lo siguiente

var
query1,query2:TADOquery; las declaro

luego las creo con query1.TADOQuery.Create(query1) y hago la consulta.

Seguro que me falta algo, además quisiera liberar la var al finalizar (query1.free), pero también me dió problemas.
Imagino que con ese "van en una unidad" te refieres a que todos los componentes no visuales de acceso a datos (TADOConnection, TDataSource, TADOTable, TADOQuery, etc. ) los colocas en el DataModule. No ?

Después enlazas esa unidad, la del DataModule, a los Forms en los que quieres consultar/editar/agregar/borrar datos.

Finalmente para acceder a los datos de la BD limpias la consulta previa, añades una consulta, preparas la consulta y la abres, entre otros detalles...

Si no lo haces así, te estás liando demasiado. Además un único TQuery vale para realizar muchísimas consultas las cuales no todas tienen que estar abiertas al mismo tiempo.

No sé, yo me replantearía eso de crear componentes de acceso a datos en tiempo de ejecución en vez de en tiempo de diseño.
Responder Con Cita
  #4  
Antiguo 25-04-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Antes lo hacia en un DataModule, al poco tiempo me faltaba pantalla para poner los componentes de base de datos, al final opte por crear los componentes en tiempo real y no me arrepiento de haberlo hecho.

Este proceso lo realizo en cada formulario y nos es más trabajo, sino otra forma de trabajar, para mi, es ideal.

Primero, Definir en TForm:
Código Delphi [-]
...
  private
    { Private declarations }
    SQLInitDB: TStrings; <-- Aquí introduzco la SQL

    // Variable de búsqueda
    SQLWhereText: TStrings; <-- Aquí los parametros de WHERE

    // Componente de Conexión Facturas
    adoCnnFrm: TADOConnection;
    adoQryFrm: TADOQuery;
    dsSrcFrm: TDataSource;

    ...
    ...
end;

Segundo, Cuando se crea el TForm:
Código Delphi [-]
...
begin
  adoCnnFrm := TADOConnection.Create(Self);
    adoCnnFrm.LoginPrompt := False;
    adoCnnFrm.ConnectionString := MSSQLServerCfg.ConnectionString;    <-- Parámetro que se le pasa para la Conexión

  adoQryFrm := TADOQuery.Create(Self);
    adoQryFrm.Connection := adoCnnFrm;

  dsSrcFrm := TDataSource.Create(Self);
    dsSrcFrm.DataSet := adoQryFrm;

  dbgGrid.DataSource := dsSrcFrm;

  SQLInitDB := TStringList.Create;
    SQLInitDB.Add('SELECT');
    SQLInitDB.Add('    ...');
    SQLInitDB.Add('    ...');
    SQLInitDB.Add('  FROM xxyyzz');

  SQLWhereText := TStringList.Create;
end;

Tercero, Cuando se busca
Código Delphi [-]
...
var
  FieldValue: Integer;
begin
  // Guarda la posición del Grid, para después recuperarlo.
  FieldValue := GetIDxxyyzzGrid;

  // Comprobar que la base de datos si está abierta y cerrarla
  if adoCnnFrm.Connected then
    adoCnnFrm.Close;

  with adoQryFrm do
  begin
    SQL.Clear;

    SQL.Assign(SQLInitDB);

    if (SQLWhereText.Count > 0) then
      SQL.Add(SQLWhereText.Text);

    Open;
  end;

  //    Se pone ésta línea para que el puntero se actualice en el Grid
  // si no se pone el metodo (Update) del DBGrid, el puntero estaría
  // actualizado pero el foco que es azul estaría en la parte superior
  // del grid, y eso, lleva a confusión de donde se encuentra el puntero.
  dbgGrid.Update;

  // Posicionar el puntero donde estaba
  with dbgGrid.DataSource.DataSet do
  begin
    Locate('IDXXYYZZ', FieldValue, [loCaseInsensitive]);
    Result := RecordCount;
  end;
end;

Cuarto, Cuando se cierre el formulario
Código Delphi [-]
...
begin
  SQLInitDB.Free;
  SQLWhereText.Free;

  adoCnnFrm.Free;
  dsSrcFrm.Free;
  adoQryFrm.Free;
end;

Y esto me va muy bien.

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #5  
Antiguo 25-04-2012
antigrondona antigrondona is offline
Miembro
 
Registrado: ene 2010
Posts: 47
Poder: 0
antigrondona Va por buen camino
Cita:
Empezado por roman Ver Mensaje
¿Por qué no pones exactamente cómo es que creas el componente. Esta sentencia que pones es imposible.

// Saludos
Perdón, es verdad, la puse mal y es imposible.

query1:=TADOQuery.Create(query1);

asi la creo en tiempo de ejecución y luego hago la consulta. Evidentemente no se crea adecuadamente porque me dá error en memoria al invocar el procedimiento.

A los demás gracias por sus recomendaciones, pero trabajo incorporando procedimientos en una Unit auxiliar, de esa forma solo debo invocarlos en lugar de repetir codigo.
Responder Con Cita
  #6  
Antiguo 25-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por antigrondona Ver Mensaje
query1:=TADOQuery.Create(query1);
Esto es incorrecto. No puedes pasar como parámetro al Create al propio componente. Si tú mismo(a?) vas a destruir posteriormente el componente, pasa nil como parámetro.

// Saludos
Responder Con Cita
  #7  
Antiguo 26-04-2012
antigrondona antigrondona is offline
Miembro
 
Registrado: ene 2010
Posts: 47
Poder: 0
antigrondona Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Esto es incorrecto. No puedes pasar como parámetro al Create al propio componente. Si tú mismo(a?) vas a destruir posteriormente el componente, pasa nil como parámetro.

// Saludos
Oka, podrías decirme por favor como es la sentencia?
Responder Con Cita
  #8  
Antiguo 26-04-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por antigrondona Ver Mensaje
Oka, podrías decirme por favor como es la sentencia?
¿Tan dificil es entender lo que dijo roman?

Código Delphi [-]
Query1 := TADOQuery.Create(nil);

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 26-04-2012
antigrondona antigrondona is offline
Miembro
 
Registrado: ene 2010
Posts: 47
Poder: 0
antigrondona Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
¿Tan dificil es entender lo que dijo roman?

Código Delphi [-]Query1 := TADOQuery.Create(nil);


Saludos,
Utilizo esa linea, luego hago la consulta y finalmente query1.free?

Gracias.
Responder Con Cita
  #10  
Antiguo 26-04-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Si, necesitas TU MISMO liberarlo.

Cuando tu defines en el parámetro que el dueño sea nil le estás indicando que tu eres quien se encargará de liberarlo y no la aplicación.
Te recomiendo la lectura de la ayuda, allí está aclarado el asunto.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
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
Procedimiento almacenado y query XBart Firebird e Interbase 1 16-01-2006 09:29:33
Ayuda con procedimiento almacenado y query XBart Firebird e Interbase 3 05-12-2005 03:42:55
Ayuda, como llamar a un procedimiento desde otro procedimiento? Ariatna Varios 1 01-02-2005 04:05:35
Llamar a Procedimiento Firebird des Query Gabriel Conexión con bases de datos 3 09-06-2004 20:21:05
Como Ejecutar Un Query Desde Un Procedimiento Almacenado multisof Firebird e Interbase 2 04-11-2003 06:15:28


La franja horaria es GMT +2. Ahora son las 20:09:01.


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