For a customer, I wrote a year ago a procedure and report that explodes a part's BOM and calculates various data for the part's sons. I thought that the report was working
  fine until the customer brought to my attention a specific part: despite the
  fact that its sons appear as "for info only" (FIO) in the BOM table, these son parts
  were appearing in the report.
  How I reached the solution for the next step is lost to me, so I'll say that by divine
  intervention I saw that the father part had three BOM revisions, and that the
  sons that were marked FIO in the BOM table were not marked as such
  in one of these revisions.
  The procedure uses the SONRAW program to explode the BOM, where the fourth
  parameter is 0, i.e. don't include parts marked as FIO. How is it
  that these parts still appear? Could it be that SONRAW is working on all the BOM revisions and so is finding the revision in which the parts are not marked as FIO?
  If one dumps the data contained in the table PARTARC for the given father
  part, one will see that the son parts appear three times, once for each
  revision. The difference between these apparently identical lines, apart from
  the FIO flag, is that their RVFROMDATE and RVTILLDATE fields
  differ; these values are identical to the revisions in the BOM revisions table
  of the father.
  Whilst walking the dog after the consultation, I thought about this problem
  and concluded that first I would have to find the line with the maximum value
  for RVFROMDATE then check whether this line is marked as FIO. It
  seems that the right hemisphere of my brain was working on this problem all
  night because at about 2:30 am, I suddenly realised that I don't have to look
  for a maximum value - I simply need to find the line with RVTILLDATE =
  01/01/50.
  This morning I came in fired up with enthusiasm and added this condition to the
  cursor that iterates over the sons. Nothing changed. It turns out that SONRAW
  zeroes out this field in the linked PARTARC table: annoying. I tried another
  track: I know that PARTARC.SONPARTREV contains the internal part number of the
  direct parent. Via this field I could access the original, unlinked, tuples of
  PARTARC in order to find the appropriate line. As the check has to occur twice in the procedure, I wrote a subroutine that contains the code that checks. 
The part at the end of the subroutine that sets SONACT to be -1 is because the linked PARTARC table is passed to the report that 'knows' not to display lines where SONACT = -1. This was something that eluded me until late in the day. The variable :PARENT is PARTARC.SONPARTREV. The returned variable :OK will cause the procedure to skip parts of the code if the value is 0.
/**************************************************************
 SUB 820 - Check whether son is in the current version
 of the BOM and if so, is info only
 ***************************************************************/
 SUB 820;
 :OK = 1;
 SELECT 0 INTO :OK FROM PARTARC ORIG
 WHERE ORIG.PART = :PARENT
 AND ORIG.SON = :SON
 AND (ORIG.INFOONLY = 'Y'
 OR ORIG.RVTILLDATE <> 01/01/50);
 GOTO 821 WHERE :OK = 1;
 UPDATE PARTARC /* effectively remove the part from the tree */
 SET SONACT = -1
 WHERE PART = :FATHER
 AND SON = :SON;
 LABEL 821;
 RETURN;