I am a newbie in the pl1 world. I am glad to find such place to learn
pl1 language.
I meet a problem when accessing ADABAS from PL1.
Hope you guys give me some advice, and thanks in advance!
The problem information as follow:
OS: windows xp
Development platform and tools: IBM Rational Developer for System z,
Adabas 6.1.8 community edition
The accessAdabas.OBJ has been generated successfully.When I do the
action of linking the .obj+.ddl to .exe application,
---ilink accessAdabas.OBJ adalnks.lib adalnk32.lib adalnknc.lib
The complier throw the exception:
---error LNK2029: "?ADABAS":unresolved external
---There was 1 error detected
The source code pasted:
>>>>>>>>>>>>>>>>>>>>>>>>>>
*process langlvl(saa2);
*process or('|');
*process prefix(nofofl);
accessadabas: proc();
/*** CONTROL BLOCK ***/
DCL 1 CONTROL_BLOCK,
02 FILLER1 CHAR (2) INIT (' '),
02 COMMAND_CODE CHAR (2) INIT (' '),
02 COMMAND_ID CHAR (4) INIT (' '),
02 FILE_NUMBER BIN FIXED (15) INIT (0),
02 RESPONSE_CODE BIN FIXED (15) INIT (0),
02 ISN BIN FIXED (31) INIT (0),
02 ISN_LOWER_LIMIT BIN FIXED (31) INIT (0),
02 ISN_QUANTITY BIN FIXED (31) INIT (0),
02 FORMAT_BUFFER_LENGTH BIN FIXED (15) INIT (100),
02 RECORD_BUFFER_LENGTH BIN FIXED (15) INIT (250),
02 SEARCH_BUFFER_LENGTH BIN FIXED (15) INIT (50),
02 VALUE_BUFFER_LENGTH BIN FIXED (15) INIT (100),
02 ISN_BUFFER_LENGTH BIN FIXED (15) INIT (20),
02 COMMAND_OPTION_1 CHAR(1) INIT (' '),
02 COMMAND_OPTION_2 CHAR(1) INIT (' '),
02 ADDITIONS_1 CHAR(8) INIT (' '),
02 ADDITIONS_2 CHAR(4) INIT (' '),
02 ADDITIONS_3 CHAR(8) INIT (' '),
02 ADDITIONS_4 CHAR(8) INIT (' '),
02 ADDITIONS_5 CHAR(8) INIT (' '),
02 COMMAND_TIME BIN FIXED (31) INIT (0),
02 USER_AREA CHAR(4) INIT (' ');
/*** USER BUFFER AREAS ***/
DCL FORMAT_BUFFER CHAR(100),
RECORD_BUFFER CHAR(250),
SEARCH_BUFFER CHAR(50),
VALUE_BUFFER CHAR(100),
ISN_BUFFER CHAR(20);
/*** ADDITIONAL FIELDS USED IN THE EXAMPLES ***/
DCL
COMM_ID_X BIN FIXED(31);
/*** COMM_ID CHAR(4) BASED (ADDR(COMM_ID_X)); ***/
DCL INPUT_KEY CHAR(8);
DCL SYNC_CHECK_SWITCH CHAR(1) INIT('0');
DCL 1 RECORD_BUFFER_EX2,
2 RECORD_BUFFER_A CHAR(8),
2 RECORD_BUFFER_B DEC FIXED(3,0),
2 FILLER3 CHAR(240);
DCL 1 RECORD_BUFFER_EX3,
2 OPEN_RECORD_BUFFER,
3 OPEN_RECORD_BUFFER_X CHAR(8),
3 FILLER4 BIN FIXED(31),
2 FILLER5 CHAR(18),
2 UPDATED_XC CHAR(6),
2 LAST_XD CHAR(8),
2 FILLER6 CHAR(5),
1 USER_DATA,
2 RESTART_XD CHAR(8),
2 RESTART_ISN BIN FIXED(31);
DCL ADABAS ENTRY OPTIONS(ASM);
/*** Issue Open Command **/
EXMP1:
COMMAND_CODE = 'OP';
RECORD_BUFFER = 'ACC.';
CALL ADABAS (CONTROL_BLOCK,FORMAT_BUFFER,RECORD_BUFFER);
IF RESPONSE_CODE > 0 THEN GOTO EX1ERR;
/*** Issue Find Command ***/
COMMAND_CODE = 'S1';
COMMAND_ID = 'S101';
FILE_NUMBER = 2;
ISN_LOWER_LIMIT = 0;
ISN_BUFFER_LENGTH = 0;
FORMAT_BUFFER = '.';
SEARCH_BUFFER = 'XB,3,U.';
VALUE_BUFFER = '099';
CALL ADABAS (CONTROL_BLOCK, FORMAT_BUFFER,
RECORD_BUFFER, SEARCH_BUFFER, VALUE_BUFFER);
IF RESPONSE_CODE > 0 THEN GOTO EX1ERR;
EX1A:
IF ISN_QUANTITY = 0 THEN GOTO EX1EXIT;
EX1B:
COMMAND_CODE = 'L1';
ISN = 0;
COMMAND_OPTION_1 = 'N';
FORMAT_BUFFER = 'RG.';
EX1C:
CALL ADABAS (CONTROL_BLOCK,FORMAT_BUFFER,RECORD_BUFFER);
IF RESPONSE_CODE = 0 THEN
GOTO EX1D;
IF RESPONSE_CODE = 3 THEN
GOTO EX1EXIT;
EX1D:
/*** . . .PROCESS RECORD . . . ***/
Display(FORMAT_BUFFER);
Display(RECORD_BUFFER);
GOTO EX1C;
/*** Error Routine ***/
EX1ERR:
/* . DISPLAY ERROR MESSAGE */
/* . TERMINATE USER PROGRAM */
/** Issue Close Command **/
EX1EXIT:
COMMAND_CODE = 'CL';
CALL ADABAS (CONTROL_BLOCK);
IF RESPONSE_CODE > 0 THEN
GOTO EX1ERR;
end accessadabas;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Thanks&Best regards,
Kelvin
HI Peter,
Thanks for your information!
you are right. It passed the compile after one line is added:
---FETCH ADABAS title('adalnk32/adabas');
Could you kindly answer me another question?
>>>>>
/*** CONTROL BLOCK ***/
DCL 1 CONTROL_BLOCK,
02 FILLER1 CHAR (2) INIT (' ')
>>>>
I do not familiar with PL/I grammar.
Is it possible to assign decimal 12 to the first char of 'FILLER1' in
the hexadecimal format?
(like 0xC?)
Thanks & Best regards,
Kelvin
... init('0c'x),
Hi James,
Thanks for your help!
Could you do me another favor, which confirm the following data
structure definition in PL/I is correct or not?
>>>>>>>>>requirement start >>>>>>>>>>>>>>>
Name Field Control Offset Length Format
Block (in Bytes)
Position
ACBTYPE Call Type 1 00 1 binary
reserved (reserved) 2 01 1 binary
ACBCMD Command Code 3-4 02 2 alphanumeric
ACBCID Command ID 5-8 04 4 alphanumeric / binary
ACBFNR File Number 9-10 08 2 binary
ACBRSP Response Code 11-12 0A 2 binary
>>>>>>>>>requirement end>>>>>>>>>>>>>>>
>>>>>>>>>>>>correspond to PL1 data structure start>>>>>>>>>>>>
DCL 1 CONTROL_BLOCK,
02 CALL_TYPE BIN FIXED (7) INIT (0),
02 CB_RESERVER BIN FIXED (7) INIT (0),
02 COMMAND_CODE CHAR (2) INIT (' '),
02 COMMAND_ID CHAR (4) INIT (' '),
02 FILE_NUMBER BIN FIXED (15) INIT (1101),
02 RESPONSE_CODE BIN FIXED (15) INIT (0);
>>>>>>>>>>>>correspond to PL1 data structure end>>>>>>>>>>>>>>>
I see no syntax errors in your declaration. I have two minor comments: 1)
reserved is misspelled -- of course this is not a programming error as long as
you are consistent; 2) the initial value for file number consists only of
zeros and ones --if you intend the value to be one thousand one hundred and
one you are correct; if you intend the value to be thirteen you need to write
either 13 or 1101b.