02. august 2004 - 14:35Der er
132 kommentarer og 2 løsninger
Kan jeg lave et felt som aut. opdateres afhængig af kritirierne?
Kan jeg lave et "ja/nej" felt i en formular som automatisk opdateres, afhængig af om kriterierne er opfyldt eller ej?
Feltet skal fortælle om kunden er aktiv eller ej ved hjælp af ex. "ja/nej". Dette gøres udfra nogle datafelter i samme formular. Disse datafelter skal opfylde visse kriterier, bla. dato, aktiv mv. Ideen er at når jeg har ændret i et datafelt, skal "ja/nej" felter selv ændrer sig hvis kriterierne ikke længere er opfyldt, eller hvis de bliver opfyldt. Kriterierne har jeg allerede i en forespørgsel.
Hvis du har en forespørgsel med nogle kriterier som posten opfylder, vil formularen vise posten. Hvis du i formularen ændrer et felt der indgår i kriterierne, så posten ikke længere opfylder kriterierne, vil posten først forsvinde når du enten Refresher eller Requery.
Hvis du vil styre det fra formularen, kan du i hver datafelt i BeforeUpdate indsætte en kode der kontrollerer om en række kriterier er opfyldt:
If Me.dato = Date() And Me.Aktiv = True Then Me.janej = True Else. Me.janej = False
Hvis forespørgslen returnere en værdi til formularen i form at et værdifelt, kan du lave en If, Then ... Else, som målert på, om der returneres en værdi ( kriterie er opfyldt ) eller ikke ...
If Is Null [Forespørgsel].[Felt1] Then Felt2.Value = "Nej" Else Felt2.Valie = "Ja" End If
hmmm, i dag har jeg en forespørgsel hvor jeg kan tælle antallet af aktive kunder. Denne forespørgsel indeholder 2 til 3 "og" kriterier som kombineres med 3 "eller" kriterier. Jeg har ca. 5000 poster i min formular, hvoraf ca. 1500 opfylder mine kriterier. Når min forespørgsel er "kørt" på de 5000 poster, kan jeg så få access til at indsætte værdien i formularen i et felt oprettet dertil? Dvs. de 1500 som opfylder kriteriet bliver det nye felt til et "JA" og hvis ikke til et "NEJ". Næste gang jeg kører forespørgslen bliver de "nulstillet" og opdateret igen.
jensen > Hvis vi som udgangspunkt forestiller os, at posten ikke opfylder kriterierne og dermed ikke er med i forespørgslen, så skal du stadigvæk igennem en refresh / requery for at kontrollere om posten opfylder foresoørgslens kriterier.
Mugs, nu er jeg ikke så skrap til SQL, men jeg kan se din ide. Men kan jeg til en start bare lave et nyt felt i formularen, et ja/nej felt, som jeg som standard sætter til nej?
Hvis du med standardværdi mener egenskaben i tabellen, gælder denne kun for nye poster.
Min SQL: DoCmd.RunSQL "UPDATE Tabel1 Set felt1 = False" Skal du ikke studere så¨meget, blot ændre Tabel1 og felt1 til de aktuelle navne. Det er blot en SQL du fyrer af i din formular som en VBA kommando.
Prøv at lave en kommandoknap i formularen og indsæt koden i VedKlik. Så vil alle poster i tabellen blive ændret.
Din kode skal se ud som følger i kommandoknappens VedKlik:
DoCmd.RunSQL UPDATE kundedata Set kunde ja/nej = False Do until Me.NewRecord = True [kunde ja/nej] = True DoCmd.GoToRecord acForm, "Form1", acNext, 1 Loop
Do Until o.s.v. gennemløber alle posterne i din formular (alle de poster der opfylder kriterierne), og sætter [kunde ja/nej] til True indtil hændelsen NewRecord indtræffer.
ok, nu har jeg indsat din sætning efter den anden, så der nu står ved klik:
Private Sub Kommandoknap236_Click() DoCmd.RunSQL "UPDATE kundedata Set xkunde = False" Do Until Me.NewRecord = True [xkunde] = True DoCmd.GoToRecord acForm, "kundedata", acNext, 1 Loop End Sub
Det virker, den står og kører alle poster igennem og opdaterer dem alle til "JA". Problemet er blot at det jo ikke er alle der skal ændre til ja, men kun nogle af dem. Hvordan får vi flettet kriterierne ind??
Min formular er et kundedata billeder. Dvs. med alle stamoplysninger på kunder. Navn, adresse m.m. Også med hvornår de sidst har købt, hvornår de får varer næste gang og meget andet. Formularen bruger kundedata fra tabelen. Der er ingen kriterier i den. De kriterier jeg bruger i dag, har jeg i en forespørgsel. Forespørgslen er noget med: Select kundedata..... From kundedata Where (xxx>400) AND (yyy>[Indtast dato]) AND (zzz>=[Indtast dato]) OR (aaa=500) AND (bbb<>købt) AND (ccc=1000) OR (hhh>[indtast dato]) AND (jjj>[indtast dato]) AND (kkk<>0)
Men måske kan jeg indtaste ovenstående Where sætnign direkte i SQL?? Og hvis jeg kan hvordan skal den så udløses, men en ny kommandoknap?
Hej Mugs og Jensen, jeg sidder og eksperimentere lidt også for at lære. Det ser ud til at å den rigtige vej, men hvordan får jeg den til at komme med et "pop-up" billede hvor jeg kan indtaste dato kriteriet?? Den virker fint når jeg har indtastet en fast date i SQL ex. #8/1/2004#, men ikke hvis jeg ex, skriver [Indtast dato] i SQL som jeg gør i en forespørgsel. (Så siger den " systemet kan ikke finde feltet som der ref. til)??
Nedenstående virker naturligvis også i en opdateringsforespørgsel :
UPDATE KundeData SET KundeData.[Ja/nej] = -1 WHERE (((KundeData.xxx)>400) AND ((KundeData.yyy)>[Indtast dato]) AND ((KundeData.zzz)>=[Indtast dato])) OR (((KundeData.aaa)=500) AND ((KundeData.bbb)<>'købt') AND ((KundeData.ccc)=1000)) OR (((KundeData.hhh)>[indtast dato]) AND ((KundeData.jjj)>[indtast dato]) AND ((KundeData.kkk)<>0));
OK Jensen, tak virker perfekt. Men den kommer med fejl når jeg bruger [Indtast dato] istedet for en fast dato. Så markere den "db.Execute strSQL" og skriver: "Der er for få paremetre, der var ventet 1"
Nej jeg har ikke prøvet at lave en opdateringsforespørgsel. Det prøver jeg lidt senere. Er der en fordel i at lave den som opdateringsforespørgsel, fremfor det andet?
Eller skal jeg skrive noget der hvor der står ??????? Et tillægsspørgsmål, i "UPDATE KundeData SET KundeData.[Ja/nej] = -1 " står –1 da for ”nej”?? Det vil jeg tro, for hvis jeg har forstået den rigtigt, så starter den med at ændre alle til Nej og derefter opdatere alle poster der opfylder kriteriet til ja. Er dette korrekt??
ok Jensen. hmm, kan det virkelig passe at jeg i opdateringsforespørgslen godt kan bruge [indtast dato] men ikke i en SQL via kommandoknappen i en formular??
Jensen tak for din hjælp i øvrigt, jeg sætter stor pris på det. Men den kommer stadig med en fejl... Der er en syntaksfejl fordi der mangler en operator??? og markerer... db.Execute strSQL har jeg lige overset noget?
Hej Jensen, godt at høre fra dig og at du også har problemer med SQL sætningen. Den har voldt mig store kvaler. Jeg prøver en opdateringsforespørgsel i stedet. Men hvordan skriver jeg så hvis jeg vil have flere i opdateringsforespørgslen ligesom SQL´en:
Private Sub Kommandoknap236_Click() Dim strSQL As String Dim db As DAO.Database
UPDATE KundeData SET KundeData.[Ja/nej] = -1 WHERE (((KundeData.xxx)>400) AND ((KundeData.yyy)>[Indtast dato]) AND ((KundeData.zzz)>=[Indtast dato])) OR (((KundeData.aaa)=500) AND ((KundeData.bbb)<>'købt') AND ((KundeData.ccc)=1000)) OR (((KundeData.hhh)>[indtast dato]) AND ((KundeData.jjj)>[indtast dato]) AND ((KundeData.kkk)<>0))
AND THEN
UPDATE KundeData SET KundeData.[Ja2/nej2] = -1 WHERE (((KundeData.111)>400) AND ((KundeData.222)>[Indtast dato]) AND ((KundeData.333)>=[Indtast dato])) OR (((KundeData.444)=500) AND ((KundeData.555)<>'købt') AND ((KundeData.666)=1000)) OR (((KundeData.777)>[indtast dato]) AND ((KundeData.888)>[indtast dato]) AND ((KundeData.999)<>0));
ok, nu er jeg ved at være der. Dog er der stadig en lille ting. Når jeg kører
UPDATE KundeData SET KundeData.[Ja/nej] = -1 WHERE (((KundeData.xxx)>400) AND ((KundeData.yyy)>[Indtast dato]) AND ((KundeData.zzz)>=[Indtast dato])) OR (((KundeData.aaa)=500) AND ((KundeData.bbb)<>'købt') AND ((KundeData.ccc)=1000)) OR (((KundeData.hhh)>[indtast dato]) AND ((KundeData.jjj)>[indtast dato]) AND ((KundeData.kkk)<>0));
i opdateringsforspørgs´len, virker det fint, bortset fra at den ikke fjerner dem så opfyldte kriterierne sidste gang. Dvs. jeg skal have den til at nulstille alle posterne i feltet KundeData.[Ja/nej], så den bliver til KundeData.[Ja/nej] = 1 inden den tjekker igennem. Hvordan skriver jeg det?? Kan jeg skrive
UPDATE KundeData SET KundeData.[Ja/nej] = 1
THEN
WHERE (((KundeData.xxx)>400) AND ((KundeData.yyy)>[Indtast dato]) AND ((KundeData.zzz)>=[Indtast dato])) OR (((KundeData.aaa)=500) AND ((KundeData.bbb)<>'købt') AND ((KundeData.ccc)=1000)) OR (((KundeData.hhh)>[indtast dato]) AND ((KundeData.jjj)>[indtast dato]) AND ((KundeData.kkk)<>0));
UPDATE KundeData SET KundeData.[Ja/nej] = -1 WHERE (((KundeData.xxx)>400) AND ((KundeData.yyy)>[Indtast dato]) AND ((KundeData.zzz)>=[Indtast dato])) OR (((KundeData.aaa)=500) AND ((KundeData.bbb)<>'købt') AND ((KundeData.ccc)=1000)) OR (((KundeData.hhh)>[indtast dato]) AND ((KundeData.jjj)>[indtast dato]) AND ((KundeData.kkk)<>0));
MUGS, THEN var bare et gæt fra min side. Men jeg tror det virker nu. jeg er ved at teste. Jeg lavede en opdateringsforsp. som nulstillede alle felter. SÅ kører jeg de andre opd. forsp. bagefter via en kommandoknap. Det virker nok om lidt, så skal i have 1000 tak for hjælpen begge to. I får 50 point hver :-)
Nu vi er ved forklaringerne. Hvordan ser din VBA-editor ud? Hvis du har Access standardfarver her, er det ikke særlig tydeligt hvad der er reserverede ord m.v.
Prøv i Tools > Options > Editor Format at lege lidt med farverne. Så tror jeg du vil blive overrasket over, hvor funktionelt det kan blive.
Ok - Du har vel en fortløbende formular og har sat tekstboksen ind i Detaljesektionen. Prøv at indsætte den samme tekstboks i formularfoden, så burde du få den samlede sum af din DCount.
ok. I og med jeg sætter flere foresp. igang på denne måde og jeg i alle foresp. har mit [Indtast dato] kriterie, kommer den jo med "pop-up" billede fler gange hvor jeg skal indtaste den samme dato. Er der en måde hvorpå jeg kan nøjes med at indtast datoen 1 gang, og så bruger den datoen i alle foresp.??
jensen > Vil det ikke være nok med en Me.Refresh efter kørslen af SQL-sætningerne?
M.h.t. opsummeringen: Hvis der er tale om en fortløbende formular, vil hver tekstboks i detaljesektionen jo have det samme navn. Derfor foreslog jeg at lægge Tekstboksen i formularfoden. I deteljesektionen vil den jo blot vise 1.
Jeg har lavet en ny formular hvor den skal summe resultaterne sammen i en tekstboks. det går egentlig ok, bortset fra at den ikke kan summe totaler.....
M.h.t. popUp: så kan du i formularen indsætte en ubunden tekstboks og indtaste datoen heri. Herefter skal du i hver enkelt forespørgsel referere til denne tekstboks således:
For at referere til et felt i en formular, er du nødt til at definere:
- Objektsamlingen (Forms) - Navnet på objektet i samlingen (Navnet på den aktuelle formular) - Navnet på feltet i objektet (Navnet på feltet der indeholder din dato)
Du er simpelthen nødt til at bevæge dig ned igennem access hieraki for at finde det korrekte felt.
Tænk på det militære hieraki:
En sergent står overfor en samling officerer, hvorfor sergenten er nødt til at henvende sig til den åverste grad:
Hr. General jeg beder om tilladelse til at henvende mig til Oberst TingelTangel
På samme måde med Access, start fra oven og gå nedad.
Og min sum driller stadig.... Jeg har lavet en ny formular hvor den skal summe resultaterne sammen i en tekstboks. det går egentlig ok, bortset fra at den ikke kan summe totaler.....
Mugs jeg vil gerne have total talet i en tekstboks. men den skriver bare ¤fejl i boksen.... Det er da i kontrolelementkilden at jeg skal skrive =sum...osv..?
Jeg synes vi skal tage det step for step. Når vi har fået MsgBox til at fungere ved vi, at det er den vej vi skal. Så vær venlig at prøve mit sidste forslag. Bagefter finder vi ud af det med en Tekstboks.
nej om igen, det er resultatet af en alm. forespørgsel den skal tælle. Jeg har nemlig lavet nogle alm. forespørgsler på baggrund af mine opdateringsforespørgsler. Og det går også fint med hver enkelt tekstboks hvor den indsætter tal-værdierne af hver alm. forespørgsel. Jeg vil bare gerne summe de 5 forskellige værdier sammen.
Men uden at du må misforstå mig MUGS. Men er det ikke meget enkelt at summe resultatet af enten nogel teksbokse sammen eller bare summe forespørgslerne (de alm.) sammen?
Dim a As Byte, b, c, d a = Me.Felt2 b = DCount("*", "Tabel1", "[Felt2] =" & a) c = DCount("*", "Tabel2", "[Felt2] =" & a) d = DCount("*", "Tabel3", "[Felt2] =" & a) MsgBox "Værdien " & a & " Forekommer i:" & vbNewLine & "Tabel1: " & b & vbNewLine & "Tabel2: " & c & vbNewLine & "Tabel3 :" & d
Sorry MUGS jeg havde skrevet noget men det forsvandt åbenbart.
Jeg har talt alle 7 forespørgsler. Talresultaterne har jeg i tekstbokse i en formular. Det er fint. Nu vil jeg bare gerne have en tekstboks med summen af alle de tal jeg kan se i de 7 tekstbokse. Der siger du jeg kan lave en ny tekstboks, ubundet, i fomularfoden med følgende i "kontrolelementkilden":
Mern for at skrue tiden lidt tilbage og have et udgangspunkt, vil jeg anbefale, at du som et forsøg prøver mit forslag Kl 18:51:10. Hvis det fungerer har vi da noget at gå videre med.
Jeg vil stadig gerne se din db. Har du mulighed for at alette alle data og oprette nogle "Anders And" poster?
Godmorgen, så er jeg frisk igen :-) Alt virker indtagen summen af de nævnte forespørgsler. Mugs jeg har gjort som du sagde i 18:51:10 så den nu ser ud som følger:
Private Sub Kommandoknap104_Click()
DoCmd.SetWarnings False DoCmd.OpenQuery "Tæl kun 1", acNormal, acAdd DoCmd.OpenQuery "Tæl kun 2", acNormal, acAdd DoCmd.OpenQuery "Tæl kun 3", acNormal, acAdd DoCmd.OpenQuery "Tæl kun 4", acNormal, acAdd DoCmd.OpenQuery "Tæl kun 5", acNormal, acAdd
Men jeg er stadig ikke med på hvad der skal stå i stdet for TABELNAVN og FLETNAVN Det er jo 5 forskellige tabeller den skal tæle og lægge sammen. Hvad skal jeg skrive i TABELNAVN og FELTNAVN?
I øvrigt, tror jeg ikke at ovenstående VBA vil fremkomme med det rigtige resultat. Som jeg ser det, tæller den i tabellen og ikke resultatet af min forespørgsel. Det jeg vil have talt ligger i en forespørgsel. Kan jeg så bare udskifte "TABELNAVN" med "FORESPØRGSELSNAVN"??
Som udgangspunkt laver du en kommandoknap og lægger koden i dennes VedKlik hændelse. Når du har kørt en opdateringsforespørgsel, er data jo ændret i tabellen, men du kan sagtens tælle i en udvælgelsesforespørgsel. Du udskifter blot 2Tabelnavn" med navnet på din forespørgsel.
MUGS, der maglede et "efter "[kunde1]... Nu brokker den sig ikke mere over det. Men nu siger den "Run-time error 13, type mismatch og markerer...: a = DCount("*", "kundedata", "[kunde1]" = -1)
MUGS, det kan godt være det er mig der er dum eller snorksover, men er "felttypen i tabellens designvisning", ikke det jeg lige har beskrevet ovenfor? I access klik på tabeller, åben tabellen "Kundedata" i designvisning, og marker feltet hvor jeg vil se egenskaber. I det her tilfælde Kunde1. Nederst til venstre kan jeg så se feltet egenskaber. At du skriver det samme to gange gør det jo ikke bedre...*LOOL*
Hvis vi nu i stedet siger at det ikke er tabellen kundedata den skal hente kunde1 fra, men i stedet en forespørgsel der hedder "tæl1". Der skal den egentlig bare tælle antallet af posten i resultatet af forespørgslen. Gør det det lettere?
Private Sub Kommandoknap4_Click() Dim a As Byte, b a = DCount("*", "TBLkundedata", "[kunde1] = 0") b = DCount("*", "TBLkundedata", "[kunde1] = -1") Me.tæltotal = a + b End Sub
Helt dum er du da ikke, men hvis du er så her jeg da en stor aktie i din dumhed :o)
Grundlæggende er det jo blot antallet af poster i 3 forskellige forespørgsler, jeg gerne vil have lagt sammen. ex. Forepørgsel1 indeholder 768 poster, Forepørgsel2 indeholder 123 poster og forespørgsel3 indeholder 15 poster. Ergo 768+123+15=906. Altså skal der stå 906 i en tekstboks i en formular. Hvor svært kan det værre...? Åbenbart meget svært... * :o)
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.