Función "ReturnCall" de Dolphin

Función "ReturnCall" de Dolphin

Postby TOTOVIOTTI » Tue Jun 13, 2023 9:24 pm

Hola,
estoy utilizando la función ReturnCall para un STORE PROCEDURE que tengo en mi BD Mysql.

En este STORE PROCEDURE, tengo un WHERE con un IN, o sea, por ejemplo tengo:

SELECT codigo,nombre FROM clientes WHERE codigo IN (cod1,cod2,cod3...)

Cuando llamo a mi función:
oServer:ReturnCall("busca_clientes",parametrowhere)

este "parametrowhere", como lo debo mandar? Hice varias pruebas con diferentes formatos y no
tengo una respuesta válida para mi select.
El ejemplo es burdo pero es para que se entienda bien.

Quien pueda ayudarme, se lo agradeceré! Hace todo el día que estoy parado con esto y no lo
puedo hacer funcionar...

Muchas muchas gracias!
Roberto
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Función "ReturnCall" de Dolphin

Postby carlos vargas » Wed Jun 14, 2023 6:21 pm

Code: Select all  Expand view
METHOD ReturnCall( ... ) CLASS TDolphinSrv
   LOCAL n
   LOCAL oQry
   LOCAL aParams  := HB_AParams()
   LOCAL cExecute := "CALL "

#ifndef NOINTERNAL
   IF Len( aParams ) < 1 .or. ValType( aParams[ 1 ] ) <> "C"
      ::nInternalError := ERR_INVALID_PARAMETER_CALL
      ::CheckError()
   ENDIF

   IF ::lError
       RETURN ::lError
   ENDIF
#endif

   cExecute += aParams[ 1 ] + "( "

   FOR n := 2 TO Len( aParams )
      cExecute += ClipValue2Sql( aParams[ n ] ) + ","
   NEXT

   cExecute := Left( cExecute, Len( cExecute ) - 1 ) + ")"
   oQry     := ::Query( cExecute )

   ::NextResult()

RETURN oQry

ReturnCall (cProcName,aParameters)
oServer:ReturnCall("busca_clientes",{ cCodClie })


En tu caso es una lista, muestranos un ejemplo y el storeproceure para ver como acomodamos ese parametro por favor.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Función "ReturnCall" de Dolphin

Postby carlos vargas » Wed Jun 14, 2023 6:33 pm

a como comentas, bastaría con hacerlo de esta forma
Code: Select all  Expand view

oServer:ReturnCall("busca_clientes","cod1,cod2,cod" )
 

asumiendo que
SELECT codigo,nombre FROM clientes WHERE codigo IN (cod1,cod2,cod3...)

lo que cambia aca es la lista der busqueda, si tu lo tienes de forma de array, deberas cambiarlo por:
Code: Select all  Expand view

oServer:ReturnCall("busca_clientes", ArrayToList( { "010", "020", "030" } ) )
...
function ArrayToList( aItems )
 local cList := ""
 local nLen := len( aItems )
 if hb_isArray( aItems)
  for x:=1 to nLen
   cList += aItems[x] + iif( x < nLen, ",", "" )
  next
 endif
return cList
 

algo asi. :-)
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Función "ReturnCall" de Dolphin

Postby TOTOVIOTTI » Wed Jun 14, 2023 8:14 pm

Genial Carlos!!!!!

Cómo debería definir mi campo IN en la Procedure? Como Varchar() ??

Muchas gracias!!!
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Función "ReturnCall" de Dolphin

Postby jacgsoft » Wed Jun 14, 2023 10:03 pm

Deberías poner aqui tu Procedimiento Almacenado, para entenderlo.
User avatar
jacgsoft
 
Posts: 104
Joined: Fri Nov 24, 2006 9:03 pm
Location: Lima - Peru

Re: Función "ReturnCall" de Dolphin

Postby carlos vargas » Wed Jun 14, 2023 10:34 pm

Así creería yo, tipo varchar, pero mejor muéstranos el procedure para revisar.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Función "ReturnCall" de Dolphin

Postby carlos vargas » Thu Jun 15, 2023 12:32 am

debes tener en cuenta esto:
? ArrayToList( { "010", "020", "030" }

no regresara -> "010, 020, 030" lo cual no pudiera servirte, si los item de la lista son caracter, debes trabajar un poco con la funcion ArrayToList
para que te retorne -> "'010','020','030'" que es lo mas segures que necesites. por ejemplo, sería adecuado agregar un parámetro lQuote que cuando sea verdadero te agregue las comillas por cada ítem
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Función "ReturnCall" de Dolphin

Postby TOTOVIOTTI » Thu Jun 15, 2023 11:03 am

Carlos, esta es mi Procedure:

SELECT c.cantidad,c.no_sirve,c.identificacion AS identifi,c.id_comprobante,c.fecha_movimiento,c.id,c.id_articulo,c1.tipo AS t1,0 AS t2,c3.tipo AS t3,0 AS t4,c.comprobante,c.id_unidad_medida FROM comprobantes_cuerpo AS c
LEFT JOIN comprobantes_compras AS c1 ON c.identificacion='C' and c1.id=c.id_comprobante
LEFT JOIN comprobantes_ventas AS c3 ON c.identificacion='V' and c3.id=c.id_comprobante
WHERE c.id_empresa=BDempresa and FIND_IN_SET(c.id_articulo,BDArticulo)
ORDER BY c.fecha_movimiento,c.id

Donde, mis variables son:

IN `BDempresa` int,IN `BDarticulo` varchar(200)

Ahora estoy usando el FIND_IN_SET() que funciona, pero me gustaría volver al "WHERE IN"

Gracias!
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Función "ReturnCall" de Dolphin

Postby jacgsoft » Thu Jun 15, 2023 8:40 pm

Con el WHERE IN, no es posible, debido a que la lista de codigos es variable. En SQL SERVER si he podido hacerlo, con sentencia SQL dinámicas.

Otra opción sería NO usar Store Procedure, sino, una sentencia select.



** Códigos Alfanuméricos
cCadena:="'001','002','003','004'"

Text In _Sql_

SELECT c.cantidad,c.no_sirve,c.identificacion AS identifi,c.id_comprobante,c.fecha_movimiento,c.id,c.id_articulo,c1.tipo AS t1,0 AS t2,c3.tipo AS t3,0 AS t4,c.comprobante,c.id_unidad_medida
FROM comprobantes_cuerpo AS c
LEFT JOIN comprobantes_compras AS c1 ON c.identificacion='C' and c1.id=c.id_comprobante
LEFT JOIN comprobantes_ventas AS c3 ON c.identificacion='V' and c3.id=c.id_comprobante
WHERE c.id_empresa=BDempresa and c.codigo in (cCadena)
ORDER BY c.fecha_movimiento,c.id

EndText

_Sql_:=StrTran(_Sql_,'cCadena',cCadena)

*************************************

** Códigos numéricos
nCadena:="001,002,003,004"

Text In _Sql_

SELECT c.cantidad,c.no_sirve,c.identificacion AS identifi,c.id_comprobante,c.fecha_movimiento,c.id,c.id_articulo,c1.tipo AS t1,0 AS t2,c3.tipo AS t3,0 AS t4,c.comprobante,c.id_unidad_medida
FROM comprobantes_cuerpo AS c
LEFT JOIN comprobantes_compras AS c1 ON c.identificacion='C' and c1.id=c.id_comprobante
LEFT JOIN comprobantes_ventas AS c3 ON c.identificacion='V' and c3.id=c.id_comprobante
WHERE c.id_empresa=BDempresa and c.codigo in (nCadena)
ORDER BY c.fecha_movimiento,c.id

EndText

_Sql_:=StrTran(_Sql_,'nCadena',nCadena)

***************************
User avatar
jacgsoft
 
Posts: 104
Joined: Fri Nov 24, 2006 9:03 pm
Location: Lima - Peru

Re: Función "ReturnCall" de Dolphin (solucionado)

Postby TOTOVIOTTI » Wed Jun 21, 2023 11:53 am

Muchas gracias "jacgsoft"...

Solucionado!!
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 56 guests