Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL (ActiveX, v4 - v11)
PowerCOBOL (ActiveX, v4 - v11) Versiones del IDE basadas en ActiveX
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Sintaxis] ADO-CONNECT-STRING Breew PowerCOBOL (ActiveX, v4 - v11) 0 24 de abril de 2022 11:23
[Sintaxis] Convertir DECIMAL a NUMERO para COBOL Dasije WinDev 0 11 de agosto de 2019 23:44
[Sintaxis] Tipo de dato decimal en mysql... Fito PowerCOBOL (ActiveX, v4 - v11) 8 4 de mayo de 2018 14:54
[Herramienta] DECIMAL-POINT IS COMMA en Cobview Gatomalo COBOL - General 1 3 de mayo de 2018 05:06
[Sintaxis] Duda sobre STRING e INSPECT Anthony AcuCobol 2 9 de abril de 2015 20:18

Respuesta
 
Herramientas

  #1
Antiguo 5 de mayo de 2022, 12:05
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179
Idea String para Decimal
0 Inactivo Inactivo

Necessito de achar um valor único de uma string, para criar uma chave, já que chaves primarias ou alternadas tem um limite máximo de 255 bytes.

Calcular o valor ASCII do mesmo poderia ser uma possibilidade...

Esta função:
Código COBOL:
  1.      FUNCTION ORD (argument-1)

é uma possiblidade mas necessito de percorrer uma string grande, tipo:
Código COBOL:
  1.      01 wmyvar pic x(3000).
fica lento.
Conhecem alguma alternativa?

Gracias,
Joseg is offline   Responder Con Cita
  #2
Antiguo 5 de mayo de 2022, 15:42
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Citación del post de Joseg Ver Mensaje
fica lento.
¿Cómo lo haces? Prueba algo así:

Código COBOL:
  1.      01 wmyvar pic x(3000).
  2.      01 filler redefines wmyvar.
  3.         05  byte occurs 3000  pic 9(2) comp-5.
  4.      
  5.      01 idx-1      pic 9(4) comp-5.
  6.      01 suma       pic 9(9) comp-5.
  7.      procedure division.
  8.        
  9.         move 1 to idx-1
  10.         move 0 to suma
  11.        
  12.         perform until idx-1 > length of wmyvar
  13.             add byte(idx-1) to suma
  14.  
  15.             add 1 to idx-1
  16.         end-perform
  17.        

También mira esto a ver si dura menos, el cálculo será diferente pero puede servir igual creo:

Código COBOL:
  1.      01 wmyvar pic x(3000).
  2.      01 filler redefines wmyvar.
  3.         05  byte occurs 1500  pic 9(4) comp-5.
  4.      
  5.      01 idx-1      pic 9(4) comp-5.
  6.      01 suma       pic 9(9) comp-5.
  7.      procedure division.
  8.        
  9.         move 1 to idx-1
  10.         move 0 to suma
  11.        
  12.         perform until idx-1 > 1500
  13.             add byte(idx-1) to suma
  14.  
  15.             add 1 to idx-1
  16.         end-perform
  17.        

Código COBOL:
  1.      01 wmyvar pic x(3000).
  2.      01 filler redefines wmyvar.
  3.         05  byte occurs 750  pic 9(9) comp-5.
  4.      
  5.      01 idx-1      pic 9(4) comp-5.
  6.      01 suma       pic 9(18) comp-5.
  7.      procedure division.
  8.        
  9.         move 1 to idx-1
  10.         move 0 to suma
  11.        
  12.         perform until idx-1 > 750
  13.             add byte(idx-1) to suma
  14.  
  15.             add 1 to idx-1
  16.         end-perform
  17.        



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #3
Antiguo 10 de mayo de 2022, 13:50
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Ainda não tenho a solução para o problema.

Pretendia que a string:
"101.10.01"
fosse SEMPRE diferente de:
"101.10.10"

...e tenho casos em que o cálculo dá o mesmo valor.

Gracias por qualquer ajuda.


Citación del post de Kuk Ver Mensaje
¿Cómo lo haces? Prueba algo así:

Código COBOL:
  1.      01 wmyvar pic x(3000).
  2.      01 filler redefines wmyvar.
  3.         05  byte occurs 3000  pic 9(2) comp-5.
  4.      
  5.      01 idx-1      pic 9(4) comp-5.
  6.      01 suma       pic 9(9) comp-5.
  7.      procedure division.
  8.        
  9.         move 1 to idx-1
  10.         move 0 to suma
  11.        
  12.         perform until idx-1 > length of wmyvar
  13.             add byte(idx-1) to suma
  14.  
  15.             add 1 to idx-1
  16.         end-perform
  17.        

También mira esto a ver si dura menos, el cálculo será diferente pero puede servir igual creo:

Código COBOL:
  1.      01 wmyvar pic x(3000).
  2.      01 filler redefines wmyvar.
  3.         05  byte occurs 1500  pic 9(4) comp-5.
  4.      
  5.      01 idx-1      pic 9(4) comp-5.
  6.      01 suma       pic 9(9) comp-5.
  7.      procedure division.
  8.        
  9.         move 1 to idx-1
  10.         move 0 to suma
  11.        
  12.         perform until idx-1 > 1500
  13.             add byte(idx-1) to suma
  14.  
  15.             add 1 to idx-1
  16.         end-perform
  17.        

Código COBOL:
  1.      01 wmyvar pic x(3000).
  2.      01 filler redefines wmyvar.
  3.         05  byte occurs 750  pic 9(9) comp-5.
  4.      
  5.      01 idx-1      pic 9(4) comp-5.
  6.      01 suma       pic 9(18) comp-5.
  7.      procedure division.
  8.        
  9.         move 1 to idx-1
  10.         move 0 to suma
  11.        
  12.         perform until idx-1 > 750
  13.             add byte(idx-1) to suma
  14.  
  15.             add 1 to idx-1
  16.         end-perform
  17.        
Joseg is offline   Responder Con Cita
  #4
Antiguo 10 de mayo de 2022, 15:36
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@Joseg, prueba con la última versión, la de byte occurs 750 pic 9(9) comp-5. porque ahí toma 4 bytes con lo cual también tiene en cuenta el orden.

A mi me funciona, mira el ejemplo que has dado da diferente resultado con el método que digo:
Código:
PIC X(12) VALUE "101.10.01" --> 00000000002122285203
PIC X(12) VALUE "101.10.10" --> 00000000002139062418



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #5
Antiguo 10 de mayo de 2022, 16:34
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Citación del post de Kuk Ver Mensaje
@Joseg, prueba con la última versión, la de byte occurs 750 pic 9(9) comp-5. porque ahí toma 4 bytes con lo cual también tiene en cuenta el orden.

A mi me funciona, mira el ejemplo que has dado da diferente resultado con el método que digo:
Código:
PIC X(12) VALUE "101.10.01" --> 00000000002122285203
PIC X(12) VALUE "101.10.10" --> 00000000002139062418
Com um exemplo fica mais fácil testar !
Archivos Adjuntos
Tipo de Archivo: zip exemplo.zip (4,9 KB)Descargas: 44
Joseg is offline   Responder Con Cita
  #6
Antiguo 10 de mayo de 2022, 16:51
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Citación del post de Joseg Ver Mensaje
Com um exemplo fica mais fácil testar !
A ordem como os códigos (121-05-10;...) são colocados na string , pode ser um diferenciador.
Joseg is offline   Responder Con Cita
  #7
Antiguo 10 de mayo de 2022, 17:44
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@Joseg,

MainForm -> EDIT PROCEDURE DIVISION -> NEW, renombra en PRC-CALC

Edita y pega esto:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 idx-1        pic 9(4) comp-5.
  5.  01 wsomamodelos pic 9(18) comp-5.
  6.  
  7.  LINKAGE SECTION.
  8.  01  LNK-DATOS.
  9.      05  LNK-INPUT    PIC X(3000).
  10.      05  filler redefines LNK-INPUT.
  11.          10  byte occurs 750 pic 9(8) comp-5.
  12.      05  LNK-OUTPUT   PIC 9(18).
  13.      
  14.  PROCEDURE       DIVISION USING LNK-DATOS.
  15.      
  16.      move 1 to idx-1
  17.      move function current-date(5:12) to LNK-OUTPUT
  18.      
  19.      perform until idx-1 > 750
  20.          add byte(idx-1) to wsomamodelos
  21.  
  22.          add 1 to idx-1
  23.      end-perform
  24.      
  25.      add wsomamodelos to LNK-OUTPUT
  26.      
  27.      display LNK-OUTPUT

Código del botón Nº1:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  LNK-DATOS.
  5.      05  LNK-INPUT    PIC X(3000).    
  6.      05  LNK-OUTPUT   PIC 9(18).
  7.  
  8.  PROCEDURE       DIVISION.
  9.  
  10.       MOVE "Text" OF CmText1 TO LNK-INPUT
  11.  
  12.       perform 5 times *> PARA TEST RAPIDO
  13.           CALL "PRC-CALC" USING LNK-DATOS
  14.       end-perform
  15.      
  16.       MOVE LNK-OUTPUT TO "Text" OF CmText3  

Código del botón Nº2:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  
  5.  01  LNK-DATOS.
  6.      05  LNK-INPUT    PIC X(3000).    
  7.      05  LNK-OUTPUT   PIC 9(18).
  8.  
  9.  PROCEDURE       DIVISION.
  10.  
  11.       MOVE "Text" OF CmText2 TO LNK-INPUT
  12.  
  13.       CALL "PRC-CALC" USING LNK-DATOS
  14.      
  15.       MOVE LNK-OUTPUT TO "Text" OF CmText4  



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #8
Antiguo 10 de mayo de 2022, 17:58
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Citación del post de Kuk Ver Mensaje
@Joseg,

MainForm -> EDIT PROCEDURE DIVISION -> NEW, renombra en PRC-CALC

Edita y pega esto:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 idx-1        pic 9(4) comp-5.
  5.  01 wsomamodelos pic 9(18) comp-5.
  6.  
  7.  LINKAGE SECTION.
  8.  01  LNK-DATOS.
  9.      05  LNK-INPUT    PIC X(3000).
  10.      05  filler redefines LNK-INPUT.
  11.          10  byte occurs 750 pic 9(8) comp-5.
  12.      05  LNK-OUTPUT   PIC 9(18).
  13.      
  14.  PROCEDURE       DIVISION USING LNK-DATOS.
  15.      
  16.      move 1 to idx-1
  17.      move function current-date(5:12) to LNK-OUTPUT
  18.      
  19.      perform until idx-1 > 750
  20.          add byte(idx-1) to wsomamodelos
  21.  
  22.          add 1 to idx-1
  23.      end-perform
  24.      
  25.      add wsomamodelos to LNK-OUTPUT
  26.      
  27.      display LNK-OUTPUT

Código del botón Nº1:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  LNK-DATOS.
  5.      05  LNK-INPUT    PIC X(3000).    
  6.      05  LNK-OUTPUT   PIC 9(18).
  7.  
  8.  PROCEDURE       DIVISION.
  9.  
  10.       MOVE "Text" OF CmText1 TO LNK-INPUT
  11.  
  12.       perform 5 times *> PARA TEST RAPIDO
  13.           CALL "PRC-CALC" USING LNK-DATOS
  14.       end-perform
  15.      
  16.       MOVE LNK-OUTPUT TO "Text" OF CmText3  

Código del botón Nº2:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  
  5.  01  LNK-DATOS.
  6.      05  LNK-INPUT    PIC X(3000).    
  7.      05  LNK-OUTPUT   PIC 9(18).
  8.  
  9.  PROCEDURE       DIVISION.
  10.  
  11.       MOVE "Text" OF CmText2 TO LNK-INPUT
  12.  
  13.       CALL "PRC-CALC" USING LNK-DATOS
  14.      
  15.       MOVE LNK-OUTPUT TO "Text" OF CmText4  
Gracias pela ajuda !!!

Entendo a ideia. Mas não posso usar.
Eu quero mais tarde validar o registo voltando a calcular o valor original tendo por base esta string "121-03-10;121-17-00;121-03-10;121-17-00;121-05-01;", para ver se o registo já existe.

Se a "primary key" não tivesse o limite de apenas 255 bytes (ficheiros ISAM), não tinha este problema. Simplesmente definia como chave única:
Código COBOL:
  1. 01 wmodelosori PIC X(3000).
e tinha o problema resolvido.
Mas como a String pode conter até 3000 bytes tenho que procurar outra solução.
Joseg is offline   Responder Con Cita
  #9
Antiguo 10 de mayo de 2022, 20:46
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@Joseg, creo que lo he arreglado:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 idx-1        pic 9(4) comp-5.
  5.  01 wsomamodelos pic 9(18) comp-5.
  6.  
  7.  LINKAGE SECTION.
  8.  01  LNK-DATOS.
  9.      05  LNK-INPUT    PIC X(3000).
  10.      05  filler redefines LNK-INPUT.
  11.          10  byte occurs 750 pic 9(8) comp-5.
  12.      05  LNK-OUTPUT   PIC 9(18).
  13.      
  14.  PROCEDURE       DIVISION USING LNK-DATOS.
  15.      
  16.      move 1 to idx-1
  17.      move 0 to LNK-OUTPUT, wsomamodelos
  18.      
  19.      
  20.      perform until idx-1 > 750
  21.          COMPUTE wsomamodelos = wsomamodelos + byte(idx-1) * idx-1
  22.  
  23.          add 1 to idx-1
  24.      end-perform
  25.      
  26.      MOVE wsomamodelos to LNK-OUTPUT
  27.      
  28.      display LNK-OUTPUT

Es que estábamos tontos macho, con la SUMA no vale, y lo sabemos desde el cole

Citación del post de Mates Básicas
Propiedad conmutativa de la suma: cambiar el orden de los sumandos no altera la suma



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #10
Antiguo 11 de mayo de 2022, 11:21
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Citación del post de Kuk Ver Mensaje
@Joseg, creo que lo he arreglado:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 idx-1        pic 9(4) comp-5.
  5.  01 wsomamodelos pic 9(18) comp-5.
  6.  
  7.  LINKAGE SECTION.
  8.  01  LNK-DATOS.
  9.      05  LNK-INPUT    PIC X(3000).
  10.      05  filler redefines LNK-INPUT.
  11.          10  byte occurs 750 pic 9(8) comp-5.
  12.      05  LNK-OUTPUT   PIC 9(18).
  13.      
  14.  PROCEDURE       DIVISION USING LNK-DATOS.
  15.      
  16.      move 1 to idx-1
  17.      move 0 to LNK-OUTPUT, wsomamodelos
  18.      
  19.      
  20.      perform until idx-1 > 750
  21.          COMPUTE wsomamodelos = wsomamodelos + byte(idx-1) * idx-1
  22.  
  23.          add 1 to idx-1
  24.      end-perform
  25.      
  26.      MOVE wsomamodelos to LNK-OUTPUT
  27.      
  28.      display LNK-OUTPUT

Es que estábamos tontos macho, con la SUMA no vale, y lo sabemos desde el cole

"Es que estábamos tontos macho, con la SUMA no vale, y lo sabemos desde el cole"

Agora si !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!

Muitas muitas gracias Kuk
Joseg is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:10.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.