Procedimiento almacenado MSDE SQL y vfp 8

06/10/2005 - 17:39 por Hector Kuhn | Informe spam
Estoy intentando obtener un valor de un procedimiento almacenado, que
deberia devolver un numero entero, el problema que se me presenta es el
error que me arroja al ejecutar el comando execute

Las instrucciones en Vfp 8 son las siguientes
la coneccion es ADO y uso cursoradapter

FUNCTION AGREGAR

local lccmd

retvalor = 0

lccmd = "EXEC nuevoid '"+ALLTRIM(UPPER(this.calias))+"', @retvalor OUTPUT"

&& lcmd queda = "EXEC nuevoid 'PRODUCTO', @retvalor OUTPUT"

oCa = thisform.obtenercursor(this.calias)
Oconection = oca.datasource.activeconnection
oconection.execute("&lccmd") * se produce el error

append blank in (this.cAlias)
if retvalor<>0
repl id with retvalor in (this.calias)
endif

* texto del error

"Código de excepción OLE IDispatch 0 de Microsoft OLE DB Provider for SQL
Server: Debe declarar la variable '@retvalor'.


El procedimiento almacenado en MSDE es el siguiente
La ejecucion del procedimiento a travez del producto emans o visual studio
devuelve el valor correctamente

ALTER PROCEDURE dbo.NuevoId

@NameTable varchar(20),
@RetValor int Output

/*
(
@parameter1 datatype = default value,
@parameter2 datatype OUTPUT
)
*/
AS
/* SET NOCOUNT ON */

SELECT Name FROM SysObjects WHERE Name='KEYS' AND Type='U'

IF @@ROWCOUNT < 1
CREATE TABLE Keys ( TableName Char(20), LastKeyVal Integer )

SELECT LastKeyVal FROM Keys WHERE TableName=@NameTable

IF @@ROWCOUNT < 1
INSERT INTO Keys VALUES (@NameTable, 0 )

UPDATE Keys
SET @RetValor = LastkeyVal = LasTkeyVal + 1 WHERE
TableName=@NameTable

RETURN

Preguntas similare

Leer las respuestas

#1 Hector Kuhn
06/10/2005 - 23:18 | Informe spam
Logre hacer andar la funcion de la siguiente manera, por si a alguien le
sirve generar un autoincremental.

Agrego un objeto command al genera la conexion

loConnDataSource = createobject('ADODB.Connection')
loConnDataSource.ConnectionString = LcCsPublico
loConnDataSource.CommandTimeout = 60
loConnDataSource.ConnectionTimeout = 30
loConnDataSource.Open()

Ocmd = CREATEOBJECT('ADODB.Command')
Ocmd.ActiveConnection = loConnDataSource

FUNCTION AGREGAR

Oca = Ocmd
Oca.commandtext = "NUEVOID" && nombre del procedimiento almacenado
Oca.commandtype = 4
loparam1 = oca.createparameter()
loparam1.name = "Nametable"
loparam1.type = 200 && tipo de variable char
loparam1.direction = 1 && entrada
loparam1.value = this.calias
loparam1.size = 20
Oca.parameters.append(loparam1)

loparam2 = oca.createparameter()
loparam2.name = "Retvalor"
loparam2.type = 3
loparam2.direction = 2 && salida
loparam2.value = 0
loparam2.size = 4
Oca.parameters.append(loparam2)

Oca.execute()

INSERT INTO (this.calias) (id) VALUES (loparam2.value)


"Hector Kuhn" escribió en el mensaje
news:%23$

Estoy intentando obtener un valor de un procedimiento almacenado, que
deberia devolver un numero entero, el problema que se me presenta es el
error que me arroja al ejecutar el comando execute

Las instrucciones en Vfp 8 son las siguientes
la coneccion es ADO y uso cursoradapter

FUNCTION AGREGAR

local lccmd

retvalor = 0

lccmd = "EXEC nuevoid '"+ALLTRIM(UPPER(this.calias))+"', @retvalor OUTPUT"

&& lcmd queda = "EXEC nuevoid 'PRODUCTO', @retvalor OUTPUT"

oCa = thisform.obtenercursor(this.calias)
Oconection = oca.datasource.activeconnection
oconection.execute("&lccmd") * se produce el error

append blank in (this.cAlias)
if retvalor<>0
repl id with retvalor in (this.calias)
endif

* texto del error

"Código de excepción OLE IDispatch 0 de Microsoft OLE DB Provider for SQL
Server: Debe declarar la variable '@retvalor'.


El procedimiento almacenado en MSDE es el siguiente
La ejecucion del procedimiento a travez del producto emans o visual studio
devuelve el valor correctamente

ALTER PROCEDURE dbo.NuevoId

@NameTable varchar(20),
@RetValor int Output

/*
(
@parameter1 datatype = default value,
@parameter2 datatype OUTPUT
)
*/
AS
/* SET NOCOUNT ON */

SELECT Name FROM SysObjects WHERE Name='KEYS' AND Type='U'

IF @@ROWCOUNT < 1
CREATE TABLE Keys ( TableName Char(20), LastKeyVal Integer )

SELECT LastKeyVal FROM Keys WHERE TableName=@NameTable

IF @@ROWCOUNT < 1
INSERT INTO Keys VALUES (@NameTable, 0 )

UPDATE Keys
SET @RetValor = LastkeyVal = LasTkeyVal + 1 WHERE
TableName=@NameTable

RETURN


Respuesta Responder a este mensaje
#2 Pedro Valle
07/10/2005 - 16:57 | Informe spam
Cordiales saludos.

Probablemente lo unico que te faltaba era declarar la variable retvalor,
podrias haber puesto estas lineas antes de ejecutar el execute.

PRIVATE retvalor
retvalor = ""

Suerte.

"Hector Kuhn" escribió en el mensaje
news:%23$

Estoy intentando obtener un valor de un procedimiento almacenado, que
deberia devolver un numero entero, el problema que se me presenta es el
error que me arroja al ejecutar el comando execute

Las instrucciones en Vfp 8 son las siguientes
la coneccion es ADO y uso cursoradapter

FUNCTION AGREGAR

local lccmd

retvalor = 0

lccmd = "EXEC nuevoid '"+ALLTRIM(UPPER(this.calias))+"', @retvalor OUTPUT"

&& lcmd queda = "EXEC nuevoid 'PRODUCTO', @retvalor OUTPUT"

oCa = thisform.obtenercursor(this.calias)
Oconection = oca.datasource.activeconnection
oconection.execute("&lccmd") * se produce el error

append blank in (this.cAlias)
if retvalor<>0
repl id with retvalor in (this.calias)
endif

* texto del error

"Código de excepción OLE IDispatch 0 de Microsoft OLE DB Provider for SQL
Server: Debe declarar la variable '@retvalor'.


El procedimiento almacenado en MSDE es el siguiente
La ejecucion del procedimiento a travez del producto emans o visual studio
devuelve el valor correctamente

ALTER PROCEDURE dbo.NuevoId

@NameTable varchar(20),
@RetValor int Output

/*
(
@parameter1 datatype = default value,
@parameter2 datatype OUTPUT
)
*/
AS
/* SET NOCOUNT ON */

SELECT Name FROM SysObjects WHERE Name='KEYS' AND Type='U'

IF @@ROWCOUNT < 1
CREATE TABLE Keys ( TableName Char(20), LastKeyVal Integer )

SELECT LastKeyVal FROM Keys WHERE TableName=@NameTable

IF @@ROWCOUNT < 1
INSERT INTO Keys VALUES (@NameTable, 0 )

UPDATE Keys
SET @RetValor = LastkeyVal = LasTkeyVal + 1 WHERE
TableName=@NameTable

RETURN


Respuesta Responder a este mensaje
#3 Hector Kuhn
08/10/2005 - 14:52 | Informe spam
Agradezco el dato, pero no funciona, la he declarado de distintas maneras, y
siempre da el mismo error.
Lo solucione con el siguiente metodo


loConnDataSource = createobject('ADODB.Connection')
loConnDataSource.ConnectionString = LcCsPublico
loConnDataSource.CommandTimeout = 60
loConnDataSource.ConnectionTimeout = 30
loConnDataSource.Open()

Ocmd = CREATEOBJECT('ADODB.Command')
Ocmd.ActiveConnection = loConnDataSource

FUNCTION AGREGAR

Oca = Ocmd
Oca.commandtext = "NUEVOID" && nombre del procedimiento almacenado
Oca.commandtype = 4
loparam1 = oca.createparameter()
loparam1.name = "Nametable"
loparam1.type = 200 && tipo de variable char
loparam1.direction = 1 && entrada
loparam1.value = this.calias
loparam1.size = 20
Oca.parameters.append(loparam1)

loparam2 = oca.createparameter()
loparam2.name = "Retvalor"
loparam2.type = 3
loparam2.direction = 2 && salida
loparam2.value = 0
loparam2.size = 4
Oca.parameters.append(loparam2)

Oca.execute()

INSERT INTO (this.calias) (id) VALUES (loparam2.value)


"Pedro Valle" escribió en el mensaje
news:
Cordiales saludos.

Probablemente lo unico que te faltaba era declarar la variable retvalor,
podrias haber puesto estas lineas antes de ejecutar el execute.

PRIVATE retvalor
retvalor = ""

Suerte.

"Hector Kuhn" escribió en el mensaje
news:%23$
>
> Estoy intentando obtener un valor de un procedimiento almacenado, que
> deberia devolver un numero entero, el problema que se me presenta es el
> error que me arroja al ejecutar el comando execute
>
> Las instrucciones en Vfp 8 son las siguientes
> la coneccion es ADO y uso cursoradapter
>
> FUNCTION AGREGAR
>
> local lccmd
>
> retvalor = 0
>
> lccmd = "EXEC nuevoid '"+ALLTRIM(UPPER(this.calias))+"', @retvalor


OUTPUT"
>
> && lcmd queda = "EXEC nuevoid 'PRODUCTO', @retvalor OUTPUT"
>
> oCa = thisform.obtenercursor(this.calias)
> Oconection = oca.datasource.activeconnection
> oconection.execute("&lccmd") * se produce el error
>
> append blank in (this.cAlias)
> if retvalor<>0
> repl id with retvalor in (this.calias)
> endif
>
> * texto del error
>
> "Código de excepción OLE IDispatch 0 de Microsoft OLE DB Provider for


SQL
> Server: Debe declarar la variable '@retvalor'.
>
>
> El procedimiento almacenado en MSDE es el siguiente
> La ejecucion del procedimiento a travez del producto emans o visual


studio
> devuelve el valor correctamente
>
> ALTER PROCEDURE dbo.NuevoId
>
> @NameTable varchar(20),
> @RetValor int Output
>
> /*
> (
> @parameter1 datatype = default value,
> @parameter2 datatype OUTPUT
> )
> */
> AS
> /* SET NOCOUNT ON */
>
> SELECT Name FROM SysObjects WHERE Name='KEYS' AND Type='U'
>
> IF @@ROWCOUNT < 1
> CREATE TABLE Keys ( TableName Char(20), LastKeyVal Integer )
>
> SELECT LastKeyVal FROM Keys WHERE TableName=@NameTable
>
> IF @@ROWCOUNT < 1
> INSERT INTO Keys VALUES (@NameTable, 0 )
>
> UPDATE Keys
> SET @RetValor = LastkeyVal = LasTkeyVal + 1 WHERE
> TableName=@NameTable
>
> RETURN
>
>


Respuesta Responder a este mensaje
#4 Pedro Valle
10/10/2005 - 16:46 | Informe spam
Cordiales saludos.

Lo que puede estar pasando es que el utilizar ADO no es lo mismo que
utilizar Pass-Through, cuando utilizas esto último si se puede realizar lo
que deseas. En cambio utilizando ADO no se puede, es decir el uso de ?, en
el caso de ADO la forma de recuperar el parametro es como lo hiciste, esta
manera es como se realiza en VB.

Suerte.



"Hector Kuhn" escribió en el mensaje
news:%
Agradezco el dato, pero no funciona, la he declarado de distintas maneras,
y
siempre da el mismo error.
Lo solucione con el siguiente metodo


loConnDataSource = createobject('ADODB.Connection')
loConnDataSource.ConnectionString = LcCsPublico
loConnDataSource.CommandTimeout = 60
loConnDataSource.ConnectionTimeout = 30
loConnDataSource.Open()

Ocmd = CREATEOBJECT('ADODB.Command')
Ocmd.ActiveConnection = loConnDataSource

FUNCTION AGREGAR

Oca = Ocmd
Oca.commandtext = "NUEVOID" && nombre del procedimiento almacenado
Oca.commandtype = 4
loparam1 = oca.createparameter()
loparam1.name = "Nametable"
loparam1.type = 200 && tipo de variable char
loparam1.direction = 1 && entrada
loparam1.value = this.calias
loparam1.size = 20
Oca.parameters.append(loparam1)

loparam2 = oca.createparameter()
loparam2.name = "Retvalor"
loparam2.type = 3
loparam2.direction = 2 && salida
loparam2.value = 0
loparam2.size = 4
Oca.parameters.append(loparam2)

Oca.execute()

INSERT INTO (this.calias) (id) VALUES (loparam2.value)


"Pedro Valle" escribió en el mensaje
news:
Cordiales saludos.

Probablemente lo unico que te faltaba era declarar la variable retvalor,
podrias haber puesto estas lineas antes de ejecutar el execute.

PRIVATE retvalor
retvalor = ""

Suerte.

"Hector Kuhn" escribió en el mensaje
news:%23$
>
> Estoy intentando obtener un valor de un procedimiento almacenado, que
> deberia devolver un numero entero, el problema que se me presenta es el
> error que me arroja al ejecutar el comando execute
>
> Las instrucciones en Vfp 8 son las siguientes
> la coneccion es ADO y uso cursoradapter
>
> FUNCTION AGREGAR
>
> local lccmd
>
> retvalor = 0
>
> lccmd = "EXEC nuevoid '"+ALLTRIM(UPPER(this.calias))+"', @retvalor


OUTPUT"
>
> && lcmd queda = "EXEC nuevoid 'PRODUCTO', @retvalor OUTPUT"
>
> oCa = thisform.obtenercursor(this.calias)
> Oconection = oca.datasource.activeconnection
> oconection.execute("&lccmd") * se produce el error
>
> append blank in (this.cAlias)
> if retvalor<>0
> repl id with retvalor in (this.calias)
> endif
>
> * texto del error
>
> "Código de excepción OLE IDispatch 0 de Microsoft OLE DB Provider for


SQL
> Server: Debe declarar la variable '@retvalor'.
>
>
> El procedimiento almacenado en MSDE es el siguiente
> La ejecucion del procedimiento a travez del producto emans o visual


studio
> devuelve el valor correctamente
>
> ALTER PROCEDURE dbo.NuevoId
>
> @NameTable varchar(20),
> @RetValor int Output
>
> /*
> (
> @parameter1 datatype = default value,
> @parameter2 datatype OUTPUT
> )
> */
> AS
> /* SET NOCOUNT ON */
>
> SELECT Name FROM SysObjects WHERE Name='KEYS' AND Type='U'
>
> IF @@ROWCOUNT < 1
> CREATE TABLE Keys ( TableName Char(20), LastKeyVal Integer )
>
> SELECT LastKeyVal FROM Keys WHERE TableName=@NameTable
>
> IF @@ROWCOUNT < 1
> INSERT INTO Keys VALUES (@NameTable, 0 )
>
> UPDATE Keys
> SET @RetValor = LastkeyVal = LasTkeyVal + 1 WHERE
> TableName=@NameTable
>
> RETURN
>
>






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida