Avatar billede region Nybegynder
08. august 2001 - 21:35 Der er 36 kommentarer og
1 løsning

if sætning eller..???

Jeg prøver lige igen..

Jeg har flg.
form1 med en CHECKBOX1
query1 med et felt [avance]

såfremt CHECK1 = false skal query1 kun vise de poster hvor [avance]> 0

såfremt CHECK1 = true skal query1 kun vise de poster hvor [avance]< 0

hvordan gøres dette...???

Avatar billede nih Novice
08. august 2001 - 22:07 #1
Hvor skal du bruge søgeresultatet ??????

Jeg bygger normalt alt op med sqlstrenge:

Ssql = \"select * From query1 Where [avance]\"
if check1 = false Then
  Ssql = Ssql & \"> 0;\"
else
  Ssql = Sql & \"< 0;\"
end if

Du kan så bruge Ssql til at oprette en ny queryTemp eller som rowsouce til listbokse, combobokse osv.

Niels
Avatar billede nih Novice
08. august 2001 - 22:09 #2
if check1 = if CHECKBOX1

Jeg skal vist lige huske at læse din navngivning ;o)
08. august 2001 - 22:48 #3
Okay, den er lidt tricky:

I query1 angiver du et nyt felt, som ser således ud:
fltAvance: [Avance]*IIf(Forms!Form1!\"Checkbox1;-1;1)

I kriteriet på dette nye felt skrive du blot: <0

Dette felt skal ikke vises, så du skal tillige have feltet [Avance] med i forespørgslen.

/Thomas
Avatar billede nih Novice
08. august 2001 - 23:02 #4
Jeg har lige set dit tidligere indlæg - lidt sent, men lige pludselig virkede det bekendt.

Man kan ændre recordsource for en underformular således:

Me.under_form.Form.RecordSource = Ssql

under_form er navnet på underformularen.
Ssql er Sqlstrengen
læg koden i checkboxen\'s AfterUpdate event.

Niels

Avatar billede region Nybegynder
09. august 2001 - 08:46 #5
Thomas>

mangler der ikke noget i din streng...den melder fejl... så vidt jeg kan se mangler der en \" et eller andet sted.
09. august 2001 - 08:55 #6
Sorry - my bad :o(

Der er tværtimod et \" for meget. Du skal bare fjerne anførselstegnet. Undskyld

/Thomas
Avatar billede region Nybegynder
09. august 2001 - 08:59 #7
sådan skulle den se ud :

[Avance]*IIf([Forms]![Form1]![Check1];-1;1)

men thomas kunne du ikke lige forklare mig hvad det er der gør det virker....

09. august 2001 - 09:08 #8
øhh, som jeg sagde, så er den lidt tricky - derfor er den også lidt svær at forklare, men jeg skal prøve ;o)

Det nemmeste og mest oplagte ville være at lave en
IIf(Forms!Form1!Check1;<0;>0)
i kriteriert under [Avance], men det duer ikke i Access. Access kan ikke finde ud af at skifte kriteriet ud afhængigt af værdien af et felt på en formular. Derfor er man nødt til at holde kriteriet fast og så blot ændre feltet/værdien. Og det tog mig altså lige et par forsøg at få det til at virke.
Ideen er at hvis Check1=true, så ganges [Avance] med -1, hvorfor kriteriet <0 i virkeligheden bliver til >0.
Hvis Check1 = false, så ganges [Avance] blot med 1, sålede at kriteriet er <0.

Metoden duer lige netop i dette tilfælde, men er nok svær at overføre til andre tilfælde - men tankegangen er værd at tage med.

Håber, det giver mening?

/Thomas
Avatar billede region Nybegynder
09. august 2001 - 09:39 #9
Jo det hjalp en del... og ja det giver lidt stof til eftertanke da jeg regnede med at jeg kunne bruge svaret til en lign. beregning hvor avance% skulle være mindre end 8 (<8), men det lader sig ikke gøre på denne måde...ÆÆÆVVVVV...

Kan du løse denne er der nye point til dig
Proceduren er den samme bortset fra at checkboxen nu hedder 2 og feltet nu hedder [avance%]

Jeg har forsøgt at løse sidstnævnte ved at lave en kombobox der laver et opslag i en tabel der bare indeholder nogle poster der hedder.:

<10
<8
<6
<4
<2

i kriterie på queryen skev jeg så :

Like Forms![Form1]![Combo16] Or Forms![Form1]![Combo16] = null

men den viser da et null resultat. Jeg ville jo synes den skulle indsætte den valgte værdi i comboen feks. <8 det hjælper ej heller at tilføje en * (<8*) eller \"klamme\" det ind (\"<8\")/ (\"<8*\")

nogle ideer, som sagt point finder vi ud af med mingre det koster mere end de sølle 134 jeg har tilbage...

lad mig høre din kommentar... :-))
09. august 2001 - 10:28 #10
Hey Region,

Nu kan jeg ikke helt huske hvor velbefærdet du er i VBA\'ens forunderlig verden, men jeg vil nok sige, at vi er over i en situation, hvor det er langt hurtigere at løse vha VBA.
Ligeledes kan jeg heller ikke huske om du benytter Access 97 eller 2000 (sorry :)
Nedenstående forslag benytter DAO, så det kan benyttes i bege versioner. Husk dog at sætte en reference til DAO, hvis du benytter Access 2000!

Mit forslag er:

Når brugeren har klikket på det han skal klikke på, skal du simpelthen ændre SQL\'en af din forespørgsel vha kode. Det er ganske simpelt:

Currentdb.querydefs(\"Query2\").SQL = \"Select * From [Tabel1] Where [Avance%] \" & IIF(Me!Check2, \"<8\",\">8\")

Derved er Query2\'s SQL ændret, således at den næste gang du åbner eller kører den, f.eks. ser således ud:
Select * From [Tabel1] Where [Avance%] > 8

Udskift selv [Tabel1] og \"Query2\" med de respektive, ligesom der selvfølgelig også kan være flere kriterier eller flere tabeller i din forespørgsel. Men jeg håber, at du kan se ideen. Ellers vender du bare tilbage.

/Thomas
Avatar billede region Nybegynder
09. august 2001 - 10:41 #11
Hej Thomas.

Jeg kører acc. 97, er novice i VBA men forsøger ihærdigt at blive \" bruger\"..

Det lyder smart.. kunne jeg ikke gøre sådan her.:

Currentdb.querydefs(\"Query2\").SQL = \"Select * From [Tabel1] Where [Avance%] \" & me!combo16)

eventen skal vel ligge på en trykknap ved \"ON CLICK\" eller lign.

eller...?

ved at bruge combo kunne jeg jo lade feltet være lidt mere frit


HUSK NU AT DU SKAL HAVE POINT....
Avatar billede nih Novice
09. august 2001 - 10:41 #12
>> Thomas

Så vidt jeg husker kan man ikke ændre en querydef, der er åben (som underformular).

Ville det så ikke være nemmere at benytte den fra mit indlæg:

Me.under_form.Form.RecordSource = Ssql

Niels
09. august 2001 - 10:51 #13
Hej Region,

Dit forslag med Me!Combo16 er fint. Det burde virke.
Du kan lægge koden på en trykknap eller du kan lægge den på AfterUpdate-eventen på comboboksen - derved skifter SQL automatisk når de vælger et kriterie på listen. (det tager kun et splitsekund, så det er ikke noget, som belastes hvis brugeren sidder og klikker løs på comboboksen)

Niels-> Du kan godt ændre en Querydef, selvom den er åben - det slår bare først gennem, når den har været lukket og åbnet igen - men hvor får du den underformular fra? Jeg mener ikke at Region har snakket om nogen underformular? Eller er det mig, der har overset noget?

/Thomas
Avatar billede region Nybegynder
09. august 2001 - 10:54 #14
Niels henviser ganske rigtigt til en underform som er baseret på min query. Altså viser jeg i formularen en underform som er baseret på queryen...

MEN dette kunne du selvfølgelig ikke vide noget om,ergo er det min fejl og point tilgår naturligvis dig trods dette...
09. august 2001 - 10:59 #15
Problemet er ikke større, end at du blot i din kode skal skrive:
Me!Underformnavn.Form.Recordsource = \"Query2\"
(Jeg ved ikke hvad din Underformular hedder)

Dette skal stå til sidst, således at koden kommer til at se nogenlunde sådan ud:

Currentdb.querydefs(\"Query2\").SQL = \"Select * From [Tabel1] Where [Avance%] \" & me!combo16
Me!Underformnavn.Form.Recordsource = \"Query2\"

/Thomas
Avatar billede nih Novice
09. august 2001 - 11:03 #16
>>Thomas

Jeg så et tidligere spørgsmål fra Region:
http://www.eksperten.dk/spm/96539
og troede at det her var en fortsættelse.

Du har ret med hensyn til Querydef man skal som du siger bare bruge en: .requery.

Niels
Avatar billede region Nybegynder
09. august 2001 - 11:05 #17
Nu skal jeg dælme teste så det gør noget... :-))

Når dette er gjort må du komme med dine krav om point.
Avatar billede nih Novice
09. august 2001 - 11:07 #18
Region

Uanset hvilken løsning du bruger tilfalder pts\'ene Thomas, om ikke andet så pga det geniale med at gange felttet med -1, det var godt nok smart

Niels
Avatar billede region Nybegynder
09. august 2001 - 11:09 #19
ikke fordi jeg vil tilsidesætte dine ideer Niels, så var det derfor også Thomas jeg mente...
09. august 2001 - 11:12 #20
Hej Niels,

Ja, jeg ved ikke om .requery er nok? Jeg synes, at jeg har oplevet flere situationer, hvor jeg netop var nødt til at assigne forespørgslen til recordsourc\'en manuelt før det virkede.
Har du erfaring med det?

Til Region:
Mht point, så giver du bare hvad du synes at spørgsmålet er værd - jeg vil ikke rippe dig for dine sidste 134 point, så omkring 30 point er fint nok :o)
Jeg synes dog også at Niels fortjener lidt, da han jo langt hen ad vejen var på samme spor...

/Thomas
Avatar billede region Nybegynder
09. august 2001 - 11:14 #21
vi finder ud af det...

nu vil jeg prøve at få det til at virke først...
Avatar billede nih Novice
09. august 2001 - 11:16 #22
Region

Fordellen ved at ændre querydef er at indstillingen er gent til næste gang du åbner formularen, eller hvis du skal skrive søgeresultattet ud på en rapport

Faren er at du ikke på forhånd ved hvordan din forespørgsel ser ud - hvis den er grundlag for flere formulare slår din søgning igennem her også.

Niels
Avatar billede nih Novice
09. august 2001 - 11:19 #23
>> Thomas

Jeg synes let hele databasen bliver for uoverskulig, hvis jeg ændre i Querydef. Det skal være sådan at jeg ved at åbne forespørgslen kan se hvordan den ser ud. Så det har jeg desværre ingen erfaring med.

Niels
Avatar billede region Nybegynder
09. august 2001 - 11:20 #24
Så kunne man vel bruge en SET.query2 = nothing
til sidst i scriptet.
09. august 2001 - 11:40 #25
Hey,

Niels, du har ret i, at der er visse farer ved at ændre querydef\'en.
Men jeg mener at princip at man ALDRIG skal bruge den samme forespørgsel til flere forskellige formularer - man ender altid op med at der pludselig skal være en lille nuance-forskel på de 2 formularer.
Dit alternativ med at skrive SQL\'en direkte i Recordsource\'en giver jo forøvrigt heller ikke mulighed for at bruge den samme forespørgsel i andre formularer, da den jo kun eksistere i den ene formular.

Hvis man bruger forespørgslen, f.eks. som underformular, som du gør Region, skal man selvfølgelig huske at \'nulstille\' forespørgslen inden formularen åbnes.
Med \'nulstille\' mener jeg at man blot fjerner kriterierne:
Currentdb.querydefs(\"Query2\").SQL = \"Select * From [Tabel1]\"

Der er også et performace-aspekt af det hele: Access afvikler gemte forespørgsler hurtigts - selvom Access skal bruge et par milliesekunder på at omskrive SQL\'en i forespørgslen, så vinder du dem tilbage mange gange, hvis forespørgslen er meget kompliceret og/eller der er store datamængder.

Endelig er der problemet med PassThrough-forespørgsler, hvor man via ODBC sender en SQL-streng afsted. Her er det ikke muligt at benytte kriterier med form-referencer, som vi gør det her. Dvs, at du er nødt til at øndre Querydef\'en for at benytte PassThrough-forespørgsler, som er afhængige af brugerens indtastninger på en formular.

Dette var blot et par tanker for og imod ændring af querydefs :o)

/Thomas
Avatar billede nih Novice
09. august 2001 - 12:14 #26
>> Thomas

Hvis jeg skal bruge søgningen senere opretter jeg nogle tempTabeller som raporter o.a. er baseret på.
Insert into, update, delete From tempTabel.

Det giver en del performance på netværk, at man kun forespørger de samme data én gang.
Jeg har desuden også haft held med at gemme SQLstrenge i en tabel - Det giver mulighed for at se sidste eller forrige søgning.

mullighederne er mange.

Niels

Avatar billede region Nybegynder
09. august 2001 - 12:39 #27
Jeg får en fejl i linie 2 :

Private Sub Combo16_AfterUpdate()
CurrentDb.QueryDefs(\"qvis\").SQL = \"SELECT * from [vis] WHERE [avance%]\" & Me!Combo16
Me!qvis1subform.Form.recorsource = \"qvis\"
End Sub

den siger at den ikke kan finde feltet qvis1subform der refereres til i udtrykket
Avatar billede region Nybegynder
09. august 2001 - 12:40 #28
øhh her må det være linie 4 ( i scriptet linie 2)
09. august 2001 - 12:42 #29
Det navn, som du skal skrive er det navn, som din underformular-kontrolelement har. Det er ikke nødvendigvis det samme som navnet på den formular, som du benytter som underformular.
Stil dig i design på hovedformularen og klik én gang på underformularen og se hvilket navn, der står i egenskaberne.

/Thomas
09. august 2001 - 12:44 #30
Bortset fra det, så er der også en stavefejl i recorsource! Det skal hedde Recordsource.

Jeg ved ikke om du har copy/paste\'d eller stavefejlen er opstået da du skrev det her på eksperten?
Avatar billede region Nybegynder
09. august 2001 - 12:48 #31
nu er navnet rettet men nu skriver den

application-defined or object-defined error
09. august 2001 - 12:52 #32
hvor/hvornår skriver den det? I hvilken line?
Avatar billede region Nybegynder
09. august 2001 - 12:59 #33
den kommer når den førsøger at køre denne linie. :
Me!qvis1subform.Form.recorsource = \"qvis\"
09. august 2001 - 13:01 #34
Det er stadig D\'et i Recordsource, du mangler (kig 4 spgml over dette :o)
Avatar billede region Nybegynder
09. august 2001 - 13:13 #35
For )¤# /=\"#! da også....


Jeps det var rigtigt. når jeg via dette script fyrer en SQL sætning af kan denne vel indeholde de andre kriterier jeg måtte ønske også ikke...

Her er et nyt spørgsmål til jer begge

http://www.eksperten.dk/spm/96759

lige en sidste ting på falderebet...

sætningen

Me!qvis1subform.Form.recordsource = \"qvis\"

har den ikke kun til opgave at opdatere min underformular.

09. august 2001 - 13:15 #36
jep
Avatar billede region Nybegynder
10. august 2001 - 18:45 #37
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester