Función "ReturnCall" de Dolphin
- TOTOVIOTTI
- Posts: 422
- Joined: Fri Feb 05, 2010 11:30 am
- Location: San Francisco - Córdoba - Argentina
Función "ReturnCall" de Dolphin
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
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
- carlos vargas
- Posts: 1721
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: Función "ReturnCall" de Dolphin
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
En tu caso es una lista, muestranos un ejemplo y el storeproceure para ver como acomodamos ese parametro por favor.ReturnCall (cProcName,aParameters)
oServer:ReturnCall("busca_clientes",{ cCodClie })
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- carlos vargas
- Posts: 1721
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: Función "ReturnCall" de Dolphin
a como comentas, bastaría con hacerlo de esta forma
asumiendo que
algo asi.
Code: Select all | Expand
oServer:ReturnCall("busca_clientes","cod1,cod2,cod" )
lo que cambia aca es la lista der busqueda, si tu lo tienes de forma de array, deberas cambiarlo por:SELECT codigo,nombre FROM clientes WHERE codigo IN (cod1,cod2,cod3...)
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
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- TOTOVIOTTI
- Posts: 422
- Joined: Fri Feb 05, 2010 11:30 am
- Location: San Francisco - Córdoba - Argentina
Re: Función "ReturnCall" de Dolphin
Genial Carlos!!!!!
Cómo debería definir mi campo IN en la Procedure? Como Varchar() ??
Muchas gracias!!!
Cómo debería definir mi campo IN en la Procedure? Como Varchar() ??
Muchas gracias!!!
Re: Función "ReturnCall" de Dolphin
Deberías poner aqui tu Procedimiento Almacenado, para entenderlo.
- carlos vargas
- Posts: 1721
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: Función "ReturnCall" de Dolphin
Así creería yo, tipo varchar, pero mejor muéstranos el procedure para revisar.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- carlos vargas
- Posts: 1721
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: Función "ReturnCall" de Dolphin
debes tener en cuenta esto:
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
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? ArrayToList( { "010", "020", "030" }
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)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- TOTOVIOTTI
- Posts: 422
- Joined: Fri Feb 05, 2010 11:30 am
- Location: San Francisco - Córdoba - Argentina
Re: Función "ReturnCall" de Dolphin
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!
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
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)
***************************
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)
***************************
- TOTOVIOTTI
- Posts: 422
- Joined: Fri Feb 05, 2010 11:30 am
- Location: San Francisco - Córdoba - Argentina
Re: Función "ReturnCall" de Dolphin (solucionado)
Muchas gracias "jacgsoft"...
Solucionado!!
Solucionado!!