DSN8MP1
RETRIEVES LAST CONVERSATION.
/********************************************************************* 00010000
* * 00020000
* MODULE NAME = DSN8MP1 * 00030000
* * 00040000
* DESCRIPTIVE NAME = DB2 SAMPLE APPLICATION PROGRAM * 00050000
* SQL 1 COMMON MODULE * 00060000
* IMS & CICS * 00070000
* PL/I * 00080000
* * 00090000
* * 00100000
* COPYRIGHT = 5665-DB2 (C) COPYRIGHT IBM CORP 1982, 1989 * 00110000
* REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083 * 00120000
* * 00130000
* STATUS = VERSION 2 RELEASE 2, LEVEL 0 * 00140000
* * 00150000
* FUNCTION = RETRIEVES LAST CONVERSATION. * 00160000
* HANDLE 'RESEND' AND 'END' CASES. * 00170000
* CALL VALIDATION ROUTINES DSN8MP3 THRU DSN8MP5. * 00180000
* CALLS SQL2 ROOT (DSN8CP2 OR DSN8IP2). * 00190000
* OR (DSN8CP8 OR DSN8IP8). * 00200000
* * 00210000
* NOTES = NONE * 00220000
* * 00230000
* MODULE TYPE = BLOCK OF PL/I CODE * 00240000
* PROCESSOR = DB2 PRECOMPILER, PL/I OPTIMIZER * 00250000
* MODULE SIZE = SEE LINKEDIT * 00260000
* ATTRIBUTES = NONE * 00270000
* * 00280000
* ENTRY POINT = DSN8MP1 * 00290000
* PURPOSE = SEE FUNCTION * 00300000
* LINKAGE = INCLUDED BY MODULE DSN8IP1 OR DSN8CP1 * 00310000
* OR DSN8IP7 OR DSN8CP7 * 00320000
* * 00330000
* INPUT = PARAMETERS EXPLICITLY PASSED TO THIS FUNCTION: * 00340000
* SYMBOLIC LABEL/NAME = NONE * 00350000
* DESCRIPTION = NONE * 00360000
* * 00370000
* OUTPUT = PARAMETERS EXPLICITLY RETURNED: * 00380000
* SYMBOLIC LABEL/NAME = NONE * 00390000
* DESCRIPTION = NONE * 00400000
* * 00410000
* * 00420000
* EXIT-NORMAL = DROP THRU TO NEXT LINE OF CODE IN DSN8CP1/IP1 * 00430000
* OR DSN8CP7/IP7 * 00440000
* * 00450000
* EXIT-ERROR = IF SQLERROR OR SQLWARNING, SQL WHENEVER CONDITION * 00460000
* SPECIFIED IN DSN8CP1/DSN8CP7/DSN8IP1/DSN8IP7 * 00470000
* WILL BE RAISED AND PROGRAM * 00480000
* WILL GO TO THE LABEL DB_ERROR. * 00490000
* * 00500000
* * 00510000
* RETURN CODE = NONE * 00520000
* * 00530000
* ABEND CODES = NONE * 00540000
* * 00550000
* ERROR-MESSAGES = * 00560000
* DSN8051I - PROGRAM ENDED * 00570000
* * 00580000
* EXTERNAL REFERENCES = MOST VARIABLES ARE GLOBAL AND DEFINED * 00590000
* IN DSN8CP1/IP1/CP7/IP7. * 00600000
* ROUTINES/SERVICES = * 00610000
* INCLUDING DSN8MP3 THRU DSN8MP5. * 00620000
* DSN8MPG - ERROR MESSAGE ROUTINE * 00630000
* * 00640000
* DATA-AREAS = NONE * 00650000
* * 00660000
* CONTROL-BLOCKS = * 00670000
* SQLCA - SQL COMMUNICATION AREA * 00680000
* * 00690000
* TABLES = NONE * 00700000
* * 00710000
* CHANGE-ACTIVITY = NONE * 00720000
* * 00730000
* * 00740000
* *PSEUDOCODE* * 00750000
* * 00760000
* PROCEDURE * 00770000
* ELIMINATE LEADING BLANKS ON DATA LINE IF NOT ALL BLANK. * 00780000
* * 00790000
* SET UP CONTROL FLAGS FOR 'RESEND' 'END' 'NEXT' * 00800000
* FIRST BY EXAMINING THE DATA LINE AND THEN COMPARING THE * 00810000
* PF KEYS (COMPARM.PFKIN) * 00820000
* * 00830000
* RETRIEVE LAST CONVERSATION FROM VCONA. * 00840000
* * 00850000
* IF LAST CONVERSATION IS NOT FOUND THEN DO. * 00860000
* COMPARM.NEWCONV = 'Y'. * 00870000
* PCONVSTA = '' . * 00880000
* END. * 00890000
* * 00900000
* ELSE DO. * 00910000
* PCONVSTA = LAST CONVERSATION RETRIEVED. * 00920000
* IF RESEND, BYPASS VALIDATION AND SAVE, JUST RESEND. * 00930000
* IF END, DELETE CONVERSATION, SEND MESSAGE & GOTO CP1EXIT. * 00940000
* IF NO SYSTEMS FIELDS WAS CHANGED, BYPASS VALIDATION. * 00950000
* END. * 00960000
* * 00970000
* CALL VALIDATION MODULES DSN8MP3 THRU DSN8MP5 WHILE * 00980000
* RETURN CODE IS 0. OTHERWISE GO TO MP1SAVE. * 00990000
* * 01000000
* GO TO CP1CALL IN DSN8CP1/IP1 TO CALL DSN8CP2/IP2. * 01010000
* OR DSN8CP7/IP7 TO CALL DSN8CP8/IP8. * 01020000
* * 01030000
* MP1SAVE: * 01040000
* INSERT/UPDATE CURRENT CONVERSATION INTO VCONA. * 01050000
* * 01060000
* END. * 01070000
*********************************************************************/ 01080000
/*------------------------------------------------------------------*/ 01090000
/* */ 01100000
/* INITIAL EDITING FOR DATA INPUT */ 01110000
/* */ 01120000
/* 1. THE DATA LINE IS SHIFTED LEFT UNTIL ALL LEADING BLANKS */ 01130000
/* HAVE BEEN ELIMINATED. */ 01140000
/* 2. THE APPROPRIATE BITS FOR 'RESEND' , 'END' ETC. ARE THEN */ 01150000
/* SET ACCORDING TO INPUT ON DATA LINE. ' */ 01160000
/* 3. IF PFKEY 1/2/3/8 HAS BEEN USED, THE APPROPRIATE BIT */ 01170000
/* IS SET FOR 'RESEND' , 'SEND' ETC.. THIS TAKES PRECEDENCE */ 01180000
/* OVER THE SETTING OF THE SAME BITS IN STEP2.* */ 01190000
/* */ 01200000
/* * I.E. IF SOMEONE TYPES IN 'RESEND' ON THE DATA LINE AND */ 01210000
/* USES THE PF3 KEY AT THE SAME TIME, THE PF3 (END) */ 01220000
/* FUNCTION IS ASSUMED TO BE THE ACTUAL REQUEST. */ 01230000
/* */ 01240000
/*------------------------------------------------------------------*/ 01250000
0DSN8_MODULE_NAME.MAJOR = 'DSN8MP1 '; /* GET MODULE NAME */ 01260000
MODULE = 'DSN8MP1'; 01270000
01280000
/***********************************************************/ 01290000
/* **INITIALIZE CONTROL FLAGS */ 01300000
/***********************************************************/ 01310000
01320000
OFF = '0'B ; 01330000
01340000
ON = '1'B ; 01350000
01360000
SENDBIT,ENDBIT,NEXTBIT = '0'B ; 01370000
01380000
/****************************************************************/ 01390000
/* **SET UP CONTROL FLAGS FOR 'RESEND' 'END' 'NEXT' */ 01400000
/* **USING THE INPUT DATA */ 01410000
/****************************************************************/ 01420000
01430000
0IF COMPARM.DATA ^= ' ' THEN 01440000
DO; 01450000
DO WHILE (SUBSTR(COMPARM.DATA,1,1) = ' '); 01460000
SUBSTR(COMPARM.DATA,1,60) = SUBSTR(COMPARM.DATA,2,59) || ' ';01470000
END; 01480000
/*RESEND COMMAND OR*/ 01490000
/*PF KEY 02 */ 01500000
IF SUBSTR(COMPARM.DATA,1,7) = 'RESEND ' THEN SENDBIT = ON; 01510000
01520000
/*END COMMAND OR */ 01530000
/*PF KEY 03 */ 01540000
ELSE IF SUBSTR(COMPARM.DATA,1,4) = 'END ' THEN ENDBIT = ON; 01550000
01560000
/*NEXT COMMAND OR */ 01570000
/*PF KEY 08 */ 01580000
ELSE IF SUBSTR(COMPARM.DATA,1,5) = 'NEXT ' THEN NEXTBIT = ON; 01590000
END; 01600000
01610000
01620000
/****************************************************************/ 01630000
/* **SET UP CONTROL FLAGS FOR 'RESEND' 'END' 'NEXT' */ 01640000
/* **USING THE PFKEYS */ 01650000
/****************************************************************/ 01660000
01670000
0IF COMPARM.PFKIN ^= ' ' THEN 01680000
DO; 01690000
/*RESEND COMMAND OR*/ 01700000
/*PF KEY 02 */ 01710000
IF COMPARM.PFKIN = '02' THEN SENDBIT = ON; 01720000
01730000
/*END COMMAND OR */ 01740000
/*PF KEY 03 */ 01750000
ELSE IF COMPARM.PFKIN = '03' THEN ENDBIT = ON; 01760000
01770000
/*NEXT COMMAND OR */ 01780000
/*PF KEY 08 */ 01790000
ELSE IF COMPARM.PFKIN = '08' THEN NEXTBIT = ON; 01800000
01810000
END; 01820000
%PAGE; 01830000
/*------------------------------------------------------------------*/ 01840000
/* */ 01850000
/* RESTORE LAST MESSAGE AND DETERMINE IF VALIDATION IS NECESSARY */ 01860000
/* */ 01870000
/* 1. RETRIEVE LAST CONVERSATION, IF RETRIEVAL NOT SUCCESSFUL */ 01880000
/* THEN CONVERSATION IS NEW. */ 01890000
/* 2. IF RETRIEVAL SUCCESSFUL, THEN PUT LAST CONVERSATION */ 01900000
/* INTO PCONVSTA. */ 01910000
/* 3. IF RESEND REQUEST, DON'T VALIDATE & DON'T SAVE, JUST RESEND.*/ 01920000
/* 4. IF END REQUEST, DELETE CONVERSATION, SEND END MESSAGE, EXIT.*/ 01930000
/* 5. IF NONE OF THE SYSTEMS FIELDS HAS BEEN CHANGED SINCE */ 01940000
/* LAST SAVED, BYPASS VALIDATION ALSO. */ 01950000
/* 6. OTHERWISE VALIDATE EACH OF THE SYSTEM FIELDS. */ 01960000
/* */ 01970000
/*------------------------------------------------------------------*/ 01980000
01990000
0COMPARM.NEWREQ = 'N' ; /* INITIALIZE TO NOT NEW REQUEST*/ 02000000
SAVE_CONVID = PCONVSTA.CONVID; /* SAVE THE CURRENT CONVID */ 02010000
02020000
0 EXEC SQL SELECT * 02030000
INTO :PCONA 02040000
FROM VCONA 02050000
WHERE CONVID =:SAVE_CONVID; 02060000
02070000
/*RETRIEVAL NOT SUCCESSFUL- */ 02080000
/*INITIALIZE TO NEW CONVERSATION*/ 02090000
02100000
IF SQLCODE = +100 THEN 02110000
DO; 02120000
COMPARM.NEWCONV = 'Y'; /* SET TO A NEW CONVERSATION */ 02130000
PCONVSTA = ''; 02140000
PCONVSTA.CONVID = SAVE_CONVID ; /* RESTORE CONVID */ 02150000
PCONVSTA.LASTSCR = 'DSN8001 ' ; /* DEFAULT SCREEN */ 02160000
PCONA.CONVID = PCONVSTA.CONVID; /* SET CONVERSATION ID*/ 02170000
END; 02180000
02190000
ELSE 02200000
DO; 02210000
/*RETRIEVAL SUCCESSFUL- */ 02220000
/*INITIALIZE TO OLD CONVERSATION*/ 02230000
02240000
COMPARM.NEWCONV = 'N' ; /* SET TO AN OLD CONVERSATION*/ 02250000
PCONVSTA.LASTSCR = PCONA.LASTSCR ; 02260000
STRING( PCONVSTA.LASTPOS ) = PCONA.LASTPOS ; 02270000
PCONVSTA.LASTPOSC= PCONA.LASTPOSC; 02280000
STRING(OUTAREA) = PCONA.LASTMSG ; 02290000
02300000
/*IF CONVERSATION EXISTS BUT DATA*/ 02310000
/*ENTERED FROM CLEARED SCREEN, */ 02320000
/*THEN TREAT LIKE RESEND */ 02330000
02340000
IF ( COMPARM.PFKIN = '00' ) | SENDBIT THEN 02350000
GO TO CP1EXIT ; 02360000
02370000
/*IF END REQUEST THEN DELETE CON-*/ 02380000
/*VERSATION AND SEND END MESSAGE */ 02390000
02400000
IF ENDBIT THEN 02410000
DO; 02420000
EXITCODE = '1'; /* NOTE THAT WE SHOULD EXIT */ 02430000
DSN8_MODULE_NAME.MINOR = 'DELETE '; 02440000
STRING(PCONVSTA.OUTAREA) = ' '; 02450000
EXEC SQL DELETE 02460000
FROM VCONA 02470000
WHERE CONVID = :PCONA.CONVID; 02480000
02490000
/* PRINT MESSAGE: */ 02500000
/* PROGRAM ENDED */ 02510000
02520000
CALL DSN8MPG (MODULE, '051I', OUTMSG); 02530000
MESSAGE.MSGTXT = OUTMSG; 02540000
OUTAREA.MAJSYS = INAREA.MAJSYS; /* SET MAJ SYSTEM */ 02550000
GO TO CP1EXIT; 02560000
END; 02570000
02580000
/*************************************************************/ 02590000
/* **IF OLD CONVERSATION AND SYSTEM */ 02600000
/* **FIELDS HAVE NOT CHANGED THEN */ 02610000
/* **BYPASS VALIDATION */ 02620000
/*************************************************************/ 02630000
02640000
02650000
IF ( SUBSTR(STRING(COMPARM.INAREA),1,6) = 02660000
SUBSTR(STRING(PCONVSTA.OUTAREA),1,6) ) THEN 02670000
DO; /* OLD CONVERSATION*/ 02680000
IF PCONVSTA.PREV='D' & 02690000
(COMPARM.PFKIN ^= '10' | COMPARM.OBJFLD ^= 'DS') & 02695002
((COMPARM.DATA^=PCONVSTA.DATA) | 02700000
(COMPARM.ACTION = 'D')) THEN 02705000
COMPARM.NEWREQ = 'Y'; 02710000
GOTO MP1BOTH; 02720000
END; 02730000
END; 02740000
02750000
/* NEW CONVERSATION*/ 02760000
/************************************************************/ 02770000
/* **VALIDATES FIELDS */ 02780000
/************************************************************/ 02790000
02800000
COMPARM.NEWREQ = 'Y' ; 02810000
OUTAREA.MAJSYS = INAREA.MAJSYS; /* SET MAJ SYSTEM */ 02820000
OUTAREA.OBJFLD = INAREA.OBJFLD; /* SET OBJECT */ 02830003
OUTAREA.DESC3 = ''; /* CLEAR DESCRIPTN */ 02840000
OUTAREA.SEARCH = INAREA.SEARCH; /* SET SEARCH CRIT */ 02850000
OUTAREA.DESC4 = ''; /* CLEAR DESCRIPTN */ 02860000
CALL DSN8MP3 ; /* VALIDATE ACTION */ 02870000
IF RETCODE = '1' THEN GO TO MP1SAVE ; 02880000
CALL DSN8MP4 ; /* VALIDATE OBJECT */ 02890004
IF RETCODE = '1' THEN GO TO MP1SAVE ; 02900000
CALL DSN8MP5 ; /* VALIDATE SEARCH */ 02910000
IF RETCODE = '1' THEN GO TO MP1SAVE ; 02920000
%PAGE; 02930000
/**********************************************************/ 02940000
/* **IF ALL SYSTEM FIELDS ARE OK, CONTINUE */ 02950000
/**********************************************************/ 02960000
02970000
MP1BOTH: 02980000
02990000
/* NEW REQUEST */ 03000000
IF ( PCONVSTA.PREV = ' ' ) 03010000
| ( ( PCONVSTA.PREV = 'S' ) 03020000
& ( SUBSTR(COMPARM.DATA,3,58) ^= ' ' ) 03030000
& ( NEXTBIT = OFF ) ) 03040000
THEN COMPARM.NEWREQ = 'Y' ; 03050000
/*GO TO CP1CALL WHERE A CALL */ 03060000
/*TO EITHER DSN8CC2 OR DSN8IC2*/ 03070000
/*IS PERFORMED. CC1-CALL IS A*/ 03080000
/*LABEL IN DSN8CP1 OR DSN8IP1*/ 03090000
GO TO CP1CALL ; 03100000
03110000
/*********************************************************/ 03120000
/* **DSN8CP1 OR DSN8IP1 WILL */ 03130000
/* **BRANCH BACK TO MP1SAVE AFTER */ 03140000
/* **CALLING SQL2. AT MP1SAVE, */ 03150000
/* **THE DATA RETURNED BY SQL2 OR THE */ 03160000
/* **VALIDATION ROUTINES WILL BE */ 03170000
/* **SAVED IN VCONA */ 03180000
/*********************************************************/ 03190000
03200000
MP1SAVE: 03210000
PCONVSTA.DATA = COMPARM.DATA ; /* MOVE INPUT DATA */ 03220000
PCONA.LASTMSG = STRING(PCONVSTA.OUTAREA); 03230000
PCONA.CONVID = PCONVSTA.CONVID; 03240000
PCONA.LASTSCR = PCONVSTA.LASTSCR; 03250000
PCONA.LASTPOS = STRING ( PCONVSTA.LASTPOS ); 03260000
PCONA.LASTPOSC= PCONVSTA.LASTPOSC; 03270000
DSN8_MODULE_NAME.MINOR = 'MP1SAVE '; 03280000
03290000
IF COMPARM.NEWCONV = 'Y' THEN /* INSERT NEW VALUES */ 03300000
EXEC SQL INSERT 03310000
INTO VCONA 03320000
VALUES (:PCONA); 03330000
ELSE 03340000
EXEC SQL UPDATE VCONA /* UPDATE OLD VALUES*/ 03350000
SET LASTSCR = :PCONA.LASTSCR, 03360000
LASTPOS = :PCONA.LASTPOS, 03370000
LASTPOSC = :PCONA.LASTPOSC, 03380000
LASTMSG = :PCONA.LASTMSG 03390000
WHERE CONVID = :SAVE_CONVID; 03400000