Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pitanje oko multilingual formi, i redizajna baze...

[es] :: Access :: Pitanje oko multilingual formi, i redizajna baze...

[ Pregleda: 1769 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mika
NBG-ML

Član broj: 55
Poruke: 640
*.privsav.co.yu



+1 Profil

icon Pitanje oko multilingual formi, i redizajna baze...23.04.2004. u 11:45 - pre 243 meseci
Ćao!

Imam jedan projekat (ili "projekat", whatever :D), koji sam radio u Access-u, i pošto su apetiti korisnika baze porasli, dobio sam zahtev da aplikaciju (odnosno forme i dijaloge u njoj) prevedem na strani jezik. Dakle, ja sam mislio sledeće: da u jednoj tabeli sa strukturom (#id_pojma,sifra_pojma,srpski,engleski,german) držim pojmove, a da u svakoj formi u onLoad property-ju napravim proceduru koja će na osnovu nekog parametra (možda na startup formi) da pravi query i da za svaki Label pročita iz recordset-a pojam i zameni ga, po potrebi.

E sad, ovo sve šljaka ali interesuje me da li je to optimalno rešenje? Mislim, verovatno može i bolje, verovatno ima neko bolji/optimalniji prevod? Da li koristiti recordset-e, npr:

Code:

    Set cn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
  
   With rst
        .ActiveConnection = cn
        .Source = "SELECT srpski as izraz FROM recnik where sifra_pojma=" & Me!id_objekta 
        .LockType = adLockOptimistic
        .CursorType = adOpenStatic
        .Open
     End With

     Me![Label0].Caption = rst("izraz")



Naravno, to bi sve bilo u petlji, za sve labele u formi, i na osnovu izbora jezika bilo bi srpski, engleski, whatever.

Da li je optimalno rešenje? Ima li ko nešto da doda/predloži itd.?
Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...23.04.2004. u 13:47 - pre 243 meseci
Resenje je dobro ali ne i optimalno. Loop kroz sve labele i dugmice na formi sa menjanjem caption je OK.

Sta nije optimalno? Stuktura tvoje tabele. Ogranicio si se na tacno 3 jezika i svaki je u posebnom polju. Ako zelis da dodas jos neki jezik, nemas izbora osim da menjas tabelu, da dodajes polja. Sve i da ostanu samo 3 jezika, moras da imas 3 kverija koji citaju prevedene captions, po jedan za svaki jezik. Ako normalizujes tabelu, pa ona ima polja (#id_pojma, Language,AccessControlName, TranslatedText) i izgleda ovako:

1,"Eng","lblLabel1","English Text for label 1"
2,"Eng","lblLabel2","English Text for label 2"
3,"Eng","lblLabel3","English Text for label 3"
4,"Fre","lblLabel1","French Text for label 1"
5,"Fre","lblLabel2","French Text for label 2"
6,"Fre","lblLabel3","French Text for label 3"
7,"Ger","lblLabel1","German Text for label 1"
8,"Ger","lblLabel2","German Text for label 2"
9,"Ger","lblLabel3","German Text for label 3"

Na ovaj nacin mozes da dodajes jezike po volji, a kveri koji cita iz tabele je uvek isti, sa paramrtrom za Language.

Jos nesto bi bilo korisno da imas - proceduru koja olaksava odrzavanje tabele sa prevodima. Form i reporti se u aplikaciji manjaju, p-re ili kasnije. Dodaju se nove forme, novi reporti, dodaju se ili brisu kontrole. Mogao bi da napravis proceduru kojoj saljes kaomparametar ime forme/reporta i zeljeni jezik a onda procedura protrci kroz sve labele i dugmad na formi i ako se kontrola ne nalazi u tabeli tblTranslations, procedura doda nove rekorde u tabelu. Veruj mi, mnogo je lakse nego rucno odrzavati tabelu. Ako ti treba pomoc, odgovori na post, mislim da imam nesto slicno uradjeno od ranije.

:-)
 
Odgovor na temu

mika
NBG-ML

Član broj: 55
Poruke: 640
*.privsav.co.yu



+1 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...23.04.2004. u 14:41 - pre 243 meseci
OK, na tabelu sam i mislio da sugerišete :D I možda na VBA kod.

Inače, ja sam tabelu tako zamislio u svojoj glavi pa sam je brže-bolje preneo na papir, jer mi takva struktura najlakše prikazuje sve reči, i olakšava održavanje baze, zato što kad menjam reč, "pored" nje imam već reč na drugom jeziku itd. Ali, jasno je da se takav "view" može postići i odgovarajućim upitom, nad tvojom tabelom. Malo komplikovanije, ali može. A da je tvoj predlog optimalniji - jeste, vidi se na prvi pogled, uz opasku da u mojoj tabeli može da stoji i : (#id_izraza, jezik_1, jezik_2, . . ., jezik_n), gde n<5, sigurno. Mada je jedan od uslova postojanje baze podataka, mogućnost beskonačnog dodavanja recorda, ne i kolona...



Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

mika
NBG-ML

Član broj: 55
Poruke: 640
*.privsav.co.yu



+1 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...11.05.2004. u 10:11 - pre 243 meseci
Xm, malo sam se zapetljao sa ovim, i uopšte nemam ideju kako mogu sa jednom With strukturom da prođem kroz sve elemente na formi? Mislim, to mi je potrebno za željenu proceduru održavanja.

Dakle, scenario je sledeći: Dodam novu kontrolu na formu, pozovem proceduru koja prođe kroz sve elemente na formi i dodaje elemente u tabelu. Mislim, sve mi je to jasno, ali ne znam kako u VBA da implementiram to "trčanje" kroz formu? Neki prost kod koji recimo štampa sve elemente na formi bi mi dobro došao.

Hvala puno!
Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...11.05.2004. u 14:55 - pre 243 meseci
Mozda ovo pomogne. Forma mora biti otvorena. Iz debug window startujes funkciju, ime forme je argument. Funkcija trci kroz kolekciju kontrola na formi i onda nesto radis sa tim kontrolama, na primer menjas im Caption property.

BEGIN
Code
Function ReadCaptions(frmName As String)
Dim ctl As Control
Dim frm As Form
'ControlType = INT, 100=label,109=text box, 104=button, 112=subform
DoCmd.OpenForm frmName
Set frm = Forms(frmName)
For Each ctl In frm
Debug.Print ctl.Name, ctl.ControlType; 'works ControlType=INT

If TypeOf ctl Is CommandButton Then
Debug.Print " ", "Command Button"
End If

If TypeOf ctl Is Label Then
Debug.Print " ", "Label"
End If

Next

End Function
/Code
END

Evo jos pa se snalazi:
BEGIN
code
Function ChangeSingleCaption(frmName As String, strlabelName As String, strNewName As String) As Boolean
Dim ctl As Control
Dim frm As Form
ChangeSingleCaption = False
Set frm = Forms(frmName)
frm.Controls(strlabelName).Caption = strNewName
Debug.Print frm.Controls(strlabelName).Caption
ChangeSingleCaption = True
End Function


Function ChangeAllCaptions(strFormName As String, intLang As Integer)
'Purpose: Translates labels and button captions for given form
'Called by: ThisModule.TranslateForm(frmName as string)<-- Form.OnOpen()
'Calls: ChangeSingleCaption
On Error GoTo Error_Handler
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

Set db = CurrentDb
strSQL = "SELECT FormName,CtlName, TheCaption " _
& " FROM _tsysFormLabels " _
& " WHERE FormName='" & strFormName & "'" _
& " AND LangString=" & intLang

Set rs = db.OpenRecordset(strSQL)
If rs.RecordCount = 0 Then
GoTo EXIT_HERE:
Else
With rs
.MoveFirst
Do While Not .EOF
Call ChangeSingleCaption(strFormName, !CtlName, !TheCaption)
.MoveNext
Loop
End With
End If

EXIT_HERE:
On Error Resume Next
rs.Close
Set db = Nothing
Exit Function

Error_Handler:
Select Case Err
Case Else
MsgBox "Error " & Err.Number & vbCrLf & Err.Description, vbOKOnly, "ChangeAllCaptions"
End Select
Resume EXIT_HERE:

End Function


Function TranslateForm(strFormName As String)
Dim intLang As Integer
intLang = DLookup("LanguageID", "_tblLocalSettings")
Call ChangeAllCaptions(strFormName, intLang)
End Function
/code
END
 
Odgovor na temu

mika
NBG-ML

Član broj: 55
Poruke: 640
*.privsav.co.yu



+1 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...12.05.2004. u 14:44 - pre 243 meseci
Super,hvala puno, nekako u isto vreme kad si mi ti pisao izbunario sam i ja rešenje iz neke knjige i helpa u vidu sledećeg:

Code:

Sub Proba(frmName As String)

  On Error GoTo Form_Err

  Dim ctlControl As Control

   For Each ctlControl In Forms!frmName.Controls
      Debug.Print ctlControl.Caption, ctlControl.ControlType
   Next

Form_Exit:
  Exit Sub

Form_Err:
  If Err.Number = 438 Then
   Resume Next
  Else
   MsgBox Err.Description
   Resume Form_Exit
  End If

End Sub


E sad, ja sam uporno pisao ctlControl.Type umesto ctlControl.ControlType, to nisam nigde našao u dokumentaciji da postoji. Takođe, javlja se čudan error 438, koga sam ovim error handlerom eliminisao. Kako i zbog čega-ne znam. Sada je lako...

Uopšte, bitno mi je bilo samo da provalim da se pomoću for each... next strukture vrši pristupanje svakom elementu iz kolekcije (što i nije neka "provala"... ali ja i nisam neki VB "tata-mata-wannabe"), elem sad je sve OK, ostaje da dodatno razvijem ovu proceduricu i gotovo. Muče me samo još dva "crva": zašto se uvek javlja dotična greška, i zašto forma mora da bude otvorena, prilikom pristupa njenoj kolekciji kontrola. Mislim, ovaj kod mi ne radi nikako:

Code:

  Dim frmCurrent As Form
  Dim ctlControl As Control

  For Each frmCurrent In Forms
   For Each ctlControl In Forms!frmCurrent.Controls
      'bilosta, npr:
      Debug.Print ctlControl.Caption, ctlControl.ControlType

   Next
  Next


Any answers?
Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...12.05.2004. u 16:54 - pre 242 meseci
Ovako:

Forms je Collection. Forme koje vidis u Forms window nisu clanovi kolekcije dok se ne otvore. DAO ne zna da forme postoje sve dok ih ne otvoris. Zato forma mora da bude otvorena da bi joj pristupio.

Greska 438 se javlja kad pokusas da citas property koji data kontrola ne poseduje. U tvom slucaju verovatno puca na 'Caption' jer nema svaka kontrola caption. Dobro ti je resenje da ignorises tu gresku, sad kad znas sta je u pitanju.

Evo ga malo izmenjen i dopunjen tvoj kod. Upotrebio sam With ...End With strukturu za ispis pojedinacnih property. na taj nacin, kada pukne znas tacno zbog cega je puklo. kad ih drzis sve u jednoj liniji ne znas koja property izaziva pucanje. Zapazi i malo prosiren error handler. Ignorise gresku 438 ali ima mogucnost da pokupi i druge greske koje se mogu javiti.

:-)

Code:

  Function LoopKrozForme()
  Dim frmCurrent As Form
  Dim ctlControl As Control
  Dim flgCollEmpty As Boolean
  
  On Error GoTo ERROR_CODE
  
  flgCollEmpty = True
  
  For Each frmCurrent In Forms
    Debug.Print "Form " & frmCurrent.Name & ", list of controls:"
    Debug.Print "------------------------------------------------"
    
    For Each ctlControl In frmCurrent.Controls
        flgCollEmpty = False
      'bilosta, npr:
        With ctlControl
            Debug.Print " Control name: " & .Name
            Debug.Print "   Control caption: " & .Caption
            Debug.Print "   Control type: " & .ControlType
            Debug.Print
        End With
    Next
    
    Debug.Print "------------------------------------------------"
    Debug.Print
    
  Next

    If flgCollEmpty = True Then
        MsgBox "There are no forms in the colelction!" & vbCrLf & _
        "Forms must be Open in order to loop through the Forms collection."
    End If

EXIT_HERE:
    Exit Function

ERROR_CODE:
    Select Case Err.Number
        Case 438
            Resume Next
        Case Else
            MsgBox Err.Description & vbCrLf & "in LoopKrozForme", _
            Title:="ERROR " & Err.Number
            Resume EXIT_HERE:
    End Select

End Function
 
Odgovor na temu

mika
NBG-ML

Član broj: 55
Poruke: 640
*.privsav.co.yu



+1 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...13.05.2004. u 08:33 - pre 242 meseci
Super, ovo sve šljaka, samo me interesuje zašto ovo neće da radi:

Code:


sub Proba(arg as string)

docmd.OpenForm(arg)

end sub



...Javi mi error? Kada bih uspeo ovo da odradim (da mi iz procedure otvara sve forme) onda ne bi bilo problema, ovako moram ručno da ih otvaram. I da na onOpen ili onLoad property stavim neku proceduru koja će u letu da prevodi formu, zavisno od stanja nekog listbox-a za jezike na main switchboard-u.
Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Pitanje oko multilingual formi, i redizajna baze...13.05.2004. u 15:17 - pre 242 meseci
Ne znam zasto ti kod sa Docmd.OpenForm (stArg) ne radi. Kopirao sam kod i kod mene radi. Da nije ime forme pogresno?


U svakom slucaju, ako hoces da radis prevodjenej formi, moje iskustvo je da je najefikasniji nacin onaj koji si naslutio ali ti se ne svidja. Za svaku formu koju zelis da prevedes, u OnLoad ubacis poziv funkcije koja prevodi natpise na formi. To je efikasnije nego na pocetku otvarati sve forme, prevesti pa onda poceti rad.

:-)
 
Odgovor na temu

[es] :: Access :: Pitanje oko multilingual formi, i redizajna baze...

[ Pregleda: 1769 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.