Order genereren vanuit een offerte

Status
Niet open voor verdere reacties.
Time flies... Was ook meer bij wijze van spreke. Neemt niet weg dat ik nog steeds de doos met de allereerste Access versie in de kast heb staan.
 
Valt wel mee. Niks mis mee om een stukje geschiedenis vast te houden en ik heb een grote boekenkast. Of moeten we wat jou betreft alle Rembrandts etc. in de open haard mieteren? Wel fijn te weten dat je ook een woordje Engels spreekt :D.
 
Nou niet intelligent gaan doen :)
 
In een eerste toevoeg query voeg je de offertegegevens die je wil overzetten toe aan de tabel orders en daar maak je een nieuw order mee aan. Laten we voor het ID veld een autonumber nemen en het OrderID noemen. Zorg ervoor dat in de tabel Orders ook een veld is voorzien waarnaar je de ID van de offerte kan wegschrijven . Laat het ons bv. OfferteID noemen

Daarna ga je de orderlijnen aanmaken. Deze moeten natuurlijk aan de juiste order hangen. De offertelijnen zijn gekoppeld aan de offerte via het ID veld OfferID van de Offerte tabel en het FK veld in de OfferteInhoud tabel OfferteID. In je voorbeeld mis ik de relatie tussen Offerte.OfferID en OfferteInhoud.OfferteID maar ik vermoed dat het wel de bedoeling is dat in OfferteInhoud.OfferteID de ID staat van de bijbehorende offerte. In de toevoegquery voor de orderlijnen kan je een link maken tussen de tabellen Orders en OfferteInhoud op OfferteInhoud.OfferteID = Orders. OfferteID en daarmee de OrderID van de nieuw aangemaakte orderlijn ophalen . Deze kan je dan toevoegen aan het veld Orderlijnen.OrderID (of de naam die je aan het koppelveld Orders -> Orderlijnen gaat geven) zodat je de lijnen aan de juiste hoofding koppelt.

Hallo NoellaG,

Ik heb een aantal pogingen gedaan om dit te realiseren.
Het toevoegen van de (hoofd)order gaat goed. Het gaat echter mis bij het toevoegen van Offerte-inhoud naar Order-Inhoud. Ik krijg een foutmelding.

Ik heb de database bijgevoegd. Zou je me misschien verder kunnen helpen?

Alvast bedankt.
 

Bijlagen

Stuur een PM als alleen noella er naar mag kijken, dan blijven anderen er waarschijnlijk wel af. Of je daarmee sneller wordt geholpen, is uiteraard een heel andere vraag...
 
Octafish, uiteraard mag iedereen reageren, maar aangezien ik reageer op een bericht van Noella heb ik dit ook genoemd in mijn reactie.
Maar uiteraard mag iedereen reageren, heel graag zelfs! Dus mocht je me verder kunnen helpen dan hoor ik het graag ;)
 
Je probeert de tabel Orderinhoud te vullen met een ordernummer (17 bijvoorbeeld) die niet bestaat in Orders. Dus logisch dat het dan niet gaat; je moet éérst de order aanmaken (die zal geheid een ander nummer krijgen als de offerte), vervolgens dat Ordernummer opvragen en dát nummer gebruiken in de Insert query. Ik zou de hele handel gewoon met VBA doen, en al helemaal de combinatie Macro's + VBA uit mijn hoofd zetten. Ofwel je doet alles met macro's, ofwel je doet alles (hooguit wat ingebouwde macro's, zoals bladerknoppen) met VBA. Dan hoef je ook maar op één plek te zoeken als je iets belangrijks moet aanpassen.
Daarnaast lijkt het mij essentieel dat één offerte kan leiden tot één order. En dus niet tot meerdere orders.
 
Bedankt voor je reactie Octafish.

Ik begrijp het. Ik heb alleen geen idee hoe ik het ordernummer op moet vragen en vervolgens in de toevoeg query gebruiken?
Moet ik dat in de query zelf meegeven?

Visual basic vind ik prima (het maakt mij eigenlijk niet zoveel uit, als het maar werkt), het probleem is alleen dat ik met VBA geen idee heb waar ik moet beginnen en welke code ik überhaupt moet gebruiken. Vandaar dat ik het altijd eerst via een Macro of een formule probeer op te lossen.

Kun je me verder helpen?
 
En dat terwijl die macro editor zoveel moeilijker werkt dan VBA :). Althans: ik snap echt geen jota van dat ding. In VBA kun je een opdracht intypen, en vervolgens met IntelliSense alle noodzakelijke parameters vullen. Kortom: als je even wat tijd steekt in de VBA editor, zul je zien dat snelheidswinst met sprongen omhoog gaat, je code leesbaarder wordt en veel flexibeler. Wellicht zal een fervente macro gebruiker dat ook tegen mij zeggen :D.

Jouw omzet procedure bestaat eigenlijk uit twee stappen:
1. de Offerte overzetten naar de Order tabel. An sich niet zo moeilijk: je pakt, zoals je nu ook doet, je Toevoegquery op en maakt daarmee een nieuw record aan in de tabel Orders. In die tabel heb je nu een Autonummerveld staan als OrderID. Ik weet niet of dat wenselijk is (ik zou zelf voor een stijl kiezen die gaten in de nummering voorkomt en waarbij je een jaartal gebruikt, zodat je elk jaar met 1 kan beginnen). Je hebt geen reactie gegeven op mijn laatste opmerking, en dat is wel jammer want dat zou wel eens essentieel kunnen zijn voor het systeem. Als je namelijk een Order hebt toegevoegd, moet je dat ordernummer opvragen. Komen we bij
2. Als het record is toegevoegd, moet je dat nummer opvragen uit de tabel. Dat kun je doen door, als er een Autonummerveld aanwezig is, het record met het hoogste nummer op te vragen met een recordset, en te filteren op het Offertenummer dat je óók in de Order tabel hebt gezet. (daar zie je het belang van unieke Offertenummers bij Orders, want als één offerte is gelinkt aan één order, kan het nooit fout gaan).
3. Nu je het OrderID hebt, kun je de tabel Order-inhoud gaan vullen. Hierbij heb je het veld Offertenummer dus niet meer nodig, want de offerte is gelinkt aan de Order (zoals het hoort).
 
Ik vrees dat dit boven m'n pet gaat.
Mijn idee was vrij simpel:

Stap 1. De offerte omzetten naar een order. Dat werkt. Dus geen probleem.
Stap 2. De offerte inhoud aan de order toevoegen. Daarbij was 't idee om het laatst toegevoegde ordernummer op te halen en deze te gebruiken bij order ID zodat deze altijd aan de laatst toegevoegde order wordt gekoppeld. Ik heb alleen geen idee hoe ik met de query het laatste ordernummer op kan halen en deze waarde als orderID te gebruiken.

Dit zou toch ook moeten werken? Of denk je daar anders over?

Zo ja, kun je me verder helpen met het ophalen van het laatste ordernummer?
 
In het bijgewerkte bestand is een nieuwe knop: create Order VBA. Daar zie je voorbeelden van 2 manieren om recordsets via VBA te behandelen: via een recordset object of via een command object.
Aangezien de voorbeelden de ADODB bibliotheek gebruiken, moeten die wel opgeladen worden via Tools -> References. Ik heb de Microsoft ActiveX Data Objects 6.1 Library opgeladen. Indien je op jou systeem een oudere of nieuwe versie hebt kan je foutmelding "Missing reference" in dat venster krijgen. Dan moet je deze uitvinken en de overeenkomstige versie van jou systeem opladen.

succes
 

Bijlagen

Ik heb mijn voorstel uitgewerkt in je db. Komt verder geen extra bibliotheek aan te pas, dus werkt altijd. Gebruik alleen extra bibliotheken als dat een meerwaarde heeft :).
 

Bijlagen

De ADODB is een standaard Access bibliotheek voor het werken met recordsets. Meerwaarde: je kan alle objecten van de ADODB gebruiken en kan werken met het Command object, zodat je niet moet zitten knoeien met het aanpassen van bestaande query definities. Command objecten zijn ook niet zichtbaar in het Access objecten overzicht, dus de gebruiker kan er moeilijk aan. ADODB recordsets zijn ook meer flexibel dan DAO http://www.databasedev.co.uk/ado_vs_dao.html#:~:text=DAO%20stands%20for%20%22Data%20Access,for%20%22ActiveX%20Data%20Objects%22.&text=ADO%20is%20a%20relatively%20new,to%20data%20than%20recordsets%20do.
De bibliotheek wordt niet standaard opgeladen omdat niet elke database met recordsets moeten werken en de bibliotheek kan verschillen per Access versie.
Maar zeker een meerwaarde.
 
Zoals ik zei: gebruik het alleen als je het nodig hebt. Dit topic lijkt mij niet het juiste podium voor een college over recordsets. In deze vraag kun je prima uit de voeten met de ingebouwde DAO techniek die perfect werkt.
 
Beste,

Ongelooflijk hoe jullie dat toch steeds zo vlot voor elkaar krijgen....Zijn jullie Access ontwikkelaars van beroep??

Ontzettend bedankt, het werkt fantastisch. Ik ga me eens verdiepen in beide oplossingen.

Ongetwijfeld zal ik weer "in de lucht" komen bij andere uitdagingen/problemen ;-).

Nogmaals dank.
 
Blij je geholpen te hebben. Ik ben zeker geen Access ontwikkelaar. Een deel van mijn taak als DBA bestaat eruit om alle rondslingerende access applicatietjes die ik vind te verwijderen :D. Maar vroeger heb ik daar wel mee gewerkt.
 
Haha, dat meen je niet. Ook zonde van al die mooi Access databases ;-).

Maar respect voor je kennis i.i.g. (en ook die van Octafish). Beetje jaloers...

Nog 1 klein dingetje:

- Bij het aanmaken van de order wordt het veld "partnumber /description" niet meegenomen. Ik heb geprobeerd om dit veld in de module mee te nemen, maar dan krijg ik syntax foutmelding.

In principe hoeft dit veld natuurlijk niet gekopieerd te worden, maar kan deze info uit de artikelen gehaald worden. Is er misschien een manier om alle regels te verversen zodat dit veld wel gevuld wordt? Als ik handmatig de artikelcode invoer, komt deze info wel naar voren.
 
Laatst bewerkt:
bij het command object kan je het veld aan de commandtext bijvoegen. Wel zorgen dat het in de INSERT statement op dezelfde plaats komt as in de SELECT statement

Code:
 With cmdAddOrderDetails
        .ActiveConnection = CurrentProject.Connection
        .CommandType = adCmdText
        .CommandText = "INSERT INTO [Order-inhoud] ( OrderID,  Item, Qty, Unitprice, Discount, Total, Artikeltekst, ArtikelID, Artikelnummer, [B][Description / partnumber][/B] ) " & _
                        " select " & lngOrderHeader & " , Item, Qty, Unitprice, Discount, Total, Artikeltekst, ArtikelID, Artikelnummer, [B][Description /partnumber] [/B]" & _
                        " from [Offerte-inhoud] where OfferteID = " & lngOfferID
        Debug.Print .CommandText
        .Execute lngCountDetails
    End With

Je maakt het jezelf wel moeilijk met veldnamen met spaties en schuine strepen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan