FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour invocar funciones sql con ado
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
invocar funciones sql con ado
Posted: Wed Jul 31, 2019 12:35 AM
Gente:
Estoy tratando de llamar a una funcion sql con ADO pero no consigo hacerlo y también como capturo el resultado

sql:
Code (fw): Select all Collapse
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 (fw): Select all Collapse
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 (fw): Select all Collapse
   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
Posts: 114
Joined: Fri Nov 24, 2006 09:03 PM
Re: invocar funciones sql con ado
Posted: Wed Jul 31, 2019 09:35 PM

En el SQl

create PROCEDURE [dbo].CalcSaldo
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)

Posts: 346
Joined: Mon Oct 05, 2009 03:35 PM
Re: invocar funciones sql con ado
Posted: Wed Jul 31, 2019 11:04 PM
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 (fw): Select all Collapse
oCon1:Execute( "Execute dbo.CalcSaldo 'T25CD', '01', '00' " )


ojala funcione.

Saludos
SkyPe: armando.lagunas@hotmail.com

Mail: armando.lagunas@gmail.com
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: invocar funciones sql con ado
Posted: Thu Aug 01, 2019 12:03 AM
Gracias jacgsoft y armando por responder

[quote=

prueba de esta forma:

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


ojala funcione.

Saludos

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
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: invocar funciones sql con ado
Posted: Fri Aug 02, 2019 12:25 AM
Gracias por su apoyo
De esta forma trabaja
Code (fw): Select all Collapse
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

Continue the discussion