Sub maken toepasbaar op Forms en Reports

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.279
Na de nuttige suggesties van Octafish heb ik wat zitten spelen met TempVars en een tabel om vertalingen voor captions op formulieren en/of rapporten te voorzien.
De tabel ziet er zo uit (label_caption is de oorspronkelijk caption die gelijk is aan de veldnaam):
Label_Caption NL FR
Close Form Sluiten Fermer
frm_members Leden Membres
ID ID ID
mem_Name Naam Nom
mem_Town Stad Ville
tbl_Members Leden Membres

Op een startformulier staat een groep keuzerondjes (fra_taal) om de taal te kiezen
Code van het startformulier:

Code:
Private Sub Form_Open(Cancel As Integer)
With TempVars
    .Add "Fieldname", "NL"
End With
End Sub

Private Sub fra_taal_AfterUpdate()
Select Case fra_taal.Value
Case 1
    TempVars("Fieldname") = "NL"
Case 2
    TempVars("Fieldname") = "FR"
End Select

End Sub

In een algemene module staat volgende sub:
Code:
Sub Translate(Formname As String)
Dim ctl As Control, fieldname As String, tablename As String, criterium As String
fieldname = TempVars("Fieldname")
tablename = "tbl_translations"
    For Each ctl In Forms(Formname).Controls 
        If TypeOf ctl Is Label Or TypeOf ctl Is CommandButton Or TypeOf ctl Is OptionGroup Then
        criterium = "label_Caption = '" & ctl.Caption & "'" '
        ctl.Caption = Nz(DLookup(fieldname, tablename, criterium), ctl.Caption)
        End If
    Next
End Sub

Die ik aanroep in elk formulier waar de captions moeten vertaald worden:
Code:
Private Sub Form_Open(Cancel As Integer)
Translate Formname:=Me.Name
End Sub

Nu mijn vragen:
1. Hoe kan ik die sub in de algemene module aanpassen zodat hij ook bruikbaar is voor rapporten?

Code:
Sub Translate(ObjectName As String, Verzameling as ???????) 'waarbij verzameling dus forms of reports kan zijn
.....
For Each ctl In Verzameling(Objectname).Controls

.......

2. Is mijn werkwijze correct of kan het beter :)?
 
Ik doe het anders, en heb jou probleem niet. Ik denk dat ik dus maar bij mijn methodiek blijf :). D'r komt zelfs geen variabele aan te pas ;).
 

Bijlagen

Persoonlijk vind ik dit veel ingewikkelder... en jij gebruikt een andere sub voor het rapport dan voor het formulier, is juist wat ik wil vermijden.
Heb jouw methode niet zo goed door, maar heb zo een gevoel dat het voor mij niet toepasbaar is.
Ik wil 10-20 veldnamen wijzigen, eventueel uit verschillende tabellen,en die op willekeurige formulieren en rapporten staan, niet altijd dezelfde veldnamen en ook niet altijd dezelfde volgorde. En dan nog in verschillende databases waarin met dezelfde tabellen, maar met andere formulieren en rapporten gewerkt wordt.
Eigenlijk was het maar een oefening voor mezelf.
Momenteel geef ik opleiding aan een tweetalige firma (de Belgische Spoorwegen), en die maken ook formulieren waar de gebruiker een taal kan kiezen.
Dus ik vond mijn probeersel een nuttige oefening voor ze. Voorbeeld van een sub in een algemene module, Tempvars , DLOOKUP en NZ. DAO met SQL komt in die cursussen nauwelijks of niet aan bod, daar is helaas geen tijd voor.
 
Laatst bewerkt:
Persoonlijk vind ik dit veel ingewikkelder... en jij gebruikt een andere sub voor het rapport dan voor het formulier, is juist wat ik wil vermijden.
Huh? Zoek de verschillen in deze codes:
Code:
Private Sub Report_Load()
Dim strSQL As String
Dim i As Integer
Dim rs As DAO.Recordset
    If Not Me.OpenArgs = "" Then
        strSQL = "SELECT * FROM tblVertaling WHERE Taal = " & Me.OpenArgs & " AND [Objectnaam] = """ & Me.Report.Name & """"
        Set rs = CurrentDb.OpenRecordset(strSQL)
        With rs
            Do While Not .EOF
                Me(!Veldnaam).Caption = !Waarde.Value
                .MoveNext
            Loop
            .Close
        End With
    End If
End Sub

Code:
Private Sub Form_Load()
Dim strSQL As String
Dim i As Integer
Dim rs As DAO.Recordset
    If Not Me.OpenArgs = "" Then
        strSQL = "SELECT * FROM tblVertaling WHERE Taal = " & Me.OpenArgs & " AND [Objectnaam] = """ & Me.Form.Name & """"
        Set rs = CurrentDb.OpenRecordset(strSQL)
        With rs
            Do While Not .EOF
                Me(!Veldnaam).Caption = !Waarde.Value
                .MoveNext
            Loop
            .Close
        End With
    End If
End Sub
Anders dan de naam van het rapport of formulier afhalen zul je niet vinden. En een rapport open je nu eenmaal met een ander commando (Docmd.OpenReport) en parameter dan een formulier (Docmd.OpenForm) en dan ga ik jou een hele knappe jongen vinden als je dát kan omzeilen... Maar ik vrees dat ik jou ook niet snap, en dat daar dus een stukje verwarring ligt.
Je wilt ook veldnamen wijzigen? Ook dat kan met mijn methodiek, al moet je er dan denk ik nog wat velden bij knutselen. De crux ligt hem er in dat je alle objecten die je wilt kunnen veranderen vastlegt in een tabel, zodat je die data kan inlezen op het moment dat je hem nodig hebt. Jouw opzet met één record en alle parameters kan natuurlijk ook, al moet je dan veel meer doen m.i. dan in mijn opzet. Jij moet steeds filteren op een ander veld, Ik hoef alleen te filteren op een paar waarden in een vast veld. Als ik er 20 talen bij wil hebben, dan hoef ik alleen die talen maar toe te voegen en daar records voor te maken (kan met een simpele toevoegquery die je automatiseert) en presto, ik ben klaar. Jij moet je tabel aanpassen (velden toevoegen) en je code aanpassen omdat je steeds andere velden moet gebruiken. Ik weet wel wat ik handiger vind!
 
Mijn poging was in een algemene module een sub te schrijven die kan aangeroepen worden vanuit een willekeurig formulier én een willekeurig rapport, maar dat gaat dus niet. Geen ramp.
En ik ga zeker niet in discussie wat de beste methode is, voor mij als niet-programmeur is jouw methode moeilijker en ik zou ze niet meteen kunnen uitwerken.
En in elke geval zou je voor elke taal de vertalingen ergen moeten gaan intypen. Maar zolang het geen programma's voor de EU betreft :)
Fijn WE!
 
Mijn poging was in een algemene module een sub te schrijven die kan aangeroepen worden vanuit een willekeurig formulier én een willekeurig rapport, maar dat gaat dus niet. Geen ramp.
Heb ik ergens gezegd dat dat niet kan? Dat kan prima namelijk. Als je daar zelf niet uitkomt, maak ik de functie nog wel.
En ja, hoe meer talen, hoe meer typewerk. Maar daar is de 'typgeit' toch voor uitgevonden?
 
Bedankt, maar hoeft niet.
De oorspronkelijk bedoeling (voor opleidingen), namelijk veldnamen in het tabelontwerp én de naam van de velden en de bijschriften van de labels in formulier- en rapportontwerpen definitief via VBA wijzigen heb ik opgegeven.
Probleem verschoven naar eindgebruikers die enkel de tekst op de formulieren zien maar niet naar ontwerp noch tabellen gaan :)
 
Ook goed, zolang je maar weet dat het geen enkel probleem is :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan