View Full Version : [Access] Maschera con campi di ricerca
marcobg80
05-11-2008, 11:03
Ciao a tutti,
sto cercando di creare un piccolo programmino in access.
Una maschera con dei campi di ricerca.
Il mio database è già creato, quindi le tabelle sono già state create.
Quello che ho fatto è stato di collegare le tabelle che mi servivano e crearmi una query (Qscarti) che mi estrapolasse i dati a me necessari.
Sulla maschera che ho creato vorrei che l'utente potesse scegliere/scrivere i dati da ricercare nelle combobox che ho creato(es: anno, numero ordine, lavorazione,data,ecc) e succesivamente premere un pulsante che mi aprisse la mia query filtrata
Questo è il codice che ho tentato di scrivere:
Private Sub cmd_ricerca_Click()
Dim anno As Variant
cmb_anno.SetFocus
If cmb_anno.Text = "" Then
anno = "is not null"
Else
anno = "=" & cmb_anno.Text
End If
Dim numero As Variant
cmb_num.SetFocus
If cmb_num.Text = "" Then
numero = "is not null"
Else
numero = "=" & cmb_num.Text
End If
Dim lavorazione As Variant
cmb_lav.SetFocus
If cmb_lav.Text = "" Then
lavorazione = "is not null"
Else
lavorazione = "=" & cmb_lav.Text
End If
Dim strsql As String
strsql = "SELECT * from Qscarti" & "where dbo_movlav.ml_rese " & anno & "AND dbo_movlav.ml_rnum " & numero & "AND dbo_movlav.ml_codlav" & lavorazione
Dim stDocName As String
stDocName = "Qscarti"
DoCmd.OpenQuery stDocName, acNormal, acEdit
End Sub
Non mi da errori ma ci mette una vita e restituisce tutti i dati presenti nella query e non quelli che imputo io nelle combobox.
Dove sbaglio?
Grazie a tutti
Dim strsql As String
strsql = "SELECT * from Qscarti" & "where dbo_movlav.ml_rese " & anno & "AND dbo_movlav.ml_rnum " & numero & "AND dbo_movlav.ml_codlav" & lavorazione
Dim stDocName As String
stDocName = "Qscarti"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Somiglia tanto tanto a questo Thread :) : http://www.hwupgrade.it/forum/showthread.php?t=1834250
Vedi mia risposta al post #4.
In ogni caso non è chiaro perchè costruisci la strsql parametrizzandola giustamente con i valori delle combobox, per poi piantarla lì e chiamare una Stored Query...
Quando hai costruito la strsql hai già tutto quello che ti serve. Bastava aggiungere :
Maschera.RecordSource = strsql
Maschera.Requery
marcobg80
05-11-2008, 12:25
Ti ringrazio!
Scusami ma con il codice di access nn sono molto ferratto...
In teoria la stringa sql la creo per recuperare i campi dalla mia query.no?
In teoria poi dovrebbe aprire la query filtrata
Togliendo:
Dim stDocName As String
stDocName = "Qscarti"
DoCmd.OpenQuery stDocName, acNormal, acEdit
e inserendo: (frmscarti è il nome della mia maschera/form)
frmscarti.RecordSource = strsql
frmscarti.Requery
mi da il seguente errore:
Necessario oggetto
Grazie ancora per l'aiuto
L'unica è, se puoi, postare il DB. Magari lascia qualche dato, che so, una ventina di records per tabella...
Senza vedere come hai fatto la maschera e la query non sono in grado.
marcobg80
05-11-2008, 15:13
se mi dai la tua email ti mando il tutto.
il file mi pesa troppo.
Ciao e grazie ancora
se mi dai la tua email ti mando il tutto.
Pvt inviato.
Anzitutto una sistemata alla strsql. Così proprio non va :
strsql = "SELECT * from Qscarti" & "where dbo_movlav.ml_rese " & anno & "AND dbo_movlav.ml_rnum " & numero & "AND dbo_movlav.ml_codlav" & lavorazione
Devi rispettare gli spazi !
strsql = "SELECT * FROM Qscarti" & _
" WHERE dbo_movlav.ml_rese " & anno & _
" AND dbo_movlav.ml_rnum " & numero & _
" AND dbo_movlav.ml_codlav " & lavorazione
Inoltre :
- anno : se a DB è numerico va bene così, se è Data, no.
- lavorazione non va, devi metterlo tra apici singoli perchè a quanto vedo nel DB è stringa :
Dim lavorazione As Variant
cmb_lav.SetFocus
If cmb_lav.Text = "" Then
lavorazione = "is not null"
Else
lavorazione = "=" & "'" & cmb_lav.Text & "'"
End If
marcobg80
07-11-2008, 09:34
Ciao Marco,
scusa ma ieri proprio nn ho avuto tempo di prendere in mano access.
Ho modificato il codice in questo modo, ma non funziona ancora:
Private Sub cmd_ricerca_Click()
Dim anno As Variant
cmb_anno.SetFocus
If cmb_anno.Text = "" Then
anno = "is not null"
Else
anno = "=" & cmb_anno.Text
End If
Dim numero As Variant
txt_num.SetFocus
If txt_num.Text = "" Then
numero = "is not null"
Else
numero = "=" & txt_num.Text
End If
Dim lavorazione As Variant
cmb_lav.SetFocus
If cmb_lav.Text = "" Then
lavorazione = "is not null"
Else
lavorazione = "=" & "'" & cmb_lav.Text & "'"
End If
Dim strsql As String
strsql = "SELECT * FROM Qscarti" & _
" WHERE dbo_movlav.ml_rese " & anno & _
" AND dbo_movlav.ml_rnum " & numero & _
" AND dbo_movlav.ml_codlav " & lavorazione
Form.RecordSource = strsql
Form.Requery
End Sub
Il campo anno e lavorazione sono di tipo testo e il campo numero è numero.
Ti anticipo che non posso modificare il tipo di dati, perchè il mio programma lo sto costruendo su un database gia fatto.
Quindi quello che faccio è collegarmi/importarmi le tabelle e poi costruirmi query e maschera.
Cosi facendo mi restituisce l'errore runtime '2001' OPERAZIONE PRECEDENTE ANNULLATA. Debug su linea Form.RecordSource = strsql
Ho fatto anche delle prove con il codice sql. Copiando il codice nella finestra immediata
?"SELECT * FROM Qscarti" & _
" WHERE dbo_movlav.ml_rese " & anno & _
" AND dbo_movlav.ml_rnum " & numero & _
" AND dbo_movlav.ml_codlav " & lavorazione
mi restituisce questo:
SELECT * FROM Qscarti WHERE dbo_movlav.ml_rese =2008 AND dbo_movlav.ml_rnum =36 AND dbo_movlav.ml_codlav is not null
ma provandolo all'interno di una query nn mi restituisce nessuno valore se invece la imposto cosi:
SELECT * FROM Qscarti WHERE dbo_movlav.ml_rese ="2008" AND dbo_movlav.ml_rnum =36 AND dbo_movlav.ml_codlav is not null
è perfetta!
Scusa per il papiro, ma sto diventando matto magari per una stupidata.
Grazie!
Il campo anno e lavorazione sono di tipo testo e il campo numero è numero.
Ti anticipo che non posso modificare il tipo di dati, perchè il mio programma lo sto costruendo su un database gia fatto.
Quindi quello che faccio è collegarmi/importarmi le tabelle e poi costruirmi query e maschera.
Cosi facendo mi restituisce l'errore runtime '2001' OPERAZIONE PRECEDENTE ANNULLATA. Debug su linea Form.RecordSource = strsql
Ho fatto anche delle prove con il codice sql. Copiando il codice nella finestra immediata
?"SELECT * FROM Qscarti" & _
" WHERE dbo_movlav.ml_rese " & anno & _
" AND dbo_movlav.ml_rnum " & numero & _
" AND dbo_movlav.ml_codlav " & lavorazione
mi restituisce questo:
SELECT * FROM Qscarti WHERE dbo_movlav.ml_rese =2008 AND dbo_movlav.ml_rnum =36 AND dbo_movlav.ml_codlav is not null
ma provandolo all'interno di una query nn mi restituisce nessuno valore se invece la imposto cosi:
SELECT * FROM Qscarti WHERE dbo_movlav.ml_rese ="2008" AND dbo_movlav.ml_rnum =36 AND dbo_movlav.ml_codlav is not null
è perfetta!
Anno è testo ? Non finisco mai di stupirmi della creatività di chi fa i DB ! :D
Se Anno è stringa, allora modificherei anche questa :
Dim anno As Variant
cmb_anno.SetFocus
If cmb_anno.Text = "" Then
anno = "is not null"
Else
anno = "=" & "'" & cmb_anno.Text & "'"
End If
La mia stringa SELECT rimane valida.
Molto probabilmente questo non sarà ancora sufficiente a risolvere il problema, perchè a quanto pare la maschera non ha controlli associati.
Da ciò che mi hai mandato vedo solo una frmscarti con 3 controlli non associati... :mbe:
Per prima cosa devi creare una maschera da creazione guidata, associarla alla tua query, in modo che prenda tutti i dati che interessano e salvarla.
Poi alla frmscarti AGGIUNGI le combo che fanno da filtro, e solo a quel punto potrai eseguire :
frmscarti.Recordset = strsql
frmscarti.Requery
Non so se mi sono spiegato. Ti avevo linkato quella discussione proprio perchè il tuo problema l'avevo già risolto per un altro utente. :)
marcobg80
10-11-2008, 10:56
Ti ringrazio Marco, ma forse non mi sono spiegato bene.
Quello che io vorrei fare, non è visualizzare i dati sulla stessa form dove ho le mie combo box.
Una volta inseriti i dati nelle combo box (potendo scrivere o scegliere dalla lista) e premuto il pulsante RICERCA vorrei che mi aprisse in una altra finestra la mia query Qscarti filtrata secondo i campi che io imputo.
Mi scuso se non sono stato chiaro.
Grazie.
Ciao
Per prima cosa devi creare una maschera da creazione guidata, associarla alla tua query, in modo che prenda tutti i dati che interessano e salvarla.
Poi alla frmscarti AGGIUNGI le combo che fanno da filtro...
E continuo a pensare che questo fosse il metodo migliore.
Comunque è possibile rimediare agli errori che hai fatto ( se volevi una query parametrica, era meglio fare una query parametrica, anzichè una query che va a fare una SELECT su un'altra query... ).
Prova a far eseguire questo al Click, dopo che strsql è completa :
( devi prima referenziare le librerie DAO ! )
Dim queryTemp As QueryDef
For Each queryTemp In CurrentDb.QueryDefs
If queryTemp.Name = "queryTemp" Then
DoCmd.DeleteObject acQuery, "queryTemp"
Exit For
End If
Next
Set queryTemp = CurrentDb.CreateQueryDef("queryTemp", strsql)
DoCmd.OpenQuery ("queryTemp")
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.