Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Obtener valor númerico de procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=79125)

d3nz1g 08-06-2012 23:37:03

Obtener valor númerico de procedimiento almacenado
 
Un saludo a tod@s,

Tengo una duda que quizás me puedan ayudar a despejar, sin mas preámbulos vamos al problema:

Estoy trabajando en una aplicación conectada a una BD SQL (Server o cualquier otra). Para realizar las consultas sobre la BD utilizo dos métodos (mediante DBExpress):

1. obtenerConsulta : me devuelve un ClientDataSet con los resultados consultados.

2. ejecutarConsulta: ejecuta una sentencia SQL dada y me devuelve un valor entero.

Este ultimo metodo (ejecutarConsulta) en realidad lo que hace es declarar un TSQLQuery y ejecutar un ExecSql, que como supongo muchos saben devuelve el número de filas afectadas por la consulta.

Cita:

...
SQL.Clear;
SQL.Add(query);
Result := ExecSQL(true);
Aqui es donde surge el problema: resulta que mediante el ExecSQL estoy ejecutando un procedimiento almacenado que inserta un registro en una tabla dadas ciertas condiciones, pero ademas de esto me devuelve un valor numerico significando si realizo la insercion (1), o si no la inserto porque el registro ya exisitía (2) o no cumplía una condición dada (3).

Así, mi pregunta es la siguiente: ¿Existirá alguna manera de ejecutar un procedimiento almacenado que realize modificaciones a la BD y que me devuelva un valor numerico que no sea el numero de filas afectadas?

Ya intente ejecutando el procedimiento almacenado mediante el comando Open; en este caso si puedo obtener el valor númerico pero se cae en el caso de tener tener que realizar la insercion (caso 1)...

Alguna idea? Gracias y saludos.

Casimiro Notevi 08-06-2012 23:52:59

¿Y qué base de datos es?

En principio, un procedimiento almacenado puede devolver lo que tú quieras, así que no habría problema.

d3nz1g 09-06-2012 00:07:27

Actualmente estoy trabajando en SQL Server.

El procedimiento almancenado como tal si esta devolviendo el valor esperado, el problema es como obtener ese valor desde Delphi, ya que el ExecSQL no retorna el valor que devuelve el procedimiento almacenado sino la cantidad de filas afectadas...

Me doy a entender?

Gracias por la respuesta.

Casimiro Notevi 09-06-2012 00:13:43

Supongo que el sql server que usas es el de microsoft.
Y creo que preguntas por un procedimiento almacenado llamado desde delphi.

Para obtener el valor devuelto, algo así, es sólo un ejemplo:

Código Delphi [-]
query.parambyname('codigo').asinteger := 1;
query.execsql;
valordevuelto := query.fields[0].asinteger;          //  así 
valordevuelto := query.fieldbyname('valor').asinteger;  // o así

d3nz1g 19-06-2012 01:39:54

Gracias Casimiro, lamento haber durado tanto en responder pero estuve realizando bastantes pruebas al respecto... Comento mis resultados:

Intente por todos los medios de realizar la consulta como sugeriste pero no logre echarla a andar.... El execsql no me permite obtener el valor devuelto, esto solo lo pude conseguir mediante el comando open, pero este no me permite realizar la inserción que necesito efectuar mediante el procedimiento almacenado.

Así que después de mucho batallar con el problema decidí que talvez habia una manera mas simple de abordar el problema, y la encontre utilizando el componente ClientDataSet. La idea de utilizar procedimientos almacenados era para optimizar al máximo la velocidad de las consultas pues estaba editando la base de datos directamente, al lograr trabajar mediante el CDS se me solucionaron un montón de problemas asi como también logre optimizar enormemente el tiempo de respuesta de mi aplicación!

Ahora tengo una nueva duda, pero ya no pertenece a este hilo, así que Casimiro muchas gracias por tu tiempo y atención.

Casimiro Notevi 19-06-2012 08:29:21

Bueno, voy a ver el otro hilo, a ver si conozco la respuesta :)


La franja horaria es GMT +2. Ahora son las 10:09:48.

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