Opslaan gegevens

Status
Niet open voor verdere reacties.

malawi

Gebruiker
Lid geworden
10 mrt 2009
Berichten
169
Hallo

Ik heb een projectplanning in access.
Als ik op het projectblad bezig ben moet ik ook een klant selecteren. Als de klant niet bestaat, heb ik een knop met een koppeling naar het formulier waar ik een nieuwe klant kan aanmaken. Als ik dit heb gedaan sluit ik dit formulier. Nu sta ik weer op het projectveld. Nu heb ik het probleem dat ik de nieuwe klant niet direktkan selecteren. Ik moet nu eerst het projectblad eerst afsluiten en weer opstarten alvoren ik de nieuwe klant kan selecteren. Kan dit ook anders zonder het projectblad af te sluiten.

Alvast bedankt

Malawi
 
Gooi die knop weg, en maak een Keuzelijst met invoervak voor je klanten. Die keuzelijst kent een gebeurtenis <Bij niet in lijst> en die is dus bedoeld voor exact de situatie die je beschrijft. Het resultaat van de gebeurtenis is dus dat je een klant kunt invoeren, en gelijk gebruiken.
 
Hoe met welke gebeurtenis kan ik dit invoeren.
De Tabel klanten heeft 3 Velden. Soortbedrijf, klantnaam en standplaats

Malawi
 
Zoals ik al zei: het gaat om de gebeurtenis <Bij niet in lijst>. Deze triggert op een niet-bestaande waarde in de onderliggende tabel. De bedoeling is dan uiteraard dat je dat ontbrekende record toevoegt. De makkelijkste oplossing is om een Toevoegquery af te vuren die de ontbrekende gegevens toevoegt. Dat heeft een klein probleem: in je keuzelijst heb je een naam ingetypt die niet bestond. Die nieuwe naam is bekend in de functie. Overige gegevens, zoals adresgegevens, heb je uiteraard niet in kunnen vullen. Die moet je dus op een andere manier achterhalen. Bijvoorbeeld middels extra Inputboxen. Dat ziet er dan zo uit:

Code:
Private Sub cboDebiteur_NotInList(NewData As String, Response As Integer)
Dim strSQL As String
Dim i As Integer
Dim Msg As String
Dim sAdres As String, sPostCode As String, sPlaats As String

    'Exit this sub if the combo box is cleared
    If NewData = "" Then Exit Sub
    
    Msg = "'" & NewData & "' staat niet in de lijst met debiteuren." & vbCr & vbCr
    Msg = Msg & "Zullen we een nieuw record toevoegen?"

    i = MsgBox(Msg, vbQuestion + vbYesNo, "Unknown Movie Genre...")
    If i = vbYes Then
        sAdres = InputBox("Typ een adres in", "Adres van debiteur", "Adres")
        sPostCode = InputBox("Typ een postcode in", "Postcode van debiteuradres", "0000 XX")
        sPlaats = InputBox("Typ een plaatsnaam in", "Plaats van debiteuradres", "Plaats")
        strSQL = "Insert Into tbl_Debiteuren ([Naam], [Adres], [Postcode], [Plaats]) Values ('" & NewData _
            & "','" & sAdres & "','" & sPostCode & "','" & sPlaats & "')"
        CurrentDb.Execute strSQL, dbFailOnError
        Response = acDataErrAdded
    Else
        Response = acDataErrContinue
    End If
End Sub

De keuzelijst zoekt in mijn voorbeeld een debiteur op. De onbekende naam wordt in de variabele Newdata gezet. Met 3 inputboxen vraag je vervolgens om een adres, postcode en plaatsnaam. Het geheel wordt in de tabel Debiteuren gezet. Voordat het geheel wordt afgedraaid, vraagt de procedure eerst nog of je de record wel wilt toevoegen. Zo niet, dan gebeurt er uiteraard niks.
Na het toevoegen kun je verder werken.
 
Laatst bewerkt:
Phoeee, dat is voor een leek heelwat, maar ik ga er mee bezig dit weekend.


Bedankt.

Malawi
 
Ik kan het werkend krijgen maar dan moet ik afwijken van mijn plan. Zie bijgevoegde afbeelding relaties. Ik tracht de gebruiken zo min mogelijke eiegen tekst in te geven. Zo voorkom dat dat de zelfde klant meerdere malen voor komt.

Kan ik het realiseren zoals afbeelding aangeeft.

Malawi
 

Bijlagen

  • ScreenShot.jpg
    ScreenShot.jpg
    54,3 KB · Weergaven: 33
Niet met deze optie denk is, want je weet ongetwijfeld de LokatieID en SoortBedrijfID niet uit je hoofd als je gaat invullen. De vraag is of dat bezwaarlijk is. Heb je van LokatieID en SoortBedrijfID verplichte velden gemaakt, dan moet je die invullen als er een nieuw record wordt toegevoegd, anders krijg je een foutmelding. Zijn de velden niet verplicht, dan is er niets aan de hand en maak je het record aan op basis van Klantnaam en Voorvoegsel. Die je dan uiteraard wel moet vragen middels een Inputbox. Het klantrecord moet je dan op een ander moment verder aanvullen middels het klantformulier dat je daar wel voor zal gebruiken.

Er is uiteraard een andere optie die ik ook gebruik, maar die is ingewikkelder: niet een record aanmaken middels de toevoegquery, maar op basis van de klantnaam een nieuw record aanmaken m.b.v. je klantformulier. Je opent dus in de gebeurtenis <Bij niet in Lijst> een klantformulier. Op dit formulier vul je alle noodzakelijke velden in, waarna je het formulier afsluit (en tevens het nieuwe record opslaat) waarna de procedure dit nieuwe record verder gebruikt in je order. Zoals gezegd: een stukje moeilijker te maken, vandaar dat ik dat voorbeeld niet gelijk wilde geven.
 
Het formlier voor Klant heb ik al. Via een knop op de aangraag formulier laat ik het formlier kant laden en formulier aanvraag sluiten. Vanuit het formulier klant kan ik weer het formulier aanvraag weer openen. Op deze manier werkt het ook. Maar het laatste wat voorgesteld werkt denk ik beter, Ben alleen niet thuis in VBA om het juiste formulier bij niet in de lijst te openen, misschien kun jij dit aangeven.

Bij voorbaat dank,

Malawi
 
In zijn meest eenvoudige vorm, ziet de code er dan ongeveer zo uit:

Code:
Private Sub cboDebiteur_NotInList(NewData As String, Response As Integer)
Dim Result
Dim Msg As String, CR As String

    CR = Chr$(13)
    If NewData = "" Then Exit Sub

    Msg = "'" & NewData & "' staat niet in de lijst." & CR & CR
    Msg = Msg & "Wil je " & NewData & " toevoegen?"
    If MsgBox(Msg, vbQuestion + vbYesNo) = vbYes Then
        DoCmd.OpenForm "fKlanten", , , , acAdd, acDialog, NewData 
    End If

    ' Zoek de nieuwe klant op in de tabel Klanten.
    Result = DLookup("[KlantID]", "tKlanten", "[Klant]='" & NewData & "'")
    If IsNull(Result) Then
        ' Als de klant niet is gemaakt, Response argument op Error message zetten en herstellen.
        Response = acDataErrContinue
        MsgBox "Nog een keer proberen...", vbOKOnly
    Else
        ' Als de klant is gemaakt, het Response argument Added zetten.
        Response = acDataErrAdded
        Me.cboDebiteur = Result
    End If

End Sub

Daarmee ben je er echter nog niet, want op je Klanten formulier moet ook nog wat gebeuren:

Code:
Private Sub Form_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then
        Me.txtKlant.SetFocus
        Me.txtKlant.Value = sArgs
    End If
End Sub

Wat er gebeurt, is het volgende: je opent een tweede formulier (fKlanten in het voorbeeld) in de Dialog modus waarbij de nieuwe klantnaam als parameter (OpenArgs argument) wordt meegegeven. Dat betekent, dat er niets anders kan gebeuren voordat het tweede formulier wordt gesloten. Op het tweede formulier wordt het OpenArgs argument weer gelezen, en de waarde in het tekstveld van de Klantnaam gezet. De rest moet je dan zelf invullen/kiezen. Bij het sluiten van he formulier wordt het record opgeslagen, waarna de rest van de oorspronkelijke procedure wordt uitgevoerd.
Daarin wordt het nieuwe klantID opgezocht op basis van de klantnaam. Dat levert, als het goed is, één record op (hij bestond immers nog niet) en voila!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan