PDA

Ver la Versión Completa : [Sintaxis] Busqueda incremental


Breew
25 de abril de 2015, 13:25
Hola.

Tendo datos en una tabla, y quisiera en un Cmtext introducir los primeros caracteres para conseguir encontrar los elementos que coincidan con la columna2 de la tabla.

Lo intento hacer por codigo pero no me sale.
Existe algun comando para ordenar la tabla y asi facilitar la busqueda?.


Gracias

Kuk
25 de abril de 2015, 16:56
Breew, de que tabla estamos hablando? De tabla interna COBOL o de BBDD con SQL?

Breew
25 de abril de 2015, 22:05
Hola.

En principio de una tabla interna de cobol , la recojo de una hoja excell.
Lo que quisiera es poder teclear algunos caracteres en un cmtext y recoger las posibles coincidencias en un cmList o bien en otra tabla.

Saludos.

JulioBenitez9470
26 de abril de 2015, 01:05
Yo tengo rutinas de busqueda de texto en registros de archivos, que mas o menos lo mismo, busco la existencia de una string que puede tener distintas longitudes en un campo de un archivo, por ejemplo el operardor busca "benitez julio" puede indicar que busque "b" "be" "ben" "beni" etc etc cuanto mas escriba menor sera el rango de coincidencias que vea, tambien tengo un buscador que uso con archivos de productos, que busca una string no solo en el comienzo sino en cualquier parte del texto (ej. "galletita" encontrara "CAJA DE 200 GR DE GALLETITAS SALADAS" o "GALLETITAS -LA RICA- 200 GR"
Si puede servirte mandame un correo y te envio el proyecto completo y vos usas lo que te sirva

saludos Julio

Breew
26 de abril de 2015, 12:29
Juliobenitez9470,

Hola.

Exacto, esto es lo que intento hacer.

Muchas gracias.

Saludos Cordiales

[email protected]

Kuk
26 de abril de 2015, 13:37
Breew, aqui tienes un pequeño ejemplo, el cual puedes adaptar un poco:

WORKING-STORAGE SECTION.
01 IDX-POS PIC 9(5).
01 IDX-LON PIC 9(5).
01 IDX-TBL PIC 9(5).
01 WS-TEXTO-BSQ PIC X(100).
01 TBL-LISTA.
05 TB-LISTA OCCURS 50 TIMES.
10 FILLER PIC X(100).

PROCEDURE DIVISION.

MOVE 100 TO IDX-LON

PERFORM UNTIL IDX-LON = ZEROS OR WS-TEXTO-BSQ(IDX-LON:1) NOT = SPACES
SUBTRACT 1 FROM IDX-LON
END-PERFORM

IF IDX-LON > ZEROS
MOVE 1 TO IDX-TBL

PERFORM UNTIL IDX-TBL > 50
MOVE 1 TO IDX-POS

PERFORM UNTIL (IDX-LON + IDX-POS > 100)
OR WS-TEXTO-BSQ(1:IDX-LON) = TB-LISTA(IDX-TBL)(IDX-POS:IDX-LON)
ADD 1 TO IDX-POS
END-PERFORM

IF WS-TEXTO-BSQ(1:IDX-LON) = TB-LISTA(IDX-TBL)(IDX-POS:IDX-LON)
INVOKE CmList1 "AddString" USING TB-LISTA(IDX-TBL)
END-IF

ADD 1 TO IDX-TBL
END-PERFORM
END-IF


P.D. Amigos, intentad no pasar cosas por e-mail, porque asi el resto no lo vemos.

Breew
26 de abril de 2015, 21:59
Hola Kuk.

No acabo de interpretar bien el codigo.
Lo he hecho funcionar y la busqueda la hace correctamente, pero solo encuentra la cadena si comienza por los primeros caracteres de la tabla, es decir si en la tabla tengo "KuK Administrador" si la busqueda la hago por Administrador no lo encuentra.

Es posible que sea por cambiar en tu codigo las variables IDX-1 y IDX-L ya que veo que no estan definidas en la working y tampoco acabo de entender su funcionamiento.

Saludos

Kuk
27 de abril de 2015, 09:24
Breew, perdona, ya lo he corregido. Lo del IDX-1 venia porque al principio hice el codigo, luego renombre los indices para que sea mas comprensible. Te lo he modificado añadiendo una tabla interna. Te explico el codigo:

Tenemos 3 indices, de posicion, de longitud y de ocurrencias de tabla. Lo que hacemos en el primer buscle es buscar la longitud del texto a buscar. Si el texto a buscar existe (IF IDX-LON > ZEROS), en el segundo buscle recorremos todas las ocurrencias de la tabla, dentdo del cual hay un tercer buscle donde buscamos la cadena determinada en el campo WS-TEXTO-BSQ(1:IDX-LON) dentro de la tabla interna. Al salir del tercer bucle, preguntamos si lo ha encontrado, y si es asi, pues añadimos el registro a un CmList (como ejemplo, puede ser ListView u otra tabla interna).

Breew
27 de abril de 2015, 15:43
Hola de nuevo.

Ok , Funciona Perfecto.

Realiza la busqueda de la cadena en cualquier posicion. :mola:

Muchas gracias por la paciencia.

Josber
27 de abril de 2015, 16:21
Pregunta, no sería más rapido si cambiaseis:

MOVE 100 TO IDX-LON

PERFORM UNTIL IDX-LON = ZEROS OR WS-TEXTO-BSQ(IDX-LON:1) NOT = SPACES
SUBTRACT 1 FROM IDX-LON
END-PERFORM

por:


COMPUTE IDX-LON = FUNCTION STORED-CHAR-LENGTH (WS-TEXTO-BSQ)


Ahorrariais un bucle que, en caso de que el "sitio" dónde buscar, tenga muchos registros, vendría bien, no lo he probado, pero creo que funcionaría igual de bien.

Un saludo.-

Kuk
27 de abril de 2015, 17:01
Josber, mas rapido no se si sera. Mas compacto para codificar claramente es, pero no se a partir de que version esta incluida esta funcion. Como hay gente que usa versiones diferentes a la 9.0 que uso yo...

En teoria un bucle es mas rapido que llamada + bucle (porque esa funcion debe contener un bucle por narices). Tambien no se si esa funcion necesita que el campo contenga "null terminated string". Habra que hacer una prueba. :fuma: