FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Pregunta sobre FW_OpenAdoConnection
Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: Pregunta sobre FW_OpenAdoConnection
Posted: Wed Nov 05, 2025 08:43 PM
Hola Jacgsoft mucho gusto!
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 mterraz@gmail.com
Posts: 114
Joined: Fri Nov 24, 2006 09:03 PM
Re: Pregunta sobre FW_OpenAdoConnection
Posted: Thu Nov 06, 2025 06:36 PM

Este es un ejemplo de Procedimiento Almacenado que retorna un valor numérico:

create PROCEDURE [dbo].ProductQuantity

As

Begin

If Exists (Select * From [tabla] Where [clave]=@Dato)

   Set @Result=1

Else

   Set @Result=0;

End

Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: Pregunta sobre FW_OpenAdoConnection
Posted: Fri Nov 07, 2025 08:34 PM

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.

Posts: 114
Joined: Fri Nov 24, 2006 09:03 PM
Re: Pregunta sobre FW_OpenAdoConnection
Posted: Tue Nov 11, 2025 12:32 AM

Si me pasa el código de tu procedimiento almacenado y me dices que quieres que retorne, te puedo ayudar.

Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: Pregunta sobre FW_OpenAdoConnection
Posted: Tue Nov 11, 2025 11:18 AM

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

Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: Pregunta sobre FW_OpenAdoConnection
Posted: Wed Feb 18, 2026 02:33 PM

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.

Continue the discussion