Ayuda en la creación de tablas con el programa Visual Fox Pro

Buen día
Le saludo de nuevo además de consultarle otra duda que tengo. Elaboré una pantalla a la que llamé "Consulta Customizada", en ella quiero realizar la consulta a la tabla "paquetes", pero los criterios para traer la consulta provienen de varios combobox, de manera que la consulta se pueda realizar únicamente por el valor de un combobox o en caso de ser neseario pueda tomar valores de más de un combobox.
Lo que hice primero fue realizar la consulta pero únicamente por un sólo criterio, es decir sólo permito la selección un combobox, por ejemplo: por Estatus, por NumeroPaquete o por un rango de fechas. Mi duda es ¿cómo realizar una consulta pero tomando uno o más criterios?, por ejemplo: seleccionar a la vez los tres criterios que mencioné.
Este es el código que tengo para la consulta por estatus:
select paquetes.* from paquetes;
where paquetes.estatus like thisform.comboEstatus.value;
into cursor Busqueda_Estatus
thisform.gridConsultaCustomizada.recordsource="Busqueda_Estatus"
thisform.gridConsultaCustomizada.refresh

1 Respuesta

Respuesta
1
En varias oportunidades se me presentó la misma necesidad que a ti.
Necesitas armar una consulta "Select SQL" pero no conoces con certeza los paámetros para la misma, ya que dependen de la interacción del usuario.
¿Es seo verdad?
Bueno, si es ese el caso, te cuento que lo resolví de la siguiente forma:
Almacenas los campos de las tablas para la consulta en una variable:
LC_CAMPOS="PRODUCTOS.CONCEPTO, CODIGO, PRODUCTOS.DETALLE, MARCA, PRODUCTOS.FAMILIA, PRODUCTOS.SUBFAM, PRODUCTOS.IVA, SUBFAM.DETALLE AS FAMSUB, (ALLTRIM(PRODUCTOS.FAMILIA) + ' ' + ALLTRIM(SUBFAM.DETALLE)) AS FLIA, PRODUCTOS.PACK"
Creas otra variable con las condiciones de combinación entre tablas
LC_COMBINA="LEFT OUTER JOIN SUBFAM ON ALLTRIM(SUBFAM.SUBFAM)==ALLTRIM(PRODUCTOS.SUBFAM) "
Creas otra variable con las condiciones de la clausula where del mismo modo que en los casos anteriores y finalmente haces la consulta definitiva:
SELECT &Lc_campos DISTINCT FROM PRODUCTOS ;
&Lc_COMBINA ;
WHERE &Lc_WHERE ;
INTO CURSOR LISTA  NOWAIT
Hola de nuevo...
Te comento que ya hice una prueba con el código que me facilitaste, y si puedo ver la consulta, pero no toma el criterio de búsqueda. En este ejemplo me trae lo de estatus alta y baja.
LC_CAMPOS="paquetes.numlocal,paquetes.estatus,paquetes.movimiento,paquetes.clase,paquetes.grosor"
LC_WHERE="thisform.comboEstatus.value"
SELECT &Lc_campos DISTINCT FROM paquetes ;
WHERE &Lc_WHERE ;
INTO CURSOR LISTA  NOWAIT
alguna idea?
El error está aquí entá en la variable lC_where
Al valor de tu combobox debes almacenarlo en una variable.
Luego sería así:
Lc_variable=thisform.combostatus.value
Lc_where=iif(!empty(Lc_variable), tabla.campo=Lc_variable, !deleted())
De esta forma, utilizando el IIF inmediato, es posible que tu variable tome una condición de filtrado (tabla.campo=Lc_variable), y en caso de que el valor del combobox esté en blanco, tomas una condicion de filtrado que sabes que te va a devolver todos los registros, como por ejemplo !deleted(), es decir todos los registros no eliminados.
Suerte
Hola...
Probé realizando las correcciones del where como me indicas y funciona correctamente la consulta, tal como se requiere, incluso agregando otro criterio de búsqueda, por ejemplo: si hago una consulta por estatus me arroja los datos filtrados por el estatus que requiero y si incluyo el número de paquete como segundo criterio, me trae exactamente el registro que corresponde al paquete y con el estatus correcto. Este es el código y funciona correctamente:
Lc_varNpaq="thisform.txtNumPaquete.value"
Lc_varEst="thisform.comboEstatus.value"
LC_CAMPOS="paquetes.numlocal,paquetes.estatus,paquetes.movimiento,paquetes.clase,paquetes.grosor"
LC_WHERE="iif(!empty(&Lc_varNpaq),paquetes.numlocal=&Lc_varNpaq,!deleted()) and iif(!empty(&Lc_varEst),paquetes.estatus=&Lc_varEst,!deleted())"
SELECT &Lc_campos DISTINCT FROM paquetes ;
WHERE &Lc_WHERE ;
INTO CURSOR curLISTA NOWAIT
thisform.gridConsultaCustomizada.RecordSource='curLISTA'
Sin embargo, al incluir un tercer criterio o más en la variable LC_WHERE, me sale el mensaje "El comando contiene una frase o palabra clave no reconocida" si paso por alto este mensaje sale otro que dice "Error de sintaxis." Incluso he probado agregar variables en las que asigno los if inmediatos, y después dentro de LC_WHERE llamo estas variable, claro agregando el AND pero siguen saliendo los mensajes. Este es el código con el tercer criterio:
Lc_varNpaq="thisform.txtNumPaquete.value"
Lc_varEst="thisform.comboEstatus.value"
Lc_varClase="thisform.comboClase.value"
LC_CAMPOS="paquetes.numlocal,paquetes.estatus,paquetes.movimiento,paquetes.clase,paquetes.grosor"
LC_WHERE="iif(!empty(&Lc_varNpaq),paquetes.numlocal=&Lc_varNpaq,!deleted()) and iif(!empty(&Lc_varEst),paquetes.estatus=&Lc_varEst,!deleted()) and iif(!empty(&Lc_varClase),paquetes.clase=&Lc_varClase,!deleted())"
SELECT &Lc_campos DISTINCT FROM paquetes ;
WHERE &Lc_WHERE ;
INTO CURSOR curLISTA NOWAIT
thisform.gridConsultaCustomizada.RecordSource='curLISTA'
Tal vez esté excediendo el número permitido de if inmediatos.
Comprendo tu duda.
Como se trata de un tema distinto al de tu pregunta original, ye pido que des por finalizada tu pregunta y generes otra con tu ultima consulta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas