Sono un po' confuso, ma provo a rispondere.
La sintassi sarà sbagliata, ma seguendo il codice col debugger tutto fila liscio fino all'Update (poi sarà un caso, ma il primo record va bene, è sul secondo che si impianta).
L'app è in vba access, ma le tabelle sono linked a quelle effettive nel database sotto SQLexpress, quindi nel RDBMS dovremmo esserci.
Il campo Testo è un varchar, la data è parte della stringa (come del resto il codice GP che uso per estrarre solo i record che mi serve modificare); io la estraggo, la modifico e la sostituisco, come stringa. Dubito che il formato ISO qui c'entri molto: lavoro su una stringa di caratteri, non su una "data". La conversione a data gg/mm/aaaa viene fatta dopo, al di fuori di questa proc.
Vorrei anche aggiungere che la seguente variante del codice, usando ADODB connection e ADODB recordset, funziona senza problemi (non occore neanche il .Edit prima della sostituzione). Evidentemente DAO recordset ha qualche requisito in più che mi sfugge. NB: la tabella in SQLEXPRESS si chiama Eventi, quella linked in access HPEventi
Sub modifyExpDate()
'Questa procedura modifica la data di scadenza del Green Pass nein record della tabella Eventi di Hyperpower i record dalla tabella Eventi di HyperPower
'I dati trasferiti sono limitati ai record
'contenenti il codice GP e sono ordinati per numero evento
Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Dim DataOld As String, DataNew As String, anno As String, mese As String, giorno As String
Set rs = New ADODB.Recordset
Server_Name = "DESKTOP-FMBJ0FJ\SQLEXPRESS" ' Enter your server name here
Database_Name = "RicevuteCPNCompletoBackup" ' Enter your database name here ATTENZIONE!!!
User_ID = "sa" ' enter your user ID here
Password = "xxxxx" ' Enter your password here
SQLStr = "SELECT * FROM [Eventi] WHERE Testo LIKE '%GP%' ORDER BY IDEvento"
'
Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server Native Client 11.0};Server=" & Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"
rs.Open SQLStr, Cn, adOpenDynamic, adLockOptimistic
'For each record in recordset we must isolate the date, format yyyymmdd, and add
' three months to it, then we write the record back
' Set rs = CurrentDb.OpenRecordset(SQLStr, dbOpenDynaset, dbSeeChanges)
With rs
.MoveFirst
Do While Not .EOF
' extract date
DataOld = Mid(!testo, 10, 8)
anno = Left(DataOld, 4)
mese = Mid(DataOld, 5, 2)
giorno = Right(DataOld, 2)
' incremento mese
mese = mese + 3
' se mese > 12, incremento anno e prendo mese modulo 12
If mese > 12 Then
mese = mese Mod 12
anno = anno + 1
End If
' in ogni caso, formattiamo per leading zeroes
mese = Format(mese, "00")
giorno = Format(giorno, "00")
' ricostruiamo la data
DataNew = anno & mese & giorno
' sostituiamo nel record
!testo = Replace(!testo, DataOld, DataNew)
.Update
.MoveNext
Loop
End With
' Tidy up
rs.Close
Set rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub