Avatar billede virtualfriend Nybegynder
10. maj 2001 - 23:12 Der 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???
10. maj 2001 - 23:46 #1
Hej,

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.

/Thomas
Avatar billede jespernaur Nybegynder
10. maj 2001 - 23:55 #2
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.

Mvh
Jesper Naur
Avatar billede virtualfriend Nybegynder
11. maj 2001 - 12:16 #3
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.

Hvis det kan hjælpe dig??

Jeg sætter pointne lidt op..
11. maj 2001 - 22:08 #4
Hej igen,

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.

/Thomas
11. maj 2001 - 22:10 #5
(...fortsat)

Du skal selvfølgelig også selv lige sørge for at fakturaen bliver udskrevet...det har jeg ikke beskæftiget mig med...
Avatar billede virtualfriend Nybegynder
11. maj 2001 - 23:09 #6
Det ser meget fint ud. vil lige teste det.
Vender snart tilbage..
Avatar billede virtualfriend Nybegynder
11. maj 2001 - 23:34 #7
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???

12. maj 2001 - 08:01 #8
Gør bare det - jeg kan kigge på det i nat, så du har det i morgen, søndag.

(jeg tror, at det er fordi du bruger Access 97! Er det korrekt?)

tj@makeiteasy.dk
Avatar billede virtualfriend Nybegynder
12. maj 2001 - 11:55 #9
Jeg har sendt til dig.
12. maj 2001 - 23:50 #10
hmmm, jeg har ikke modtaget noget???
Hvornår sendte du den?
Avatar billede virtualfriend Nybegynder
13. maj 2001 - 00:16 #11
Nu skulle du ha\' den.
Avatar billede virtualfriend Nybegynder
13. maj 2001 - 12:06 #12
Hej,
Jeg har smidt 50 point oven i. Det har du for tjent.
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