Desactivar elemento o item en listbox mediante condicion en tabla??

353 views
Skip to first unread message

Saul Piña Hernandez

unread,
May 11, 2015, 10:25:49 AM5/11/15
to publice...@googlegroups.com
Saludos, tengo una tabla llamada "lista" en donde existe un campo "capturado" en este campo capturado en algunos registros se muestra como "SI", hasta alli todo bien, ahora, esa tabla la muestro en un listbox.

Mi duda es, me gustaria desactivar en el listbox todos aquellos registros en donde el campo "capturado" tenga un "SI"

u otra alternativa es tener un color para los registros que ya tienen un "SI" y al momento de elegir mostrar un messagebox de que ese registro ya está capturado.

Muchas gracias.


Antonio.xt

unread,
May 11, 2015, 10:39:03 AM5/11/15
to publice...@googlegroups.com, vfxpro...@gmail.com

Para desactivar un item de un ListBox se usa al principio del item este caracter "\".

Podrias barrer la tabla "lista" con un SCAN y agregar el caracter "\" a los que campo "capturado" sea igual a "SI".

Saul Piña Hernandez

unread,
May 11, 2015, 10:52:35 AM5/11/15
to publice...@googlegroups.com, puent...@gmail.com, vfxpro...@gmail.com
Creo que no es posible anteponer "\" cuando se alimenta un listbox mediante una tabla o cursor,
si estoy equivocado, por favor ayudenme a despejar mi duda.

Saludos.

Antonio.xt

unread,
May 11, 2015, 12:59:14 PM5/11/15
to publice...@googlegroups.com, vfxpro...@gmail.com, puent...@gmail.com

Y si en vez de cursor usas un arreglo, o agregas los items mediante el metodo AddItem del ListBox.

Fernando D. Bozzo

unread,
May 11, 2015, 1:52:26 PM5/11/15
to publice...@googlegroups.com, puent...@gmail.com, vfxpro...@gmail.com
Soy de la idea de lo que dice Antonio:

Es mucho más fácil hacer un SCAN para ir agregando los items al listbox y los que quieras desactivar les agregás "\" por delante

Saul Piña Hernandez

unread,
May 11, 2015, 2:15:22 PM5/11/15
to publice...@googlegroups.com, puent...@gmail.com, vfxpro...@gmail.com
Saludos, pues si no tengo problema en que demore la adición de items al listbox, ya que por eso mismo me decidí usar un listbox, porque los registros son poco mas de 15,000 y deben realizar busquedas en el listbox (ó cursor relacionado al listbox).

Y sin dejar de mencionar que esta tarea debe trabajarse en 7 computadoras con una red local.


Antonio.xt

unread,
May 11, 2015, 2:32:35 PM5/11/15
to publice...@googlegroups.com, vfxpro...@gmail.com, puent...@gmail.com

Me parece que 15000 elementos son demasiados para manejar un ListBox, por lo general uso el ListBox para una lista no muy grande por el diseño que tiene, pero para seleccionar un item de 15,000 yo usaria otro metodo de busqueda, ademas de agregar filtros.

Fernando D. Bozzo

unread,
May 11, 2015, 2:37:46 PM5/11/15
to publice...@googlegroups.com
No hombre! 15000 registros no son para meter en un control como un listbox! Es una aberración hacer algo así, y el usuario no puede navegar esa cantidad de registros....

¿Cuál es el problema de usar un formulario de búsqueda acotada, donde el usuario naveque por los resultados solamente?




Saul Piña Hernandez

unread,
May 11, 2015, 2:55:37 PM5/11/15
to publice...@googlegroups.com, puent...@gmail.com, vfxpro...@gmail.com
Si?, no me ha dado problemas hasta ahora, yo solo quería identificar aquellos registrso capturados y solo se trata de una estética para el usuario. pero por lo pronto le puse un messagebox en donde le digo al usuario que ese registro ya está capturado...

Es mas, hago consulta hasta en 3 tablas al mismo tiempo y sin problema de demora, las tablas pertenecen a MySQL

Adjunto una imagen...

Saludos.


Saul Piña Hernandez

unread,
May 11, 2015, 3:16:39 PM5/11/15
to publice...@googlegroups.com, fdb...@gmail.com
Saludos Fernando, me lo copié de un programa que utiliza listbox con tablas que tienen muchos registros. Pero no es que el usuario tenga que navegar por el listbos hasta encontrar el registro o nombre en cuestion. en mi opinión personal, un listbox en donde solo voy a utilizar 1 columna, pienso que es mejor que cuando hacia un "browse" directo a la tabla.
 

Porque un listbox?

1. Solo necesito 1 columna
2. Hago uso del interactivechange() en un textbox y mostrar datos en el list para agilizar la busqueda.
3. No tengo que diseñar ni escribir tanto codigo.
4. Para acceder a los datos u realizar una busqueda que relacione el listbox a una tabla y mostrar a detalle en otros objetos como textbox, basta con un this.value
5. Me gustó mucho de un programa que utiliza mucho el listbox

En lo personal, usar un grid:
1. Debo diseñar el grid (width de columna, nombre en header1, fontzise, columncount, recorsource, etc)
2. Relacionar un cursor de consulta al grid
3. Si quiero hacer clic en un registro del grid para hacer una consulta y ademas extraer u obtener datos para mostrar en textbox, debo hacer uso de BindEvents()


Esa es mi experiencia con los objetos.  Es obvio que siempre me decido con el grid, cuando se trata de mostrar un listado (es decir, mostrar mas de 1 columna) y además de que si quiero mostrar objetos dentro del grid, o cambiar el color en filas del grid. todo va dependiendo de qué tarea debo realizar y utilizo el objeto adecuado..

Les dejo unas imagenes.

A) Grid con objetos B) Grid como listado y C) Listbox para busqueda de datos

Yo siempre estaré agradecido por la critica y sugerencia, cualquiera que sea.
 

Fernando D. Bozzo

unread,
May 11, 2015, 3:44:28 PM5/11/15
to publice...@googlegroups.com
Ok, te comento sobre cada uno de los ejemplos:

1) Pantalla "Consulta de Ventas diarias": Fijate que lo primero que hay que seleccionar es un filtro de datos (fecha inicial y fecha final). Normalmente este tipo de selección tiene una preselección ya hecha y lista para usarse, por ejemplo entre hoy y la semana anterior, u hoy y el mes anterior, dependiendo de la cantidad de datos a mostrar.

En general en este tipo de selección suele usarse un grid, y si está bien ajustado se suelen mostrar no más de 20 o 30 registros a la vez. Aunque en Fox se suele mostrar todos los registros por costumbre (aunque no buena práctica), una técnica que se usa en este caso es la de ir buscando paquetes de X registros en el servidor, para mostrarlos, y de tener unos botones de navegación "anterior/siguiente" que va consultando y descargando los 20 o 30 registros anteriores o siguientes. Un ejemplo de esto lo podés ver en la interfaz web de Gmail, donde hay unas flechitas arriba a la derecha para mostrar los siguientes X correos o los X anteriores.


2) Pantalla "form1" con historial lateral: Este realmente es un form de ingreso de datos, pero con un histórico al costado. Si estos históricos no tienen muchos registros, entonces se pueden mostrar de la forma que se ve en la imagen, pero si tienen muchos registros lo que se hace es mostrar los últimos N registros del histórico y se habilitan opciones de navegación del histórico, normalmente de fecha desde/hasta o la de N registros anteriores/siguientes.


3) Pantalla "form 1" con 3 paneles tipo listbox: En este caso, y por lo que se ve, las listas ya están filtradas, lo que está bien.


En ninguno de los 3 ejemplos hay un listbox con 15000 elementos, y lo que te comentaba antes era de que nunca debe meterse semejante cantidad de información en una lista (aunque sea una sola columna), entre otras cosas porque se carga exclusivamente en memoria, y tenés que tratar la memoria como un recurso a cuidar mucho, ya que siempre hay que pensar en la concurrencia y en la escalabilidad. Por ejemplo, si mañana te dicen que tu aplicación se va a ejecutar eb un servidor donde los usuarios se van a conectar por sesión remota con Citrix, eso significa que todos los usuarios van a estar usando la memoria del mismo servidor. Si el servidor es un Windows Server de 32 bits, vas a estar limitado a 4 GB de ram (3 GB si descontamos lo que usa el SO y sus servicios), lo que significa que si tu ejecutable + los datos en memoria ocupan 100 MB por usuario, vas a tener un límite de 30 usuarios concurrentes (30 * 100 MB = 3000 MB = 3 GB).

Si en cambio usás menos memoria (digamos, 50 MB), eso quiere decir que en el mismo escenario vas a poder tener 60 usuarios concrrentes con el mismo hardware.


Por todas estas cuestiones de usabilidad y escalabilidad, es que siempre te conviene limitar la cantidad de registros que muestres.


Saludos.-




Saul Piña Hernandez

unread,
May 11, 2015, 3:57:58 PM5/11/15
to publice...@googlegroups.com, fdb...@gmail.com
Saludos Fernando, Con tu explicación,me queda muy claro el tema y los cuestionamientos de éste. Me gustó el metodo del ejemplo de Gmail, nada mas que ¿Cómo sería la forma de tener "paquetes de 20 o 30 registros" ?

existe algo que se me pasó comentar y que se que voy a recibir una amonestación.
Como ejemplo la imagen con los listbox, al iniciar la pantalla, hago un sqlexec(lHandle, "Select mi campo from miTabla","Consulta") entonces lo que hago es traer todos los datos de la tabla (aprox 15000) y los muestro en el listbox.

Lo que se vé en la imagen es un filtro en el evento interactivechange() y por eso se ven pocos registros.

Mi pregunta es, de esa manera es correcto?

Gracias, aprecio mucho tus consejos y los demas foxeros..

Fernando D. Bozzo

unread,
May 11, 2015, 4:32:51 PM5/11/15
to publice...@googlegroups.com
Contesto sobre tu mensaje:


El 11 de mayo de 2015, 21:57, Saul Piña Hernandez <vfxpro...@gmail.com> escribió:
Saludos Fernando, Con tu explicación,me queda muy claro el tema y los cuestionamientos de éste. Me gustó el metodo del ejemplo de Gmail, nada mas que ¿Cómo sería la forma de tener "paquetes de 20 o 30 registros" ?

existe algo que se me pasó comentar y que se que voy a recibir una amonestación.
Como ejemplo la imagen con los listbox, al iniciar la pantalla, hago un sqlexec(lHandle, "Select mi campo from miTabla","Consulta") entonces lo que hago es traer todos los datos de la tabla (aprox 15000) y los muestro en el listbox.

Lo que se vé en la imagen es un filtro en el evento interactivechange() y por eso se ven pocos registros.

Mi pregunta es, de esa manera es correcto?

¡No! Es totalmente erróneo eso!. Traerse toda la base de datos a local es lo peor que podés hacer, independientemente de que te los traiga rápido. Siempre tenés que tener en cuenta el crecimiento de la base de datos y de los usuarios.

Imaginate que tu red sea Gigabit, (lo habitual), si esta bien configurada, el administrador no le dejará el ancho de banda completo a nadie, por lo que puede limitar el ancho de banda particular a un 1% o menos para evitar que un usuario acapare todo el ancho de banda de la red. Esto te daría un máximo teórico de 1000 Mbit/s * 1 / 100 = 10 Mbit/s, que es 1.25 MB/s, a lo que tenés que descontar el tiempo de conexión a la BDD y la capacidad que usa el protocolo TCP/IP (solo el protocolo, sin tus datos). Supongamos que que te queda 1 MB/s útil por usuario.

Eso significa que si tenés un registro de 50 caracteres (incluyendo la marca de borrado), para 15,000 registros serían 15,000 x 50 = 750000 bytes = 732 KB, o sea que tardaría casi 1 segundo por usuario (en este caso, el 75% de 1 segundo) y por eso lo percibís como "rápido".

Ahora imaginate que la base de datos crece, y que en vez de haber 15,000 registros pasan a haber 150,000 registros (10 veces más), eso significa que tus tiempos se van automáticamente a 7,5 segundos por usuario (ya empieza a doler).
Finalmente imaginate que sigue creciendo hasta 1.5 millones de registros (100 veces más que ahora), eso quiere decir que tu "menos de 1 segundo" se transforma automáticamente en 75 segundos para traerte toda la base de datos.....

Como ves, esto es simplemente insostenible, y por eso se dice que "no escala". De ahi que siempre se limite la cantidad de registros a traer.

ZeRoberto

unread,
May 11, 2015, 6:14:58 PM5/11/15
to publicesvfoxpro
Usa Grid con la propiedad DynamicFore para resaltar los datos que mas necesites

Daniel Sánchez

unread,
May 11, 2015, 7:34:25 PM5/11/15
to Comunidad de Visual Foxpro en Español
El tema de traer al iniciar el form tus 15 mil registros es que puede hacer lento la carga de tu form al visualizarse, en un escenario de un solo usuario probablemente pase desapercibido pero en un escenario de muchos usuario a la vez, pues la cosa cambia, o si como comenta Fernando accediendo ha escritorios remotos, y hablamos de esperas más largas para que se muestre el formulario en pantalla, es solo un comentario más al tema, en todo caso podrías manejar un parámetro para ir trayendo interactivamente los datos que necesitas visualizar en ese momento y también mejorarías la consulta al servidor ya que de arranque no vas ha trabajar con los 15 mil elementos de tu tabla solo con uno o un grupo de ellos, así que al considerarlo de esa manera optimizas la consulta en pequeñas consultas con tiempo de espera mucho menores al traer los datos, ahora otro escenario que me ocurre muy a menudo es correr tu software por conexión de internet, pues imagínate el tiempo que se demoraría traer esos 15 mil registros a la pc local (suponiendo que el servidor de datos podría estar en la china), ahí no seria en un segundo como lo ves en tu pc local, ahí si te obligaría ha replantear todo tu enfoque,  por eso es siempre bueno ver el escenario más practico y el más exagerado para tener una idea de como se comportaría nuestro software en ambos casos.

Saludos 
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Saul Piña Hernandez

unread,
May 12, 2015, 9:25:18 AM5/12/15
to publice...@googlegroups.com, resets...@gmail.com
Buenos dias a todos amigos foxeros.  Acepto la amonestación, pero ahora diganme por favor, que cambios harian en los pasos siguientes (y que me gustaria cambiar).

El escenario:
El usuario debe localizar a "PEREZ RODRIGUEZ JUAN" que se introduce en un textbox. Y una vez localizado en la tabla, el programa debe traer los datos tales como domicilio y telefono para mostrar en los demas textbox.
La tabla es "Listado1" (de MySQL) , el campo en donde se encuentra el dato a buscar es "nombre" que es un varchar de 45 caracteres

Proceso:
1. Al ejecutar el formulario, en el init hago esto:

SQLCone1="Select ncompleto, id from Listado1 order by ncompleto"
SQLExec(lHandle,SQLCone1,"crListado")


2. Ya con la consulta crListado paso todos los datos a un List1, para proceder la busqueda por medio de interactivechange() del textbox.

3. Una vez localizado el registro en cuestion, el programa debe mostrar los datos de domicilio y telefono de ese registro, y lo hace en el evento DblClick del List1

Importante:
A veces o la mitad de las busquedas, no es posible localizar el dato, debido a que está mal escrito y es alli donde viene el plan "B", que es hacer un barrido al list1 para localizar el dato.

Ustedes lo explican muy bien, entiendo la lógica de que no debo traerme todos los 15000 registros, pero entonces como trabajar por medio de interactivechange()? es decir, el usuario tiene más atención cuando ve que las coincidencias se van mostrando en el Listbox.

Ahora bien, mi duda es,Como o cuantos registros se debe mostrar en las coincidencias de lo que está escrito en el textbox? La consulta mostraría solo las coincidencias??

Gracias por su apoyo.




Saul Piña Hernandez

unread,
May 12, 2015, 9:29:37 AM5/12/15
to publice...@googlegroups.com, fdb...@gmail.com
Saludos, fernando, Entonces tendría que cambiar todo mi proceso y dejar de usar interactivechange() en el textbox??

Mi duda es, como va a mostrar "coincidencias" en el list si solo me traigo unos cuantos registros?  o es dejar de usar definitivamente interactivechange() y decidirme por otra opcion, y si es asi, cual opcion sería la correcta?

El escenario: Buscar "coincidencias" introducidas en un textbox, el tipo de datos "caracter"

Gracias.

Saul Piña Hernandez

unread,
May 12, 2015, 9:46:25 AM5/12/15
to publice...@googlegroups.com, zero...@gmail.com
Saludos Ze Roberto, pero el tema es "mostrar coincidencias", si me explico?  mostrar "no resaltar", es decir, que al momento de ir escribiendo el "dato a buscar" en el grid me muestre las posibles coincidencias. Es decir, al momento de ingresar los datos, la lista se va reduciendo hasta tener de 1 a 10 registros segun las coincidencias.

Saludos.

Daniel Sánchez

unread,
May 12, 2015, 9:48:04 AM5/12/15
to Comunidad de Visual Foxpro en Español
Una vez en alguna parte vi que usaban el interactivechange para realizar una consulta que se iba construyendo conforme digitan en un textbox, pero no se ejecutaba por cada letra que ingresaban si no que analizaba un tiempo prudencial entre cada pulsación para recién realizar la consulta, es decir no iniciaba una consulta al servidor por cada letra presionada.

Así de esa manera no satura al servidor con consultas por cada pulsación de tecla, además de la posibilidad de una demora cada vez que realice la consulta para traer datos.

Otra manera podría darse al dejar un espacio después de cada palabra que realice la búsqueda, así también optimizas la consulta, ya que cuando finaliza un nombre recién busca, aunque yo optaría en considerar hasta 2 palabras para realizar la primera búsqueda permitiendo traer las menos coincidencias posibles.

Saludos

Saul Piña Hernandez

unread,
May 12, 2015, 9:50:24 AM5/12/15
to publice...@googlegroups.com, resets...@gmail.com
Saludos Daniel.

"en todo caso podrías manejar un parámetro para ir trayendo interactivamente".

Habria un ejemplo de idea como la que mencionas?? me interesa mucho optimizar mis formas de trabajar con consultas a MySQL.

Creanme, todo lo que me han sugerido lo he puesto en práctica, por ejemplo: la identidad de los objetos, trabajar con carpetas y agrupando los archivos como forms, reports, prgs, etc.
Gracias.

Saul Piña Hernandez

unread,
May 12, 2015, 9:55:36 AM5/12/15
to publice...@googlegroups.com, resets...@gmail.com
Todo lo que mencionas para mi sería genial, incluso he soñado que ojalá se pudiera obtener con el solo "pensamiento de la palabra" el programa empice a buscar.. o ya de perdido al decir "PEREZ JUAN" El programa inicie la busqueda.. ja,ja,ja... es broma.  Esas ideas tambien las he pensado.

El problema es como lo traduzco a codigo...en este momento estoy tratando de mejorar el codigo de consulta, Como vez que en lugar de consultar por cada palabra, mejor lo haga al momento de dar Enter.

Por ejemplo:

Se escribe "Perez Juan"  y se presiona Enter
Entonces de muestran las posibles coincidencias.

Y no como se estaba usando, por cada letra va cambiando.

Saludos.


Daniel Sánchez

unread,
May 12, 2015, 10:04:35 AM5/12/15
to Comunidad de Visual Foxpro en Español
Entonces al dar enter es mucho más fácil, ya que puede poner tu código en el valid o lostfocus del textbox, recién ahí armas la cadena para tu consulta.

Te paso un procedimiento que sirve para que en base a un texto te ubique la coincidencias sin importar el orden como se encuentre en tu campo, ejemplo: juan perez, perez juan, jua erez; cualquiera de ellos te traerían la coincidencias que tengan en sus campos la palabra juan, jua, perez erez sin importar en que parte de la cadena este, este código te va ha ayudar bastante.

function filtroxpalabra
LPARAMETERS CCAMPOTABLA AS CHARACTER, CCADENATEXTO AS CHARACTER
LOCAL NCUENTAWORD, CFILTROCADENA, ICUENTA
NCUENTAWORD = GETWORDCOUNT(ALLTRIM(CCADENATEXTO))
CFILTROCADENA = ''
FOR ICUENTA = 1 TO NCUENTAWORD
CPALABRA = ALLTRIM(GETWORDNUM(CCADENATEXTO, ICUENTA))
CFILTROCADENA = CFILTROCADENA+IIF(ICUENTA>1, ' and ', '')+CCAMPOTABLA+[ like '%]+CPALABRA+[%']
ENDFOR
IF  .NOT. EMPTY(CFILTROCADENA)
CFILTROCADENA = '('+CFILTROCADENA+')'
ENDIF
RETURN CFILTROCADENA
ENDFUNC



Saul Piña Hernandez

unread,
May 12, 2015, 10:11:15 AM5/12/15
to publice...@googlegroups.com, resets...@gmail.com
Gracias Daniel,  el codigo debo agregarlo al valid del textbox? o a un metodo del form?

Daniel Sánchez

unread,
May 12, 2015, 10:27:03 AM5/12/15
to Comunidad de Visual Foxpro en Español
Ponlo como un prg, así lo puedes invocar desde cualquier lugar donde necesites armar una consulta con las mismas características,  Te devuelve una cadena como esta con un texto como este 'jua erez'

[nombres like '%jua%' and nombres like 'erez']

Saludos

Saul Piña Hernandez

unread,
May 12, 2015, 10:51:10 AM5/12/15
to publice...@googlegroups.com, resets...@gmail.com
cCampoTabla sería igual a:
Listado1.nombre

cCadenaTexto seria igual a:
Thisform.txt_buscar.value

??

Daniel Sánchez

unread,
May 12, 2015, 11:08:01 AM5/12/15
to Comunidad de Visual Foxpro en Español
campotabla se refiere al nombre del campo de tu tabla a consultar, y cadenatexto es el texto digitado en tu textbox.

Saludos

Fernando D. Bozzo

unread,
May 12, 2015, 3:12:04 PM5/12/15
to publice...@googlegroups.com, vfxpro...@gmail.com, fdb...@gmail.com
Hola Saúl:



El martes, 12 de mayo de 2015, 15:29:37 (UTC+2), Saul Piña Hernandez escribió:
Saludos, fernando, Entonces tendría que cambiar todo mi proceso y dejar de usar interactivechange() en el textbox??

Pues sí, sería lo recomendable, ya que hoy te funciona bien, pero en cuando haya más usuarios o más datos la cosa va a ir empeorando.

 

Mi duda es, como va a mostrar "coincidencias" en el list si solo me traigo unos cuantos registros?  o es dejar de usar definitivamente interactivechange() y decidirme por otra opcion, y si es asi, cual opcion sería la correcta?

Te recomiendo leer todo el apartado de SELECT-SQL de FoxPro, que está muy bien hecho, y los comodines "%" y "_", con los que vas a poder hacer las búsquedas de coincidencias.
Realmente es todo el apartado de manejo de datos el que deberías leer, ya que es lo que te está haciendo falta.

Este es un tema que deberías practicarlo desde la ventana de comandos, antes de comenzar a programar cualquier cosa, ya que una vez que lo domines desde ahi, o al menos lo tengas más claro, recién ahi podés comenzar a programar.

La programación es el último paso, antes deben hacerse las pruebas unitarias hasta que consigas lo que buscás.


 

El escenario: Buscar "coincidencias" introducidas en un textbox, el tipo de datos "caracter"

En SQL, "%" es como el "*" en DOS, y "_" es como "?" en DOS

Pero ojo: porque las búsquedas por "coincidencia" son mucho más costosas que las búsquedas exactas.
Lo deseable es que el usuario sepa lo que busca, aunque esto a veces es difícil :)


 

Fernando D. Bozzo

unread,
May 12, 2015, 3:16:17 PM5/12/15
to publice...@googlegroups.com, vfxpro...@gmail.com
Hola Saúl:

Aunque lo que te voy a comentar no tiene nada que ver con lo que preguntás, prefiero anticiparme a futuros problemas que puedas tener:

Imagino que para hacer todos estos cambios estás trabajando con control de código fuente, no? Porque si no, estás tomando un riesgo muy alto, y es una pena habiendo tantas opciones para elegir.

Ya habrás visto en el foro que varias veces ha venido gente desesperada porque perdió los fuentes. Con una herramienta de control de código, incluso aunque uses el viejo SourceSafe (que mejor otro), podés al menos ir guardando todo en otra PC, por si te falla la tuya.

Quería comentártelo.


Saludos.-



El lunes, 11 de mayo de 2015, 16:25:49 (UTC+2), Saul Piña Hernandez escribió:
Saludos, tengo una tabla llamada "lista" en donde existe un campo "capturado" en este campo capturado en algunos registros se muestra como "SI", hasta alli todo bien, ahora, esa tabla la muestro en un listbox.

Mi duda es, me gustaria desactivar en el listbox todos aquellos registros en donde el campo "capturado" tenga un "SI"

u otra alternativa es tener un color para los registros que ya tienen un "SI" y al momento de elegir mostrar un messagebox de que ese registro ya está capturado.

Muchas gracias.


Saul Piña Hernandez

unread,
May 13, 2015, 9:35:17 AM5/13/15
to publice...@googlegroups.com, resets...@gmail.com
Saludos Daniel, perdona mi ignorancia, pero y como sabrá el código en cual tabla debe buscar??
Lo que sucede, es que debo buscar en 3 tablas el mismo dato al mismo tiempo.

Gracias

Saul Piña Hernandez

unread,
May 13, 2015, 9:39:33 AM5/13/15
to publice...@googlegroups.com, fdb...@gmail.com, vfxpro...@gmail.com
Saludos Fernando, efectivamente trabajo directo en el proyecto de VFP, es decir con el codigo fuente, pero, siempre tengo un respaldo en:

A) Mi PC  (Ejemplo: C:\Proyecto)
B) Memoria USB 
C) En la Nube

Siempre lo hago así en la mayoria de mis proyectos o codigos fuente.

Antonio Meza

unread,
May 13, 2015, 10:48:59 AM5/13/15
to publice...@googlegroups.com, vfxpro...@gmail.com, resets...@gmail.com
Es muy sencillo saul !!

1.- Realizas la búsqueda desde tu textbox que te devolverá un cursor con la lista de las coincidencias, este cursor debes traer como mínimo el Nombre y ID de la tabla.

2.- Al primer Listbox le asignas que muestre el campo Nombre del cursor obtenido en el paso 1, y luego en el interactiveChange del ListBox puedes realizar una nueva consulta por el campo ID para obtener los datos completos para mostrar del lado derecho, así solo obtendrás un registro cada vez que el usuario seleccione  en el listbox, y en el paso 1 tendrás pocos registros por el filtrado que haces en la consulta, lo que mejorara mucho tu código que es lo que te han comentado.

3.- Hacer lo mismo con las otra 2 tablas que faltan porque no mencionas como tienes relacionadas.

saludos
Antonio Meza

Daniel Sánchez

unread,
May 13, 2015, 10:53:22 AM5/13/15
to Comunidad de Visual Foxpro en Español
Como es la consulta actual que manejar, si son 3 consultas diferentes, al pasar el dato del campo también puedes pasar el nombre de la tabla, es decir mitabla.micampo.

Saludos

Saul Piña Hernandez

unread,
May 13, 2015, 11:39:05 AM5/13/15
to publice...@googlegroups.com, resets...@gmail.com
Saludos Daniel,


Entonces por ejemplo en el evento valid() del txt_buscar:

Local cCampoTabla, cCadenaTexto
cCampoTabla=Listado1.ncompleto
cCadenaTexto=allt(this.value)
do BusquedaRegistro.prg with cCampoTabla, cCadenaTexto


Es correcto?
gracias

Daniel Sánchez

unread,
May 13, 2015, 11:45:25 AM5/13/15
to Comunidad de Visual Foxpro en Español
Me parece correcto, debo suponer que dentro busquedaregistro armas una consulta con un select, ahora otra cosa no es necesario que indiques el .prg solo con el nombre es suficiente, a no ser que manejes otra extensión para tu prg ahí si deberías indicarlo, caso contrario no.

Saludos

Saul Piña Hernandez

unread,
May 13, 2015, 11:58:00 AM5/13/15
to publice...@googlegroups.com, resets...@gmail.com
y no se supone que BusquedaRegistro.prg es el que arma o crea la consulta?? porque hay que armar una consulta antes de ejecutar el prg??
y ahora me confundí, entonces que funcion realiza el prg?

Gracias.

Daniel Sánchez

unread,
May 13, 2015, 12:19:23 PM5/13/15
to Comunidad de Visual Foxpro en Español
Por eso pregunto, ya que no se que tienes en ese prg., y supongo que ahí construyen tu consulta, y obtienes tu cursor con los datos requeridos.

Saludos

Saul Piña Hernandez

unread,
May 13, 2015, 12:27:14 PM5/13/15
to publice...@googlegroups.com, resets...@gmail.com
El prg es el Codigo que tu me diste de ejemplo amigo.

Daniel Sánchez

unread,
May 13, 2015, 12:52:02 PM5/13/15
to Comunidad de Visual Foxpro en Español
Entonces ese prg solo cumple una función y es de permitirte obtener parte de tu where para tu consulta, es decir el filtro que se va aplicar para la búsqueda, no arma la consulta ejemplo

function valid
ctexto=alltrim(this.value)
cWhere=BusquedaRegistro([Mitabla.micampo],ctexto)       &&en mi caso lo he llamado filtroxpalabra, ya que no busca nada solo arma
cCadenaSQL=[select * from mitabla where ]+cwhere
nretorna=exec(miconexion,ccadenaSQL,[myresultados])
if retorna>0
   */todo ok enlazo mi cursor al objeto que va ha servir para mostrar los datos grid, listbox o combobox
else
   */muestro mensaje de error ocurrido
endif 

Saul Piña Hernandez

unread,
May 13, 2015, 2:49:12 PM5/13/15
to publice...@googlegroups.com, solv...@gmail.com, vfxpro...@gmail.com, resets...@gmail.com
Saludos Antonio, Pues asi es como lo tengo actualmente, solo que Daniel expuso un ejemplo de codigo para buscar pero no le he entendido como es que hay que pasar los parametros o mejor dicho, qué parametros espera el prg y donde se debe declarar la tabla para la busqueda en cuestion.

Víctor Hugo Espínola Domínguez

unread,
May 13, 2015, 9:30:16 PM5/13/15
to publice...@googlegroups.com
Hola Saúl

Adjunto un ejemplo donde los registros traidos desde el servidor alimentan un grid ordenable, con esto practicamente no es necesario implementar una búsqueda incremental, pero si lo deseas es factible.

Saludos,
Victor.
Lambaré - Paraguay.

BuscaNombre._rar
Reply all
Reply to author
Forward
0 new messages