*DECK DB$NKY
USETEXT CDCSCTX 
USETEXT RELCMTX 
      PROC DB$NKY;
      BEGIN 
 #
  *   DB$NKY                                     PAGE 1 
  *   M L MOORE                                  DATE 10/13/75
  *   M D SAXE  (REVISION FOR 2.0)               DATE 09/24/76
  DC  PURPOSE 
      PROCESS A RELATION READ WITH SEQUENTIAL OR SORTED SEQUENTIAL
      RETRIEVAL, READING RECORDS UNTIL ONE IS FOUND THAT SATISFIES
      JOIN AND RESTRICT CONDITIONS OR UNTIL EOF IS REACHED. 
  
  DC  LANGUAGE
      SYMPL 
  
  DC  ENTRY CONDITIONS
      CST AND RSB SEARCH TABLE POINTERS ARE SET FOR THE CURRENT RANK
      JOIN BUFFER FOR THIS RANK CONTAINS THE VALUE TO WHICH THE 
        TARGET DBI MUST BE EQUAL. 
      MFPRETCD = 0. 
  
  DC  EXIT CONDITIONS 
      MFPRETCD = 0 (RCOKAY) IF A QUALIFIED RECORD IS BEING RETURNED.
               = 2 (RCIOERR) IF AN I/O, CONVERSION, OR MFP
                     INTERNAL ERROR OCCURRED. 
               = 777 (RCNEWRK) IF THE NEXT LOWER RANK MUST BE PROCESSED 
                      BECAUSE NO QUALIFIED RECORD CAN BE FOUND AT 
                      THIS RANK.
  
  DC  CALLING ROUTINE 
      DB$MFP
  
  DC  CALLED ROUTINES 
      DB$JCPR  -  PERFORM COMPARISON BETWEEN JOIN BUFFER (SOURCE DBI) 
                 AND TARGET DBI IN THE RECORD JUST READ.
      CHECKEND - SET MFPRETCD TO RCNEWRK IF END-OF-INFORMATION
                 (CALLED THROUGH FIT/DX FIELD)
      CHECKES  - SET MFPRETCD IF CRM ERROR INDICATED
                 (CALLED THRU FIT EX FIELD )
      DB$MPGN   - READ NEXT RECORD
      DB$QTST  -  CALL DB$QUAL IF REQUIRED TO CHECK RECORD QUALIFICATION
      REWND    - REWIND FILE
  
  DC  NON-LOCAL VARIABLES 
      ALL VARIABLES REQUIRED BY THE DB$CMPR CALL WILL BE MODIFIED 
  
  DC  DESCRIPTION 
      IF THE FIRST-TIME FLAG (RSNFSTRK) IN THE RSNSTAB IS TRUE, 
      CONDITION (AS DETERMINED BY CALLING DB$JCPR TO COMPARE
      INDICATING THIS IS THE FIRST CHILD TO BE READ FOR A GIVEN PARENT, 
      THE FILE IS REWOUND.  A FOR LOOP IS THEN INITIATED TO 
      READ RECORDS FROM THE FILE UNTIL... 
        - A RECORD IS READ WHICH SATISFIES BOTH THE JOIN
      CONDITION (AS DETERMINED BY CALLING DB$CMPR TO COMPARE
      THE TARGET DBI IN THE RECORD READ WITH THE VALUE SAVED
      IN THE JOIN BUFFER) AND THE QUALIFICATION CONDITION (AS 
*     DETERMINED BY CALLING THE PROC DB$JCPR).
        - AN I/O ERROR OCCURS, WHICH WILL BE FLAGGED BY THE 
      CHECKES ROUTINE (CALLED THROUGH THE FIT EX EXIT) BY 
      SETTING MFPRETCD TO 2 (RCIOERR).
       - A CONVERSION ERROR OR INTERNAL ERROR OCCURS, WHICH WILL BE 
*     FLAGGED BY DB$CMPR OR DB$JCPR SETTING MFPRETCD. 
        - AN END-OF-INFO STATUS IS RETURNED BY CRM.  IN THIS
      CASE MFPRETCD IS SET TO 777 (RCNEWRK) TO FORCE PROCESSING 
      OF THE NEXT LOWER RANK.  MFPRETCD IS SET THROUGH THE DX EXIT
      TO THE CHECKEND PROC. 
        - IF THE SEARCH STRATEGY IS 1, FOR SORTED SEQUENTIAL
      KEY RETRIEVAL, AN EFFECTIVE END-OF-INFO CONDITION IS
      REACHED WHEN THE TARGET DBI IN THE RECORD BECOMES GREATER 
      THAN THE SOURCE VALUE IN THE JOIN BUFFER. 
 #
                             # CALL TO COMMON DECKS MFPDFDCLS,MFPCMDCLS#
                             # RELCMDCLS, RMCOMDCLS                    #
      CONTROL NOLIST; 
*CALL MFPDFDCLS 
*CALL MFPCMDCLS 
*CALL RMCOMDCLS 
      CONTROL LIST; 
  
      XREF
        BEGIN 
        ARRAY DB$RA0;;
        PROC DB$FLOP;        # GENERATE FLOW POINT                     #
        PROC DB$FKLR; 
        PROC DB$JCPR; 
        PROC DB$MPGN; 
        PROC DB$QTST; 
        PROC REWND; 
        END 
  
      ITEM I; 
  
# ******  BEGINNING OF DB$NKY EXECUTABLE CODE  ******   # 
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("NKY    "); 
      CONTROL ENDIF;
  
      IF RSNFSTRK [0]         # REWIND FILE IF FIRST TIME FOR RANK #
      THEN
        BEGIN                # RELEASE KEY POSITION SO DB$FPOS WILL    #
                             # REWIND                                  #
        RSARRQ2[0] = TRUE;
        RSARRQ3[0] = TRUE;
        FPCFPOS[0] = TRUE;
        DB$FKLR;
        END 
      FOR I = I  DO          # READ RECORD LOOP FOR DB$NKY #
        BEGIN 
        RCQUAL = FALSE;      # INITIALIZE RCQUAL FOR NO QUALIFY # 
        XCALL DB$MPGN;
        IF MFPRETCD EQ 0
          THEN              # DO OTHER PROCESSING ONLY #
          BEGIN              # IF NO CRM ERRORS, OR EOF   # 
  
# SET UP PARAMETERS FOR COMPARE OF TARGET DBI IN CDCS   # 
# RECORD READ BUFFER TO SOURCE ITEM IN THE JOIN BUFFER #
  
          COMPBWP = JNBUFA + RSNJNPTR [0];
          TGIBBP = CSNSTBCP [0] * 6;
          TGIFWA = FPFITWSA [0] + CSNSTBWP [0]; 
          XCALL  DB$JCPR; 
          IF HILOEQ EQ 1         #TARGET GT JOIN BUFFER, SORTED SEQ # 
             AND RSNSSTRA [0] NQ 0
            THEN MFPRETCD = RCNEWRK;  #TELL MFP TO GET LOWER RANK  #
          IF HILOEQ EQ 0              # TARGET = JOIN, SO GO SEE   #
             THEN XCALL DB$QTST;      # IF RECORD QUALIFIES        #
          END 
        IF MFPRETCD NQ 0   OR  RCQUAL    # RETURN FROM DB$NKY IF ERROR #
          THEN RETURN;                   # OR QUAL RECORD OR RETURN    #
                                         # CODE FOR NEXT LOW RANK      #
        END                  # END OF RECORD READ LOOP #
      END                    #  OF  DB$NKY  # 
      TERM
