Condividi tramite

Apertura applicazione su un client in modo esclusivo

Anonimo
2011-03-24T20:12:21+00:00

Ciaoo a tutti ;

Dopo aver completato un'applicazione mdb , seguendo  i consigli del forum (tra cui anche uno dei miei thread precedenti)  ho installato il database su quattro pc : A (server) B , C e D (clients).  Il tutto gira a meraviglia , ora però ho la necessità che l'applicazione venga utilizzata solo ed esclusivamente da un client e non contemporaneamente;  ovvero che se un utente è attivo su un client (esempio B) ed un'altro utente tenta di aprire l'applicazione su un'altro client (C o D) un msgbox dovrebbe avvisare l'utente che l'applicazione è già in uso su un altro pc

Grazie a chi potrà aiutarmi.

Franco Laroccia

Microsoft 365 e Office | Accesso | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2011-03-26T09:10:35+00:00

    Ciao Franco.

    la tecnica del Front-End / Back-End si basa sulla logica di avere un file access (back-end) che contiene solo le tabelle e che dovrebbe essere posizionato in un percorso di rete accessibile a tutti i client (front-end).

    Quindi nella tua applicazione, a meno di particolari esigenze, avrebbe senso avere sul pc server solo il back-end. Nelle postazioni degli utenti invece copi il file access "front-end" che contiene le tabelle collegate al back-end + tutti gli altri oggetti (query, maschere, report, macro). E' sui client (front-end) che devi impostare il check di cui abbiamo parlato sopra per controllare se il file back-end risulta già aperto da altri utenti.

    David

    La risposta è stata utile?

    0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2011-03-25T10:58:18+00:00

    Ciao Franco,

    due metodi alternativi :

    • fai un test sulla presenza del file .ldb (access 2003)  oppure laccdb (access 2007) nella cartella dove risiede il "server". Puoi utilizzare il comando "DIR" per effettuare il test. Nel caso il file sia presente significa che qualcuno ha avuto accesso.
    • utilizza la routine ShowUserRosterMultipleUsers che trovi qui:

    http://support.microsoft.com/kb/198755/en-us

    La routine richiede i riferimenti alla libreria activeX 2.1 o superiori

    Di seguito un'adattamento che ti restituisce TRUE in presenza di più di un client


    Function ShowUserRosterMultipleUsers() As Boolean

        Dim cn As New ADODB.Connection

        Dim rs As New ADODB.Recordset

        Dim I As Long

        'cn.Provider = "Microsoft.ACE.OLEDB.12.0;"    'Da utilizzare se fai il test su file ACC2007

        cn.Provider = "Microsoft.Jet.OLEDB.4.0"     'Da utilizzare per test su file mdb

        cn.Open "Data Source="  --> qui metti il percorso che al file sulla macchina server

        ' The user roster is exposed as a provider-specific schema rowset

        ' in the Jet 4 OLE DB provider.  You have to use a GUID to

        ' reference the schema, as provider-specific schemas are not

        ' listed in ADO's type library for schema rowsets

        Set rs = cn.OpenSchema(adSchemaProviderSpecific, _

        , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")

        I = 0

        While Not rs.EOF

            I = I + 1

            rs.MoveNext

        Wend

        If I > 1 Then

            ShowUserRosterMultipleUsers = True

        Else

            ShowUserRosterMultipleUsers = False

        End If

        Set rs = Nothing

    End Function


    Il test sulla presenza del file ldb, così come la lettura del suo contenuto, sono abbastanza semplici da implementare ma hanno lo svantaggio che, in caso di crash dell'ultimo client che ha avuto accesso, falliscono in quanto il file ldb non viene cancellato.

    David

    La risposta è stata utile?

    0 commenti Nessun commento

13 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2011-03-25T16:24:57+00:00

    Ciaoo David

     ..prima di provare il tutto mi sorge solo un dubbio..(..visto che è la prima volta che una mia applicazione lavora anche su dei clients)  : la routine ed il modulo non di classe che mi hai indicato, e la maschera non associata vanno naturalmente sul server e su ogni clients con i relativi percorsi..??

    Grazie per la pazienza che hai David...

    Franco Laroccia

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2011-03-25T14:00:29+00:00

    Ciao Franco,

    ovviamente il comando dir non lo deve usare l'utente (!), dovresti inserirlo tu nel codice per fare il test di esistenza del file con estensione ldb.

    Sostanzialmente:

    • crei una maschera non associata (vuota) e nell'evento su apertura di questa maschera scrivi:

        Dim strPath As String

        strPath = "\\nomeserver\nomecartella\fileaccess.ldb"

    'sostituisci con il percorso e il nome del file access sul tuo server. Lascia l'estensione ldb

        If Not Len(Dir(strPath) & "") = 0 Then

            MsgBox "Un altro utente ha già avuto accesso", vbInformation, "accesso multiplo"

            DoCmd.Quit

        Else

            DoCmd.OpenForm "Maschera2"

    'sostituisci a Maschera2 il nome della maschera di partenza della tua applicazione    End If


    Per quanto riguarda la funzione ShowUserRosterMultipleUsers che ti indicato:

    Apri l'editor VBA e inserisci un nuovo modulo (NON di classe). Copia e incolla tutta la funzione. Poi nella tua applicazione, come prima crei una maschera vuota non associata e nell'evento su apertura scriverai


        If ShowUserRosterMultipleUsers = True Then

            MsgBox "Un altro utente ha già avuto accesso", vbInformation, "accesso multiplo"

            DoCmd.Quit

        Else

            DoCmd.OpenForm "Maschera2"

    'sostituisci a Maschera2 il nome della maschera di partenza della tua applicazione

        End If


    Mi raccomando: nella funzione ricordati di inerire nella riga

    cn.Open "Data Source="  --> qui metti il percorso che al file sulla macchina server

    Il percorso al file mdb della tua applicazione. Per esempio

    cn.Open "Data Source=\nomeserver\nomecartella\fileaccess.mdb"

    In entrambi i casi, la maschera vuota così creata va richiamata in modalità nascosta con una macro Autoexec in modo che venga automaticamente aperta al lancio dell'applicazione.

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2011-03-25T13:32:08+00:00

    Ciao David...

    ..credo che il 1° metodo non vada molto bene perchè l'utente che utilizza l'applicazione da un'altro client è tentato ad aprire direttamente l'applicazione e potrebbe dimenticarsi del comando DIR...!

    ..per il 2° metodo dimmi dove vado ad inserire la routine ShowUserRosterMultipleUsers che mi hai postato..??

    Grazie

    Franco

    La risposta è stata utile?

    0 commenti Nessun commento