There have been more than a few times when I wished that MV query was a little 
more extensible. On a couple of occasions I have created throwaway connectives 
as a means to pass flags to an i-type or a B correlative, but it would be nice 
if there were a keyword that flagged to just ignore everything after it on the 
line.

Hmm, I never knew that EVAL needed to write to the dict on universe. Is that 
try on unidata as well?

On Jul 3, 2012, at 12:47 PM, Charles Stevenson wrote:

> Ed is quite right.
> 
> 1:  I just did it for simplicity in the example.
> 
> 2:  @SENTENCE, without a wrapper:  you have do get ReTrieve to ignore part of 
> the sentence.   I've never come up with a good way to do that other than via 
> EVAL.  Anyone?
> 
> 3.  EVAL: Yes, it is a way to pass run-time parameters!
> I tend to forget about it because I - personally - don't like it in 
> production.
> EVAL means dictionaries can't be read-only.
> And they tend to permanently leave "temporary" I-descriptors scattered in the 
> dicts if & when something terminates abnormally.
> RetrieVe rudely spits the EVAL compilation report into the output, too.
> If you have multiple associated columns, & if your usage gets fancy (that 
> (future) option is a reason for this approach), then your EVAL may need 
> ASSOC, ASSOC.WITH, MULTIVALUED keywords, besides AS, FMT, COL.HDG.
> Other than that, I love EVAL.
> 
> 
> On 7/3/2012 11:08 AM, Ed Clark wrote:
>> There are 3 ways I can think of offhand to tell the subroutine what date 
>> range to use. I like #3 the best:
>> 
>> 1: use common variables, which is what the example function MARKH does. The 
>> downside is that you have to assign the common variables before you run the 
>> query.
>> 
>> 2: You could use @SENTENCE in the function and parse out the date range. 
>> That could be easy or hard depending on how many people write queries and 
>> what odd contortions of syntax they use. But both #1 and #2 could be 
>> simplified by writing a wrapper program. An example command line would look 
>> like:
>>   QLAUNCH "06/01/2012" "06/30/2012" ~ LIST MYFILE INRANGE
>> QLAUNCH parses arguments before the '~` delimiter and puts them into a 
>> common. The INRANGE attribute calls the function MARKH which uses the common.
>> 
>> 3: use the function directly from the command line with EVAL:
>>   LIST MYFILE EVAL "SUBR('MARKH','06/01/2012','06/30/2012')"  AS "MYCOL" 
>> COL.HDG "WHATEVER" FMT "11L"
>> It's wordier, but you have very fine-grained control over what comes out on 
>> the report. COL.HDG, and FMT are optional and AS is optional in this case. 
>> You would us it if you wanted to sort or break on the EVAL column.
>> 
>> 
>> 
>> On Jul 3, 2012, at 9:55 AM, Charles Stevenson wrote:
>> 
>>> 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

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

Reply via email to