Formulier niet openen als er geen gegevens zijn voor opdrachtgever

Status
Niet open voor verdere reacties.

RicoXS

Gebruiker
Lid geworden
21 dec 2013
Berichten
7
Ik heb een database gemaakt met een aantal formulieren.
1 ervan is F_Bedrijfsgegevens met onder anderen een knop die een ander formulier F_Opdrachten opent met filter op het veld [Opdrachtgever].
Er wordt echter altijd een formulier F_Opdrachten geopend, ook als er geen opdrachtgegevens zijn voor de opdrachtgever.
Ik wil dat het formulier F_Opdrachten alleen opent als er ook daadwerkelijk opdrachtgegevens beschikbaar zijn voor de opdrachtgever.
De query met de gegevens die op F_Opdrachten worden gebruikt heet Q_Opdrachten_Per_Regel.
Wie kan me helpen?
 
Dan zou ik de query eerst openen in een recordset om het aantal records te tellen. Bij 0 is het: Exit Sub.
 
Of gebruik de ON OPEN event van het formulier om daar te bepalen of er records zijn, ook via de recordset, maar dan de recordset van de form, houd je alles op een plek
 
In mijn variant wordt het formulier helemaal niet geopend, en staat alle code op het startformulier. Daar doe je namelijk de check of er records zitten (waar je dan uiteraard de gefilterde recordbron van het tweede formulier voor gebruikt).
 
In mijn variant wordt het formulier helemaal niet geopend, en staat alle code op het startformulier. Daar doe je namelijk de check of er records zitten (waar je dan uiteraard de gefilterde recordbron van het tweede formulier voor gebruikt).

Beste OctaFish: ik neem aan dat je die check doet via de knop waarmee ik het formulier wil openen. Maar wat is dan de code om dit te checken en waar plaats ik die code?
 
Je hebt gelijk, de check doe je op dezelfde knop. Iets als:

Code:
Dim strSQL As String
    strSQL = "SELECT ID FROM Orders " _
        & "WHERE (KlantID = " & Me.KlantID & ") "
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 0 Then
            MsgBox "Geen orders voor deze klant", vbOKOnly, "Orders tellen"
            Exit Sub
        Else
            DoCmd.OpenForm "Orders", , , "[KlantID = " & Me.KlantID
        End If
        .Close
    End With
 
Nadeel van deze methode is dat je recordset/query 2 maal wordt uitgevoerd, in het geval dat je het in de ON OPEN doet, dan maar 1 keer.

Maar wat werkt dat werkt :)
 
Ik heb je Code aangepast naar - wat ik dacht goed was, mar ik krijg de foutmelding dat er een Syntaxfout is.
De code die ik heb gebruikt ziet er als volgt uit:

Private Sub Knop123_Click()

Dim strSQL As String
strSQL = "SELECT Opdrachtgever FROM Q_Opdrachten_Per_Regel " _
& "WHERE (Opdrachtgever = " & Me.Bedrijfsnaam & ") "
With CurrentDb.OpenRecordset(strSQL)
If .RecordCount = 0 Then
MsgBox "Geen orders voor deze klant", vbOKOnly, "Orders tellen"
Exit Sub
Else
DoCmd.OpenForm "F_Opdrachten", , , "Opdrachtgever = " & Me.Bedrijfsnaam
End If
.Close
End With

End Sub

==> Q_Opdrachten_Per-Regel is de query achter het op te roepen form F_Opdrachten
==> "Opdrachtgever" is het veld in de query dat moet overeenkomen met Me.Bedrijfsnaam
HELP!
 
Als Opdrachtgever een tekst veld is:
Code:
Private Sub Knop123_Click()

Dim strSQL As String
    strSQL = "SELECT Opdrachtgever FROM Q_Opdrachten_Per_Regel " _
        & "WHERE (Opdrachtgever = """ & Me.Bedrijfsnaam & """) "
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 0 Then
            MsgBox "Geen orders voor deze klant", vbOKOnly, "Orders tellen"
            Exit Sub
        Else
            DoCmd.OpenForm "F_Opdrachten", , , "Opdrachtgever = """ & Me.Bedrijfsnaam &""""
        End If
        .Close
    End With
    
End Sub
Als dit niet het problem is dan zie ik het zo snel even niet

p.s. als je code post, gebruik dan de code tag (door op de # in het post menu te drukken)
 
Beste namliam, dit werkt SUPER!
Allemaal enorm bedankt voor jullie moeite.
 
Kan met veel minder quootjes:

Code:
Private Sub Knop123_Click()

Dim strSQL As String
    strSQL = "SELECT Opdrachtgever FROM Q_Opdrachten_Per_Regel " _
        & "WHERE (Opdrachtgever = '" & Me.Bedrijfsnaam & "') "
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 0 Then
            MsgBox "Geen orders voor deze klant", vbOKOnly, "Orders tellen"
            Exit Sub
        Else
            DoCmd.OpenForm "F_Opdrachten", , , "Opdrachtgever = '" & Me.Bedrijfsnaam &"'"
        End If
        .Close
    End With
    
End Sub
 
Is wel wat minder robust, namen met een ' er in (komen in nederland niet vaak, maar wel voor en in het buitenland behoorlijk vaker) zullen hier problemen geven.
Met mijn oplossing heb je datzelfde problem met " maar die heb ik nog nooit gezien in een naam, ook niet internationaal. Maar zal het geen problemen geven met '.

En by the by, als je orders zoekt op een naam van een bedrijf ... heb ik mijn twijfels bij het ontwerp van je database.
Kan je niet zoeken op basis van een PK? Niet alleen sneller, ook nauwkeuriger
 
Laatst bewerkt:
Je hebt gelijk over het ontwerp van mijn dbs. Moet robuuster......
Dank voor alle tips!
 
Is een beetje een onzinargument; het ' teken is alleen een aanduiding dat er een tekstveld wordt gebruikt. Net als het " teken. Alleen: dat is een beschermd teken, dus als je dat wilt gebruiken i.p.v. het ' teken heb je er 2 nodig. En vaak staat hij aan het eind van een string, die je afsluit met " en dan heb je er al weer 3 nodig.
Wil je écht iets doen aan de robuustheid van je db, dan gebruik je natuurlijk helemaal geen tekstvelden om te filteren, maar een getalveld. En die variant zat dus in mijn voorbeeldje. Dat is de enige robuuste oplossing.
 
Onzin argument? Lijkt mij aan je reactie dat je niet begrijpt wat ik bedoel.

Het gaat om namen als D'angelo en zovelen van dat soort namen die je niet vaak ziet in Nederland, maar wel in het buitenland. En met meer en meer "exotische" namen in nederland, zie je het dus ook steeds vaker.
'D'angelo' werkt niet als iemand daarop zoekt, "D'angolo" wel en dat je dat dan moet coderen met misschien wel 4 x " om dat aan het einde van een SQL statement te kunnen doen ipv "'" ach dat is maar zo.
En mensen zoeken nou eenmaal op achternamen, niet op nummers... dat verander je niet zo snel.
 
Het filter in het voorbeeldje gebruikt geen LIKE, dus er wordt op een complete veldwaarde gefilterd. Dat suggereert het gebruik van een keuzelijst (wat ook heel verstandig zou zijn), en dan speelt het probleem helemaal niet. In het geval van een keuzleijst is het veel slimmer om het KlantID te gebruiken, en niet de naam.
Zelfs in een variabel tekstveld waarin je op vrije tekst zoekt, zul je doorgaans filteren op letters en niet op ' tekens. De gefilterde lijst wordt vanzelf kleiner als je meer tekens intypt. Omdat mensen het ' teken ook niet altijd correct gebruiken, is erop filteren niet de handigste manier. Het filter zelf vindt de personen perfect. Ook met ' tekens in de naam.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan