Pregunta sobre FW_OpenAdoConnection
Re: Pregunta sobre FW_OpenAdoConnection
Muchas gracias por la respuesta, si bien puedo conectarme a la instancia con el ejemplo que me indicas, al momento de _oCmd_:Execute() este error,
Error description: (DOS Error -2147352567) WINOLE/1007 Procedure or function ProductQuantity has too many arguments specified. (0x80040E14): Microsoft SQL Server Native Client 11.0
en los parametros de ese store procedure veo esta defincion ..
PARAMETERS
@BarCode(nvarchar(max),Input
@UserId(int,Input,No Default)
@Returns integer
el comando que estoy intentando es..
_oCmd_:=TOleAuto():New("ADODB.Command")
_oCmd_:ActiveConnection:=_Cnx_
_oCmd_:CommandType:=4 //** Stored Procedure
_oCmd_:CommandText:="[dbo].[ProductQuantity]"
_oPar_:=_oCmd_:CreateParameter("Barcode",129,1,24,'6666666666666')
_oCmd_:Parameters:Append(_oPar_)
_oPar_:=_oCmd_:CreateParameter("UserId",3,1,2,72)
_oCmd_:Parameters:Append(_oPar_)
_oPar_:=_oCmd_:CreateParameter("Returns",16,2,1)
_oCmd_:Parameters:Append(_oPar_)
_oCmd_:Execute()
_Rsl_:=_oCmd_:Parameters("Returns"):Value
donde Barcode , UserId son los parametros de ese store procedure. Si comento el add del parametro "Returns" parece funcionar pero no obtengo el return del exec, que seria la cantidad de productos.
Hasta ahora lo consigo hacer de esta manera, pero sin poder hacer con ADO,solo desde la linea de comando.
EJEMPLO 1
oSay:SetText("Consultando Stock Productos")
cCadena+="sqlcmd -S " + cServer + " -d PharmaDispenserB2_0 -U " + cUser + " -P " + cPassword + " -o " +cFileTMP+ " -Q "
cCadena+='"DECLARE @return_value int;EXEC @return_value = [dbo].[ProductQuantity] @Barcode = N'
cCadena+="'" + cInfo + "', @UserId = 72 ;SELECT 'Return Value' = @return_value;" + '"'
HB_MemoWrit('.\Consultar.bat', cCadena,.F. )
WaitRun( '.\Consultar.bat' )
EJEMPLO 2 con ADO
oCn:Execute("DECLARE @return_value int;EXEC @return_value = [dbo].[ProductQuantity] @Barcode = N'6666666666666', @UserId = 72;SELECT 'Return Value' = @return_value;")
aqui no se como obtener el resultado de EXEC...
Saludos y desde ya muchas gracias por la ayuda... no soy un experto en DB y me cuesta bastante. Si quieres mi contacto de email es [email protected]
Re: Pregunta sobre FW_OpenAdoConnection
create PROCEDURE [dbo].[ProductQuantity](@Dato Varchar(24), @Result Tinyint Output)
As
Begin
If Exists (Select * From [tabla] Where [clave]=@Dato)
Set @Result=1
Else
Set @Result=0;
End
Re: Pregunta sobre FW_OpenAdoConnection
Hola jacgsoft,
Muchas gracias por la info y las pruebas!!!... creo estoy mas cerca de conseguir el resultado buscado, por lo que analice el problema esta con el return code.. porque si hago cualquier SELECT sobre la base hasta me devuelve el recordset correctamente.
Funciona correctamente,
oRs := FW_OpenRecordSet(Cnx,"SELECT PurchaseQuantity FROM Products WHERE ProductId = 5962")
xbrowse(oRs)
SI Utilizo la siguiente forma, no funciona porque return no es un parametro, sino que es lo que devuelve el stored procedure...
oCmd:=TOleAuto():New("ADODB.Command")
oCmd:ActiveConnection:=Cnx
oCmd:CommandType:=4 //** Stored Procedure
oCmd:CommandText:="[dbo].[ProductQuantity]"
oPar:=oCmd:CreateParameter("@Barcode",129,1,24, "N'6666666666666'")
oCmd:Parameters:Append(oPar)
oPar:=oCmd:CreateParameter("@UserId",3,1,2,72)
oCmd:Parameters:Append(oPar)
oPar:=oCmd:CreateParameter("RETURNS",3,2)
oCmd:Parameters:Append(oPar)
oRs:=oCmd:Execute()
La poca defincion que tengo del stored procedure hasta ahora es..
PARAMETERS
(@BarCode(nvarchar(max),Input
@UserId(int,Input,No Default))
@Returns integer
No pude resolver el problema de recibir el return code que devuelve el execute... si no es un recordset no recibo la respuesta de la ejecucion de un stored procedure,
Saludos cordiales , me di por vencido por lo que voy a seguir haciendo pruebas con otra forma de conexion, utilizando TCP/IP.
Re: Pregunta sobre FW_OpenAdoConnection
Si me pasa el código de tu procedimiento almacenado y me dices que quieres que retorne, te puedo ayudar.
Re: Pregunta sobre FW_OpenAdoConnection
HOla Jacgsoft !! Tu ejemplo funciona a la perfeccion con resultados de tipo recordset y me ha servido para entender y aprender bastante por lo que te agradezco mucho toda la informacion compartida.
Por desgracia el stored procedure es de un tercero y no puedo saber la definicion ni realizarle modificaciones... de todas formas estoy en cotacto con sus desarrolladores para ver si puedo solicitar que le agregue un parametro de tipo OUTPUT para poder de ahi leer el rerturn code...
Haciendo el oCmd:Execute() no se como recibir el valor del EXEC... si en cambio lo que retorna es un recordset no hay problema.. lo puedo leer de forma transparente. por ejemplo:
FUNCIONA
oRs := FW_OpenRecordSet(Cnx,"SELECT PurchaseQuantity FROM Products WHERE ProductId = 5962")
xbrowse(oRs)
NO FUNCIONA
oCmd:CommandText:="[dbo].[ProductQuantity]"
oPar:=oCmd:CreateParameter("@Barcode",129,1,24, "N'5400000000007'")
oCmd:Parameters:Append(oPar)
oPar:=oCmd:CreateParameter("@UserId",3,1,2,72)
oCmd:Parameters:Append(oPar)
oRs:=oCmd:Execute() - no funcona devuelve un integer pero no como parametro de OUT.
PARAMETERS DEL STORED PROCEDURE:
@BarCode(nvarchar(max),Input
@UserId(int,Input,No Default)
este es el return del stored , no es un parametro que envie..
@Returns integer
De todas formas muchas gracias por el apoyo y sigo siempre a su disposicion.
Saludos Mariano
Re: Pregunta sobre FW_OpenAdoConnection
Estimados buenas tardes, aqui para darle solucion a este post implemente todo utilizando sockets y funciona correctamente. En el post WWKS2 TCP/IP consulta deje el ejemplo completo.
Muchas gracias por la ayuda siempre, saludos Mariano.