Buenas,
basicamente el código que habría que introducir es el siguiente:
- Código: Seleccionar todo
::: C CLOSEXXXXXXXX
*
::: C MOVEL&(1:) YZCMD P
::: C EXSR CMDEXC
::: *
::: C MOVEL&(2:) YZCMD P
::: C EXSR CMDEXC
::: *
::: C OPEN XXXXXXXX
::: *
::: C MOVEL&(3:) YZCMD P
::: C EXSR CMDEXC
::: *
::: C MOVEL&(4:) YZCMD P
::: C EXSR CMDEXC
::: *
Hay que tener en cuenta que este código debe ser lo primero en ejecutarse y que únicamente se debe ejecutar una vez (vamos cuando position = Yes, por hablar en plata).
Como veis el api tiene cuatro parametros. Estos parametros son cadenas de texto.
El primero debería contener algo así:
- Código: Seleccionar todo
OVRDBF FILE(XXXXXXXX) LVLCHK(*NO) SHARE(*YES)
El segundo es el propio OPNQRYF
- Código: Seleccionar todo
OPNQRYF FILE((XXXXXXXX *FIRST)) OPTION(*INP) QRYSLT('%XLATE(YYYYYY QSYSTRNTBL) *CT "ZZZZ" ') KEYFLD(*FILE) SEQONLY(*NO)
El tercero:
- Código: Seleccionar todo
CLOF OPNID(XXXXXXXX)
y el cuarto:
- Código: Seleccionar todo
DLTOVR FILE(XXXXXXXX)
En las cadenas pues hay que tener en cuenta que XXXXXXXX es la vista sobre la que "reposa" la funcion BlockFetch (o GetSequential).
YYYYYY en este caso representa el campo por el que queremos hacer el filtrado. En este caso lo que hacemos es ponerlo en mayusculas en tiempo de ejecución y compararlo con ZZZZ, que es la cadena que queremos buscar.
Si podeis probadlo y ya me contareis que tal. No os puedo dar mucho soporte pq la verdad es que con el código RPG y algunas cosas del as400 me pierdo, así que no me pregunteis que hace exactamente cada parametro pq no lo se.
En cuanto a las dudas sobre el rendimiento. Bueno, pues os comenta mi experiencia.
Nosotros tenemos esto sobre un fichero con 350.000 registros y el tiempo de busqueda de una cadena en todo el fichero se reduce a unos 10-15 segundo en red local. Si tenemos en cuenta que con un ScanTable tardabamos mas de 10 minutos creo que merece la pena!
Hay una consideración a tener en cuenta. Me parece que esta solucion no vale con tablas con campos virtuales, ya que en algunos casos Plex genera sus propias tablas virtuales, aunque no estoy muy seguro pues nunca he tenido necesidad de probarlo.
Un saludo.