Tabel gebruikt in formulier automatisch sorteren

  • Onderwerp starter Onderwerp starter VJJK
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

VJJK

Gebruiker
Lid geworden
14 okt 2010
Berichten
47
Hey Helpmij Forum.

Ik zit met een vraag:

In een formulier moet een bepaalde naam worden geselecteerd (via lookup functie) alleen nu kan het voorkomen dat deze naam nog niet voorkomt in de gebruikte tabel.
Via een ander formulier laat ik dan een nieuw record toevoegen aan de gebruikte look-up tabel. (add new)

In formulier 1 kan ik zien dat dit record is toegevoegd en kan deze ook zien in de dropdown list. Echter, deze nieuwe toegevoegde record staat altijd onderaan de nieuwe tabel en ik wil deze juist in alphabetische volgorde tonen.

Kan ik de look-up lijst automatisch alphabetisch laten sorteren na elke update?

Alvast bedankt voor jullie hulp!
 
Je kunt een Requery opdracht geven op de keuzelijst, zodra hij is veranderd. Maar ik denk niet dat je probleem daarmee is opgelost, want ik vermoed dat je geen sortering hebt staan op je keuzelijst.
En, andere vraag, welke procedure gebruik je om een nieuwe naam toe te voegen? Ik krijg de indruk dat dat niet de gebeurtenis <Bij niet in lijst> is...
 
Dag OctaFish,

Klopt inderdaad, ik geef via VB de opdracht het huidige form te sluiten en een andere (waar de nieuwe record wordt opgegeven) te openen. Zodra dit record is ingegeven druk men op de button close form, waardoor de record via VB gesaved, huidige form closed en het oorspronkelijke form weer geopend wordt.

Heb jij hier een andere weg voor? Ik heb juist voor deze weg gekozen van sluiten en openen van 2 formulieren zodat telkens de meest up-to-date tabel gepakt wordt.

Alvast bedankt.
 
Ik doe het, zoals ik al aangaf, via de gebeurtenis <Bij niet in lijst>. Deze controleert of een ingevoerde waarde in een keuzelijst bestaat, en zo niet, wordt hij toegevoegd. Dat kan door een waarde rechtstreeks in een tabel te dumpen, of via een formulier. Ik kies dan meestal voor een formulier, omdat je dan meer gegevens kunt invoeren. Anders sla je alleen de onbekende waarde op in de tabel. Een voorbeeldje:

Op de keuzelijst krijg je deze actie:

Code:
Private Sub cboArtikel_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
        iBedrijf = Me.Parent.cboBedrijf.Column(0)
        DoCmd.OpenForm "fArtikelen", , , , acAdd, acDialog, "ArtikelID|" & NewData & "|" & iBedrijf
    End If
    Me.cboArtikelID.Requery
    ' Zoek het nieuwe artikelID op in de tabel Artikelen.
    Result = DLookup("[ArtikelID]", "tArtikelen", "[Artikel]='" & NewData & "'")
    If IsNull(Result) Then
        ' Als het artikel niet is gemaakt, Response argument op Error message zetten en herstellen.
        Response = acDataErrContinue
        MsgBox "Nog een keer proberen...", vbOKOnly
    Else
        ' Als het artikel is gemaakt, het Response argument Added zetten.
        Response = acDataErrAdded
        Me.cboArtikelID.SetFocus
        Me.cboArtikelID = Result
        Me.cboArtikel.SetFocus
        Me.cboArtikel = Result
    End If
End Sub

Je opent dus een formulier in toevoegmodus (doe je zelf ook al) maar geeft de nieuwe waarden mee met het formulier. Ze hoeven dus niet te worden overgetikt. De variabelen die je meestuurt met het formulier, moeten uiteraard ook worden ingevuld:

Code:
Private Sub Form_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then
        Dim sArgs() As String
        sArgs = Split(Me.OpenArgs, "|")
        Me.txtArtikelID.Value = sArgs(0)
        Me.txtArtikel.Value = sArgs(1)
        Me.cboBedrijfID.Value = sArgs(2)
        Me.txtArtikel.SetFocus
        SendKeys "{F2}"
    End If
End Sub

Dat gebeurt via een Split actie, waarbij de meegegeven variabelen op basis van het scheidingsteken in een matrix worden gezet, en vervolgens in de tekstvakken.

Als het artikelformulier is gesloten, wordt het nieuwe artikelID opgezocht met een DLookup, zodat het ook in de keuzelijst staat.
 
Dag OctaFish,

Ik ben er nu een ochtendje mee aan het stoeien en kom er niet uit.

Voral deze regel gooit continu roet in het eten.

iBedrijf = Me.Parent.cboBedrijf.Column(0)

Zelf heb ik geen idee waar deze regel naar verwijst.

Ik heb een voorbeeld database toegevoegd, waar in je zal zien wat ik bedoel. Het gaat om de form subvendorlist. waarbij als een vendor niet in de lijst voorkomt er een nieuw record dient te worden aangemaakt in de tabel vendorlist.

Bekijk bijlage Toevoeg aan tabel.zip

hoop dat je er even naar kunt kijken, ben benieuwd wat er fout gaat.
 
Ik vermoedde al dat je daarover ging struikelen ;)
Ik heb een voorbeeldje gehaald uit een eigen formulier, waarbij ik bestelregels heb in een subformulier. Om een artikel toe te voegen heb ik ook een BedrijfID nodig, en die haal ik uit het hoofdformulier. Vandaar de code: iBedrijf = Me.Parent.cboBedrijf.Column(0).
Uiteraard heb jij andere velden, dus ook andere waarden die je overneemt op het formulier. Ik kijk wel even naar je bijlage.
 
Dag OctaFish,

Heb jij toevallig nog tijd gehad om naar mijn vraag te kunnen kijken?

Ik kom er nog steeds niet uit.

Alvast bedankt..

VJJK
 
Heb vorige week inderdaad de code voor je gemaakt, maar er zat nog een knullig probleempje waardoor hij het niet netjes deed... Hier is de code!

Code:
Private Sub vendor_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 "Vendorlist", , , , acAdd, acDialog, NewData
    End If
    ' Zoek het nieuwe artikelID op in de tabel Artikelen.
    Result = DLookup("[Naam]", "Vendorlist", "[Naam]='" & NewData & "'")
    If IsNull(Result) Then
        ' Als het artikel niet is gemaakt, Response argument op Error message zetten en herstellen.
        Response = acDataErrContinue
        MsgBox "Nog een keer proberen...", vbOKOnly
    Else
        ' Als het artikel is gemaakt, het Response argument Added zetten.
        Response = acDataErrAdded
        Me.vendor = Response
    End If
End Sub

Om 'm goed te laten werken moet je de tabvolgorde in het formulier nog aanpassen. Nu staat Vendor als laatste, waardoor de lijst wordt leeggemaakt als je een waarde hebt toegevoegd, waardoor het lijkt alsof hij niet werkt. Dat doet-ie wel, maar je moet het veld dus een andere taborde geven.
 
Laatst bewerkt:
Dat was echt precies waar ik naar op zoek was!! super bedankt!!
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan