invocar funciones sql con ado

Post Reply
artu01
Posts: 306
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

invocar funciones sql con ado

Post 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

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

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

   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' )
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
User avatar
jacgsoft
Posts: 96
Joined: Fri Nov 24, 2006 9:03 pm
Location: Lima - Peru

Re: invocar funciones sql con ado

Post 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)
User avatar
armando.lagunas
Posts: 340
Joined: Mon Oct 05, 2009 3:35 pm
Location: Curico-Chile
Contact:

Re: invocar funciones sql con ado

Post 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

oCon1:Execute( "Execute dbo.CalcSaldo 'T25CD', '01', '00' " )
ojala funcione.

Saludos
artu01
Posts: 306
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: invocar funciones sql con ado

Post by artu01 »

Gracias jacgsoft y armando por responder

[quote=

prueba de esta forma:

Code: Select all

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
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
Posts: 306
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: invocar funciones sql con ado

Post by artu01 »

Gracias por su apoyo
De esta forma trabaja

Code: Select all

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
 
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
Post Reply