Page 1 of 1
Función "ReturnCall" de Dolphin
Posted: 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
Posted: Wed Jun 14, 2023 6:21 pm
by carlos vargas
Code: Select all | Expand
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
Posted: Wed Jun 14, 2023 6:33 pm
by carlos vargas
a como comentas, bastaría con hacerlo de esta forma
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
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
Posted: 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
Posted: Wed Jun 14, 2023 10:03 pm
by jacgsoft
Deberías poner aqui tu Procedimiento Almacenado, para entenderlo.
Re: Función "ReturnCall" de Dolphin
Posted: 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
Posted: 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
Posted: 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
Posted: 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)
Posted: Wed Jun 21, 2023 11:53 am
by TOTOVIOTTI
Muchas gracias "jacgsoft"...
Solucionado!!