knop verbergen als hetzelfde ID aanwezig is in een andere tabel

Status
Niet open voor verdere reacties.

Rene71

Gebruiker
Lid geworden
2 aug 2012
Berichten
133
met onderstaande code worden er gegevens gekopieerd naar de tabel tblAfleveradres

op het Relatie formulier wordt de knop daarna verborgen
maar as ik het formulier afsluit en weer naar de zelfde RelatieID gaat is de knop weer terug
tot zover klopt de code dan ook nog wel

maar hoe krijg ik het zo dat de knop verborgen blijft op het Relatie formulier als hetzelfde RelatieID voorkomt in de tblAfleveradres.
komt de RelatieID niet voor in de tblAfleveradres dan moet de knop zichtbaar zijn
Code:
Private Sub cmdcopy_Click()
Copyafleveradres
End Sub

Code:
Private Sub Copyafleveradres()
Dim db As DAO.Database
Dim rs As DAO.Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("tblAfleveradres", dbOpenDynaset)
    rs.AddNew
    rs!RelatieID = RelatieID
    rs!Relatie = Relatienaam
    rs![Postcode Bezoekadres] = [Postcode Bezoekadres]
    rs!Bezoekadres = Bezoekadres
    rs!Plaats = Plaats
    rs.Update
    rs.Close
    
    Me.Requery
    
Me.cmdcopy.Visible = False
DoCmd.OpenForm "frmAfleveradres"
DoCmd.GoToRecord , , acLast
End Sub
 
Wat kunnen mensen toch ingewikkelde constructies bedenken.... Alleen daarvoor zou je al lid moeten zijn van HelpMij :). Dit is in mijn ogen ook weer een mooi voorbeeld, want dit riekt naar een slecht genormaliseerde database. Want de noodzaak van de hele operatie zie ik eerlijk gezegd niet. Maar goed, jij wel. Sowieso zou ik het veld Relatienaam niet doen, want je hebt het veld RelatieID al. Tenzij je relaties om de haverklap van naam veranderen, en je dus elke keer een andere naam binnen krijgt, en die ook nog eens (historie bijhouden voor je relaties?) wilt bijhouden. En Bezoekadres+Plaats+Postcode is natuurlijk ook minstens één veld teveel.
Overigens krijg ik ook weer niet de indruk dat je de historie wilt bijhouden, want er mag maar één relatieID worden opgeslagen... Dus is een één-op-één relatie tussen de brontabel en de tabel tblAfleveradres al genoeg. En op basis van die sleutelwaarde is het al onmogelijk om een extra record toe te voegen, dus ik zou zeggen: lekker laten staan, die knop. Hij doet het toch niet als een gebruiker er voor een tweede keer op klikt. Maar die 2 extra veldjes kunnen toch makkelijk erbij in je brontabel?
 
bij veel relaties heb ik meerdere afleveradressen met verschillende bedrijven en Namen en adressen
om bij een nieuwe relatie met een druk op de knop een afleveradres aan te maken dacht ik zo wat minder type werk te hebben
maar misschien dat een voorbeeld licht in de duisternis schept
Bekijk bijlage RelatieDB.rarBekijk bijlage RelatieDB.rar
 
Nu verandert het verhaal enigszins, want als een bedrijf meerdere afleveradressen kan hebben, mag het veld RelatieID niet uniek zijn in de aflevertabel, en heb je daar dus ook geen één-op-één relatie, maar een één-op-veel relatie, wat een stuk logischer is. Ik zou tblAfleveradres dan ook als subformulier op het formulier frmRelaties zetten, want daarvoor geldt dan hetzelfde als voor Contactpersonen. En je kunt je afvragen of je Contactpersonen dan goed koppelt; voor hetzelfde geld koppel je de contactpersonen aan afleveradressen, die je immers ook hebt. En een contactpersoon hoeft niet noodzakelijkerwijs aan de hoofdvestiging te zitten, maar kan net zo goed aan een subvestiging (=afleveradres?) worden gekoppeld.
 
Bedankt Michel voor je uitleg
kzou graag de knop [Maak afleveradres] verbergen, als de huidige RelatieID voorkomt in de tblafleveradres
maar hoe doe je dat, ik denk iets van
(maar ik kom er niet uit)

Code:
if me.RelatieID, tblafleveradres = me.RelatieID Then

Me.cmdcopy.Visible = False
 
kzou graag de knop [Maak afleveradres] verbergen, als de huidige RelatieID voorkomt in de tblafleveradres
Lijkt mij een verkeerde keuze, want je geeft zelf al aan dat een relatie meerdere afleveradressen kan hebben, en als je dus bij één record de knop verbergt, hoe kun je dan de rest toevoegen? Met de hand in de tabel klooien? Lijkt mij toch ook niet de bedoeling.
Overigens vind ik het te pas en te onpas verbergen en zichtbaar maken van knoppen niet geweldig; de layout van je formulier wordt er bepaald niet mooier en rustiger van. Beter kun je een knop laten staan, en op disabled zetten. Maar dat is mijn keuze ;)
 
Laatst bewerkt:
kan ook natuurlijk :thumb: of je knop verberg of disabled is een persoonlijke keuze denk ik
ik hoef hem ook alleen bij het maken van een nieuwe Relatie te zien
maar wat zou de code dan moeten zijn vraag ik me af
met de code wil ik me wat typewerk besparen ook als de Relatie maar 1 afleveradres heeft, namelijk het bezoek adres

maar snap wel wat je bedoel en het heeft me ook aan het denken gezet,

hoop dat je me voor deze oplossing wel kan helpen :D
 
Je wilt (geloof ik) een extra formulier openen, en dat alleen als in de tabel daarvan het record niet bestaat. Je zult dus een recordset moeten maken en vullen waarin je controleert hoeveel records er zijn met het specifieke RelatieID. Bij meer dan 0 heb je er geen, en dan mag de knop dus actief zijn. Dus de stappen zijn:
1. recordset maken met filter op RelatieID
2. tellen (rs.Count) hoeveel records er in zitten
3. If rs.Count >=1 then Me.cmdCopy.Enabled=False

etc.
 
het openen van dat extra formulier is niet nodig, kijken of huidige RelatieID voorkomt in tblAfleveradres. zo ja cmdcopy.Enabled = False

ik maak er volgens mij een bende van :(

maar ik krijg tot zover een fout melding Fout 3075 tijdens uitvoering Syntaxisfout (operator ontbreekt) in Query-expressie Count RelatieID
geel gearceerd Set rs = db.OpenRecordset(strSQL)
Code:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

    Set db = CurrentDb()
    strSQL = "SELECT COUNT RelatieID FROM [tblAfleveradres]"

        Set rs = db.OpenRecordset(strSQL)
   
        If rs.Count >= 1 Then
            Me.cmdcopy.Enabled = False
            Else
            Me.cmdcopy.Enabled = True
            End If
            
rs.Close
Set rs = Nothing
Set db = Nothing
 
Simpele doch voedzame tip: als je een SQL nodig hebt in VBA, is het het makkelijkst om eerst een query te maken, en daar de SQL van te kopiëren. Dan heb je in ieder geval het juiste resultaat, en de juiste syntax. Omgekeerd werkt ook: als je de code die je hebt gegenereerd kopieert naar een Inputbox, en het resultaat in een nieuwe query plakt, zie je of de query werkt of niet.
Beide technieken heb ik hier niet nodig om te zien dat er wat aan schort :).
COUNT is een functie, en daarvan staan de parameters altijd tussen haakjes. Die zie ik nergens. Verder levert Count een heel beïnvloedbaar resultaat. Zo kun je alle records tellen, of een deel op basis van een selectie. Jij telt alle records. Als de code goed zou zijn tenminste. Die had er dan zo uit moeten zien:
Code:
strSQL = "SELECT COUNT(RelatieID) FROM [tblAfleveradres]"
Maar je wilt niet weten hoeveel records er in de tabel zitten, je wilt weten hoeveel records van een bepaalde Relatie. Dus iets als:
Code:
strSQL = "SELECT COUNT(1) FROM [tblAfleveradres] WHERE [RelatieID] = " & Me.RelatieID
Nu tel je de waarde 1 (mag elk getal zijn, of (bijna) elk veld) voor alle records waarbij het RelatieID gelijk is aan het relatieID van het formulier.
 
Bedankt Michel

nu moet ik alleen nog even kijken waarom de knop op disabled blijft staan.
 
Je moet de code uitbreiden op de Current event. Zoiets als dit werkt:
Code:
Private Sub Form_Current()
Dim strSQL As String
Dim rs As DAO.Recordset

    If Me.NewRecord Then
        On Error Resume Next 'It should never occur, just to be sure...
        Me!RelatieID.DefaultValue = Nz(DMax("[RelatieID]", "tblRelaties"), 0) + 1
        Me.cmdcopy.Enabled = False
    Else
        strSQL = "SELECT Count([RelatieID]) As AantalRel FROM tblAfleveradres WHERE RelatieID =" & Me.RelatieID _
            & " AND Bezoekadres = '" & Me.Bezoekadres & "'"
        Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
        If rs.Fields(0).Value = 0 Then
            Me.cmdcopy.Enabled = True
        Else
            Me.cmdcopy.Enabled = False
        End If
    End If
End Sub
 
Bedankt Michel voor je uitleg en tips
deze optie is opgelost :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan