You can also do the same w/o the ODBC sytax:
>*- Calling a SP and receiving an output parm from SP
>lnKey = 0
>= SQLEXEC(lnConHandle, '{call spSome_SP(?@lnKey)}')
SQLEXEC(hCn, 'EXECUTE sproc @parametername=?@variable')
>*- Calling a SP and passing in a parm
>lnSuccess = SQLEXEC(lnConHandle, '{CALL spSome_SP(parm_list)}')
SQLEXEC(hCn, [EXECUTE sproc @p1='literal string', @p2=9999)
SQLEXEC(hCn, [EXECUTE sproc @parametername=?@variable])
>*- Calling a SP and passing in a parm and receiving an output parm from SP
>lcRetval = SPACE(23)
>lnSuccess = SQLEXEC(lnConHandle, '{CALL spSome_SP(parm_list, ?@lcRetval)}')
>
>*- Calling a SP and receiving a VFP cursor
>= SQLEXEC(lnConHandle, '{CALL spSome_SP(parm_list)}', 'VFPcursor')
>
>If lnSuccess is negative, you can figure out error with AERROR() for ODBC.
>
>Look in VFP developers guide. There are good examples.
>
>Charlie