Condivisione back end su Lan

di il
8 risposte

Condivisione back end su Lan

Buonasera a tutti.

Come solitamente faccio non volevo scomodare il forum per un'inezia. Ho spulciato ogni mia conoscenza (basica) ed ogni guida sull'argomento, ma non ne vengo a capo.

Ho un problema di condivisione del back end su una LAN privata. Il Front end rimane impallato a ricercare il file dati. E non riesco proprio a capire il perchè.

Dato che è la prima volta che provo a condividere dei dati su una LAN perchè i miei database sono sempre stati STAND ALONE mi chiedevo se c'è qualche flag od opzione che mis fugge….

Grazie per ogni risposta

8 Risposte

  • Re: Condivisione back end su Lan

    Cancella le linked e ricreale da zero…, cosa peraltro di buon senso tecnico da fare di default da codice.

    Alla chiusura del client si cancellano ed alla riapertura si ripristinano.

  • Re: Condivisione back end su Lan

    Private Sub Form_Load()
    Dim Valore, StrMsg, StrTtl As String
    Dim Dove2 As String
    Dim Dove As String
    Dim Risposta, RetValue As Variant
    Dim I, Count As Integer
    Dim DbCorrente As DAO.Database
    Dim Dati_drop As DAO.Recordset
    Dim OK As Boolean
    
      If Aperta("Frm_menu") Then DoCmd.Close acForm, "Frm_menu"
      If Aperta("Frm_start") Then DoCmd.Close acForm, "Frm_start"
      Call HideMen
      Call HidePanel
      Dove = DLookup("Database", "Query_path_relink")
      If FileExist(Dove) Then GoTo Ending
      StrMsg = GetMsg(1, Me.Name, "Form", "Load", GetLanguage(), 1)
      StrTtl = GetTtl(1, Me.Name, "Form", "Load", GetLanguage(), 1)
      Risposta = MsgBox(StrMsg, vbCritical + vbOKOnly, StrTtl)
      Call File(Dove2)
      If IsNull(Dove2) Or Len(Dove2 & "") = 0 Then
        StrMsg = GetMsg(1, Me.Name, "Form", "Load", GetLanguage(), 2)
        StrTtl = GetTtl(1, Me.Name, "Form", "Load", GetLanguage(), 2)
        RetValue = MsgBox(StrMsg, vbCritical + vbOKOnly, StrTtl)
        DoCmd.Quit
      Else
        Call CambiaLink(Dove2)
      End If
    Ending:
      If Not GetDebug() Then On Error GoTo Errore
      I = 0
      OK = VerifySysPass
      If Not (OK) Then
    Reverse:
        I = I + 1
        DoCmd.OpenForm "Frm_Payment", , , , , acDialog, I
        OK = VerifySysPass
      End If
      If Not OK Then
        If I = 3 Then
          DoCmd.Quit
        Else
          GoTo Reverse
        End If
      End If
      Me.Picture = CheckImg("Logo", "Logo", "")
      tmin = 0
      Escape = False
      Language = 1
      Lingua = 1
      NSlotDec = 0
      Call CambiaLingua(Me.Form, GetLanguage())
      If DCount("*", "ImpostazioniDB", "Cod_dropzone=" & GetIdDrop()) > 0 Then
        Emperor = ""
        Direction = ""
        Locked = ""
      Else
        Emperor = ""
        Direction = ""
        Locked = ""
      End If
    Back:
      Set DbCorrente = CurrentDb
      Set Dati_drop = DbCorrente.OpenRecordset("Dati_drop", dbOpenDynaset)
      For I = 0 To 20
        Select Case I
          Case 0 To 6
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 10
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 15
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 20
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
        End Select
      Next I
      Set DbCorrente = Nothing
      Set Dati_drop = Nothing
    Errore:
      If Not GetDebug() Then
        If Err.Number <> 0 Then
          Call GError(Str(Err.Number), Err.Description)
          Resume Next
        End If
      End If
    End Sub

    Ciao @Alex… Io avevo giù un afunzione che nel caso del cambio della directory del file back end mi andava a rinconfigurare il link alle table… §

    Ma, vuoi perchè studiata in modo “proprio” o non so che, cse gli passo il “nuovo link” al file back end continua a “far girare gli ingranaggi”…… 

    ERa questo che chiedevo… non ho postato il codice perchè lo ritenevouna richiesta stupida…

  • Re: Condivisione back end su Lan

    Public Sub File(parametro As String)
    Dim sFile As String
    Dim fDialog As FileDialog, Result As Integer
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
        
    fDialog.AllowMultiSelect = False
    fDialog.Title = "Seleziona file sorgente Dati"
    fDialog.ButtonName = "Seleziona"
    fDialog.InitialFileName = "C:\"
    fDialog.Filters.Clear
    fDialog.Filters.Add "Access files", "*.accdb"
        
      With fDialog
        If .Show = -1 Then
          sFile = .SelectedItems(1)
          parametro = sFile
        End If
      End With
      If sFile <> "" Then
        Forms![Frm_benvenuto]!TxtDove = sFile
      Else
        Exit Sub
      End If
    End Sub
    Public Function CambiaLink(Path As String)
    Dim dbs As Database
    Dim Tdf As TableDef
    Dim Tdfs As TableDefs
    
    Set dbs = CurrentDb
    Set Tdfs = dbs.TableDefs
                 
      For Each Tdf In Tdfs
        If Tdf.SourceTableName <> "" Then
          Tdf.Connect = "MS Access;PWD=" & "Io0la0so" & ";" & "DATABASE=" & Path
          'Tdf.Connect = ";DATABASE=" & Path
          Tdf.RefreshLink
        End If
      Next
    End Function

    Posto anche la funzione file e cambialink in caso servisse per ulteriori valutazioni

  • Re: Condivisione back end su Lan

    Il problema prioritario è capire se ripristinando le Linked l'anomalia esposta si risolve, poi la soluzione può essere quella di sfruttare il codice già presente per realizzare l'automatismo necessario.

    Io avrei fatto una prova puramente manuale per verificare se l'idea diagnostica era centrata… poi se vuoi analiziamo il codice per capire se richiede migliorie.

  • Re: Condivisione back end su Lan

    Proseguo questo thread…. Anche se forse dovrei aprirne uno nuovo… Lascio ai moderatori la decisione.

    Provato il metodo di @alex di eliminare e reinserire le linkedtable….

    il problema sussiste…

    il mio dubbio proviene dall'uso “immondo” del Dlookup nelle mie maschere…

    Che sia questo il problema?

  • Re: Condivisione back end su Lan

    Direi che sono 2 cose molto differenti…!

    Se il problema fose dovuto a “RALLENTAMENTI” causati da Funzioni di Aggregazione… lo vedi aprendo le Tabelle direttamente.

    Se l'apertura di una Linked è immediata, allora si probabile sia questione di ottimizzazione.

    Io non uso mai le fuinzioni di Aggregazione, soprattutto sono da bandire in Queries ed anche nel caso in cui il recupero dei dati sia multiplo…

    Esempio se devi estrarre Campi di uno stesso Record è veramente sconsigliato usare Dlookup, basta aprire un RS sul record ed hai tutti campi che ti servono.

    In ogni caso non è che Dlookup sia lentissimo rispetto ad un RS, lo diventa se appunto necessiti di più Informazioni, a quel punto 2 DlookUp non sono da confrontare con l'apertura del RS.

  • Re: Condivisione back end su Lan

    19/01/2023 - LoScortese ha scritto:


      If DCount("*", "ImpostazioniDB", "Cod_dropzone=" & GetIdDrop()) > 0 Then
        Emperor = ""
        Direction = ""
        Locked = ""
      Else
        Emperor = ""
        Direction = ""
        Locked = ""
      End If

    Senza entrare troppo nella logica del  tuo codice ma cercando eventuali pezzi inutili/superflui, il dcount evidenziato è inutile : inizializza le 3 variabili e basta.

    19/01/2023 - LoScortese ha scritto:


      Set DbCorrente = CurrentDb
      Set Dati_drop = DbCorrente.OpenRecordset("Dati_drop", dbOpenDynaset)
      For I = 0 To 20
        Select Case I
          Case 0 To 6
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 10
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 15
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 20
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
        End Select
      Next I
      Set DbCorrente = Nothing
      Set Dati_drop = Nothing
    

    Questa parte di codice è quantomeno oscura : scorri i 20 campi di un record e per 10 di essi, se contengono qualcosa, apri sempre lo stesso form. Non so cosa gestisci in questo form, ma non passando alcun parametro all'apertura, mi pare che puoi aprirlo fino a 10 volte (0-6,10,15 e 20) richiedendo probabilmente le stesse informazioni… Peraltro ritorni indietro con un GoTo senza neanche distruggere gli oggetti (quantomeno il recordset DataDrop).

    19/01/2023 - LoScortese ha scritto:


    
      Set DbCorrente = CurrentDb
      Set Dati_drop = DbCorrente.OpenRecordset("Dati_drop", dbOpenDynaset)
    ....
      Set DbCorrente = Nothing
      Set Dati_drop = Nothing
    

    Qualora fosse corretto quello che fai (ma probabilmente non lo è) anche l'ordine di distruzione degli oggetti è sbagliato : Dati_Drop dipende da DbCorrente quindi va distrutto prima e non dopo.

    Certamente il tuo codice andrebbe rivisto nella sua totalità in quanto l'utilizzo di Goto è indice di poca esperienza (di programmazione).

    Tornando invece al problema specifico occorre che verifichi quanto tempo impiega il loop di relink delle tabelle (for each Tdf in Tdfs … next) in modo da individuare meglio il collo di bottiglia.

  • Re: Condivisione back end su Lan

    Allora. Rispondo ad entrambi e nel contesto e per @max.riservo ci tengo a precisare che sto facendo “retrofitting” di questo DB iniziato come esercizio 4 anni fa e basato su una base dati non di mia concezione. 

    If DCount("*", "ImpostazioniDB", "Cod_dropzone=" & GetIdDrop()) > 0 Then
        Emperor = ""
        Direction = ""
        Locked = ""
      Else
        Emperor = ""
        Direction = ""
        Locked = ""
      End If

    Sono a conoscenza di questo. Le variabile emperor, locked e direction venivano inizializzate nel caso che impostazioni DB fosse “portatore” di un record. Volevo eliminare tale cosa  ma mi sto dedicando a funzioni più complesse.

    Set DbCorrente = CurrentDb
    Set Dati_drop = DbCorrente.OpenRecordset("Dati_drop", dbOpenDynaset)
      For I = 0 To 20
        Select Case I
          Case 0 To 6
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 10
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 15
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
          Case 20
            If Len(Dati_drop.Fields(I) & "") = 0 Then
              DoCmd.OpenForm "Frm_impostazioni_drop", , , , , acDialog
              GoTo Back
            End If
        End Select
      Next I
      Set DbCorrente = Nothing
      Set Dati_drop = Nothing

    Il significato di tale ciclo era l'obbligo di far inserire QUEI determinati valori. In teoria il ciclo per quanto mi riguarda potrebbe ripetersi anche 1000 volte, purchè quei 10 valori siano inseriti. L'utilizzo del Goto al momento mi sembrava l'opzione più rapida.

    Sull'ultimo pezzo effettivamente è un errore mio… Ma è codice scritto in fretta ormai 4 anni fa e solo ora lo sto rendendo userfriendly.

    Aldilà di questo ho fatto le dovute prove per individuare il collo di bottiglia. Effettivamente al mio primo collegamento era errata la modalità di condivisione del back end.

    Ora l'apertura delle linked risulta immediata, è l'accesso ai dati alle singole maschere che risulta macchinoso e lento, e questo perchè come ho già preventivamente scritto ho fatto un uso “non mopderato” delle funzoni di aggregazione.

    Ora che sto facendo “pulizia” del codice spurio andrò a sostituire le varie funzioni con l'utilizzo di una metologia più snella.

    Grazie per i suggerimenti e gli spunti. Vi tengo aggiornati

Devi accedere o registrarti per scrivere nel forum
8 risposte