besturingselement vullen met =RowNum([Form])

Status
Niet open voor verdere reacties.

Sytse1

Gebruiker
Lid geworden
9 aug 2007
Berichten
584
Office versie
miDer
In een formulier staat het besturingselement met de naam veld1. Verder staat er een besturingselement met de naam veld2 waarin het regelnummer wordt getoond met behulp van =RowNum([Form]).
Nu wil ik graag dat in het besturingselement veld1 de inhoud van veld2 =RowNum([Form]) komt.
Mijn oplossing is veld1=[veld2] maar dit werkt niet.
De oplossing is wellicht simpel maar hoe.
Wie geeft de oplossing?
b.v.d.
Sytse
 
Wellicht dat je vraag simpeler wordt als de vraag duidelijker is. Nu is het een beetje mistig, vrees ik. Om te beginnen: is je formulier aan de tabel gekoppeld? En zie je dan al niet de waarde van het veld in je formulier? Waarom zo ingewikkeld? En hoe kom je aan die functie RowNum? Mijn access kent die niet...
 
Sorry RowNumm bestaat inderdaad niet, deze VBA code staat nu in dit bericht..
En natuurlijk is er een tabel en een query. Het resultaat dat wordt getoond is een willekeurige selectie.
Ik wil aan deze selectie een oplopend nummer toekennen. Vandaar de regeltelling.
De regeltelling is keurig van 1 tot het aantal getoonde regels. Het besturingselement waar dit in staat wil ik dan in de tabel opslaan.
Is het zo wat duidelijker?
Public Function RowNum(frm As Form) As Variant
On Error GoTo Err_RowNum
'Geef het regelnummer
With frm.RecordsetClone
.Bookmark = frm.Bookmark
RowNum = .AbsolutePosition + 1
End With
Exit_RowNum:
Exit Function

Err_RowNum:
If Err.Number <> 3021& Then 'Negeer "Geen boormark" bij een nieuwe regel
Debug.Print "RowNum() error " & Err.Number & " - " & Err.Description
End If
RowNum = Null
Resume Exit_RowNum
End Function
 
Het zou duidelijker zijn als je de code zou opmaken met de CODE knop :)
 
Wat bedoel je met de code knop?
 
De knop met ( # ) waarmee je code er zo uitziet:
Code:
Public Function RowNum(frm As Form) As Variant
On Error GoTo Err_RowNum
    'Geef het regelnummer
    With frm.RecordsetClone
        .Bookmark = frm.Bookmark
        RowNum = .AbsolutePosition + 1
    End With
    Exit Function
    
Err_RowNum:
    If Err.Number <> 3021& Then 'Negeer "Geen boormark" bij een nieuwe regel
        Debug.Print "RowNum() error " & Err.Number & " - " & Err.Description
    End If
    RowNum = Null
End Function
 
Maar dit terzijde. Leg eerst eens uit wat je eigenlijk wilt, want daar wacht ik nog steeds op...
 
De query die de basis is van dit Form toont elke keer andere records in een willekeurige volgorde. De volgorde moet weer gebruikt worden in een ander Form van daar de wens om deze volgorde vast te houden. Nu weer terug naar het Form.
Door de vermelde code te gebruiken maak je in een Form een veld waarin in besturingselementbron
staat =RowNum([Form])
Dit veld nummert dan het aantal getoonde regels. B.v. als er 25 regels in het form(een doorlopend formulier) staat er in regel 1 in dit besturingselement 1 en op de volgende regel een 2 enz. Nu wil ik dit nummer opslaan in een (leeg)veld dat op dezelfde regel staat. Aangezien de nummering pas gebeurd bij het tonen van alle regels wordt het op recordniveau niet overgenomen. Dus een verwijzing van een veld, b.v. Veld1 besturingselementbron= Veld2 en in veld 2 staat dan bij besturingselementbron =RowNum([Form]) werkt niet.
Wellicht is dit zo duidelijk. Beter kan ik het niet uitleggen.
Ik denk dat ik weer iets onmogelijks wil en dat het alleen is op te lossen om steeds een nieuwe tabel te generen met een automatische nummering.
Sytse
 
Ik snap niet waarom je de query niet sorteert; dat moet toch simpel zijn? En een formulier neemt, mits je het formulier zelf niet sorteert, de sortering van de onderliggende bron over. Desnoods programmeer je de sortering in bij de gebeurtenis <Bij openen> van het formulier. De functie RowNum doet het op zich prima, maar je hebt daar volgens mij niks aan, omdat de nummers niet zijn gebonden aan de recordset.
Ik zou een oplossing eerder zoeken in de koppeling tussen de twee formulieren, want een formulier dat afhankelijk is van de sortering van het eerste formulier? Daar zou ik mijn lot niet van af willen laten hangen....
Als je toch een (tijdelijke nummering zou willen gebruiken, dan zou ik toch eerder de recordbron van het formulier in een Recordset zetten, en daar met een teller doorheen lopen. Die teller verhoog je dan steeds met 1, en de nieuwe waarde zet je dan in je extra veld weg. Dan heb je ook de hele RowNum constructie niet nodig.
 
Ik heb de volgende oplossing voor dit probleem gevonden.
Om een random query te maken zet je in de query het volgende: Randomnr: Rnd([ID])

Code:
Function RndNrToewijzing()
'Open een Query die randomgesorteerd is.
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String
    Dim VarNr 'Er gaat op basis van de randomsortering een nummer gegeven worden
              'vanaf nr 1 opvolgend
    Dim VarLetter 'Aan het nummer wordt een selectieletter geplakt omdat er er b.v. A en B geselecteerden zijn
    Dim VarSortNr 'Ondanks de samenvoeging van cijfer en letter de volgorde cijfermatig
    
'Oude nummertoewijzing verwijderen
    Set dbs = CurrentDb()
    strSQL = "Select * From Qry_AanwezigheidsregGeselecteerden"
    Set rst = dbs.OpenRecordset(strSQL)
      While (Not (rst.EOF))
       rst.Edit
        rst!Nummertoewijzing = Null
         rst!SortNr = Null
         rst.Update
           rst.MoveNext
      Wend

'Nieuwe nummertoewijzing
    Set rst = dbs.OpenRecordset(strSQL)
    VarNr = 1
    VarSortNr = 1
    VarLetter = rst!Pouleindeling
    While (Not (rst.EOF))
     rst.Edit
      If rst!Pouleindeling = VarLetter Then
        rst!Nummertoewijzing = VarNr & VarLetter
         rst.Update
          VarNr = VarNr + 1
          VarSortNr = VarSortNr + 1
         VarLetter = rst!Pouleindeling 'Kijk of de letter nog dezelfde is
         rst.MoveNext
      ' als de letter gewijzigd is opnieuw beginnen met nr 1
       Else
       VarNr = 1
       While (Not (rst.EOF))
         VarLetter = rst!Pouleindeling
           rst.Edit
           rst!Nummertoewijzing = VarNr & VarLetter
          rst.Update
         VarNr = VarNr + 1
         VarSortNr = VarSortNr + 1
        rst.MoveNext
        Wend
    End If
 Wend
   
   Forms!Frm_GeselecteerdenJBVleden.Requery
   'Alleen voor DAO code:
    rst.Close
    dbs.Close

End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan