Newsgroup: it.comp.appl.access
Titolo: istruzione Update con campi null e pieni

Ok,
 il subject può sembrare un pò strano ma è il meglio che mi è venuto.
PROBLEMA:
Ho una maschera di inserimento dati che permette (dovrebbe permettere) di
aggiungere dettagli ad una scheda CLIENTI.
Supponiamo di avere un cliente di cui conosco solo pochi dati, correttamente
inseriti  nella form iniziale e che voglia aggiungere il numero di fax ma
non l'e-mail.
Ho impostato una query di aggiornamento da codice così:
CurrentDb.execute " UPDATE Clienti Set .... Fax =  '" & Me.NomeControlloFax
& "', email = '" & Me.NomecControlloMail & '"' WHERE id cliente =
Me.NomeControlloIDCliente;"
ovviamente l'update riguarda  TUTTI i  campi della tabella clienti,
correttamente referenziati sulla maschera.
Il problema è questo:
se l'update riguarda TUTTI i campi che erano precedentemente vuoti,
l'operazione funziona a meraviglia, altrimenti non scrive nulla.
Preciso che i campi "vuoti" possono esserlo e che non restituisce nessun
messaggio di errore.
Devo rassegnarmi a creare una UPDATE per ogni singolo campo o faccio qualche
errore (e sai che novità...)???
Ciao
Marco

 ha scritto nel messaggio
news:x6UQa.177122$lK4.5...@twister1.libero.it...

Non è chiaro se stai aggiornando o stai inserendo un nuovo cliente.
Se stai semplicemente aggiornando controlla la struttura tabella.
Oppure l'errore è che mancano delle virgolette!
Prova così
CurrentDb.execute
    "UPDATE Clienti " & _
        "Set .... Fax =  '" & trim(Me.NomeControlloFax & " ") & "', " & _
        "set email = '" & trim(Me.NomecControlloMail & " ") & "' " & _
        "WHERE [id cliente] = " & Me.NomeControlloIDCliente & ";"

 ha scritto nel messaggio
news:rLUQa.177043$Ny5.5...@twister2.libero.it...

Sto cercando di aggiornare, ma devo prevedere la possibilità che l'utente
possa aggiornare un solo campo lasciando vuoti gli altri.
Leggendo la tua sintassi noto che metti l'istruzione SET prima di ogni
campo, io invece uso una sola SEt e separo con la virgola.
Può influire qanche questo??
Cmq provo

 ha scritto nel messaggio
news:aUUQa.177063$Ny5.5...@twister2.libero.it...

No è un errore di sintassi la set va impostata solo una volta...
Ciao

 ha scritto nel messaggio
news:o9VQa.177122$Ny5.5...@twister2.libero.it...

Ho provato ma nulla da fare.
Ho provato ad  utilizzare DoCmd.RunSql " ... al posto di CURRENTDB.EXECUTE
e il risultato è stato che mi dice che non può aggiornare per violazione
delle regole di convalida
Ora indago e ti faccio sapere

 ha scritto nel messaggio
news:x6UQa.177122$lK4.5...@twister1.libero.it...

Potresti caricarti il recordset e aggiornare solo i campi che ti servono:
Es. (acc'97)
dim rst as recordset
set rst = currentdb.openrecordset("Select * From clienti WHERE id cliente ="
&  Me.NomeControlloIDCliente)
if not rst.eof then
    rst.edit
    rst!Fax =  "'" & Me.NomeControlloFax & "'"
    rst!email = "'" & Me.NomecControlloMail & "'"
    rst.update
end if
rst.close
set rst = nothing
Ciao.
-- 
Sergio MAZZA

La tua soluzione mi sembra valid a patto di poterla fare per tutti i campi.
Mi spiego:
io non so a priori quali campi verranno aggiornati e quali no, quindi dovrei
mettere ogni campo uguale al rispettivo controllo.
Se, utilizzando il tuo esempio viene aggiornato il Fax e cancellata l'email
che succede? si blocca o no??
In altre parole se viene fuori un null, il recordset lo gestisce??
Ciao
Marco

 Marco
if not isnull(me!nomeCasellaDiTesto) then
    rst!nomeCampoDaAggiornare = me!nomeCasellaDiTesto
e via dicendo...
Altrimenti tutti i controlli sulla maschera/tabella che devono essere
testati per un eventuale aggiornamento li chiami (per esempio) "cmp1, 2 , 3
etc. etc."; poi:
For a = 1 to numeroMassimoDiControlliDaAggiornare
    if not isnull(me.controls("cmp" & a)) then
        rst("cmp" & a) = me.controls("cmp" & a)
    end if
Next
a te la scelta...
Ciao.
-- 
Sergio MAZZA