Avatar billede Jørgen Kirkegaard Professor
10. juni 2009 - 12:58 Der er 13 kommentarer og
1 løsning

Dim nulstiller IKKE min variabel

Jeg har en procedure med erklæringen

Dim X as string

Den nulstiller IKKE x, hvis f.eks. proceduren kaldes i et loop, men beholder f.eks. værdien fra sidste loop.

Dette sker både i 2003 og 2007.

Når jeg ser hjælpen for Dim foranlediges jeg til at tro, at jeg så skal bruge "New":

Dim X as New String

Men så får jeg "Identifier expectet"

Hvad skal der til for at X er "" med statsgaranti lige efter erklæringen? Jeg kan ikke bruge "Så sæt den til blank", for det gælder også komplekse typer, hvor jeg ikke har lyst til at gå igennem dem allesammen for at nulstille dem.
Avatar billede mugs Novice
10. juni 2009 - 13:04 #1
Der er vist ingen Dim af typen New String

Dim er jo en forkortelse af Dimension, altså hvilekn dimension kan variablen indeholde:

Dim As String > Både alfasnumerisk og numeriske værdier
Dim as Byte > Kun numeriske værdier op til en vis størrelse. Her er også Long og Double
Dim as Variant > Alt muligt
Og jeg har sikkert glemt nogle

Prøv efter loopet at sæte x til:

X = ""
Avatar billede Jørgen Kirkegaard Professor
10. juni 2009 - 13:11 #2
--Jeg kan ikke bruge "Så sæt den til blank", --
Fra Help har jeg:
___
Dim Statement

Declares variables and allocates storage space.

Syntax

Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .
___

Det læser jeg som, at syntaksen ved brug af New i mit tilfælde er

Dim X as new string

Eller?
Avatar billede Slettet bruger
10. juni 2009 - 14:09 #3
Eller?

Ellers godt forsøgt - du spotter noget du lige mangler ;)

Men ...

'as new' går på objekter - følgende er synonyme:

1.
Dim C as new Collection

2.
Dim c as Collection
Set c=new Collection


de simple typer som string er ikke en klasse der kan instantieres objekter fra, så new kan ikke bruges her.


Iøvrigt er ordet dim, der har været med os siden de første basic versioner sidst i 70'erne, stort set intetsigende - det giver højst lidt mening når det drejer sig arrays.

Det du siterer fra, er det noget Microsoft info? Måske allokeres der space (i nogle tilfælder), men det giver også et fejlagtigt indtryk af at der 'sker noget' i en  dim statement.

Første gang en variable BRUGES ELLER REFERERES initialiseres den.

Hvorfor er det for komplekst selv at tildele værdi- har du noget kode vi må se?
Avatar billede Jørgen Kirkegaard Professor
10. juni 2009 - 14:27 #4
Type BrPar
ReturKode As String
OrgNo As String
KommuneKode As String
Kommune_navn As String
Sektor As String
Sektor_navn As String
Sektor_VPS As String
Nace As String
Nace_navn As String
OrgNavn As String
Isin As String
LangtOrgNavn As String
LangtVpNavn As String
TimeStampDato As Date
TransMode As Integer
End Type

'' og i koden:


Dim brvar As BrPar
Dim OrgNoMsg As String
If OrgNoMsg <> "" Then MsgBox "What"  'Her stopper den <<---
brvar.Nace_navn = "" ' mystiks fejl. Denne (og de andre) er IKKE blanke, selvom de netop er erklæret!

___

Det vil være lidt tungt at skulle nulstille alle disse variable før jeg gik i gang med programmeringen - også med "with":

brvar.ReturKode = ""
brvar.Nace_navn = ""

osv...
Avatar billede Jørgen Kirkegaard Professor
10. juni 2009 - 14:28 #5
ps jeg citerer fra den hjælp, der kommer, når jeg står på Dim og trykker F1.
Avatar billede Slettet bruger
10. juni 2009 - 15:39 #6
Jeg kan ikke se noget fejl i det du har postet - der må have været noget kode før der har tildelt værdi til BrPar.


Sub verifyThatDimDontInitaliseAnything()
    Do
        Dim br As BrPar
        br.KommuneKode = br.KommuneKode & "-komkode-"
    Loop Until Len(br.KommuneKode) > 80
    Debug.Print br.KommuneKode
End Sub

På overfladen er  vba et røvsygt sprog - først når man dykker ned i disse detaljer bliver det interessant.


To workarounds for at kunne genbruge en BrPar

1.
Sub testtypestuff()

    Dim br(2) As BrPar
    'br(0) er den der bruges
    br(0).KommuneKode = "komkode"
    Debug.Print br(0).KommuneKode
   
    'her slettes br(0)
    br(0) = br(1)
    Debug.Print br(0).KommuneKode
   
End Sub


2.
Omstrukturer koden så anvendelse af BrPar pakkes ind i et funktionsscope
Avatar billede Jørgen Kirkegaard Professor
10. juni 2009 - 16:11 #7
"Jeg kan ikke se noget fejl i det du har postet "

Det er jo dét, der er problemet

"- der må have været noget kode før der har tildelt værdi til BrPar"

Nope, det sker i starten af proceduren.

Din verify kunne gøres simplere som så:

    for i=1 to 2
      Dim br As BrPar
      if br.kommunekode<>"" msgbox"Ups"
      br.kommunekode="Manamana"
    next   

Men det er ikke dét, der er problemet! Problemet kommer, når jeg kalder proceduren inde i et loop, jf. spørgsmålet:

"Den nulstiller IKKE x, hvis f.eks. proceduren kaldes i et loop, men beholder f.eks. værdien fra sidste loop"

Jeg har UDEN HELD prøvet at genskabe med noget simplere kode:

Function ThisDrivesMeMad()

Dim X As String
Dim I As Integer

For I = 1 To 2
X = "Whoops" & Str(I)
Mad
Next

End Function

Private Static Function Mad2()
Dim X As String
If X <> "" Then MsgBox "Ups"
End Function
Private Static Function Mad()
Dim X As String
If X <> "" Then MsgBox "Ups"
Mad2
End Function



mugs - har du nogen idé om det?
Avatar billede Slettet bruger
10. juni 2009 - 16:53 #8
For 3. og sidste gang:
'Dim nulstiller IKKE min variabel' er normal behavoir.
Avatar billede Jørgen Kirkegaard Professor
10. juni 2009 - 17:13 #9
Tryk F1 på "dim" i Access:

When variables are initialized, a numeric variable is initialized to 0, a variable-length string is initialized to a zero-length string (""), and a fixed-length string is filled with zeros. Variant variables are initialized to Empty. Each element of a user-defined type variable is initialized as if it were a separate variable.


Hvad har vi misforstået her?
Avatar billede mugs Novice
10. juni 2009 - 17:26 #10
I er inde i den højere VBA-teori,som jeg ikke har meget forstand på.

Men det kunne være interessant at følge variablerne brvar og BrPar fra kodestart og se, hvornår de får en værdi og i givet fald hvilken for at sammenligne med andre variabler's indhold.
Avatar billede Jørgen Kirkegaard Professor
10. juni 2009 - 17:42 #11
Jeg kan IKKE lave et tilsvarende program helt fra startet, så jeg er sikker på, at her er en fejl... enten i programmet eller i dokumentationen.

Problemet ligger faktisk ikke i brvar/brpar - det er bare her, at det er besværligt at skulle nulstille dem hvergang jeg erklærer dem med Dim


Jeg har netop isoleret tildelingen således, hvor proceduren er kogt HELT ned til kun Dim og Set:

...
for i = 1 to 2
A
next i
...



Function A(....)

Dim OrgNoMsg as string
OrgNoMsg="Sat" '<--- her sætter jeg stop for at se indholdet.

End function.


Første gang A bliver kaldt, er OrgNoMsg blank umiddelbart efter "Dim", anden gang jeg kalder A er den "Sat".
Avatar billede Slettet bruger
10. juni 2009 - 17:52 #12
'Hvad har vi misforstået her?'

At det har noget med Dim at gøre.

Det står der sådan set heller ikke at det har, det fortæller bare noget helt korrekt om initialisering af variabler.

Ud fra sammestillingen i hjælpen, kunne man så antage at denne initialisering fandt sted i en dim statement - men det har du jo så lige eftervist ikke er tilfældet. 1-0 til emperisk erkendelse ;)

Det forhold at Dim kun er en 'programmeringshjælp' - afslører stavefejl - kan undlades med mindre 'option explicit' forekommer, understreger også at det forholder sig sådan.
Avatar billede Jørgen Kirkegaard Professor
11. juni 2009 - 09:12 #13
Altså, det er ikke sandt, hvad der står i dokumentationen:

When variables are initialized, a variable-length string is initialized to a zero-length string ("").

Læg et svar ællebælle. Selvom du ikke har bidraget til forståelsen har jeg anvendt dit workaround med

Dim IamNew as BrPar
Dim IamToBeUsed as BrPar

IamToBeUsed=IamNew
...

--men det virker megasygt på mig -- og lad det samtidig være en advarsel til alle Access programmører.

og som andre programmører må jeg lade mig distrahere af virkeligheden.
Avatar billede Slettet bruger
11. juni 2009 - 09:34 #14
Hej igen staticdata

Ingen flere Dim kommentarer herfra - men det må være træls at noget så grundlæggende som variablers scope pludselig opfører sig mærkeligt - at f.eks OrgNoMsg opfører sig som var den global eller static.
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