Probleem met Access 2003 formulier

Status
Niet open voor verdere reacties.

remcop1989

Gebruiker
Lid geworden
29 mrt 2012
Berichten
492
Hallo, daar was ik weer :D:o

Ik ben bezig aan een offerte-formulier in Access. De offerte kan voor een veelheid aan producten opgesteld worden. Sommige offertes hebben maar 1 artikel en andere 10 verschillende. Wat ik nu wil:
Alle gegevens kunnen uit een tabel gehaald worden. Artikelcode is hierbij "de sleutel".

- Een dropdownbox met artikelcodes en een dropdownbox met een artikelomschrijving. Als uit het dropdownbox een omschrijving wordt gekozen moet de bijbehorende artikelcode (te vinden in de tabel) automatisch gevuld worden en andersom ook.
- De prijs kan op basis van artikelcode ingevuld worden.

Ik heb het internet al afgestruind maar niets gevonden dat mij helpt....
 
Mocht je dat nog niet hebben: maak in ieder geval een Hoofdformulier op basis van Offerte(nummer), en een subformulier voor de artikelen, die is gebaseerd op een tabel OfferteRegels (of een andere naam natuurlijk) met een koppeling naar OfferteNummer waarin je voor elk artikel een nieuwe record maakt. Dan ben je al een heel eind.
Jouw vraag wordt regelmatig gesteld, en beantwoord. Zoek maar eens in het forum op 'afhankelijke keuzelijsten. Maar eigenlijk is het nog veel simpeler: zoeken doe je op doorgaans op Artikelomschrijving, maar je slaat het Artikelnummer op. De keuzelijst laat dus omschrijvingen zien, maar is gekoppeld aan het veld Artikelnummer. Wil je daarnaast ook nog kunnen zoeken, dan kopieer je de keuzelijst, en maak je de breedte van het veld ArtikelNummer groter dan 0 cm. Je ziet nu de artikelnummers. Beide keuzelijsten zijn gekoppeld aan Artikelnummer, dus het maakt niet uit welke van de twee je gebruikt; de andere loopt gewoon mee.
 
Ik snap er geen **** van.......:o

Subformulier, hoofdformulier? pfff..

Ik maak een vervolgkeuzelijst met artikelcode en omschrijving. Kopieer deze, maar dat geeft geen resultaat.

Sorry, ik ben het nog allemaal aan het leren.
 
Ik zou zeggen: kijk dan in ieder geval in de handleidingen sectie en zoek de Access cursus op; daar wordt het principe van databases in uitgelegd, en komen formulieren en subformulieren ook aan bod.
Voor eens een heel stuk beter: post de database mee, dan kunnen we zien wat je aan het maken bent. Nu moeten we er maar vanuit gaan dat je op de juiste manier werkt, en niet een onzinnig formulier aan het maken bent. Iets waar ik overigens ernstig voor begin te vrezen...
 
Ik ben de handleidingen door aan het nemen. Dank dat je me daar op wees! :)

In de bijlagen de database. Ik heb de tabel wel gevuld met fictieve gegevens i.v.m. info die niet naar buiten gebracht kan en mag worden.

Ik zie de reacties graag tegemoet :)

EDIT
Ik heb de database in de bijlagen even aangepast en het volledig (aangepaste en grotendeels fictieve) productenbestand eringezet. Prijzen etc. kloppen niet hierin.

De handleidingen in het forum zijn toch handig ;)



Ik denk dat even overnieuw het beste is.......:

Wat ik wil:
- een Access database waarmee offertes makkelijk opgesteld kunnen worden, maar OOK teruggezocht.
- Iedere offerte is anders en het is mogelijk dat er afwijkende prijzen gehanteerd worden.
- een complete offerte samen kunnen stellen a.d.h.v. in te vullen velden. Sommige gegevens moeten vervolgens weer opgeslagen worden in andere tabellen. Deze offerte moet uit te printen zijn en in PDF op te slaan zijn (middels cutePDF writer b.v.)
- de offertes moeten terug te zoeken zijn. B.V. het offerte nummer of bedrijfsnaam invullen en dan alle offertes te zien krijgen in een lijst. Ook moet het mogelijk zijn de offerte aan te passen en opnieuw te printen/als pdf op te slaan.
- door meerdere personen te gebruiken (2 tot 3)

Wat ik daar nu (na verdieping in de theorie) voor denk nodig te hebben:
- 3 tabellen:

1) Artikelen
- gevuld met: artikelcode, omschrijving, prijs per week, prijs per dag, minimale huurprijs, schoonmaakkosten, opmerkingen
- unieke records. geen enkele rij is hetzelfde.

2) Offertedetails
- gevuld met: offertenummer, artikelcode, aantal, klant-id, prijs voor artikel
- hier kunnen dus meerdere dezelfde offertenummers komen te staan maar afwijkende artikelcodes/aantallen/prijzen

3) Klanten
- gevuld met: klant-id, bedrijfsnaam, contactpersoon, adres
- hier kunnen dus meerdere dezelfde bedrijfsnamen maar met andere contactpersonen komen

Offertes
- een overzicht van alle offertes met offertenummer en onderwerp en bedrijfsnaam
- geen dubbele waarden, ieder offertenummer komt 1 keer voor.

Graag de reactie van een expert hierop :o
 

Bijlagen

Laatst bewerkt:
Je hebt in ieder geval ook een offertetabel nodig.
Daarin zet de de algemene offertegegevens (offertenummer, datum, klant).
De artikelen zelf zet je dan in een tabel offerteregels.

Zet eerst eens op basis van wat je nu weet een nieuwe tabelstructuur op.
Maak daarna formulieren om de gegevens te onderhouden en rapporten om de gegevens weer te geven.
Als dat goed staat kijken we wel weer verder.
Kortom, eerst de basis goed neerzetten.

Tardis
 
Ik kan je database nu niet openen (mag hier niets downloaden) dus dat moet even wachten. Maar ik vind dat je netjes een overzicht hebt gemaakt met wat je wil/nodig hebt. Dit is handig. Ik ben ook niet een echte expert daarvoor verwijs ik graag naar een van de andere maar ik vind het wel leuk om er even voor je naar te kijken.
 
Ik heb de tabellen structuur opnieuw ingericht met relaties.

Graag had ik geweten of dit zo klopt naar jullie idee of dat er nog iets aangepast moet/kan?

Let wel: de prijzen moeten in eerste instantie automatisch bij het artikel ingevuld worden maar daarna wel handmatig aangepast kunnen worden. De aangepaste prijs moet dan in de offertedetails tabel opgeslagen worden, maar niet in de artikelen tabel. Dit is echter voor later orde.
 
niet helemaal. je wilt dus in je offertetabel ook een veld met klantprijs. Deze kan je met de start gelijk maken aan de artikel prijs maar later per klant per artikel aanpassen. bedenk vooraf of je per klant ieder artikel wilt kunnen wijzigen of dat een klant standaard een percentage korting krijgt wat voor alle artikelen van de klant geldt.
 
Daar zal ik zeker over denken.

Echter, desondanks wil ik mijn offertes flexibel houden. Dus feitelijk toch bij de start van het formulier de standaard prijs uit de tabel productoverzicht laten invullen voor het artikel, maar daarna toch de prijs kunnen aanpassen. De prijs waarmee de offerte opgeslagen wordt (als dat kan in access?) die wil ik laten opslaan in de tabel offertedetails. De tabel productoverzicht wordt dus alleen een tabel waaruit gelezen wordt.

Edit:
Er zijn zowel huur als koop offertes mogelijk. (verschil zit hem in de totale opstelling hiervan)
Tot slot zijn er NOG 2 variaties: offertes voor nieuwe klanten en offertes voor klanten die vaker wat bestellen. (dit heeft alleen effect op een stukje tekst op de 1ste pagina)
Daarbij wil ik nog opmerken dat al deze variaties in 3 talen verstuurd KUNNEN worden: Nederlands, Duits en Engels.

Hoe kan ik dit het beste logisch verwerken?
Is het b.v. slim om deze gegevens in de tabel offertes te laten verwerken zodat op basis daarvan het juiste (sub)formulier wordt aangemaakt?

Bovendien loop k tegen een nieuw probleem aan: ik heb nu relaties ingesteld tussen de tabellen zoals mij dat goed lijkt. Vervolgens heb ik het ook voor elkaar dat in tabel "offertes" in het veld "bedrijfsnaam" enkel gekozen kan worden uit de bedrijfsnamen zoals ingevuld in tabel "Klanten". Ik wil nu dat vervolgens in het veld contactpersoon (tabel offertes) enkel gekozen kan worden uit contactpersonen van het bedrijf me*bedrijfsnaam* uit het gerelateerde veld.
Dit vind ik niet in de handleidingen terug.
 
Laatst bewerkt:
De db die je hebt gepost bevat nog steeds maar één tabel. Dus dat kijkt niet overdreven jofel. Allicht dat je het voorbeeld kunt vervangen door de meest recente versie?
Je structuur (op papier) begint al wel ergens op te lijken, dus je bent op de goede weg. Maar het kan altijd beter. Bijvoorbeeld de manier waarop je prijzen vastlegt.
Je gebruikt een tabel [Produkten] voor de produktgegevens met de standaardprijzen. Je hebt daarin nu twee velden voor dagprijs en weekprijs. Als daar een vaste relatie tussen zit (vast afgerond percentage bijvoorbeeld) dan kun je met één veld volstaan, en de overige prijs(prijzen, als er bijvoorbeeld ook nog een maandtarief bijkomt) berekenen. Andersdeze oplossing met twee velden ook wel bruikbaar. Een berekend veld (via een query) is echter betrouwbaarder, want klopt altijd. Als nu iemand bij Dagprijs € 23,00 invult, en bij Weekprijs € 8,00, dan klopt dat natuurlijk niet. Gebruik je een functie om de prijs uit te rekenen (bijvoorbeeld Weekprijs = 4 * Dagprijs) dan kan de weekprijs nooit verkeerd zijn. Bovendien hoef je bij prijswijzigingen maar één prijs (de dagprijs) aan te passen; de weekprijzen kloppen namelijk altijd.

Een offerte voor een nieuwe klant verschilt m.i. niet van die van een bestaande klant, behalve dat de klantgegevens bij het opnemen misschien nog niet bestaan. Maar daar is een mouw aan te passen. Bij een eerste offerte zou je een extra sectie kunnen opnemen in het rapport Offerte, dat alleen getoond wordt bij een eerste offerte. Dat is simpel af te vangen in een rapport. Het blijft dus gewoon één rapport. Meerdere talen is ook nog wel te doen, maar dan heb je eigenlijk al een vertaaltabel nodig die dynamisch (op basis van taalkeuze) het rapport voorziet van de juiste labelteksten. Of je maakt 3 rapporten, voor elke taal één. Maar dat laatste is weer veel lastiger te onderhouden, want elke wijziging moet dan in alle rapporten worden gedaan i.p.v. in één rapport.

Een offerte bevat minstens twee tabellen: tblOfferte met OfferteID en klantgegevens, datumgegevens etc. en een tabel tblOfferteRegels die de feitenlijke artikelen bevat. De laatste tabel bevat per record het OfferteID, zodat je een oneindig aantal artikelen aan een offerte kan hangen. Op je formulier haal je het artikel op, en zet je de vaste prijs daarvan in het prijsveld. Dit veld is gekoppeld aan de tabel tblOfferteRegels, want je wilt de prijs handmatig kunnen veranderen. Dat verandert dan niks aan de prijs in je Produkten tabel.

Je formulier Offertes bevat het subformulier OfferteRegels, en dat is automatisch al gekoppeld aan de Offerte.
Vervolgens heb ik het ook voor elkaar dat in tabel "offertes" in het veld "bedrijfsnaam" enkel gekozen kan worden uit de bedrijfsnamen zoals ingevuld in tabel "Klanten". Ik wil nu dat vervolgens in het veld contactpersoon (tabel offertes) enkel gekozen kan worden uit contactpersonen van het bedrijf me*bedrijfsnaam* uit het gerelateerde veld.
Dit vind ik niet in de handleidingen terug.
Als je de handleiding goed gelezen hebt al ben je wellicht nog niet zover gekomen, dan zou je weten dat ik een aperte tegenstander ben van keuzelijsten in tabellen. In voorbeeldjes die mensen posten op dit forum, sloop ik ze er ook consequent altijd uit als ik het bestand weer terugzet. Keuzelijsten in tabellen zijn een volslagen onzinnige toepassing, behalve voor keuzelijsten die zijn gebaseerd op ingetypte lijsten. Maar tabellen? Nooit gebruiken! Ik zal niet alle redenen geven waarom je dat moet laten, maar de belangrijkste: je ziet nooit meer welke waarde je nu eigenlijk opslaat. Je ziet namelijk een Klantnaam, maar je slaat het KlantID op. En vroeg of laat ga je daar de teil mee in. In een tabel moet je (vind ik) te allen tijde kunnen zien wat er daadwerkelijk in is opgeslagen. Bovendien: gebruikers hebben niks te zoeken in een tabel; die werken in een formulier.
Dus: geen keuzelijsten in je tabel, maar alleen tekstvelden.
Je probleem kun je heel makkelijk (staat ook in de cursus) oplossen op een formulier. Dat is ook waar keuzelijsten optimaal tot hun recht komen. Zoek maar eens op afhankelijke keuzelijsten, en je komt een aantal technieken tegen die je kunt gebruiken.
 
Ik heb mijn database aangepast (zie bijlagen). Ik heb het geheel eerst op papier uitgetekend met tabellen, relaties en sleutels. Dit heb ik vervolgens verwerkt tot wat het nu is in de bijlagen. Genormaliseerd tot niveau 2/3 volgens mij (volgens de "cursus"). Graag reacties hierop.

Een offerte voor een terugkerende klant heeft een iets andere tekst na de aanhef, maar verder verschilt het inderdaad niet.

Zoals ook te zien is in "huurofferte eerste keer NL" formulier, heb ik formulieren verkeerd geïnterpreteerd denk ik.....ik was daar de volledige offerte lay-out in aan het maken. Maar ik begrijp nu dat (min of meer) het enige wat ik hoef te doen is invulvelden maken in een formulier en de verdere lay-out etc. komt in het rapport?

EDIT:

Ik ben nu bezig met het ontwerpen van een nieuwe formulier waar de offerte gegevens op ingevuld kunnen. Wat ik echter nu wil is dat wanneer de gebruiker een bedrijfsnaam selecteert in een keuzelijst met invoervak hij:
- in het keuzelijst met invoervak "achternaam" alleen nog kan kiezen uit achternamen van contactpersonen bij het geselecteerde bedrijf
- direct alle verdere gegevens (straat, postcode, plaats, land) van het betreffende bedrijf worden ingevuld in de tekstvakken eronder
- direct alle verdere gegevens (voorletters, voornaam, telefoonnummer) van de betreffende geselecteerde achternaam worden ingevuld in de tekstvakken eronder.

Dit vind ik niet terug in de cursus...? Mocht dat wel terugkomen in de cursus, dan graag een verwijzing zodat ik het zelf kan leren :)
 

Bijlagen

Laatst bewerkt:
Deze technieken staan wel degelijk in de cursus, en komen ook regelmatig langs in het forum :) Maar ik zal je db er eens op aanpassen; meestal spreken voorbeelden meer tot de verbeelding als het om eigen data gaat, want dan snap je sneller wat er gebeurt. Een algemeen voorbeeld is wat dat betreft toch abstracter. Ik zie al wel een probleem in je tabel [Klant-contactpersonen]. Daarin heb je een sleutel gemaakt op basis van Voorletters en Achternaam, en die twee velden zijn bepaald zeer ongeschikt als sleutel, omdat deze twee veel te snel tot dubbele gegevens zullen leiden. En dan heb je toch een probleem. Daar kun je dus beter een andere sleutel (bij voorkeur één veld) voor maken.
 
Dat van die sleutel in [klanten].contactpersonen klinkt logisch. Ga ik doen.

Kun je een tip geven over wat ik verder nog moet aanpassen zoals je aangeeft?


EDIT 1:
Opgelost:Ik probeer nu het volgende:
Op basis van de tabel [Klanten] wordt in een formulier de bedrijfsnaam gekozen uit een keuzelijst met invoervak. Vervolgens wil ik in het tekstvak "straat en huisnummer" eronder automatisch de bijbehorende naam (in dezelfde tabel) laten opzoeken. Dit probeer ik middels:


Code:
=DLookUp("[Adres]";"Klanten";"[Bedrijfsnaam] =" & Formulieren![Nieuwe offerte]![cmbBedrijfsnaam])

in de eigenschap "besturingselementbron" van het tekstvak. cmbBedrijfsnaam is daarbij de keuzelijst met invoervak.

In formulierweergave leidt deze code echter tot de vermelding: #Fout in het betreffende tekstvak. Wat is er verkeerd aan deze code? Ik heb dit gedaan middels deze link: http://office.microsoft.com/en-us/access-help/dlookup-function-HA001228825.aspx


Oplossing:
Ik heb het nu voor elkaar, maar weet niet of het de goeie optie is:

Ik heb een keuzelijst met invoervak gemaakt waarin de bedrijfsnaam gekozen kan worden. De klant-ID is hierbij ook gekoppeld maar niet zichtbaar. Met de code:

Code:
=DLookUp("[Adres]";"Klanten";"Klanten.[Klant-ID] =" & [Formulieren]![Nieuwe offerte]![cmbBedrijfsnaam])

in "besturingselementbron" kan ik vervolgens het adres laten opzoeken......
Alleen als nu geen bedrijfsnaam is ingevuld, wordt er overal "#Fout" getoond in de tekstvakken. Dit kan ik wel oplossen met een IIf constructie (denk ik) maar dat vind Access niet goed gezien mijn expressie dan te lang wordt ofzo


EDIT 2:
Ik heb het formulier nu vrij ver ontwikkeld. Helaas is hij te groot om hier te uploaden (113 kb na comprimeren), maar ik heb nog wat zaken die ik graag nog erin wil hebben:

Opgelost
1) Ik een loginscherm toegevoegd. Daaraan gekoppeld de tabel "gebruikers" (met de velden "Gebruikers-ID en "Gebruikersnaam"). Ook heb ik een tabel "offertenummers" toegevoegd (met de velden "Gebruikers-ID" en "Offertenummer" welke beide de sleutel vormen). De gebruiker selecteert zijn naam en komt vervolgens in het formulier terecht om een offerte te maken. Wat ik nu wil is dat automatisch het offertenummer wordt opgezocht dat de gebruiker als laatste gebruikt heeft (staat in de tabel "offertenummer" te vinden) en hier 1 bij opgeteld wordt. Deze nieuwe waarde wordt in het tekstvak "txtOffertenumer" op het formulier getoond en tevens opgeslagen in de tabel "offertenummer".
Oplossing
Ik heb de tabel "offertenummers" verwijderd. Daarvoor heb ik in de tabel "offertes" een veld "gebruikers-ID" opgenomen. Met de volgende code in het tekstvak "Offertenummer" op het formulier laat ik het hoogste offertenummer opzoeken voor de betreffende gebruikers-ID en daarbij 1 optellen:
Code:
=DMax("[Offertenummer]";"[Offertes]";"[Offertes].[Gebruikers-ID]=" & Formulieren![Offerte formulier]!txtGebruikersID)+1

2) In het formulier heb ik een deel toegevoegd waarin artikel geselecteerd kunnen worden. Dit gaat per regel in het formulier. Een regel bevat:
- keuzelijst met invoervak "artikelcode"
- keuzelijst met invoervak "omschrijving"
- tekstvak "aantal"
- tekstvak "prijs"
Wat ik hierin nu graag zou willen is dat er automatisch zo'n "regel" wordt toegevoegd als er 1 is ingevuld. Per offerte verschilt het aantal artikelen namelijk sterk. Een druk op een knop is ook prima.

EDIT 3:
EDIT 1 hierboven is opgelost. Zie EDIT1 voor oplossing.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan