Comunidad Gambas-es
Soporte para pasar Arrays en Connection.Subst() con filtros dinámicos - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Bases de Datos (https://gambas-es.org/forum-6.html)
+--- Tema: Soporte para pasar Arrays en Connection.Subst() con filtros dinámicos (/thread-2004.html)



Soporte para pasar Arrays en Connection.Subst() con filtros dinámicos - omoreno - 19-01-2026

Hola,
En Gambas3 la función Connection.Subst()  puede aceptar parámetros sueltos mediante (...) 
Esto funciona bien cuando la cantidad de parámetros es fija, pero se vuelve muy engorroso cuando se construyen consultas con WHERE dinámicos.
En mi caso, los filtros se asignan en tiempo de ejecución a un vector, por ejemplo:

Código:
FiltroX.Add(codigo)
FiltroX.Add(fecha1)
FiltroX.Add(fecha2)

ResultX = Conn.Exec(DB.Subst(SqlX, FiltroX))  '<--- actualmente no se puede

Si enviamos el vector simplificaría mucho el código y evitaría tener que usar Select Case para cada cantidad de parámetros que hay que enviar al Exec u otros comandos SQL, como en el ejemplo actual:

Código:
  Select Case FiltrosX.Length
    Case 0
      resulado = Conn.Exec(DB.Subst(SqlX))
    Case 1
      resulado = Conn.Exec(DB.Subst(SqlX, FiltroX[0]))
    Case 2
      resulado = Conn.Exec(DB.Subst(SqlX, FiltroX[0],FiltroX[1]))
    Case 3
      resulado = Conn.Exec(DB.Subst(SqlX, FiltroX[0],FiltroX[1],FiltroX[2]))
  End Select

Lo ideal es poder enviar directamente un array a DB.Subst.

He adjuntado un programa para que tengan una mejor idea de lo que busco.

He publicado una solicitud en el BugTracker aver si lo adaptan.

Gracias por sus posibles sugerencias.


RE: Soporte para pasar Arrays en Connection.Subst() con filtros dinámicos - Shordi - 19-01-2026

No lo entiendo muy bien... ¿De qué sirve enviar los valores en un array si no envias los campos en otro? ¿y las condiciones and, or, etc.? Tendrías que construir "artesanalmente" la consulta SQL incluyendo los parámetros sustituibles de todas formas y con ello, el trabajo que ahorras es prácticamente despreciable... a no ser que no lo haya entendido bien.
Si la clave está en lo de "dinámico" tal vez el proyecto adjunto en la descripción de este video te pueda ayudar. 



Ahí encontrarás un formulario para crear filtros que te puede ayudar. Creo que tú estás trabajando con webforms y demás, por lo que no creo que te valga un copia-pega, pero la idea tal vez te sirva.

Saludos


RE: Soporte para pasar Arrays en Connection.Subst() con filtros dinámicos - omoreno - 19-01-2026

Hola Shordi.

Ya respondieron con la adecuación en  la versión 3.21.99 b84c282.

Recuerda que los comando de SQL en gb.db2 tiene un formato, ejemplo el Exec:

Function Exec (Request As String, ...) As Result

Los tres puntos indican que la cantidad de parámetros es variable (Where dinámico), pero antes de la actualización 3.21.99 b84c282 solo se podían pasar los valores uno por uno separados por coma, ejemplo:

Si tienes esta consulta:
Código:
SqlQuery = "SELECT Codigo, Nombre, Guia, substr(Fecha, 1, 10) AS Fecha FROM TablaX " & Filtro 

Filtro es una cadena que tiene un Where que puede tener diferentes tipos de campos a comparar.
Y si tienes algún objeto que le permite al usuario decidir el filtro que desea aplicar a su consulta te puedes crear un vector para agregar los posibles valores:

Código:
  Dim Filtro As String
  Dim FiltrosX As New String[]
  Dim SqlQuery As String = ""
  Select Case CmbFiltro.Index
    Case 1
      Filtro = " WHERE Fecha BETWEEN &1 AND &2 AND Nombre LIKE &3 "
      FiltrosX.Add(Format(DateB1.Value, "yyyy-mm-dd"))
      FiltrosX.Add(Format(DateB2.Value, "yyyy-mm-dd"))
      FiltrosX.Add("%" & TxtDato.Text & "%")
    Case 2
      Filtro = " WHERE Codigo = &1 "
      FiltrosX.Add(TxtDato.Text)
    Case 3
      Filtro = " WHERE Guia = &1 "
      FiltrosX.Add(TxtDato.Text)
  End Select
SqlQuery = "SELECT Codigo, Nombre, Guia, substr(Fecha, 1, 10) AS Fecha FROM TablaX " & Filtro
Dim VarX As Variant
VarX = ModSQL.ExecX(SqlQuery, FiltrosX) <------ aquí el cambio, antes no se podía enviar un vector

Saludos.


RE: Soporte para pasar Arrays en Connection.Subst() con filtros dinámicos - Shordi - 19-01-2026

Dice Benoît que te ha hecho caso. Mola. Todo lo que sea engrandecer el lenguaje es para bien. Buen aporte amigo.