10. maj 2001 - 23:12Der er
11 kommentarer og 1 løsning
Sql eller Vba????
Hej! Jeg er skal igang med at lave en lidt komplicerede funktion til min database. Jeg skal, når jeg udskriver en faktura trække vare på ordrelinien fra lageret, og hvis lager når ned på den enkelte vares minimum skal en pop up skærm oplyse brugeren at varen er nede på den minimum. Tilsidst skal funktionen kalde udskriv faktura() funktionen. Rimelig kompliceret. Er der nogen der ved om VBA kode eller SQL kode er bedst???
Jeg vil umiddelbart sige at svaret er: begge dele. Med mindre, at du med SQL mener en stored procedure på en SQL server eller lign.
NOget andet er: burde du ikke trække varen fra varelagret allerede når du indtaster ordren (og ikke når du udskriver fakturaren)? Ellers risikerer du jo at have solgt flere varer end du har på lager - m.m. at faktura altid udskrives med det samme.
Men hvis du forventer en færdig løsning, skal vi have en hel del flere oplysninger (og måske også lidt flere points, da det ikke er noget man bare lige kan svare på med en enkelt sætning eller 2)
Vi skal vide hvilke tabeller som er impliceret, hvad de forskellige felter hedder og lidt flere detaljer om hvordan dit skæmbilledeflow fungere.
Tilsidst skal du huske at angive hvilken version af Access du benytter.
Jeg tror du skal vænne dig til ikke at tænke SQL ELLER VBA, men derimod SQL OG VBA!
SQL tillader dig at lave meget avancerede forespørgsler (queries) ind i mange databaser. Det er normalt ikke at forvente, at dødelige brugere er i stand til at formulere disse forespørgsler, så derfor kan bruger-interfacet implementeres i fx VBA, således at SQL forespørgslerne genereres af VBA koden på baggrund af brugernes kommandoer.
Grunden til at varene trækkes fra når ordren udskrives er at købet er bindne når ordren faktureres. Ellers skulle funktionen kunne smide varne tilbage på lageret hvis ordren annulleres, og det gør bar funktionen endnu mere kompliceret. Der er tre tabeller som funktionen skal gennemløbe, ORDRE, ORDRELINIE, FAKTURA: Jeg har lavet en psuodo kode som du kan se her:
Psodokode for styr varelager:
ved klik på knappen ”Udskriv faktura” i odreformularen sker der følgende hændelse:
Styr varelager() funktionen bliver aktiveret, og den starter med at se på ordrenummeret for den aktive ordre i ordretabellen. Derefter søger den et tilsvarende ordrenummer i ordrelinie tabellen. Når den er fundet ser den på varenummeret på den enkelte ordrelinie, og finder det samme varenummer i varetabellen. Lagerantallet der svare til varenummeret i varetabellen bliver dernæst fratrukket de antal vare på den enkelte ordrelinie. Er der mere end en ordrelinie går den videre til den næste. For hver gang dette sker undersøger funktionen om lagerantal skulle blive mindre eller lig med lagerminimum for den enkelte vare. Skulle dette være tilfældet kaldes funktionen Signaler minimum() som fortæller brugeren at den og den vare er nede ved minimum ved hjælp af et lille vindue som popper op på skærmen. Herved er brugeren gjort opmærksom på at det er tid til at bestille igen. Til sidst kaldes funktionen udskriv faktura() og ordren udskrives.
Jeg har kigget på det og er kommet frem til følgende løsning (som er en længere sag)
Du manglede at give mig et par oplysninger, så jeg har måttet tage et par ting for givet: -Du benytter Access 2000 (ellers virker det ikke på denne måde) -Du har en tabel, som hedder \"Varenumre\", som har følgende 3 numeriske felter (sikkert flere): \"Varenr\", \"Antal\" og \"Minimum\" -Din \"Ordreline\"-tabel inderholder disse to numeriske felter: \"Varenr\" og \"Antal\" -Din \"Ordre\"-tabel indeholder nøglefeltet \"Ordrenr\", som ligeledes er numerisk.
Hvis dit system afviger fra ovenstående skal du ændre lidt i koden (formentlig skal du omdøbe feltnavnene i koden)
Du bør lægge en Validation rule (betingelse) ind på \"Antal\" i varenr-tabellen som hedder: >=0 Hvis du gør det, så vil koden automatisk forhindre at dit varelager kommer under nul (hvis en kunde har købt 50 og der kun var 30 enheder på lager!)
Hvis du så har en Ordre-formular, som har en Kommando-knap, så kunne koden se således ud:
\'****** Kode start ****** Private Sub cmdUdskriv_Click() On Error GoTo Err_cmdUdskriv Dim cn As ADODB.Connection, rs As ADODB.Recordset Dim SQLStr As String, AntalPosterOpdateret As Long, Besked As String Set cn = CurrentProject.Connection SQLStr = \"UPDATE Ordrelinie INNER JOIN Varenumre ON Ordrelinie.Varenr = Varenumre.Varenr SET Varenumre.Antal = [Varenumre].[Antal]-[Ordrelinie].[Antal] \" & _ \"WHERE Ordrelinie.Ordrenr=\" & Me!Ordrenr cn.Execute SQLStr, AntalPosterOpdateret SQLStr = \"SELECT Varenumre.*, [Varenumre].[Antal]-[Minimum] AS Diff \" & _ \"FROM Ordrelinie INNER JOIN Varenumre ON Ordrelinie.Varenr = Varenumre.Varenr \" & _ \"WHERE ([Varenumre].[Antal]-[Minimum])<0 And Ordrelinie.Ordrenr = \" & Me!Ordrenr Set rs = New ADODB.Recordset rs.Open SQLStr, cn, adOpenStatic, adLockReadOnly If rs.RecordCount > 0 Then Do Besked = Besked & vbNewLine & rs!Varenr rs.MoveNext Loop Until rs.EOF MsgBox \"Følgende varenumre bør bestilles: \" & Besked, vbInformation, \"lagerbeholdning under minimum!\" End If Exit Sub Err_cmdUdskriv: Select Case Err Case -2147467259 MsgBox \"Du kan ikke udskrive denne faktura, da der ikke er vare nok på lager!\", vbCritical, \"Faktura kan ikke udskrives!\" Case Else Call Eval(\"MsgBox(\"\"\" & \"Fejlkode: \" & Err & \"@@\" & Err.Description & \"\"\", \" & vbCritical & \", \"\"\" & \"Fejl!\" & \"\"\")\") End Select End Sub \'****** Kode slut ******
Som sagt, så har jeg måttet tage en masse ting for givet - men hvis det kun er feltnavne eller tabelnavne som er anderledes, så burde det være til at ændre dem i koden, så de passer til dit system. Hvis nogle af de involverede felter er tekst-felter, så skal koden også ændre - i så fald må du lige fortælle hvilke det drejer sig om. Hvis du ikke har feltet \"Antal\" i din ordrelinie-tabel, så skal der laves en del ændringer (men det har du vel også? Kunden kan vel godt bestille mere end én vare ad gangen!)
Pyh...det var en længere smøre. Skriv igen, hvis det kniber med forståelsen.
Hej igen! Compileren kan ikke lide denne sætning \"Dim cn As ADODB.Connection, rs As ADODB.Recordset \". Jeg tænkte om jeg kunne sende databasen til dig, det ville nok være en del nemmere. Den fylder kun en mb pakket. Hvad siger du til det???
Hej, Jeg har smidt 50 point oven i. Det har du for tjent.
Synes godt om
Ny brugerNybegynder
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.