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;