PDA

Visualizza versione completa : Stringa sql e VB?!


Fast-M
20-10-2004, 04.29.51
Salve a tutti!
Sono riuscito ad aggiungere un record in una tabella tramite codice vb, inviando un semplice insert into tramite una stringa sql nel metodo Execute dell'oggetto Database ed ha funzionato.
Il record è stato aggiunto.
Ora ho due problemi:
1- Capire come utilizzare le funzioni sql tipo Max() e simili, perchè ho provato ad usarle nella stringa stessa e in esecuzione mi ha dato il messaggio "impossibile utilizzare funzioni di aggregazione".
2- Come fare interagire una variabile definita in vb con l'output o l'input di una query sql passata tramite stringa?
Esempio: devo eseguire la query "INSERT INTO TABELLA1(CAMPO1,CAMPO2) VALUES(MAX(CAMPO1),testoImmessoDaComboBox)"
Dove testoImmessoDaComboBox è il testo immesso in una combobox inserita in una maschera di Access.
Aiuto!
:confused:

gkcuvb
20-10-2004, 15.15.09
Per capire se la sintassi della query è corretta basta che tu la applichi direttamente al database, per esempio se il db è un db access puoi provare ad eseguire la stessa query nella sezione delle query. Se ti da errore anche qui significa che la sintassi è sbagliata, altrimenti il problema è sul tipo di collegamento che fai con il database.
Per la seconda domanda , basta che tu faccia una composizione di stringhe ossia
"INSERT INTO TABELLA (CAMPO1,CAMPO2) VALUES ('PIPPO',"' & MiaTextBox.text & "')"
Chiaro?!!?!?
Ciao

Fast-M
20-10-2004, 16.00.27
Ok grazie!
Non sapevo della composizione di stringhe e del fatto che in qualsiasi punto di una stringa la si può chiudere ed inserire il codice vb tramite la &.
Per la prima domanda invece non intendevo quello che hai scritto, ma appunto chiedevo come fare per potere usare le funzioni di aggregazione di oracle sql tipo Max(),Avg(), Min() ecc.
Perchè nella stringa non mi permette di inserirle, ma a questo punto tramite la composizione di stringhe con codice vb credo di potere agirare il problama.
Grazie!
:)

gkcuvb
20-10-2004, 17.44.34
mmhhh, prova comunque dipende molto anche da come ti sei collegato al database....se hai ancora problemi riposta....

LoryOne
20-10-2004, 17.53.02
Try This: ;)
INSERT INTO TABELLA1 ( CAMPO1, CAMPO2 )
SELECT MAX(CAMPO1), testoImmessoDaComboBox
FROM TABELLA1;

Fast-M
22-10-2004, 16.17.05
Allora, ho seguito le vostre indicazioni e ho associato un pezzo di codce che dovrebbe eseguire una query di accodamento all'evento di pressione del tasto enter sulla combo box 1 che ho nella maschera Form1:

Private Sub Combo1_Enter()
Dim db As Database, rs As Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("INSERT INTO Clienti( Id_Cliente, Nome ) values (" & Combo1.Text & "," & Combo2.Text & ")")
End Sub

Mi da errore.
Aiuto!
Perchè non riesco a inserire un maledetto record in una tabella?
Io seguo la sintassi sql concatenando la stringa con il codice vb(con " apro/chiudo la stringa sql e con & apro/chiudo il codice vb o sbaglio??):

"insert into tabella1(campo1) values(" & combo1.text & ")")

ma niente, gli errori si susseguono!
Mi avevano detto che vb fosse semplice, ma invece...

LoryOne
22-10-2004, 17.44.01
Non esistono linguaggi semplici o difficili, bensì concetti semplici o difficili.

Il metodo Execute viene utilizzato per query di azione, mentre i recordset per query di selezione.
Non è una selezione cio che intendi fare con INSERT INTO, quindi non devi usare i recordset, bensì il metodo Execute dell'oggetto Database

LoryOne
22-10-2004, 17.52.20
Ora prima di procedere trova le risposte a queste domande:

1) Cos'è un recordset ?
2) Come faccio a crearlo ?

Quando avrai capito il oncetto ti sarà chiaro l'errore

LoryOne
22-10-2004, 18.02.07
...poi quando ti sarà chiaro l'errore dovrà esserti chiara la sintassi.

Cacchio ragazzi, procedete per gradi...cribbio !

LoryOne
22-10-2004, 18.10.31
Ora non vorrei passare per rompiballe ma prova a risolvere questo:
Tu hai due stringhe:

a$="FAST-M "
e
b$="vuole imparare a concatenare due stringhe"

- Alla pressione di un pulsante, fai comparire:

1) FAST-M vuole imparare a concatenare due stringhe
2) FAST-M vuole imparare 'a' concatenare due stringhe
3) FAST-M vuole imparare a "concatenare due stringhe"

Ps: Nel 3° esercizio DEVONO comparire i doppi apici.
Ps: sebbene possa sembrare stupido è di grande aiuto, credimi ;)

Fast-M
23-10-2004, 06.16.51
Va beh nel primo caso congiungo semplicemente a e b con &, cioè a & b, negli altri due dovrei conoscere i comandi per le stringhe di vb di cui non sono pratico, perchè bisogna eseguire una ricerca del carattere "a" o della stringa "concatenare due stringhe".
Comunque se puoi dirmi dove sbaglio mi fai guadagnare parecchio tempo e per questo progetto ne ho davvero poco.
Da quello che ho capito con i doppi apici si apre la stringa sql, quindi per induzione i doppi apici la chiudono se vengono riutilizzati. Quindi se inizio una stringa sql come argomento del metodo Execute, ogni volta che voglio mandare argomenti o caratteri che non riguardano sql, ma vb devo rimettere i doppi apici seguiti dal simbolo & che a sua volta apre/chiude il codice vb.(forse è quì che sbaglio e "&" serve solo a concatenare due stringhe??)
Grazie.
:)

LoryOne
23-10-2004, 11.54.00
Il discorso che fai è corretto.
Passare una stringa ad un messagebox o passare una stringa al metodo execute dell'oggetto Database sono concettualmente uguali, cambia solo il risultato.

Vi sono generalmente 3 tipi di query:
1) Selezione
2) Aggiornamento/Cancellazione
3) Accodamento

e due categorie:

a) Query di azione
b) Query di definizione

Ricorda che generalmente per i tipi 2 e 3 si adotta il metodo Execute, mentre per il tipo 1 si agisce con i recordset.
Qualora non venisse rispettata la sintassi si genererebbe un errore.

Ti consiglio di creare una querydef rispettando la sua tipologia in ACCESS e lanciarla manualmente.
Se l'operazione avrà esito positivo, sapari qual'è la sintassi da rispettare durante la creazione della stringa SQL in VBA.
Ovviamente dovrai impostare dei dati fittizi che nell'esecuzione del codice VBA verranno poi sostituiti da quelli immessi nella maschera.

Fast-M
23-10-2004, 15.33.59
Daccordo, ma io vorrei capire solo una cosa che riguarda l'invio di stringhe sql in vb.
Se voglio inviare una stringa sql in vb apro i doppi apici ", inizio la stringa come se stessi scrivendo in sql per access e se voglio poi inviare il valore della proprietà text di una text box devo chiudere i doppi apici e mettere la e commerciale per concatenere alla stringa sql il codice vb, oppure basta che metto i doppi apici per chiudere la stringa vb e in automatico sto scrivendo vb?
Inoltre, per mandare il valore di una proprietà di un controllo all'interno di una stringa, devo usare dei segni particolari?
Tipo 'Text1.text' oppure [Text1].[Text] oppure (Text1.text) ecc.
Faccio un esempio pratico:

Private Sub Text1_Enter()
Dim db as Database
Set db=CurrentDb()
db.Execute("Insert into Tabella1(campo2) Values(" & Text1.text & ")")
End Sub

Il primo campo di Tabella1 è un contatore autoincrementante.
O sbaglio qualcosa?
:(

LoryOne
23-10-2004, 17.45.04
Per concatenare una stringa in VBA puoi utilizzare indifferentemente sia '&' sia '+'.
L'utilizzo di '&' fa in modo di saltare il passaggio di controllo della tipologia dei due elementi che devono essere concatenati.

Se tu avessi le due stringhe 'a' e 'b' e volessi concatenarle tra loro, potresti utilizzare questa forma a + b, oppure questa a & b con la sola differenza che nel secondo caso "aiuteresti" l'interprete a considerare le variabili 'a' e 'b' come parti della stringa concatenata restituita.
Questo vale anche per il compilatore, non solo per l'interprete.

Supponendo di avere definito due variabili 'a' e 'b' più una terza 'c' come risultato del concatenamento delle prime due in questo modo:
Dim a As String,b As String,c As String

a="Lory"
b="One"

ed aver assegnato ad 'a' questo valore "Lory" ed a 'b' quest'altro "One", affinchè il valore di 'c' risulti essere "LoryOne", l'operazione da compiere si tradurrebbe in questa semplice riga:

c = a & b (oppure c = a + b)

La stessa cosa si sarebbe potuta ottenere senza la dichiarazione preventiva delle variabili (Dim x As y), ossia:

a$="Lory"
b$="One"
c$=a$ & b$ (oppure c$=a$+b$)

L'utilizzo di '$', infatti , impone l'assegnazione della tipologia stringa alla variabile che lo precede, cosi' come '%' per gli interi, '&' per i long e via di seguito.
Senza procedere oltre sul perchè sia necessario definire la tipologia del risultato di un'operazione compiuta su più elementi eterogenei o non (obbligatoria in altri linguaggi, facoltativa in VB), vediamo come far interagire più variabili stringa con valori ricavati da proprietà testauli di oggetti quali una textbox inseriti in una form o maschera.

Riprendiamo le nostre tre variabili a,b e c.
Dim a As String,b As String,c As String

Assegnamo ad 'a' il valore "Lory"

a="Lory"

ed a 'b' il valore ricavato dalla proprietà Text del textbox (chiamato Text1) inserito nella maschera e che per esempio supponiamo sia "One"

b=Text1.Text

Assegnamo quindi a 'c' il valore di ritorno pari ad 'a' & 'b'
c = a & b (oppure c = a & Text1.Text)

Adesso a 'c' sarà assegnato il valore "LoryOne".
Il tutto funziona in quanto la proprietà Text appartiene alla stessa tipologia di a e c, ossia di tipo string.

Con le stringhe SQL non cambia nulla, almeno per quanto riguarda la loro creazione.
I problemi sorgono se la sintassi della stringa non è conforme ai dettami imposti dal motore che la deve interpretare ed eseguire, fornendo come risultato un set di record (query di selezione) o un'azione su una o più tabelle (query di azione).

Quando si utilizza il metodo Execute dell'oggetto Database, si da in pasto al motore una stringa SQL così come verrebbe generata manualmente o con l'autocomposizione di ACCESS ed in seguito eseguita attraverso il doppio click. Risulta quindi imperativo che la sintassi sia corretta.

Poichè nella stesura del codice VBA si deve far fronte all'eventualità che la stessa query possa essere eseguita più volte utilizzando variabili ricavate da proprietà di controlli o oggetti presenti in una maschera, risulta ovvio ricorrere alla composizione della stringa SQL utilizzando il concatenamento.

L'inserimento di un nuovo valore testuale all'interno di una ipotetica 'Tabella1' al 'Campo1' della stessa, dovrebbe essere eseguito rispettando la seguente sintassi:

INSERT INTO Tabella1 (Campo1,[Campo2],....) VALUES (valore1,[valore2],....)

e quindi:

Tabella$="Tabella1"
Campo$="Campo1"
SQL$="INSERT INTO " & Tabella$ & " (" & Campo$ & ") VALUES (" & Text1.Text & ")"
DB.EXECUTE SQL$

Ps: Ovviamente la colonna Campo1 deve contenere valori appartenenti alla stessa tipologia dei valori che si vanno ad inserire; in questo caso stringhe. (cioè la variabile c di cui sopra) ;)

Fast-M
23-10-2004, 19.10.38
Uhhh!
Che spiegazione fantastica! :)
Grazie mille Lory per tutte le informazioni che mi hai fornito e che anche se conoscevo già per un buon 99%(non sapevo che valesse il simbolo + come in java e la questione dell'aiuto all'interprete con &) ti sono comunque grato perchè mi hai dato la possibilità di eliminare definitivamente qualche sospetto di diversità con le cose che conosco e mi hai messo a posto le nuove conoscenze del mondo vb.
L'unica cosa che vorrei farti notare che secondo me è sfuggita anche a te(forse sbaglio) è questa:
SQL$="INSERT INTO " & Tabella$ & " (" & Campo$ & ") VALUES (" & Text1.Text & ")"
A me così non funziona.
Invece mi funziona così:
SQL$="INSERT INTO " & Tabella$ & " (" & Campo$ & ") VALUES ('" & Text1.Text & "')"
e cioè ho scoperto che il parser delle stringhe sql di access si aspetta anche un apice singolo dopo la parentesi tonda che segue VALUES.
Non so perchè, ma in un modo mi funziona e nell'altro no.
Aspetto un tuo riscontro.
:)

LoryOne
24-10-2004, 15.52.26
Si, ho commesso l'errore di non inserire l'apice singolo :(, mentre non era sfuggito a gkcuvb :)

Che dire...per fortuna hai risolto in fretta :)

Fast-M
24-10-2004, 17.32.11
:)