zoek of er een record bestaat

Status
Niet open voor verdere reacties.

JEPEDEWE

Terugkerende gebruiker
Lid geworden
14 jun 2006
Berichten
1.680
Hallo,
In een poging mijn archaïsche code wat te rationaliseren had ik graag een oplossing geweten voor een situatie die zich heel veel voordoet:

Stel, je voert een nieuwe fiche in
Deze fiche bevat een aantal velden waarbij ik een controle uitvoer of, wat ik in dit veld ingaf, reeds in een ander bestand voorkomt
bvb
Ik vul de naam van een ziekteverzekering in, het systeem gaat kijken of in het bestand van ziekteverzekeringen deze naam al voor komt. Is dit zo dan loopt alles gewoon verder, is dit niet zo dan wordt er in het bestand van ziekteverzkeringen, een nieuw record aangevuld met de naam van de ziekteverzekering dit ik initieel ingaf.
Hetzelfde voor bvb een huisarts, een behandelingscode enz.
Nu maak ik telkens een recordset aan met de ingevoerde naam, ik tel hoeveel records er voorkomen met die naam. Is het getal 0 dan voeg ik een nieuw record toe, zoniet dan bestaat de naam al en gebeurt er niets.
Dat werkt, maar ik denk dat het veel eleganter kan
Kan iemand mij eens uitleggen hoe je best werk in deze situaties?

Alvast bedankt
JP
 
Dat werkt, maar ik denk dat het veel eleganter kan
Dat weet ik wel zeker :)

Je geeft een aantal voorbeelden die op je formulier m.b.v. Keuzelijsten (moeten) worden ingevuld. Je hebt immers tabellen waar die gegevens uitgehaald worden. Keuzelijsten hebben de eigenschap <Bij niet in lijst> die dus bedoeld is voor deze situatie. Je typt dus in de keuzelijst een naam in, die filtert in eerste instantie de keuzes in de lijst, of maakt de lijst leeg als de naam niet gevonden wordt. Verlaat je (bijv. met de Tab toets) het veld, dan trigger je de gebeurtenis <Bij niet in lijst> en kun je twee acties doen (althans: twee waar je wat aan hebt ;) ).
Actie 1: gebruik een toevoegquery om de nieuwe naam toe te voegen aan de onderliggende tabel.
Actie 2: open een formulier waarin de waarde van de keuzelijst gebruikt wordt als nieuwe waarde voor het betreffende naamveld en vul op het formulier de verdere (verplichte) gegevens in.
In beide situaties wordt de keuzelijst automatisch ververst en is de nieuwe naam dus gelijk beschikbaar.

Wanneer gebruik je 1 en wanneer 2? De eerste optie (met query dus) gebruik je als in de onderliggende tabel maar één verplichte waarde staat. In jouw db zou dat de tabel [Behandelingscode] kunnen zijn, omdat je in die tabel alleen een code hoeft toe te voegen. Optie 2 zou je kunnen gebruiken voor een nieuwe dokter, waarvan je waarschijnlijk meer wilt invoeren dan alleen de naam. En dat moet dus op het bijbehorende formulier gebeuren.
 
Ik schrijf in de eigenschappen van de keuzelijst:

Code:
Private Sub Mutual_keuze_NotInList(NewData As String, Response As Integer)
    If MsgBox("mutualiteit komt niet voor", vbOKOnly, "Let op") = vbOK Then
    End If
    Dim sArgs As String
    DoCmd.OpenForm "Mutualiteit_nieuw", datamode:=acFormAdd, OpenArgs:=Me.Mutual_keuze & "|Nieuwe mutualiteit"
End Sub

als ik in de keuzelijst een nieuwe mutualiteit invul zie ik de msgbox helemaal niet verschijnen, worden alle velden leeggemaakt, en opent er zich een nieuw fiche formulier..
dus er gebeurt vanalles maar zeker niet dat wat ik had verwacht
enig idee?

JP
 
De Msgbox zou sowieso moeten triggeren (dat doet hij bij mij namelijk ook in de laatste db die je gemaild hebt) maar zal natuurlijk altijd het formulier openen, want je hebt maar één knop op de msgbox. Dat formulier opent met een nieuw record, want dat vraag je (acFormAdd) en lijkt mij ook correct. De declaratie van sArgs is in jouw voorbeeld onzinnig want je vult hem niet en je doet er niets mee. Gebruik variabelen alleen als je ze vult, en vervolgens gebruikt. Om een formulier te openen op basis van een niet-bestaande waarde in een keuzelijst (NotInList dus) kun je dit als voorbeeld gebruiken:
Code:
Private Sub RUSTOORD_NotInList(NewData As String, Response As Integer)
Dim msg As String, CR As String, strSQL As String, Result As Variant

    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 ("rustoord"), WindowMode:=acDialog, OpenArgs:=NewData
    End If
    ' Zoek het nieuwe RustoordID op in de tabel Rustoord.
    Result = DLookup("[ID]", "Rustoord", "[Naam_instelling]=""" & NewData & """")
    If IsNull(Result) Then
        ' Als het rustoord niet is aangemaakt, Response argument op Error message zetten en herstellen.
        Response = acDataErrContinue
        MsgBox "Nog een keer proberen...", vbOKOnly
    Else
        ' Als het rustoord is aangemaakt, het Response argument Added zetten.
        Response = acDataErrAdded
        Me.RUSTOORD = Result
        Me.Refresh
    End If
End Sub
 
Ik blijf hetzelfde probleem hebben Michel
Ik vul bvb in het veld "Bond" een nieuwe naam is, deze naam komt uiteindelijk wel in de correcte fiche te staan, maar het event wordt niet gelanceerd
Er wordt wel, ogenschijnlijk een nieuw record aan de tabel toegevoegd.
Zeer raar.
Ik stuur een db mee als voorbeeld
 

Bijlagen

  • fiche.zip
    79,5 KB · Weergaven: 43
Je hebt mijn code niet gebruikt in de procedure, maar slechts je eigen code (die bij AfterUpdate stond) verplaatst. Dat gaat inderdaad niet werken. Daarnaast ontbreekt het formulier [Mutualiteit_nieuw]. Ik neem maar even aan dat dat gebaseerd is op de tabel Mutual, dus die maak ik dan wel even zelf.
 
Ik heb de juiste code in je db gezet.
 

Bijlagen

  • Database61.zip
    109 KB · Weergaven: 40
Dat snap ik niet hoor Michel..
Als ik de eigenschappen van het veld vraag zie ik nergens iets van "Afterupdate" staan
scherm.jpg
 
Die zat ook niet in deze db, maar in de vorige :). Bovendien zou ik 'm hebben weggehaald in mijn versie :D
 
dat loopt als een trein..
In een enthousiaste bui heb ik in Mutualiteit_nieuw het veld plaats vervangen door een keuzelijst met Belgische gemeenten
Ik kan dus hieruit selecteren..; dat lukt, maar ik wil graag de postnummer uit POSTNW in het postnummer-veld krijgen in het "mutualiteit_nieuw" formulier.
Hoe ga je dan te werk?

Je maakte blijkbaar het formulier aan met de wizard. Ik deed dat ook al, maar merk dat alle velden in een soort groep staan... (stippellijn rond de velden)
Hoe raak je daar van af?
Het formulier staat ook altijd schermwijd op je scherm... hoe verklein je in die situatie de randen zodat je een "afgelijnd" formuliertje krijgt?

Bedankt voor de info en de snelle hulp
 

Bijlagen

  • Database62.zip
    157,5 KB · Weergaven: 39
Je maakte blijkbaar het formulier aan met de wizard.
Je zal mij echt nooit een wizard zien gebruiken voor een formulier :). Hooguit voor een rapport, als ik lui ben en een aantal groeperingen nodig heb. Maar nooit voor formulieren. Deze is met de standaardknop gemaakt, die dus een (best lelijk) formulier genereert, dat ik dan een beetje aanpas. Het standaard formulier groepeert inderdaad tekstvakken, waar ik doorgaans een stevige hekel aan heb.
Jij maakt, heb ik wel vaker gemerkt, een principefout in je db's, en je keuzelijsten zijn daar het blakende voorbeeld van: je slaat in je gekoppelde tabellen de verkeerde velden op. In de tabellen die aan een keuzelijst (met invoervak) ten grondslag liggen zou je in ieder geval een sleutelveld moeten hebben (heb je in [POSTNW] niet) en die sleutelwaarde sla je dan op in de tabel waarin je de keuzelijst gebruikt: het veld [PLAATS] (doe je ook niet, je slaat [NAAM] op). Dat sleutelveld is verder niet zo boeiend, maar zorgt ervoor dat de koppeling goed werkt. In de keuzelijst wil je doorgaans op een tekstveld selecteren, en dat betekent dat je het tweede veld als eerste moet zien in de keuzelijst.

Je hebt dus minstens twee velden nodig in de keuzelijst, het sleutelveld en het zichtbare veld. Dat betekent dat het eerste veld (ID]) verborgen moet zijn: breedte ocm dus. Het tweede veld geef je dan een nette breedte, bijvoorbeeld 6 cm. De totale breedte van de keuzelijst maak ik altijd 0,7 cm groter, zeg maar de breedte van het pijltje. Dus:
Aantal kolommen: 2
Kolombreedten: 0cm;6cm
Lijstbreedte:6,7cm
Afhankelijke kolom: 1

Dat laatste mag ook anders, als je het ID veld achteraan zet, en dus de eerste kolom met het tekstveld vooraan zet. Maar zelf vind ik dat verwarrend, dus ik zet het sleutelveld altijd vooraan.

Het groeperen (andere vraag) zit onder het tabblad <Schikken>, en dan <Indeling verwijderen>. Wel eerst alles selecteren, want je verwijdert de indeling van de geselecteerde objecten.
 
Ik kan aan de tabel PostNW een ID toevoegen en dit als sleutelveld definieren
het aanmaken van een keuzelijst met ID als eerste kolom op 0cm... dat lukt ook
In de rest van het programma gebruik ik het veld met de gemeentenaam en het postnummer zeer frequent dus, om daar niet al te veel aanpassingswerk mee te hebben, verkies ik toch om de gemeentenaam en de postnummer weg te schrijven in het record zelf en geen link te gebruiken (ook al is dti waarschijnlijk de beste weg)
à la guerre comme à la guerre!!!
maar dan...
ik selecteer een dorpsnaam
en wil dan de postcode in het correcte veld... hoe doe je DAT dan

JP
 
Laatst bewerkt:
In de rest van het programma gebruik ik het veld met de gemeentenaam en het postnummer zeer frequent dus, om daar niet al te veel aanpassingswerk mee te hebben, verkies ik toch om de gemeentenaam en de postnummer weg te schrijven in het record zelf en geen link te gebruiken (ook al is dti waarschijnlijk de beste weg)
Bang voor een kwartiertje extra werk? Meer is het namelijk niet om het aan te passen. Kwestie van per tabel een numeriek veld toe voegen voor het ID, en een bijwerkquery maken die op basis van het tekstveld het ID invult uit de koppeltabel. Ik doe dat regelmatig voor databases die ik moet onderhouden, die op dezelfde basis zijn gemaakt. OK, laat het een half uur zijn. Maar beter ten leste gekeerd, dan tot in den treure de verkeerde kant opvaren, lijkt mij. Laziness is not an option :)
 
Heb, buiten dit gedoe, nog uuuuuuren werk om alles wat deftig aan de praat te krijgen, dus heeft niets met laziness te maken hoor .....
Je weet hoeveel code ik heb en als ik DAT allemaal moet aanpassen... nee bedankt
dus beste Michel... even je koppigheid opzij gezet ;) en doe het eens op mijn, onlogische, domme, amateuristische manier... wil je :p
jp
 
dus beste Michel... even je koppigheid opzij gezet ;) en doe het eens op mijn, onlogische, domme, amateuristische manier... wil je :p
Er zijn een paar dingen die ik weiger in het leven, en dat is, in volgorde van belangrijkheid: een wedstrijd van een zekere club uit Amsterdam bekijken, Heineken bocht drinken, en meewerken aan slechte databases :). Dus als ik een oplossing geef, dan is dat een oplossing zoals het zou moeten. Wil je die versjacheren, prima, maar dat ga ik niet voor je doen :D.
 
een wedstrijd van een zekere club uit Amsterdam bekijken.... kan ik inkomen
Heineken bocht drinken.... moet je naar België komen wonen... en als het ECHT moet dan drink ik dat ook wel eens
en meewerken aan slechte databases... als ik het nu eens tegen niemand zeg... en net als ik Heineken zou drinken... ook misschien eens tegen je zin
maar ik hoor het al... heb weerom pech
JP
 
Ach, pech.... De techniek die ik je aanreik werkt ook prima in jouw situatie. Niet optimaal, maar dat weet je inmiddels.
maar dan... ik selecteer een dorpsnaam en wil dan de postcode in het correcte veld... hoe doe je DAT dan
Op exact dezelfde wijze dus. Maak je keuzelijst op zoals je hem wilt hebben, met de eerste zichtbare kolom dus als degene waar je op filtert. De kolom die je op wilt slaan is de afhankelijke kolom.
 
Natuurlijk, maar ik wil ook het postnummer in het correcte veld hebben zonder het gedoen van recordsets zoals ik dat altijd al, waarschijnlijk verkeerdelijk, deed?
 
Dus je wilt de plaatsnaam in het veld PLAATS, en de postcode in het veld PN? Dat is simpel te doen door de postcode uit de keuzelijst te halen. Dan krijg je deze rijbron voor de keuzelijst:
PHP:
SELECT GTE, PN FROM POSTNW ORDER BY GTE;
En deze gebeurtenis:
Code:
Private Sub COMBO4_Click()
    With Me
        .PN = Me.COMBO4.Column(1)
        .Requery
    End With
End Sub
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan