24 09 2012
La fonction aléatoire sur Cobol existe mais renvoie toujours le même résultat dans le même ordre et est très difficile accessible.
Dans le code ci-dessous, nous « biaisons » en utilisant la fonction rand() de SQL.
Cobol peut accéder aux requête SQL. Pour notre exemple, à vous de créer le fichier en reprenant la partie qui vous intéresse.
IDENTIFICATION DIVISION.
PROGRAM-ID. RDMPGM.
AUTHOR. PORTEKOI.
DATE-WRITTEN. 20121207.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-AS400.
OBJECT-COMPUTER. IBM-AS400.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*****************************************************************
DATA DIVISION.
*****************************************************************
FILE SECTION.
*****************************************************************
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
01 WS-LEN PIC S9(02).
01 WS-RND-NBR PIC S9(06).
* Pour faire un modulo, on a besoin d un autre nombre aléatoire
01 WS-RND-NBR-MOD PIC S9(02).
01 WS-RND-MOD PIC S9(01).
01 WS-CPT PIC 99.
88 WS-ISZERO VALUE 0.
01 WS-NUMERIC PIC X(10).
01 WS-ALPHA PIC X(26).
01 WS-ALPHANUM PIC X(36).
* Pour les variables génériques *
COPY AVRM902D OF QAVRSRC.
*****************************************************************
LINKAGE SECTION.
01 LK-PGM.
01 LK-LEN PIC 9(02).
01 LK-TYPE PIC X(01).
01 LK-CASE PIC X(01).
01 LK-REP PIC X(36).
*****************************************************************
PROCEDURE DIVISION USING LK-PGM.
*LK-TYPE : A : ALPHA / N : NUMERIC / Z : Les Deux mon capitaine
*LK-CASE : U => Majuscule / L => Minuscule / M => Les deux
* de manière aléatoire
PROCEDURE DIVISION USING LK-LEN LK-TYPE LK-CASE LK-REP.
PGM-RINCIPAL.
MOVE "abcdefghijklmnopqrstuvwxyz" TO WS-ALPHA.
MOVE "0123456789" TO WS-NUMERIC.
STRING WS-ALPHA WS-NUMERIC DELIMITED BY SIZE
INTO WS-ALPHANUM.
IF LK-LEN = 0
MOVE 10 TO LK-LEN
END-IF.
IF LK-LEN > 36
MOVE 36 TO LK-LEN
END-IF.
IF LK-TYPE = "N"
MOVE 10 TO WS-LEN
ELSE IF LK-TYPE = "A"
MOVE 26 TO WS-LEN
ELSE IF LK-TYPE = "Z"
MOVE 36 TO WS-LEN
ELSE IF LK-TYPE = " "
MOVE "Z" TO LK-TYPE
MOVE 36 TO WS-LEN
END-IF.
IF LK-CASE = SPACE
MOVE "M" To LK-CASE
END-IF.
PERFORM ETQ-CPT THRU ETQ-CPT-END
VARYING WS-CPT
FROM 1 BY 1 UNTIL WS-CPT > LK-LEN.
DISPLAY LK-REP.
GO TO STOP-PGM.
PGM-RINCIPAL-END.
EXIT.
ETQ-CPT.
EXEC SQL
SELECT cast((RAND() * :WS-LEN)+1 as int)
INTO :WS-RND-NBR
FROM EXPMVTP000
FETCH FIRST 1 ROWS ONLY
END-EXEC
* Si M : on peut ajouter des majuscules et des minuscules
IF LK-CASE = "M"
EXEC SQL
* Chiffre aléatoire entre 1 et 10 pour modulo de 2
SELECT cast((RAND() * 10)+1 as int)
INTO :WS-RND-NBR-MOD
FROM EXPMVTP000
FETCH FIRST 1 ROWS ONLY
END-EXEC
COMPUTE WS-RND-MOD = FUNCTION MOD(WS-RND-NBR-MOD, 2)
END-IF.
IF LK-TYPE = "N"
MOVE WS-NUMERIC(WS-RND-NBR:1) TO LK-REP(WS-CPT:1)
ELSE IF LK-TYPE = "A"
MOVE WS-ALPHA(WS-RND-NBR:1) TO LK-REP(WS-CPT:1)
IF LK-CASE = "U"
MOVE FUNCTION UPPER-CASE(WS-ALPHA(WS-RND-NBR:1))
TO LK-REP(WS-CPT:1)
ELSE IF LK-CASE = "L"
MOVE WS-ALPHA(WS-RND-NBR:1) TO LK-REP(WS-CPT:1)
ELSE
MOVE FUNCTION UPPER-CASE(WS-ALPHA(WS-RND-NBR:1))
TO LK-REP(WS-CPT:1)
END-IF
ELSE
IF LK-CASE = "U"
MOVE FUNCTION UPPER-CASE(WS-ALPHANUM(WS-RND-NBR:1))
TO LK-REP(WS-CPT:1)
ELSE IF LK-CASE = "L"
MOVE WS-ALPHANUM(WS-RND-NBR:1)
TO LK-REP(WS-CPT:1)
ELSE
IF WS-RND-MOD = 0
MOVE FUNCTION UPPER-CASE(WS-ALPHANUM(WS-RND-NBR:1))
TO LK-REP(WS-CPT:1)
ELSE
MOVE WS-ALPHANUM(WS-RND-NBR:1)
TO LK-REP(WS-CPT:1)
END-IF
END-IF
END-IF.
ETQ-CPT-END.
EXIT.
STOP-PGM.
GOBACK.
*
*-----------------------------------------------------------
Les commentaires sont fermés.