Sto ancora studiandomi la gestione Utenze di Alex, ma siccome i colleghi dell'ufficio avrebbero bisogno di iniziare a lavorare entro la fine del mese con il DB che mi hanno chiesto (e siccome voglio comprendere per bene la struttura di quanto condiviso da Alex) per il momento sto cercando di aggirare l'ostacolo "tipi di utenti" per poi ritornarci (senza pressione dei colleghi) utilizzando il materiale di Alex.
Non avendo chissà che livello di conoscenza in programmazione, ho pensato di agire sulla possibilità di impostare le forms in sola lettura.
Quindi all’apertura del DB verifico se chi è entrato è Amministratore o Utente:
codice:
If Me.chkAdmin = True Then 'L'utente è ADMIN e può fare tutto
Me.lblUtente.Caption = "AMMINISTRATORE"
Me.lblUtente.ForeColor = RGB(23, 200, 89)
With Form
.AllowDeletions = True
.AllowAdditions = True
.AllowEdits = True
End With
End If
If Me.chkAdmin = False Then 'L'utente è USER e può solo consultare
Me.lblUtente.Caption = "UTENTE"
Me.lblUtente.ForeColor = RGB(255, 0, 0)
With Form
.AllowDeletions = False
.AllowAdditions = False
.AllowEdits = False
End With
End If
La cosa sembra funzionare, nel senso che l’amministratore può gironzolare per le maschere e fare quello che gli pare (almeno fino ad ora mi sembra così), mentre l’Utente può solo leggere ma non modificare i campi.
Dopo aver richiamato un record, ho bisogno di mostrare, in due ListBox: nella prima il contenuto della cartella di riferimento del record (che conterrà delle sottocartelle) e nella seconda ListBox (facendo doppio click sulle voci della prima ListBox) il contenuto delle varie sottocartelle.
Per fare ciò, utilizzo due funzioni che ho trovato in rete gironzolando qua e là:
La prima ListBox ha come origine una tabella contenente l’elenco delle sole cartelle cui il record fa riferimento (al cui interno ci sono sottocartelle e files liberi) , che viene generata dalla funzione:
codice:
Public Sub Folder(strPath As String)
On Error GoTo errorHandler
If Len(strPath & vbNullString) = 0 Then Exit Sub
DBEngine(0)(0).Execute "delete * from tblCartelle", dbFailOnError
Dim strFile As String
Dim i As Integer
strFile = Dir(strPath, vbDirectory)
i = 0
DBEngine.BeginTrans
Do While strFile <> ""
If (GetAttr(strPath & strFile) And vbDirectory) = vbDirectory Then
If strFile <> "." And strFile <> ".." Then
DBEngine(0)(0).Execute "INSERT INTO tblCartelle (Cartella) VALUES ('" & strFile & "')", dbFailOnError
i = i + 1
End If
End If
strFile = Dir
Loop
DBEngine.CommitTrans
ext_errorLoadAccountHandler:
Exit Sub
errorHandler:
With Err
DBEngine.Rollback
MsgBox "ERR#" & .Number _
& vbNewLine & .Description _
, vbOKOnly Or vbCritical
End With
Resume ext_errorLoadAccountHandler
End Sub
Questa prima funzione è richiamata da:
codice:
Call Folder(DLookup("Server", "tblSistema") & "\" & Me.txtNrPratica & "\")
Poi, facendo doppio click su una voce della prima ListBox, richiamo la funzione che mi popola in maniera dinamica l’origine della seconda ListBox:
codice:
Public Function FillListFiles(ctl As Object, Startpath As String)
Dim MyPath As String
Dim MyName As String
Dim MyRowS As String
If Not (TypeOf ctl Is Access.ComboBox Or TypeOf ctl Is Access.ListBox) Then
MsgBox "L'oggetto passato non è una COMBOBOX o una LISTBOX", vbCritical
Exit Function
End If
If ctl.RowSourceType <> "Value List" Then
MsgBox "Imposta il TIPO ORIGINE RIGA come Elenco Valori", vbCritical
Exit Function
End If
ctl.RowSource = ""
MyPath = Startpath
MyName = Dir(MyPath)
Do While MyName <> ""
MyRowS = MyRowS & MyName & ";"
MyName = Dir
Loop
MyRowS = Left(MyRowS, Len(MyRowS) - 1)
ctl.RowSource = MyRowS
End Function
La seconda funzione la richiamo con la riga:
codice:
Call FillListFiles(Me.lstCartella02, (DLookup("Server", "tblSistema") & "\" & Me.txtPratica & "\" & Me.lstCartella01.Column(0) & "\"))
Veniamo al problema che riscontro.
Se entro come Amministratore, la navigazione nelle ListBox avviene come voglio, ma se entro come Utente no: infatti la seconda ListBox si popola con l’elenco dei files contenuti nella cartella principale (cioè i files liberi contenuti nella cartella principale della ListBox 1)
Ho riscontrato che il problema è nella genesi del percorso di ricerca utilizzato per generare la ListBox nr. 2
Infatti, come amministratore la funziona va a creare l’elenco dei file, ad esempio, in:
D:\Archivio\123\Sottocartella1\
Mentre come Utente:
D:\Archivio\123\\
Suppongo che il tutto sia da ricondurre ai vari .Allow etc delle forms. Ma non capisco perché. Anche se l’Utente non ha diritto di modifica, quando clicco sulla prima ListBox, non sto modificando nulla (suppongo); mi aspetterei, al limite, di ricevere un messaggio di errore nel momento in cui genero l’elenco per popolare la seconda ListBox (ma forse neanche, perché non sto agendo su nessun record….)
A parte la mia ignoranza, cosa sto sbagliando?
Andrea