Selectie in keuzelijst

Status
Niet open voor verdere reacties.

Zurrik

Gebruiker
Lid geworden
17 mrt 2006
Berichten
221
Het is me gelukt om een item te verwijderen en het refreshen van de pagina. Nu ontbreekt me nog een ding. Als ik het geselecteerde ordernummer verwijder uit de keuzelijst, wordt alles goed bijgewerkt. Is het mogelijk om dan het hoogste, of een ander, ordernummer te selecteren in een keuzelijst. En met selecteren bedoel ik dat het ordernummer (liefst hoogste) zwart gemaakt wordt (geselecteerd) in de lijst.
 
hoe je dat moet aanpakken is eenbeetje afhankelijk van je situatie.

- is je keuzelijst gebonden aan een tabel of query?
- heeft je keuzelijst meerdere kolommen?
- zo ja in welke kolom staan de ordernummers?

er vanuit gaand dat je keuzelijst gebonden is dan kan je met een SELECT TOP1 FROM....
sql query de waarde van het hoogste order nummer vinden.

verder neem ik aan dat je met zwartmaken selecteren bedoelt.
je kan een item selecteren via
Me!Listbox.Selected( ItemX) = True
waarbij ItemX het item nummer in de listbox is.
 
Oke dank je. Van dat Top 1 wist ik niet eens. Dat werkt mooi en ik kan nu de hoogste order vinden. Alleen nu moet ik nog die waarde in de lijst krijgen.

Ik kan een variabele aanmaken met VBA, maar hoe kan ik daar een query achter zetten?

x = "Select Top 1 OrderID From qryKeuzelijst"
Me.kzOrdernummers.Selected(x) = True

Ik weet dat de eerste regel niet klopt, maar hoe maak ik dat wel kloppend. De variabele x is wel aangemaakt.
 
Option Compare Database

Private Sub Form_Load()

Me.Keuzelist.Selected(HoogsteOrdernummerIndex(HoogsteOrdernummer)) = True


End Sub



Function HoogsteOrdernummer() As String

Dim Rc As DAO.Recordset

Set Rc = CurrentDb.OpenRecordset("SELECT TOP 1 OrderId From QryKeuzelijst ORDER BY OrderId DESC", dbReadOnly, dbForwardOnly)
HoogsteOrdernummer = CStr(Rc.Fields("OrderId"))


Rc.Close
Set Rc = Nothing

End Function

Function HoogsteOrdernummerIndex(HoogsteOrdernummer As String) As String

Dim Rc As DAO.Recordset
Dim StopLoop As Boolean

Set Rc = CurrentDb.OpenRecordset("SELECT OrderId From QryKeuzelijst ORDER BY OrderId ASC", dbReadOnly, dbForwardOnly)
Do While (Not Rc.EOF Or StopLoop)
If Rc.Fields("Ordernummer") = HoogsteOrdernummer Then
HoogsteOrdernummerIndex = Rc.RecordCount
StopLoop = True
End If
Loop

Rc.Close
Set Rc = Nothing

End Function
 
Het is iets complexrer als je denkt, je wil namelijk het recordnummer van het record met het hoogste orderId hebben.. ja kan namelijk 10 orders hebben waarvan de hoogste 34054 is. en zovel items staan er niet in je keuzelijst. Op deze manier kan je dat oplossen.

Code:
Option Compare Database

Private Sub Form_Load()

Me.Keuzelist.Selected(HoogsteOrdernummerIndex(HoogsteOrdernummer)) = True


End Sub



Function HoogsteOrdernummer() As String

Dim Rc As DAO.Recordset

Set Rc = CurrentDb.OpenRecordset("SELECT TOP 1 OrderId From QryKeuzelijst ORDER BY OrderId DESC", dbReadOnly, dbForwardOnly)
HoogsteOrdernummer = CStr(Rc.Fields("OrderId"))


Rc.Close
Set Rc = Nothing

End Function

Function HoogsteOrdernummerIndex(HoogsteOrdernummer As String) As String

Dim Rc As DAO.Recordset
Dim StopLoop As Boolean

Set Rc = CurrentDb.OpenRecordset("SELECT  OrderId From QryKeuzelijst ORDER BY OrderId ASC", dbReadOnly, dbForwardOnly)
Do While (Not Rc.EOF Or StopLoop)
    If Rc.Fields("Ordernummer") = HoogsteOrdernummer Then
        HoogsteOrdernummerIndex = Rc.RecordCount
        StopLoop = True
    End If
Loop

Rc.Close
Set Rc = Nothing

End Function

Ik vraag mij trouwenss of of je keuzelijst niet gesorteed is, want dan is altijd het laatste of eerste item degeen met het hoogste nummer en hoef je die niet op te zoeken in de tabel.
 
Dit had ik inderdaad niet verwacht. Mijn keuzelijst is gebaseerd op een query. Hoe weet ik dan of die gesorteerd is? Ik wil dat het laatst toegevoegde orderID (hoogste) geselecteerd wordt zodat de rest van mijn formulier bijgewerkt wordt. Mijn formulier is gebaseerd op dat orderID. Maar als ik nu een orderID verwijder uit alle tabellen waar die in staat, dan selecteerd mijn keuzelijst niets meer.
 
Je keuzelijst is gewsorteerd indien je query een sorteervolgorde heeft.
in design mode kan je dat aangeven voor elk gewenst veld. Je ziet dat vrij snel als je door de keuzelijst scrollt en alle waarden oplopend of aflopend zijn denk ik zo.

De code die ik zojuist poste werkt ook als er niet gesorteerd is,maar het kan dus efficienter als de keuzelijst wel gesorteerd is.
 
keuzelijst werkt met deze query
Code:
SELECT qryOrdernummers.Ordernummer, qryOrdernummers.OrderID
FROM qryOrdernummers
ORDER BY [Ordernummer] DESC;

qryOrdernummers:
Code:
SELECT ORDERS.Ordernummer, ORDERS.OrderID
FROM ORDERS
ORDER BY ORDERS.Ordernummer DESC;
 
het eerste item in je keuzelijst is dus altijd het hoogste niet?
if keuzelijst.items.count > 0 then
keuzelijst1.selected(1) =true
end if
zou moeten werken di if is wel handig om een fout te voorkomen als er geen items zijn.
(dit is even uit de lose pols dus er kunnen fouten in zitten)
 
oke bedankt. Het eerste item is de laagste, want als er een nieuw ordernummer toegevoegd wordt moet dat hoger zijn. Ga het zo proberen.
 
Dan is dit ongeveer wat je zoekt (on the fly again...)
Code:
if keuzelijst1.items.count > 0 then
     keuzelijst1.selected(keuzelijst1.items.count) =true
end if
of
Code:
if keuzelijst1.items.count > 0 then
     keuzelijst1.selected(keuzelijst1.items.count - 1) =true
end if
 
Items kent ie niet. En als ik dan Itemdata pak kent ie count niet? Waar gaat het fout?
 
gebruik .ListCount ipv. .items.count

iki werk veel in VB6.0 en daar is de syntax soms net anders (vooral als je eigen controls maakt)
 
Ik ben nog niet zolang bezig met access, dus ik ben allang blij als mensen willen helpen.

Oke werkt bijna. Ik krijg geen foutmeldingen meer, maar er wordt nog niks geselecteerd in mijn formulier(zwart gemaakt). Kan dat ook nog?
 
ik heb het even getest met een listbox met de naam list2 in het openen van een formulier
en het hoogste nummer wordt echt zwart/geselecteerd.
Code:
Private Sub Form_Load()

Me.list2.Setfocus
Me.List2.Selected(Me.List2.ListCount - 1) = True

End Sub

het behoort dus te werken.
 
Ik heb nog steeds het probleem dat het niet werkt. Heb je een idee waar het aan kan liggen?

Code:
Private Sub Knop250_Click()
 
  DoCmd.RunSQL "Delete from Order_informatie where OrderID = " & Me.kzOrdernummers
  DoCmd.RunSQL "Delete from Orders where OrderID = " & Me.kzOrdernummers

 If kzOrdernummers.ListCount > 0 Then
    Me.kzOrdernummers.SetFocus
    Me.kzOrdernummers.Selected(kzOrdernummers.ListCount - 1) = True
 End If
 
 Me.Requery
 Me.Refresh
End Sub
 
Bij mij werkt het prima...
Code:
Private Sub Form_Load()

'test delete
DoCmd.RunSQL "Delete Ordernummers.OrderId FROM Ordernummers WHERE Ordernummers.OrderId = 56;"

Me.List2.SetFocus
Me.List2.Selected(Me.List2.ListCount - 1) = True

End Sub
zet dit eens als eerste regel in je code:

on error goto 0
en kijk of er een foutmelding verschijnt.
 
Helaas geen foutmelding, geen geselecteerd item. De enige verschillen die ik zie zijn:

- U laad een sub Form terwijl ik achter een knop handel.
- Ik werk met een if-statement zoals je hierboven hebt aangegeven

Dus het zou aan een van deze beide moeten liggen
 
Ik vermoed dat het ergens anders spaak loopt want het loopt bij mij perfect ook achter een knop ook met het if statment en ook met een error handler voor het cancelen van de SQL

Private Sub Command10_Click()

If Len(Me.List2 & "") > 0 Then
On Error GoTo Iscancelled
DoCmd.RunSQL "Delete Ordernummers.OrderId FROM Ordernummers WHERE OrderId = " & Me.List2 & ";"
On Error GoTo 0
If Me.List2.ListCount > 0 Then
Me.List2.SetFocus
Me.List2.Selected(Me.List2.ListCount - 1) = True
End If
End If

Exit Sub
Iscancelled:
On Error GoTo 0

End Sub

Heb je boven aan je module Option Explicit staan... zo niet doe dit en declareer al je variabelen (Dim .. as ..)
Heb je ergens on error resume next staan zorg dan dat deze weer gereset wordt met
on error goto 0 zodra dat kan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan