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 07-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
Problema recordset vacio en Procedimiento almacenado con ADO

Hola a todos, tengo un problema...... estoy manejando procedimientos almacenados con postgres y ado-odbc para la conectividad, todo va bien.... el problema es cuando ejecuto un procedimiento de búsqueda y no me devuelve nada (no existe el registro) me bota un error que dice: "El valor de bof o eof es true, o el actual registro se eliminó; la operación solicitada requiere un registro actual".

Cuando hay registros que coinciden con búsqueda me devuelve datos, los muestro, todo normal, el problema es cuando no existe registro que satisfaga la búsqueda (select no devuelve nada), el programa me bota ese error y ya no puede realizar búsquedas, ni las que realizaba con éxito.

Bueno....... según la documentación de Microsoft respecto a ado es porque estoy cerrando el recordset vacío (utilizo el metodo CLOSE para el ADOSTOREDPROC y desactivo-activo un DATASOURCE vinculado al proc para actualizar la info en un DBGRID).

Alguna Sugerencia?
Gracias por adelantado
Responder Con Cita
  #2  
Antiguo 07-07-2008
Avatar de tcp_ip_es
tcp_ip_es tcp_ip_es is offline
No confirmado
 
Registrado: ago 2003
Ubicación: Madrid
Posts: 635
Poder: 0
tcp_ip_es Va por buen camino
Haces alguna operación con el AdoStoredProc??? algo como moverte por los registros asi como AdoStoredproc.first??? Es posible que al no tener datos e intentar moverte por los registros te tire ese error. Lo ideal antes de moverte es ver si ese dataset tiene datos. algo como:

Código:
if AdoStoredProc1.IsEmpty then 
 Hago lo que tenga que hacer....
Saludos, Tony
Responder Con Cita
  #3  
Antiguo 07-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
aquí está el código

Gracias por la respuesta, la verdad no estoy recorriendo el dataset sino que solo ejecuto el procedimiento, este me devuelve registros y solo muestro el resultado, en realidad es una función en postgresql que me devuelve un set of record:


Código:
 
 DataModule2.buscar_cliente.Close();
 DataModule2.buscar_cliente.Parameters[0].Value=Edit21.Text;
 DataModule2.buscar_cliente.Prepared=True;
 DataModule2.buscar_cliente.ExecProc();
 DataModule2.buscar_cliente.Open();
 if (DataModule2.buscar_cliente.RecordCount=0) then
 begin
        ShowMessage('No hay coincidencias');
        DataModule2.DataSource2.DataSet.Active=False;
 end;
 else
        DataModule2.DataSource2.DataSet.Active=True;
Como ves, solo activo el datasource en caso de que hay registros encontrados, sino lo desactivo; este datasource está conectado a un dbgrid para mostrar los registros.

El problema va cuando no ecuentra coincidencias, me muestra el mensaje de "el valor bof o eof es true..............." y la búsqueda ya no funciona más, solo me muestra el mensaje cada vez que ejecuto el procedimiento. Parece que tendría que "reiniciar" el procedimiento cada vez que lo ejecuto pero no sé como hacerlo.
Responder Con Cita
  #4  
Antiguo 08-07-2008
Avatar de tcp_ip_es
tcp_ip_es tcp_ip_es is offline
No confirmado
 
Registrado: ago 2003
Ubicación: Madrid
Posts: 635
Poder: 0
tcp_ip_es Va por buen camino
Si el resultado del StoredProc es un conjunto de registros no deberías de llamar a ExecProc simplemente llama a Open, a parte de poner el prepared a false antes de asignar parametros....

Código:
 DataModule2.buscar_cliente.Close;
 DataModule2.buscar_cliente.Prepared=False;
 DataModule2.buscar_cliente.Parameters[0].Value=Edit21.Text;
 DataModule2.buscar_cliente.Prepared=True;
 DataModule2.buscar_cliente.Open;
 if (DataModule2.buscar_cliente.isempty) then
 begin
        ShowMessage('No hay coincidencias');
        DataModule2.DataSource2.DataSet.Active=False;
 end
 else
        DataModule2.DataSource2.DataSet.Active=True;
Responder Con Cita
  #5  
Antiguo 08-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
Ok.......... cambie el código como me indicaste pero igual da el error ese y la búsqueda ya no jala, bueno entonces cual es la diferencia entre ExecProc y Open?
Responder Con Cita
  #6  
Antiguo 09-07-2008
Avatar de tcp_ip_es
tcp_ip_es tcp_ip_es is offline
No confirmado
 
Registrado: ago 2003
Ubicación: Madrid
Posts: 635
Poder: 0
tcp_ip_es Va por buen camino
a ser posible indicanos el código del storeproc.


P.D. En principio el execproc no devuelve cursor y el open si, es decir el execproc es para consultas que no sean select y no devuelven conjunto de datos vease insert, updates...
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
problema con procedimiento almacenado aladelta Firebird e Interbase 7 14-02-2007 01:52:34
Problema con Procedimiento almacenado Tauro78 Firebird e Interbase 6 12-02-2007 17:43:06
Problema con procedimiento almacenado XBart Firebird e Interbase 3 27-10-2005 09:08:17
Problema con procedimiento almacenado juziel Firebird e Interbase 4 20-09-2004 18:31:41
Problema con un procedimiento almacenado Markoz Firebird e Interbase 1 08-07-2003 11:47:20


La franja horaria es GMT +2. Ahora son las 12:14:57.


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