Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Escritura distinta de un programa COBOL


jorgeamedina2020
20 de marzo de 2023, 15:36
Hola queridos Amigos y Colegas, estoy aquí nuevamente para compartir una inquietud muy especial en cuanto al tipo de escritura de un programa cobol, si, tipo de escritura, y pasare a explicar el tema.

En una escritura normal de un programa y dependiendo del dialecto cobol que se use como compilador, la forma estándar o básica o de reglamento si se puede decir así seria la siguiente (Ejemplo simple)

DATA DIVISION.
WORKING-STORE SECTION.
01 CAMPO1 PIC 9(01).
01 CAMPO2 PIC 9(01).
01 CAMPO3 PIC 9(01).
01 CAMPO4 PIC 9(01).
01 CAMPO5 PIC 9(01).


PROCEDURE DIVISION.
MOVE 1 TO CAMPO1.
MOVE 1 TO CAMPO2.
MOVE 1 TO CAMPO3.
MOVE 1 TO CAMPO4.
MOVE 1 TO CAMPO5.
DISPLAY CAMPO1.

EXIT PROGRAM.


Ahora, el tema es el siguiente, debido a que uno quiere ahorrar linea de programación, o achicar el programa cobol para tener menos lineas así pueda ser compilado con mas instrucciones y menos lineas se haría esto:

DATA DIVISION.
WORKING-STORE SECTION.
01 CAMPO1 PIC 9(01). 01 CAMPO2 PIC 9(01). 01 CAMPO3 PIC 9(01).
01 CAMPO4 PIC 9(01). 01 CAMPO5 PIC 9(01).


PROCEDURE DIVISION.
MOVE 1 TO CAMPO1. MOVE 1 TO CAMPO2. MOVE 1 TO CAMPO3.
MOVE 1 TO CAMPO4. MOVE 1 TO CAMPO5.
DISPLAY CAMPO1.

EXIT PROGRAM.


Que opinan de esto?, déjeme contarles que Yo, puedo hacer esto usando Micro Focus Cobol, creo que hay una instrucción o paramento o algo que le indica al lenguaje que interprete una linea conteniendo varias instrucciones y no solo una. Siempre aprendimos que en cada linea va una definición de variable o archivo o tabla y también un procedimiento por linea, pero como vemos aquí,
en una linea hay varias definiciones y procedimientos, como fije antes, En Micro Focus Funciona y muy bien, esto me ayudo a crear programas mas grandes, con mas contenido de definiciones y procedimientos y a la vez con menos lineas o renglones para compilar.

La pregunta iría dirigida a todos los demás lenguajes o mejor dicho a todos los dialectos de cobol, como AcuCobol, RmCobol, IbmCobol, etc, etc, etc.
Mas en particular me gustaría saber si en AcuCobol se puede indicar de algún modo mediante paramentos o condiciones al compilador o al entorno para que interprete esta forma de trabajo, actualmente dan error al compilar.

Seria bueno que hagan pruebas con sus lenguajes y comenten que descubrieron y si encuentran o saben como hacer que los demás dialectos interpreten esto comenten , es importante conocer este tema y compartir con los demas.
Atte Jorge.

Josber
20 de marzo de 2023, 17:03
A ver @jorgeamedina2020, sin que lo consideres un insulto porque nada más lejos de mi intención, me parece esa forma de escribir código "una marraná", a parte de que se quedaría el programa poco claro a la hora de leerlo por ti o por cualquier otra persona, también te digo que, en la PROCEDURE DIVISION, puedes escribir el código casi como quieras, pero la WORKING, tiene unas normas muy estrictas, una de ellas es que "Todo campo a nivel 77 ó 01, ha de empezar en el área A", o lo que es lo mismo, en las columnas 8 a 11, si en vez del COBOL actual, usaras COBOL-74 o COBOL-85, no te funcionaría ni de suerte, en esas versiones, tenías que respetar mucho las áreas A B y C, (columnas 8 a 11, 12 a 72 y 73 a 80 respectivamente).

Por otro lado, imagínate que haces un programa de esa manera y, dentro de seis meses, un año, cuando sea, necesitas modificar algo, te vas a volver loco intentando encontrarlo. El profesor que yo tuve de COBOL, a mediados de los 80, lo tenía muy claro, tu programa podía trabajar mejor que ninguno pero, como no estuviese escrito claro, con sus indentaciones, sus espacios, cambios de línea, comentarios, etc, estabas suspendido. Sólo tienes que descargarte cualquiera de los ejemplos que yo he subido y verás que es casi obsesivo en mí poner indentaciones, saltos de línea, etc, sin importar el largo del programa, eso es lo de menos hoy en día, el compilador, lo va a leer como si fuese un churro todo seguido y creo que nadie se me ha quejado por eso.

Un salu2.-

jorgeamedina2020
20 de marzo de 2023, 17:33
@Josber, Hola, gracias por tu respuesta sincera, primero no me parece que mi escritura sea (una marrana), segundo son mis programas y nadie debería verlos o acceder mas que yo porque son de mi propiedad intelectual y tercero con respecto a las normas... porque mi compilador me lo permite hacer?, buena pregunta verdad!!!,
Este ejemplo que te comparto lo hice hace varios años atrás, y justo ahora salio una modificación y se hizo al toque sin demorar nada, por que?, por conozco mis programas como los hice, asi de facir.
Mira esto:

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. PC-IBM.
OBJECT-COMPUTER. PC-IBM.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY EMPRESA.SEL. COPY MOVDEU.SEL. COPY CODICOMP.SEL.
COPY VENDEDOR.SEL. COPY CONDVTAS.SEL. COPY LOCALIDA.SEL.
COPY PROVIN.SEL. COPY ZONAS.SEL. COPY CLIENTES.SEL.
COPY PROVEDOR.SEL. COPY MARCAS.SEL. COPY RUBROS.SEL.
COPY ARTICULO.SEL. COPY TRANSPOR.SEL.
COPY PROVCOMI.SEL. COPY RUBRCOMI.SEL.
SELECT AAAA ASSIGN TO DISK
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS AA-CLAVE = AA-CODI
AA-ORDE
ALTERNATE RECORD KEY IS AA-CLAVE1 = AA-DESC
AA-CODI
AA-ORDE
WITH DUPLICATES
ALTERNATE RECORD KEY IS AA-CLAVE2 = AA-CANT
AA-CODI
AA-ORDE
WITH DUPLICATES
ALTERNATE RECORD KEY IS AA-CLAVE3 = AA-IMPO
AA-CODI
AA-ORDE
WITH DUPLICATES
FILE STATUS IS FF.
SELECT BBBB ASSIGN TO DISK
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS BB-CLAVE = BB-CODI
BB-CODI2
ALTERNATE RECORD KEY IS BB-CLAVE1 = BB-DESC
BB-CODI
BB-DESC2
BB-CODI2
WITH DUPLICATES
ALTERNATE RECORD KEY IS BB-CLAVE2 = BB-CODI
BB-CANT2
BB-CODI2
WITH DUPLICATES
ALTERNATE RECORD KEY IS BB-CLAVE3 = BB-CODI
BB-IMPO2
BB-CODI2
WITH DUPLICATES
FILE STATUS IS FF.
SELECT CCCC ASSIGN TO DISK
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS CC-CLAVE = CC-CODI
CC-ORDE
FILE STATUS IS FF.
SELECT TXT1 ASSIGN TO DISK
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FF.
SELECT TXT2 ASSIGN TO DISK
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FF.
SELECT IMPRES ASSIGN TO "C:TEMPESTAVTAS"
FILE STATUS IS FF.
COPY MOVOBA00.SEL.
COPY MOVOBA02.SEL.
*±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±±±±±±±±±±±±±±±
DATA DIVISION.
FILE SECTION.
COPY EMPRESA.REC. COPY MOVDEU.REC. COPY CODICOMP.REC.
COPY VENDEDOR.REC. COPY CONDVTAS.REC. COPY LOCALIDA.REC.
COPY PROVIN.REC. COPY ZONAS.REC. COPY CLIENTES.REC.
COPY PROVEDOR.REC. COPY MARCAS.REC. COPY RUBROS.REC.
COPY ARTICULO.REC. COPY TRANSPOR.REC.
COPY PROVCOMI.REC. COPY RUBRCOMI.REC.
FD AAAA
LABEL RECORD IS STANDARD
VALUE OF FILE-ID IS "C:TEMPAAAA.DAT".
01 R-AAAA.
02 AA-ORDE PIC 9(01).
02 AA-CODI PIC X(14).
02 AA-DESC PIC X(50).
02 AA-CANT PIC S9(05)V999.
02 AA-IMPO PIC S9(10)V99.
02 AA-COST PIC S9(10)V99.
opci 02 AA-PCOM PIC 9(03)V99.
opci 02 AA-ICOM PIC S9(10)V99.
02 AA-COST-SF PIC S9(10)V99.
FD BBBB
LABEL RECORD IS STANDARD
VALUE OF FILE-ID IS "C:TEMPBBBB.DAT".
01 R-BBBB.
02 BB-CODI PIC X(14).
02 BB-DESC PIC X(50).
02 BB-CANT PIC S9(05)V999.
02 BB-IMPO PIC S9(10)V99.
02 BB-COST PIC S9(10)V99.
opci 02 BB-PCOM PIC 9(03)V99.
opci 02 BB-ICOM PIC S9(10)V99.
02 BB-CODI2 PIC X(14).
02 BB-DESC2 PIC X(50).
02 BB-CANT2 PIC S9(05)V999.
02 BB-IMPO2 PIC S9(10)V99.
02 BB-COST2 PIC S9(10)V99.
opci 02 BB-PCOM2 PIC 9(03)V99.
opci 02 BB-ICOM2 PIC S9(10)V99.
02 BB-COST-SF PIC S9(10)V99.
02 BB-COST2-SF PIC S9(10)V99.
FD CCCC
LABEL RECORD IS STANDARD
VALUE OF FILE-ID IS "C:TEMPCCCC.DAT".
01 R-CCCC.
02 CC-ORDE PIC 9(01).
02 CC-CODI PIC X(14).
02 CC-DESC PIC X(50).
02 CC-CANT PIC S9(05)V999.
02 CC-IMPO PIC S9(10)V99.
FD TXT1
LABEL RECORD IS STANDARD
VALUE OF FILE-ID IS "C:TEMPESTAVTAS".
01 R-TXT1.
02 X1-LONG PIC X(159).
FD TXT2
LABEL RECORD IS STANDARD
VALUE OF FILE-ID IS "C:TEMPESTAVTAS.XLS".
01 R-TXT2.
02 X2-LONG.
* 03 X2-01 PIC X.
* 03 X2-ORDE PIC X(04).
* 03 X2-02 PIC X.
* 03 X2-CODI PIC X(14).
* 03 X2-03 PIC X.
* 03 X2-DESC PIC X(50).
* 03 X2-04 PIC X.
* 03 FILLER PIC X(31).
* 03 X2-05 PIC X.
* 03 X2-COST PIC 999,999,999.99-.
* 03 X2-06 PIC X.
* 03 X2-CANT PIC 99999-.
* 03 X2-07 PIC X.
* 03 X2-IMPO PIC 999,999,999.99-.
* 03 X2-08 PIC X.
* 03 X2-PORC PIC 999.99-.
* 03 X2-09 PIC X.
* 03 FILLER PIC X(10).

03 X2-ORDE PIC X(04).
03 X2-01 PIC X.
03 X2-CODI PIC X(14).
03 X2-02 PIC X.
03 X2-DESC PIC X(50).
03 X2-03 PIC X.
03 FILLER PIC X(08).
03 X2-04 PIC X.
opci 03 X2-PCOM PIC 999.99.
03 X2-05 PIC X.
opci 03 X2-ICOM PIC 999,999,999.99-.
03 X2-06 PIC X.
03 X2-COST PIC 999,999,999.99-.
03 X2-07 PIC X.
03 X2-CANT PIC 99999-.
03 X2-08 PIC X.
03 X2-IMPO PIC 999,999,999.99-.
03 X2-09 PIC X.
03 X2-PORC PIC 999.99-.
03 X2-10 PIC X.
03 FILLER PIC X(10).
FD IMPRES
LABEL RECORD IS OMITTED
LINAGE IS 66 LINES.
01 R-IMPRES PIC X(159).
*ESPE* VERTICAL...
*ESPE* 63 lineas - 79 columnas - 80 comando
*ESPE* 77 lineas - 95 columnas - 96 comando
*ESPE* 96 lineas - 129 columnas - 120 comando
*ESPE* 110 lineas - 136 columnas - 140 comando
*ESPE* 129 lineas - 159 columnas - 160 comando
*ESPE* HORIZONTAL...
*ESPE* 68 lineas - 159 columnas - 120 comando
*ESPE* 00 lineas - 000 columnas - 140 comando
*ESPE* 86 lineas - 225 columnas - 160 comando
COPY MOVOBA00.REC.
COPY MOVOBA02.REC.
WORKING-STORAGE SECTION.
Status 01 FF PIC XX.
" 88 FF-POS VALUE "00" "02" "10" "22" "23" "9A" "9D".
" 88 FF-OK VALUE "00" "02". 88 FF-FIN VALUE "10".
" 88 FF-DUP VALUE "22". 88 FF-INE VALUE "23".
" 88 FF-ALU VALUE "9A". 88 FF-RLU VALUE "9D".
" 01 M-ARC PIC X(08). 01 M-ERR PIC X(30).
Teclas 01 TEC PIC XX.
" 88 T-POS VALUE "00" "01" "02" "05" "53" "54".
" 88 T-RET VALUE "00". 88 T-ESC VALUE "01". 88 T-F1 VALUE "02".
" 88 T-ARR VALUE "53". 88 T-ABA VALUE "54". 88 T-F4 VALUE "05".
FunTec 01 Z-CAR PIC 9(2) COMP-X.
" 01 Z-STA.
" 02 Z-STA1 PIC X.
" 02 Z-STA2 PIC 9(2) COMP-X.
" 02 Z-STA3 PIC 9(2) COMP-X.
| 01 Z-FUN PIC 9(02) COMP-X. 01 Z-PAR. 03 Z-LON PIC 9(04) COMP-X.
| 03 Z-POS PIC 9(04) COMP-X. 03 Z-BAF PIC 9(04) COMP-X.
| 01 Z-CARA PIC X(2000). 01 Z-ATRI PIC X(2000).
| 01 Z-CARA1 PIC X(2000). 01 Z-ATRI1 PIC X(2000).
01 A-FECHA. 03 A-DIA PIC 99. 03 A-MES PIC 99. 03 A-ANO PIC 9999.
01 A-FECHAX REDEFINES A-FECHA PIC 9(08).
01 W-FECHA. 03 W-ANO PIC 9999. 03 W-MES PIC 99. 03 W-DIA PIC 99.
01 W-FECHAX REDEFINES W-FECHA PIC 9(08).
01 Z-FECHA. 03 Z-ANO PIC 99. 03 Z-MES PIC 99. 03 Z-DIA PIC 99.
01 FEC PIC 9(8). 01 FEC1 PIC 9(8). 01 FEC2 PIC 9(8).
01 HOR. 03 HOR1 PIC 99. 03 HOR2 PIC 99. 03 HOR3 PIC 99.
01 HORX REDEFINES HOR PIC 9(06).
01 X PIC 9(1). 01 X1 PIC 9(1). 01 X2 PIC 9(1). 01 X3 PIC 9(1).
01 OPC PIC 9(2). 01 MENS1 PIC X(12). 01 MENS2 PIC X(12).
N4 01 D-CODI PIC X(14). 01 H-CODI PIC X(14). 01 MENS3 PIC X(12).
N4 01 D-CODI1 PIC 9(04). 01 H-CODI1 PIC 9(04). 01 COIM PIC 9(4).
N6 01 D-CODI2 PIC 9(06). 01 H-CODI2 PIC 9(06). 01 FEIM PIC 9(8).
A14 01 D-CODI3 PIC X(14). 01 H-CODI3 PIC X(14). 01 ESTA PIC 9.
01 D-FECH PIC 9(08). 01 H-FECH PIC 9(08). 01 COMI PIC 9.
01 D-FECH1 PIC 9(08). 01 H-FECH1 PIC 9(08). 01 TODO PIC X.
01 ORDE PIC 9. 01 MODO PIC 9. 01 VIST PIC 9. 01 BAN PIC 9.
01 D-FE PIC 9(8). 01 H-FE PIC 9(8). 01 XORD PIC 9. 01 BAN2 PIC 9.
01 EMP PIC X(30). 01 DOM PIC X(30). 01 XORDX PIC 9.
01 SEN PIC 9. 01 PAG PIC 9(4). 01 MEMOCL PIC X(100).
01 CORT PIC X(14). 01 CORTX PIC X(50). 01 COSF PIC 9.
01 SINO PIC X(01). 88 POSI VALUE "S" "s" "N" "n".
88 SISI VALUE "S" "s". 88 NONO VALUE "N" "n".
01 ZZ-RES PIC 9(02) COMP-X. 01 ZZ-FUN PIC 9(02) COMP-X VALUE 35.
01 ZZ-PAR. 03 ZZ-PAR1 PIC 9(02) COMP-X VALUE 0. 03 ZZ-PAR2 PIC X.

MesAct 01 TOT-CANT PIC S9(06)V999. 01 TOT-IMPO PIC S9(10)V99 .
01 TOT-COST PIC S9(10)V99 .
01 TOT-ICOM PIC S9(10)V99 .
01 TOT-COST-SF PIC S9(10)V99 .
MesAnt 01 TOT-CANTT PIC S9(06)V999. 01 TOT-IMPOO PIC S9(10)V99 .
01 TOT-COSTT PIC S9(10)V99 .
01 TOT-ICOMM PIC S9(10)V99 .
01 TOT-COSTT-SF PIC S9(10)V99 .
MesAct 01 TOT1-CANT PIC S9(06)V999. 01 TOT1-IMPO PIC S9(10)V99.
01 TOT1-COST PIC S9(10)V99.
01 TOT1-ICOM PIC S9(10)V99.
01 TOT1-COST-SF PIC S9(10)V99.
MesAnt 01 TOT1-CANTT PIC S9(06)V999. 01 TOT1-IMPOO PIC S9(10)V99.
01 TOT1-COSTT PIC S9(10)V99.
01 TOT1-ICOMM PIC S9(10)V99.
01 TOT1-COSTT-SF PIC S9(10)V99.
MesAct 01 TOT2-CANT PIC S9(06)V999. 01 TOT2-IMPO PIC S9(10)V99.
01 TOT2-COST PIC S9(10)V99.
01 TOT2-ICOM PIC S9(10)V99.
01 TOT2-COST-SF PIC S9(10)V99.
MesAnt 01 TOT2-CANTT PIC S9(06)V999. 01 TOT2-IMPOO PIC S9(10)V99.
01 TOT2-COSTT PIC S9(10)V99.
01 TOT2-ICOMM PIC S9(10)V99.
01 TOT2-COSTT-SF PIC S9(10)V99.
01 CANITE PIC 9(6). 01 CANITET PIC 9(6).
01 AUX PIC S9(10)V99. 01 AUX1 PIC S9(10)V99.
01 AUX2 PIC S9(10)V99. 01 AUX3 PIC S9(10)V99.
01 AUX4 PIC S9(10)V99. 01 AUX5 PIC S9(10)V99.
01 COM1 PIC 9(3)V99. 01 COM2 PIC 9(3)V99. 01 COM3 PIC 9(3)V99.
01 PCLI PIC 9(4). 01 ZCLI PIC ZZZ9. 01 PORC PIC S9(3)V99.
01 PPED PIC 9(4). 01 ZPED PIC ZZZ9.
01 PCAM PIC 9(3)V99. 01 ZCAM PIC ZZ9.99.
01 PREI PIC 9(3)V99. 01 ZREI PIC ZZ9.99.

01 G1-IMPO PIC S9(10)V99. 01 G1-IMPOO PIC S9(10)V99.
01 G2-IMPO PIC S9(10)V99. 01 G2-IMPOO PIC S9(10)V99.
01 G3-IMPO PIC S9(10)V99. 01 G3-IMPOO PIC S9(10)V99.

01 Z1-IMPO PIC S9(10)V99. 01 Z1-IMPOO PIC S9(10)V99.
01 Z2-IMPO PIC S9(10)V99. 01 Z3-IMPO PIC S9(10)V99.
01 OBRA PIC 9. 01 OBRA2 PIC 9.
01 X-VEND PIC 9(4). 01 X-VENDX PIC X(30). 01 X-VENDZ PIC 9(3)V99.
01 X-COND PIC 9(04). 01 X-CONDX PIC X(30).
01 X-LOCA PIC 9(06). 01 X-LOCAX PIC X(30).
01 X-PCIA PIC 9(04). 01 X-PCIAX PIC X(30).
01 X-ZONA PIC 9(04). 01 X-ZONAX PIC X(30).
01 X-CLIE PIC 9(04). 01 X-CLIEX PIC X(30).
01 X-PROV PIC 9(04). 01 X-PROVX PIC X(30).
01 X-MARC PIC 9(04). 01 X-MARCX PIC X(30).
01 X-RUBR PIC 9(04). 01 X-RUBRX PIC X(30).
01 X-ARTI PIC X(14). 01 X-ARTIX PIC X(30).
01 X-CANT PIC 9(05)V999. 01 X-IMPO PIC 9(10)V99.
01 X-TIVA PIC 9(03)V99. 01 X-COST PIC 9(10)V99.

INI.
OPEN INPUT EMPRESA . MOVE "EMPRESA " TO M-ARC.
IF NOT FF-OK PERFORM VER-ERR GO FIN.
MOVE EM TO E-CLAVE. READ EMPRESA .
IF NOT FF-OK PERFORM VER-ERR CLOSE EMPRESA GO FIN.
MOVE E-RAZON TO EMP. MOVE E-DOMICI TO DOM.
MOVE E-FECHA TO FEC A-FECHA.
MOVE A-DIA TO W-DIA. MOVE A-MES TO W-MES.
MOVE A-ANO TO W-ANO. MOVE W-FECHAX TO FEC1.
CLOSE EMPRESA .
MOVE 01 TO OPC.
Opci INA.
MOVE 99 TO TEC. DISPLAY P-OPC.
IF OPC = 01 DISPLAY P-OPC01. IF OPC = 02 DISPLAY P-OPC02.
IF OPC = 03 DISPLAY P-OPC03. IF OPC = 04 DISPLAY P-OPC04.
IF OPC = 05 DISPLAY P-OPC05. IF OPC = 06 DISPLAY P-OPC06.
IF OPC = 07 DISPLAY P-OPC07. IF OPC = 08 DISPLAY P-OPC08.
IF OPC = 09 DISPLAY P-OPC09. IF OPC = 10 DISPLAY P-OPC10.
PERFORM LEO-TEC UNTIL T-POS. IF T-ESC GO FIN.
IF T-ABA IF OPC = 10 GO INA ELSE ADD 1 TO OPC GO INA.
IF T-ARR IF OPC = 01 GO INA ELSE SUBTRACT 1 FROM OPC GO INA.
IF NOT T-RET GO INA.

MOVE SPACES TO D-CODI H-CODI .
MOVE ZEROS TO D-CODI1 H-CODI1.
adic MOVE ZEROS TO D-CODI2 H-CODI2.
adic MOVE SPACES TO D-CODI3 H-CODI3.
MOVE FEC TO D-FECH H-FECH .
MOVE ZEROS TO D-FECH1 H-FECH1. MOVE SPACES TO TODO.
MOVE 0 TO ORDE MODO COSF VIST X COMI OBRA OBRA2.
INA0.
PERFORM 0S.
MOVE "Articulos " TO MENS1.
Codi INA1.
MOVE ZEROS TO TEC. DISPLAY P-CODI . ACCEPT P-CODI .
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC PERFORM 0N GO INA.
IF T-F1
CALL "AYUDARTI" USING ENLACE, D-CODI
CANCEL "AYUDARTI" MOVE ZEROS TO TEC
MOVE D-CODI TO H-CODI GO INA1.
IF NOT T-RET GO INA1.
IF D-CODI = SPACES
IF H-CODI = SPACES
MOVE "* " TO D-CODI
MOVE "ZZZZZZZZZZZZZZ" TO H-CODI .
IF H-CODI = SPACES
MOVE "ZZZZZZZZZZZZZZ" TO H-CODI .
DISPLAY P-CODI .
IF OPC = 01 GO INA4.

IF OPC = 02 MOVE "Vendedores " TO MENS2.
IF OPC = 03 MOVE "Condiciones " TO MENS2.
IF OPC = 04 MOVE "Localidades " TO MENS2.
IF OPC = 05 MOVE "Provincias " TO MENS2.
IF OPC = 06 MOVE "Zonas " TO MENS2.
IF OPC = 07 MOVE "Clientes " TO MENS2.
IF OPC = 08 MOVE "Proveedores " TO MENS2.
IF OPC = 09 MOVE "Marcas " TO MENS2.
IF OPC = 10 MOVE "Rubros " TO MENS2.
Codi1 INA2.
MOVE ZEROS TO TEC.
IF OPC = 02 OR = 03 OR = 05 OR = 06 OR = 07 OR = 08 OR = 09
OR = 10
DISPLAY P-CODI1 ACCEPT P-CODI1.
IF OPC = 04
DISPLAY P-CODI2 ACCEPT P-CODI2.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA1.
IF T-F1
IF OPC = 02
CALL "AYUDVEND" USING D-CODI1
CANCEL "AYUDVEND" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
IF OPC = 03
especi CALL "AYUDCOND" USING D-CODI1
CANCEL "AYUDLOCA" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
IF OPC = 04
CALL "AYUDLOCA" USING EM, D-CODI2
CANCEL "AYUDPCIA" MOVE ZEROS TO TEC
MOVE D-CODI2 TO H-CODI2
END-IF
IF OPC = 05
CALL "AYUDPCIA" USING D-CODI1
CANCEL "AYUDPCIA" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
IF OPC = 06
CALL "AYUDZONA" USING D-CODI1
CANCEL "AYUDZONA" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
IF OPC = 07
CALL "AYUDCLIE" USING D-CODI1
CANCEL "AYUDCLIE" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
IF OPC = 08
CALL "AYUDPROV" USING D-CODI1
CANCEL "AYUDPROV" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
IF OPC = 09
CALL "AYUDMARC" USING D-CODI1
CANCEL "AYUDMARC" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
IF OPC = 10
especi CALL "AYUDRUBR" USING D-CODI1
CANCEL "AYUDRUBR" MOVE ZEROS TO TEC
MOVE D-CODI1 TO H-CODI1
END-IF
GO INA2.
IF NOT T-RET GO INA2.
IF OPC = 02 OR = 03 OR = 05 OR = 06 OR = 07 OR = 08 OR = 09
OR = 10
IF D-CODI1 = ZEROS
IF H-CODI1 = ZEROS
MOVE 0001 TO D-CODI1
MOVE 9999 TO H-CODI1
END-IF
IF H-CODI1 = ZEROS
MOVE "9999" TO H-CODI1
END-IF
END-IF
DISPLAY P-CODI1.
IF OPC = 04
IF D-CODI2 = ZEROS
IF H-CODI2 = ZEROS
MOVE 000000 TO D-CODI2
MOVE 999999 TO H-CODI2
END-IF
IF H-CODI2 = ZEROS
MOVE 999999 TO H-CODI2
END-IF
END-IF
DISPLAY P-CODI2.
INA3.

Fech INA4.
MOVE ZEROS TO TEC. DISPLAY P-FECH . ACCEPT P-FECH .
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA2.
IF NOT T-RET GO INA4.
MOVE D-FECH TO A-FECHA.
IF A-DIA > 31 OR = ZEROS GO INA4.
IF A-MES > 12 OR = ZEROS GO INA4.
IF A-ANO < 1980 OR = ZEROS GO INA4.
MOVE H-FECH TO A-FECHA.
IF A-DIA > 31 OR = ZEROS GO INA4.
IF A-MES > 12 OR = ZEROS GO INA4.
IF A-ANO < 1980 OR = ZEROS GO INA4.
DISPLAY P-FECH .
IF OPC NOT = 01
PERFORM 1S
GO INA6.
Fech1 INA5.
MOVE ZEROS TO TEC. DISPLAY P-FECH1. ACCEPT P-FECH1.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA4.
IF NOT T-RET GO INA5.
IF D-FECH1 NOT = ZEROS
MOVE D-FECH1 TO A-FECHA
IF A-DIA > 31 OR = ZEROS GO INA5 END-IF
IF A-MES > 12 OR = ZEROS GO INA5 END-IF
IF A-ANO < 1980 OR = ZEROS GO INA5 END-IF.
IF H-FECH1 NOT = ZEROS
MOVE H-FECH1 TO A-FECHA
IF A-DIA > 31 OR = ZEROS GO INA5 END-IF
IF A-MES > 12 OR = ZEROS GO INA5 END-IF
IF A-ANO < 1980 OR = ZEROS GO INA5 END-IF.
DISPLAY P-FECH1.
PERFORM 1S.
Orde INA6.
MOVE ZEROS TO TEC. DISPLAY P-ORDE. ACCEPT P-ORDE.
ACCEPT TEC FROM ESCAPE KEY.
IF T-ESC OR T-F4
PERFORM 1N
IF OPC = 01 GO INA5 ELSE GO INA4.
IF NOT T-RET GO INA6. IF ORDE > 3 GO INA6.
DISPLAY P-ORDE.
IF OPC > 01 MOVE ZEROS TO D-FECH1 H-FECH1.
Modo INA7.
MOVE ZEROS TO TEC. DISPLAY P-MODO. ACCEPT P-MODO.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA6.
IF NOT T-RET GO INA7. IF MODO > 1 GO INA7.
DISPLAY P-MODO.
CoSf INA7A.
MOVE ZEROS TO TEC. DISPLAY P-COSF. ACCEPT P-COSF.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA7.
IF NOT T-RET GO INA7A. IF COSF > 1 GO INA7A.
DISPLAY P-COSF.
Vist INA8.
MOVE ZEROS TO TEC VIST OBRA OBRA2.
DISPLAY P-VIST. ACCEPT P-VIST.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA7A.
IF NOT T-RET GO INA8. IF VIST > 3 GO INA8.
DISPLAY P-VIST.
IF MA = 1 GO INA8B.
Especi INA8A.
"" MOVE ZEROS TO TEC. MOVE SPACES TO TODO.
"" DISPLAY P-TODO. ACCEPT P-TODO.
"" ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA8.
"" IF NOT T-RET GO INA8A.
"" DISPLAY P-TODO.
Obra INA8B.
MOVE ZEROS TO TEC OBRA OBRA2.
DISPLAY P-OBRA. ACCEPT P-OBRA.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA8.
IF NOT T-RET GO INA8B. IF OBRA > 2 GO INA8B.
IF OBRA = 1 GO INA9.
DISPLAY P-OBRA.
Obra2 INA8C.
MOVE 2 TO OBRA2.
* MOVE ZEROS TO TEC OBRA2. DISPLAY P-OBRA2. ACCEPT P-OBRA2.
* ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA8B.
* IF NOT T-RET GO INA8C. IF OBRA2 < 1 OR > 2 GO INA8C.
* DISPLAY P-OBRA2.
Acep INA9.
MOVE ZEROS TO TEC. MOVE SPACES TO SINO.
DISPLAY P-SINO. ACCEPT P-SINO.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA8.
IF NOT T-RET GO INA9. IF NOT POSI GO INA9.
DISPLAY P-SINO. IF NONO PERFORM 0N GO INA0.
INI.
MOVE 1 TO BAN.
MOVE D-FECH TO A-FECHA. MOVE A-DIA TO W-DIA.
MOVE A-MES TO W-MES. MOVE A-ANO TO W-ANO.
MOVE W-FECHAX TO D-FE.
MOVE H-FECH TO A-FECHA. MOVE A-DIA TO W-DIA.
MOVE A-MES TO W-MES. MOVE A-ANO TO W-ANO.
MOVE W-FECHAX TO H-FE.
OPEN OUTPUT AAAA.
CLOSE AAAA.
OPEN OUTPUT BBBB.
CLOSE BBBB.
OPEN OUTPUT CCCC.
CLOSE CCCC.
Vtas IF OBRA = 0 OR = 1 PERFORM ARMA THRU F-ARMA.
Obra IF OBRA = 0 OR = 2
IF OBRA2 = 1 OR = 2
PERFORM ERME THRU F-ERME.
IF D-FECH1 NOT = ZEROS
IF OPC = 01 AND ORDE < 3
MOVE 2 TO BAN
MOVE D-FECH1 TO A-FECHA MOVE A-DIA TO W-DIA
MOVE A-MES TO W-MES MOVE A-ANO TO W-ANO
MOVE W-FECHAX TO D-FE
MOVE H-FECH1 TO A-FECHA MOVE A-DIA TO W-DIA
MOVE A-MES TO W-MES MOVE A-ANO TO W-ANO
MOVE W-FECHAX TO H-FE
PERFORM ARMA THRU F-ARMA.
PERFORM LIST THRU F-LIST.
PERFORM 1N. GO INA6.
FIN.
EXIT PROGRAM.
PARAR.
STOP RUN.

Josber
20 de marzo de 2023, 19:10
@jorgeamedina2020, es que el segundo ejemplo que has puesto, está correctamente escrito, con sus saltos de líneas, sus espacios, cada cosa en su sitio, pero el ejemplo del primer post


DATA DIVISION.
WORKING-STORE SECTION.
01 CAMPO1 PIC 9(01). 01 CAMPO2 PIC 9(01). 01 CAMPO3 PIC 9(01).
01 CAMPO4 PIC 9(01). 01 CAMPO5 PIC 9(01).


PROCEDURE DIVISION.
MOVE 1 TO CAMPO1. MOVE 1 TO CAMPO2. MOVE 1 TO CAMPO3.
MOVE 1 TO CAMPO4. MOVE 1 TO CAMPO5.
DISPLAY CAMPO1.

EXIT PROGRAM.

tú intenta hacer el segundo ejemplo, como el primero, (y eso que es un programa cortito y sencillo, piensa en un programa que haga facturas), y aunque los programas sean tuyos, teniendo en cuenta que una aplicación, se puede componer de al menos 300 ó 400 programas, unos muy cortos, otros de miles de líneas, dentro de un año, no te puedes acordar "al dedillo" de qué hiciste, en qué lugar del programa, cuando, si lo tienes bien comentado, y bien indentado, claro y limpio, puedes ir al sitio en un momento, de la otra manera, también llegarás al sitio, por supuesto, pero estoy seguro que tardarás muuuuuuucho más, y eso, digas lo que digas, ni tú ni nadie puede discutírmelo. Porque, puestos a ahorrar, porqué en vez de PIC 9(01), no usas PIC 9, es lo mismo, y por esa misma razón, le ahorrarías un supuesto trabajo al compilador, (y reconozco que, en mi caso, esto último, ya es demagogia barata :) )

Salu2.-

JCantero
20 de marzo de 2023, 19:51
@jorgeamedina2020, yo estoy con @Josber.

Los programas deben de estar lo mas claro posibles.

Los programas que yo hago son propiedad de la empresa que me paga por ello y además deben de poder comprender el resto de programadores que trabajan para la misma empresa.

Si quiero quitar líneas o información redundante lo meto en copys. Y dentro de copys puedo tener copys.

Tengo programas que modifican programas ya hechos ( analizadores - cambiadores ) y el resultado debe de ser lo mas claro posible para otro programa que venga cambiando cosas o programadores que vengan cambiando cosas.

Te podría decir mas cosas, pero en lo que apuntas no veo nada positivo.

JCantero
20 de marzo de 2023, 20:02
@jorgeamedina2020, hablando de estilo de programación si me lo permites....

esto:

MesAct 01 TOT-CANT PIC S9(06)V999. 01 TOT-IMPO PIC S9(10)V99 .
01 TOT-COST PIC S9(10)V99 .
01 TOT-ICOM PIC S9(10)V99 .
01 TOT-COST-SF PIC S9(10)V99 .
MesAnt 01 TOT-CANTT PIC S9(06)V999. 01 TOT-IMPOO PIC S9(10)V99 .
01 TOT-COSTT PIC S9(10)V99 .
01 TOT-ICOMM PIC S9(10)V99 .
01 TOT-COSTT-SF PIC S9(10)V99 .


Son 5 grupos de 6 campos iguales (30 variables).
Eso yo lo meteria en una tabla. (occurs)

esto:


IF OPC = 02 MOVE "Vendedores " TO MENS2.
IF OPC = 03 MOVE "Condiciones " TO MENS2.
IF OPC = 04 MOVE "Localidades " TO MENS2.
IF OPC = 05 MOVE "Provincias " TO MENS2.
IF OPC = 06 MOVE "Zonas " TO MENS2.
IF OPC = 07 MOVE "Clientes " TO MENS2.
IF OPC = 08 MOVE "Proveedores " TO MENS2.
IF OPC = 09 MOVE "Marcas " TO MENS2.
IF OPC = 10 MOVE "Rubros " TO MENS2.


un evaluate.

esto que lo tienes repetido 20 veces con etiquetas diferentes:


INA7.
MOVE ZEROS TO TEC. DISPLAY P-MODO. ACCEPT P-MODO.
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA6.
IF NOT T-RET GO INA7. IF MODO > 1 GO INA7.
DISPLAY P-MODO.


se hace un perform general con condiciones.

esto:

Fech INA4.
MOVE ZEROS TO TEC. DISPLAY P-FECH . ACCEPT P-FECH .
ACCEPT TEC FROM ESCAPE KEY. IF T-ESC OR T-F4 GO INA2.
IF NOT T-RET GO INA4.
MOVE D-FECH TO A-FECHA.
IF A-DIA > 31 OR = ZEROS GO INA4.
IF A-MES > 12 OR = ZEROS GO INA4.
IF A-ANO < 1980 OR = ZEROS GO INA4.
MOVE H-FECH TO A-FECHA.
IF A-DIA > 31 OR = ZEROS GO INA4.
IF A-MES > 12 OR = ZEROS GO INA4.
IF A-ANO < 1980 OR = ZEROS GO INA4.
DISPLAY P-FECH .
IF OPC NOT = 01
PERFORM 1S
GO INA6.


Lo tienes repetido un monton de veces. Pues lo mismo un perform a INA-GENERAL y quitas 100 lineas

O sea que hay que hacer cosas generales, con condiciones y no repetir siempre lo mismo.

jorgeamedina2020
20 de marzo de 2023, 21:08
@JCantero, Comprendido su punto de vista

- - - Updated - - -

@JCantero, Si, estoy de acuerdo, conozco esa forma de trabajo tambien. lo hice en algunos de mis programas

jorgeamedina2020
20 de marzo de 2023, 21:23
El primer ejemplo que subí fue algo sencillo para mostrar o explicar el tema de usar en un solo renglón dos o mas definiciones o dos o mas procedimientos, solo eso.
Es por eso que querían que UDs prueben esto en su lenguaje, por supuesto respetando desde la columna 8 a la 72. Es solo prueba y comprensión.

El segundo ejemplo (que no es un ejemplo), es parte de un programa que hace estadísticas de ventas tomando archivos de movimientos y creando pantallas e impresiones. Aquí quería mostrar que uso mucho varias variables con nombres distintos y con longitudes distintas, y que las fui escribiendo una a lado de la otra, separaras por el punto. El punto separa instrucciones y no el fin de linea.
Lo mismo hice en la sección de procedimientos, puse en una linea varias tareas, intento con esto usar toda la linea posible para escribir todo lo que pueda para no hacer largo el programa, esto esta bien, mi compilador Micro Focus Cobol Version 3.00 del año 1989 lo permite, lleve el mismo programa para compilar con Acucobol y no le gusto que escribiera así las lineas, lo mismo me paso con GnuCobol en una de sus versiones.

No intento Discutir el tema ni estar en contra de nadie, mi idea de esto es mostrar o compartir una forma de trabajo y saber si otros lenguajes se los permiten, meramente informativo queridos colegas.

- - - Updated - - -

Ademas imagino que algún parámetro o referencia o variable de entorno permite este tipo de escritura, la idea principal fue saber que lo permite...

Fito
21 de marzo de 2023, 03:42
Hola Amigos:

Estuve probando con PowerCobol.

Los niveles 01 y 77 necesariamente los quiere en la columna 8.
Los niveles 02 en adelante se pueden poner uno al lado del otro, separado por puntos.
En la Procedure los comandos pueden ponerse a continuación en la misma lína, separados con puntos o sin ellos.
Las Instrucciones #include (https://www.cobolforo.es/usertag.php?do=list&action=hash&hash=include) tambien pueden ponerse en la misma línea.

La claridad del código es indispensable, ya sea para retomar algún programa viejo o para que otros puedan leer nuestro código. Pero como sobre gustos no hay nada escrito, cada uno tiene que tomar la forma que le resulte conveniente, por ejemplo yo programo en minúsculas, me cuesta seguir un código escrito en mayúsculas. Respetar las indentaciones me parece fundamental, para seguir las estructuras.
Yo pierdo mucho tiempo en tratar de tener un código claro, alineando por picture por ejemplo. Eso me ayuda mucho para cuando tengo que encontrar errores o tengo que realizar alguna modificación.

Los objetos les pongo un prefijo siempre, no dejo el "name" que le pone el editor.
Todos mis cuadros de texto empiezan con txt... los combos con cmb... las etiquetas con lbl, etc. Y después le sigue un nombre nemotécnico que me indica qué contiene, txtNombre, txtApellido, etc.

Los campos de los archivos tambien les pongo un prefijo de tres o más letras que lo saco de una pseudo abreviatura del nombre del archivo. El archivo de cuentas corrientes se llama CTACTE y el campo nombre se llama ccnom, cctelef, cccuit. cccodpos. etc.

Las propiedades y métodos tambien trato de respetar como se escriben, porque en la mayoría de los objetos como se escriba es los mismo, pero pueden haber controles activex que necesariamente tengan que respetarse las mayúsculas o minúsculas. Entonces trato de acostubrarme.
"SetFocus", "Value", "BackColor", "ForeColor", "CallForm", "OpenForm".

Todas estas nomenclaturas para escribir el código, lo he ido desarrollando con el tiempo, por eso por ahi tengo mezcla si comparamos programas viejos con nuevos. Y a veces un programa nuevo que haya hecho un copiar y pegar de uno viejo, en la medida que el tiempo me de, trato de "traducirlo".

Saludos...

Fito...

JCantero
21 de marzo de 2023, 09:00
Es por eso que querían que UDs prueben esto en su lenguaje, por supuesto respetando desde la columna 8 a la 72. Es solo prueba y comprensión.



@jorgeamedina2020, eso es standard de cobol, hasta el rmcobol 5.35 lo admite (AÑO 1985).

Mientras te ciñas a los márgenes, puedes poner las líneas que entren.

En la actualidad, cada compilador tiene opciones o parámetros de escribir después de la columna 73 sin ceñirte a los márgenes. Con lo cual puedes aprovechar mucho mas tu forma de escribir los programas.

Kuk
27 de marzo de 2023, 09:31
@jorgeamedina2020, compañero, esto de meter más de una sentencia en la misma línea es bastante mala idea. A lo largo de los años la gente ha ido adquiriendo experiencia y generando sabiduría basada en ella. Si escribimos una sentencia por línea es por algo. Y ese algo es que es la manera más rápida y fácil de analizar código sin tener que leerse todas y cada une de las líneas del código, que al fin y al cabo es código no Shakespeare. :D ;)
Es decir que viendo el principio ya sabes si forma parte de lo que buscas o no. Así que, yo te aconsejo no reinventar la rueda, aunque técnicamente puedes hacerlo como te da la gana (casi), hay unas convenciones, reglas, y hasta podríamos llamarlo cultura.

En como en Java por ejemplo, por convención:

el nombre de una clase debe ir con mayúscula
el nombre de un método debe ir con minúscula
etc.


Esto no quiere decir que no lo va a compilar si pones el nombre de la clase con minúscula o todo mayúsculas. Pero, estas pequeñas reglas respetadas por la gran mayoría ayudan a la hora de codificar, buscar y corregir errores etc.

Nitzer
27 de marzo de 2023, 16:26
Hola compañeros, independientemente de que un compilador permita o no cierta sintaxis, yo siempre programa de una forma estructurada, nunca utilizo punto al final solo si hay párrafos.
Mantengo un sangrado de 3 columnas, utilizo mas EVALUATE que IF, no utilizo NUNCA el comando GO.
Cuando programo en PowerCobol, procuro no escribir mucho en los eventos, si va a haber mucho código, prefiero llamar a un procedimiento mas explicativo.


WORKING-STORAGE SECTION.
01 VARIABLES.
02 CONTADOR PIC 9(8).
02 OPCION PIC 9.
02 VALOR PIC 99.
PROCEDURE DIVISION.
INITIALIZE VALOR
PERFORM VARYING CONTADOR FROM 1 BY 1 UNTIL CONTADOR > 10
DISPLAY 'LO QUE SEA'
ADD 1 TO VALOR
EVALUATE OPCION
WHEN 1 DISPLAY 'OPCION 1'
WHEN 2 DISPLAY 'OPCION 2'
END-EVALUATE
END-PERFORM



es un código sin sentido :), pero era para mostrar como lo hago. Y lo del punto al final de cada línea os digo que no lo utilizo, y tengo procedures de miles de líneas.

Kuk
27 de marzo de 2023, 16:58
@Nitzer, lo de los puntos es un sarcoma del que hay que deshacerse, eso viene de cuando los END-IF, END-EVALUATE y el resto de los END-* no existían (antes del estándar AN74). Efectivamente, hay que utilizar sólo un punto al final del párrafo, yo lo pongo en una línea separada para que se le vea bien al jodio

Nitzer
27 de marzo de 2023, 17:01
@Nitzer, yo lo pongo en una línea separada para que se le vea bien al jodio :mola::mola:

Josber
28 de marzo de 2023, 12:10
@Nitzer, lo de los puntos es un sarcoma del que hay que deshacerse, eso viene de cuando los END-IF, END-EVALUATE y el resto de los END-* no existían (antes del estándar AN74). Efectivamente, hay que utilizar sólo un punto al final del párrafo, yo lo pongo en una línea separada para que se le vea bien al jodio

Qué tiempos aquellos del COBOL-74, ahí si que tenias que montar unas historias de 3 pares de ... para poder "librarte" o terminar un IF, un READ - NEXT, etc, todo a base de PERFORM y el "maldito" GO TO y, sobre todo de muuuuuucha imaginación, o usabas el punto (.) al final de una instrucción o te pegabas una panzada a revisar código de varios días y, el tema de más de una instrucción por línea, era impensable, bastante te costaba seguir tu código bien escrito, como para seguir y leer código ajeno, vamos, ni por suerte

Un salu2.-

Kuk
28 de marzo de 2023, 13:21
@Josber, efectivamente. Además, no hay que olvidar que la lectura del programa debe ser fácil y la estructura debe permitir hacerlo de manera rápida.

Yo he creado en más de una empresa los estándares de codificación en Cobol, cuyos puntos clave siempre han sido:


En la PROCEDURE (equivalente de Main) - debemos ver los párrafos describiendo qué hace el programa y en qué orden (NO el cómo lo hace). Así al llegar al "main", con una ojeada rápida ya veo si es el programa que me interesa o no. Así que el Main sólo debe contener llamadas a párrafos, nada de instrucciones MOVE, CALL, ADD etc.
Para ver el cómo hace lo que hace el programa, ya iremos a los párrafos concretos que se llaman desde el Main (para ver los detalles).
Máximo nivel de performs anidados: 3
Máximo nivel de IFs anidados: 3
Máximo nivel de capas de software: 3 (Orquestrador, Rutina funcional, Rutina técnica/Accesor)
Indentación obligatoria
NADA de puntos, un sólo punto al final del párrafo en línea separada
NADA de THRU en PERFORM ni párrafos con nobmre-parrafo-EXIT
NADA de secciones
NADA de GO TO salvo párrafo de ABEND
Programa nuevo: máximo 1500 líneas. Nueva función grande = nuevo programa + CALL
Respetar los tipos de campo numérico según plataforma (COMP-5 para Intel X86_64, COMP-3 para IBM Z etc.)


Creo que no se me olvida nada de los puntos importantes.
Esto se lo hago aprender como los 10 mandamientos a los DEVs, y hasta pongo controles en Jenkins de ciertas cosas cuando el Build para comprobarlo automáticamente y como haya cosas que no me cuadran - ABEND como una casa. :D

Gusaiello
28 de marzo de 2023, 14:10
@Kuk, y que tal si a la mitad del programa te pongo un ALTER? :loco:
Supongo que en ese preciso momento me quedo sin trabajo, no?

Josber
28 de marzo de 2023, 16:35
, y que tal si a la mitad del programa te pongo un ALTER? :loco:
Supongo que en ese preciso momento me quedo sin trabajo, no?

¡¡Eso, eso!!, un ALTER con un GO TO ... DEPENDING ON a la sexta línea del programa y otro a falta de 6 líneas para terminar, esas instrucciones, sí que eran una pasada :enamor: :enamor: :) :), la madre que las ...

Fito
28 de marzo de 2023, 16:42
Noooooooo Amigosssss...

Larga vida al GO TO....

Yo trato de armar código estructurado, pero un buen GO TO bien puesto, no tiene precio... :mola::mola:

Saludos...

Fito...

Kuk
28 de marzo de 2023, 19:48
@Fito, esto es lo que se llama "código espagueti" que con cada intervención la complicación se multiplica en progresión geométrica. En tu caso, como sólo eres tú el que toca el código, todavía. Pero como te toque hacer fix de un bug en el mundo de banca/seguros, donde el mismo programa lo han tocado ya 45 bigardos pensando en cerrar lo antes posible la incidencia... Te aseguro que la baja por depresión la tienes garantizada :D :D :D

Kuk
28 de marzo de 2023, 19:52
¡¡Eso, eso!!, un ALTER con un GO TO ... DEPENDING ON a la sexta lÃ*nea del programa y otro a falta de 6 lÃ*neas para terminar, esas instrucciones, sÃ* que eran una pasada :enamor: :enamor: :) :), la madre que las ...

Esto ya no es para darse de baja, es para suicidarse directamente :D :marea:

@Gusaiello, he tenido que ser buena persona en mi vida anterior porque nunca he visto un ALTER en producción. De hecho nunca lo he probado. Creo que era algo tipo que el programa se recompilaba a si mismo en un trozo ¿no? Menuda flipada..... :shok:

Gusaiello
28 de marzo de 2023, 22:14
@Kuk, ALTER párrafo tal por Párrafo cual.

Cuando el programa pasa por el ALTER toda mención que se haga al párrafo tal es redireccionada al párrafo cual.

Y anda a seguir la lógica de ese programa!!!!

Kuk
29 de marzo de 2023, 09:59
@Gusaiello, ya te digo, por algo no lo he visto nunca... para los crackers debe ser la hostia, pero para los simples mortales como nosotros, seguir un programa como ese es equivalente a un doctorado en neuroredes :astro: :marea: :vacuna: