Cum pot opta pentru parametrii interogărilor MS Access?

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?

0

6 răspunsuri

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ă)

0
adăugat

Î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)
0
adăugat

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.

0
adăugat
Va lucra același lucru pentru o opțiune GRUPĂ CU?
adăugat autor Chad, sursa
@Chad Nu sunt sigur ce vrei să spui, poate PARAMETRI ParamA Text (255); SELECT IIf (IsNull ([ParamA]), "*", [ParamA]) AS Expr1, t.id FROM table1 AS t GRUP DE IIf (IsNull, ParamA] id HAVING (((t.id) ca IIf (IsNull ([ParamA]), "*", [ParamA])));
adăugat autor Fionnuala, sursa

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ă.

0
adăugat

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.

0
adăugat

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 .

0
adăugat
De fapt, macheta va depinde și de interfața de date pe care o utilizați. În SQL executat prin ADO împotriva SQL Server, utilizați "%" în loc de Jet SQL "*", de exemplu.
adăugat autor David-W-Fenton, sursa
De fapt, Jet are două metacaractere: "%" în modul de interogare ANSI-92 și "*" în modul de interogare ANSI-89. ADO este întotdeauna ANSI-92, DAO este întotdeauna ANSI-89, iar interfața de acces poate fi și ea. Este posibil să nu fiți conștienți de acest lucru deoarece utilizați întotdeauna DAO.
adăugat autor onedaywhen, sursa
Linia @Air fixată acum.
adăugat autor onedaywhen, sursa
Mulțumiri. Am avut cel mai tare timp de a găsi o adresă URL actuală care părea că are conținutul descris - dar poate că nu există unul. Nu găsiți multe informații despre măsura în care aceasta este o problemă în 2010 și versiunile ulterioare ale Accesului.
adăugat autor Air, sursa