Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Beschriftung der Felder für Formulare aus einer Tabelle holen / Mehrsprachigkeit

Begonnen von smily68, September 04, 2011, 16:02:41

⏪ vorheriges - nächstes ⏩

smily68

Hallo

Ich habe eine Accesslösung, die ich nun verschiedensprachig machen möchte (deutsch und französisch).

Meine Idee ist es für jede Maske eine Tabelle zu machen und in dieser für jede Bezeichnung auf der Maske eine Feld zu machen. In dieser Tabelle habe ich nun einen Datensatz für deutsch und französisich. In dieser kann ich nun alle Begriffe auf deutsch und französisch eintragen.

Meine Frage / Problem, wie kann ich nun vom Formular aus auf dies Tabelle greifen?

Gruss Daniel

Hondo

Hallo,
anbei mal ein gezipptes PowerPoint zum Thema von mir. Wird dir sicherlich helfen.
Was du brauchst ist sowas wie eine Loader-Funktion. Ich habe sie für mich formloader genannt. Diese Wird beim Starten des Formulars ausgeführt.
Alles was mehrsprachig ist wird durch einen ID oder einen String im Formular codiert und der Text dazu dann in den Sprachtabellen abgelegt.
Anbei mal die Prozedur die ich verwendet habe. Codiert habe ich die Texte durch einen Index in eckigen Klammern. Also z.B. "[144]". Die Funktion SetLang holst aus der SprachAuswahl-Tabelle die gewählte Sprache bzw. setzt wenn nichts ausgewählt wurde Deutsch als Standard.

Public Sub formLoader(frm As Form)
    Dim ctl As Control, var1 As Variant, i As Long, saveFormID As Long

    'Sprache ermitteln
    SetLang

    Set db = CurrentDbC
   
    'FormularID holen
    Set rs = db.OpenRecordset("Select Id From MSysObjects Where Type = -32768 AND Name = '" & frm.Name & "'", dbOpenDynaset)
    saveFormID = rs!ID
    rs.Close

    'nur Textcodes des aktuellen Formulars holen
    Set rs = db.OpenRecordset("Select ID, Wert From " & lang & " Where FormID = " & saveFormID & " Order By ID", dbOpenDynaset)

    'Form.caption
    If Left(frm.Caption, 1) = "[" Then frm.Caption = getText(rs, frm.Caption)

    'Controls
    For Each ctl In frm.Controls
        Select Case ctl.ControlType
        Case 100    'Labels
            If Left(ctl.Caption, 1) = "[" Then ctl.Caption = getText(rs, ctl.Caption)
        Case 104    'Buttons
            If ctl.Picture = "(keines)" Then
                If Left(ctl.Caption, 1) = "[" Then ctl.Caption = getText(rs, ctl.Caption)
            End If
            If Left(ctl.ControlTipText, 1) = "[" Then ctl.ControlTipText = getText(rs, ctl.ControlTipText)
            If Left(ctl.StatusBarText, 1) = "[" Then ctl.StatusBarText = getText(rs, ctl.StatusBarText)
        Case 109    'Textbox
            If Left(ctl.ControlTipText, 1) = "[" Then ctl.ControlTipText = getText(rs, ctl.ControlTipText)
            If Left(ctl.StatusBarText, 1) = "[" Then ctl.StatusBarText = getText(rs, ctl.StatusBarText)
            If Left(ctl.ValidationText, 1) = "[" Then ctl.ValidationText = getText(rs, ctl.ValidationText)
        Case 110, 111    'Listenfelder und Kombinationsfelder
            'Werteliste
            If ctl.RowSourceType = "Value List" Then
                var1 = Split(ctl.RowSource, ";")
                If Left(var1(0), 1) = "[" Then
                    'Werteliste zurücksetzen
                    ctl.RowSource = ""

                    'Werteliste neu zusammensetzen
                    For i = 0 To UBound(var1)
                        ctl.RowSource = ctl.RowSource & getText(rs, CStr(var1(i))) & ";"
                    Next i
                    ctl.RowSource = Left(ctl.RowSource, Len(ctl.RowSource) - 1)
                End If
            End If
           
            'sonstige Werte
            If Left(ctl.ControlTipText, 1) = "[" Then ctl.ControlTipText = getText(rs, ctl.ControlTipText)
            If Left(ctl.StatusBarText, 1) = "[" Then ctl.StatusBarText = getText(rs, ctl.StatusBarText)
            If Left(ctl.ValidationText, 1) = "[" Then ctl.ValidationText = getText(rs, ctl.ValidationText)
        Case 122    'Umschaltfläche (warum gibts da eigentlich eine Gültigkeitsregel?)
            If ctl.Picture = "(keines)" Then
                If Left(ctl.Caption, 1) = "[" Then ctl.Caption = getText(rs, ctl.Caption)
            End If
            If Left(ctl.ControlTipText, 1) = "[" Then ctl.ControlTipText = getText(rs, ctl.ControlTipText)
            If Left(ctl.StatusBarText, 1) = "[" Then ctl.StatusBarText = getText(rs, ctl.StatusBarText)
            If Left(ctl.ValidationText, 1) = "[" Then ctl.ValidationText = getText(rs, ctl.ValidationText)
        End Select
    Next

    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub


Public Function getText(rs As DAO.Recordset, lCtl As String) As String
    Dim lNumber As Long
    If rs.EOF Then
        getText = lCtl
        Exit Function
    End If

    'Gegenprüfung ob wirklich eine Codierung vorliegt
    If Right(lCtl, 1) <> "]" Or Not IsNumeric(Mid(lCtl, 2, Len(lCtl) - 2)) Then
        getText = lCtl
        Exit Function
    End If

    lNumber = Mid(lCtl, 2, Len(lCtl) - 2)
    rs.MoveFirst
    rs.FindFirst "ID = " & lNumber
    If Not rs.NoMatch Then
        getText = rs!Wert
    Else
        getText = lCtl
    End If
End Function


Public Sub SetLang()
    Set db = CurrentDb
    If lang = "" Then
        Set rs = db.OpenRecordset("Select Tabellennamen From Sprachen Where Auswahl = true", dbOpenDynaset)
        If rs.RecordCount = 0 Then
            db.Execute "Update Sprachen set Auswahl = True where Tabellennamen = 'Deutsch'"
            lang = "Deutsch"
        Else
            lang = rs!Tabellennamen
        End If
        rs.Close
        Set rs = Nothing
    End If
    Set db = Nothing
End Sub


[Anhang gelöscht durch Administrator]

Hondo

Hallo,
die Sache mit der FormularID braucht man nicht unbedingt. Meine Intension war um bei sehr großen Sprachtabellen die Reaktionszeit zu verkürzen immer nun nach den Texten des aktuellen Formulars zu suchen. Kann man aber weglassen.
Was noch vergessen wurde sind Texte im VBA-Code, z.B. MsgBox oder wenn die Caption-Eigenschaft per Code gesetzt wird etc.
Da codiere ich direkt im Code wie folgt: MsgBox getCodeText(54)
Die Prozedur sieht so aus:
Public Function getCodeText(CodeNumber As Long) As String
    Set DB = CurrentDbC
    Set rs = DB.OpenRecordset("Select Wert From " & lang & " Where ID = " & CodeNumber, dbOpenDynaset)
    If Not rs.EOF Then getCodeText = rs!Wert
    rs.Close
    Set rs = Nothing
End Function


Außerdem ist zu bedenken, dass der Schaltflächentext von MsgBoxen nicht geändert werden kann. Eventuell daher darüber nachdenken ob man statt Msgbox ein eigenes Konstrukt aus einem Popup-Formular macht.

Gruß Andreas

smily68

Hallo Andreas

Vielen Dank. Ich muss sagen, ich blicke noch nicht ganz durch, da ich noch kein Access und VB Profi bin. Ich habe durch das Forum hier schon viel gelernt und bin allen sehr dankbar die sich Mühe und Zeit nehmen um uns Anfängern zu helfen.

Kannst du mir an einem einfachen Beispiel aufzeigen wie ich in einem Formular auf den 1 Datensatz eines Feldes in einer anderen nicht verknüpften Tabelle greifen kann.

Gruss Daniel

Hondo

Hallo,
ich hab dir mal ein einfaches Beispiel gemacht Deutsch/Englisch

Gruß Andreas

[Anhang gelöscht durch Administrator]

smily68

Hallo Andreas

Vielen Dank für deine Hilfe und dein Beispiel, ich werde dies nun ausgiebig analysieren und dann versuchen bei mir in die Praxis umzusetzten. Dazu brauche ich etwas Zeit, denn ich bin nicht der Typ der einefach einen Code nimmt, ich möchte den Code jeweils wirklich verstehen, damit ich daraus was lernen kann und in einer anderen Form für anderes wieder verwenden kann.

Ich werde mich sicher nochmals melden bei Problemen oder auch wenn alles läuft.

Gruss Daniel