Como Ordeno registros nuevos o cambios de los mismos en un combo, dentro de Visual Fox Pro 9
Como ordeno registros
nuevos o cambios de los mismos en una tabla dbf, en la tabla y en un combo me
aparecen al final de la lista y necesito que me parezcan ordenados
alfabéticamente.
Gracias.
1 respuesta
Un placer poder ayudarte! :D
Según entiendo, lo que necesitas es ordenar los registros en la tabla de forma alfabética (a través de algún campo especifico, imagino) y luego mostrar los datos en un combo para verlos también de forma especifica. Si no es así, corrígeme para poder ayudarte. Procedamos:
1. Vamos a las propiedades de la tabla (en modo de diseño) y establecemos un indice (regular, segun el caso) al campo a través del cual queremos establecer el orden alfabético.
2. Vamos al formulario donde muestras el combo. En el entorno de datos, agregamos la tabla en cuestión. Supongamos que la tabla se llama clientes y el campo (al cual establecimos el indice) a través del cual ordenaremos se llama "nombrecliente". Si te fijas en la tabla agregada, aparecen los campos... y mas abajito aparecen los indices o llaves de la tabla. Si el nombre del campo es muy largo, por lo general, el nombre del indice se abrevia, puede ser que el campo se llame nombreclientes y el indice "nombrecli". Usaremos el nombre del indice.
3. En el INIT() del form, colocamos un código como éste:
**--Ordenamos los registros alfabéticamente
SELECT clientes
SET ORDER TO nombrecli ASCENDING
**--
**--Usamos ascending para establecer un orden ascendente y DESCENDING para un orden descendente.
**--//
Luego, solo enlazamos el combo al campo de la tabla y establecemos RowSourceType = 6 y en RowSource el campo "nombrecliente".
Ahora, proba y me avisas! :)Estoy a la orden par cualquier duda o consulta.
Saludos! Desde Managua, Nicaragua.
Ravenn :D :D: D
Gracias por tu repuesta, Te comento
que tengo 3 combos, cada combo está conectado a una tabla diferente. Te muestro
como lo programe.
Combo1 (init)
open database "C:\cpmcz\principal.dbc"
use bdemp
do while not eof()
clav = alltrim(nom_emp)
thisform.combo1.additem (clav)
SKIP
enddo
close database
Combo1 (interactive change)
set talk off
set safety off
open database "C:\cpmcz\principal.dbc"
use bdemp
index on nom_emp tag nom_emp
SET ORDER TO TAG nom_emp
clav=alltrim(thisform.combo1.value)
seek clav
if found ( )
thisform.text5.value=alltrim(nom_emp)
thisform.text6.value=alltrim(dom_emp)
thisform.text7.value=str(cve_mpio_e)
thisform.text8.value=str(cve_edo_em)
endif
close database
Propiedades (combo1)
Row source: Select distinct nom_emp from bdemp order by nom_emp into cursor XTemp1
Row source type: 3-SQL statement
Esto lo estoy replicando a el comb0 2 y 3 con diferentes tablas
Anteriormente pregunte aquí en todo expertos y me dieron esta instrucción:
Esto es lo que pregunte: Como puedo ordenar los datos de una tabla y que aparezcan en un combo con visual fox pro 9, me esta repitiendo los registros.
Esta es la Respuesta: en la propiedad RowSourceType = 3 (del combo)
y en RowSource = "Select distinct TuCampo from tu tabla order
by TuCampo into cursor XTemp"
(del combo también)
A ver... en si, lo que necesitas (corrígeme si me equivoco) es mostrar los datos de un campo de una tabla en un combobox, ¿a modo de opciones y que dichos datos estén ordenados alfabéticamente? ¿Es eso?
Vamos por partes... En el evento INIT() del combo, veo mucho código para hacer algo que es muy sencillo. Intentas cargar el combo. Para eso, basta con usar las propiedades RowSource y RowSourceType. Mmm..
Hacer referencia a una tabla (abrirla) desde el INIT() de un objeto no
es muy consistente. Haz esto: Primero agrega la tabla 'principal' en el
entorno de datos de tu formulario. Con esto, la tabla estará activa y disponible en una sesión de datos privada. En las propiedades del form, busca en la pestaña DATA la propiedad BufferMode y selecciona la opción 2 - Optimistic y la propiedad datasession en 2 - private.
En el INIT() "DEL FORM" coloca un código así:
CURSORSETPROP("Buffering", 5, "principal")
En la propiedad RowSourceType del combo, selecciona la opción 6 - Fields. Y en la propiedad RowSource, seleccionar la tabla y el campo y te debe quedar así: principal.nom_emp
Con esto, ya habrás enlazado el campo de la tabla al combo. Sin mucho código pesado. Ahora... veo, en tu configuración, algunas partes que a mi humilde opinión, no deberían ir así. Aclaro... es solo mi opinión. :) Las lineas de código y comando que tienes en el InteractiveChange de tu combo, tales como el talk off, index, order... se deben colocar y "llamar" solo una vez, al inicio de tu aplicación (en el caso de talk off, safety on) y al inicio de tu form. ¿Por qué? Básico: no es necesario estarlas repitiendo n veces y esto puede ocasionar que se ralentice un poco la aplicación. No es una regla general, pero en mi experiencia, pues no lo recomiendo.
Yo te aconsejo lo siguiente: en el init de tu form, coloca algunos comando de "arranque" básico, tales como
**--Formato de fecha hispano DD/MM/AAAA
SET DATE BRITISH
**--Apagamos la conversación de foxpro
SET TALK OFF
**--Mostramos solo los registros activos de nuestras tablas asociadas al form
SET DELETED ON
**--Algunos otros útiles
**--
SET CENTURY ON
**--
SET CONFIRM ON
**--
SET MULTILOCKS ON
SET EXCLUSIVE OFF
**--
Ahora... OPEN DATABASE puedes usarlo mejor, para un optimo rendimiento, en el programa principal de tu aplicación. O si lo usas de forma mas periódica, en el init() de cada form, hace referencia directa al nombre de la base de datos y no a la ruta complera de ubicación física. ¿Por qué? Las rutas a veces se convierten en dolores de cabeza cuando se truncan... o cuando cambiamos directorios.
El indexado, basta con establecerlo una sola vez, en modo de diseño de la tabla. INDEX ON, mmm... mas bien es mas usado cuando creas cursores temporales (que están vivos solo en memoria aleatoria de forma temporal) y necesitas una llave de entrada para acceder de una forma específicamente
ordenada a tus registros. Por ejemplo: usamos CREATE CURSOR ... y
creamos un cursor y luego volcamos una tabla dentro de este... Vualaaaa... tenemos una tabla temporal con los registros de tu tabla física. Ahora usamos INDEX sobre algún campo de dicha tabla temporal para establecer un indice y así poder usar SET ORDER TO para ordenar los registros de forma ASCENDING O DESCENDING.
Pero para las tablas físicas (.dbf) basta con establecer un indice en el modo de diseño de la tabla y luego acceder al orden de los registros con SET ORDER TO. A como veo, intentas seleccionar una opción del combo y mostrar en algunos textos, los datos asociados a esa opción. Eso es fácil.
En el interactivechange del combo, coloca un código como este:
**--
SELECT principal
LOCATE FOR UPPER(ALLTRIM(principal.nom_emp)) = UPPER(ALLTRIM(THISFORM.Combo1.Value)
**-Si se encuentra algún registro
IF FOUND()
thisform.text5.value= nom_emp
thisform.text6.value= dom_emp
thisform.text7.value= cve_mpio_e
thisform.text8.value= cve_edo_em
THISFORM.Refresh
ELSE
MESSAGEBOX("Nombre no registrado en el sistema.")
Endif
**--//
Y listo. Espero no haber sido muy extenso je je! XD Bueno... es mi forma de aportar. Cualquier cosa que necesites saber, no dudes en preguntarme.
Saludos! Con mucha disposición, Ravenn :D :D :D
Disculpa que la respuesta anterior se mira toda pegada... sin espacios... solo que esta pagina de pronto se pone medio loca! :(
- Compartir respuesta