02. juni 2004 - 10:34Der 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... :) )
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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
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?
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!
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
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.
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ø)
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)
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?
"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! :(
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.
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)
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! ;)
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
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
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.