Page 1 of 1

invocar funciones sql con ado

PostPosted: Wed Jul 31, 2019 12:35 am
by artu01
Gente:
Estoy tratando de llamar a una funcion sql con ADO pero no consigo hacerlo y también como capturo el resultado

sql:
Code: Select all  Expand view

CREATE FUNCTION [dbo].[CalcSaldo]
(
  @Codigo varchar(8), @nMes int, @codusu char(2)
)
RETURNS int
AS
BEGIN
  -- Declare the return variable here
  DECLARE @nResul int

  -- Halla el stock actual
  Set @nResul = (dbo.CalcIngAno(@Codigo, @nMes,@codusu) - dbo.CalcSalAno(@Codigo, @nMes, @codusu)) + (dbo.CalcIngMes(@Codigo, @nMes, @codusu) - dbo.calcSalMes(@Codigo, @nMes, @codusu))
  RETURN @nResul

END
GO

codigo fwh:

Code: Select all  Expand view

oCon1:=AbreConexBD()

oCon1:Execute( "CALL CalcSaldo('T25CD', '01', '00' )" )


Function AbreConexBD()
  LOCAL cCString, oError //, oRS, lRS := .f.

  cCString := "Provider=SQLOLEDB;"
  cCString += "Server=PYSASERVER;"
  cCString += "Database=PysaBD;Uid=sa;Pwd=Pysa123456;"
  TRY
    oCon1 := CreateObject( "ADODB.Connection" )
    oCon1:Open( cCString )
  CATCH oError
     MsgStop( oError:Description )
     //RETURN
  END
Return Nil
 


error que sale:
Code: Select all  Expand view

   Error description: (DOS Error -2147352567) WINOLE/1007  Sintaxis incorrecta cerca de 'T25CD'. (0x80040E14): Microsoft OLE DB Provider for SQL Server
   Args:
     [   1] = C   CALL CalcSaldo('T25CD', '01', '00' )

Re: invocar funciones sql con ado

PostPosted: Wed Jul 31, 2019 9:35 pm
by jacgsoft
En el SQl

create PROCEDURE [dbo].[CalcSaldo](@Codigo varchar(8), @nMes int, @codusu char(2), @nResul Int Output )
As
Begin
Set Nocount On;

Set @nResul = (dbo.CalcIngAno(@Codigo, @nMes,@codusu) - dbo.CalcSalAno(@Codigo, @nMes, @codusu)) +
(dbo.CalcIngMes(@Codigo, @nMes, @codusu) - dbo.calcSalMes(@Codigo, @nMes, @codusu))


End

********************
En tu programa

Obtener_saldo(_Cod_,_Mes_,_Usu_,@Saldo)

MsgInfo('Saldo '+Str(Saldo,6),'Aviso')



Static Function Obtener_saldo(_Cod_,_Mes_,_Usu_,Saldo)
Local _oCmd_,_oPar_,_Cnx_

Connect_sql(@_Cnx_,G_sql_u,G_sql_c)

_oCmd_:=TOleAuto():New("ADODB.Command")
_oCmd_:ActiveConnection:=_Cnx_
_oCmd_:CommandType:=4
_oCmd_:CommandText:="CalcSaldo"
_oCmd_:CommandTimeout:=0

_oPar_:=_oCmd_:CreateParameter("Codigo",129,1,8,_Cod_)
_oCmd_:Parameters:Append(_oPar_)
_oPar_:=_oCmd_:CreateParameter("nMes",16,1,2,_Mes_)
_oCmd_:Parameters:Append(_oPar_)
_oPar_:=_oCmd_:CreateParameter("Codusu",129,1,2,_Usu_)
_oCmd_:Parameters:Append(_oPar_)
_oPar_:=_oCmd_:CreateParameter("nResul",3,2,6)
_oCmd_:Parameters:Append(_oPar_)

_oCmd_:Execute()
Saldo:=_oCmd_:Parameters("nResul"):Value

_Cnx_:Close()

Return(Nil)

Re: invocar funciones sql con ado

PostPosted: Wed Jul 31, 2019 11:04 pm
by armando.lagunas
yo utilizo procedimientos almacenados, mi experiencia es la siguiente:

el comando CALL se utiliza en MySql para llamar los procedimientos y los parámetros se pasan entre perentesis, yo al cambiarme a MS-Sql tuve que cambiar el comando CALL por EXECUTE y sacar los parentesis.

prueba de esta forma:

Code: Select all  Expand view
oCon1:Execute( "Execute dbo.CalcSaldo 'T25CD', '01', '00' " )


ojala funcione.

Saludos

Re: invocar funciones sql con ado

PostPosted: Thu Aug 01, 2019 12:03 am
by artu01
Gracias jacgsoft y armando por responder

[quote=

prueba de esta forma:

Code: Select all  Expand view
oCon1:Execute( "Execute dbo.CalcSaldo 'T25CD', '01', '00' " )


ojala funcione.

Saludos[/quote]

Armando si funciona pero como capturo lo que me devuelve el procedure?, quiero intentar de esa forma que es mas corta sino optare por la sugerencia de jacgsoft

Gracias

Re: invocar funciones sql con ado

PostPosted: Fri Aug 02, 2019 12:25 am
by artu01
Gracias por su apoyo
De esta forma trabaja
Code: Select all  Expand view

cSql1:="SELECT dbo.CalcSaldo('T25CD' ,1, '00')"
    TRY
      oRsr := TOleAuto():New( "ADODB.RecordSet" )
      WITH OBJECT oRsr
        :ActiveConnection := oCon1
        :Source             := cSql1
        :CursorLocation     := adUseClient
        :CursorType         := adOpenStatic
        :LockType           := adLockOptimistic
        :Open()
      END
    CATCH oError
      MsgStop( oError:Description )
    END
    nResult :=oRsr:Fields(0):Value