Microsoft Access

Uit DeVliegendeWiki

Ga naar: navigatie, zoeken

Inhoud

Afronden

Correct afronden van geldbedragen op twee decimalen is vaak verbazend lastig. Komt-ie:

De Eeuwige Oplossing: int(x*100)/100 levert vaak te lage bedragen op. Bv. 2,99999 wordt 2,99 in plaats van 3,00

De functie Round gebruikt Banker's rounding, wat op zich niet gek bedacht is, maar toch niet accuraat lijkt te zijn. Bv.: 2,025 wordt afgerond op 2,02, terwijl het 2,03 zou moeten zijn [1]. Tenzij je ingewikkelde maatwerkoplossingen wilt bouwen, is dit waarschijnlijk de oplossing.

Bronnen

Find & Replace in VBA

Met de functie replace kun je programmatisch een find & replace doen. Bv.:

print replace ("Jantje zag eens pruimen hangen","pruimen","bananen")

geeft:

Jantje zag eens bananen hangen

en

print replace ("Jantje zag eens pruimen hangen","pruimen","bananen")

geeft:

Jantje zag eens bananen bananen hangen

Formulier kan niet opgeslagen worden

Mogelijk een probleem met het formulier zelf, en niet Access. Mogelijke oplossing: Oorspronkelijke formulier opnieuw aanmaken en daarmee verder werken.

Inhoud van verschillende records samenvoegen in 1 record

Zo simpel kan het: Een iteratieve update-query

Regelmatig moet ik data uit een tabel invoegen in 1 veld van een andere tabel of dezelfde tabel. Dat kan met een update query: Zie schermafbeelding.

Uiteraard kan het ook via VBA-code. Het voorbeeld hieronder doet trouwens meer dan alleen samenvoegen van records: Er wordt html-opmaak toegevoegd.

Private Sub btn_Body_Click()

Debug.Print ">>> btn_Body_Enter()"

''''''''''''''''''''''''''''''
' Defineer variabelen
''''''''''''''''''''''''''''''
'
Dim dbs As Database
Dim rBrush As Recordset
Dim sSource As String

Dim sBrushID As String
Dim sSourceOB As String
Dim rBrushOB As Recordset

Dim iOrgBrush As Integer

' Open bijbehorende recordset op tbl_Tool
'
Dim rTool As Recordset
Dim sSourceTool As String

''''''''''''''''''''''''''''''
' Open recordset op tbl_Brush
''''''''''''''''''''''''''''''

sSource = "select * from tbl_Brush"
Set dbs = CurrentDb

Set rBrush = dbs.OpenRecordset(sSource)

rBrush.MoveLast

Debug.Print "   rBrush.Recordcount: " & rBrush.RecordCount

If rBrush.RecordCount = 0 Then

    ' Do nothing
    
Else
  
    '''''''''''''''''''''''''''''''''''
    ' Ga naar eerste record tbl_Brush
    '''''''''''''''''''''''''''''''''''

    rBrush.MoveFirst

    ' ''''''''''''''''''''''''
    ' Loop door records rBrush
    ''''''''''''''''''''''''''
    
    While Not rBrush.EOF
        '
        ' Nu het huidige rBrush-record bewerken
        '
        '''''''''''''''''''''''''''
        ' Reset rBrush.Omschrijving
        '''''''''''''''''''''''''''
        '
        rBrush.Edit
            rBrush![omschrijving] = ""
        rBrush.Update

        ' Debug-info
        '
        sBrushID = rBrush![Koolborstel-ID]
        Debug.Print "   ID huidige brush: " & sBrushID
        
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Open bijbehorende recordset op tbl_OriginalBrush
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        '
        sSourceOB = "select * from tbl_Originalbrush WHERE [Koolborstel-ID]='" & sBrushID & "'"
       
        Debug.Print "   Query tbl_OriginalBrush: " & sSourceOB

        Set rBrushOB = dbs.OpenRecordset(sSourceOB)

        If rBrushOB.BOF And rBrushOB.EOF Then
        
            Debug.Print "   Recordset rBrushOB is leeg"
            ' Do nothing
            
        Else

            ' Ga naar eerste record van Originele Koolborstels
            '
            rBrushOB.MoveFirst
            Debug.Print "Org. Brush-ID: " & rBrushOB![OriginalBrushID]
            '
            '''''''''''''''''''''''''''''''''''''''''''''
            ' Maak header voor originele koolborstels aan
            '''''''''''''''''''''''''''''''''''''''''''''
            '
            rBrush.Edit
                rBrush![omschrijving] = rBrush![omschrijving] & _
                    "<br><br><strong>Originele koolborstels: </strong>"
            rBrush.Update

            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            ' Ga met een loop door alle bijbehorende Originele Koolborstels
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            '
            While Not rBrushOB.EOF
               
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                ' Voeg apparaten toe aan veld Omschrijving v. record tbl_Brush
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                '
                rBrush.Edit
                rBrush![omschrijving] = rBrush![omschrijving] & rBrushOB![Merk] & _
                " " & rBrushOB![OriginalBrushID] & ", "
                rBrush.Update
                '
                ''''''''''''''''''''''''''''''''''''''
                ' Ga naar volgende record in tbl_Brush
                ''''''''''''''''''''''''''''''''''''''
                rBrushOB.MoveNext
        
            Wend
            '
            ' Verwijder laatste komma
            
            rBrush.Edit
                rBrush![omschrijving] = Left$(rBrush![omschrijving], Len(rBrush![omschrijving]) - 2)
            rBrush.Update
            
            '
            '''''''''''''''''''''''''''''''''''''''''
            ' Maak voeter voor sectie 'Apparaten' aan
            '''''''''''''''''''''''''''''''''''''''''
            ' Hoeft niet meer, want geen bulleted list meer
            '
            ' rBrush.Edit
            ' rBrush![Omschrijving] = rBrush![Omschrijving] + "</ul>"
            ' rBrush.Update
            
        End If 'OrgBush.recordcount=0
    
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Open bijbehorende recordset op tbl_Tool
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        '
        sSourceTool = "select * from tbl_Tool WHERE [Koolborstel-ID]='" & sBrushID & "'"
        
        'Debug.Print "   sSourceTool: " & sSourceTool
        
        Set rTool = dbs.OpenRecordset(sSourceTool)
        
        If rTool.BOF And rTool.EOF Then ' Lege recordset
               
            Debug.Print "   Recordset rTool is leeg"
            ' Do nothing
            
        Else
        
            rTool.MoveFirst
        
            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            ' Maak header 'Apparaten' aan in huidige record tbl_Brush
            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            '
            rBrush.Edit
            rBrush![omschrijving] = rBrush![omschrijving] + "<br><br><strong>Apparaten: </strong>"
            rBrush.Update
        
            '''''''''''''''''''''''''''''''''''''''''''''''''''
            ' Ga met een loop alle bijbehorende apparaten langs
            '''''''''''''''''''''''''''''''''''''''''''''''''''
            '
            While Not rTool.EOF
            
                        
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                ' Voeg apparaten toe aan veld Omschrijving v. record tbl_Brush
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                '
                rBrush.Edit
                    rBrush![omschrijving] = rBrush![omschrijving] & rTool![Apparaatsoort] & _
                    " " & rTool![Merk] & " " & rTool![Apparaattype] & ", "
                rBrush.Update
                '
                ''''''''''''''''''''''''''''''''''''''
                ' Ga naar volgende record in tbl_Brush
                ''''''''''''''''''''''''''''''''''''''
                rTool.MoveNext
        
            Wend
            '
            ' Haal nu de laatste komma weg
            '
            rBrush.Edit
                rBrush![omschrijving] = Left$(rBrush![omschrijving], Len(rBrush![omschrijving]) - 2)
            rBrush.Update
            
        End If ' rTool.recordcount=0
    
    rBrush.MoveNext
    
    Wend ' while not rBrush.eof
    
End If  ' rBrush.recordcount=0
    
''''''''''''''''''''''''''''''
' Eind
''''''''''''''''''''''''''''''
'
Debug.Print "<<< btn_Body_Enter()"

End Sub

Query: Alleen deel van een veldwaarde weergeven

Een van de velden in een tabel bevat dubbele primaire sleutels. Zoiets als "0199/1199". Dat moet gescheiden worden. Daarom wil ik dat in een query alleen de eerste vier tekens weergegeven worden.

De oplossing: Een veld toevoegen aan de query met als waarde voor Veld:

Expr1: Left([Veldx];4)

Ik heb de indruk dat het cruciaal was om een punt-komma te gebruiken, en niet een komma.

Query: Filter dubbele records uit

Access heeft hier een wizard voor. Het werkt middels count.

Query: Filter niet-corresponderende records

Filter records uit een tabel die niet in een andere tabel voorkomen. Access heeft hier een wizard voor.

Recordset

Voorbeeld van het openen van een recordset: http://www.issociate.de/board/post/283310/OpenRecordset_method.html

Refereren naar een subformulier

To refer to a control on a subform, use the following syntax:

Forms![main form name]![subform control name].Form![control name]

To refer to a control on a subreport, use the following syntax:

Reports![main report name]![subreport control name].Report![control name] 

Om te refereren naar een eigenschap van een subformulier, moet de syntax zijn zoals:

Forms!frm_Order!fsub_OrderRegel.Form.caption

Refresh

Met refresh zoals in me.refresh wordt het huidige formulier of gegevensblad bijgewerkt aan de hand van de onderliggende databron. Net als F5 in een browser: De data wordt opnieuw opgehaald

Splits een string

In Drupal hadden we taxonomische paden bij artikelen. In het betreffende veld in Access, stonden die paden achter elkaar, gescheiden door een dubbele streep. Deze paden moesten gecopieerd worden naar een andere tabel, met 1 pad per regel. Oftewel, de oorspronkelijke tekenreeksen moesten gesplitst worden. Komt-ie:

dim TestString as string
dim TestArray() as string

TestString="Jantje zag eens pruimen hangen"
TestArray=Split(TestString)

debug.print TestArray(1)

De gesplitste substrings worden in een vector geplaatst (een eendimensionale array).

Bron: http://msdn.microsoft.com/en-us/library/6x627e5f%28v=vs.80%29.aspx#Y1026

Vector uitlezen

Als bv. TestArray() een vector is, kun je niet zomaar debug.print TestArray() doen. Hoe het wel kan:

Dim TestString As String
Dim TestArray() As String

TestString = "Jantje zag eens pruimen hangen"

TestArray = Split(TestString)

For i = LBound(TestArray) To UBound(TestArray)

    Debug.Print TestArray(i)
    
Next

geeft als output:

Jantje
zag
eens
pruimen
hangen

Bron: http://patorjk.com/programming/tutorials/vbarrays.htm

Bronnen

Persoonlijke instellingen