Links maken in Access database

Status
Niet open voor verdere reacties.

Access2010

Gebruiker
Lid geworden
10 feb 2011
Berichten
116
Forum,

In de database Noorderwind zie je in formulieren en of tabellen links. Die linken dan naar hetzelfde item, maar dan in een ander formulier of tabel.

Mijn database nadert de voltooiing (komt nooit af je vind immers altijd wel een nieuwe uitdaging) en ik wil graag "linken".

Ik heb een formulier waarin ik de schadedata ingeef. Naast het hoofdformulier verschijnt een subform waarin bij. de 5 grootste schades staan. In een ander daaronder de laatste 5 schades.

Nu zou ik graag de schadedatum die in het subform te zien is linken naar het grote formulier met alle data.

Inmiddels heb ik het boek Access 2010 inside out (ruim 1900 pagina's met CD) maar (nog) niet gevonden. Heb het nog niet uit na een week.

Wie heeft de gouden tip??

Als altijd mijn dank.

Access 2010
 
Ik snap niet wat je wilt. Je hebt een subformulier met daarin de 5 laatste schades. Die hebben een datum, anders weet je niet dat het de 5 laatste zijn. Wil je die allemaal naar je hoofdformulier kopieëren? Mij lijkt dat een zinloze operatie, omdat je ze al kunt zien in het subformulier. En wat bedoel je met linken?
 
Laat ik duidelijker zijn. In de database Noorderlicht kom je op een tabel. Je ziet dat de iD's een hyperlink hebben. Als je daarop klikt dan ga je naar een gelinkte positie in de database. Als ik dus een algemene tabel heb met data dan wil ik op schadedatum een link maken, zodat ik op het specifieke formulier komt waarin alle relevante data staan, dus meer als in de tabel.

Ik zou dus graag die link maken.

Met dank.

Access2010
 
Ook goede morgen.

Ik zoek verder. Voor mij was een onderlijnde ID een hyperlink. Als ik alles zou weten dan zat ik niet op dit vragenvorm. Noorderlicht was inderdaad Noordenwind, maar dit terzijde. Iedereen die met Access werkt weet dat. Foutje moet kunnen. 3x een post was wel erg veel, de oplossing zat er niet tussen, alleen dat het een macro is die zorgt voor de verbindende factor. Eens kijken of die op de link te vinden is.

Access2010
 
Een echt zuivere hyperlink is het niet, maar het verwijst wel naar een plek. De oplossing van je probleem , wanneer ik het goed heb begrepen, is het gebruik maken van "bookmarks"
In de subformulieren kan je bij het onfocus event van bijvoorbeeld het datum veld, de volgende code opnemen, alleen de formuliernaam 'allesschades' zal wel anders heten en wellicht ook ID
Code:
  Dim RS As Object
    Set RS = Forms!alleschades.Recordset.Clone
    RS.FindFirst "[ID] = " & Me.Id
    Forms!alleschades.Bookmark = RS.Bookmark
    RS.Close
    Set RS = Nothing
Zie ook Bekijk bijlage schadeposten.zip

JanvP
 
Jan,

Dit is duidelijk in de richting. Ik ga sleutelen. Het mooiste zou zijn als er iets van een hyperlinkhandje bij kwam, immers het lijkt voor de gebruiker (het gaat in een overall schademanagement programma) op een hyperlink.

Mijn dank voor het delen van je kennis.

Access2010
 
Jan,

Het werkt dus niet zoals ik wil. Ben wel op weg, zal e.e.a. verduidelijken.

Ik heb een gekochte schil om mijn database. Die werkt perfect. Punt is dat de formulieren een subform zijn binnen die omgeving. Kies je in het menu een formulier dan is dat feitelijk een Subform. Het gekozen formulier wordt netjes geplaatst naast het menu.


Je staat op een (sub)formulier in de database en zet je cursor op schadedatum. Dan wil je naar een ander (sub)formulier waarin alle relevante (=uitgebreide) data staan. Dat formulier heet Formulier1. Schadedatum spreekt voor zich.

Het gaat fout denk ik omdat ik Formulier1 niet weet aan te duiden als subformulier.

Ik priegelde met jou code en ook nog even in je voorbeeld (+codes) gekeken. Daaruit maakte ik dit:

Code:
Private Sub Schadedatum_GotFocus()
  On Error GoTo Fout
  Dim RS As Object
    Set RS = Forms!Formulier1.Recordset.Clone
    RS.FindFirst "[Schadedatum] = " & Me.Schadedatum
    Forms!Formulier1.Bookmark = RS.Bookmark
    RS.Close
    Set RS = Nothing

  
  On Error Resume Next


Exit_fout:
  Exit Sub
Fout:
  MsgBox Err.Description
  Resume Exit_fout
End Sub

Als altijd dank voor de hulp.

Access2010
 
Laatst bewerkt door een moderator:
De beste oplossing is natuurlijk zelf even Googlen met "refer subform Access" ;)
Je komt dan uit op
http://access.mvps.org/access/forms/frm0031.htm

In ieder geval is in jouw geval de oplossing waarschijnlijk :
Code:
Set rs=forms![betaaldeform]![formulier1].recordsetclone 
..
forms![betaaldeform]![formulier1].bookmark = rs.bookmark
Groet JanvP
 
Jan,

Dan moet je dus wel even weten hoe je moet googlen, met welke zoekfunctie.

Interessante pagina, maar dit is het hebben van een ontstoken teen en de dokter geeft je zijn handboek en naald en draad mee.

Vergt enige studie, ga jou oplossing uitproberen.

Access2010
 
De oplossing is in essentie heel simpel: zodra een formulier op een ander formulier staat, en je wilt er naar verwijzen, dan moet dat eerste formulier worden opgenomen in de vermelding. Verder moet Access weten dat je een eigenschap van een formulier wilt hebben, dus na de naam van het formulier zet je nog .Form. In jouw geval zou het er dus zo uit kunnen zien:
Code:
Set Rs=Forms!Hoofdformulier!Formulier1.Form.recordsetclone
Staan beide subformulieren op één hoofdformulier, dan kun je ook met Parent naar het vorige niveau wijzen; in dat geval hoef je de naam van het hoofdformulier niet te gebruiken.
 
Michel,

Ik sta in het formulier Top10ladingschade op schadedatum. Ik wil naar Formulier1. Maakte deze constructie naar ik dacht conform jou opmerking:

Code:
Option Compare Database

Private Sub Form_GotFocus()

End Sub

Private Sub Schadedatum_GotFocus()
  On Error GoTo Fout
  Dim RS As Object
    
    Set RS = Forms!Top10ladingschade!Formulier1.Form.RecordsetClone
    RS.FindFirst "[Schadedatum] = " & Me.Schadedatum
    Forms!Formulier1.Bookmark = RS.Bookmark
    RS.Close
    Set RS = Nothing

  
  On Error Resume Next


Exit_fout:
  Exit Sub
Fout:
  MsgBox Err.Description
  Resume Exit_fout
End Sub

En wat zegt Access:

UI Builder for Microsoft Access kan het formulier Formulierl niet vinden waarnaar
wordt verwezen.

UIBUilder is een tool die ik gekocht heb. Ik gaf al aan dat UIbuilder beide formulieren als subformulier ziet.

De simpele oplossing is voor mij nog ver weg.

Access2010
 
Laatst bewerkt door een moderator:
Tussendoortje: kun je je code opmaken met de Code tag? (knop #). Dat leest makkelijker. Ik snap eerlijk gezegd ook waarom je met een Recordset clone werkt, al zou het misschien wel zou moeten kunnen. Je gebruikt hem namelijk niet om een record op te zoeken, maar alleen maar om een waarde (en niet eens een unieke, maar een eerste) te zoeken. En daarna sluit je het formulier. Ik zou een Normale recordset openen, de waarde opzoeken en de recordset sluiten. En Formulier1 openen met OpenArgs. Lijkt mij een stuk simpeler...
 
Michel,

De hele avond gestudeerd, maar jou oplossing niet werkend gekregen. Ook nog de oplossing van JanvP bekeken en herschikt, werkt niet, terwijl dat wel een oplossing zou kunnen zijn. Ik zit met het verschijnsel subformulieren binnen de schil die ik gebruik om mijn database een menustructuur (en andere mogelijkheden) te geven.

Waar ik dan OpenArgs neerzet is al helemaal ene raadsel. Ben op te glad ijs gaan staan voro iets dat vrij simpel leek. In een website even linken, hier even niet.

The winner takes it all, the loser has to fall. Nou dat laatste is op dit tijdstip even het geval, zeker wat betreft de oogleden.

Ik kom er niet uit.

Access2010
 
OpenArgs is een variabele die je meegeeft bij het openen van een formulier. Het werken ermee bestaat dan ook uit twee stappen: stap 1 is het vastleggen van de variabele die je meegeeft; stap 2 is het teruglezen van de variabele bij het openen van het formulier. Een OpenArgs variabele kan per opdracht maar één keer worden gebruikt; je geeft dus één tekstregel of waarde op in het OpenArgs argument. Wil je maar één waarde overhevelen, dan is dat prima bruikbaar; wil je meerdere variabelen meegeven, dan is dus een truc nodig om de waarden na inlezen in het formulier weeer te splitsen.

De eerste stap doe je bij het commando bij het openen van een formulier. Daarbij kun je verschillende opties gebruiken, zoals je misschien wel weet. Elke optie kun je instellen als je een comma typt; je ziet dan de verschillende opties voorbij komen. De laatste optie is dan de OpenArgs variabele. Zo'n opdracht ziet er bijvoorbeeld zo uit:

Code:
        DoCmd.OpenForm "frmPlayers", , , , acAdd, acDialog, NewData & "|" & Me.Parent.cboHomeTeamID

Hiermee wordt een nieuw record toegevoegd aan het formulier frmPlayers, met twee variabelen in het OpenArgs element: NewData en Me.Parent.cboHomeTeamID. Deze twee variabelen worden op het formulier frmPlayers weer uit elkaar getrokken, en aan de Formuliervelden toegewezen. Dat gebeurt dan zo:

Code:
Private Sub Form_Load()
    If Not IsNull(Me.OpenArgs) Then
        sArgs = Split(Me.OpenArgs, "|")
        strPlayer = sArgs(0)
        lngTeam = sArgs(1)
        Me![strPlayerName] = strPlayer
        Me.lngTeamID = lngTeam
    End If
End Sub

Met Split wordt de string in dit voorbeeld eerst opgesplitst in een matrix; daarna worden de matrixelementen toegewezen aan de tekstvelden. Dat hoef je dus niet te doen als je maar één variabele meegeeft met OpenArgs, want die kun je gelijk toewijzen aan het formulier.
 
Michel,

Ingewikkeld, maar daar ga ik deze week uitkomen. Laat je het resultaat weten.

Mijn hartelijke dank als altijd.

Access2010
 
Ik heb nog wat zitten spelen met het nieuwe Access 2010 navigatiefomulier.
Op deze manier kon ik het UIBuilder ietwat simuleren.

De code bij de datum in de subformulieren wordt dan
Code:
Private Sub datum1_GotFocus()
  On Error GoTo Fout
  Dim RS As Object
    Set RS = Me.Parent.Recordset.Clone
    RS.FindFirst "[ID] = " & Me.Id
    Me.Parent.Bookmark = RS.Bookmark
    RS.Close
    Set RS = Nothing
Exit_fout:
  Exit Sub
Fout:
  MsgBox Err.Description
  Resume Exit_fout
End Sub
In het nieuwe formulier Schadetop10 is de code bij de datum
Code:
Private Sub datum1_GotFocus()
  If Not IsNull(Me.Id) Then P_ID = Me.Id
  DoCmd.BrowseTo acBrowseToForm, "alleschades", , , , acFormEdit
End Sub
Hierbij is DoCd.BrowseTo een nieuw Access 2010 control en deze werkt misschien ook met UIBuilder.
P_ID is gedeclareerd in een module, want bij het laden van het formulier alleschades wordt bij de formload event de volgende code uitgevoerd.
Code:
Private Sub Form_Load()
  On Error GoTo Fout
  Dim RS As Object
  If Nz(P_ID) > 0 Then
    Set RS = Me.Recordset.Clone
    RS.FindFirst "[ID] = " & Str(P_ID)
    Me.Bookmark = RS.Bookmark
    RS.Close
    Set RS = Nothing
    P_ID = Null
  End If
Exit_fout:
  Exit Sub
Fout:
  MsgBox Err.Description
  Resume Exit_fout
End Sub
En zo zijn we weer terug bij de bookmark.
Zie ook het Access 2010 voorbeeld Bekijk bijlage schadepostenA2010.zip

Succes verder.

JanvP
 
Jan,

Op voorhand al mijn dank voor je moeite. Ik ga plakken en kijken of het lukt. Je hoort.

Kijk ook zo naar je voorbeeld.

Top.

Access2010
 
Forum,

Ben jullie nog de stand van zaken verschuldigd. Ik heb met de oplossing van JanvP gespeeld en het werkte.

De feitelijke oplossing was als volgt:

Private Sub Schadedatum_GotFocus()
On Error GoTo Fout
Dim RS As Object
Dim varValue

varValue = Me.Schadedatum.Value
sChangeSubform 0, "Formulier1", True
Set RS = gobjMain!SubForm1.Form.Recordset.Clone '
RS.FindFirst " fSimpleDate([Schadedatum]) = """ & fSimpleDate(varValue) & """"
gobjMain!SubForm1.Form.Bookmark = RS.Bookmark
RS.Close
Set RS = Nothing

On Error Resume Next
Exit_fout:
Exit Sub
Fout:
MsgBox Err.Description
Resume Exit_fout
End Sub


De crux zat verder in het hanteren van de Amerikaanse manier van datumweergave, dat moet veranderd worden en daarvoor kwam de hulp vanuit Amerika (niet ia dit forum overigens). Opgelost met een stukje code voor:""" & fSimpleDate(varValue) & """"

De oplossingen heb ik veilig in mijn archief opgeslagen.

Dank voor alle steun.

Om alles uiteindelijk optimaal te perfectioneren komt er nog een vraag op dit forum waar ik ook hier weer hoop dat iedereen er iets aan heeft.

Access2010
 
Je had ook op dit forum een oplossing kunnn vinden voor het datumprobleem....

Code:
Const strcJetDate = "\#mm\/dd\/yyyy\#" 
RS.FindFirst " [Schadedatum] = " & Format(varValue,strcJetDate )

Zoals je ziet: geen extra functie nodig...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan