Prod: | WebFOCUS 7.6.10/8.1.04 | Upgrade: | WebFOCUS 8.2.07 | OS: | Linux | Outputs: | HTML, PDF, Excel, PPT |
In Focus since 1984 | |||||||
Pity the lost knowledge of an old programmer! |
Frank | |
prod: WF 7.6.10 platform Windows, databases: msSQL2000, msSQL2005, RMS, Oracle, Sybase,IE7 test: WF 7.6.10 on the same platform and databases,IE7 |
quote:...calculating a Modulus 10 check digit on a variable length number...
-* File TheModSquad.fex APP PREPENDPATH IBISAMP -* DEFINE FUNCTION GET_DIGIT(SN/D20, X1/D20) GET_DIGIT/I2 = DMOD(SN, X1, 'D2') / (X1 / 10); END -* DEFINE FUNCTION SUM_DIGIT(DIVIDEND/I2) SUM_DIGIT/I1 = (IMOD(DIVIDEND, 100, 'I2') / 10) + IMOD(DIVIDEND, 10, 'I2') ; END -* DEFINE FILE CAR -* Generating numbers to use as test cases (starting numbers). START_NUM/D10 = DECODE CAR ('DATSUN' 7992739871 'AUDI' 23 'TOYOTA' 5556); -* Add a zero to the end of the Starting Number. START_NUM_D20/D20 = START_NUM * 10; -* Double every other digit, and then sum the resulting digit(s). DIGIT02/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 100) * 2); DIGIT03/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 1000)); DIGIT04/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 10000) * 2); DIGIT05/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 100000)); DIGIT06/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 1000000) * 2); DIGIT07/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 10000000)); DIGIT08/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 100000000) * 2); DIGIT09/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 1000000000)); DIGIT10/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 10000000000) * 2); DIGIT11/I2 = SUM_DIGIT(GET_DIGIT(START_NUM_D20, 100000000000)); -* Add each, and multiply by 9. CHECKIT/D3 = (DIGIT02 + DIGIT03 + DIGIT04 + DIGIT05 + DIGIT06 + DIGIT07 + DIGIT08 + DIGIT09 + DIGIT10 + DIGIT11) * 9; -* Pull the check digit. CHECKDIGIT/D1 = DMOD(CHECKIT, 10, 'D1'); -* Create the final full output number. FULL_NUMBER/D22c = START_NUM_D20 + CHECKDIGIT; END -* TABLE FILE CAR PRINT START_NUM AS 'Starting/Input Number' FULL_NUMBER AS 'Final Full/Output Number' IF CAR EQ 'DATSUN' OR 'AUDI' OR 'TOYOTA' ON TABLE SET PAGE NOPAGE ON TABLE SET ONLINE-FMT STANDARD END
Starting/Input Number Final Full/Output Number --------------------- ------------------------ 7,992,739,871 79927398713 5,556 55566 23 232
-DEFAULT &n = '7992739871'; -SET &c = 0; -SET &o = IMOD(&n.LENGTH + 1, 2, 'I1'); -REPEAT ENDREPEAT FOR &i FROM &n.LENGTH TO 1 STEP -1 -SET &d = SUBSTR(&n.LENGTH, &n, &i, &i, 1, 'A1'); -SET &c = IF IMOD(&i, 2, 'I1') EQ &o THEN (&c + &d) ELSE (&c + DECODE &d (0 0 1 2 2 4 3 6 4 8 5 1 6 3 7 5 8 7 9 9)); -ENDREPEAT -SET &c = IMOD(&c * 9, 10, 'I1'); -TYPE Number = &n Check Digit = &c