Kan in een rst!Duits geen variabele gebruiken rst!variabele

  • Onderwerp starter Onderwerp starter bas38
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

bas38

Gebruiker
Lid geworden
5 dec 2015
Berichten
15
goedeavond,
Ik ben nieuw op dit forum en zou graag een vraag stellen.

Ik ben een formulier aan het maken in MS access 2013
Formulier moet in meerdere talen beschikbaar zijn
Ik heb een functie die kijkt naar een variabele en op basis van de waarde van deze variabele wordt de juiste taal/tekst in de captions van de controls geplaatst
Deze functie zoekt tekst op op basis van een gekozen taal en retourneerd deze tekst in de variabele 'strLoadString']

Code:
Public Function LoadString(language As String, lngCtlNumber As Long) As String

On Error GoTo HandleErrors
Dim strLoadString As String
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String


Set db = CurrentDb

strSQL = "SELECT Translations.[" & language & "], Translations.[Number] FROM Translations WHERE Translations.[Number] = " & lngCtlNumber & ";"



Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)


With rst
If .RecordCount <> 0 Then
.MoveFirst



strLoadString = !Duits 'Deze manier Werkt wel!!

'strLoadString  = language 'Deze manier Werkt niet,ik heb hier ook meerdere variaties van geprobeerd zoals tussen haakjes etc
'het is juist de bedoeling dat ik op een of andere manier de strLoadString variable de waarde van de variabele veldnaam 'language' kan toewijzen


End If
End With

exithere:
On Error Resume Next
rst.Close
db.Close
Set rst = Nothing
Set db = Nothing
LoadString = strLoadString
Exit Function
HandleErrors:
MsgBox "basVertaling - LoadString:" & vbNewLine & Err.Number & " " & Err.Description
Resume exithere
End Function

Heeft iemand misschien een oplossing of advies voor mij zodat ik de variabele loadString kan vullen met de juiste veldnaam?
Mvg bas
 
Ik heb de oplossing gevonden
Ik verwijs nu eerst naar de velden van de recordset en geef dan als argument de variabele door :)

strLoadString = .Fields(language)

goedeavond,
Ik ben nieuw op dit forum en zou graag een vraag stellen.

Ik ben een formulier aan het maken in MS access 2013
Formulier moet in meerdere talen beschikbaar zijn
Ik heb een functie die kijkt naar een variabele en op basis van de waarde van deze variabele wordt de juiste taal/tekst in de captions van de controls geplaatst
Deze functie zoekt tekst op op basis van een gekozen taal en retourneerd deze tekst in de variabele 'strLoadString']

Code:
Public Function LoadString(language As String, lngCtlNumber As Long) As String

On Error GoTo HandleErrors
Dim strLoadString As String
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String


Set db = CurrentDb

strSQL = "SELECT Translations.[" & language & "], Translations.[Number] FROM Translations WHERE Translations.[Number] = " & lngCtlNumber & ";"



Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)


With rst
If .RecordCount <> 0 Then
.MoveFirst



strLoadString = !Duits 'Deze manier Werkt wel!!

'strLoadString  = language 'Deze manier Werkt niet,ik heb hier ook meerdere variaties van geprobeerd zoals tussen haakjes etc
'het is juist de bedoeling dat ik op een of andere manier de strLoadString variable de waarde van de variabele veldnaam 'language' kan toewijzen


End If
End With

exithere:
On Error Resume Next
rst.Close
db.Close
Set rst = Nothing
Set db = Nothing
LoadString = strLoadString
Exit Function
HandleErrors:
MsgBox "basVertaling - LoadString:" & vbNewLine & Err.Number & " " & Err.Description
Resume exithere
End Function

Heeft iemand misschien een oplossing of advies voor mij zodat ik de variabele loadString kan vullen met de juiste veldnaam?
Mvg bas
 
Allereerst welkom bij HelpMij! Mooi om te zien dat een nieuwe gebruiker de functie van de CODE knop al gelijk gevonden heeft :thumbs:. Wel daarbij een tip: je hebt nogal wat lege regels in je code zitten; die vergroten de leesbaarheid natuurlijk niet, en maken je code alleen maar nodeloos lang en daardoor zijn we nu gedwongen om te scrollen. Niet nodig, zoals je kunt zien aan de code die ik er van gemaakt heb:

Code:
Public Function LoadString(Language As String, lngCtlNumber As Long) As String
Dim rst As DAO.Recordset
Dim strSQL As String

    On Error GoTo HandleErrors
    strSQL = "SELECT " & Language & " FROM Translations WHERE [Number] = " & lngCtlNumber
    Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
    With rst
        If .RecordCount <> 0 Then
            .MoveFirst
            LoadString = !Duits 'Deze manier Werkt wel
            LoadString = .Fields(0) 'Deze manier werkt ook!
            LoadString = .Fields("Language") 'En nog een oplossing!!
        End If
        rst.Close
    End With
    Exit Function

HandleErrors:
    MsgBox "basVertaling - LoadString:" & vbNewLine & Err.Number & " " & Err.Description
End Function
Overigens zou ik het zelf anders oplossen; ik zou met één routine alle labels doorlopen en gelijk instellen op basis van je tabel. Dat kan prima, mits je gestructureerd werkt.
 
bedankt voor de reactie

ik gebruik een routine die alle controls op basis van welk type ze zijn bewerkt
Ik gebruik de controlnaam(ik heb ze allemaal een numerieke naam gegeven) als argument voor de bovenstaande functie.
Hier een voorbeeld van mijn routine,ik sta open voor goede tips want ik heb geen opleiding genoten om te kunnen programmeren ben een zgn doehetzelfver met veel geduld :)
Code:
Function applyLanguagecode(intLanguageCode As Long)
lnglanguagetranslationcode = intLanguageCode
Dim ctl As Control
For Each ctl In Me.Controls
If TypeOf ctl Is CommandButton Then
If ctl.Name <> "" And Not IsNull(ctl.Name) Then
ctl.Caption = LoadString(lnglanguagetranslationcode, ctl.Name)  
End If
End If
If TypeOf ctl Is Label Then
If ctl.Name <> "" And Not IsNull(ctl.Name) Then
'MsgBox ctl.Name
ctl.Caption = LoadString(lnglanguagetranslationcode, ctl.Name) 
End If
End If
Next ctl
End Function
als ik dit beter anders kan doen hoor ik dat heel graag want ik leer de dingen graag op de juiste manier te doen om mijn tot nu toe opgedane kennis te verbeteren.

Ik gebruik trouwens een tabel [id,Number,Nederlands,Engels,Duits,Roemeens]
In deze tabel staan alle vertalingen en op basis van veldnaam wordt de recordset ingeladen.[maar dat was denk ik wel duidelijk :)]
 
Toch jammer dat je de klassieke beginnersfout wel maakt: nodeloos quooten :). En dan ook nog eens jezelf citeren ;).
Je functie kan inderdaad een stuk simpeler, want je roept nu voor elk object opnieuw de recordset aan. Één keer openen en dan alle objecten instellen is sneller en handiger.
 
1 functie om alle objecten de juiste vertalingstekst te geven

Ik heb alles nu in 1 functie verwerkt
Is dit wat je bedoeld octafish?
Code:
Public Function setLanguageControls(language As String)
On Error GoTo HandleErrors
Dim strLoadString As String
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
Dim ctl As Control
Set db = CurrentDb
strSQL = "SELECT Translations.[" & language & "], Translations.[Id] FROM Translations "
Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
rst.MoveFirst
    Do Until rst.EOF
        For Each ctl In Me.Controls
            If TypeOf ctl Is CommandButton Then
                If ctl.Name <> "" And Not IsNull(ctl.Name) Then
                    If ctl.Name = rst!Id Then
                    ctl.Caption = rst.Fields(language)
                Else
                End If
            End If
        End If
        For Each ctl In Me.Controls
            If TypeOf ctl Is Label Then
                If ctl.Name <> "" And Not IsNull(ctl.Name) Then
                    If ctl.Name = rst!Id Then
                    ctl.Caption = rst.Fields(language)
                Else
                End If
            End If
        End If
rst.MoveNext
Loop
exithere:
On Error Resume Next
rst.Close
db.Close
Set rst = Nothing
Set db = Nothing
Exit Function
HandleErrors:
MsgBox "basVertaling - setLanguageControls:" & vbNewLine & Err.Number & " " & Err.Description
Resume exithere
End Function
Nu doorloopt de functie alle formulierobjecten tijdens elke record loop in de recordset
Kan ik dit misschien nog verbeteren?,alvast bedankt .
 
Zodra je in een functie herhalende gebeurtenissen ziet, weet je eigenlijk al dat het simpeler kan :).
Code:
Public Function setLanguageControls(language As String)
On Error GoTo HandleErrors
Dim strSQL As String, strLoadString As String
Dim rst As DAO.Recordset
Dim ctl As Control
    
    strSQL = "SELECT Translations.[" & language & "], Translations.[Id] FROM Translations "
    Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
    With rst
        Do Until .EOF
        For Each ctl In Me.Controls
            With ctl
                Select Case .ControlType
                    Case acCommandButton, acLabel
                        If ctl.Name = rst!ID Then ctl.Caption = rst.Fields(language)
                    Case acTextBox
                        ' Hier je code voor tekstvakken
                    Case acComboBox
                        ' Hier je code voor keuzelijsten etc, etc.
                End Select
            End With
        .MoveNext
        Loop
        .Close
    End With
    Exit Function

HandleErrors:
    MsgBox "basVertaling - setLanguageControls:" & vbNewLine & Err.Number & " " & Err.Description
End Function
Definieer ook geen opbjecten die je niet nodig hebt, zoals db. En laat acties weg die niks doen, zoals .MoveFirst. Zodra je een recordset opent, sta ja namelijk altijd op het eerste record.
 
bedankt voor de reactie

daar wringt bij mij de schoen een beetje
was nog niet zo bekend met with end with logica
Ik ga het toepassen en testen.
Uiteindelijk ga ik proberen de functie zo maken dat hij als ie aangeroepen wordt het volgende gaat doen
-Alle open formulieren en rapporten sluiten
-Loopen door de formulieren en rapporten in design mode ,teksten aanpassen en daarna saven en het standaard opstartformulier weer openen.

het zal voor de gebruiker enkel niet zo netjes eruitzien om alle formulieren en raporten open en dicht te zien gaan dus daar moet ik ook nog wat op vinden..

Ik zal als ik wat verder ben weer een voorbeeldje posten om te laten beoordelen.
Nogmaals bedankt voor het meekijken!
 
-Alle open formulieren en rapporten sluiten
-Loopen door de formulieren en rapporten in design mode ,teksten aanpassen en daarna saven en het standaard opstartformulier weer openen.
het zal voor de gebruiker enkel niet zo netjes eruitzien om alle formulieren en raporten open en dicht te zien gaan dus daar moet ik ook nog wat op vinden..
Ik wens je daar veel succes mee, het zou mijn oplossing niet zijn. Ik ken geen gebruikers die alle formulieren en rapporten tegelijk openen. Dus jouw methode lijkt mij nogal drastisch. Persoonlijk zou ik er voor kiezen om alleen die formulieren en rapporten aan te passen die de gebruiker op dat moment opent. En daarvoor gebruik ik dan de gebeurtenis <Bij laden>, zodat de gebruiker helemaal niks ziet van de onderliggende activiteit. Daarnaast zou ik de taalvoorkeur van de gebruiker opslaan bij de inloggegevens, zodat je maar één keer hoeft te vragen welke taal een gebruiker wil zien, en op basis van die keuze de formulieren dus 'live' aanpassen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan