Devo creare una maschera con una sola combo che mi permetta di vedere, in
un'unica colonna, tutti i nomi dei campi della tabella e selezionarne uno;
riesco a crearla immettendo manualmente i nomi dei 50 campi, c'č un modo per
farglieli leggere dinamicamente dalla tabella senza doverli scrivere tutti?
Cosě non avrei problemi in caso di future aggiunte/eliminazioni di campi.
Devo creare una query la cui SELECT estrapoli dalla tabella tutti i record,
mostrandomi perň solo uno dei 50 campi, che deve essere quello che ho
selezionato precedentemente nella FORM.
In pratica la mia idea č (NON funzionante!) qualcosa tipo:
SELECT Forms!frmRicerche!cmbNomeCampo
FROM DATI;
Cosě mi mostra tutti i record con questa sola colonna (quello che vorrei
io), ma completamente vuota. Normalmente uso questo metodo per passare i
parametri alla clausola WHERE, non so se esiste un sistema simile per
passare i nomi dei campi alla SELECT.
Cosa posso fare?
Grazie.
Mimeacc
Il primo problema l'ho risolto, ho impostato la combo con Tipo Origine Riga
"Elenco campi" e Origine riga "DATI", resta la questione della query.
Mimeacc
ok, il secondo problema lo risolvi cambiando l'origine controllo della
casella testo nell'evento "Dopo Aggiornamento" della casella combinata
Esempio.
----
Private Sub CasellaCombinata1_AfterUpdate()
Me.Testo1.ControlSource = Me.CasellaCombinata1
End Sub
----
La query origine record della maschera deve riportare tutte le colonne.
Ciao
--
Giorgio Rancati
[Office Access MVP]
Nella PopUp io ho inserito 3 diverse combo e quindi 3 text nel Report e
continua a funzionare tutto, perché così ottengo (sempre col tuo prezioso
suggerimento) di poter vedere i 3 diversi campi (che cambiano di volta in
volta) per tutti i record.
Ora dovrei avere la possibilità di filtrare questi record, in pratica nella
PopUp devo inserire altre 3 combo (o forse 6) per avere la possibilità di
selezionare, per ogni campo prescelto, uno (o due) dei valori presenti in
tabella per quel campo; questa cosa credo di riuscire a farla, sono delle
semplici combo "a catena", se ho problemi riscrivo... invece mi servirebbe
capire se e come posso passare il parametro (o i due parametri) al
ControlSource delle text del Report.
In pratica, nella prima combo della PopUp seleziono il campo "A", quindi
nelle due combo adiacenti seleziono il valore "1" , stesso discorso per gli
altri due campi (p.es campo "G" con valore "JKH" e campo "K" con valore
"1"); quindi il Report mi dovrà mostrare solo i record che rispettano
contemporaneamente i tre valori per i tre campi, una sorta di WHERE A="1"
And G="JKH" And K="1".
La condizione ideale sarebbe quella di poter passare ad ogni text 2
parametri, NON come intervallo, ma come valori alternativi:
WHERE (A="1" Or A="5") And (G="JKH" Or G="PIB") And (K="1" Or K="2").
Si tratta di una ricerca su dati scientifici, di tipo genetico, per questo
può essere utile la questione dei due diversi valori.
Mi sono dilungato per timore di non essere chiaro. Grazie per l'aiuto. :-)
Ciao
Mimeacc
SELECT *
FROM DATI
WHERE DATI.DNA = "3A"
se nella combo C1 della maschera seleziono il valore "DNA" e nella combo C2
della maschera seleziono il valore "3A", posso trasformarla in qualcosa
tipo:
SELECT *
FROM DATI
WHERE Forms!frmMaschera.C1=Forms!frmMaschera.C2
Questa ovviamente non funziona, esiste un modo?
Grazie.
Mimeacc
FATTO! Nell'evento su apertura del Report creo una stringa nella quale
costruisco l'SQL della query, basandomi sui valori delle combo, poi imposto
il RecordSource del Report con la stringa appena creata; ho testato una
combo con un nome di campo ed una con un suo valore e mi ha estrapolato
proprio i record corrispondenti. Sembra funzionare, ora provo con tutti i
valori delle varie combo.
Grazie.
Mimeacc
sě, un'altra strada era quella di creare via codice la condizione Where da
passare nel parametro WhereCondition del metodo OpenReport.
In pratica quello che hai fatto limitato alla sola parte della clausola
where (senza la parola Where) lasciando invariata l'origine record del
report.
Aspetta! non te ne andare, intanto sono andato avanti e sono arrivato a
questa specie di cosa:
strSQL = "SELECT NDNA,N," & Forms!frmRicerche!cmbCampo1
strSQL = strSQL & " FROM Dati WHERE "
'inserisce nella WHERE il valore di C1V1
If IsNull(Forms!frmRicerche!cmbC1V1) Then 'campo vuoto
strSQL = strSQL & "IsNull (" & Forms!frmRicerche!cmbCampo1 & ")"
ElseIf IsNumeric(Forms!frmRicerche!cmbC1V1) Then 'campo numerico
strSQL = strSQL & Forms!frmRicerche!cmbCampo1 & " = " &
Forms!frmRicerche!cmbC1V1
ElseIf IsDate(Forms!frmRicerche!cmbC1V1) Then 'campo data
strSQL = strSQL & Forms!frmRicerche!cmbCampo1 & " = #" &
Forms!frmRicerche!cmbC1V1 & "#"
Else 'campo testo
strSQL = strSQL & Forms!frmRicerche!cmbCampo1 & " = """ &
Forms!frmRicerche!cmbC1V1 & """"
End If
strSQL = strSQL & " ORDER BY NDNA" ' l'ordinamento è fisso su questo campo
Questa è la query (qui è limitata ad un solo campo e relativo valore)
nell'evento su apertura del report; non mi funzionano alcune cose:
1 - IsNumeric: ho alcuni campi "testo" che contengono numeri, lui me
l'interpreta come numeri e mi "sbaglia" la sintassi perché alla query il
valore passa come numero (p.es. 33) e non come testo ("33"); ho necessità di
stabilire con certezza se un campo è numerico o di testo, posso "leggere" da
qui direttamente il tipo del campo nella tabella? così cambierei la
condizione risolvendo.
2 - IsNumeric: nella form i numeri decimali sono con la "," e non con il "."
se arriva un valore numerico con decimali alla query ovviamente mi dà
errore; dovrei convertire qui la "," in "."; posso farlo o devo agire nella
form (lì la combo non è associata per cui potrei fare la trasformazione da
codice, forse)?
3 - IsDate: ho il noto problema che io leggo dalla form e passo alla query
una data #gg/mm/aaaa# mentre lei la vuole in #mm/gg/aaaa#; ricordo di aver
visto più di un post in merito, ma non l'ho trovati, puoi dirmi qualcosa al
volo altrimenti cerco meglio?
Preferirei far funzionare questo metodo ma se non è possibile o la cosa si
complica posso anche agire sulla form da cui lancio il report, l'importante
è risolvere.
Grazie. :-)
Ciao.
Mimeacc
scusa Mimeacc, ma devo proprio uscire per andare da un cliente :(
Se nel frattempo non hai ricevuto soluzioni da altri, domani mattina leggo e
vedo come posso aiutarti
:-)
"giorgio rancati" ha scritto:
Perdono, mi sono espresso malissimo, non era nel senso di risolvere subito
il problema, ci mancherebbe altro, ma nel senso di "non andartene dal
thread", buon lavoro! :-)
Ciao.
Mimeacc
per stabilire la natura del campo puoi vedere la proprietà Type e poi
eseguire una Select Case a seconda del tipo restituito
----
Select Case CurrentDb.TableDefs("NomeTab").Fields("NomeCampo").Type
Case dbDate, dbTime
MsgBox "é una data"
Case dbCurrency, dbDouble, dbFloat, dbDecimal, dbInteger, dbLong
MsgBox "é un numero"
Case dbText, dbMemo, dbChar
MsgBox "é un testo"
Case Else
MsgBox "Tipo non contemplato!!"
End Select
----
ho messo le costanti che mi ricordavo, controlla se ne mancano e aggiungile.
> 2 - IsNumeric: nella form i numeri decimali sono con la "," e non con il
> "." se arriva un valore numerico con decimali alla query ovviamente mi dà
> errore; dovrei convertire qui la "," in "."; posso farlo o devo agire
> nella form (lì la combo non è associata per cui potrei fare la
> trasformazione da codice, forse)?
quando concateni un numero nella stringa Sql usa la funzione STR(), ci pensa
lei a localizzare il numero nella notazione anglosassone.
es
----
strSql="SELECT .. FROM .. WHERE Numero=" & STR(Me.txtNumero)
----
> 3 - IsDate: ho il noto problema che io leggo dalla form e passo alla query
> una data #gg/mm/aaaa# mentre lei la vuole in #mm/gg/aaaa#; ricordo di aver
> visto più di un post in merito, ma non l'ho trovati, puoi dirmi qualcosa
> al volo altrimenti cerco meglio?
quando concateni una data in una stringa conviene usare la funzione Cdate
all'interno della query
es..
----
strSql="SELECT .. FROM .. WHERE Data=Cdate('" & Me.txtData & "')"
----
La funzione Cdate all'interno del codice SQL convertirà la stringa della
data in modo corretto prendendo come localizzazione sorgente quella
impostata nel pannello di controllo e come localizzazione di destinazione
quella anglosassone.
> Preferirei far funzionare questo metodo ma se non è possibile o la cosa si
> complica posso anche agire sulla form da cui lancio il report,
> l'importante è risolvere.
:-)
"giorgio rancati" ha scritto:
Ciao,
stasera farò tutte le prove e ti aggiorno sui risultati; ti anticipo solo
che avevo trovato la funzione CDate ma in realtà il problema è diverso da
quello che avevo immaginato, infatti date tipo 14/12/1930 o 12/10/1921 non mi
danno problemi, mi trova proprio i record esatti, invece con date con lo "0"
come 03/05/1917 o 08/02/1921 non mi trova alcun record. Ho il solo dubbio per
il fatto che non ho usato gli "'" con CDate, comunque al prossimo post ti
faccio un quadro più chiaro.
Grazie.
:-)
Mimeacc
io uso sempre e solo la funzione Cdate all'interno della stringa SQL e ti
assicuro che funziona
E hai ragione, come al solito :-), l'errore, come sospettavo, era mio in
quanto usavo "#" invece di "'". Allora, dopo notte insonne, l'esito è
questo:
Function CreaQuery(Campo, Valore)
'verifica il tipo dati del campo Valore e continua la costruzione della
query
Select Case CurrentDb.TableDefs("Dati").Fields(Campo).Type
Case 10 'tipo testo, dbText, dbMemo, dbChar
strWHERE = strWHERE & Campo & " = """ & Valore & """"
Case 3, 4, 6 'tipo numero, dbCurrency, dbDouble, dbFloat, dbDecimal,
dbInteger, dbLong
Valore = Str(Valore)
strWHERE = strWHERE & Campo & " = " & Valore
Case 8 'tipo data, dbDate, dbTime
strWHERE = strWHERE & Campo & " = CDate('" & Valore & "')"
Case 1 'tipo Sì/No, dbBoolean
If Valore = "Vero" Then Valore = -1 Else Valore = 0
strWHERE = strWHERE & Campo & " = " & Valore
Case Else
MsgBox CurrentDb.TableDefs("Dati").Fields(Campo).Type & "= Tipo non
contemplato!!", vbExclamation, "Ricerca non consentita!"
End Select
End Function
Ho messo tutto in una Function così posso costruirmi la mia WHERE con quanti
campi voglio senza riscrivere tutto; non mi ha accettato (ma anche l'help
confermava quanto suggerivi tu, mah!) i tipi dbText, ecc, ecc, ho visto che
il Type mi restituiva valori numerici ed ho adattato i Case, aggiungendo il
boolean nel quale trasformo Vero in -1 e Falso in 0, altrimenti l'SQL mi
andava in errore.
Per i numeri con le "," ho dovuto prima fare la conversione con l'Str e poi
costruire l'SQL, mentre CDate funziona direttamente.
Abusando della tua pazienza :-| , ho un ulteriore problema: attualmente
eseguo una routine per ogni combo (dal 2° in poi), per costruire la query:
'se cmbCampo2 non è vuota la inserisce nella SELECT
If Not IsNull(Forms!frmRicerche!cmbCampo2) Then
strSQL = strSQL & "," & Forms!frmRicerche!cmbCampo2
'inserisce nella stringa temporanea strWHERE la condizione di C2V1
If IsNull(Forms!frmRicerche!cmbC2V1) Then 'campo vuoto
strWHERE = strWHERE & " AND IsNull (" & Forms!frmRicerche!cmbCampo2
& ")"
Else
strWHERE = strWHERE & " AND " 'aggiunge l'operatore alla stringa
strWHERE
Call CreaQuery(Forms!frmRicerche!cmbCampo2,
Forms!frmRicerche!cmbC2V1)
End If
End If
e così via per ogni campo; funziona, ma volevo creare un ciclo For...Next
(visto che le combo si chiamano cmbCampo1,2,3...10), che mi sembra più serio
e mi farebbe risparmiare un mare di codice:
For N = 2 To 10
Camp = "Forms!frmRicerche!cmbCampo" & N
Valor = "Forms!frmRicerche!cmbC" & N & "V1"
'se Camp non è vuoto lo inserisce nella SELECT
If Not IsNull(Camp) Then
strSQL = strSQL & "," & Camp
'inserisce nella stringa temporanea strWHERE la condizione di Valor
If IsNull(Valor) Then 'campo vuoto
strWHERE = strWHERE & " AND IsNull (" & Camp & ")"
Else
strWHERE = strWHERE & " AND " 'aggiunge l'operatore alla stringa
strWHERE
Call CreaQuery(Camp, Valor)
End If
End If
Next N
Il problema, come avrai già capito, è che alla Function sto passando una
stringa col nome della combo ma non il suo contenuto;
"Forms!frmRicerche!cmbCampo" & N mi dà p.es. "Forms!frmRicerche!cmbCampo2" e
non ciò che ho selezionato, p.es. "DataDiNascita", con l'ovvio errore,
stesso discorso per l'altra combo che contiene il valore del campo (Null
oppure p.es. 12/01/1915).
Dove sbaglio?
Grazie!
:-)
Mimeacc
Al posto di fare così
----
Camp = "Forms!frmRicerche!cmbCampo" & N
Valor = "Forms!frmRicerche!cmbC" & N & "V1"
----
fai così
----
Camp = Forms("frmRicerche").Controls("cmbCampo" & N)
Valor = Forms("frmRicerche").Controls("cmbC" & N & "V1")
----
Ciao
Dunque, se le due combo sono valorizzate funziona benissimo, altrimenti,
mentre Camp accetta valori Nulli (quando la cmbCampoN è vuota), Valor mi dà
"errore 94 utilizzo non valido di Null"; questa è una situazione che si
verifica perché capita che si debba controllare se ci sono record che
abbiano uno o più campi vuoti. Ti ricordo che la cmbCampoN mi permette di
selezionare uno dei campi della tabella, mentre la cmbCNV1 mi permette di
selezionare uno dei valori presenti in tabella per il campo precedentemente
selezionato.
Ho risolto trasformando così:
For N = 2 To 10
Camp = Forms("frmRicerche").Controls("cmbCampo" & N)
'se Camp non è vuoto lo inserisce nella SELECT
If Not IsNull(Camp) Then
strSQL = strSQL & "," & Camp
'inserisce nella stringa temporanea strWHERE la condizione di Valor
If IsNull(Forms("frmRicerche").Controls("cmbC" & N & "V1")) Then 'campo
vuoto
strWHERE = strWHERE & " AND IsNull (" & Camp & ")"
Else
Valor = Forms("frmRicerche").Controls("cmbC" & N & "V1")
strWHERE = strWHERE & " AND " 'aggiunge l'operatore alla stringa
strWHERE
Call CreaQuery(Camp, Valor)
End If
End If
Next N
In pratica PRIMA controllo se Forms("frmRicerche").Controls("cmbC" & N &
"V1") è vuoto, se non lo è lo assegno a Valor.
Resta il "mistero" del differente comportamento delle due stringhe che mi
sembrano assolutamente identiche; se ti viene in mente qualcosa la provo
altrimenti va benissimo così, col tuo prezioso aiuto sono riuscito a
realizzare un generatore di query nel quale sono parametrizzati sia i campi
che i valori, mi sembra davvero una cosa interessante anche se, a dirla
tutta, io ho avuto l'idea/necessità e tu l'hai creata. UBI MAIOR, MINOR
CESSAT! ;-)
Grazie di cuore.
Mimeacc
Se Camp accetta valori null vuol dire che non è dichiarata String ma
Variant.
Dichiara Valor come Variant e anche lui accetterà i valori Null
:-)
:-) :-) :-)) :-)))
Thank's, very much!
Mimeacc