What Brian said, except don't replace LIST!
Rather, write your subroutine to be called from an I-descriptors:

     MARKH
0001       FUNCTION MARKH( INARG )
0002       COMMON /MARKH/ START.IDT, END.IDT, PREV.ID, VLIST
0003 *
0004 * Assumes common has been initialized properly before this function
0005 * is called from i-descriptors
0006 *
0007       IF @ID = PREV.ID ELSE
0008          IDTS = @RECORD< 10 >
0009          VLIST = ""
0010          VMC = 0
0011          VMAX = DCOUNT( IDTS, @VM )
0012          FOR V = 1 TO VMAX
0013             IDT = IDTS<1,V>
0014 IF IDT >= START.IDT THEN IF IDT <= END.IDT THEN VLIST<-1> = V
0015          NEXT V
0016       END
0017 *
0018       OUTARG = ""
0019       MORE = LEN( VLIST )                ; * true/false
0020       LOOP WHILE MORE
0021          REMOVE V FROM VLIST SETTING MORE
0022          OUTARG<1,-1> = INARG<1, V >
0023       REPEAT
0024       SETREM 0 ON VLIST
0025 *
0026       RETURN( OUTARG )
0027    END

An example using it is below.

It's more flexible and maintainable in the long run than tossing RETRIEVE altogether. (Actually, I do think it can be done with the mv-handling functions but an I-descriptor subroutine will be more maintainable.)

Your sub should limits the output to the values you want. If every value is out of range, your subr returns null. It can be called for various associated fields, and the 1st time called for a given @ID it figures out the value range, and saves to labeled common what vals you want for that record. Subsequent calls to the sub, as long as @ID hasn't changed, gets the already calculated value range from common, and applies it to the field you pass it.

The only trick is feeding your subroutine the date range you won't know until runtime. I don't know a good way to feed an I-descriptor command line parameters such as ">= 6/1/2012 &<= 6/30/2012" You'll need to set them in a control record or, better, in @USER1, @USER2, or in your labeled common before the LIST is executed.

Use the I-descriptors that call your subroutine as output criteria and not WITH or WHEN selection criteria. The guts of the subr will do the selection limits.

That may not be altogether clear.  Here's an example.
1st the relevant dict entries then an example:


DICT RTAG    09:45:22am  03 Jul 2012  Page    1

Field......... Type & Field........ Conversion.. Column......... Output Depth & Name.......... Field. Definition... Code........ Heading........ Format Assoc..
               Number

LOC            D    3 12L    S
EVENT.CODE     D    8                            Event 4L     M EVENT
.ASSOC
                                                 Code
EVENT.DT       D   10               D2/          Event 8R     M EVENT
.ASSOC
                                                 Date
PRINTER        D   13 15L    S
MARKH.CODE     I      SUBR(                      Event 4L     M MARKH
'MARKH',                                          .ASSOC
                      EVENT.CODE )
                                                 Code
MARKH.DT       I      SUBR(         D2/          Event 8R     M MARKH
'MARKH',                                          .ASSOC
                      EVENT.DT )
                                                 Date
MARKH.ASSOC    PH     MARKH.LINO
                      MARKH.CODE
                      MARKH.REF
                      MARKH.DT
                      MARKH.TM
                      MARKH.WHO
                      MARKH.DTM

7 records listed.
>

>RUN CDS.BP MARKH.INIT 4/1 4/30
>LIST RTAG LOC PRINTER   EVENT.CODE EVENT.DT   MARKH.CODE MARKH.DT


LIST RTAG LOC PRINTER EVENT.CODE EVENT.DT MARKH.CODE MARKH.DT 09:46:05am 03 Jul 2012 PAGE 1
Return.. LOC......... PRINTER........ Event Event... Event Event...
Tag.....                              Code. Date.... Code. Date....

 5137176 TPAWHSE-IN   ZEBRATPA        PRINT 02/08/12
                                      NEW   11/04/11
10009741 EROCWHSE-OUT                 PI    04/26/12 PI 04/26/12
                                      NEW   04/26/12 NEW 04/26/12
 5135103 PROCWHSE-DEF                 REQ   12/30/11
                                      REQ   12/30/11
                                      ASGN  12/30/11
                                      FREE  11/03/11
 5134267 EROCDPO-DIN  ZEBRATPA        I     03/01/12
                                      PRINT 02/08/12
                                      REQ   12/09/11
                                      ASGN  12/09/11
                                      FREE  11/03/11
10010396 DFWWHSE                      PI    05/22/12
                                      NEW   05/22/12
 5119929                              SI    04/10/12 SI 04/10/12
                                      NEW   09/20/11
10004562 CROCWHSE-OUT ZEBRAEROC       PRINT 04/04/12 PRINT 04/04/12
                                      PRINT 01/31/12
                                      PRINT 01/24/12
                                      PRINT 01/20/12
Press any key to continue...



Finally:


>LIST RTAG LOC PRINTER MARKH.CODE MARKH.DT

LIST RTAG LOC PRINTER MARKH.CODE MARKH.DT 09:50:29am  03 Jul 2012  PAGE    1
Return.. LOC......... PRINTER........ Event Event...
Tag.....                              Code. Date....

 5137176 TPAWHSE-IN   ZEBRATPA
10009741 EROCWHSE-OUT                 PI    04/26/12
                                      NEW   04/26/12
 5135103 PROCWHSE-DEF
 5134267 EROCDPO-DIN  ZEBRATPA
10010396 DFWWHSE
 5119929                              SI    04/10/12
10004562 CROCWHSE-OUT ZEBRAEROC       PRINT 04/04/12





Here's the rudimentary common init:

     MARKH.INIT
0001       PROGRAM MARKH.INIT
0002       COMMON /MARKH/ START.IDT, END.IDT, PREV.ID, VLIST
0003       GET(ARG.) START.ODT THEN
0004          START.IDT = ICONV( START.ODT, 'D' )
0005          IF STATUS() THEN START.IDT = @DATE
0006       END ELSE
0007          START.IDT = @DATE
0008       END
0009       GET(ARG.) END.ODT THEN
0010          END.IDT = ICONV( END.ODT, 'D' )
0011          IF STATUS() THEN END.IDT = @DATE
0012       END ELSE
0013          END.IDT = @DATE
0014       END
0015       PREV.ID = @IM                      ; * something impossible.
0016       RETURN
0017    END
>






On 7/2/2012 10:03 AM, Brian Leach wrote:
Mark

Took me a couple of times reading through the post to understand the issue
..

I think you're going to have to call a subroutine rather than use a LIST.

Brian




_______________________________________________
U2-Users mailing list
U2-Users@listserver.u2ug.org
http://listserver.u2ug.org/mailman/listinfo/u2-users

Reply via email to