Ayuda con datos en listbox

1.- Estoy realizando una búsqueda en una tabla atra vez de un textbox y los resultados se deben visualizar en un listbox... Por ejemplo tengo una tabla con los sig. Campos: id, fecha, remite, destino. Con los sig. Registros en el campo id: 01,012, 099,09, 03 etc.. El problema es que cuando pongo en el textbox 09, aparece en el list: 099, 09, 03... El 03 no debería de aparecer, lo que el list debería de mostrar solo seria: 099,09... Como le hago para solucionar eso.
2.- La segunda duda es que me manda un error a la hora en que llamo el campo fecha... Creo que tengo que indicarle que es del tipo data, para que lo pueda mostrar en el listbox, pero no se como.
3.- Como especificar el tamaño de cada columna (el withd) y como poner la barra horizontal
A continuación el código de donde realizo la búsqueda (textbox: keypress):
**ESCAPE**
IF nKeyCode=27
thisform.Release
ENDIF
**ERROR**
IF nKeyCode=13
thisform.list2.Clear
IF !EMPTY(thisform.text1.Value)
a="%"+alltrim(UPPER(thisform.text1.Value))+"%"
SET SAFETY OFF
SELECT 1
num = UPPER(ALLTRIM(thisform.text1.value))
go top
SET INDEX TO ID_oficio ascending
SET ORDER TO ID_oficio ascending
seek num
SCAN WHILE c=0
x=x+1
if found()
thisform.list2.RowSourceType= 1
thisform.list2.ColumnCount=5
thisform.list2.AddListItem(recibidos.num_oficio)
*thisform.list2.AddListItem(recibidos.fecha_oficio,x,2)
Thisform. List2. AddListItem(recibidos. Remite,x,3)
Thisform. List2. AddListItem(recibidos. Destinatario,x,4)
Thisform. List2. AddListItem(recibidos.dep_remit,x,5)
Thisform. List2. SetFocus
SKIP
ELSE
c=1
Endif
ENDSCAN
thisform.list1.Visible= .F.
thisform.list2.Visible= .T.
Endif
Endif

1 Respuesta

Respuesta
1
Me parece que tu primer problema se debe a la condición que estas utilizando "if found()", la cual si se cumple una vez, todos los registros después de la incidencia van a ser tomados en cuenta ya que la función <FOUND()> devuelve verdadero (.T.) Cuando la última búsqueda fue exitosa y falso (. F.) si no lo fué. En este caso, al encontrar un registro, esta siempre devolverá verdadero hasta que se realize otra búsqueda. Espero se entienda, de cualquier forma creo que existen otras formas de lograr lo que tu quieres, algunas más fáciles, te muestro un ejemplo hecho en Visual FoxPro 9.
Si tu tabla no tiene muchos registros, puedes utilizar un filtro. Estableces la propiedad <RowSourceType> a 6 - Fields y la propiedad <RowSource> a los campos de la tabla que quieres que se muestren, esto lo puedes hacer con código o desde el diseño. Después solo tienes que filtrar los datos según lo que tengas en tu "Text Box". Para este ejemplo voy a utilizar el evento <LostFocus> del "Text1", este evento se ejecuta cada vez que el Objecto pierda el enfoque.
** Para establecer las propiedades del List Box (List2)
ThisForm.List2.ColumnCount = 5
ThisForm.List2.ColumnWidths = "40, 50, 80, 100, 60"
ThisForm.List2.RowSourceType = 6
ThisForm.List2.RowSource = "Recibidos.Num_Oficio, Fecha_Oficio, Remite, Destinatario, Dep_Remit"
** Evento LostFocus del Text Box (Text1)
SELECT Recibidos
SET FILTER TO UPPER(ALLTRIM(Num_Oficio)) = UPPER(ALLTRIM(ThisForm.Text1.Value))
ThisForm. List2. ReQuery()
Si tu tabla tiene muchos registros (no se exactamente cuantos pero tu lo notarás) el programa se empieza a poner algo lento, en este caso creo que te convendría utilizar una consulta <SELECT - SQL>. Si éste es tu caso, dime para darte un ejemplo.
En cuanto tu segunda duda, el problema es que el método que estas usando (<AddListItem>) solo acepta datos de tipo caracter, por eso es que te regresa un error, aquí lo que podrías hacer es convertir la fecha a caracter con la función <DTOC()>.
ThisForm. List2. AddListItem(DTOC(Recibidos.Fecha_Oficio), x, 2)
Y en cuanto al tres, para especificar el tamaño de cada columna puedes utilizar la propiedad <ColumnWidths> del "List Box", el valor de esta debe ser de tipo carácter, debes poner el tamaño de cada columna separado por comas.
ThisForm.List2.ColumnWidths = "40, 50, 80, 100, 60"
De lo de la barra horizontal, la verdad yo no se si sea posible en un "List Box", yo no se como hacerlo, si es muy importante para ti que exista un barra de desplazamiento horizontal creo que puedes utilizar un control "Grid" en vez del "List Box".
1° Gracias por contestar
Los tips que me has dado me han sido de mucha utilidad. A lo que se refiere al tamaño de la tabla, pues si, tiene muchos registros... así que si voy a necesitar que me expliques eso de select sql... porque pss no se, y se me olvido mencionar que soy nuevo en el foro y el lenguaje... yo había programado en C#, pero por cuestiones del Servicio Social, en donde entre solo usan Foxpro, así que toy poyo en el lenguaje.. xD
Por otro lado.. lo de la barra horizontal, me dado cuenta que es imposible puesto que el listbox no cuenta con esa propiedad (scrollbar, debí haber utilizado un grid) bueno, pero eso ya lo ajuste, y ya no ay problema
gracias y espero tu respuesta... saludos
Si mira te explico un poco, lo que hace el comando SELECT - SQL> es seleccionar ciertos campos y ciertos registros de una o varias tablas que cumplan con ciertas condiciones, en el caso del Fox, esta selección de registros se guarda en una tabla temporal, un cursor, y es éste cursor el que tendrías que usar como de tu "List Box". Así cada vez que le cambien el valor al "Text Box" harías una nueva selección que concuerde con el valor introducido. Este sería el ejemplo:
** En el Evento Init puedes crear el cursor e inicializar el List Box (List2)
** El asterisco (*) indica que se seleccionarán todos los registros de la tabla Recibidos
SELECT * FROM Recibidos INTO CURSOR CurRecib
ThisForm.List2.ColumnCount = 5
ThisForm.List2.ColumnWidths = "40, 50, 80, 100, 60"
ThisForm.List2.RowSourceType = 6
ThisForm.List2.RowSource = "CurRecib.Num_Oficio, Fecha_Oficio, Remite, Destinatario, Dep_Remit"
** Evento LostFocus del Text Box (Text1)
SELECT * FROM Recibidos WHERE UPPER(ALLTRIM(Num_Oficio)) = UPPER(ALLTRIM(ThisForm.Text1.Value))
ThisForm. List2. ReQuery()
Ok... cheque con el ejemplo que pusiste y funciono... lo que preferí hacer es seccionar la tabla en varias tablas más chicas... y pss ya no se a lenta la búsqueda.. y va de maravilla
aun así, si tienes tiempo, me gustaría que me explicaras lo de select -sql-
Y ya por ultimo, para preguntarte otra cosa, ¿es mejor que te califique esta respuesta y posteriormente abrir otra pregunta o puedo hacer la pregunta aquí mismo?
Saludos
Un detalle que se me pasó, en el evento del "Text Box", así es como debe ir:
** Evento LostFocus del Text Box (Text1)
SELECT * FROM Recibidos ;
WHERE UPPER(ALLTRIM(Num_Oficio)) = UPPER(ALLTRIM(ThisForm.Text1.Value)) ;
INTO CURSOR CurRecib
ThisForm. List2. ReQuery()
Tienes que meter la nueva consulta en el mismo cursor, ya que de ahí es de donde el "List Box" extrae la información.
Si quieres entender la instrucción <SELECT - SQL> puedes ir haciendo algunas pruebas, puedes poner los siguientes comando para que veas que resultados obtienes:
1. SELECT * FROM Recibidos
2. SELECT Num_Oficio, Remite, Destinatario FROM Recibidos
3. SELECT Num_Oficio, Remite, Destinatario FROM Recibidos WHERE Fecha_Oficio = DATE()
Estas instrucciones hacen lo siguiente:
1. Selecciona todos los registro de la tabla Recibidos, si no especificas un cursor con la cláusula "... INTO CURSOR ..." se guarda por predeterminado en un cursor con el nombre "Query" o "Consulta", dependiendo del idioma.
2. Selecciona solo los campos "Num_Oficio", "Remite" y "Destinatario" de la tabla Recibidos.
3. Selecciona los mismos campos que la dos pero aquí solo entrarán los registros cuya fecha sea igual al día de hoy, o a la fecha que tenga el Windows, para eso se usa la función <DATE()>.
Haz algunas pruebas y lo entenderás mejor.
Respecto a lo de la otra pregunta, yo creo que si sería mejora que finalizaras esta e iniciaras una nueva, sobre todo si es un tema diferente...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas