Avatar billede puppetmaster Nybegynder
02. juni 2004 - 10:34 Der er 34 kommentarer og
1 løsning

Opdatering af tekstfelt

Hvordan laver man "løbende opdatering af et lager"?
På min formular har jeg 3 felter, Indgang, Udgang og OnStock.
Når Indgang eller Udgang ændrer sig, skal OnStock tælles op med antallet i Indgang og ned med antallet i Nedgang. On the fly. Jeg har forsøgt lidt frem og tilbage, men ikke fundet en ordentlig løsning endnu. (terry, counting on you on this one... :) )
02. juni 2004 - 10:37 #1
På EfterOpdatering på Indgang og Udgang lægger du denne kode:

Me!OnStock = Me!Onstock + nz(Me!Indgang, 0) - nz(Me!nedgang, 0)
Avatar billede jensen363 Forsker
02. juni 2004 - 10:38 #2
Hændelsesproceduren AfterUpdate for kontrolelementerne Indgang og Udgang burde kunne løse det.
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 10:39 #3
Den løsning jeg er nået fremtil virker ikke efter hensigten:
Indgang: 10
Udgang : 2
Lager  : 10

Hvis posten ændres så Indgang er 20, vil lager ikke være Lager + forskellen mellem gammel indgang og ny indgang, men Lager + ny indgang!
02. juni 2004 - 10:41 #4
ok, så skal der bare være lidt forskel på koden på indgang og udgang.

indgang:
Me!OnStock = Me!Onstock + nz(Me!Indgang, 0)

Udgang:
Me!OnStock = Me!Onstock  - nz(Me!nedgang, 0)

Har jeg forstået det korrekt nu?
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 10:42 #5
Det samme gør din kode, thomas.
02. juni 2004 - 10:42 #6
nedgang = udgang (tror jeg nok - du operere selv med 2 forskellige navne)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 10:45 #7
Hov, ja det er Udgang, ikke Nedgang.
Men hvis der f.eks. står 10 i lager og 10 i Indgang på en given post og jeg ændrer posten til f.eks. Indgang = 20 og navigere ud af feltet, ændres OnStock (Lager) ikke til 20 (de 10 i lager + forskellen på gammel-indgang og ny-indgang), men til 30
02. juni 2004 - 10:54 #8
hmm, så du vil have den til at huske, hvad der stod i feltet før du tastede, tage differencen mellem den gamle værdi og den nye, og så lægge den til OnStock?
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 11:00 #9
Check! :)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 11:01 #10
Selvfølgelig noget med at gemme i variabler, men hvordan/hvornår?
02. juni 2004 - 11:04 #11
Hvis det er tilfældet, så skal du flytte koden til BeforeUpdate.

På Indgang ser koden så således ud:
Me!OnStock = Me!OnStock + (Me!Indgang - Me!Indgang.OldValue)

tilsavrende for Udgang:
Me!OnStock = Me!OnStock - (Me!Udgang - Me!Udgang.OldValue)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 11:13 #12
tja, kun ét problem:
Me!Indgang.OldValue og Me!Udgang.OldValue indeholder den værdi der står i posten når den givne post åbnes. dvs. hvis Udgang f.eks. er 10 (lager = 0) når jeg navigerer til posten og jeg så ændrer den til f.eks. 20 (Lager = 10), men opdager at der skulle have stået 200, så vil koden Me!Udgang.OldValue ikke indeholde de 20 jeg indtastede lige før, men de 10 da der blev navigeret til posten!
02. juni 2004 - 11:31 #13
okay, én måde at løse problemet på, er at gennemtvinge en Saverecord på feltets AfterUpdate. Det betyder så, at man ikke efterfølgende kan fortryde med Esc.

Normalt ville jeg nok lave det lidt anderledes, da brugeren selv kan komme i tvivl om hvad der stod og skulle have stået.

Jeg er ikke klar over, hvorfor du gemmer værdierne i Indgang og Udgang på den måde (brugeren skal jo så selv regne ud, at hvis der er en indgang på 8 og der står 37 i forvejen i Indgang, så skal værdien være 45, hvorefter OnStock så bliver et helt 4. tal).

I stedet ville jeg lave et udundet felt, hvor brugeren kunne indtaste tillægget og derefter klikker på en knap som klarer resten.

Hvis du vil benytte variabel metoden, så skal du erklære 2 varible på formular-niveau:
Dim varIndgang as Single  'Long, hvis du kun arbejder med heltal
dim varUdgang as Single

På formularens OnCurrent (ved aktuelt) sætter du variblerne:
varIndgang = Me!Indgang
varUdgang = Me!Udgang

Herefter er det disse variable, som du bruger i steder for Me!Indgang.Oldvalue
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 11:47 #14
Nææææh, sagen er nemlig den at brugeren så IKKE selv skal regne noget ud!

Hvis f.eks. en af posterne viser:
Lager = 10
Indgang = 10
Udgang = 0

og brugeren opdagede at han havde indtastet et forkert antal i Indgang (der skulle have stået 100 i stedet for 10), så kan han bare skrive 100 i Indgang, så klarer Access resten.
Hvis jeg i stedet bruger
Me!OnStock = Me!Onstock + nz(Me!Indgang, 0)
så vil koden jo sætte de 100 oven i det eksisterende lager, hvilket er 110, som jo ikke er korrekt, da forskellen på de 10 først indtastede og 100 sidst indtastede er 90.
Så ville brugeren skulle jo regne ud hvor mange han skulle ændre det til:
F.eks.
Lager = 191
Indgang = 1231
Indgang ændres til det korrekte, 1321
Lad os se.......det er en forskel på 90........så tallet i indgang skal være 90 for at lageret stemmer. Det er da nemmere bare at skrive det rigtige tal, end at trække de 2 tal fra hinanden. nå, jeg havde forventet at der var en lettere løsning, men jeg kan nok benytte SaveRecord funktionen.
02. juni 2004 - 11:54 #15
Jeg har tidligere lavet lagerstyring, hvor alle aktiviteter blev gemt i særskilt tabel. Dvs hvis du ønsker at tilføre 10 enheder, så skrive du bare 10.
Skulle tallet i stedet have været 15, så tilfører man bare 5 til.
For hver af disse transkationer er der dato/tid samt en kort beskrivelse: indgang, udgang, korrektion m.fl.
Det betyder at brugeren selv kan se hvad der er indtaster historisk. Derved er han aldrig i tvivl om, om værdien i OnStock er blevet ændret af ham selv (eller andre - det skal man også tage hensyn til i et flerbrugermiljø)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 12:03 #16
Det er på nøjagtig samme måde dette system virker, bortset fra granuleringen: Det er ikke muligt at se hvem de enkelte transaktioner tilhører (altså historik)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 12:04 #17
Det med at "tilføre 5 til", så mener du IKKE at rette i den post hvor der står 10 i forvejen, men at tilføje en ny post med yderligere 5 enheder, korrekt?
02. juni 2004 - 12:05 #18
Ja, præcis. Der står altid 0 i begge felter, når brugeren åbner formularen. (de kan aldrig rette i gamle poster!)
02. juni 2004 - 12:07 #19
dvs at formularen åbnes som "dataindtastning", hvorved brugeren kun kan se de poster som han selv har tastet siden formularen blev åbnet.
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 12:09 #20
"de kan aldrig rette i gamle poster!"
Der har jeg et problem:
Det skal være muligt at tilføje/fjerne fra lageret, men samtidig også have nogle varer "I ordre"! Så en post kan f.eks. vise
Lager = 10
Indgang = 20
Udgang = 5
I ordre = 100
Når ordren så bliver leveret, skal "I ordre" tælles ned og Indgang tælles op på den givne post! Og det er IKKE sikkert at ordren bliver leveret på én gang! :(
02. juni 2004 - 12:21 #21
hmm, jeg tror altså at jeg ville bygge den anderledes op, således at du har en transaktions/historik-tabel samt en lager-tabel.

Lagertabel:
ProduktID, navn, lagerantal m.m.

Transaktionstabel:
ProduktID, Dato, transaktion, brugerID m.m.
(hvor transaktion er enten indgang, udgang, ordre eller evt korrektion)

Derved kan skal du kun opdatere lagerantal i én tabel og én post (for det aktuelle produktID). Og derved kan du låse for at brugeren kan redigere gamle poster, men i stedet blot korrigere med en ny post.

Men hvis du ikke er enig i denne struktur eller hvis det er for omfattende at lave om, så må du nok bare nøjes med Docmd.Runcommand accmdsaverecord-metoden.
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 12:23 #22
Som det er nu
*************

Lagertabel:
Dato
Varenr
I ordre
Indgang
Udgang
Pris
Bemærkning


Historiktabel:
Varenr
Varebetegnelse
Varebetegnelse_eng
Varebetegnelse_pl
Pris
LagerMinimum
OnStock
Lokation
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 12:25 #23
Hov, der blev byttet rundt på Historik og Lager! :(
02. juni 2004 - 12:27 #24
ok, så er vi jo enige det meste af vejen :o)

Jeg forstår dog stadig ikke, hvorfor der står noget i Indgang og Udgang, når brugeren skal til at taste...?
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 13:17 #25
Brugeren har først og fremmest mulighed for at "opdatere" lageret (Indgang og Udgang).
Dernæst skal det være muligt at sætte noget "I ordre" og efter hånden som ordren kommer hjem, skal "I ordre" mindskes og Indgang øges. Til at starte med står der ikke noget i nogle af felterne.
Når et varenummer er valgt på dropdownlisten, hentes "På lager" og "Lager minimum", så brugeren kan se størrelsen af varelageret og hvad der er sat som min. grænse. (disse felter checkes der på når Indgang og Udgang ændrer sig: I ordre ændrer ikke noget nogen steder)
02. juni 2004 - 14:05 #26
Men er det en én-til-en-relation mellem de to tabeller? Eller er der flere historik poster for hvert varenr?

(undskyld, hvis jeg ikke helt forstår, hvad det er, du fortæller mig!)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 14:15 #27
Det er en en-til-mange relation.
Ingen grund til at undskylde, jeg formulerer det så bare på en anden måde. :)

Jeg kan dog se ét problem:
Hvis f.eks. Indgang skal ændres fra 10 til 8 (altså et lavere tal), KAN man godt skrive -2 i Indgang, men jeg vil da helst have kun positive tal. Så skal brugeren i stedet skrive 2 i Udgang for at det stemmer! ;)
02. juni 2004 - 14:19 #28
korrekt: -2 i indgang er det samme som 2 i udgang.
Eller, som jeg foreslog: korrektion = -2

De fleste brugere kan godt regne ud, at hvis de har puttet 2 æbler for meget i kurven, skal de trække 2 fra igen...eller? :o)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 14:37 #29
thomas: ja, de fleste! ;)
Avatar billede puppetmaster Nybegynder
02. juni 2004 - 14:37 #30
Takker mange gange for hjælpen og snakken.
02. juni 2004 - 14:41 #31
jamen, anytime da! Og selv tak for point :o)
Avatar billede puppetmaster Nybegynder
03. juni 2004 - 09:06 #32
SÅ fik jeg sgu udviklet noget kode der KAN ændre lageret, on-the-fly! :)

Public Sub Indgang_AfterUpdate()
Dim ForskelIndgang As Long
  IndgangNewValue = Me.Indgang.Value
  ForskelIndgang = ForskelIndgang - IndgangOldValue + IndgangNewValue
  Me!OnStock = Me!OnStock + ForskelIndgang
End Sub

Public Sub Indgang_Enter()
  IndgangOldValue = Nz(Me.Indgang.Value, 0)
End Sub


Når der navigeres til Indgang feltet, skal den "gamle" værdi aflæses og gemmes (Indgang_Enter)
Når der navigeres ud af Indgang feltet, skal den nye værdi aflæses (Indgang_AfterUpdate) og lageret tælles ned:  Me!OnStock = Me!OnStock + ForskelIndgang


Tilsvarende for Udgang.
03. juni 2004 - 09:13 #33
ok, der er dog én ting, som undre mig:

Du skriver:
ForskelIndgang = ForskelIndgang - IndgangOldValue + IndgangNewValue

Men ForskelIndgang er altid 0, sådan som den er defineret. Derved kunne linien lige så godt se således ud:
ForskelIndgang = IndgangNewValue - IndgangOldValue
...hvorved vi er tilbage ved det forslag, som jeg stillede 02/06-2004 11:31:52, hvor IndgangOldValue  erstatter Me!Indgang.OldValue, som beskrevet.

Den eneste forskel er herefter at du sætter variablen på Indgang_Enter, hvor jeg satte den på Form_Current.

Om Indgang_Enter er bedre end Form_Current afhænger af resten af koden

Bare nogle tanker :o)
Avatar billede puppetmaster Nybegynder
03. juni 2004 - 09:35 #34
Tja, hvad kan jeg sige? som koden ser ud fungerer det som det skal....
03. juni 2004 - 09:41 #35
Det er jo det vigtigste :o)
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