Newsgroup: it.comp.appl.access
Titolo: errore query di inserimento quando la data è nulla

Buongiorno.
Con una query di inserimento, duplico i dati di un record e, se le date di inizio e fine sono presenti, le inserisco aumentando il mese di 1 ad entrambe.
Se le date sono presenti il codice funziona, se non ci sono il VBA mi restituisce errore di run-time '94: Utilizzo non valido di null.
Il codice è il seguente:
CurrentDb.Execute "INSERT INTO tblDocumentoDettagli ( IdDocumento, IdArticolo, IdCategoria, DataInizio, DataFine) " & _
                                    "SELECT " & Me.IdDocumento & " AS IdDocumento, " & rs!IdArticolo & " AS IdArticolo, " & rs!IdCategoria & " AS IDCategoria, " & _
                                    "" & IIf(IsNull(rs!DataInizio), "Null", CLng(DateAdd("m", 1, rs!DataInizio))) & " AS DataInizio, " & IIf(IsNull(rs!DataInizio), "Null", CLng(DateAdd("m", 2, rs!DataInizio) - 1)) & " AS DataFine "
 
Se tolgo i due campi data, la query funziona.
Se aggiungo manualmente DataInizio: Null e DataFine: Null la query funziona ugualmente, quindi l'errore è nell'ultima riga.
Cosa dovrei cambiare?
Grazie
Giuseppe


Ripropongo il quesito.
Come faccio in vba su CurrentDb.Execute "INSERT INTO ,,,,,,  a gestire l'inserimento di un valore nullo in un campo data?
Le sto provando tutte ma non ci riesco.
Grazie.


se fai due query, una con "where DataInizio is Null" e l'altra con "where DataInizio is not Null" funziona tutto?
hai provato ad usare Nz invece di iif?


Ciao Michele, grazie per la risposta.
Ho risolto così:
" & IIf(IsNull(rs!DataInizio), "NULL", "#" & Format(rs!DataInizio, "yyyy-mm-dd") & "#") & " AS DataInizio
Nel post originario, che tra l'altro si riferiva ad altra maschera, forse era sbagliato il codice nella parte vera della condizione Iif, che evidentemente andava calcolata con una variabile prima dell'esecuzione dell'INSERT ....
Giuseppe


non ho capito se davvero tu riesci a scrivere "null" (quindi una stringa) in un campo formato data...


Sinceramente Michele, non ci sto capendo niente.
Gli stessi campi, che siano date o stringhe, a volte inserisce il record a volte no.
Ho provato a inserire il record con i soli campi obbligatori e poi man mano ho ripetuto inserendo di volta in volta i campi non obbligatori.
Riprovo.
Grazie.

> non ho capito se davvero tu riesci a scrivere "null" (quindi una stringa) in un campo formato data...
 
NULL non è una strimga eventualmente sarebbe valore testo, ma in realtà inseriro all'intwrno della stringa SLQ viene risolto come valore NULL allo stesso modo in cui tu lo hai suggerito sopra... non pensi sia stringa quello vero...?
Ora se il campo data consente NULL direi che è normale venga ammesso.
 
@Alex


Ciao Giuseppe,
 
solo per chiarimento..
purtroppo VBA non ha lo "short-circuit evaluation",  quindi nella IIf(IsNull(rs!DataInizio), "Null", CLng(DateAdd("m", 1, rs!DataInizio))) 
 viene valutata anche la parte falsa che contiene la funzione "CLng(DateAdd("m", 1, rs!DataInizio))" che di fatto diventa CLng(NULL) e che scatena l'errore in VBA
 
la soluzione che hai trovato funziona perché la funzione Format(NULL, "yyyy-mm-dd") non scatena errori.
Ciao
Giorgio Rancati

 Giorgio Rancati
 
Infatti quando ho scritto "non ci sto capendo niente" è perchè l'errore me lo generava sul valore nullo di un campo testo e non sulla data che nell'inserimento dei record precedenti non dava problemi.
Per i campi testo invece ho fatto così:
Dim varProgettoCodice As Variant
varProgettoCodice = Nz(Me.txtProgettoCodice.Value, Null)
e nel codice dell'INSERT INTO ho messo:
" & IIf(IsNull(varProgettoCodice), "NULL", """" & varProgettoCodice & """") & " AS ProgettoCodice
Finora tutto bene.