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
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]
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
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
Hallo,
ich hab dir mal ein einfaches Beispiel gemacht Deutsch/Englisch
Gruß Andreas
[Anhang gelöscht durch Administrator]
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