Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hi,
We have a situation where there is a user who needs to reload their document on-demand. The plan is that the user uploads some CSV files for loading, opens the app in QlikView Desktop, reloads and saves it to make it available in AccessPoint.
The image below shows our current folder structure:
The user has NTFS read/write permissions on the app inside the 1.Application folder inside their container. In addition to this, they have read-only on the System folder containing QVD and Import files and read-only permissions to the Shared_Folders container (ideally, they should only have permissions to specific sub-folders within QVD and Import folders, not the entire System container).
When they execute a reload, the script is not picking up the correct path to the QVD and Import files. From tracing through the script, I can see that the BasePath and other variables are set correctly, but when it gets to creating path variables to the QVD and Import folders in the System container it does not read them correctly. The following lines set the QVD file path:
// Get paths to QVD files
call LoadContainerGlobalVariables('System','QVD');
let vL.MasterDataQVDPath = '$(vG.SystemQVDPath)6.MasterData\';
After those lines, vG.SystemQVDPath still has the value from my development environment, not the server path.
Should we be setting additional linking variables in the Variable Editor, giving the user additional NTFS permissions, or something else?
Thanks,
Michael
We were able to solve this by granting the user NTFS read permissions (Traverse folder / execute file, List folder / read data, Read attributes) on the top level folder (2.Test) with no inheritance to sub-folders and contents. This means they can enumerate the containers, but cannot go into them unless they have specific permissions.
It seems that the LoadContainerMap sub (called by LoadContainerGlobalVariables) needs to be able to see all the containers in the file system even though I am only requesting variables from the System folder.
It would be handy to have a guide outlining the NTFS permissions required by different business roles in the QDF.
HI Michael, if you have not done so, activate the application logging (document properties) and check for deployment framework error message, search for DF Error in the log.
Best regards
Magnus
Hi Magnus,
The log file lines leading up to the first error are as follows. Please note that the UNC path in the second line is correct. The 'D:\...' path is incorrect, it is the path on my development machine.
Also, we are using QDF v1.3.1 with QlikView Version:11.20.12235.
28/05/2014 1:52:03 PM: 0032 SUB LoadContainerMap(vL.CVSTableName,vL.SpecificVariable,vL.GetRootPath)
28/05/2014 1:52:03 PM: 0034 call LoadContainerMap('\\svqlikview\QlikViewDocs\2.Test\5.Finance\3.Include\1.BaseVariable\\ContainerMap.csv','Shared')
28/05/2014 1:52:03 PM: 0011 SET vL.LoadContainerMapCount=
28/05/2014 1:52:03 PM: 0015 vL.temp_table_map:
28/05/2014 1:52:03 PM: 0016 LOAD *
28/05/2014 1:52:03 PM: 0017 FROM
28/05/2014 1:52:03 PM: 0018 '\\svqlikview\QlikViewDocs\2.Test\5.Finance\3.Include\1.BaseVariable\\ContainerMap.csv'
28/05/2014 1:52:03 PM: 0019 (txt, utf8, embedded labels, delimiter is ',', msq)
28/05/2014 1:52:03 PM: 4 fields found: ContainerPathName, ContainerFolderName, ContainerComments, RootPath, 16 lines fetched
28/05/2014 1:52:03 PM: 0022 Left join
28/05/2014 1:52:03 PM: 0023 Load ContainerPathName,count(ContainerPathName) as ContainerPathNameCount
28/05/2014 1:52:03 PM: 0024 Resident vL.temp_table_map
28/05/2014 1:52:03 PM: 0025 group by ContainerPathName
28/05/2014 1:52:03 PM: 2 fields found: ContainerPathName, ContainerPathNameCount, 12 lines fetched
28/05/2014 1:52:03 PM: Joining/Keeping
28/05/2014 1:52:03 PM: 0028 let vL.xxx = NoOfRows('vL.temp_table_map')
28/05/2014 1:52:03 PM: 0030 for vL.ttt = 0 to vL.xxx-1
28/05/2014 1:52:03 PM: 0032 LET vL.Comment =''
28/05/2014 1:52:03 PM: 0034 LET vL.ContainerPathName = PurgeChar(trim(peek(FieldName(1,'vL.temp_table_map'),0,'vL.temp_table_map')),'=;,- '&chr(39))
28/05/2014 1:52:03 PM: 0035 LET vL.ContainerFolderName = lower(PurgeChar(trim(peek(FieldName(2,'vL.temp_table_map'),0,'vL.temp_table_map')),'=;,'&chr(39)))
28/05/2014 1:52:03 PM: 0036 LET vL.Comment = PurgeChar(trim(peek(FieldName(3,'vL.temp_table_map'),0,'vL.temp_table_map')),';,'&chr(39))
28/05/2014 1:52:03 PM: 0037 LET vL.RootPath = lower(PurgeChar(trim(peek(FieldName(4,'vL.temp_table_map'),0,'vL.temp_table_map')),'=;,'&chr(39)))
28/05/2014 1:52:03 PM: 0038 LET vL.ContainerPathNameCount = peek(FieldName(5,'vL.temp_table_map'),0,'vL.temp_table_map')
28/05/2014 1:52:03 PM: 0041 if not 'Admin' = '' and not '0.administration' = '' then
28/05/2014 1:52:03 PM: 0044 if not right( '0.administration' , 1 ) ='\' then
28/05/2014 1:52:03 PM: 0045 let vL.ContainerName ='0.administration'&'\'
28/05/2014 1:52:03 PM: 0046 else
28/05/2014 1:52:03 PM: 0051 if '0.administration\' =right(lower(''),len('0.administration\')) and '' = '' then
28/05/2014 1:52:03 PM: 0074 if ('Shared'='Admin' or 'Shared'='0.administration') then
28/05/2014 1:52:03 PM: 0096 exit for when ''='True'
28/05/2014 1:52:03 PM: 0097 endif
28/05/2014 1:52:03 PM: 0098 next
28/05/2014 1:52:03 PM: 0032 LET vL.Comment =''
28/05/2014 1:52:03 PM: 0034 LET vL.ContainerPathName = PurgeChar(trim(peek(FieldName(1,'vL.temp_table_map'),1,'vL.temp_table_map')),'=;,- '&chr(39))
28/05/2014 1:52:03 PM: 0035 LET vL.ContainerFolderName = lower(PurgeChar(trim(peek(FieldName(2,'vL.temp_table_map'),1,'vL.temp_table_map')),'=;,'&chr(39)))
28/05/2014 1:52:03 PM: 0036 LET vL.Comment = PurgeChar(trim(peek(FieldName(3,'vL.temp_table_map'),1,'vL.temp_table_map')),';,'&chr(39))
28/05/2014 1:52:03 PM: 0037 LET vL.RootPath = lower(PurgeChar(trim(peek(FieldName(4,'vL.temp_table_map'),1,'vL.temp_table_map')),'=;,'&chr(39)))
28/05/2014 1:52:04 PM: 0038 LET vL.ContainerPathNameCount = peek(FieldName(5,'vL.temp_table_map'),1,'vL.temp_table_map')
28/05/2014 1:52:04 PM: 0041 if not 'Shared' = '' and not '99.shared_folders' = '' then
28/05/2014 1:52:04 PM: 0044 if not right( '99.shared_folders' , 1 ) ='\' then
28/05/2014 1:52:04 PM: 0045 let vL.ContainerName ='99.shared_folders'&'\'
28/05/2014 1:52:04 PM: 0046 else
28/05/2014 1:52:04 PM: 0051 if '99.shared_folders\' =right(lower(''),len('99.shared_folders\')) and '' = '' then
28/05/2014 1:52:04 PM: 0074 if ('Shared'='Shared' or 'Shared'='99.shared_folders') then
28/05/2014 1:52:04 PM: 0076 if not '' = '' then
28/05/2014 1:52:04 PM: 0082 let vL.RootPath ='D:\Source\BusIntel\1.Dev\'
28/05/2014 1:52:04 PM: 0083 endif
28/05/2014 1:52:04 PM: 0084 if vL.ContainerPathNameCount = 1 then
28/05/2014 1:52:04 PM: 0085 SET vL.Exit= 'True'
28/05/2014 1:52:04 PM: 0087 else
28/05/2014 1:52:04 PM: 0094 exit for when 'True'='True'
28/05/2014 1:52:04 PM: 0100 drop table 'vL.temp_table_map'
28/05/2014 1:52:04 PM: 0103 SET vL.ttt =
28/05/2014 1:52:04 PM: 0104 SET vL.xxx =
28/05/2014 1:52:04 PM: 0105 SET vL.CVSTableName =
28/05/2014 1:52:04 PM: 0106 SET vL.SpecificVariable =
28/05/2014 1:52:04 PM: 0107 SET vL.GetRootPath =
28/05/2014 1:52:04 PM: 0108 SET vL.Exit=
28/05/2014 1:52:04 PM: 0109 SET vL.ContainerName=
28/05/2014 1:52:04 PM: 0110 SET vL.ContainerPathNameCount=
28/05/2014 1:52:04 PM: 0111 end sub
28/05/2014 1:52:04 PM: 0037 SET vL.ContainerFolderName='99.shared_folders'
28/05/2014 1:52:04 PM: 0040 SET vL.ContainerPathName='Shared'
28/05/2014 1:52:04 PM: 0043 SET vL.RootPath='D:\Source\BusIntel\1.Dev\'
28/05/2014 1:52:04 PM: 0045 if not 'Shared' = '' then
28/05/2014 1:52:04 PM: 0049 trace '### DF 99.shared_folders'
28/05/2014 1:52:04 PM: 0049 '### DF 99.shared_folders'
28/05/2014 1:52:04 PM: 0050 trace '### DF Default Shared Container'
28/05/2014 1:52:04 PM: 0050 '### DF Default Shared Container'
28/05/2014 1:52:04 PM: 0053 SET vG.SharedBasePath = 'D:\Source\BusIntel\1.Dev\99.shared_folders\'
28/05/2014 1:52:04 PM: 0057 sub vL.FileExist (vL.Root)
28/05/2014 1:52:04 PM: 0058 call vL.FileExist ('D:\Source\BusIntel\1.Dev\99.shared_folders\*')
28/05/2014 1:52:04 PM: 0011 if IsNull(filesize('D:\Source\BusIntel\1.Dev\99.shared_folders\*')) = -1 then
28/05/2014 1:52:04 PM: 0012 SET vL.FileExist='false'
28/05/2014 1:52:04 PM: 0013 else
28/05/2014 1:52:04 PM: 0016 set vL.Root=
28/05/2014 1:52:04 PM: 0017 end sub
28/05/2014 1:52:04 PM: 0060 if vL.FileExist = 'false' then
28/05/2014 1:52:04 PM: 0061 trace '### DF Error Do not find vG.SharedBasePath'
28/05/2014 1:52:04 PM: 0061 '### DF Error Do not find vG.SharedBasePath'
28/05/2014 1:52:04 PM: 0062 trace '### DF Path D:\Source\BusIntel\1.Dev\99.shared_folders\'
28/05/2014 1:52:04 PM: 0062 '### DF Path D:\Source\BusIntel\1.Dev\99.shared_folders\'
Hi Michael, It seems to me like your Container Map (ContainerMap,csv) file is empty och contains wrong values. Could you please check that it contains your container architecture? Will be stored under 5.Finance\3.Include\1.BaseVariable\\ContainerMap.csv
If you are uncertain attache the map and I will have a look.
Best regards
Magnus
Hi Magnus,
Attached is a copy of the Container Map. It looks ok to me.
Michael
In addition, here is an extract from the log file when it is run by a user with "Full control" NTFS permissions on the entire folder structure. It completes successfully in this instance, so I am pretty sure that there is something missing from the other user's permissions.
The other user is able to open the ContainerMap.csv file.
29/05/2014 10:42:59 AM: 0032 SUB LoadContainerMap(vL.CVSTableName,vL.SpecificVariable,vL.GetRootPath)
29/05/2014 10:42:59 AM: 0034 call LoadContainerMap('\\svqlikview\QlikViewDocs\2.Test\5.Finance\3.Include\1.BaseVariable\\ContainerMap.csv','Shared')
29/05/2014 10:42:59 AM: 0011 SET vL.LoadContainerMapCount=
29/05/2014 10:42:59 AM: 0015 vL.temp_table_map:
29/05/2014 10:42:59 AM: 0016 LOAD *
29/05/2014 10:42:59 AM: 0017 FROM
29/05/2014 10:42:59 AM: 0018 '\\svqlikview\QlikViewDocs\2.Test\5.Finance\3.Include\1.BaseVariable\\ContainerMap.csv'
29/05/2014 10:42:59 AM: 0019 (txt, utf8, embedded labels, delimiter is ',', msq)
29/05/2014 10:42:59 AM: 4 fields found: ContainerPathName, ContainerFolderName, ContainerComments, RootPath, 16 lines fetched
29/05/2014 10:42:59 AM: 0022 Left join
29/05/2014 10:42:59 AM: 0023 Load ContainerPathName,count(ContainerPathName) as ContainerPathNameCount
29/05/2014 10:42:59 AM: 0024 Resident vL.temp_table_map
29/05/2014 10:42:59 AM: 0025 group by ContainerPathName
29/05/2014 10:42:59 AM: 2 fields found: ContainerPathName, ContainerPathNameCount, 12 lines fetched
29/05/2014 10:42:59 AM: Joining/Keeping
29/05/2014 10:42:59 AM: 0028 let vL.xxx = NoOfRows('vL.temp_table_map')
29/05/2014 10:42:59 AM: 0030 for vL.ttt = 0 to vL.xxx-1
29/05/2014 10:42:59 AM: 0032 LET vL.Comment =''
29/05/2014 10:42:59 AM: 0034 LET vL.ContainerPathName = PurgeChar(trim(peek(FieldName(1,'vL.temp_table_map'),0,'vL.temp_table_map')),'=;,- '&chr(39))
29/05/2014 10:42:59 AM: 0035 LET vL.ContainerFolderName = lower(PurgeChar(trim(peek(FieldName(2,'vL.temp_table_map'),0,'vL.temp_table_map')),'=;,'&chr(39)))
29/05/2014 10:42:59 AM: 0036 LET vL.Comment = PurgeChar(trim(peek(FieldName(3,'vL.temp_table_map'),0,'vL.temp_table_map')),';,'&chr(39))
29/05/2014 10:42:59 AM: 0037 LET vL.RootPath = lower(PurgeChar(trim(peek(FieldName(4,'vL.temp_table_map'),0,'vL.temp_table_map')),'=;,'&chr(39)))
29/05/2014 10:42:59 AM: 0038 LET vL.ContainerPathNameCount = peek(FieldName(5,'vL.temp_table_map'),0,'vL.temp_table_map')
29/05/2014 10:42:59 AM: 0041 if not 'Admin' = '' and not '0.administration' = '' then
29/05/2014 10:42:59 AM: 0044 if not right( '0.administration' , 1 ) ='\' then
29/05/2014 10:42:59 AM: 0045 let vL.ContainerName ='0.administration'&'\'
29/05/2014 10:42:59 AM: 0046 else
29/05/2014 10:42:59 AM: 0051 if '0.administration\' =right(lower(''),len('0.administration\')) and '' = '' then
29/05/2014 10:42:59 AM: 0074 if ('Shared'='Admin' or 'Shared'='0.administration') then
29/05/2014 10:42:59 AM: 0096 exit for when ''='True'
29/05/2014 10:42:59 AM: 0097 endif
29/05/2014 10:42:59 AM: 0098 next
29/05/2014 10:42:59 AM: 0032 LET vL.Comment =''
29/05/2014 10:42:59 AM: 0034 LET vL.ContainerPathName = PurgeChar(trim(peek(FieldName(1,'vL.temp_table_map'),1,'vL.temp_table_map')),'=;,- '&chr(39))
29/05/2014 10:42:59 AM: 0035 LET vL.ContainerFolderName = lower(PurgeChar(trim(peek(FieldName(2,'vL.temp_table_map'),1,'vL.temp_table_map')),'=;,'&chr(39)))
29/05/2014 10:42:59 AM: 0036 LET vL.Comment = PurgeChar(trim(peek(FieldName(3,'vL.temp_table_map'),1,'vL.temp_table_map')),';,'&chr(39))
29/05/2014 10:42:59 AM: 0037 LET vL.RootPath = lower(PurgeChar(trim(peek(FieldName(4,'vL.temp_table_map'),1,'vL.temp_table_map')),'=;,'&chr(39)))
29/05/2014 10:42:59 AM: 0038 LET vL.ContainerPathNameCount = peek(FieldName(5,'vL.temp_table_map'),1,'vL.temp_table_map')
29/05/2014 10:42:59 AM: 0041 if not 'Shared' = '' and not '99.shared_folders' = '' then
29/05/2014 10:42:59 AM: 0044 if not right( '99.shared_folders' , 1 ) ='\' then
29/05/2014 10:42:59 AM: 0045 let vL.ContainerName ='99.shared_folders'&'\'
29/05/2014 10:42:59 AM: 0046 else
29/05/2014 10:42:59 AM: 0051 if '99.shared_folders\' =right(lower(''),len('99.shared_folders\')) and '' = '' then
29/05/2014 10:42:59 AM: 0074 if ('Shared'='Shared' or 'Shared'='99.shared_folders') then
29/05/2014 10:42:59 AM: 0076 if not '' = '' then
29/05/2014 10:42:59 AM: 0082 let vL.RootPath ='\\svqlikview\QlikViewDocs\2.Test\'
29/05/2014 10:42:59 AM: 0083 endif
29/05/2014 10:43:00 AM: 0084 if vL.ContainerPathNameCount = 1 then
29/05/2014 10:43:00 AM: 0085 SET vL.Exit= 'True'
29/05/2014 10:43:00 AM: 0087 else
29/05/2014 10:43:00 AM: 0094 exit for when 'True'='True'
29/05/2014 10:43:00 AM: 0100 drop table 'vL.temp_table_map'
29/05/2014 10:43:00 AM: 0103 SET vL.ttt =
29/05/2014 10:43:00 AM: 0104 SET vL.xxx =
29/05/2014 10:43:00 AM: 0105 SET vL.CVSTableName =
29/05/2014 10:43:00 AM: 0106 SET vL.SpecificVariable =
29/05/2014 10:43:00 AM: 0107 SET vL.GetRootPath =
29/05/2014 10:43:00 AM: 0108 SET vL.Exit=
29/05/2014 10:43:00 AM: 0109 SET vL.ContainerName=
29/05/2014 10:43:00 AM: 0110 SET vL.ContainerPathNameCount=
29/05/2014 10:43:00 AM: 0111 end sub
29/05/2014 10:43:00 AM: 0037 SET vL.ContainerFolderName='99.shared_folders'
29/05/2014 10:43:00 AM: 0040 SET vL.ContainerPathName='Shared'
29/05/2014 10:43:00 AM: 0043 SET vL.RootPath='\\svqlikview\QlikViewDocs\2.Test\'
29/05/2014 10:43:00 AM: 0045 if not 'Shared' = '' then
29/05/2014 10:43:00 AM: 0049 trace '### DF 99.shared_folders'
29/05/2014 10:43:00 AM: 0049 '### DF 99.shared_folders'
29/05/2014 10:43:00 AM: 0050 trace '### DF Default Shared Container'
29/05/2014 10:43:00 AM: 0050 '### DF Default Shared Container'
29/05/2014 10:43:00 AM: 0053 SET vG.SharedBasePath = '\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\'
29/05/2014 10:43:00 AM: 0057 sub vL.FileExist (vL.Root)
29/05/2014 10:43:00 AM: 0058 call vL.FileExist ('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\*')
29/05/2014 10:43:00 AM: 0011 if IsNull(filesize('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\*')) = -1 then
29/05/2014 10:43:00 AM: 0014 SET vL.FileExist='true'
29/05/2014 10:43:00 AM: 0015 endif
29/05/2014 10:43:00 AM: 0016 set vL.Root=
29/05/2014 10:43:00 AM: 0017 end sub
29/05/2014 10:43:00 AM: 0060 if vL.FileExist = 'false' then
29/05/2014 10:43:00 AM: 0067 Call GetContainerStructure (vL.GetContainerStructure)
29/05/2014 10:43:00 AM: 0036 vL.ContainerStructure:
29/05/2014 10:43:00 AM: 0037 LOAD * INLINE [
29/05/2014 10:43:00 AM: 0038 PhysicalFolderName, VariablePrefix, Comments
29/05/2014 10:43:00 AM: 0039 '1.Application','Application','QlikView Applications are resided in subfolders under 1.Applications'
29/05/2014 10:43:00 AM: 0040 '2.QVD','QVD','QlikView Data files are stored in subfolders under 2.QVD'
29/05/2014 10:43:00 AM: 0041 '3.Include','Include','Folder where QlikView Include files are stored. These are script parts that are called from the main QlikView script. '
29/05/2014 10:43:00 AM: 0042 '4.Mart', 'Mart','Resides QlikView Qvw marts (in subfolders) for data discovery usage, these folders could be shared.'
29/05/2014 10:43:00 AM: 0043 '5.Config','Config','Configuration and language files like Excel and txt. This folders could be shared to make configuration changes easier'
29/05/2014 10:43:00 AM: 0044 '6.Script','Script','Store for special scripts run by the publisher or scheduled tasks'
29/05/2014 10:43:00 AM: 0045 '7.Export','Export','Folder used to store from QlikView exported data, probably txt or qvx'
29/05/2014 10:43:00 AM: 0046 '8.Import','Import','Folder used to store import data from external systems'
29/05/2014 10:43:00 AM: 0047 '3.Include\1.BaseVariable','BaseVariable','Stores all the variables needed to use the framework, like paths inside the container'
29/05/2014 10:43:00 AM: 0048 '3.Include\2.Locale','Locale','Locale for different regions, used for easy migration between regions'
29/05/2014 10:43:00 AM: 0049 '3.Include\3.ConnString','ConnString','Stores connection strings to data sources'
29/05/2014 10:43:00 AM: 0050 '3.Include\4.Sub','Sub','Store for sub routines, this is a way to reuse code between applications '
29/05/2014 10:43:00 AM: 0051 '3.Include\5.ColorScheme','ColorScheme','Company standard Color Scheme would be placed here'
29/05/2014 10:43:00 AM: 0052 '3.Include\6.Custom','Custom','Store for custom include scripts'
29/05/2014 10:43:00 AM: 0053 '0.Template','Template','Used to identify Admin container and create extra variables used by Variable Editor'
29/05/2014 10:43:00 AM: 0054 ]
29/05/2014 10:43:00 AM: 3 fields found: PhysicalFolderName, VariablePrefix, Comments, 15 lines fetched
29/05/2014 10:43:00 AM: 0055 end sub
29/05/2014 10:43:00 AM: 0068 FOR vL.VariableLoop = 1 to NoOfRows('vL.ContainerStructure')
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',1)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',1)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\1.Application') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedApplicationPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\1.Application\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\1.Application') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',2)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',2)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\2.QVD') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedQVDPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\2.QVD\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\2.QVD') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',3)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',3)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedIncludePath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',4)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',4)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\4.Mart') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedMartPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\4.Mart\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\4.Mart') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',5)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',5)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\5.Config') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedConfigPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\5.Config\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\5.Config') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',6)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',6)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\6.Script') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedScriptPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\6.Script\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\6.Script') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',7)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',7)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\7.Export') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedExportPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\7.Export\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\7.Export') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',8)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',8)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\8.Import') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedImportPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\8.Import\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\8.Import') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',9)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',9)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\1.BaseVariable') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedBaseVariablePath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\1.BaseVariable\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\1.BaseVariable') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',10)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',10)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\2.Locale') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedLocalePath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\2.Locale\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\2.Locale') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',11)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',11)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\3.ConnString') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedConnStringPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\3.ConnString\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\3.ConnString') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',12)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',12)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\4.Sub') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedSubPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\4.Sub\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\4.Sub') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',13)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',13)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\5.ColorScheme') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedColorSchemePath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\5.ColorScheme\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\5.ColorScheme') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',14)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',14)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\6.Custom') > 0 then
29/05/2014 10:43:00 AM: 0075 SET vG.SharedCustomPath='\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\6.Custom\'
29/05/2014 10:43:00 AM: 0078 elseif FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\3.Include\6.Custom') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0070 let vL.PhysicalFolderName = fieldvalue('PhysicalFolderName',15)
29/05/2014 10:43:00 AM: 0071 let vL.VariablePrefix = fieldvalue('VariablePrefix',15)
29/05/2014 10:43:00 AM: 0074 if ''='' and FileTime('\\svqlikview\QlikViewDocs\2.Test\99.shared_folders\0.Template') > 0 then
29/05/2014 10:43:00 AM: 0087 Next vL.VariableLoop
29/05/2014 10:43:00 AM: 0090 drop table vL.ContainerStructure
29/05/2014 10:43:00 AM: 0093 if not ''='' then
29/05/2014 10:43:00 AM: 0098 trace '### DF 99.shared_folders Finished'
29/05/2014 10:43:00 AM: 0098 '### DF 99.shared_folders Finished'
29/05/2014 10:43:00 AM: 0100 else
29/05/2014 10:43:00 AM: 0103 else
29/05/2014 10:43:00 AM: 0111 SET vL.ContainerFolderName=
29/05/2014 10:43:00 AM: 0112 SET vL.PhysicalFolderName=
29/05/2014 10:43:00 AM: 0113 SET vL.VariablePrefix=
29/05/2014 10:43:00 AM: 0114 SET vL.VariableLoop=
29/05/2014 10:43:00 AM: 0115 SET vL.Path=
29/05/2014 10:43:00 AM: 0116 SET vL.LinkShared_Folders=
29/05/2014 10:43:00 AM: 0117 set vL.VariableLoop=
29/05/2014 10:43:00 AM: 0118 set vL.GetContainerStructure=
29/05/2014 10:43:00 AM: 0119 SET vL.ContainerMapPath =
29/05/2014 10:43:00 AM: 0120 SET vL.ContainerPathName=
29/05/2014 10:43:00 AM: 0121 SET vL.RootPath=
29/05/2014 10:43:00 AM: 0122 SET vL.FileExist=
29/05/2014 10:43:00 AM: 0123 SET vL.ContanerName=
29/05/2014 10:43:00 AM: 0124 SET vL.Comment =
29/05/2014 10:43:00 AM: 0125 SET vL.ContainerIdentification=
29/05/2014 10:43:00 AM: 0126 SET vL.SingleFolder=
29/05/2014 10:43:00 AM: 0127 SET vL.SubStringSplitt=
29/05/2014 10:43:00 AM: 0128 SET vL.SubString=
29/05/2014 10:43:00 AM: 0130 end sub
29/05/2014 10:43:00 AM: 0135 endif
We were able to solve this by granting the user NTFS read permissions (Traverse folder / execute file, List folder / read data, Read attributes) on the top level folder (2.Test) with no inheritance to sub-folders and contents. This means they can enumerate the containers, but cannot go into them unless they have specific permissions.
It seems that the LoadContainerMap sub (called by LoadContainerGlobalVariables) needs to be able to see all the containers in the file system even though I am only requesting variables from the System folder.
It would be handy to have a guide outlining the NTFS permissions required by different business roles in the QDF.