Blog de Portekoi : Programmation et Astuces

Programmation Cobol, Php, Asp, Java et DotNet…

Générer une chaine aléatoire en COBOL (CBLSQLLE)

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.