Am o interogare pe care aș vrea să o filtrez în moduri diferite în momente diferite. Modul în care am făcut acest lucru acum, prin plasarea parametrilor în câmpul de criterii al câmpurilor de interogare relevante, însă există multe cazuri în care nu vreau să filtrez pe un câmp dat, ci numai pe celelalte câmpuri. Există vreo modalitate prin care un wildcard de un fel poate fi trecut la parametrul criteriilor astfel încât să pot trece de filtrarea pentru acel apel specific al interogării?
Nu cred că poți. Cum executați interogarea?
Aș spune că dacă aveți nevoie de o interogare care are multe variabile deschise, puneți-o într-un modul sau clasă vba și numiți-o, lăsând-o să construiască șirul de fiecare dată.
Nu sunt sigur că acest lucru vă ajută, deoarece bănuiesc că doriți să faceți acest lucru cu o interogare salvată mai degrabă decât în VBA; cu toate acestea, cel mai ușor lucru pe care îl puteți face este să construiți o linie de interogare pe linie în VBA și apoi să creați o serie de înregistrări din acesta.
Un mod destul de hacking ar fi să re-scrieți interogarea salvată pe loc și apoi să accesați; cu toate acestea, dacă aveți mai multe persoane care utilizează același DB, s-ar putea să vă confruntați cu conflicte și veți confunda următorul dezvoltator cu linia.
Ați putea, de asemenea, să transmiteți din punct de vedere programatic valoarea implicită la interogare (după cum sa discutat în întrebarea dvs. anterioară)
Puteți să returnați valori non-nula trecând * ca parametru pentru câmpurile pe care nu doriți să le utilizați în filtrul curent. În Access 2003 (și, eventual, versiuni mai devreme și), dacă utilizați ca [paramName]
ca criteriu pentru o numeric, text, dată, sau un câmp boolean, un asterisc va afișa toate înregistrările (care potriviți celelalte criterii pe care le specificați). Dacă doriți să reveniți la valori nulă, atunci puteți utiliza ca [paramName] sau Is Null
ca criteriu pentru a returna toate înregistrările. (Acest lucru funcționează cel mai bine dacă sunteți construirea interogarea în cod. Dacă utilizați o interogare existentă, și nu doriți să se întoarcă valori nule atunci când nu au o valoare de filtrare, acest lucru nu va funcționa.)
Dacă filtrați un câmp Memo, va trebui să încercați o altă abordare.
Dacă construiți interogarea după cum urmează:
PARAMETERS ParamA Text ( 255 );
SELECT t.id, t.topic_id
FROM SomeTable t
WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])
Toate înregistrările vor fi selectate dacă parametrul nu este completat.
Înapoi la exemplul meu anterior din întrebarea anterioară. Interogarea dvs. parametrizată este un șir care arată în felul următor:
qr = "Select Tbl_Country.* From Tbl_Country WHERE id_Country = [fid_country]"
în funcție de natura fid_Country (număr, text, ghid, dată, etc), va trebui să o înlocuiți cu o valoare de joker și cu caractere specifice de delimitare:
qr = replace(qr,"[fid_country]","""*""")
Pentru a permite în întregime cardurile sălbatice, interogarea dvs. originală ar putea fi de asemenea:
qr = "Select Tbl_Country.* From Tbl_Country _
WHERE id_Country LIKE [fid_country]"
Apoi, puteți obține valori pentru cartela sălbatică pentru fid_Country, cum ar fi
qr = replace(qr,"[fid_country]","G*")
Odată ce ați terminat cu asta, puteți utiliza șirul pentru a deschide o setare de înregistrări
set rs = currentDb.openRecordset(qr)
Rețineți că macheta *
cu cuvântul cheie LIKE
va avea efectul dorit numai în modul de interogare ANSI-89.
Mulți oameni își asumă în mod greșit caracterul wildcard în Access/Jet este întotdeauna *. Nu asa. Jet are două metacaractere:% în modul de interogare ANSI-92 și * în modul de interogare ANSI-89.
ADO este întotdeauna ANSI-92, iar DAO este întotdeauna ANSI-89, dar interfața de acces poate fi și ea.
Când utilizați cuvântul cheie LIKE într-un obiect de bază de date (adică ceva care va fi persistent în fișierul mdb), ar trebui să vă gândiți la ce vă veți întâmpla dacă cineva a folosit această bază de date utilizând un alt mod de interogare decât cel pe care îl folosesc de obicei? Spuneți că doriți să restricționați numai câmpul de text la caracterele numerice și că ați scris regula validei astfel:
NOT LIKE "*[!0-9]*"
Dacă cineva, fără consimțământ (sau altfel) este conectat la .mdb prin ADO, atunci regula de validare de mai sus le-ar permite să adauge date cu caractere non-numerice și integritatea datelor dvs. ar fi împușcată. Nu e bine.
Este mai bine ca IMO să codeze întotdeauna ambele moduri de interogare ANSI. Poate că acest lucru este cel mai bine realizat prin codificarea explicită a ambelor moduri, de ex.
NOT LIKE "*[!0-9]*" AND NOT LIKE "%[!0-9]%"
Dar, cu mai mult implicat Jet SQL DML/DDL, acest lucru poate deveni foarte greu de realizat în mod concis. De aceea vă recomandăm să utilizați cuvântul cheie ALIKE, care folosește caracterul wildcard al modului de interogare ANSI-92 indiferent de modul de interogare, de ex.
NOT ALIKE "%[!0-9]%"
Notă ALIKE este nedocumentată (și presupun că de aceea postul meu original a fost marcat în jos). Am testat acest lucru în Jet 3.51 (Access97), Jet 4.0 (Access2000 în 2003) și ACE (Access2007) și funcționează bine. Am postat anterior acest lucru în grupurile de știri și am obținut aprobarea pentru accesarea MVP-urilor. În mod normal, m-aș îndepărta de caracteristicile nedocumentate, dar fă o excepție în acest caz, deoarece Jet a fost depreciat de aproape un deceniu, iar echipa de acces care o păstrează în viață nu pare interesată să facă modificări profunde la motoarele (sau reparații de bug-uri! ), care are ca efect de a face motorul Jet un produs foarte stabil.
Pentru mai multe detalii despre modurile de interogare ANSI Jet, consultați Despre modul de interogare SQL ANSI .