pulldown menu in subformulier updaten, na toevoeging record in andere tabel/formulier

Status
Niet open voor verdere reacties.

MJJBROEKHUI

Gebruiker
Lid geworden
6 jun 2001
Berichten
175
Beste allen,

Zouden jullie mij willen helpen bij het volgende waar ik tegen aan loop?

Ik heb een formulier met een subformulier, dat een datasheet is. In het subformulier kan ik middels een pull down menu bedrijven selecteren. Dit pull down menu verwijst naar tabel met allemaal bedrijven en hun adresgegevens ed.

Echter, Als ik in het betreffende veld op het subformulier zoek in de pull-down lijst, weet ik op dat moment niet of het bedrijf al in mijn database staat. Op het hoofdformulier heb ik een knop dat ik een nieuw bedrijf kan toevoegen via een apart formulier. Zodra ik dit bedrijf heb toegevoegd en terug ga naar het pull-down menu in het subformulier, staat dit bedrijf niet in het pull-down menu. Als ik alle formulieren sluit en weer opnieuw opstart deze dit nieuwe bedrijf er wel tussen. Welke codes en op welke formulier(en) moet ik toevoegen, zodat ik direct na toevoegen van het bedrijf deze ook zichtbaar is in het pulldown menu?

Daarnaast heb ik nog een vraag dat hier betrekking op heeft.
Als ik een bedrijf uit het pulldown menu geselecteerd heb, zou ik graag middels een knop op het hoofdformulier, direct naar het formulier gaan, waar alle gegevens van het bedrijf staan, zodat ik eventueel deze gegevens kan updaten.

Alvast dank voor jullie reactie en ik hoop dat jullie mij kunnen helpen!!

grt
Marco
 
Echter, Als ik in het betreffende veld op het subformulier zoek in de pull-down lijst, weet ik op dat moment niet of het bedrijf al in mijn database staat.
Lijkt mij dat je dat nu juist wél weet: op het moment dat je een niet-geregistreerde naam intypt, wordt die niet gevonden. En dat leidt dan automatisch tot de conclusie dat het bedrijf nog niet is ingevoerd :).
Je aanpak met een losse knop is niet de meest elegante, en zeker niet de meest handige. Dat is namelijk: maak op de keuzelijst een gebeurtenis <Bij niet in lijst> (NotInList) die exact doet wat jij wilt: waarden die nog niet bestaan toevoegen en de keuzelijst verversen.
Daarvoor heb je dus een procedure nodig die het formulier opent, en die de keuzelijst bijwerkt bij sluiten van formulier. Een voorbeeldje:
Ik heb een keuzelijst cboPlaats, met een lijst van gemeentes. Als ik een gemeente intyp die niet bestaat, moet hij worden toegevoegd. Deze code opent dan het formulier fGemeente:

Code:
Private Sub cboPlaats_NotInList(NewData As String, Response As Integer)
Dim i As Variant, tmp As Variant
    If NewData = "" Then Exit Sub
    msg = "'" & NewData & "' staat niet in de lijst." & vbCr & vbCr
    msg = msg & "Wil je deze toevoegen?"
    i = MsgBox(msg, vbQuestion + vbYesNo, "Onbekende plaats . . ")
    If i = vbYes Then
        DoCmd.OpenForm "fGemeente", DataMode:=acFormAdd, WindowMode:=acDialog, OpenArgs:=NewData
        tmp = DLookup("GemeenteID", "Gemeente", "[Gemeente]=""" & NewData & """")
        If Not tmp = vbNullString Then
            Response = acDataErrAdded
            Me.cboPlaats = tmp
        Else
            MsgBox "Toevoegen van '" & NewData & "' is niet gelukt, neem contact op met de beheerder.", vbOKCancel
            Response = acDataErrContinue
        End If
    Else
        Response = acDataErrContinue
    End If
End Sub

Op het formulier dat je opent moet uiteraard de ingetypte naam worden ingevuld, anders heb je er niet veel aan. Dat doe je zo:
Code:
Private Sub Form_Load()
    If Not Me.OpenArgs = "" Then Me.Gemeente = Me.OpenArgs
End Sub
Kijk maar eens of je er wat aan hebt; hiermee kan je knop in ieder geval weg.
 
Je kunt ook de eigenschappen van de keuzelijst met invoervak (of pull-down lijst) als volgt aanpassen:

Alleen lijst: ja
Lijst bewerken toestaan: ja
Te openen formulier: selecteer hier de naam van het formulier waarop je bedrijven invoert

Zodra je dan een bedrijf invoert dat nog niet bestaat, vraagt Access of je deze wilt toevoegen. Je klikt op Ja, het formulier wordt geopend, je voert het bedrijf in en daarna wordt dit automatisch aan de keuzelijst toegevoegd.

Of dit exact hetzelfde werkt als de VBA van Octafish hierboven weet ik niet maar wellicht heb je net als ik weinig verstand van VBA en is de ingebouwde oplossing van Access voor jou voldoende.

Op je tweede vraag heb ik geen antwoord maar ik vermoed dat je daar wel een VBA-oplossing voor nodig hebt.
 
Te openen formulier: selecteer hier de naam van het formulier waarop je bedrijven invoert
Dat zit niet in alle Access versies; 2007 bijvoorbeeld niet. Ik weet niet of hij al in 2010 zit; is mij nog niet opgevallen. Mijn code werkt altijd :)
 
Zit er inderdaad in, al heet het anders: <Bewerkingsformulier Lijstitems>. En, en dat vind ik zelf vervelend, hij opent het formulier in de standaardweergave. Nou kun je daar een apart formulier voor maken dat in de Toevoegmodus staat, maar dan heb je dus a) een extra (eigenlijk overbodig) formulier, en b (veel erger) de ingetypte (ontbrekende waarde) wordt niet overgenomen. Die moet je dus nóg een keer intypen. Eigenlijk vind ik deze toevoeging dus volslagen overbodig, want Access hád al een perfecte oplossing voor het probleem, die ik hierboven heb beschreven. Maar dat is dus wel weer typisch Microsof... Nieuwe dingen inbouwen waar in beginsel niemand (zeker niet de ervaren Access bouwer) op zit te wachten. Ja, personen die tóch al niks van databases afwisten :). Goe gedaan, Bill :).
 
dank voor jullie hulp. klopt, ik loop ook tegen de opmerkingen aan Octafish bij de oplossing van PFL
Dus ik ben bezig met de oplossing van Octafish. Het gaat nog niet helemaal goed. Het loopt namelijk mis bij de volgende regel.

tmp = DLookup("GemeenteID", "Gemeente", "[Gemeente]=""" & NewData & """")

Ik krijg dan de volgende melding.

Run-time error 3078:
The MS Access database engine cannot find the input table or query 'Gemeente'. Make sure it exists and that name is spelled correctly.

Het gaat dus fout bij "Gemeente" en [Gemeente], maar ik heb geen idee of hier een table of veldnaam moet invullen.

Zou je mij kunnen helpen, waar de namen naar toeverwijzen?
 
DLookup zoekt een waarde uit een veld op in een tabel. Daarbij geef je eerst de naam van het veld op, en daarna de naam van de tabel. Als ik in jouw code kijk, zie ik wel heel veel dezelfde namen voorbij komen. Exact de reden dat ik altijd zeg: geef een tabel een voorvoegsel, een query ook en formulieren en rapporten ook. Je kunt ze dan veel beter uit elkaar houden. Access pakt meestal nog wel de goede, maar het kan je dus behoorlijk in de weg zitten!
Kijk ik in jouw code, dan valt op dat er wel heel veel Gemeente's voorbij komen. Ik heb je db niet, dus ik weet niet of je tabel ook [Gemeente] heet. Bij mij zou hij tGemeente, of tblGemeente heten. Dan weet ik tenminste dat ik naar een tabel zit te kijken!
Maar jouw veld [Gemeente] heeft dus dezelfde naam als de tabel ([Gemeente])?
Dan klopt je code op zich wel. Probeer 'm anders eens zo:
Code:
tmp = DLookup("[GemeenteID]", "Gemeente", "[Gemeente]='" & NewData & "'")

Gaat meestal wel goed, tenzij er een ' in de naam zit. En dat komt nog wel eens voor in Nederland...
Als ik de db zou maken, zou de tabel dus anders heten. Krijg je iets als:
Code:
tmp = DLookup("[GemeenteID]", "tblGemeente", "[Gemeente]=""" & NewData & """")
 
dank je. In de namen velden en tabellen heb ik onderscheid gemaakt. De codes die je voorgedragen hebt, werken beiden. Ik ga naar het formulier waar ik de details van gemeente verder kan invullen, maar als ik op het kruisje klik om dit formulier te sluiten en weer terugkom op het hoofdformulier verschijnt de melding. "is niet gelukt, neem contact op met de beheerder". Maw het lijkt er op dat het "programeer-technisch" wel goed geschreven is, maar dat er nog een ander probleem is. Want de betreffende gemeente dit ik heb toegevoegd staat wel in de tblGemeente, maar ik kan deze nog niet direct selecteren. Als ik het formulier sluit en opnieuw opstart staat de naam er wel in, maar deze omweg wil ik dus eigenlijk niet.

Wat doe ik verkeerd?

Ligt het toevallig aan deze code?
Me.cboPlaats = tmp

Ik weet niet wat ik hiermee aan moet.

Wederom alvast dank!
 
Dan wordt het ofwel tijd voor de db, ofwel (da's wel het minste) de volledige code.
 
Ja, maar we hoeven alleen die delen te hebben waar het over gaat natuurlijk. En er hoeven ook maar een paar (dummy) records in te zitten.
 
Moest wel een beetje sleutelen aan je voorbeeld (verwijzingen naar tabellen die er niet in zitten) Maar als het om het formulier frm_01_Fund gaat, dan zit er inderdaad een fout in: je verwijst naar het verkeerde veld :).
Code:
        tmp = DLookup("[IDLegalentity]", "tbl_00_Legalentity", "[B][LegalName][/B]='" & NewData & "'")
Overigens raad ik je (zeer ten stelligste; ik kan het niet genoeg benadrukken) om geen keuzelijsten in je tabellen te gebruiken, behalve als je ze baseert op <Lijst met velden>.
 
dank je wel, fantastisch! hier kan ik mee vooruit.

Zou je mij de reden kunnen waarom je geen keuzelijsten in tabellen moet gebruiken. Ik doe dit, omdat ik dan direct en snel (en niet queries) in de tabellen kan kijken, waar het betrekking op heeft. Anders zie ik alleen nummers en dat zegt me niets.
 
Die reden is heel simpel: met keuzelijsten zie je nooit meer wat er in het veld staat; je zit alleen naar vervangende gegevens te kijken. En dat is niet alleen verwarrend (zo kun je dus niet filteren op Fundsnaam, maar moet je wel degelijk een FundID intypen!) maar bij exports en queries krijg je tóch de echte gegevens terug. Als je in een query aanvullende gegevens wilt zien op je FundID, dan zet je de brontabel er bij, en sleep je die velden erbij.
Keuzelijsten zijn voor formulieren; in een tabel moet je (naar mijn mening) altijd de échte gegevens kunnen zien. Er is ook geen enkele reden (anders dan gemakzucht) te bedenken om ook in je tabel die aliassen te willen zien.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan