Problemi con .MoveNext

di il
8 risposte

Problemi con .MoveNext

Sono un modestissimo utilizzatore di Access 2007.
Ho scritto un codice per il VBA di Acess 2007 per creare sottocartelle in una cartella di destinazione prelevando i dati per comporre il nome da assegnare alle sottocartelle da una tabella.
Il programma funziona bene e fa quanto previsto.
Ho poi scritto un programma che nelle intenzioni dovrebbe aprire la tabella che contiene i dati partendo dal primo record con un .MoveFirst creare la relativa sottocartella e poi passare via via ai recoed successivi con un .MoveNext ma non funziona.
Creata la prima sottocartella salta il comando Tabella.MoveNext ed esce dal Do Until ... loop.
C'è qualcuno che mi può aiutare a trovare l'errore?
Il codice è abbastanza commentato e quindi dovrebbe essere chiaro.
Mi scuso per ogni eventuale errore nel postare questa richiesta, ma è la prima volta che accedo.
Grazie a tutti.
LuiseP
'COMANDO VerificaFS - Verifica archivio fascicoli
'Verifica per tutti gli studenti in Studenti Matricola la presenza della sottocartella personale nella cartella GeABAV-StudentiArchivioFascicoli
'Se non la trova la crea
Private Sub VerificaFS_Click()
Dim DBCOrrente As DAO.Database 'DBcorrente o altra variabile
Dim strMatricola, strStudente, strStCog, strStNom, InizialiN, LetteraN, strCartella, Msg1, Msg3, Msg4, Style, Help, Ctxt, Percorso As String
Dim NumMat, Studente, Percorso1, Cartella As String
Dim i, LunMat, LunCar, PosizioneL As Long
Title = "Cartella Studente"
'Help = "DEMO.HLP"
'Ctxt = 1000
Set DBCOrrente = CurrentDb 'per aprire un collegamento sul dbcorrente
Set Tabella = DBCOrrente.OpenRecordset("Studenti Matricola", dbOpenDynaset)
Tabella.MoveFirst
Do Until Tabella.EOF 'inizia il ciclo
    'prepara il nome della cartella composto dal Cognome e iniziali del Nome
    'prima fase: converte cognome e nome nella stringa strStudente  composta dal Cognome e iniziali del Nome
    strMatricola = Me.Matricola
    strCog = Me.StCog
    strNom = Me.StNom
    InizialiN = Left(Me.StNom, 1)
        For i = 2 To Len(strNom)
            LetteraN = Mid(strNom, i, 1)
            PosizioneL = i
            If LetteraN = " " Or LetteraN = "" Then
                PosizioneL = i + 1
                LetteraN = Mid(strNom, PosizioneL, 1)
                InizialiN = InizialiN & LetteraN
                i = i + 1
            End If
        Next i
        strStudente = Me.StCog & "_" & InizialiN    
    'seconda fase: crea la strCartella composta da strStudente & NumBat (numero di matricola trasformato
    'in una stringa di 4 cifre facendolo precedere dalla cifra "0" per quante volte necessario se le cifre sono <4)
    LunMat = Len(strMatricola)
    NumMat = Left("0000", 4 - LunMat) & strMatricola
    strCartella = strStudente & "_" & NumMat
    'sostrituisce in strCartella gli spazi " " con "_"
    LunCar = Len(strCartella)
    For i = 1 To LunCar
        If Mid(strCartella, i, 1) = " " Then
            Mid(strCartella, i, 1) = "_"
        End If
    Next
    Msg4 = "Presenti in archivio le cartelle di tutti gli studenti."  
    'Style = vbYesNoCancel + vbCritical + vbDefaultButton2 'Percorso1 = C:\Users\Luigi_S\Desktop\GeABAV-StudentiArchivioFascicoli\" & strCartella  & "\"
    Percorso1 = "C:\Users\Luigi_S\Desktop\GeABAV-StudentiArchivioFascicoli\" & strCartella & "\"
    Esiste = Dir(Percorso1, vbDirectory)
    If Esiste = "" Then 'Controlla la presenza della cartella strCartella nella cartella C:\Users\Luigi_S\Desktop\GeABAV-StudentiArchivioFascicoli\
        MkDir (Percorso1)        ' Crea la cartella per strStudente
    End If
    Tabella.MoveNext 'QUESTO E' IL COMANDO CHE SEMBRA IGNORARE
Loop
MsgBox Msg4
'Chiusura Tabella
Tabella.Close
'Chiusura DB
DBCOrrente.Close
End Sub

8 Risposte

  • Re: Problemi con .MoveNext

    A me le cose che più saltano all'occhio sono:

    1. Non hai dichiarato tra le variabili
    Dim Tabella As DAO.Recordset
    2.
    Title = "Cartella Studente"
    
    Non hai mai dichiarato una variabile Title

    3.
    Dim strMatricola, strStudente, strStCog, strStNom, InizialiN, LetteraN, strCartella, Msg1, Msg3, Msg4, Style, Help, Ctxt, Percorso As String
    Dim NumMat, Studente, Percorso1, Cartella As String
    Dim i, LunMat, LunCar, PosizioneL As Long
    
    Hai commesso un classico errore secondo cui dovresti scrivere
    Dim strMatricola As String, strStudente As String, strStCog As String ecc...
    idem
    Dim i As Long, LunMat As Long, LunCar As Long, PosizioneL As Long
    Penso che il punto 1. sia il più importante.
    Per il resto ignoro l'intera logica.
  • Re: Problemi con .MoveNext

    Pensa Osvaldo che tutto sommato il punto 1 è l'unica dichiarazione corretta...
    Che lui chiami Tabella un oggetto Recordset... direi che non è un problema... se però vuoi argomentare tecnicamente la tua osservazione... possiamo capire perche per te è fondamentale...

    Tutte le altre dichiarazioni di variabili sono ovviamente errate ma non possono essere l'origine del problema.
    A mio avviso... apri u recordset e poi usi i riferimenti fissi di maschera invece che i campi del recordset... ma francamente quel codice è illeggibile e forse se spiegassi COSA devi fare potremmo provare a capire...
  • Re: Problemi con .MoveNext

    Grazie Osvaldo e Alex dei suggerimenti.
    Il mio intento è quello di creare una cartella per ogni record di una tabella attribuendogli un nome legato ad alcuni campi del record stesso.
    Su una form da dove accedo ai dati per inserirne di nuovi o per variare se necessario quelli già inseriti ho creato un pulsante di comando che crea una cartella per il record corrente.
    Poiché i record della tabella sono molti e l'idea e il comando sono nuovi, devo creare le cartelle per i record già inseriti ed invece di farlo record per record vorrei creare una routine che crei automaticamente le cartelle non presenti. Ho quindi pensato di creare un loop che muovendosi con il comando MOVE.NEXT per ogni record della tabella verificasse la presenza della cartella per il record selezionato e la creasse se non presente nella cartella generale di archivio.
    Come parte centrale ho usato il codice che funziona sul record corrente creando la rispettiva cartella singola cartella.
    Ho capito che non dovevo usare il Recordset DAO ma semplicemente spostarmi da un record all'altro conl'istruzione
    DoCmd.GoToRecord , "", acNext
    Adesso funziona egregiamente.
  • Re: Problemi con .MoveNext

    LuiseP ha scritto:


    Grazie Osvaldo e Alex dei suggerimenti.
    Il mio intento è quello di creare una cartella per ogni record di una tabella attribuendogli un nome legato ad alcuni campi del record stesso.
    Su una form da dove accedo ai dati per inserirne di nuovi o per variare se necessario quelli già inseriti ho creato un pulsante di comando che crea una cartella per il record corrente.
    Poiché i record della tabella sono molti e l'idea e il comando sono nuovi, devo creare le cartelle per i record già inseriti ed invece di farlo record per record vorrei creare una routine che crei automaticamente le cartelle non presenti. Ho quindi pensato di creare un loop che muovendosi con il comando MOVE.NEXT per ogni record della tabella verificasse la presenza della cartella per il record selezionato e la creasse se non presente nella cartella generale di archivio.
    Come parte centrale ho usato il codice che funziona sul record corrente creando la rispettiva cartella singola cartella.
    Ho capito che non dovevo usare il Recordset DAO ma semplicemente spostarmi da un record all'altro conl'istruzione
    DoCmd.GoToRecord , "", acNext
    Adesso funziona egregiamente.
    Ma chi ha detto questa fesseria...?
    Si usa il RecordsetClone e non questo metodo decisamente sbagliato...

    Mi chiedo a cosa serve un Database se poi uno si deve creare N_mila cartelle per dare un Ordine che poi non serve... perchè NON SI DOVREBBE accedere alle cartelle per girovagare... il DB deve funzionare anche per l'Esplorazione e l'organizzazione a CARTELLE è quanto di più inutile...

    In ogni caso... io mi fermo.
  • Re: Problemi con .MoveNext

    Caro Alex, certamente non sono stato chiaro.
    In un data base, quale ad esempio una rubrica ho necessità di salvare per ogni nominativo file di varia natura. Non volendo usare campi di tipo allegato ho deciso di creare un campo di tipo collegamento ipertestuale puntato sulla cartella relativa. Certamente avrei potuto usare un RecordsetClone. Spero di essermi spiegato.
    Grato se mi fai capire l'errore concettuale in cui sono incorso.
  • Re: Problemi con .MoveNext

    LuiseP ha scritto:


    Caro Alex, certamente non sono stato chiaro.
    In un data base, quale ad esempio una rubrica ho necessità di salvare per ogni nominativo file di varia natura. Non volendo usare campi di tipo allegato ho deciso di creare un campo di tipo collegamento ipertestuale puntato sulla cartella relativa. Certamente avrei potuto usare un RecordsetClone. Spero di essermi spiegato.
    Grato se mi fai capire l'errore concettuale in cui sono incorso.
    Stai mescolando diversi concetti che non hanno alcuna affinità...!
    Scorrere i RECORD per creare le Cartelle con il metodo che hai ultimamente esposto è una fesseria... potevi usare Recordsetclone..., parli di DAO... secondo me c'è tanta confusione, poche certezze...

    L'altro aspetto è l'organizzazione che ti sei dato, è inutile... come ti ripeto, nel DB si salva il Nome del File ed eventualmente il Percorso Relativo se ha una SubFolder DOCUMENTI... creare una Cartella per ogni utente è una inutile complicazione che non solo non da alcun valore aggiunto ma complica in modo incredibile l'eventuale manutenzione.
    Tu ti sei fissato con questo metodo che di Tecnico non ha nulla.

    Quindi tra quello che avresti potuto fare e non hai fatto e quello che hai fatto e che non avresti dovuto fare io ti ho detto la mia...
    Buon lavoro.
  • Re: Problemi con .MoveNext

    Secondo me LuiseP aveva una esigenza "alla svelta" di creare MOLTE cartelle per i suoi riferimenti path. Mi pare di capire che questa operazione l'ha dovuta espletare "massivamente" una volta sola. Dopo di che "quel pulsante", con "quella rutine", potrebbe non servire più. Direi che qualsiasi soluzione abbia applicato, se alla fine ha funzionato, va bene uguale.
    Concordo con @Alex che sulla maschera potrebbe servirti un campo con l'indicazione del path o un comando che via VBA ricostruisce il tuo path per raggiungere il file corrispondente che immagino ti serve per aprirlo all'occorrenza.

    @Alex ha scritto:


    creare una Cartella per ogni utente è una inutile complicazione che non solo non da alcun valore aggiunto ma complica in modo incredibile l'eventuale manutenzione.
    Tu ti sei fissato con questo metodo che di Tecnico non ha nulla.
    ...non lo so...non saprei...non mi appare una questione fondamentale o di principio. Se LuiseP ritiene utile suddividere i file coerentemente in cartelle per Clienti, perché no.

    Se sto travisando qualcosa del discorso di cui mi sono perso qualche pezzo...mi tiro indietro.
  • Re: Problemi con .MoveNext

    Osvaldo certe considerazioni si fanno se tecnicamente ci sono basi su cui fare confronto.
    Evidente che si può fare tutti nella vita... ed anche il contrario di tutto... ma tecnicamente dividere cartelle per utenti è un retaggio di chi non organizza il sistema con un database e ragiona sempre con l'idea di avere in locale l'accessibilità alle cartelle dei dati in modalità manuale... "Si sa mai"...
    Non solo è un ragionamento sbagliato ma veramente inutile e da non applicare.
    L'uso di un sistema a base dati con interfaccia deve essere l'unico mezzo di accesso ai dati altrimenti è un macello... ed ad Access o a qualsiasi database il fatto di avere i file in cartelle non ne può fregare di meno se non creare confusione.

    Poi come ti dicevo si può fare tutto a patto di essere capaci ed avere le idee chiare... altrimenti la prima cosa da fare è l'essenziale.
Devi accedere o registrarti per scrivere nel forum
8 risposte