I used the @ITEM.COUNT to initialize, but had to be careful to perform a 
SSELECT before doing a LIST to avoid getting an out-of-order result.

> Date: Thu, 20 Aug 2009 16:10:02 -0600
> From: [email protected]
> To: [email protected]
> Subject: Re: [U2] UD: Executing small part of subroutine code once from       
> dictionary call
> 
> Bill,
> 
> A little while ago there was a thread about running totals, and the same
> problem of initialization came up.  It's apparently solved by using an
> additional named commons variable that saves the date and time last
> initialized compared to the current date and time of 'this' LIST/etc.
> statement.  Here's a post that used that method:
> 
> http://www.mail-archive.com/u2-users%40listserver.u2ug.org/msg30268.html
> 
> Best Regards,
> 
> Richard Lewis
> 
> On Thu, Aug 20, 2009 at 3:28 PM, Bill Haskett <[email protected]>wrote:
> 
> >
> >  I have a UD dictionary that calls a subroutine.  The subroutine selects a
> >> small file and saves the data into a reformatted array, which is returned 
> >> as
> >> a passed variable.
> >>
> >> I want to only execute this select code once in the subroutine then
> >> continue with the reset of the subroutines business rule(s) for subsequent
> >> items processed.  When I create a "named" common variable for the built 
> >> data
> >> array the array is set once and when I alter the data in the selected file
> >> (small) it never is updated when I run a subsequent selects or sorts.
> >>
> >> UniData doesn't seem to be able to inform me when the first item is
> >> processed, in order to initialize, read, and build the configuration array.
> >>  How is this done?
> >>
> >> E.g. I want to know what accounts a user has access to (we run an ASP with
> >> 50-100 accounts on it and our users file is global).  The dictionary builds
> >> an array of users on our system as follows:
> >>
> >> 001 mv'd list of user names
> >> 002 mv'd list of upper-cased user names
> >> 003 mv'd list of account paths each user has access to
> >>
> >> A user can have access to multiple account paths.  When I do the following
> >> (in PICK mode):
> >>
> >> :sort SECUSERS BY USERID ID-SUPP USERID ACCTUSER AUTHACCTS
> >>
> >> ...I get the following list of users and account paths they have access
> >> to:
> >>
> >> UserId......... C. AuthAccts.....................
> >>
> >> PUBLICUSER       1 E:\UDAccounts\AsiPublic
> >>                   E:\DataTrust\Dev
> >>                   E:\DataTrust\Demo
> >> DOTNETUSER       1 E:\DataTrust\Demo
> >>                   E:\Advantos\Intel
> >>                   E:\DataTrust\Dev
> >> MYUSER           1 E:\DataTrust\Dev
> >>                   E:\DataTrust\Demo
> >>                   E:\Advantos\Intel
> >>
> >>
> >> The dictionary of "AUTHACCTS" looks like:
> >>
> >> Top of "AUTHACCTS" in "DICT SECUSERS", 6 lines, 113 characters.
> >> *--: P
> >> 001: I The authorized accounts this user has access to (a DBIUSERS value)
> >> 002: SUBR( "D.AUTHACCTS", @ID )
> >> 003:
> >> 004: AuthAccts
> >> 005: 30L
> >> 006: M
> >> Bottom.
> >> *--:
> >>
> >>
> >> ...and the subroutine looks like:
> >>
> >> *
> >> ** Initialize common program variables
> >> $INCLUDE DTABP,INCLUDES SET.COMMON
> >> *
> >> ** Initialize local common
> >> COMMON /dbUserc/ comDbiUserArray
> >> *
> >> ** Initialize null because we're calling from a dictionary and SET.INIT
> >> ** hasn't run yet (besides NULL$ isn't named common).
> >> NULL$ = ''
> >> *
> >> ** Initialize return value
> >> OutValue = NULL$
> >> *
> >> ** Make sure we're dealing with a user record key
> >> IF UserID = NULL$ THEN GOTO END.OF.PROGRAM
> >> *
> >> ** Get the list of DB users
> >> IF comDbiUserArray = NULL$ OR comDbiUserArray = 0 THEN
> >>   CALL GET.DBIUSERS ( DbiUserArray )
> >>   comDbiUserArray = DbiUserArray
> >> END
> >> *
> >> **-------------------------------------------------------------------**
> >> **                                                                   **
> >> **                       R U N   P R O G R A M                       **
> >> **                                                                   **
> >> **-------------------------------------------------------------------**
> >> *
> >> ** Assign the names Id & intialize variable to pass back
> >> UCDbiUserList = comDbiUserArray<2>
> >> DbiUserPaths  = comDbiUserArray<3>
> >> UserID        = OCONV(UserID, 'MCU')
> >> LOCATE(UserID, UCDbiUserList, 1; Pos) THEN
> >>   OutValue = RAISE(DbiUserPaths<1,Pos>)
> >> END
> >>
> >>
> >> The problem is once I run the query the contents of the array
> >> "comDbiUserArray" will never change until I log off.  How can I force the
> >> array to be initialized without logging off?
> >>
> >> Any help would be appreciated.
> >>
> >> Thanks,
> >>
> >> Bill Haskett
> >> Advantos Systems, Inc.
> >>
> > _______________________________________________
> > U2-Users mailing list
> > [email protected]
> > http://listserver.u2ug.org/mailman/listinfo/u2-users
> >
> _______________________________________________
> U2-Users mailing list
> [email protected]
> http://listserver.u2ug.org/mailman/listinfo/u2-users
_______________________________________________
U2-Users mailing list
[email protected]
http://listserver.u2ug.org/mailman/listinfo/u2-users

Reply via email to