Newsgroup: it.comp.appl.access
Titolo: Problema su migrazione da progetto adp a accdb con tabelle collegate - errore di runtime '-2147217864 (80040e38)'

Buongiorno a tutti,
ho il seguente problema in un file adp ho il seguente codice su un pulsante per l'aggiornamento di dati su una maschera continua, versione access 2003 il codice funziona senza errori,lo stesso codice nel file accdb access 2016 mi da l'errore:
errore di runtime '-
2147217864
 (80040e38)'
Impossibile individuare la riga specificata per l'aggiornamento. E' possibile che alcuni valori siano stati modificati dopo l'ultima operazione di lettura.
e il dubug mi indica come punto di errore  .MoveNext
facendo qualche test ho visto che il set di dati che sul progetto adp è di 126 record, su accdb va in errore sul movenext dopo 3 cicli come se o non funziona il movefirst o proprio non prende tutti i 126 record?
Grazie per l'aiuto
 
Private Sub Comando45_Click()
Dim Nrec As Long
Dim stDocName, cert1, cert2 As String
Dim strFiltro, strFiltro1 As String
 
    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
    rst.CursorType = adOpenKeyset
    rst.LockType = adLockOptimistic
    strSQL = "SELECT * FROM Programmazione"
    rst.Open strSQL, CurrentProject.Connection
 
 b = TestoDATA
' MsgBox b
 testo1 = 0
 Testo92 = 0
 Testo2 = 0
 Testo93 = 0
 Testo3 = 0
 Testo4 = 0
 Testo5 = 0
 Testo6 = 0
 Testo7 = 0
 Testo50 = 0
 Testo94 = 0
 Testo52 = 0
 Testo54 = 0
 Testo56 = 0
 
With rst
      .MoveFirst 'primo pagamento
 
Do Until .EOF
    P = !Pausa
    'MsgBox p
 
    If P = 0 Then '1
 
     D = !Data_PARTENZA
 
     p1 = !Tempo_UT_ore
     p2 = Tempo_AppProgettoGG
     p3 = !Tempo_AppMaterialiOre
     p7 = !Tempo_UT_ore1
     p4 = !Tempo_PROD_ore
     p5 = !Tempo_SALD
     p6 = !Tempo_LUCIDATURA
     X = !Fine_UT
        If D & "" = "" Then '2
        'MsgBox "non avviata"
 
        Else '2
        'MsgBox !Data_PARTENZA
             a = !Data_PARTENZA
             f = DateDiff("d", a, b)
            ' MsgBox f
                                    If f >= 0 Then
                                        testo1 = testo1 + !Tempo_UT_ore
                                        Testo92 = Testo92 + !Tempo_UT_ore1
                                        Testo2 = Testo2 + !Persone_UT
                                        Testo93 = Testo93 + !Persone_UT1
                                        Testo3 = Testo3 + !Tempo_PROD_ore
                                        Testo4 = Testo4 + !Persone_PROD
                                        Testo5 = Testo5 + !Tempo_SALD
                                        Testo6 = Testo6 + !Personale_SALD
                                        Testo7 = Testo7 + !Tempo_LUCIDATURA
                                        Testo8 = Testo8 + !Personale_LUCIDATURA
                                    End If
           If f > 0 Then '3
 
                If !Tempo_UT_ore > !Persone_UT * 8 Then '4
 
                    !Tempo_UT_ore = !Tempo_UT_ore - !Persone_UT * 8
                Else '4
                    !Tempo_UT_ore = 0
                    !Persone_UT = 0
                End If '4
 
                      If p1 = 0 Then '5
                                 If !Tempo_AppProgettoOre > 8 Then '6
                                     !Tempo_AppProgettoGG = !Tempo_AppProgettoGG - 1
                                 Else '6
                                     !Tempo_AppProgettoGG = 0
 
                                 End If '6
                      If p2 = 0 Then '7
                                 If !Tempo_AppMaterialiOre > 8 Then '8
                                     !Tempo_AppMaterialiGG = !Tempo_AppMaterialiGG - 1
                                 Else '8
                                     !Tempo_AppMaterialiGG = 0
 
                                 End If '8
                      If p3 = 0 Then
                                If !Tempo_UT_ore1 > !Persone_UT1 * 8 Then
 
                                 !Tempo_UT_ore1 = !Tempo_UT_ore1 - !Persone_UT1 * 8
                                Else '4
                                    !Tempo_UT_ore1 = 0
                                    !Persone_UT1 = 0
                                End If '4
                      If X = True Then
                      'MsgBox X
                         If p7 = 0 Then
                                If !Tempo_PROD_ore > !Persone_PROD * 8 Then
 
                                !Tempo_PROD_ore = !Tempo_PROD_ore - !Persone_PROD * 8
                                Else
                                    !Tempo_PROD_ore = 0
                                    !Persone_PROD = 0
                                End If
                         If p4 = 0 Then
                                If !Tempo_SALD > !Personale_SALD * 8 Then
 
                                 !Tempo_SALD = !Tempo_SALD - !Personale_SALD * 8
                                 Else
                                    !Tempo_SALD = 0
                                    !Personale_SALD = 0
                                 End If
                         If p5 = 0 Then
                                If !Tempo_LUCIDATURA > !Personale_LUCIDATURA * 8 Then
 
                                 !Tempo_LUCIDATURA = !Tempo_LUCIDATURA - !Personale_LUCIDATURA * 8
                                 Else
                                    !Tempo_LUCIDATURA = 0
                                    !Personale_LUCIDATURA = 0
                                 End If
                         If p6 = 0 Then
                                 If !Tempo_FINITURA > 8 Then
                                     !Tempo_FINITURA = !Tempo_FINITURA - 8
                                 Else
                                     !Tempo_FINITURA = 0
                                    !Completata = True
                                 End If
 
                     End If
                     End If
                     End If
                     End If
                     Else
                      !Data_PARTENZA_off = b
                      'MsgBox X & "1111"
                     End If
                     End If
                     End If
                     End If
                     'testo1 = testo1 + !Tempo_UT_ore
 
 
                     Else
 
           End If '3
 
 
 
 
        End If '2
     !Numero_GG_pausa = 0
    Else
    !Numero_GG_pausa = Numero_GG_pausa + 1
    End If '1
  Testo50 = Testo50 + !Tempo_UT_ore
  Testo94 = Testo94 + !Tempo_UT_ore1
  Testo52 = Testo52 + !Tempo_PROD_ore
  Testo54 = Testo54 + !Tempo_SALD
  Testo56 = Testo56 + !Tempo_LUCIDATURA
      .MoveNext
 
  Loop
  .Close
End With
 
    Set rst = Nothing
 
Forms!Programmazione.Requery
End Sub

Nello specifico non so darti una risposta ma mi chiedo perché hai preso questa strada...?
 
Preso atto della scomparsa di ADP... hainpensato a linkare le tabelle con ODBC e gestire il tuo progetto in modo standard come normalmente si fa con Access(Client) e RDBMS(Server)...?
 
Si tratta chiaramente di migrare a DAO o ACEDAO in questo caso ma sarebbe la soluzione più funzionale.
 
@Alex


Ciao Alex grazie per la risposta, sono interessata a quanto suggerito "hainpensato a linkare le tabelle con ODBC e gestire il tuo progetto in modo standard come normalmente si fa con Access(Client) e RDBMS(Server)...?" mi riusciresti a dare qualche riferimento per capire cosa dovrei fare? 
Come scritto io ho un db in sql server 2008 r2 con interfaccia access adp, ma ho il problema che questo tipo di progetto funziona bene con access 2007 ma non è compatibile con access 2016.
Io stavo provando a trasferire l'interfaccia da access 2007 a access 2016 ma ho trovato diversi problemi. Dove posso trovare qualche informazione su RDBMS non lo conosco?
Grazie 

Non so se ti sarà utile, ma provo ad indicarti un Tutorial da leggere:
 
http://forum.masterdrive.it/access-79/msaccess-gestione-relink-table-101119/
 
 
Ciao
@Alex
 


Grazie Alex, ho provato a guardare il tutorial ma credo che forse mi sono espressa male io sto già gestendo le tabelle di SQL con ODBC e uso Access come Client. Il problema era nel codice VB che tra la situazione postata in cui il codice non da errore progetto adp e SQL, nella versione ODBC e accdb ho dovuto adattarlo così risolvendo il problema.
Sto avendo diversi problemi nell'adattare il codice tra le due situazioni ma con un po' di pazienza ci sto riuscendo. 
Private Sub Comando45_Click()
Dim n As Integer
Dim DBCorrente As DAO.Database
Dim Tabella As DAO.Recordset
 
Set DBCorrente = CurrentDb 'per aprire un collegamento sul DBCorrente
Set Tabella = DBCorrente.OpenRecordset("Select * FROM Programmazione", dbOpenDynaset)
' MsgBox b
 Testo1 = 0
 Testo92 = 0
 Testo2 = 0
 Testo93 = 0
 Testo3 = 0
 Testo4 = 0
 Testo5 = 0
 Testo6 = 0
 Testo7 = 0
 Testo50 = 0
 Testo94 = 0
 Testo52 = 0
 Testo54 = 0
 Testo56 = 0
   B = TestoDATA
Do Until Tabella.EOF
    'MsgBox Tabella.Fields("comm")
    Tabella.Edit
    P = Tabella.Fields("Pausa")
    'MsgBox p
 
    If P = 0 Then '1
 
     D = Tabella.Fields("Data_PARTENZA")
 
     p1 = Tabella.Fields("Tempo_UT_ore")
      'MsgBox p1
     p2 = Tabella.Fields("Tempo_AppProgettoGG")
     p3 = Tabella.Fields("Tempo_AppMaterialiOre")
     p7 = Tabella.Fields("Tempo_UT_ore1")
     p4 = Tabella.Fields("Tempo_PROD_ore")
     p5 = Tabella.Fields("Tempo_SALD")
     p6 = Tabella.Fields("Tempo_LUCIDATURA")
     X = Tabella.Fields("Fine_UT")
        If D & "" = "" Then '2
        'MsgBox "non avviata"
 
        Else '2
        'MsgBox Tabella.Fields("Data_PARTENZA")
             a = Tabella.Fields("Data_PARTENZA")
             f = DateDiff("d", a, B)
            ' MsgBox f
                                    If f >= 0 Then
                                        Testo1 = Testo1 + Tabella.Fields("Tempo_UT_ore")
                                        Testo92 = Testo92 + Tabella.Fields("Tempo_UT_ore1")
                                        Testo2 = Testo2 + Tabella.Fields("Persone_UT")
                                        Testo93 = Testo93 + Tabella.Fields("Persone_UT1")
                                        Testo3 = Testo3 + Tabella.Fields("Tempo_PROD_ore")
                                        Testo4 = Testo4 + Tabella.Fields("Persone_PROD")
                                        Testo5 = Testo5 + Tabella.Fields("Tempo_SALD")
                                        Testo6 = Testo6 + Tabella.Fields("Personale_SALD")
                                        Testo7 = Testo7 + Tabella.Fields("Tempo_LUCIDATURA")
                                        Testo8 = Testo8 + Tabella.Fields("Personale_LUCIDATURA")
                                    End If
           If f > 0 Then '3
 
                If Tabella.Fields("Tempo_UT_ore") > Tabella.Fields("Persone_UT") * 8 Then '4
 
                    Tabella.Fields("Tempo_UT_ore") = Tabella.Fields("Tempo_UT_ore") - Tabella.Fields("Persone_UT") * 8
                Else '4
                    Tabella.Fields("Tempo_UT_ore") = 0
                    Tabella.Fields("Persone_UT") = 0
                End If '4
 
                      If p1 = 0 Then '5
                                 If Tabella.Fields("Tempo_AppProgettoOre") > 8 Then '6
                                     Tabella.Fields("Tempo_AppProgettoGG") = Tabella.Fields("Tempo_AppProgettoGG") - 1
                                 Else '6
                                     Tabella.Fields("Tempo_AppProgettoGG") = 0
 
                                 End If '6
                      If p2 = 0 Then '7
                                 If Tabella.Fields("Tempo_AppMaterialiOre") > 8 Then '8
                                     Tabella.Fields("Tempo_AppMaterialiGG") = Tabella.Fields("Tempo_AppMaterialiGG") - 1
                                 Else '8
                                     Tabella.Fields("Tempo_AppMaterialiGG") = 0
 
                                 End If '8
                      If p3 = 0 Then
                                If Tabella.Fields("Tempo_UT_ore1") > Tabella.Fields("Persone_UT1") * 8 Then
 
                                 Tabella.Fields("Tempo_UT_ore1") = Tabella.Fields("Tempo_UT_ore1") - Tabella.Fields("Persone_UT1") * 8
                                Else '4
                                    Tabella.Fields("Tempo_UT_ore1") = 0
                                    Tabella.Fields("Persone_UT1") = 0
                                End If '4
                      If X = True Then
                      'MsgBox X
                         If p7 = 0 Then
                                If Tabella.Fields("Tempo_PROD_ore") > Tabella.Fields("Persone_PROD") * 8 Then
 
                                Tabella.Fields("Tempo_PROD_ore") = Tabella.Fields("Tempo_PROD_ore") - Tabella.Fields("Persone_PROD") * 8
                                Else
                                    Tabella.Fields("Tempo_PROD_ore") = 0
                                    Tabella.Fields("Persone_PROD") = 0
                                End If
                         If p4 = 0 Then
                                If Tabella.Fields("Tempo_SALD") > Tabella.Fields("Personale_SALD") * 8 Then
 
                                 Tabella.Fields("Tempo_SALD") = Tabella.Fields("Tempo_SALD") - Tabella.Fields("Personale_SALD") * 8
                                 Else
                                    Tabella.Fields("Tempo_SALD") = 0
                                    Tabella.Fields("Personale_SALD") = 0
                                 End If
                         If p5 = 0 Then
                                If Tabella.Fields("Tempo_LUCIDATURA") > Tabella.Fields("Personale_LUCIDATURA") * 8 Then
 
                                 Tabella.Fields("Tempo_LUCIDATURA") = Tabella.Fields("Tempo_LUCIDATURA") - Tabella.Fields("Personale_LUCIDATURA") * 8
                                 Else
                                    Tabella.Fields("Tempo_LUCIDATURA") = 0
                                    Tabella.Fields("Personale_LUCIDATURA") = 0
                                 End If
                         If p6 = 0 Then
                                 If Tabella.Fields("Tempo_FINITURA") > 8 Then
                                     Tabella.Fields("Tempo_FINITURA") = Tabella.Fields("Tempo_FINITURA") - 8
                                 Else
                                     Tabella.Fields("Tempo_FINITURA") = 0
                                    Tabella.Fields("Completata") = True
                                 End If
 
                     End If
                     End If
                     End If
                     End If
                     Else
                      Tabella.Fields("Data_PARTENZA_off") = B
                      'MsgBox X & "1111"
                     End If
                     End If
                     End If
                     End If
                     'testo1 = testo1 + Tabella.Fields("Tempo_UT_ore
 
 
                     Else
 
           End If '3
 
 
 
 
        End If '2
     Tabella.Fields("Numero_GG_pausa") = 0
    Else
    Tabella.Fields("Numero_GG_pausa") = Tabella.Fields("Numero_GG_pausa") + 1
    End If '1
  Testo50 = Testo50 + Tabella.Fields("Tempo_UT_ore")
  Testo94 = Testo94 + Tabella.Fields("Tempo_UT_ore1")
  Testo52 = Testo52 + Tabella.Fields("Tempo_PROD_ore")
  Testo54 = Testo54 + Tabella.Fields("Tempo_SALD")
  Testo56 = Testo56 + Tabella.Fields("Tempo_LUCIDATURA")
 
n = n + 1
    'vai al dato successivo
    Tabella.MoveNext
Loop
 
'Chiusura Tabella
Tabella.Close
'Chiusura DB
DBCorrente.Close
MsgBox "Numero di record aggiornati: " & n
Forms!Programmazione.Requery
End Sub