Toon posts:

[VB] access: variabelen uit tabel toewijzen

Pagina: 1
Acties:
  • 205 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
wellicht voor geoefenden een koud kunstje... 8)7

Ik had in mijn module in access tot noch toe altijd de variabelen gedefineerd als een constante..

code:
1
2
    'constante subpad (padindeling NA projectnummer)
    Public const strSubpad As String = "c:\documenten"


ik wil nu de database in verschillende omgevingen gaan installeren, en niet telkens in de code de variabelen toewijzen. Ik dacht dat de beste manier was om dit wat flexibeler te maken een tabel te maken waarin de naam van de variabele en de waarde staan, dus;

ID: name: Value:
01 strSubpad "c:\documenten"

nu nog wat daarme doen :?

in mijnmodule is de variabele nu gedefineerd als "Public strSubpad As String"

Nu dacht ik dat de oplossing een routine gemaakt te hebben die middels een loop al de entry's in de tabel doorloopt en de waarde toekent. Deze loop draai ik dan eenmalig bij het opstarten van de database.... Ik heb alleen geen idee hoe ik de variabele in elke loop van naam moet laten veranderen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Do Until rstSetup.EOF

dim strVarnametmp, strVarvaluetmp


strVarnametmp = rstSetup.Fields("varname")
strVarvaluetmp = rstSetup.Fields("value")



'hier moet HET gebeuren??????????????

strVarnametmp = ""
strVarvaluetmp = ""

rstSetup.MoveNext
        
Loop


Ik heb hier nu dus de waarden in een tijdelijke variabele staan. Hier moet ik iets bedenken dat de twee waarden ui t de tabel toegewezen worden aan de variabelen. De eeste waarde is de naam van de variabele, en de tweede is de value.

[ Voor 27% gewijzigd door Verwijderd op 20-12-2004 01:21 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Ik snap je vraag niet helemaal. Wat wil je nou gaan doen? Het ophalen van de waarden uit de database heb je al, dus ik zie niet echt wat er niet lukt. Of heb je een variabelenaam als string, en waarvan je de variabele met die naam direct wil aanspreken? Dan heb je misschien wat aan de functie Eval, als die tenminste in VB ook bestaat.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Sorry, lastig uit te leggen.

Ik bedoel inderdaad dat die waarden uit de tabel toegewezen moeten worden aan de gedefineerde variabelen.

Verwijderd

Topicstarter
Wat ik uiteindelijk wil is dat in de variabelen die mijn access gebruikt niet als "public const"vast liggen in de access module, maar dat deze in een (setup form) bepaald kunnen worden.

Ik heb nu vijboorbeeld paden en lokaties van bestanden vastgelegd. Als je bijvoorbeeld de database aan iemand geeft die een andere paden gebruikt. Moet deze dat niet in de VB editor hoeven wijzigen.

Het leek mij dan voor de hand liggend om ze in een tabel te zetten en ze middels een loop toe te kennen bij het opstarten.

Ik hoop dat dit duidelijker is. :7

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 17:38
Je wilt dus een configuratie bestandje maken, maar dan in een access tabel ?
Voor dezelfde db ?

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
ja! Ik had het beter meteen zo kunnen formuleren.. ;)

Er is ongetwijfeld een slimmere manier.. 8)7

[ Voor 122% gewijzigd door Verwijderd op 20-12-2004 12:50 ]


  • jwpmzijl
  • Registratie: December 2002
  • Laatst online: 09-05 21:26
Tja, dit is een standaard probleem voor software die in meerdere omgevingen gebruikt wordt. De meeste software gebruikt hiervoor nog steeds .ini files. Deze worden bij het opstarten ingelezen en in geheugen variabelen gezet. Vervolgens kun je deze variabelen binnen het programma gebruiken.

Uiteraard kun je i.p.v. een .ini bestand ook een tabel aanmaken en daarin alle variabelen plaatsen. Vervolgens maak je in jouw Access project een functie die als input de variabelenaam gebruikt en als output de waarde geeft die aan de variabele is toegekend. Als je een tabel gebruikt voor deze variabelen dan moet je alleen een beetje te stoeien met de gegevenstypes.

Iedere keer als je in een procedure een variabele nodig hebt gebruik je de nieuwe functie om de actuele waarde op te roepen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Public Function Instelling(Instnaam As String) As Variant
'
'Functie die de waarde van de gevraagde instelling ophaalt uit de tabel instellingen
'
    Dim resultaat As Variant
    Dim sql As String
    Dim rst As Recordset
    
    'On Error GoTo Foutafhandeling
    
        sql = "SELECT * FROM instellingen WHERE zoekcode=" & Chr(34) & Instnaam & Chr(34) & ";"
        Set rst = CurrentDb.OpenRecordset(sql)
            rst.OpenRecordset
            If rst.RecordCount > 0 Then
                    Instelling = rst![Instelling (tekst)]
                Else
                        MsgBox ("Onbekende variabele")
                        rst.Close
                        Exit Function
            End If
    Exit Function
    
'fout procedure
foutafhandeling:
    MsgBox err.Description
    Instelling1 = "Fout"

End Function

Overigens werkt dit alleen maar als je jouw project in een frontend en backend hebt opgesplitst.

[ Voor 42% gewijzigd door jwpmzijl op 20-12-2004 13:02 ]

Hans van Zijl


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 17:38
Ik zou dan een .ini maken om te zeggen waar de db staat, en dan in de db een tabel met je variabelen.

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
Bedoel je dat ik voor elke variabele een functie aan moet maken? Ik wilde dat dus voorkom,en door het in een loop te stoppen.

In jouw voorbeeld zoek je een specifiek record op, ik zoek middels select * from.... en wil dan elke variabele defineren.. maar ik begrijp dat dit moeilijk wordt..

Bij jouw zal dan het veld "instelling" van naam moeten veranderen bij elke loop...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Misschien als je de 'constantes' in een array van varianten zet. Mooi wordt het echter niet.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • jwpmzijl
  • Registratie: December 2002
  • Laatst online: 09-05 21:26
Het idee achter mijn methode is dat je de variabele steeds opnieuw ophaald op het moment dat je deze nodig hebt. Dus iedere keer dat je in jouw programmacode een constante plaatst vervang je dit door de functie bijv:

verkoopprijs = 10,00 * marge => verkoopprijs = 10,00 * instelling("marge")

Werkt perfect en je gebruikt altijd de meeste actuele gegevens.

Hans van Zijl


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
jwpmzijl schreef op maandag 20 december 2004 @ 14:39:
Het idee achter mijn methode is dat je de variabele steeds opnieuw ophaald op het moment dat je deze nodig hebt. Dus iedere keer dat je in jouw programmacode een constante plaatst vervang je dit door de functie bijv:

verkoopprijs = 10,00 * marge => verkoopprijs = 10,00 * instelling("marge")

Werkt perfect en je gebruikt altijd de meeste actuele gegevens.
Wordt dat niet irritant langzaam op een gegeven moment? Je kunt toch je lokale instellingen verversen op het moment dat het wordt aangepast. ( of de eerste keer nadat het veranderd is, en een instelling wordt gebruikt )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Ik denk dat je zoek naar de CallByName-functie.
Die bestaat in elk geval in VB6

Deze functie is helemaal niet zo bekend, maar kan handig zijn!

voorbeeld uit VB6:

In the following example, the first line uses CallByName to set the MousePointer property of a text box, the second line gets the value of the MousePointer property, and the third line invokes the Move method to move the text box:

CallByName Text1, "MousePointer", vbLet, vbCrosshair
Result = CallByName (Text1, "MousePointer", vbGet)
CallByName Text1, "Move", vbMethod, 100, 100


CallByName bestaat ook in Access 2000

In uw toepassing:

Do Until rstSetup.EOF
CallByName rstSetup.Fields("varname"), "Value", vbLet, rstSetup.Fields("value")
rstSetup.MoveNext
Loop

[ Voor 19% gewijzigd door Verwijderd op 20-12-2004 15:19 . Reden: aanvulling ]


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 19:12

sopsop

[v] [;,,;] [v]

code:
1
verkoopprijs = 10,00 * marge => verkoopprijs = 10,00 * instelling("marge")

Inplaats van de functie "instelling" zou je ook een dictionairy object kunnen gebruiken. Dan kun je willekeurige strings gebruiken als key en daar een waarde aan toe kennen. De aanroep blijft dan hetzelfde als hierboven, maar er wordt direct een waarde opgehaald uit de dictionary, zonder tussenkomst van een functie. Je hoeft dus alleen bij de init van je app de dictionary te vullen en je bent spekkoper.

Ander voordeel is dat de returnwaarde van de dictionary Variant is. Je kunt per item in de dictionary een ander type erin duwen (en eruit halen).

Wat uitleg over de dictionary

[ Voor 14% gewijzigd door sopsop op 20-12-2004 15:25 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Verwijderd schreef op maandag 20 december 2004 @ 15:01:
Ik denk dat je zoek naar de CallByName-functie.
Is wel vreselijk om te debuggen volgens mij. Overigens:
Executes a method of an object, or sets or returns a property of an object.
Dwz, je kunt alleen properties of methoden van objecten invoken op die manier. Dus als je je 'globale' variabelen niet in een object hent zitten werkt dit niet. ( In een struct bijvoorbeeld )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Zoals Mr Farlane in vorige post meldde:
CallByName werkt blijkbaar niet met variabelen:
Oplossing: class module aanmaken met 1 property (hier clsSetupItem.Waarde)

Form1:
Dim Test As New clsSetupItem

Private Sub Command1_Click()
Test.Waarde = 0
Debug.Print Test.Waarde
CallByName Test, "Waarde", VbLet, 1000
Debug.Print Test.Waarde
End Sub

clsSetupItem:
Option Explicit
Public Waarde As String

Maar ja, er zijn natuurlijk nog andere oplossingen. Gewoon de kennis hebben dat een bepaalde functie bestaat helpt u soms bij het zoeken op het net.

Succes

[ Voor 6% gewijzigd door Verwijderd op 20-12-2004 17:04 . Reden: Ere wie ere toekomt ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • jwpmzijl
  • Registratie: December 2002
  • Laatst online: 09-05 21:26
farlane schreef op maandag 20 december 2004 @ 14:52:
[...]

Wordt dat niet irritant langzaam op een gegeven moment?
Uiteraard is er een performance penalty. Het hangt van de applicatie af of dit een probleem is. Voor een simpele berekening of enkele tientallen updates maakt het met huidige hardware niet uit.
Je kunt toch je lokale instellingen verversen op het moment dat het wordt aangepast. ( of de eerste keer nadat het veranderd is, en een instelling wordt gebruikt )
Dat is ook een benadering. Het is maar net wat je nodig hebt. Ik declareer geen globale variabelen maar laad alles éénmaal lokaal bij de start van de module/procedure. Daarmee voorkom ik in een multiuser scenario dat aanpassingen door medewerker 1 invloed hebben op reeds gestarte procedures van medewerker 2.

Hans van Zijl

Pagina: 1