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

Reply via email to