Avviso di campi vuoti e non compilati (di un modulo di Word) prima di inserire i dati nel Database di Access.

Anonimo
2018-04-14T07:01:18+00:00

Buongiorno a tutti.

Tempo fa, con l'aiuto dell'amico Sandro Peruz ho completato la sottoriportata routineche mi permette di importare, in modo massivo, nel database,  tutti i dati riportati nei vari file di Word ( che ho utilizzato come modulo per prenotazione al soggiorno estivo).

Mi ritrovo a ricevere i seguenti messaggi di errore (con il codice in blocco alla riga in giallo in una delle immagini allegate) quando in uno o più file di Word non sono compilati alcuni campi obbligatori e presenti anche nel DB.

Quello che desidero con il vostro aiuto è di poter essere avvisato ( con un MsgBox o altro metodo ) e conoscere quali campi sono vuoti e a che file di Word si riferiscono.

Ora cosi come è impostato il tutto devo risalire io, ed individuare manualmente  sia i campi non compilati e il file di word interessato.

Si tenga conto che i file di word che ricevo sono migliaia e che una situazione del genere mi costringe ad un lungo e complicato lavoro manuale.

Spero di essere stato chiaro, sono qui per spiegare ulteriori dettagli e fornire chiarimenti.

Ciao Nicola.

al

il codice è questo:

Private Sub cmdImportWord_Click()

 If Not isWordRunnning Then Exit Sub

   On Error GoTo errHandler

   Dim aFiles()  As String

   Dim f         As String

   Dim i         As Long

   Dim strSql    As String

   Dim j         As Long

   Dim lngParent As Long

   f = cmdFileDialog()

  If Len(f) = 0 Then

        VBA.MsgBox "Nessun file selezionato!", vbCritical, "ESCO DALLA PROCEDURA"

        Exit Sub

   End If

   Me.txtStarTime = Now()

   aFiles = Split(f, ";")

  For i = 0 To UBound(aFiles)

     Set doc = AppWord.Documents.Open(aFiles(i))

     With doc

           strSql = "insert into tblFruitori (Cognome,Nome,Grado,Matricola,Nato,Il,Comando, Telefono, Cellulare, AltroTelefono, Posizione,ASGI, Mesi, ASTC, Mesi_1, Animali, Reddito, Luogo, Data, Firma) " & _

                    "values ('" & _

                    myReplace(.FormFields("txtCognome").result) & "','" & myReplace(.FormFields("txtNome").result) & "','" & .FormFields("txtGrado").result & "','" & _

                    .FormFields("txtMatricola").result & "','" & myReplace(.FormFields("txtNato").result) & "','" & .FormFields("txtIl").result & "','" & _

                    myReplace(.FormFields("txtComando").result) & "','" & .FormFields("txtTelefono").result & "','" & _

                    .FormFields("txtCellulare").result & "','" & .FormFields("txtAltroTelefono").result & "','" & _

                    .FormFields("txtPosizione").result & "','" & .FormFields("txtASGI").result & "','" & .FormFields("txtMesi").result & "','" & _

                    .FormFields("txtASTC").result & "','" & .FormFields("txtMesi1").result & "','" & .FormFields("txtAnimali").result & "','" & _

                    .FormFields("txtReddito").result & "','" & .FormFields("txtLuogo").result & "','" & .FormFields("txtdata").result & "','" & .FormFields("txtFirma").result & "')"

           DBEngine(0)(0).Execute strSql, &H80

           lngParent = DMax("ID_Fruitore", "tblFruitori")

           Me.txtFile = doc.Name

           Me.txtIndex = "indice array:" & i + 1

           Me.txtIndex1 = i + 1

           DBEngine.BeginTrans

              For j = 1 To 6

              If Len(.FormFields("txtCognome" & j).result) > 0 Then

                  strSql = "insert into tblFamiliari (ID_Parent,Cognome, LuogoNascita, Datanascita, RelazioneParentela, FiglioMinore, PostoLetto) values (" & _

                         lngParent & ",'" & myReplace(.FormFields("txtCognome" & j).result) & "','" & _

                         myReplace(.FormFields("txtLuogoNascita" & j).result) & "','" & .FormFields("txtDataNascita" & j).result & "', '" & _

                         .FormFields("txtRelazParentela" & j).result & "','" & _

                         .FormFields("txtFiglioMinore" & j).result & "','" & .FormFields("txtPostoLetto" & j).result & "')"

                  DBEngine(0)(0).Execute strSql, &H80

                  If j < 4 Then  ' condiziona l'inserimento dei turni nei hai solo 3 non 6

                    strSql = "insert into tblTurno (ID_Parent,Turno,Categoria) values (" & _

                             lngParent & ",'" & myReplace(.FormFields("txtTurno" & j).result) & "','" & _

                             myReplace(.FormFields("txtCategoria" & j).result) & "')"

                     DBEngine(0)(0).Execute strSql, &H80

                   End If

                  If j < 5 Then   ' condiziona l'inserimento degli anni precedente nei hai solo 5 non 6

                     strSql = "insert into tblAnniPrecedenti (ID_Parent,PrecedenteUtilizzo, Dal,Al) values (" & _

                               lngParent & ",'" & myReplace(.FormFields("txtPrecUtilizzo" & j).result) & "','" & _

                               myReplace(.FormFields("txtDal" & j).result) & "','" & _

                               myReplace(.FormFields("txtAl" & j).result) & "')"

                     DBEngine(0)(0).Execute strSql, &H80

                  End If

            End If

    Next

          DBEngine.CommitTrans 1

      End With

      doc.Close

  Next

  Me.txtEndtime = Now()

  'Me.Refresh   <---- perchè ?

  Me.Requery

  With Me.RecordsetClone

        .MoveLast

        Me.Bookmark = .Bookmark

  End With

   Me.Dirty = False

   'VBA.MsgBox "Importazione dati completata. " & GetTickCount() - lngStart & " millisecondi", vbInformation, "WORD IMPORT"

  'doc.Close

   Set doc = Nothing

   AppWord.Quit

   Set AppWord = Nothing

ExitHere:

       Exit Sub

errHandler:

       DBEngine.Rollback

       With Err

           MsgBox "ERR#" & .Number _

                & vbNewLine & .Description _

                , vbOKOnly Or vbCritical

       End With

       Resume ExitHere

End Sub

Microsoft 365 e Office | Access | 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

6 risposte

Ordina per: Più utili
  1. Anonimo
    2018-04-16T20:51:02+00:00

    ciao Nicola,

    [...]

    comunque penso che gestisca solo gli apostrofi e non il valore nullo ( è vero oppure no?).

    [...]

    assolutamente corretto, gestisce l'apice all'interno dei controlli, raddoppiandolo per eseguire correttamente l'action query di insert.

    Lasciala esattamente come è stata concepita, va bene così.

    Come detto non ricordo quasi nulla del DB, ma forse nel frattempo hai impostato vincoli nelle tabelle per evitare che il valore null sia accettato a cui non hai fatto seguire la modica nella routine VBA, il problema potrebbe essere generato da quel aspetto.

    Per provare il codice e capire come risolvere meglio che pubblichi una demo, così testiamo il tutto.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-04-16T14:42:12+00:00

    La funzione per gestire i valori Null e Nz quindi tutte le chiamate alla funzione myReplace dovrebbero essere sostituite nel seguente modo:

    esempio -> myReplace(.FormFields("txtCognome").result) con Nz( .FormFields("txtCognome").result ,"")

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-04-16T08:41:55+00:00

    Ciao Sandro, buongiorno.

    Quanto a questo : A rigor di logica la funzione myReplace dovrebbe consentirti la gestione del valore null, ma non la mostri, quindi l'errore potrebbe essere legato a questo o ad altro visto che anche la transazione non è robusta infatti mostri un altro errore.

    la posto:

    Public Function myReplace(ByVal strField As String) As String

     myReplace = Replace(strField, "'", "''")

    End Function

    comunque penso che gestisca solo gli apostrofi e non il valore nullo ( è vero oppure no?).

    Tieni presente che l'unico campo nel modulo di word che non è testo bensì valuta con 2 decimali è il campo txtReddito

    Ho provato ad aggiungere questa riga di codice

    Public Function myReplace(ByVal strField As String) As String

     myReplace = Replace(strField, "'", "''")

     myReplace = Replace(strField, vbNullString, "0,00")

    End Function

    per valutare il valore null nel campo (txtReddito) ma il codice va in errore nella riga di giallo come da immagine precedente.

    Comunque ho notato facendo molte prove che il codice va in errore solo se non si indica nulla in questo campo.

    Attendo un tuo intervento per conoscere come gestire questo unico problema, diversamente allego una demo di prova.

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2018-04-14T20:30:55+00:00

    Ciao Sandro,innanzitutto grazie come sempre per la tua gentilezza e cortese riscontro.  I campi dei moduli di word sono tutti obbligatori e gli errori vengono segnalati proprio in assenza di dato/dati nei vari campi. Provo a studiare qualcosa per importare in una tabella i file di word non compilati. Ci aggiorniamo e non ti preoccupare se mi segui più tardi. Buona serata e grazie ancora per tutto il supporto che ricevo da te e dagli altri amici della community. 

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2018-04-14T17:38:01+00:00

    ciao Nicola,

    onestamente non ricordo molto della routine che mostri anche se noto che ci ho messo lo zampino.

    A rigor di logica la funzione myReplace dovrebbe consentirti la gestione del valore null, ma non la mostri, quindi l'errore potrebbe essere legato a questo o ad altro visto che anche la transazione non è robusta infatti mostri un altro errore.

    La soluzione migliore è ovviamente rendere i campi nel file di word obbligatori, in modo da evitare alla fonte il problema.

    Altro modo, importare l'importabile e segnalare in una tabella a parte i files che non sono stati importati per mancata compilazione dei campi nei files di word, soluzione che ti consiglierei caldamente.

    Eviterei la comparsa di messaggi msgbox, se hai tanti files la routine si ferma ogni due per tre e non termina più.

    Bisognerebbe poi capire quali sono i campi da considerare obbligatori, nel senso...te ne basta uno solo non compilato per interrompere l'importazione oppure tra tutti i campi che devi compilare alcuni possono anche non essere compilati così da poter procedere ugualmente...?

    Prova ad abbozzare qualcosa e se non ce la fai pubblica una demo senza dati sensibili del database e di alcuni files, in modo da sperimentare e guidarti nella soluzione.

    Ciao, Sandro.

    ps. sono un po' a corto di tempo da qui alla prossima settimana, per certo leggo i post sulla community, ma non garantisco risposte celeri....

    La risposta è stata utile?

    0 commenti Nessun commento