Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Busqueda incremental (https://www.cobolforo.es/showthread.php?t=117)

Breew 25 de abril de 2015 13:25

Busqueda incremental
 
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:

Código COBOL:
  1.      WORKING-STORAGE SECTION.
  2.      01  IDX-POS            PIC 9(5).
  3.      01  IDX-LON            PIC 9(5).
  4.      01  IDX-TBL            PIC 9(5).
  5.      01  WS-TEXTO-BSQ       PIC X(100).
  6.      01  TBL-LISTA.
  7.          05  TB-LISTA OCCURS 50 TIMES.
  8.              10  FILLER     PIC X(100).
  9.      
  10.      PROCEDURE DIVISION.
  11.          
  12.          MOVE 100 TO IDX-LON
  13.              
  14.          PERFORM UNTIL IDX-LON = ZEROS OR WS-TEXTO-BSQ(IDX-LON:1) NOT = SPACES
  15.              SUBTRACT 1 FROM IDX-LON
  16.          END-PERFORM
  17.          
  18.          IF  IDX-LON > ZEROS
  19.              MOVE 1 TO IDX-TBL
  20.              
  21.              PERFORM UNTIL IDX-TBL > 50            
  22.                  MOVE 1 TO IDX-POS
  23.                  
  24.                  PERFORM UNTIL (IDX-LON + IDX-POS > 100)
  25.                      OR WS-TEXTO-BSQ(1:IDX-LON) = TB-LISTA(IDX-TBL)(IDX-POS:IDX-LON)
  26.                      ADD 1 TO IDX-POS
  27.                  END-PERFORM
  28.                  
  29.                  IF  WS-TEXTO-BSQ(1:IDX-LON) = TB-LISTA(IDX-TBL)(IDX-POS:IDX-LON)
  30.                      INVOKE CmList1 "AddString" USING TB-LISTA(IDX-TBL)
  31.                  END-IF            
  32.              
  33.                  ADD 1 TO IDX-TBL
  34.              END-PERFORM
  35.          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:

Código COBOL:
  1.  MOVE 100 TO IDX-LON
  2.              
  3.          PERFORM UNTIL IDX-LON = ZEROS OR WS-TEXTO-BSQ(IDX-LON:1) NOT = SPACES
  4.              SUBTRACT 1 FROM IDX-LON
  5.          END-PERFORM

por:

Código COBOL:
  1.         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:


La franja horaria es GMT +2. Ahora son las 12:16.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.