Advanced Dialog Manager (Adding Muscle to Your App)
description
Transcript of Advanced Dialog Manager (Adding Muscle to Your App)
Copyright 2007, Information Builders. Slide 1
Joel StarkmanDirector of Operations
June, 2008
Advanced Dialog Manager (Adding Muscle to Your App)
Copyright 2007, Information Builders. Slide 2
What does Dialog Manager REALLY do for you?
Controls your application flow and makes on-the-fly decisions
• Even decide to replace the flow in the middle of the flow!) Creates and varies additional lines of code dynamically Builds an entire set of logic on the fly, then executes it Communicates intelligently with the operating system
• Reads and writes files in your directory or disk Prompts for and verifies information interactively Auto-generates volumes of data at run time Creates complex [nested] repetitions
Copyright 2007, Information Builders. Slide 3
Robotics at Power Company
Copyright 2007, Information Builders. Slide 4
Pass Values Among SUBROUTINES
Single & is local to one focexec and any –INCLUDE’d code
Double && is global to all focexecs during the session
EX SUBR &ABC Value of &ABC passed into SUBR as &1
EX SUBR ABC=&ABC Value of &ABC passed into SUBR as &ABC
-SET &&ABC=&ABC;EX SUBR Value of &&ABC is simply valid in SUBR
Passing many variables?Easier to specify as && globals
-DEFAULTS &1 = ‘ ‘;-SET &ABC = &1 ;-TYPE &ABC &1 &&ABC
SUBR FOCEXEC
Or do it the long and expensive way:-WRITE them out from here, and –READ them into there
Copyright 2007, Information Builders. Slide 5
Screen With Unrelated Data
WHERE-based JOIN can accomplish this too, without Dialog Manager! (see One-Liners on Wed.)
TABLE FILE CARSUM MAX.RCOSTON TABLE HOLD AS ‘FROMHOLD’END-RUN-SET &MAXRCOST = ‘ ‘ ;-READ FROMHOLD &MAXRCOSTTABLE FILE EMPLOYEEPRINT EMP_IDIF SALARY GT &MAXRCOST *3END
Two unrelated files.Two unrelated files.
Which employees can afford the most expensive car?
Copyright 2007, Information Builders. Slide 6
-REPEAT vs Incrementing
-SET &COUNTER = 1 ;-STARTLOOP-* PERFORM SOME LOGIC HERE USING &COUNTER-RUN-SET &COUNTER = &COUNTER + 5 ;-IF &COUNTER GT 10 GOTO ENDLOOP ;-GOTO STARTLOOP-ENDLOOP
-REPEAT ENDLOOP FOR &COUNTER FROM 1 TO 10 STEP 5-* PERFORM SOME LOGIC HERE USING &COUNTER-ENDLOOP
Increment Method
-REPEAT Method
-REPEAT label n TIMES-REPEAT label WHILE any-DM-conditions
also available …
Copyright 2007, Information Builders. Slide 7
Run them all, or just one, with .EVAL
-DEFAULTS &1 = ‘ALL’-SET &RUNTHIS = &1 ;
-SET &EXITNOW = IF &1 EQ ‘ALL’ THEN ‘‘ ELSE ‘–EXIT’ ; -SET &EXITNOW = IF &1 EQ ‘ALL’ THEN ‘‘ ELSE ‘–GOTO OUT’;-GOTO TABLE&RUNTHIS-TABLEALL
-TABLE1TABLE FILEPRINT ...END-RUN&EXITNOW.EVAL
-TABLE2 TABLE FILEPRINT ...END-RUN&EXITNOW.EVAL
(More reports here)-OUT
RUNREPORTS FOCEXEC
&RUNTHIS is substituted with report number or ALL
EX RUNREPORTS
EX RUNREPORTS ALL
EX RUNREPORTS 2
Execute by any of:
pick one
Copyright 2007, Information Builders. Slide 8
Dynamically remove code with .EVAL
-DEFAULTS &1 = ‘ ’-SET &COMMENT = IF &1 EQ ‘TEST’ THEN ‘ ‘ ELSE ‘-*’;
TABLE FILEPRINT ...&COMMENT.EVAL IF RECORDLIMIT IS 100END
TABLE FILEPRINT ...-IF &1 EQ ‘TEST’ GOTO NOLIMIT1;IF RECORDLIMIT IS 100-NOLIMIT1END
EX ROUTINE
EX ROUTINE TEST
Execute by either:
Forces eitherIF RECORDLIMIT IS 100
or-* IF RECORDLIMIT IS 100
Verbose way to ignore the line (need unique labels each time too)
[ or make it a global&& to influence all routines at once ]
Copyright 2007, Information Builders. Slide 9
-INCLUDE Blocks of Code
COMPUTE COMPUTEA/A5 = IF
-INCLUDE CRITERIATHEN ‘OK’ ELSE ‘NOT_OK’;
DEFINE FILEFIELD/A12 = DECODE LIST(-INCLUDE DECLISTELSE ‘UNKNOWN’);
(RCOST GT DCOST + 1000) AND(TODAY IS ‘&WHATDAY’) AND(THESKY IS ‘BLUE’)
CRITERIA FOCEXEC
These may have been generated previously by other source code
‘GREEN’ ‘MONEY’‘BLUE’ ‘WATER’‘BLACK’ ‘CLOUD’‘RED’ ‘APPLE’
DECLIST FOCEXEC
Copyright 2007, Information Builders. Slide 10
Use Common-Code Objects
-SET ®ION=‘WEST’;TABLE FILE CAR-INCLUDE HEADLINESUM MAX.RCOSTWHERE REGION EQ ‘®ION’END-RUN-SET ®ION=‘EAST’;TABLE FILE CAR-INCLUDE HEADLINESUM MAX.DCOSTWHERE REGION EQ ‘®ION’ENDTABLE . . .TABLE . . .
-SET &HEADLINE =- DECODE ®ION ( - ‘WEST’ ‘WEST COAST’- ‘EAST’ ‘EAST COAST’- ‘NORTH’ ‘NORTHERN’ - ‘SOUTH’ ‘SOUTHERN’- ELSE ‘OTHER’);HEADING CENTER“DATA FOR &HEADLINE REGION”“Generated on &DATE “
HEADLINE FOCEXEC
Copyright 2007, Information Builders. Slide 11
Amper-Variable Characteristics (.EXIST .TYPE .LENGTH)
-**-DEFAULTS &1 = 'ABC'
-IF &1.EXIST EQ 0 GOTO ERR1;
-IF &1.TYPE EQ ‘N‘ GOTO ERR2;
-IF &1.LENGTH LT 3 GOTO ERR3;
-TYPE Result: &|1 = &1
DMETL FOCEXEC
EX DMETL
EX DMETL 123
EX DMETL AB
EX DMETL SUMMIT
EX DMETL ARG=123
EX DMETL 1=123
EX DMETL 1=123N
Err1: &1 has no value
Err2: Must be alphanumeric
Err3: Must be at least 3 char long
Result: &1 = SUMMIT
Err1: &1 has no value
Err2: Must be alphanumeric
Result: &1 = 123N
results in
Copyright 2007, Information Builders. Slide 12
Indexed Amper-Variables
ABC FOCEXEC EX ABC ECHO=ALL
-SET &P1 = 'ABC';-SET &P2 = 'DEF'; -SET &NAME&P1&P2 = 456-SET &NAMEABCDEF = 789;-SET &NAME= 789;-SET &NAME= 789ABCDEF;-TYPE 789789-TYPE 456ABCDEF456ABCDEF
-SET &P1 = 'ABC'; -SET &P2 = 'DEF';-SET &NAME&P1&P2 = 456;-SET &NAME.&P1.&P2 = 789;-SET &NAME= &NAME.&P1.&P2;-SET &NAME= &NAME&P1&P2;-TYPE &NAME.&P1.&P2
-TYPE &NAME&P1&P2
Store a series of related values in amper-variables via a loop and reference them later programmatically and selectively. Can be many-dimensional.
(th
is li
ne
actu
ally
do
es
no
thin
g u
sefu
l!)
Copyright 2007, Information Builders. Slide 13
Indexed Amper-Variables
-REPEAT LOOP1 FOR &CNT1 FROM 1 TO 3 -SET &FMT.&CNT1 = DECODE &CNT1 -(1 'I' 2 'F' 3 'D' ELSE 'X');-LOOP1 -* OTHER CODE HERETABLE FILE CARBY COUNTRY NOPRINT BY CAR NOPRINT SUBHEAD"<COUNTRY ,<CAR " SUM RCOST OVER DCOST OVER -REPEAT LOOP3 FOR &CNT1 FROM 1 TO 3-REPEAT LOOP4 FOR &CNT2 FROM 1 TO 6COMPUTEDIFF_&FMT.&CNT1&CNT2/&FMT.&CNT1&CNT2 = RCOST - DCOST;OVER -LOOP4 -LOOP3DCOST NOPRINTIF CAR EQ JAGUAREND
Task: Generate all formats in one TABLE (subset)
Create the format
combinations
Add each format combination into TABLE
no dotno dotCOMPUTEDIFF_I1/I1 = RCOST-DCOST;OVER. . .DIFF_D6/D6 = RCOST-DCOST;
generates
ENGLAND ,JAGUAR RETAIL_COST 22,369DEALER_COST 18,621DIFF_I1 *DIFF_I2 **DIFF_I3 ***DIFF_I4 3748DIFF_I5 3748DIFF_I6 3748DIFF_F1 *DIFF_F2 **DIFF_F3 ***DIFF_F4 3748DIFF_F5 3748DIFF_F6 3748DIFF_D1 *DIFF_D2 **DIFF_D3 ***DIFF_D4 3,748DIFF_D5 3,748DIFF_D6 3,748
result
Copyright 2007, Information Builders. Slide 14
TABLE FILE CAR HEADING "AT&T" PRINT COUNTRY END
How do you get the “&” into AT&T?
TABLE FILE CAR HEADING "AT&T" PRINT COUNTRY END
HEADING“AT&|T”
HEADING“AT&<+0>T”
-SET &T=‘&T’;HEADING“AT&T”
TABLE FILE CAR HEADING PLEASE SUPPLY VALUES REQUESTED T=
Sample FOCUS dialog…
Many programmers gave up and just used AT+T
Copyright 2007, Information Builders. Slide 15
“Why Would Anybody Do That?”
-SET &VAR = DECODE &VAL(- 1 ‘VAL1’- 2 ‘VAL2’- 3 ‘VAL3’- ELSE ‘VAL9’);
-SET &VAR = DECODE &VAL(- 1 ‘VAL1’ - 1 ‘VALX’- 2 ‘VAL2’- 3 ‘VAL3’- 3 ‘VALY’- ELSE ‘VAL9’);
Why would someone want to repeat the same code multiple times in the same DECODE?
FOCUS accepts it, but it seems useless and consumes resources.
This is a normal DECODE
Copyright 2007, Information Builders. Slide 16
“Why Would Anybody Do That?”
COMPUTE DEPT= DECODE DEPTCODE(-* ‘GROUP 1’ 1001 ‘SALES’ 1022 ‘SDDS’ 1134 ‘ETH’-* ‘GROUP 2’ 2023 ‘SADOSFD’ 2113 ‘WRIOU’-* ‘GROUP 3’ 3006 ‘ASDB’
. . . ELSE ‘UNKNOWN’) ;
-SET &DEPT= DECODE &DEPTCODE(-* ‘GROUP 1’- 1001 ‘SALES’- 1022 ‘SDDS’- 1134 ‘ETH’-* ‘GROUP 2’- 2023 ‘SADOSFD’- 2113 ‘WRIOU’-* ‘GROUP 3’- 3006 ‘ASDB’
. . . - ELSE ‘UNKNOWN’) ;
DECODE in COMPUTE DECODE in Dialog Manager
FOCUS rejects comments in the middle of a multi-line DM phrase
Comment lines are OK in the middle of COMPUTE
Copyright 2007, Information Builders. Slide 17
“Why Would Anybody Do That?”
-SET &DEPT = DECODE &DEPTCODE(- 0 ‘GROUP 1’- 1001 ‘SALES’- 1022 ‘SDDS’- 1134 ‘ETH’- 0 ‘GROUP 2’- 2023 ‘SADOSFD’- 2113 ‘WRIOU’- 0 ‘GROUP 3’- 3006 ‘ASDB’
. . . - ELSE ‘UNKNOWN’) ;
-SET &DEPT= DECODE &DEPTCODE(-* ‘GROUP 1’- 1001 ‘SALES’- 1022 ‘SDDS’- 1134 ‘ETH’-* ‘GROUP 2’- 2023 ‘SADOSFD’- 2113 ‘WRIOU’-* ‘GROUP 3’- 3006 ‘ASDB’
. . . - ELSE ‘UNKNOWN’) ;
DECODE in Dialog Manager DECODE in Dialog Manager
Just re-use an impossible value!
Just re-use an impossible value!
Just re-use an impossible value!
Copyright 2007, Information Builders. Slide 18
Other Dialog Manager Rules and Nuances
SET DEFECHO = ALLSET DMPRECISION = 7-RUNTABLE FILE CARPRINT COUNTRY CAR-INCLUDE GETRADHEADING CENTER"VALUE OF PI IS &PI“END-RUN. . . More code-GOTO NOFILE. . .. . . -NOFILE
-CMS STATE GETRAD FILE A-IF &RETCODE EQ 1 GOTO NOFILE; -READIT-TYPE READING FROM GETRAD-READ GETRAD &CIRCUM &RADIUS NOCLOSE-IF &RETCODE EQ 1 GOTO NORAD ; -SET &CIRCUM = LJUST (8,&CIRCUM,'A8');-IF &CIRCUM EQ ' ' GOTO READIT;
-SET &PI = &CIRCUM /(2*&RADIUS);-NORAD-NOFILE
GETRAD FOCEXEC
Em
beds the code as if
it were
already there
ECHO across all routinesCalculation- and display- precision of &variables
Independent labels!
Without NOCLOSE, loop will re-read the 1st record forever
OS interaction
Some system &’s force a -RUN
CLUE
Subroutines require format for last arg
Copyright 2007, Information Builders. Slide 19
Varying Sort Columns on FOCLOG Reports
What is FOCLOG?
FOCUS Online User
FOCUS Online User
FOCUS Batch Job
FOCUS Batch Job
FOCUS Online User
FOCUS Online User
FOCUS Batch Job
FOCUS Batch Job
Memory MemoryMemory
Memory
LOG FILE(character flat file)
LOG FILE(character flat file)
FIN FINFIN
FIN
FOCLOG MFD
FOCLOG MFD
FTP
Mainframe Analysis PC Analysis
Copyright 2007, Information Builders. Slide 20
Varying Sort Columns on FOCLOG Reports
403
Select report 403
Copyright 2007, Information Builders. Slide 21
Varying Sort Columns on FOCLOG Reports
Data sorted by User and
Session Date
Copyright 2007, Information Builders. Slide 22
Varying Sort Columns on FOCLOG Reports
Select to sort by
(D)uration
Copyright 2007, Information Builders. Slide 23
Varying Sort Columns on FOCLOG Reports
Added to the column description
Copyright 2007, Information Builders. Slide 24
Varying Sort Columns on FOCLOG Reports
-* S O R T L I S T -* SDUR-* |SCPU-* ||SEXCP-* |||-SET &SORT101 = ' '; -SET &SORT102 = ' '; -SET &SORT103 = ' X '; -SET &SORT104 = 'X X'; -SET &SORT105 = 'X X'; -SET &SORT106 = 'X X'; -SET &SORT401 = ' ';-SET &SORT402 = ' ';-SET &SORT403 = ’XXX';-SET &SORT404 = ' ';-SET &SORT405 = 'XXX';-SET &SORT406 = ' ';-SET &SORT407 = 'XX ';
Duration, Cpu, Excp
Copyright 2007, Information Builders. Slide 25
Varying Sort Columns on FOCLOG Reports
&ASKSORT
&SORTSEL
Copyright 2007, Information Builders. Slide 26
Varying Sort Columns on FOCLOG Reports
-* CREATE SORT-CHOICES. MAY BE MORE THAN ONE, SO BUILD ASKSORT.-* USE MULTIPLE LINES - &ASKSORT SUBSTITUTION CAN BECOME LONG.-SET &ASKSORT = ‘';-SET &SORTREP = &SORT.&REPORT ;-SET &ASKSORT = IF (EDIT(&SORTREP,'9$$') EQ 'X')- THEN &ASKSORT | ' ' | '(D)URATION' ELSE- &ASKSORT ;-SET &ASKSORT = IF (EDIT(&SORTREP,'$9$') EQ ‘X‘)- THEN &ASKSORT | ' ' | '(C)PU' ELSE - &ASKSORT ;-SET &ASKSORT = IF (EDIT(&SORTREP,'$$9') EQ 'X')- THEN &ASKSORT | ' ' | '(E)XCP' ELSE- &ASKSORT ;-SET &ASKSORT = IF (&ASKSORT EQ ' ') THEN '(None Available) ' - ELSE &ASKSORT ;-* FORCE 'N' IF NO SORTS-SET &SORTSEL=IF(EDIT(&ASKSORT,'$9999')- EQ 'None') THEN 'N' ELSE ' ';
Indexed &variable creates &SORT403Whose value is ‘ X X X’
Append each sort option to the list as you go
Why should each &ASKSORT be on a line by itself?
Copyright 2007, Information Builders. Slide 27
Varying Sort Columns on FOCLOG Reports
-* VERIFY THE OPTIONAL SORT CRITERIA
-* ----------------------------------
-SET &&SORTBY =IF(&SORTSEL EQ ' ') OR (&SORTSEL EQ 'N') THEN ' ' ELSE
- IF(&SORTSEL EQ 'D') AND (EDIT(&SORTREP,'9$$') EQ 'X') THEN 'SDUR' - IF(&SORTSEL EQ 'C') AND (EDIT(&SORTREP,'$9$') EQ 'X') THEN 'SCPU' - IF(&SORTSEL EQ 'E') AND (EDIT(&SORTREP,'$$9') EQ 'X') THEN 'SEXCP'- ELSE 'BAD';
-* MARK COLUMN ON REPORT AS THE "SORT" COLUMN (AFTER CALENDAR AGGREG).-SET &&SDUR = IF (&&SORTBY EQ 'SDUR') THEN '**SORT**' ELSE ' '; -SET &&SCPU = IF (&&SORTBY EQ 'SCPU' ) THEN '**SORT**' ELSE ' '; -SET &&SEXCP = IF (&&SORTBY EQ 'SEXCP') THEN '**SORT**' ELSE ' ';
-SET &&SORTTEXT = DECODE &&SORTBY (' ' ' ' - 'SDUR' 'BY HIGHEST SESDURATION NOPRINT'- 'SCPU' 'BY HIGHEST SESCPU NOPRINT'- 'SEXCP' 'BY HIGHEST SESEXCP NOPRINT'- ELSE ' ');
Copyright 2007, Information Builders. Slide 28
Varying Sort Columns on FOCLOG Reports
TABLE FILEHEADING CENTER"&&HEADER1" "DAILY USER ACTIVITY DETAIL</1"-* PUT DAY RIGHT UP AGAINST STARTDATE SUM DOWTEXT IN +0 AS ' ' COMPUTE REC/D9 = RECORDS/1000; IN +1 AS '&&CREC, RECORDS,EXTRACTED, (/1000)' COMPUTE LIN/D9 = LINES/1000; IN +1 AS '&&CLINE,LINES OF, OUTPUT, (/1000)' COMPUTE DURVALUE/D11.3 = SESDURATION; NOPRINT-INCLUDE FLISDUR COMPUTE DURSHOW/A11 = DURTIME; AS ' &&SDUR, DURATION, HH:MM:SS'COMPUTE CPUVALUE/D11.3 = SESCPU; NOPRINT-INCLUDE FLISCPUCOMPUTE CPUSHOW/A11 = CPUTIME; AS ' &&SCPU, CPU USAGE, HH:MM:SS'-INCLUDE FLISEXCPCOMPUTE EXCPSHOW/A11 = EXCPTIME; AS ' &&SEXCP, CPU USAGE, HH:MM:SS' &&SORTTEXTBY USERID AS ' USER 'BY STARTDATE AS ' SESSION'&&IFDATERANGEFOOTING BOTTOM CENTER"&&FOOTER1 &FOCFOCEXEC"&&HOLDFMTEND
Blank or **SORT**
Blank, or alternate sort preceding other BYs
Copyright 2007, Information Builders. Slide 29
Varying Sort Columns on FOCLOG Reports
Copyright 2007, Information Builders. Slide 30
Multi-Purpose Code
DEFINE FILE CARDFIELD/YYMD WITH COUNTRY = 20080602 ;
TABLE FILE CARPRINTCOMPUTE TFIELD/YYMD = 20080602 ; NOPRINT
MODIFY FILE CARCOMPUTE MFIELD/YYMD = 20080602 ;
&COMPUTE &X|FIELD/YYMD &WITH =&YYMD;&NOPRINT
Basically the same computation in all three places
&X&X&X
Objective: Test all places where a date can be assigned (grossly simplified)
Copyright 2007, Information Builders. Slide 31
Multi-Purpose Code
-SET &COMPUTE = IF(&X EQ ‘T' OR ‘M')THEN 'COMPUTE' ELSE ‘';
-SET &WITH = IF(&X EQ 'D') THEN 'WITH COUNTRY‘ ELSE '';
-SET &NOPRINT = IF(&X EQ 'T') THEN 'NOPRINT‘ ELSE ‘';
&COMPUTE &X|FIELD/YYMD &WITH = &YYMD; &NOPRINT-* NEW DATE FORMATS&COMPUTE &X|YYMD/YYMD = &X|FIELD; &NOPRINT &COMPUTE &X|MDYY/MDYY = &X|FIELD; &NOPRINT &COMPUTE &X|DMYY/DMYY = &X|FIELD; &NOPRINT &COMPUTE &X|YMD/YMD = &X|FIELD; &NOPRINT &COMPUTE &X|MDY/MDY = &X|FIELD; &NOPRINT. . .
Pick up the system date (&YYMD) then propagate
to other fields below
NOT Dialog Manager - resolved line substituted into executed (stacked) code
Actual test suite generates thousands of tests, identically consistent across all
areas of the FOCUS language
Copyright 2007, Information Builders. Slide 32
Capture and Restore SET’ings
.
.
.
.SET SPACES = 3..
FOCPARM ERRORS
-* CAPTURE VALUE OF SPACES-? SET SPACES &SPACES_WASSET SPACES = 1-RUN
TABLE FILE. . .
END-RUN
SET SPACES = &SPACES_WAS
Might be able to useON TABLE SET
instead(not all SETs allow it)
Previous FOCEXEC
PROFILE FOCEXECFOCPROF ERRORS
Copyright 2007, Information Builders. Slide 33
Multi-Purpose Code
-SET &RC= IF(&1 EQ ‘CAPTURE’) THEN ‘-? SET’ ELSE - IF(&1 EQ ‘RESET’ ) THEN 'SET' ELSE 'BAD';-SET &EQ= IF(&1 EQ ‘CAPTURE’) THEN ‘ ‘ ELSE - IF(&1 EQ ‘RESET’ ) THEN ‘=‘ ELSE 'BAD'; -* (error here if BAD)&RC.EVAL ASNAMES &EQ.EVAL &&ASNAMES &RC.EVAL SPACES &EQ.EVAL &&SPACES &RC.EVAL ALL &EQ.EVAL &&ALL&RC.EVAL NODATA &EQ.EVAL &&NODATA. . . (very long list of SETs)
-? SET ASNAMES &&ASNAMES-? SET SPACES &&SPACES. . .
SET ASNAMES = &&ASNAMESSET SPACES = &&SPACES. . .
EX GETSETS CAPTURE-RUN-------------------------LOTS OF FOCEXEC CODE HERE-------------------------EX GETSETS RESET-RUN
GETSETS FOCEXEC called with parameter ‘CAPTURE’ or ‘RESET’
Advantage? Keep one list of SETs for capture and reset
instead of parallel lists
Objective: Capture current value of all SETs, then reset them after
Get the full list from ? SET ALL
Copyright 2007, Information Builders. Slide 34
BONUS Giveaway - Scrabble Code
The routine employs these Dialog Manager techniques:• Indexed &variables• Nested -REPEAT loops• .EVAL suffix on &variables• -WRITE to a file with subsequent Master
'THREAD' permutes into 1,800 unique 4- 5- and 6-letter combinations, but only these are actual words:4-LETTERS: DARE DATE DEAR DRAT
HADE HARD HARE HART HATE HEAD HEAR HEAT HERDPART RATE RATH RHEA READ TAHR TARD TARE TEAR
5-LETTERS: DATER DEATH EARTH HATER HEARD HEART TRADE TREAD6-LETTERS: DEARTH HATRED
Objective: Generate all permutations of a word or string of characters
Show Defs
Hide Defs
Copyright 2007, Information Builders. Slide 35
BONUS Giveaway - Scrabble Code
-*************************** -* SCRABBLE WORD PERMUTATONS -*************************** -* CREATED BY: -* JOEL STARKMAN, DIRECTOR, FOCUS DIVISION, INFORMATION BUILDERS, INC. -* FOR TECH SUMMIT ATTENDEES OF 'ADVANCED DIALOG MANAGER' PRESENTATION -* JUNE 2, 2008
-* PURPOSE: -* GENERATE THE PERMUTATIONS OF A STRING OF LETTERS OR OF A WORD. -* SINCE IT CANNOT DETERMINE WHICH DERIVED WORDS ARE TRULY REAL WORDS, -* ONE MAY FEED THE LIST TO A WORD PROCESSOR TO SELECT VALID WORDS.
-* FOR EXAMPLE, THE WORD 'THREAD' PERMUTES INTO 240 COMBINATIONS OF -* 4- 5- AND 6-LETTER WORDS. ONLY THESE 29 ARE ACTUAL WORDS: -* 4-LETTERS: DEAR DARE DATE DRAT -* HARD HERD HATE HARE HEAR HEAD -* PART RATH RATE READ TARD TERD TEAR -* 5-LETTERS: DATER DEATH EARTH HEART TREAD TRADE HATER HATER -* 6-LETTERS: HATRED -*
-* THIS ROUTINE APPLIES SEVERAL SOPHISTICATED DIALOG MANAGER TECHNIQUES: -* - NESTED -REPEAT LOOPS -* - INDEXED AMPER VARIABLES -* - .EVAL SUFFIX ON AMPERS -* - -WRITE TO A FILE WITH SUBSEQUENT MASTER -*********************************************************************** -* WHAT IS THE SMALLEST WORD PERMITTED? -SET &MINCHAR = 4 ; -* WHAT IS THE SMALLEST SIZE PERMUTATION? -SET &MINPERM = 4 ; -* WHAT IS THE LARGEST WORD PERMITTED? -* (ANYTHING OVER 7 LETTERS TAKES SIGNIFICANT CPU)-SET &MAXSIZE = 9 ; -******************************** -* INITIAL OPERATING SYSTEM SETUP -******************************** -IF &FOCMODE EQ 'CMS' GOTO CMS_OUTPUT; -MVS_OUTPUT SET TRMOUT = OFF DYNAM FREE FILE PERMUTE DYNAM ALLOC FILE PERMUTE NEW CYL SPACE 10,20 DSORG PS RECFM FB - LRECL 4096 BLKSIZE 4096 SET TRMOUT = ON -RUN -GOTO BUILD_WORDS -CMS_OUTPUT -CMS SET CMSTYPE HT -CMS STATE PERMUTE FOCTEMP A -IF &RETCODE EQ 0 GOTO NOOUTPUT ; -CMS ERASE PERMUTE FOCTEMP A -NOOUTPUT -CMS FILEDEF PERMUTE DISK PERMUTE FOCTEMP A -CMS SET CMSTYPE RT -*--------------------------------------------------------------------- -* PROMPT FOR THE WORD OR STRING, AND VERIFY IT -*--------------------------------------------------------------------- -BUILD_WORDS -DEFAULTS &1 = 'ABCDE'; -SET &ORIGWORD = &1 ; -**-SET &ORIGWORD = ' '; -**-PROMPT &ORIGWORD.ENTER WORD UP TO &MAXSIZE.EVAL CHARACTERS, OR QUIT:. -**TO FORCE THE WORD AFTER PROMPT, USE (SET ANY WORD): -**-SET &ORIGWORD = 'ASCEND'; -**-IF &ORIGWORD EQ 'QUIT' GOTO BOTTOM; -*--------------------------------------------- -* VERIFY THE ENTERED WORD -*--------------------------------------------- -* HOW MANY CHARACTERS ARE IN THE PROVIDED WORD? -SET &MAXCHAR = &ORIGWORD.LENGTH ; -* REMOVE LEADING ZERO INSERTED BY .LENGTH FUNCTION -SET &MAXCHAR = EDIT(&MAXCHAR,'$9'); -IF &MAXCHAR GE &MINCHAR THEN GOTO ENOUGHCHARS ; -TYPE &ORIGWORD IS &MAXCHAR LETTERS LONG. MUST BE AT LEAST &MINCHAR -GOTO BOTTOM -ENOUGHCHARS -IF &MAXCHAR LE &MAXSIZE GOTO TOMANYCHARS; -TYPE &ORIGWORD IS &MAXCHAR LETTERS LONG. MAX IS &MAXSIZE -GOTO BOTTOM -TOMANYCHARS -* VERIFY NO BLANKS IN THE WORD -REPEAT GETCHAR FOR &NUMCHAR FROM 1 TO &MAXCHAR -SET &CHAR.&NUMCHAR = - SUBSTR(&MAXCHAR,&ORIGWORD,&NUMCHAR,&NUMCHAR,1,'A1'); -IF &CHAR.&NUMCHAR NE ' ' GOTO GETCHAR ; -TYPE CHARACTER #&NUMCHAR IS BLANK. PLEASE RETYPE. -GOTO BOTTOM -GETCHAR -* FILL IN THE REST OF THE POSITIONS WITH '*' -IF &MAXCHAR EQ &MAXSIZE GOTO NOMORECHAR2 ; -SET &PLUS1 = &MAXCHAR + 1 ; -REPEAT GETCHAR2 FOR &NUMCHAR FROM &PLUS1 TO &MAXSIZE -SET &CHAR.&NUMCHAR = '*'; -GETCHAR2 -NOMORECHAR2 -TYPE INPUT STRING = &ORIGWORD -WRITE PERMUTE INPUT STRING = &ORIGWORD -IF &MAXCHAR LE 5 GOTO NOMSG; -TYPE *** &MAXCHAR CHARACTERS TAKES SIGNIFICANT TIME TO PROCESS *** -NOMSG -* CAPTURE CPU AT START -SET &CPU1 = &FOCCPU ; -*----------------------------------------------------------- -* DO ONLY AS MANY LOOPS AS THE LENGTH OF THE STRING PROVIDED -*----------------------------------------------------------- -REPEAT MIN_TO_MAX FOR &NUMLETS FROM &MINPERM TO &MAXCHAR -SET &TIME = ' '; -SET &TIME = HHMMSS('A8'); -WRITE PERMUTE &DATE &TIME PERMUTATIONS OF &NUMLETS CHARACTERS ... -TYPE &DATE &TIME PERMUTATIONS OF &NUMLETS CHARACTERS ... -* INITIALIZE NUMBER OF PERMUTATIONS FOR THIS MANY CHARACTERS. -SET &NUMPERMS = 0 ; -********************************************************************** -* LOOP THROUGH EACH LEVEL -********************************************************************** -IF &NUMLETS LT 1 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 1 -REPEAT POS1 FOR &POS1 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -SET &PICKED1 = &CHAR.&POS1 ; -IF &NUMLETS LT 2 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 2 -REPEAT POS2 FOR &POS2 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS2 EQ &POS1.EVAL) - THEN GOTO POS2 ; -SET &PICKED2 = &CHAR.&POS2 ; -IF &NUMLETS LT 3 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 3 -REPEAT POS3 FOR &POS3 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS3 EQ &POS1.EVAL OR &POS2.EVAL) - THEN GOTO POS3 ; -SET &PICKED3 = &CHAR.&POS3 ; -IF &NUMLETS LT 4 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 4 -REPEAT POS4 FOR &POS4 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS4 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL) - THEN GOTO POS4 ; -SET &PICKED4 = &CHAR.&POS4 ; -IF &NUMLETS LT 5 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 5 -REPEAT POS5 FOR &POS5 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS5 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL) - THEN GOTO POS5 ; -SET &PICKED5 = &CHAR.&POS5 ; -IF &NUMLETS LT 6 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 6 -REPEAT POS6 FOR &POS6 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS6 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL) - THEN GOTO POS6 ; -SET &PICKED6 = &CHAR.&POS6 ; -IF &NUMLETS LT 7 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 7 -REPEAT POS7 FOR &POS7 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS7 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL OR &POS6.EVAL) - THEN GOTO POS7 ; -SET &PICKED7 = &CHAR.&POS7 ; -IF &NUMLETS LT 8 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 8 -REPEAT POS8 FOR &POS8 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS8 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL OR &POS6.EVAL - OR &POS7.EVAL) - THEN GOTO POS8 ; -SET &PICKED8 = &CHAR.&POS8 ; -IF &NUMLETS LT 9 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 9 -REPEAT POS9 FOR &POS9 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS9 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL OR &POS6.EVAL - OR &POS7.EVAL OR &POS8.EVAL) - THEN GOTO POS9 ; -SET &PICKED9 = &CHAR.&POS9 ; -SKIPINNER -* CREATE THIS PERMUTATION -SET &PERMUTATION = ''; -REPEAT PERM FOR &EACHLET FROM 1 TO &NUMLETS -SET &PERMUTATION = &PERMUTATION | &PICKED.&EACHLET ; -PERM -*-TYPE &PERMUTATION -WRITE PERMUTE &PERMUTATION -* INCREMENT PERMUTATIONS FOUND. TYPE MESSAGE EVERY 500. -SET &NUMPERMS = &NUMPERMS + 1 ; -SET &IMOD = IMOD(&NUMPERMS, 500, 'I2'); -IF &IMOD NE 0 GOTO NOTYET; -TYPE UP TO &NUMPERMS|TH PERMUTATION -NOTYET -* END THE REPEAT LOOPS (IN REVERSE ORDER) -POS9 -POS8 -POS7 -POS6 -POS5 -POS4 -POS3 -POS2 -POS1 -SET &TIME = HHMMSS('A8'); -WRITE PERMUTE &DATE &TIME &NUMPERMS PERMUTATIONS OF &NUMLETS CHARS -TYPE &NUMPERMS PERMUTATIONS OF &NUMLETS CHARS -* END OF OUTER LOOP. CREATE THE PERMUTATIONS OF THE NEXT # OF LETTERS -MIN_TO_MAX -*********************************************************************** -* CLOSE OUT THE PERMUTATION PROCESS -SET &TIME = HHMMSS('A8'); -WRITE PERMUTE &DATE &TIME END OF PERMUTATIONS -TYPE &DATE &TIME END OF PERMUTATIONS -CLOSE PERMUTE -*********************************** -* GENERATE A SUMMARY REPORT -*********************************** -* HERE IS THE MASTER USED TO PROCESS THE TABLE BELOW. -* COPY THESE LINES TO 'PERMUTE MASTER'. -GOTO SKIPMASTER FILENAME = PERMUTE, SUFFIX = FIX SEGNAME = FLATSEG FIELDNAME = , FILL1, A1, A1, $ FIELDNAME = WORD , WORD, A9, A9, $ FIELDNAME = , FILL2, A35,A35, $ FIELDNAME = , FILL3, A35,A35, $ DEFINE POS_1_45/A45 = FILL1 | WORD | FILL2;,$ DEFINE POS_1_80/A80 = FILL1 | WORD | FILL2 | FILL3;,$ -SKIPMASTER DEFINE FILE PERMUTE SIZE_SORT/I1 = ARGLEN(9,WORD,SIZE_SORT); END TABLE FILE PERMUTE HEADING "SUMMARY FOR INPUT STRING = &ORIGWORD " SUM FST.WORD NOPRINT LST.WORD NOPRINT CNT.WORD NOPRINT BY SIZE_SORT NOPRINT ON SIZE_SORT SUBHEAD "<CNT.WORD>PERMUTATIONS FOR <SIZE_SORT>LETTER WORDS" " FIRST WORD IN LIST = <FST.WORD" " LAST WORD IN LIST = <LST.WORD" -* ELIMINATE SPURIOUS LINES IN THE FLAT FILE. IF POS_1_45 NE ' ' IF POS_1_45 OMITS 'PERMUTATION' OR 'FOCEXEC =' WHERE WORD NE 'NPUT STRI' OR ' ' OR 'ERMUTATIO' ON TABLE SET PAGE NOPAGE ON TABLE SET MSG OFF ON TABLE SET SCREEN OFF ON TABLE SET PAUSE OFF END -RUN -GOTO BOTTOM -******************************************************************* -* PLAY WITH THE CPU UTILIZED BY THIS RUN. -* DETERMINE A BASE NUMBER FROM PREVIOUS RUNS. -SET &BASECPU = IF &MAXCHAR EQ 6 THEN 8200 ELSE - IF &MAXCHAR GT 6 THEN 65300 ELSE 1000 ; -SET &DIFF = &FOCCPU - &CPU1 ; -SET &LOWCPU = &BASECPU - (&DIFF / 10); -SET &HICPU = &BASECPU + (&DIFF / 10); -TYPE LOWCPU = &LOWCPU -TYPE HICPU = &HICPU -TYPE DIFF = &DIFF -IF (&DIFF GE &LOWCPU) AND - (&DIFF LE &HICPU) GOTO CPU_OK ELSE -IF (&DIFF GE &HICPU) GOTO CPU_HI; -CPU_LOW -TYPE CPU USED FOR PERMUTATIONS DROPPED BY MORE THAN 10% -GOTO BOTTOM -CPU_HI -TYPE CPU USED FOR PERMUTATIONS INCREASED BY MORE THAN 10% -GOTO BOTTOM -CPU_OK -TYPE CPU USED FOR PERMUTATIONS WAS WITHIN EXPECTED VALUES -GOTO BOTTOM -BOTTOM
-EXIT
Here’s how to get the code. After Summit, 1. Go to Information Builders website2. Locate the Summit 2008 presentations3. Locate the Core FOCUS track4. Download ‘Advanced Dialog Manager’ presentation5. Copy this code from this slide into a pc file6. Transfer code to your FOCUS or WebFOCUS location7. Execute the code -- try different words
-*************************** -* SCRABBLE WORD PERMUTATONS -*************************** -* CREATED BY: -* JOEL STARKMAN, DIRECTOR, FOCUS DIVISION, INFORMATION BUILDERS, INC. -* FOR TECH SUMMIT ATTENDEES OF 'ADVANCED DIALOG MANAGER' PRESENTATION -* JUNE 2, 2008 -* PURPOSE: -* GENERATE THE PERMUTATIONS OF A STRING OF LETTERS OR OF A WORD. -* SINCE IT CANNOT DETERMINE WHICH DERIVED WORDS ARE TRULY REAL WORDS, -* ONE MAY FEED THE LIST TO A WORD PROCESSOR TO SELECT VALID WORDS. -* FOR EXAMPLE, THE WORD 'THREAD' PERMUTES INTO 240 COMBINATIONS OF -* 4- 5- AND 6-LETTER WORDS. ONLY THESE 29 ARE ACTUAL WORDS: -* 4-LETTERS: DEAR DARE DATE DRAT -* HARD HERD HATE HARE HEAR HEAD -* PART RATH RATE READ TARD TERD TEAR -* 5-LETTERS: DATER DEATH EARTH HEART TREAD TRADE HATER HATER -* 6-LETTERS: HATRED -* -* THIS ROUTINE APPLIES SEVERAL SOPHISTICATED DIALOG MANAGER TECHNIQUES: -* - NESTED -REPEAT LOOPS -* - INDEXED AMPER VARIABLES -* - .EVAL SUFFIX ON AMPERS -* - -WRITE TO A FILE WITH SUBSEQUENT MASTER -*********************************************************************** -* WHAT IS THE SMALLEST WORD PERMITTED? -SET &MINCHAR = 4 ; -* WHAT IS THE SMALLEST SIZE PERMUTATION? -SET &MINPERM = 4 ; -* WHAT IS THE LARGEST WORD PERMITTED? ANYTHING OVER 7 TAKES SIGNIF CPU -SET &MAXSIZE = 9 ; -******************************** -* INITIAL OPERATING SYSTEM SETUP -******************************** -IF &FOCMODE EQ 'CMS' GOTO CMS_OUTPUT; -MVS_OUTPUT SET TRMOUT = OFF DYNAM FREE FILE PERMUTE DYNAM ALLOC FILE PERMUTE NEW CYL SPACE 10,20 DSORG PS RECFM FB - LRECL 4096 BLKSIZE 4096 SET TRMOUT = ON -RUN -GOTO BUILD_WORDS -CMS_OUTPUT -CMS SET CMSTYPE HT -CMS STATE PERMUTE FOCTEMP A -IF &RETCODE EQ 0 GOTO NOOUTPUT ; -CMS ERASE PERMUTE FOCTEMP A -NOOUTPUT -CMS FILEDEF PERMUTE DISK PERMUTE FOCTEMP A -CMS SET CMSTYPE RT -*--------------------------------------------------------------------- -* PROMPT FOR THE WORD OR STRING, AND VERIFY IT -*--------------------------------------------------------------------- -BUILD_WORDS -DEFAULTS &1 = 'ABCDE'; -SET &ORIGWORD = &1 ; -**-SET &ORIGWORD = ' '; -**-PROMPT &ORIGWORD.ENTER WORD UP TO &MAXSIZE.EVAL CHARACTERS, OR QUIT:. -**TO FORCE THE WORD AFTER PROMPT, USE (SET ANY WORD): -**-SET &ORIGWORD = 'ASCEND'; -**-IF &ORIGWORD EQ 'QUIT' GOTO BOTTOM; -*--------------------------------------------- -* VERIFY THE ENTERED WORD -*--------------------------------------------- -* HOW MANY CHARACTERS ARE IN THE PROVIDED WORD? -SET &MAXCHAR = &ORIGWORD.LENGTH ; -* REMOVE LEADING ZERO INSERTED BY .LENGTH FUNCTION -SET &MAXCHAR = EDIT(&MAXCHAR,'$9'); -IF &MAXCHAR GE &MINCHAR THEN GOTO ENOUGHCHARS ; -TYPE &ORIGWORD IS &MAXCHAR LETTERS LONG. MUST BE AT LEAST &MINCHAR -GOTO BOTTOM -ENOUGHCHARS -IF &MAXCHAR LE &MAXSIZE GOTO TOMANYCHARS; -TYPE &ORIGWORD IS &MAXCHAR LETTERS LONG. MAX IS &MAXSIZE -GOTO BOTTOM -TOMANYCHARS -* VERIFY NO BLANKS IN THE WORD -REPEAT GETCHAR FOR &NUMCHAR FROM 1 TO &MAXCHAR -SET &CHAR.&NUMCHAR = - SUBSTR(&MAXCHAR,&ORIGWORD,&NUMCHAR,&NUMCHAR,1,'A1'); -IF &CHAR.&NUMCHAR NE ' ' GOTO GETCHAR ; -TYPE CHARACTER #&NUMCHAR IS BLANK. PLEASE RETYPE. -GOTO BOTTOM -GETCHAR -* FILL IN THE REST OF THE POSITIONS WITH '*' -IF &MAXCHAR EQ &MAXSIZE GOTO NOMORECHAR2 ; -SET &PLUS1 = &MAXCHAR + 1 ; -REPEAT GETCHAR2 FOR &NUMCHAR FROM &PLUS1 TO &MAXSIZE -SET &CHAR.&NUMCHAR = '*'; -GETCHAR2 -NOMORECHAR2 -TYPE INPUT STRING = &ORIGWORD -WRITE PERMUTE INPUT STRING = &ORIGWORD -IF &MAXCHAR LE 5 GOTO NOMSG; -TYPE *** &MAXCHAR CHARACTERS TAKES SIGNIFICANT TIME TO PROCESS *** -NOMSG -* CAPTURE CPU AT START -SET &CPU1 = &FOCCPU ; -*----------------------------------------------------------- -* DO ONLY AS MANY LOOPS AS THE LENGTH OF THE STRING PROVIDED -*----------------------------------------------------------- -REPEAT MIN_TO_MAX FOR &NUMLETS FROM &MINPERM TO &MAXCHAR -SET &TIME = ' '; -SET &TIME = HHMMSS('A8'); -WRITE PERMUTE &DATE &TIME PERMUTATIONS OF &NUMLETS CHARACTERS ... -TYPE &DATE &TIME PERMUTATIONS OF &NUMLETS CHARACTERS ... -* INITIALIZE NUMBER OF PERMUTATIONS FOR THIS MANY CHARACTERS. -SET &NUMPERMS = 0 ; -********************************************************************** -* LOOP THROUGH EACH LEVEL -********************************************************************** -IF &NUMLETS LT 1 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 1 -REPEAT POS1 FOR &POS1 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -SET &PICKED1 = &CHAR.&POS1 ; -IF &NUMLETS LT 2 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 2 -REPEAT POS2 FOR &POS2 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS2 EQ &POS1.EVAL) - THEN GOTO POS2 ; -SET &PICKED2 = &CHAR.&POS2 ; -IF &NUMLETS LT 3 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 3 -REPEAT POS3 FOR &POS3 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS3 EQ &POS1.EVAL OR &POS2.EVAL) - THEN GOTO POS3 ; -SET &PICKED3 = &CHAR.&POS3 ; -IF &NUMLETS LT 4 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 4 -REPEAT POS4 FOR &POS4 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS4 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL) - THEN GOTO POS4 ; -SET &PICKED4 = &CHAR.&POS4 ; -IF &NUMLETS LT 5 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 5 -REPEAT POS5 FOR &POS5 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS5 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL) - THEN GOTO POS5 ; -SET &PICKED5 = &CHAR.&POS5 ; -IF &NUMLETS LT 6 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 6 -REPEAT POS6 FOR &POS6 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS6 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL) - THEN GOTO POS6 ; -SET &PICKED6 = &CHAR.&POS6 ; -IF &NUMLETS LT 7 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 7 -REPEAT POS7 FOR &POS7 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS7 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL OR &POS6.EVAL) - THEN GOTO POS7 ; -SET &PICKED7 = &CHAR.&POS7 ; -IF &NUMLETS LT 8 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 8 -REPEAT POS8 FOR &POS8 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS8 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL OR &POS6.EVAL - OR &POS7.EVAL) - THEN GOTO POS8 ; -SET &PICKED8 = &CHAR.&POS8 ; -IF &NUMLETS LT 9 GOTO SKIPINNER ; -* LOOP THROUGH EACH CHAR AT LEVEL 9 -REPEAT POS9 FOR &POS9 FROM 1 TO &MAXCHAR -* PICK A CHAR FOR THIS LEVEL. SKIP CHARS ALREADY USED ABOVE -IF (&POS9 EQ &POS1.EVAL OR &POS2.EVAL OR &POS3.EVAL - OR &POS4.EVAL OR &POS5.EVAL OR &POS6.EVAL - OR &POS7.EVAL OR &POS8.EVAL) - THEN GOTO POS9 ; -SET &PICKED9 = &CHAR.&POS9 ; -SKIPINNER -* CREATE THIS PERMUTATION -SET &PERMUTATION = ''; -REPEAT PERM FOR &EACHLET FROM 1 TO &NUMLETS -SET &PERMUTATION = &PERMUTATION | &PICKED.&EACHLET ; -PERM -*-TYPE &PERMUTATION -WRITE PERMUTE &PERMUTATION -* INCREMENT PERMUTATIONS FOUND. TYPE MESSAGE EVERY 500. -SET &NUMPERMS = &NUMPERMS + 1 ; -SET &IMOD = IMOD(&NUMPERMS, 500, 'I2'); -IF &IMOD NE 0 GOTO NOTYET; -TYPE UP TO &NUMPERMS|TH PERMUTATION -NOTYET -* END THE REPEAT LOOPS (IN REVERSE ORDER) -POS9 -POS8 -POS7 -POS6 -POS5 -POS4 -POS3 -POS2 -POS1 -SET &TIME = HHMMSS('A8'); -WRITE PERMUTE &DATE &TIME &NUMPERMS PERMUTATIONS OF &NUMLETS CHARS -TYPE &NUMPERMS PERMUTATIONS OF &NUMLETS CHARS -* END OF OUTER LOOP. CREATE THE PERMUTATIONS OF THE NEXT # OF LETTERS -MIN_TO_MAX -*********************************************************************** -* CLOSE OUT THE PERMUTATION PROCESS -SET &TIME = HHMMSS('A8'); -WRITE PERMUTE &DATE &TIME END OF PERMUTATIONS -TYPE &DATE &TIME END OF PERMUTATIONS -CLOSE PERMUTE -*********************************** -* GENERATE A SUMMARY REPORT -*********************************** -* HERE IS THE MASTER USED TO PROCESS THE TABLE BELOW. -* COPY THESE LINES TO 'PERMUTE MASTER'. -GOTO SKIPMASTER FILENAME = PERMUTE, SUFFIX = FIX SEGNAME = FLATSEG FIELDNAME = , FILL1, A1, A1, $ FIELDNAME = WORD , WORD, A9, A9, $ FIELDNAME = , FILL2, A35,A35, $ FIELDNAME = , FILL3, A35,A35, $ DEFINE POS_1_45/A45 = FILL1 | WORD | FILL2;,$ DEFINE POS_1_80/A80 = FILL1 | WORD | FILL2 | FILL3;,$ -SKIPMASTER DEFINE FILE PERMUTE SIZE_SORT/I1 = ARGLEN(9,WORD,SIZE_SORT); END TABLE FILE PERMUTE HEADING "SUMMARY FOR INPUT STRING = &ORIGWORD " SUM FST.WORD NOPRINT LST.WORD NOPRINT CNT.WORD NOPRINT BY SIZE_SORT NOPRINT ON SIZE_SORT SUBHEAD "<CNT.WORD>PERMUTATIONS FOR <SIZE_SORT>LETTER WORDS" " FIRST WORD IN LIST = <FST.WORD" " LAST WORD IN LIST = <LST.WORD" -* ELIMINATE SPURIOUS LINES IN THE FLAT FILE. IF POS_1_45 NE ' ' IF POS_1_45 OMITS 'PERMUTATION' OR 'FOCEXEC =' WHERE WORD NE 'NPUT STRI' OR ' ' OR 'ERMUTATIO' ON TABLE SET PAGE NOPAGE ON TABLE SET MSG OFF ON TABLE SET SCREEN OFF ON TABLE SET PAUSE OFF END -RUN -GOTO BOTTOM -******************************************************************* -* PLAY WITH THE CPU UTILIZED BY THIS RUN. -* DETERMINE A BASE NUMBER FROM PREVIOUS RUNS. -SET &BASECPU = IF &MAXCHAR EQ 6 THEN 8200 ELSE - IF &MAXCHAR GT 6 THEN 65300 ELSE 1000 ; -SET &DIFF = &FOCCPU - &CPU1 ; -SET &LOWCPU = &BASECPU - (&DIFF / 10); -SET &HICPU = &BASECPU + (&DIFF / 10); -TYPE LOWCPU = &LOWCPU -TYPE HICPU = &HICPU -TYPE DIFF = &DIFF -IF (&DIFF GE &LOWCPU) AND - (&DIFF LE &HICPU) GOTO CPU_OK ELSE -IF (&DIFF GE &HICPU) GOTO CPU_HI; -CPU_LOW -TYPE CPU USED FOR PERMUTATIONS DROPPED BY MORE THAN 10% -GOTO BOTTOM -CPU_HI -TYPE CPU USED FOR PERMUTATIONS INCREASED BY MORE THAN 10% -GOTO BOTTOM -CPU_OK -TYPE CPU USED FOR PERMUTATIONS WAS WITHIN EXPECTED VALUES -GOTO BOTTOM -BOTTOM
-EXIT
Copyright 2007, Information Builders. Slide 36
Advanced Dialog Manager