voor opslaan record controle of geoppeld record is aangemaakt

Status
Niet open voor verdere reacties.

arnoderuig

Gebruiker
Lid geworden
8 sep 2000
Berichten
577
Ik heb een tabel tblOrders (index veld OrderID). Daaraan gekoppeld zit een tabel tblPlaatsing waarin ook een een indexveld OrderID voorkomt. Ik wil nu dat voordat een nieuw record in tblOrder wordt opgeslagen eerst wordt gecontroleerd of er in de tabel tblPlaatsing één of meer records is gekoppeld aan het record in tblOrder. Is dat niet zo dan moet het veld Editie op het tabblad Plaatsing de focus krijgen zodat alsnog een plaatsingsrecord kan worden aangemaakt.

Is hier een oplossing voor?
 
Ik krijg het vermoeden dat je de check op het formulier wilt doen, en dat is wel te doen. Bijvoorbeeld:
Code:
Dim strSQL As String
strSQL = "SELECT OrderID FROM tblPlaatsing WHERE [OrderID]=" & Me.OrderID
With CurrentDb.OpenRecordset(strSQL)
    If .RecordCount = 0 Then
        Me.Editie.SetFocus
    End If
    .Close
End With
Met vermoedelijk wat kleine aanpassingen wel in te bouwen.... Uit je informatie kan ik niet opmaken waarmee je de procedure aanstuurt; kom je daar niet uit, dan zien we dat wel weer hier!
 
OctaFish,

Het blijkt toch iets ingewikkelder omdat ik vergeten was iets te vertellen. Intussen begrijp ik ook meer hoe Access met mijn formulier omgaat.

Het formulier (frmOrders) voor de invoer van orders bestaat eigenlijk uit 2 tabbladen. Het eerste tabblad (genaamd Advertentiegegevens) dient voor de invoer van de algemene ordergegevens en is gekoppeld aan de tabel tblOrders. Het tweede tabblad (genaamd Plaatsingen) bevat de invoer van de editie(s) waarin een advertentie moet worden geplaatst. Op dit tabblad komt een formulier voor dat is gekoppeld aan de tabel tblPlaatsing.

Uit wat tests met jouw code kom ik erachter dat natuurlijk eerst het record tblOrder moet zijn aangemaakt voordat je met de invoer van plaatsingen kunt beginnen. Dat betekent waarschijnlijk dat ik de controle op de aanwezigheid van records in tblPlaatsingen moet leggen in het tabblad Plaatsingen (immers op het moment dat ik klik op het tabblad Plaatsingen komt direct de foutmelding omdat nog geen record Plaatsing kon worden aangemaakt]. Dat heeft tot gevolg dat de verwijzingen in de strSQL behoorlijk moet worden aangepast en dat levert me nu nog een probleem op.

Op het tabblad Plaatsingen staat het formulier voor de invoer van plaatsingen en is genaamd frmOrdersPlaatsingenSub en bevat het veld OrderID.

Ik kan nog wat hulp gebruiken bij de juiste VBA-code.
 
Als je te maken hebt met twee verschillende bronnen op één formulier waarbij de gegevens van de tweede bron (tblPlaatsing) afhankelijk is van de eerste (tblOrder) zou ik eerder met een apart formulier werken, dan met een subformulier op een hoofdformulier. Of met een niet-gebonden formulier, met op elk tabblad een eigen formulier op basis van de twee tabellen.
Zoals gezegd, ik zou de twee formulieren niet samen combineren op één formulier. Als je dus het eerste formulier invult en opslaat, kun je vanuit dat tweede formulier het tweede formulier openen, en de rest van de handelingen uit laten voeren. Moet je daarna ook nog iets doen op het eerste formulier, dan zou ik, bij het openen van het tweede formulier, het eerste formulier verbergen, de acties op het tweede formulier doen, en eventueel het eerste formulier (nog steeds geopend tenslotte) bijwerken, het tweede formulier sluiten en het eerste formulier weer zichtbaar maken.
Voor een gebruiker is het ook minder verwarrend om de formulieren los te koppelen (denk ik) omdat de bewerkingen op zich ook losstaande handelingen zijn. Ik gebruik zelf eigenlijk alleen tabbladen voor formulieren waarvan de gegevens aan elkaar gerelateerd zijn, en het voor de gebruiker ook duidelijk is dat ze bij elkaar horen. Het moet dan ook, naar mijn idee, voor de gebruiker mogelijk zijn voor een gebruiker om op elk willekeurig tabblad een willekeurige handeling te kunnen uitvoeren. Zodra je merkt dat een tabblad niet werkt omdat er op een ander tabblad niet iets is gedaan, dan heb je (nogmaals: mijn opvatting!) een situatie die voor gebruikers niet logisch meer is, en waarschijnlijk voor je database ook niet. Ergo: stuur je formulieren op een andere manier aan! is er voor jou een moverende reden om het op deze manier aan te pakken?
 
Tja, het is maar net hoe je naar zaken kijkt.

Het formulier bestaat uiteindelijk uit 3 tabbladen (waarbij het derde tabblad nog wat aanvullende gegevens over de order bevat). Ik ben altijd van mening geweest dat juist het gebruik van tabbladen binnen één formulier aangeeft dat deze tabbladen onlosmakelijk aan elkaar zijn verbonden. Om een order compleet te kunnen invullen zijn in ieder geval de eerste 2 tabbladen zondermeer nodig. Meestal gebruik ik in dit soort situaties één blad met een subformulier. Dan heb je in één oogopslag alle gegevens die bij elkaar horen bij de hand. In deze situatie is dat wat minder handig omdat er dan wat weinig ruimte is om zoveel mogelijk records uit Plaatsingen zichtbaar te maken. Daarom is dit nu in een ander tabblad geregeld.( Het gaat vaak om een jaarafspraak waarbij dan 12 plaatsingen worden vastgelegd).

Deze databse wordt door mijn klant nu al 9 jaar gebruikt. Oorspronkelijk is deze op vriendschappelijke wijze ontstaan maar zo langzamerhand wat professioneler geworden. Ik heb nog nooit opmerkingen over mijn opzet gekregen. In die 9 jaar is natuurlijk wel behoorlijk wat gewijzigd (ook is in stappen overgegaan van Access2000 naar Access2010). Het formulier voor de invoer van orders is in die periode nooit gewijzigd.

De klant wilde nu wat nieuwe aanpassingen waarbij ik er tot mijn grote schrik achterkwam dat vanaf het begin de thans gevraagde controle er nooit in heeft gezeten. Dat wil ik dus nu rechttrekken. Voor de aardigheid heb ik gekeken hoe vaak het in de afgelopen periode is voorgekomen dat een order is ingevoerd zonder plaatsingen. Dat bleken er gelukkig maar 3 te zijn.
 
Gelukkig is er geen ijzeren wet die ons vertelt hoe je een db moet maken :) Als je een bestaande db hebt die al 9 jaar bij de klant draait, zou ik de opzet uiteraard ook niet veranderen. Ik zou mij hooguit (namens de klant) afgevraagd hebben wat de meerwaarde is van het converteren van de hele db (en de rest van de office uiteraard) naar 2010... Oftwel: checken in hoeverre de Solow paradox opgaat. De vraag: Wat is de meerwaarde van muteren naar 2010 (of eerder naar 2007) is er een die naar mijn idee veel te weinig gesteld wordt.
Zo zonder verder inzicht in de db vind ik het lastig om aan te geven waar je probleem ligt.
Dat heeft tot gevolg dat de verwijzingen in de strSQL behoorlijk moet worden aangepast en dat levert me nu nog een probleem op.
Kun je aangeven waar je problemen mee hebt?
 
De belangrijkste reden om naar Access2010 over te stappen (vanaf Access2003) is dat de klant vanaf meerdere computers wilde werken en ze geen behoefte hadden aan uitgebreide licentiekosten voor Access. Vanaf versie 2007 is de Runtime-versie gratis bijgevoegd. Ik ben daar heel blij mee want dat werkt gewoon goed.

Mijn belangrijkste probleem ligt eigenlijk in VBA. Ik heb onvoldoende kennis om in dit geval te kunnen bevroeden hoe de opbouw van de StrSQL moet luiden, vooral de verwijzingen naar andere formulieren met tabbladen. Ik pas dan voorbeelden aan maar dan blijkt het weer niet te werken. Ik heb de afgelopen jaren best wat kennis opgebouwd en pas steeds meer VBA toe. Ik zoek daarvoor heel veel op Internet waar verschrikkelijk veel is te vinden. Zo nu en dan gebruik ik ook Helpmij als ik er echt even niet uitkom (zoals je hebt gemerkt). Ik ben iedere keer weer dolblij als mensen zoals jij de moeite nemen anderen op weg te helpen.
 
Kun je code posten die nu dus niet werkt? En graag ook de formuliernamen, tekstveldnamen, tabelnamen en veldnamen apart vermelden die erbij zijn betrokken. Misschien kunnen we het in een oogopslag zien.
 
Door ziekte ben ik pas nu in de gelegenheid nog even te reageren.

Ik heb inmiddels je eerste voorbeeld aangepast om toe te passen op het eerste tabblad waarin de ordergegevens worden ingevoerd. Nu komt er keurig een melding dat de order niet compleet is ingevoerd. Weliswaar krijgt een order-veld de focus maar de foutmelding is duidelijk genoeg om de gebruiker op weg te helpen.

Wel kwam ik er via opmerkingen op het internet achter dat de code beter zal werken als deze wordt toegepast bij Unload van het formulier in plaats van bij Close van het formulier. Mijn code is nu als volgt:

Private Sub Form_Unload(Cancel As Integer)
Dim strSQL As String
strSQL = "SELECT OrderID FROM tblPlaatsing WHERE [OrderID]=" & Me.OrderID
With CurrentDb.OpenRecordset(strSQL)
If .RecordCount = 0 Then
Cancel = True
MsgBox "Ga naar het tabblad Plaatsingen, daar is nog niets ingevuld."
Me.[Order.AdvertentieID].SetFocus
End If
End With
End Sub


Dank voor de voorgaande reacties, die we weer een hoop hebben geleerd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan