! If one tries to PUT_VALUE at a prompt stall and the buffer is greater ! than 255 characters, there will be no value put. ! ! The way around this is to use PUT_PORT, but this was meant to be used ! to replace entire records. To modify just a field, it is almost impossible ! to get DTR to recognize the context of the port's field name. ! ! First, set up the port: CALL DTR$COMMAND (DAB, 'DECLARE PORT DATA_PORT USING + 01 DATA_PORT_CONTENTS. + 02 CONTENTS PIC X(1700).;') CALL CONTINUE (DAB) ! ! Then declare a dummy variable "X" of sufficient size: CALL DTR$COMMAND (DAB,'DECLARE X PIC X(1700).;') CALL CONTINUE (DAB) ! The repeat clause on DATA_PORT establishes the context for CONTENTS: CALL DTR$COMMAND (DAB,'FOR DATA_PORT X=CONTENTS ;') CALL CONTINUE (DAB) ! Pass the information into the dummy variable: CALL DTR$PUT_PORT (DAB,%REF(LINE(SN,FN)) ) CALL CONTINUE (DAB) ! Terminate the loop: CALL DTR$PORT_EOF (DAB) CALL CONTINUE (DAB) ! And modify using the dummy variable: CALL DTR$COMMAND (DAB,'MODIFY USING '//FIELD_NAME(SN,FN)//' = X;') CALL CONTINUE (DAB) SUBROUTINE CONTINUE (DUMMY) ! Calls DTR$CONTINUE using DAB from common block. It will ! repeatedly call DTR$CONTINUE until it reaches one of the ! specified stall points (hard coded). All messages from ! errors are displayed in the status line. ! ! The ICLEN function returns the position of the last ! non-blank character in the passed string. INCLUDE 'DAB' INTEGER*2 CHAN COMMON /TERMINAL/ CHAN CHARACTER*79 LAST_MESSAGE COMMON /LAST_ERROR_MESSAGE/ LAST_MESSAGE DO WHILE (DAB$W_STATE .NE. DTR$K_STL_CMD .AND. 1 DAB$W_STATE .NE. DTR$K_STL_PGET .AND. 2 DAB$W_STATE .NE. DTR$K_STL_PPUT .AND. 3 DAB$W_STATE .NE. DTR$K_STL_CONT .AND. 4 DAB$W_STATE .NE. DTR$K_STL_PRMPT ) IF (DAB$W_STATE .EQ. DTR$K_STL_MSG) THEN IF (MSG_BUFF(1:9).NE.'Statement' .AND. 1 ICLEN(MSG_BUFF).NE.0) THEN CALL PUT_MESSAGE(MSG_BUFF) ENDIF ENDIF CALL DTR$CONTINUE (DAB) END DO RETURN END