Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Compilador] Powercobol búsqueda lenta ficheros indexados LAN (https://www.cobolforo.es/showthread.php?t=624)

Joseg 9 de mayo de 2017 00:03

Powercobol búsqueda lenta ficheros indexados LAN
 
Algunas rutinas de búsqueda en PowerCOBOL (busqueda incremental, indexed file), que están recibiendo muy lento cuando se ejecuta en un PC cliente que accede a una carpeta compartida en el servidor.
Me gustaría poder hacer esto procesamiento de búsqueda (u otra acción) en el servidor y volver a la PC cliente sólo el resultado. En Fujitsu Cobol existe el recurso Inter-application Communication Function" (cobol - sample29), pero no parece practico teniendo en cuenta que tengo que configurar los ajustes manualmente en todos los PCs. ¿Hay alguna alternativa (algo parcido con el cliente / servidor).

Gracias

Kuk 9 de mayo de 2017 09:08

Joseg, puedes crear un "Listener" / "Daemon" y ejecutarlo en servidor. Luego se puede montar un mecanismo por ficheros temporales, o más limpio pero más complicado con MSWINSCK.OCX (socket).

Joseg 10 de mayo de 2017 10:40

1 Archivos Adjunto(s)
Cita:

Citación del post de Kuk (Mensaje 3029)
Joseg, puedes crear un "Listener" / "Daemon" y ejecutarlo en servidor. Luego se puede montar un mecanismo por ficheros temporales, o más limpio pero más complicado con MSWINSCK.OCX (socket).

No sé si puede ayudar. En el evento "DataArrival" (en el servidor), no recibe una cadena como fue enviada por el cliente.
He hecho varios cambios, pero sin éxito.

Gracias

Kuk 10 de mayo de 2017 13:16

Joseg, parece ser problema de codificación de caracteres. He hecho pruebas, con los valores numéricos en campos binarios (COMP-5) todo funciona bien. El WinSock parece trabajar con strings de UNICODE. Creoq ue el problema viene de ahí. Seguiré investigando.

Joseg 10 de mayo de 2017 16:17

Cita:

Citación del post de Kuk (Mensaje 3043)
Joseg, parece ser problema de codificación de caracteres. He hecho pruebas, con los valos numéricos en campos binarios (COMP-5) todo funciona bien. El WinSock parece trabajar con strings de UNICODE. Creoq ue el problema viene de ahí. Seguiré investigando.

"Retrieves the current block of data and stores it in a variable of type variant." - Microsoft

El problema esta en la definición de una variable tipo "variante" cosa que el Powercobol no soporta.
Si funcionara resolvía mi problema.

Tengo que buscar otra alternativa.

Dasije 10 de mayo de 2017 17:09

Usa archivos secuenciales con directiva BSAM, es muy rápido.

La idea es utilizar estos archivos como si fueran "vistas", como tablas view en SQL Server, habría que estar actualizando sus datos desde sus ficheros de origen, no es necesario sacar todos los datos del archivo, solo con los datos que se vayan a mostrar en una tabla.

Hay que tener en cuenta que los controles de Windows, si tienen repintado de datos al tiempo que guardan líneas con datos, relantiza el proceso de generación de la consulta, hay que evitar este detalle, pero aún si, el control en concreto puede crear relantización por su programación.

No es lo mismo leer un archivo indexao a pelo desde una ventana consola de NetCOBOL que en el mismo PowerCOBOL, hay una gran diferencia, prueba de ello, los controles de Windows relantizan la lectura, y más aún si utilizan el método Thruevents para evitar que la ventana se quede congelada.

Salduos.

Kuk 10 de mayo de 2017 21:24

2 Archivos Adjunto(s)
Joseg, ¡¡¡lo he conseguido!!! :fuma:

Nitzer 10 de mayo de 2017 21:57

Me dejais anonadado, mañana le echare un vistazo. Cuanto queda por aprender, me da miedo

Kuk 11 de mayo de 2017 09:28

Nitzer, ¡viva el REDEFINES! :D En realidad lo que hice fue redefinir el string en un array de Integers:

Entonces en el cliente hago:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  wsmsg        pic x(24).
  5.  01  FILLER REDEFINES wsmsg.
  6.      05  wsINT OCCURS 6 TIMES PIC S9(9) COMP-5.
  7.  01  IDX-1        PIC S9(4)  COMP-5.
  8.  PROCEDURE       DIVISION.
  9.  
  10.      move "Text" OF CmText1 to wsmsg
  11.      
  12.      IF  "State" OF Winsock1 =  7
  13.          MOVE 1 TO IDX-1
  14.          
  15.          PERFORM UNTIL IDX-1 > 6        
  16.              INVOKE Winsock1 "SendData" USING wsINT(IDX-1)
  17.              
  18.              ADD 1 TO IDX-1
  19.          END-PERFORM
  20.      END-IF  

Y en el servidor:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  wsmsg        pic x(24).
  5.  01  FILLER REDEFINES wsmsg.
  6.      05  wsINT OCCURS 6 TIMES PIC S9(9) COMP-5.
  7.  01  IDX-1        PIC S9(4)  COMP-5.
  8.  LINKAGE         SECTION.
  9.  01  POW-ARG-BYTESTOTAL PIC S9(9) COMP-5.
  10.  PROCEDURE       DIVISION USING POW-ARG-BYTESTOTAL.
  11.  
  12.      MOVE 1 TO IDX-1
  13.          
  14.          PERFORM UNTIL IDX-1 > 6        
  15.              INVOKE Winsock1 "GetData" USING wsINT(IDX-1) 3
  16.              
  17.              ADD 1 TO IDX-1
  18.          END-PERFORM
  19.          
  20.      MOVE wsmsg TO "Caption" OF CmStatic9  

Joseg, según he visto, todos los tipos derivan del Variant:

Código VB:
  1. Public Const vbArray   As Microsoft.VisualBasic.VariantType = 8192
  2. Public Const vbBoolean As Microsoft.VisualBasic.VariantType = 11
  3. Public Const vbByte    As Microsoft.VisualBasic.VariantType = 17
  4. Public Const vbDate    As Microsoft.VisualBasic.VariantType = 7
  5. Public Const vbDecimal As Microsoft.VisualBasic.VariantType = 14
  6. Public Const vbLong    As Microsoft.VisualBasic.VariantType = 20
  7. Public Const vbString  As Microsoft.VisualBasic.VariantType = 8
  8. Public Const vbLong    As Microsoft.VisualBasic.VariantType = 20
  9. Public Const vbInteger As Microsoft.VisualBasic.VariantType = 3
  10. Public Const vbSingle  As Microsoft.VisualBasic.VariantType = 4

Seguro que el "String" tiene su TypeDef que se compone por campos nativos, pero no he encontrado la información necesaria, así que pensé en el REDEFINES.

Joseg 11 de mayo de 2017 10:28

¡Fantastico !!! Con esta técnica tal vez pueda resolver otros problemas que he tenido con otros OCX.


La franja horaria es GMT +2. Ahora son las 01:13.

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