PDA

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

MarcoGG
05-11-2008, 11:46
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

MarcoGG
05-11-2008, 14:01
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

MarcoGG
05-11-2008, 16:41
se mi dai la tua email ti mando il tutto.


Pvt inviato.

MarcoGG
06-11-2008, 09:47
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!

MarcoGG
07-11-2008, 14:15
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

MarcoGG
10-11-2008, 11:53
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")