+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Errore Update n record

  1. #1
    pierovb non è in linea Scolaretto
    Buongiorno,
    In una tabella Anagrafica avrei necessità di aggiornare l'età di tutti i record.
    ho provato con il seguente codice :
    
    Dim i As Integer
    Dim z As Integer
    
    With MSFlexGrid1
    
    
    Set rs = cn.Execute("SELECT * FROM Pazienti Order By Stato DESC, Cognome ASC")
    
     For i = 1 To .Rows -1
        
        z = Int(Abs(DateDiff("d", .TextMatrix(i, 4), Format(Now, "dd/mm/yyyy"))) / 365)
        
                  sSQL = "UPDATE Pazienti SET Eta=" & Val(z)
                  sSQL = sSQL & " WHERE Cognome='" & .TextMatrix(i, 2) & "'"
                  sSQL = sSQL & " And Nome='" & .TextMatrix(i, 3) & "'"
                 sSQL = sSQL & " And DNascita= # " & Format(.TextMatrix(i, 4), "mm/dd/yyyy") & "# Order By Stato DESC 
                 Cognome ASC"
                 
                 
     Next i
               
               
     
     End With
     MsgBox " Fatto !"
     
     
     
    CaricaFlex
    
    ma pur aggiornando l'età non esegue l' update dei record e non solleva nessun errore.
    Il problema è sicuramente nella query di aggiornamento, ma non riesco a capire il motivo.
    Ho provato in maniera molto più semplice
                 rs!Eta = z
                 rs.Update
                 rs.MoveNext
    
    ma, in questo caso solleva l'errore 3251. Il set di record corrente non sopporta l'aggiornamento.
    Vorrei capire cosa e dove sbaglio.
    Chi mi aiuta ?
    Grazie.

  2. #2
    A parte il problema di programmazione (che non ho letto), esiste un problema a monte ...

    Non ha senso avere in una tabella un campo "età" da aggiornare ripetutamente. Il solo campo da memorizzare in tabella è la "Data di nascita".

    Da questa, quando serve, si calcola l'età rispetto alla data attuale, ma solo quando serve e limitatamente al nominativo gestito.
    Per capirci, se devi stampare la scheda di un paziente, ottieni la data di nascita, calcoli l'età e la stampi.

    Ma perché queste cose?

    P.S. Che c'entra l'ORDER BY nella UPDATE?
    ℹ️ Leggi di più su AntonioG ...

  3. #3
    pierovb non è in linea Scolaretto
    Parto dalla fine.
    ORDER BY nella UPDATE è un "erroraccio" di copia incolla nella fretta di scrivere il post.

    I record della tabella sono pazienti e l'età, il sesso, la patologia..... hanno una certa importanza hai fini statistici.
    Ecco il motivo del calcolo del campo età.
    Ma a parte questo mi sembra strano il fatto che non riesca ad aggiornare una serie di record.
    Con il ciclo For calcola un' età per volta, la cosa strana, per me, e che non aggiorna il recordset.
    Tutto qui.

  4. #4
    pierovb non è in linea Scolaretto
    Questo è il codice che uso e che non effettua l' Update.
     Dim cmd  As ADODB.Command
     Dim par  As ADODB.Parameter
     Dim i As Integer, z As Integer
    
    With MSFlexGrid1
    
     For i = 1 To .Rows - 1
        
        z = Int(Abs(DateDiff("d", .TextMatrix(i, 4), Format(Now, "dd/mm/yyyy"))) / 365)
        
       sTabella = "Pazienti "
             sSQL = "UPDATE " & sTabella & " SET "
             sSQL = sSQL & " Eta = @Eta"
             sSQL = sSQL & " WHERE Cognome='" & .TextMatrix(i, 2) & "'"
             sSQL = sSQL & " And Nome='" & .TextMatrix(i, 3) & "'"
             sSQL = sSQL & " And DNascita= # " & Format(.TextMatrix(i, 4), "mm/dd/yyyy") & "#"
             
             Set cmd = New ADODB.Command
        With cmd
            .ActiveConnection = cn
            .CommandType = adCmdText
            .CommandText = sSQL
            SetADOParameter cmd, sTabella, "Eta", Val(z)
            Debug.Print z ' visualizzo tutte le età di tutti i record aggiornate all'anno 
         End With
     Next i
     End With
    

  5. #5
    L'avatar di gibra
    gibra non è in linea Very Important Person
    @PieroVB


    1° Non aggiorna e non da errore perché non c'è alcuna istruzione che lo fa!
    Riguardati bene il tuo codice: tu compili una stringa sSQL, ma dov'è che la esegui?

    2° Il test che fai sul rs ti da errore perché per default la il metodo Execute di una Connection restituisce un recordset a sola lettura.
    Quindi:
    - PRIMA devi dichiarare il TIPO dell'oggetto recordset
    - POI esegui la cn.Execute

    3° La stringa sSQL è comunque sbagliata perché non tiene conto degli eventuali apici che potrebbe contenere (ergo, prima o poi darà errore)
    TRa l'altro vedo che correttamente usi un Command ma inspiegabilemnte l'unico parametro che crei è @Eta.
    Perché mai? Non ha senso
    ℹ️ Leggi di più su gibra ...

  6. #6
    pierovb non è in linea Scolaretto
    che figura di .......

             sSQL = sSQL & " WHERE Cognome='" & dblApos(.TextMatrix(i, 2)) & "'"  ' funzione per gli apici
             Set cmd = New ADODB.Command
        With cmd
            .ActiveConnection = cn
            .CommandType = adCmdText
            .CommandText = sSQL
            cmd.Execute
            SetADOParameter cmd, sTabella, "Eta", Val(z)
           
         End With
    
    TRa l'altro vedo che correttamente usi un Command ma inspiegabilmente l'unico parametro che crei è @Eta.
    Credevo bastasse creare il solo parametro che volevo modificare.

    2° Il test che fai sul rs ti da errore perché per default la il metodo Execute di una Connection restituisce un recordset a sola lettura.
    Quindi:
    - PRIMA devi dichiarare il TIPO dell'oggetto recordset
    - POI esegui la cn.Execute
    Qui mi arrendo : come dichiaro il Tipo dell'oggetto recordset ?

  7. #7
    pierovb non è in linea Scolaretto
    Ho risolto così :

    
    Dim nr as Integer, z As Integer, i As Integer
       
    On Error GoTo Errori
    
       Set rs = New ADODB.Recordset
       sSQL = "SELECT * FROM Pazienti Order By Stato DESC, Cognome ASC"
         rs.Open sSQL, cn, adOpenKeyset, adLockOptimistic
         nr = rs.RecordCount
      
      For i = 1 To nr
      
          z = Int(Abs(DateDiff("d", Now, rs!DNascita)) / 365)
          
           rs!Eta = Val(z)
            rs.Update
           rs.MoveNext
        Next i
    
    CaricaFlex
    
    Errori:
     If Err.Number = 3021 Then Exit Sub
    
    Mi resta un grosso dubbio sicuramente dovuto a grosse lacune, ma nella routine che ho pubblicato prima
    chiedo a Gibra
    come dichiaro il Tipo dell'oggetto recordset ?

  8. #8
    Guarda che la questione campo Eta è un grande errore. Qualsiasi cosa tu faccia con quel campo PRIMA devi fare l'update completo e non serve assolutamente.
    ℹ️ Leggi di più su AntonioG ...

  9. #9
    pierovb non è in linea Scolaretto
    Il campo Eta viene aggiornato solo quando richiamo la form Statistica ( generalmente a fine anno) e come dicevo prima, ha una valenza statistica importante.
    Questo è il motivo per cui lo devo inserire nella tabella. Altrimenti farei, come sempre, tesoro del tuo consiglio e lo eliminerei immediatamente.

  10. #10
    Guarda che la valenza statistica non c'entra nulla e forse non ci siamo capiti. L'informazione dell'età l'hai già con il campo "data di nascita". E' semplicemente un duplicato di un dato che hai già e che ti fa perdere spazio e tempo. Lo puoi eliminare tranquillamente.
    ℹ️ Leggi di più su AntonioG ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Errore su query UPDATE
    Da Nottambulo nel forum ASP 3, ASP .Net
    Risposte: 6
    Ultimo Post: 05-04-2013, 04:08
  2. Errore di sintassi con UPDATE
    Da easterone nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 17-01-2013, 14:51
  3. Errore istruzione UPDATE
    Da collega nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 03-05-2010, 12:12
  4. Errore update
    Da antonio_81 nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 18-01-2007, 16:13
  5. Errore rs.update da query union
    Da felicioni2 nel forum Visual Basic 6
    Risposte: 7
    Ultimo Post: 15-03-2005, 17:16