Page 1 of 1

Función "ReturnCall" de Dolphin

PostPosted: Tue Jun 13, 2023 9:24 pm
by TOTOVIOTTI
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

Re: Función "ReturnCall" de Dolphin

PostPosted: Wed Jun 14, 2023 6:21 pm
by carlos vargas
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.

Re: Función "ReturnCall" de Dolphin

PostPosted: Wed Jun 14, 2023 6:33 pm
by carlos vargas
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. :-)

Re: Función "ReturnCall" de Dolphin

PostPosted: Wed Jun 14, 2023 8:14 pm
by TOTOVIOTTI
Genial Carlos!!!!!

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

Muchas gracias!!!

Re: Función "ReturnCall" de Dolphin

PostPosted: Wed Jun 14, 2023 10:03 pm
by jacgsoft
Deberías poner aqui tu Procedimiento Almacenado, para entenderlo.

Re: Función "ReturnCall" de Dolphin

PostPosted: Wed Jun 14, 2023 10:34 pm
by carlos vargas
Así creería yo, tipo varchar, pero mejor muéstranos el procedure para revisar.

Re: Función "ReturnCall" de Dolphin

PostPosted: Thu Jun 15, 2023 12:32 am
by carlos vargas
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

Re: Función "ReturnCall" de Dolphin

PostPosted: Thu Jun 15, 2023 11:03 am
by TOTOVIOTTI
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!

Re: Función "ReturnCall" de Dolphin

PostPosted: Thu Jun 15, 2023 8:40 pm
by jacgsoft
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)

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

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

PostPosted: Wed Jun 21, 2023 11:53 am
by TOTOVIOTTI
Muchas gracias "jacgsoft"...

Solucionado!!