invocar funciones sql con ado

Post Reply
artu01
Posts: 400
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 | Expand


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


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


   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: 106
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: 346
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 | Expand

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


ojala funcione.

Saludos
SkyPe: armando.lagunas@hotmail.com
Mail: armando.lagunas@gmail.com
artu01
Posts: 400
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 | Expand

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: 400
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 | Expand


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