06. november 2002 - 23:17 Der er 24 kommentarer og
1 løsning

Konstanter i forespørgsler

Jeg har en situation, hvor jeg har et utal af konstanter, hvor jeg gerne vil tage højde for at disse kan ændre sig med tiden.
Jeg har desværre nogle forespørgsler hvor jeg skal bruge disse konstanter som kriterier (for at gøre systemet så dynamisk som muligt).
Jeg kan selvfølgelig lave en funktion, som returnere værdien af variablen, men det er for omfattende, da jeg har over 100 konstanter.

Jeg forestillede mig derfor at jeg ville lave en generel funktion, som returnere værdien af den variabel, som angives i parameteren. Mit bedste bud var at bruge Eval, som jo kan bruges til at returnere lidt skæve udtryk:

Public Function GetVariable(Variabel) as Real
  GetVariable = Eval(Variabel)
End function


Derved skulle man kunne få returneret værdien af en variabel 'varMinVariabel' ved at skrive:
GetVariable("varMinVariabel")

Dette virker dog ikke, hvorfor jeg vil lægge spørgsmålet ud til Jer eksperter :o)

/Thomas
06. november 2002 - 23:28 #1
Der er naturligvis ikke noget, som hedder:
Public Function GetVariable(Variabel) as Real

Det ved enhver og jeg beklager fejlen.

Men jeg er stadig åben for kreative forslag :o)
Avatar billede arne_v Ekspert
07. november 2002 - 00:02 #2
Hvad med noget i retning af:

Public Function GetVariable(name As String) As String
  If (name = "varMinVariabel") Then
      GetVariable = varMinVariabel
  ElseIf (name = "foobar") Then
      GetVariable = foobar
  End If
End Function

?
07. november 2002 - 00:04 #3
hmm, ideen er god nok, men der er som sagt over 100 og der kommer hele tiden nye. Det bliver et større skrive-arbejde.
Derfor søger jeg en mere generel løsning.
Avatar billede arne_v Ekspert
07. november 2002 - 00:14 #4
Der er jo ingen garanti for at det er muligt.
07. november 2002 - 00:17 #5
In my world: Anything is possible :o)

Men selvfølgelig har du ret....
Avatar billede terry Ekspert
07. november 2002 - 08:50 #6
Put em in a table
Avatar billede sjap Praktikant
07. november 2002 - 10:24 #7
Thomas

Blot et opklarende spørgsmål: Er alle dine konstanter (som i koden benævnes variable) erklæret et eller ande sted i din kode? Som f.eks.

Public Const varDinVar As double = 5.5

Så antager jeg, at det du hentyder til i din første kommentar er ordet "Real"?
07. november 2002 - 21:32 #8
Superjap-> Du har helt ret: jeg har alle mine konstanter defineret i et globalt modul med Public Const....

Og ja - Real er ikke en VB-datatype. Den skulle selvfølgelig have heddet Single. Godt set :o)

Terry-> "Put em in a table"! Udemærket forslag, men så har jeg dobbelt-registrering af konstanterne. Det skal der helst ikke være.

Ideen er også, at jeg - på bagrund af denne funktion - kan lade brugeren vedligeholde forskellige formler.
Dvs at brugeren skal kunne indtaste en formel, som systemet så selv skal kunne finde ud af at udregne:
ProduktiveTimer=Plantimer-Fravær

Hvor ProduktiveTimer, Plantimer og Fravær er variable i systemet

Dette er ikke umiddelbart muligt, men ville være det, hvis jeg kunne få det andet til at virke.
Avatar billede hekla Nybegynder
08. november 2002 - 00:21 #9
Hvorfor vil du gemme dine konstanter som public contants og ikke som værdier i en tabel? Komplicerer det ikke tingene unøvendigt meget?
Avatar billede sjap Praktikant
08. november 2002 - 00:34 #10
thomas

Jeg overgiver mig til både Terry og Hekla; Jeg kan simpelthen ikke se hvordan det skal kunne lade sig gøre med konstanter. Ideen var sådan set god nok, men jeg tror ikke det kan lade sig gøre. :-(
08. november 2002 - 08:30 #11
Hekla-> Grunden til at det skal være konstanter (eller variabler!) er, at det jo er en hel del hurtigere at arbejde med en variabel/konstant frem for at skulle lave opslag i en tabel. De 100-150 variabler, som jeg har, skal hver især benyttes op til 1000 gange i fbm med en beregning.

Dertil kommer, at det i udviklingsfasen, er langt nemmere at huske navnene på konstanter, da man kan bruge code-completion. Det kan man jo ikke, når værdierne bare ligger i en tabel.

Derfor.

/Thomas
Avatar billede proaccess Nybegynder
08. november 2002 - 09:34 #12
Hva' me' typen Variant...



Option Compare Database
Option Explicit

Private Const test1 As String = "hello"
Private Const test2 As Single = 123.34

Public Function getConst(conName As String) As Variant
  getConst = conName
End Function

Public Function test()
  MsgBox getConst(test1), , "test1"
  MsgBox getConst(test2), , "test2"
End Function
08. november 2002 - 09:44 #13
Hej Proaccess,

Problemet er jo, at jeg skal kunne skrive:
getConst("test1") i stedet for getConst(test1)

Dette skyldes (som jeg skrev i spørgsmålet) at jeg skal kunne kalde det fra f.eks. en forespørgsel. Og man kan jo ikke referere til Test1 i en forespørgsel.



point hæves igen...
Avatar billede proaccess Nybegynder
08. november 2002 - 09:44 #14
Stryg lige ovenstående indlæg...  Jeg er lige kommet hjem fra Tyskland, og tænker vist stadig lidt "svævende"
08. november 2002 - 09:45 #15
hehe, ja man skal sgu holde sig fra Tyskland ;o)
Avatar billede proaccess Nybegynder
08. november 2002 - 10:11 #16
Mulig løsningsmodel...  Lad være med at bruge konstanter (direkte), men gem dine værdier i funktioner (som kan kaldes fra forespørgsler)


Option Compare Database
Option Explicit

Public Function test1() As String
  test1 = "hello"
End Function

Public Function test2() As Single
  test2 = 123.45
End Function
08. november 2002 - 10:25 #17
hmm, hvis jeg nu sender 150 konstanter, gider du så lave 150 funktioner? :o)
Så er Arne_V's første forslag bedre, da man her blot kan lave det med en Select Case.

Men det, jeg har brug for, er at kunne tager en streng ("MinVariabel") og indsætte den i en funktion og få returneret værdien af variablen MinVariabel.
Avatar billede terry Ekspert
08. november 2002 - 11:06 #18
Thomas I understand your concern about performance if it was in a tabel, but there is also a performance overhead calling a function. You could have all "constants" in a table then call a funstion which loops through the table on startup, initializing you "variable" constants!
18. november 2002 - 15:11 #19
Jeg lukker spørgsmålet, men giver gerne 200p til den, som kan komme med en løsning på problemet.

Jeg er IKKE intereseret i andre løsningsmodeler som f.eks. at lave det vha. 150 funktioner eller lign.

/Thomas
Avatar billede terry Ekspert
18. november 2002 - 15:13 #20
Thomas I still dont see HOW a constant can be a variable!
18. november 2002 - 15:18 #21
Hi terry,

Det kan de selvfølgelig heller ikke. Men metoden må være den samme uanset om man arbejder med konstater eller variable.

Nedenstående 2 eksempler giver jo det samme resultat:

Eks 1:
Function Resultat () as Single
  Dim A, B
  A = 2
  B = 3
  Resultat = A * B
End function

Eks 2:
Function Resultat () as Single
  Const A = 2
  Const B = 3
  Resultat = A * B
End function

Så når jeg omtaler konstanter og variable i én blanding, så er det jo blot fordi det er fuldstændig ligegyldigt når de skal indsættes i en formel.
Nogle gange har jeg brug for at indsætte en variabel og nogle gange har jeg brug for at indsætte en konstant.
Er du med?

/Thomas
Avatar billede terry Ekspert
18. november 2002 - 15:21 #22
OK, then when is an answer acceptable then? There's a couple of answers here which could be used in my mind!
18. november 2002 - 15:30 #23
Okay, så fortæl mig hvilket svar, som kan give mig en funktion, hvor jeg (f.eks. i en forespørgel) kan skrive:
GetValue("A")
og så få returneret værdien 2 (hvis A = 2 er erklæret som public variabel/konstant)
Avatar billede terry Ekspert
18. november 2002 - 15:45 #24
Cant you use Arne's or a SELECT CASE?
If you say that new ones will be needed then you have to alter your code anyway!
18. november 2002 - 16:00 #25
Well, det var der, hvor jeg forestillede mig, at f.eks. Eval eller en anden indbyggede funktion kunne løse problemet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester