Newsgroup: it.comp.appl.access
Titolo: INSERT TO: quale sintassi corretta?

Insomma, non riesco a capire quale sia la sintassi corretta di questa
istruzione SQL.
La guida in linea è un bordello, ed io non faccio altro che ottenere
errori su errori, soprattutto con i riferimenti al valore degli oggetti
in una maschera.
Ad.es. se in una form ho una casella combinata che si chiama
ccTipoTelefono, la cui colonna 2 ha il valore che a me interessa
inserire, è giusto che io scriva, in una parte dell'istruzione INSERT
TO:
Me.ccTipoTelefono.Column(1)
giusto?
Invece no, ottengo un errore.
Ad.es. questa istruzione:
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono,
Telefono) VALUES (Me!idCliente, frm![ccTipoTelefono].Column(1),
frm![nuovoTelefono].Text);"
non funziona. L'errore di runtime è il numero 3085, ovvero 0Funzione
'frm!ccTipoTelefono.Column' non definita nel'espressione.
Sto impazzendo :(

[CUT]
Ad.es. se in una form ho una casella combinata che si chiama
ccTipoTelefono, la cui colonna 2 ha il valore che a me interessa
inserire, è giusto che io scriva, in una parte dell'istruzione INSERT
TO:
Me.ccTipoTelefono.Column(1)
giusto?
Invece no, ottengo un errore.
Ad.es. questa istruzione:
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono,
Telefono) VALUES (Me!idCliente, frm![ccTipoTelefono].Column(1),
frm![nuovoTelefono].Text);"
non funziona. L'errore di runtime è il numero 3085, ovvero 0Funzione
'frm!ccTipoTelefono.Column' non definita nel'espressione.
Sto impazzendo :(
#######################
nel caso di solo access dovresti scrivere:
INSERT INTO tblTelefono (idCliente, idTipoTelefono,Telefono)
SELECT (Me!idCliente AS IdCliente, frm![ccTipoTelefono].Column(1) AS 
IdTipoTelefono,
frm![nuovoTelefono].Text AS Telefono)
nel caso di query PASS-THROUGH  è giusto come hai scritto tu.
ciao
Riccardo


Giulio,
1) la insert, ovviamente, la stai usando in una funzione e/o hai 
ridefinito   set frm = me
2) la sintassi e' errata stai mischiando valori fissi con variabili
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono,
 > Telefono) VALUES (" & Me!idCliente & ",'" & 
frm![ccTipoTelefono].Column(1) & "','" & frm![nuovoTelefono].Text & "');"
parto dal presupposto che il primo attributo sia numerico e gli altri 
"dui" alfanumerici  (perche' usi il *text* in nuovotelefono?)
--
a.cara

Ciao.
Per AleC: uso il *text* in nuovoTelefono perchè voglio prendere il
valore della casella di testo nella quale inserisco il nuovo numero.
Per Riccardo: ho provato, mi da ancora errore di sintassi. ANCORA!!!
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente,
idTipoTelefono,Telefono)SELECT (Me!idCliente AS IdCliente,
frm![ccTipoTelefono].Column(1) AS IdTipoTelefono,
frm![nuovoTelefono].Text AS Telefono)"
anche con il punto e virgola finale:
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente,
idTipoTelefono,Telefono)SELECT (Me!idCliente AS IdCliente,
frm![ccTipoTelefono].Column(1) AS IdTipoTelefono,
frm![nuovoTelefono].Text AS Telefono);"
NON NE POSSO PIU' :(
Per favore, qualcuno mi spieghi come costruire esattamente una INSERT
TO, io sto piangendo :(


Giulio ma le leggi completamente le cose?
Al di la del *text* mi sembra che il mio post diceva che stavi 
sbagliando sintassi. Ti ho rimesso insert corretta.
L'hai guardata? sembra uguale ma e' *profondamente* diversa
--
a.cara

 a.cara
Ciao Ale, scusa ma non avevo capito. Google non è che mostri il testo in
modo molto comprensibile....
Il problema è che non riesco a capire....INSERT TO deve adattarsi alle
situazioni?
Ecco la tua INSERT:
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono, 
 > Telefono) VALUES (" & Me!idCliente & ",'" & 
frm![ccTipoTelefono].Column(1) & "','" & frm![nuovoTelefono].Text & "');" 
perchè prim a del campo Telefono metti un '>' ?
Poi non capisco perchè c'è questa differenza tra valori fissi e valori
variabili. Sono tutti e due variabili, cioè: io da una casella combinata
seleziono UNA delle QUATTRO voci presenti, e sarà il campo idTipoTelefono,
poi nella casella di testo inserisco il nuovo numero e sarà il campo
Telefono, poi in IDCliente ci andrà l'IDCliente corrente.
Scusami ma non riesco a capire proprio il punto :(
P.S. Ecco il codice completoi:
Private Sub cmdAggiungi_Click()
Dim frm As Form
Set frm = Forms!frmAggiungiTelefono
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente,
idTipoTelefono,Telefono)SELECT (Me!idCliente AS IdCliente,
frm![ccTipoTelefono].Column(1) AS IdTipoTelefono, frm![nuovoTelefono].Text
AS Telefono);"
End Sub
Se vuoi ti mando il database di esempio :)
P.S Cinzia ma la tua email quale è?
P.S.2 - Google fa postare nemmeno 15-20 messaggi al giorno. Che servizio
del ca***!!!!!!!!!
-- 
Non avere mai pura dei momenti bui perchè, facci caso, anche le stelle
hanno bisogno della notte per brillare.
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 del ca***!!!!!!!!!
e' gratis! cosa cavolo vuoi di piu'  (faccetta)
--
a.cara

Ma tutto questo non è riportato nell'help in linea :(
Cmq ho quasi capito: una cosa sola....perchè devo usare ilo
delimitatore ' per valori alfanumerici?
Grazie sei stato gentilissimo :)

 Grazie sei stato gentilissimo :)
Ancora per poco ;<)
--
a.cara

E la telenovela sembra non avere fine.
La stringa SQL:
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono,
Telefono) VALUES (" & Me!idCliente & ", '" &
frm![ccTipoTelefono].Column(1) & "','" & frm![nuovoTelefono].Value &
"');"
non aggiorna alcun dato, e l'ho controllato andando a vedere nella
tabella tblTelefono che è la tabella legata sia a
tblClienti che a tblTipoTelefono. Credo che il problema risieda nel
tipo di dato di idTipoTelefono.
Ora vi dico perchè.
Ecco la struttura delle tabelle:
tblClienti:
idCliente - contatore, PK
Nome - testo
Cognome - testo
tblTelefono:
idTelefono - contatore, PK
idCliente - numerico, EK
idTipoTelefono - numerico, EK, RICERCA: tblTipoTelefono
Telefono - testo
tblTipoTelefono:
idTipoTelefono - contatore, PK
Tipologia - testo
Le relazioni sono le segg.:
tblClienti.idCliente --- uno a molti --->tblTelefono.idCliente
tblTipoTelefono.idTipoTelefono --- uno a molti
--->tblTelefono.idTipoTelefono
tutte con integrità referenziale e aggiunta/elimina a catena.
Le due maschere sono:
frmUtenti - origine dati tblClienti - che contiene
casella di testo per tblClienti.idCliente
casella di testo per tblClienti.Nome
casella di testo per tblClienti.Cognome
casella combinata ccTelefono con origine riga la seg. stringa SQL:
SELECT [Tipologia], [Telefono] FROM tblTelefono INNER JOIN
tblTipoTelefono ON
tblTelefono.idTipoTelefono=tblTipoTelefono.idTipoTelefono WHERE
idCliente=forms!frmUtenti!idCliente ORDER BY tblTipoTelefono.Tipologia;
frmAggiungiTelefono - origine dati tblClienti - che contiene
casella di testo per tblClienti.idCliente
casella di testo per tblClienti.Nome
casella di testo per tblClienti.Cognome
casella combinata ccTipoTelefono che ha come origine riga
tblTipoTelefono
casella di testo NON associata per l'inserimento del nuovo numero
command_button cmdAggiungi con il seguente codice:
Private Sub cmdAggiungi_Click()
Dim frm As Form
Set frm = Forms!frmAggiungiTelefono
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono,
Telefono) VALUES (" & Me!idCliente & ", '" &
frm![ccTipoTelefono].Column(1) & "','" & frm![nuovoTelefono].Value &
"');"
Forms!frmUtenti!ccTelefono.Requery
End Sub
Quando clicco due volte sul controllo frmUtenti.ccTelefono eseguo il
seguente codice:
Private Sub ccTelefono_DblClick(Cancel As Integer)
DoCmd.OpenForm "frmAggiungiTelefono", , , "IDCliente = " & Me!idCliente
End Sub
quindi mi ritrovo in frmAggiungiUtente con l'utente filtrato.
Io, tramite la casella combinata ccTipoTelefono, seleziono una delle
quattro voci presenti:
1. FISSO - Privato
2. FISSO - Ufficio
3. MOBILE - Privato
4. MOBILE - Ufficio
perchè questa casella combinata ha come origine riga tblTipoTelefono,
colonna associata 1, proprio quella
che contiene le voci elencate.
La stringa SQL che il metodo Execute processa:
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono,
Telefono) VALUES (" & Me!idCliente & ", '" &
frm![ccTipoTelefono].Column(1) & "','" & frm![nuovoTelefono].Value &
"');"
è ovviamente corretta (grazie AleC!), ma ha un problema:
tenta di mettere il valore di frm![ccTipoTelefono].Column(1) - che è
testo - nel campo
tblTelefono.idTipoTelefono che è numerico.
Infatti ho visto che dopo l'esecuzione della query INSERT INTO in
oggetto, nella tabella tblTelefono
vengono aggiornati tutti i campi ad eccezione di idTipoTelefono.
Infatti quando da frmUtente cerco di vedere i numeri di telefono per i
vari utenti, la casella combinata
ccTelefono, che ha come origine riga:
SELECT [Tipologia], [Telefono] FROM tblTelefono INNER JOIN
tblTipoTelefono ON
tblTelefono.idTipoTelefono=tblTipoTelefono.idTipoTelefono WHERE
idCliente=forms!frmUtenti!idCliente ORDER BY tblTipoTelefono.Tipologia;
non mostra alcun record perchè la condizione
tblTelefono.idTipoTelefono=tblTipoTelefono.idTipoTelefono
non risulta vera; tblTelefono.idTipoTelefono infatti è VUOTO, mentre
tblTipoTelefono.idTipoTelefono mostra un
contatore che va da 1 a 4.
Ricordo, infatti, che
tblTelefono.idTipoTelefono è un NUMERICO
tblTipoTelefono.idTipoTelefono è un CONTATORE
ccTipoTelefono.Column(1) passa una STRINGA
Non riesco a risolvere questa incongruenza.
A chiunque volesse posso mandargli questo database di esempio per
posta.
Per me è assolutamente necessario riolvere questa INSERT INTO perchè
poi dovrò adattarla al mio database
di lavoro.
Graaaaaaaaaaaaaaaaaaaaaaaaaaazieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee!!!!!!

 
Se il tipo telefono e' numerico devi togliere gli apici di delimitazione.
i.e.
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono, 
Telefono) VALUES (" & Me!idCliente & "," &
frm![ccTipoTelefono].Column(1) & ",'" & frm![nuovoTelefono].Value &
"');"
e non ti va in errore?
sai cos'e' il debugger? lo usi?
--
a.cara

Il debugger...si ovvio che so cos'è :P sto imparando ad usarlo,
controllando il flusso di esecuzione con i punti di interruzione,
controllando le variabili con la finestrella, usando la finestra
immediata...cmq quello era il messaggio che mi appariva.
Cmq il tipoTelefono è una stringa.... nel senso che inserisco i segg.
valori:
Privato - Mobile
Privato - Fisso
Ufficio - Mobile
Ufficio - Fisso
Posso mandarti l'esempio via email?
Ci tengo :) è molto importante.
Inoltre....dove posso trovare una chiara spiegazione di come si deve
costruire correttamente una stringa SQL?
Grazie :)


Giulio,
il tipo telefono o hai scritto una cosa errata o non e' una stringa
Riporto quello che hai messo nel precedente post:
idTelefono - contatore, PK
idCliente - numerico, EK
idTipoTelefono - numerico, EK, RICERCA: tblTipoTelefono
Telefono - testo
qui dice che idTipoTelefono e' *numerico* come sono solito dire "non 
confondere la mappa con il territorio".
Che venga *reso* come descrittivo attraverso "RICERCA" sulla tabella 
tbltipotelefono non significa nulla. Tra l'altro sulla tabella 
tbltipotelefono, ovviamente lo hai come tipo contatore (cioe' 
numerico-lungo).
E cmq, abbi la compiacenza di seguire quello che ti si dice.
Se facessi parte di una delle classi che ogni tanto tengo ti avrei 
cacciato via in malo modo.
e se usi il debugger la cosa da fare e':
1) metti un breakpoint dopo la formazione della stringa di insert
2) visualizzala nella finestra variabili immediate (?nomevariabile)
3) copia la stringa e eseguila sotto la finestra query (sql) e vedi che 
succede.
--
a.cara
--
a.cara

 costruire correttamente una stringa SQL?
nell'Help
INSERT INTO destinazione [(campo1[, campo2[, ...]])] [IN databaseesterno]
SELECT [origine.]campo1[, campo2[, ...]
FROM espressionetabella
Query di accodamento a record singolo:
INSERT INTO destinazione [(campo1[, campo2[, ...]])]
VALUES (valore1[, valore2[, ...])
L'istruzione INSERT INTO č composta dalle parti seguenti:
Parte Descrizione
----
destinazione: Nome della tabella o della query a cui accodare i record.
-----
campo1, campo2: Nomi dei campi a cui accodare i dati, se segue un 
argomento destinazione, oppure i nomi dei campi da cui ottenere i dati, 
se segue un argomento origine.
-----
databaseesterno: Percorso di un database esterno. Per una descrizione 
del percorso, vedere la proposizione IN.
-----
origine: Nome della tabella o della query da cui copiare i record.
---
espressionetabella: Nome della tabella o delle tabelle da cui vengono 
inseriti i dati. Questo argomento puň essere il nome di una singola 
tabella, il nome di una query salvata o il risultato derivante dalle 
operazioni INNER JOIN, LEFT JOIN o RIGHT JOIN.
--------------
valore1, valore2: Valori da inserire nei campi specifici del nuovo 
record. Ogni valore viene inserito nel campo che corrisponde alla 
posizione del valore nell'elenco: valore1 viene inserito nel campo1 del 
nuovo record, valore2 nel campo2 e cosě via. Č necessario separare i 
valori con una virgola e includere i campi di testo tra virgolette 
singole (' ').
--------
Questa non e' dall'Help ma potrebbe starci tranquillamente
e' sufficiente leggere *attentamente* e sapere che i valori fra 
[parentesi quadre] non sono obbligatori

si ma l'ho letto decine di volte...e non mi spiega quando come e dove
mettere punti, punti e virgola, virgolette parentesi.... :(
Cmq perchè mi avresti cacciato? faccio le tre di notte per riuscire a
spulciare del codice funzionante. E il giorno non gioco.
Va beh.... a presto! :(

Giulio,
il tipo telefono o hai scritto una cosa errata o non e' una stringa
Riporto quello che hai messo nel precedente post:
idTelefono - contatore, PK
idCliente - numerico, EK
idTipoTelefono - numerico, EK, RICERCA: tblTipoTelefono
Telefono - testo
qui dice che idTipoTelefono e' *numerico* come sono solito dire "non
confondere la mappa con il territorio".
Che venga *reso* come descrittivo attraverso "RICERCA" sulla tabella
tbltipotelefono non significa nulla. Tra l'altro sulla tabella
tbltipotelefono, ovviamente lo hai come tipo contatore (cioe'
numerico-lungo).
Ho forse capito. Leggo dall'help in linea:
La colonna visibile all'estrema sinistra di una casella combinata,
cioè la colonna all'estrema sinistra la cui impostazione nella casella
combinata della proprietà ColumnWidths non sia 0, contiene i dati che,
nella visualizzazione Maschera o in un report, vengono visualizzati
nella parte casella di testo di una casella combinata. La proprietà
BoundColumn determina quale valore della colonna di una casella di
testo o di un elenco della casella combinata viene memorizzato quando
si effettua una selezione. Ciò consente di visualizzare dati diversi
rispetto a quelli memorizzati come valore del controllo.
Nota  Se la colonna associata non contiene gli stessi valori di quella
visibile all'estrema sinistra del controllo, o se imposta la proprietà
BoundColumn a 0, la proprietà LimitToList viene impostata a True
quindi non importa che io veda la stringa Tipologia, SECONDO campo di
tblTipoTelefono, il valore restituito sarà quello contenuto nel campo
Tipologia?
Sai che però ho le idee confuse.... ma se ti mando il coso via
email....
Ti prego :(


Non metto in alcun dubbio la tua grande volonta'. Anzi e' una cosa che 
apprezzo moltissimo. Come ho apprezzato quasi tutto del "mio futuro fra 
le dita". Quello che volevo suggerirti e' che se vuoi abbreviare i tempi 
di acquisizione e soluzione dei tuoi problemi tecnici dovresti seguire 
piu' puntualmente i consigli che ricevi e *dopo*, se non funzionano, 
fare le tue giuste rimostranze.
Altra cosa. Quando hai un problema cerca di descrivere quello che vuoi 
ottenere e gli oggetti del tuo ambiente. E' inutile e fuorviante che ti 
  dilunghi su quello che pensi tu rispetto allo stesso.
--
a.cara

 Ti prego :(
niente email. Anche se per scrivermi e' sufficiente spuntarmi ;<)
--
a.cara

Okkei :) niente email.
Ho però provato a usare la tua sintassi. Ecco un altro problema:
Quando eseguo questo codice:
Private Sub cmdAggiungi_Click()
Dim frm As Form
Set frm = Forms!frmAggiungiTelefono
CurrentDb.Execute "INSERT INTO tblTelefono (idCliente, idTipoTelefono,
Telefono) VALUES (" & Me!idCliente & "," &
frm![ccTipoTelefono].Column(1) & ",'" & frm![nuovoTelefono].Value &
"');"
Forms!frmUtenti!ccTelefono.Requery
End Sub
mi dice:
Errore di runtime 3061 - Parametri insufficienti. Previsto 2
Adesso cosa manca?
Inoltre se lascio i campi vuoti mi da errore di sintassi (vabbè,
comprensibile alla
fine).
Spero tu possa aiutarmi ancora.
Grazie :)

 Grazie :)
uffi. Mandami sto benedetto db che senno' facciamo notte e invece devo 
fare la spesa!
Mandami solo la parte interessata e se mandi direttamente l'mdb 
cambiagli l'estensione in txt.
--
a.cara

Non vedo il mio reply.
Cmq che indirizzo hai? Con google non riesco a vederlo.
Grazie tantissimeeee :)

Ciao Ale, purtroppo Google tronca gli indirizzi di posta anche se non
capisco il mio come faccia ad essere visibile a tutti.
Me lo potresti scrivere qui sotto per favore?
Grazie :)


la email e' alex il dominio e' 
blunet.it
--
a.cara

Okkei ti mando il mio database completo così come è ora, nel caso ti
andasse di ampliarlo e metterlo online.
Lo mando ad alex CHIOCCIOLA blunet PUNTO it   , va bene?
A presto!