Avatar billede bojohansen Nybegynder
20. august 2005 - 17:42 Der er 14 kommentarer og
1 løsning

Option Explicit og brug af For Each Object

Hej.

Jeg bruger Option Explicit, og laver en

For Each Object in DeviceTypeVersion
  bla bla
Next

Men Option Explicit kræver at Object blir Dim'et, Dim'er jeg den får jeg fejl :

Microsoft VBScript runtime error '800a01c3'

Object not a collection

Hvad gør man lige med det?
Avatar billede bojohansen Nybegynder
20. august 2005 - 17:46 #1
Og DeviceTypeVersion indeholder følgende feks. 23|56, 45|22, 33|12 = 3 Objects
Avatar billede ksoren Nybegynder
20. august 2005 - 17:58 #2
Hvilken type collection er 23|56, 45|22, 33|12 = 3 ?

Det er vel ikke bare en streng?
Avatar billede bojohansen Nybegynder
20. august 2005 - 18:10 #3
Det er en streng.
En CheckBox som får 2 værdier tildelt Værdi|Værdi

Dim CountObjects
'Dim Object
Dim SplitSaveDevice
Dim SaveDevice
Dim DeviceId
Dim DeviceType
'Find hvor mange Devices der er snak om
'Start en Counter
CountObjects = 0
For Each Object in DeviceTypeVersion
    'Splitte objectet op i mindre dele-Array, splittes på ,
    SplitSaveDevice = Split(DeviceTypeVersion, ",", -1)
        'Udskriv ObjectArrayet baseret på Counter
        Response.Write("DeviceTypeVersion er = ") & SplitSaveDevice(CountObjects) & ("<br>")
            'Split nu ObjectetVærdierne op i mindre dele, splittes på | og bruger Counteren til at definere hvilket Array
            SaveDevice = Split(SplitSaveDevice(CountObjects), "|", -1)
                'Tildel værdierne til variabler som bruges til database
                DeviceId = SaveDevice(0)
                DeviceType = SaveDevice(1)
                'GEM I DATABASE HER
                'SaveDevice = "Insert into T_DeviceRegistryBindingTabel ("

                'SaveDevice = strSQL & "DeviceId, "
                'SaveDevice = strSQL & "DeviceTypeId) "
               
                'SaveDevice = strSQL & "values( "
               
                'SaveDevice = strSQL & "'DeviceId', "
                'SaveDevice = strSQL & "'DeviceType')"
               
                'Conn.Execute(SaveDevice)
                Response.Write("DeviceId = ") & DeviceId & ("<br>")
                Response.Write("DeviceType = ") & DeviceType & ("<br>")
'Læg 1 til counteren for næste loop           
CountObjects = CountObjects + 1
Next
Avatar billede cpufan Juniormester
20. august 2005 - 18:21 #4
mener at det kun er variabler der skal dim'es ved option explicit,
objekter bliver oprettet med "set"
Avatar billede softspot Forsker
20. august 2005 - 18:38 #5
Hvor har du erklæret DeviceTypeVersion?
Hvilken linie er det du får den fejl du nævner?

Hvis DeviceTypeVersion er en streng kan du ikke bruge for each på den, det fungerer kun på collections (herunder dictionary-objektet) og arrays.

cpufan >> set tildeler blot et objekt en værdi, men det ændrer ikke på at variablen skal erklæres når man benytter Option Explicit...
Avatar billede softspot Forsker
20. august 2005 - 18:41 #6
Jeg ville forvente at din kode så således ud (og det fungerer nogenlunde når jeg tester det hos mig :)):

<%@ language="vbscript" %>
<%
Option Explicit

Dim CountObjects
Dim Choice
Dim SplitSaveDevice
Dim SaveDevice
Dim DeviceId
Dim DeviceType
Dim DeviceTypeVersion

DeviceTypeVersion = "1|2,3|4,5|6"

'Find hvor mange Devices der er snak om
'Start en Counter
CountObjects = 0

'Splitte objectet op i mindre dele-Array, splittes på ,
SplitSaveDevice = Split(DeviceTypeVersion, ",", -1)

For Each Choice in SplitSaveDevice
    'Udskriv ObjectArrayet baseret på Counter
    Response.Write("DeviceTypeVersion er = ") & SplitSaveDevice(CountObjects) & ("<br>")

    'Split nu ObjectetVærdierne op i mindre dele, splittes på | og bruger Counteren til at definere hvilket Array
    SaveDevice = Split(SplitSaveDevice(CountObjects), "|")

    'Tildel værdierne til variabler som bruges til database
    DeviceId = SaveDevice(0)
    DeviceType = SaveDevice(1)

    'GEM I DATABASE HER
    'SaveDevice = "Insert into T_DeviceRegistryBindingTabel ("

    'SaveDevice = strSQL & "DeviceId, "
    'SaveDevice = strSQL & "DeviceTypeId) "
   
    'SaveDevice = strSQL & "values( "
   
    'SaveDevice = strSQL & "'DeviceId', "
    'SaveDevice = strSQL & "'DeviceType')"
               
    'Conn.Execute(SaveDevice)
    Response.Write("DeviceId = " & DeviceId & "<br>")
    Response.Write("DeviceType = " & DeviceType & "<br>")

    'Læg 1 til counteren for næste loop           
    CountObjects = CountObjects + 1
Next
%>
Avatar billede bojohansen Nybegynder
20. august 2005 - 18:55 #7
Ja undskyld mig lidt, det er kun en del af koden som i har set, her det hele :

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<% option explicit %>
<!--#include virtual="/Connections/xda_Database.asp" -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>
<%
'***************************************************************************************
'****************** Gem data i databasen i korrekt rækkefølge **************************
'***************************************************************************************
'Fremgangs måde for at gemme en ny Værdi i database
'Gem først i T_RegEntry og hent og gem @RegEntryId som AutoRegEntryId
    'Gem RegCategoriId, hvilken Categori dette hører under
    'Gem RegEntryName, Hvad navnet er på denne
    'Hent det autonumber ID som er tildelt RegEntryId og gem det i AutoRegEntryId

'Gem så i T_RegPath og hent og gem @RegPathId i AutoRegPathId
    'Gem RegPath, hvad er Path for denne entry
    'Hent det autonumber ID som er tildelt @RegPathId og gem det i AutoRegPathId
   
'Gem så i T_RegValues og hent og gem @RegValueId som AutoRegValueId
    'Gem RegValue, Beskrivelse af og indhold av værdi
    'Gem RegvalueType, Tal som matcher RegValueType.RegValueTypeId
    'Hent det autonumber ID som er tildelt @RegValueId og gem det i AutoRegValueId
   
'Gem så i T_RegEntriesEntities
    'Gem RegEntryId som tidliger er fanget i en Variabel, AutoRegEntryId
    'Gem RegEntryPathId som er fanget i en Variabel, AutoRegPathId
    'Gem RegValueId som er fanget i en Variabel, AutoRegValueId
   
'Gem så i T_DeiceRegistryBindingTable
    'Gem DeviceId, hentet fra DeviceType Loopet
    'Gem Device DeviceTypeId, hentet fra DeviceType Loopet
    'Gem RegentryId som er fanget i en Variabel, AutoRegEntryId
'***************************************************************************************
'**************** SLUT PÅ Gem data i databasen i korrekt rækkefølge ********************
'***************************************************************************************
'Dim Alle modtaget variabler
Dim DeviceTypeVersion, MainCategory, SubCategory, Directory, ValueName, ValueType, RegValues
DeviceTypeVersion = Replace(Request.Querystring("DeviceTypeVersion"), "'", "''")
MainCategory      = Replace(Request.Querystring("MainCategory"    ), "'", "''")
SubCategory      = Replace(Request.Querystring("Sub_Categories"  ), "'", "''")
Directory        = Replace(Request.Querystring("Directory"        ), "'", "''")
ValueName        = Replace(Request.Querystring("ValueName"        ), "'", "''")
ValueType        = Replace(Request.Querystring("ValueType"        ), "'", "''")
RegValues        = Replace(Request.Querystring("RegValues"        ), "'", "''")

'Dim alle Variable som oprettes på denne side
Dim Category

'Check alle variabler om de er i rigtig form og udfyldt

'Find ud af om vi skal gemme den under en MainCatory eller SubCategory
If SubCategory = "" Then
    Category = MainCategory
Else
    Category = SubCategory
End If


Dim CountObjects
Dim Choice'Set Object = DeviceTypeVersion
Dim SplitSaveDevice
Dim SaveDevice
Dim DeviceId
Dim DeviceType
'Find hvor mange Devices der er snak om
'Start en Counter
CountObjects = 0
For Each Choice in DeviceTypeVersion
    'Splitte objectet op i mindre dele-Array, splittes på ,
    SplitSaveDevice = Split(DeviceTypeVersion, ",", -1)
        'Udskriv ObjectArrayet baseret på Counter
        Response.Write("DeviceTypeVersion er = ") & SplitSaveDevice(CountObjects) & ("<br>")
            'Split nu ObjectetVærdierne op i mindre dele, splittes på | og bruger Counteren til at definere hvilket Array
            SaveDevice = Split(SplitSaveDevice(CountObjects), "|", -1)
                'Tildel værdierne til variabler som bruges til database
                DeviceId = SaveDevice(0)
                DeviceType = SaveDevice(1)
                'GEM I DATABASE HER
                'SaveDevice = "Insert into T_DeviceRegistryBindingTabel ("

                'SaveDevice = strSQL & "DeviceId, "
                'SaveDevice = strSQL & "DeviceTypeId) "
               
                'SaveDevice = strSQL & "values( "
               
                'SaveDevice = strSQL & "'DeviceId', "
                'SaveDevice = strSQL & "'DeviceType')"
               
                'Conn.Execute(SaveDevice)
                Response.Write("DeviceId = ") & DeviceId & ("<br>")
                Response.Write("DeviceType = ") & DeviceType & ("<br>")
'Læg 1 til counteren for næste loop           
CountObjects = CountObjects + 1
Next
Response.Write("Der er ") & CountObjects & (" i CountObjects") & ("<br><br>")


%>
</body>
</html>

og her er så en formateret Querystring :

http://www.domæne.dk/xda/RegCreator/save_new_entry.asp?
DeviceTypeVersion=4%7C1
&DeviceTypeVersion=1%7C1
&DeviceTypeVersion=3%7C1
&MainCategory=1
&SubCategory=
&Directory=DETTER+ER+PATH
&ValueName=DETTE+ER+VALUENAME
&ValueType=1&RegValues=DETTE+ER+VALUE+OPTIONS
&Submit=Add+new+key
Avatar billede softspot Forsker
20. august 2005 - 18:58 #8
Fint nok... jeg vil dog stadig fastholde at du skal splitte DeviceTypeVersion og loope på variablen SplitSaveDevice istedet, da du som sagt ikke kan lave for each på en streng...
Avatar billede softspot Forsker
20. august 2005 - 19:06 #9
Så kan man jo sige at der i dette tilfælde ikke er nogen grund til at have et counterobjekt, når man nu benytter for each der giver det aktuelle objekt i listen man itererer over (det jeg har valgt at kalde choice af religiøse årsager). Loop'et og den umiddelbare kontekst kommer så til at se således ud:

<%@ language="vbscript" %>
<%
Option Explicit

Dim Choice
Dim SplitSaveDevice
Dim SaveDevice
Dim DeviceId
Dim DeviceType
Dim DeviceTypeVersion

DeviceTypeVersion = "1|2,3|4,5|6"

'Find hvor mange Devices der er snak om

'Splitte objectet op i mindre dele-Array, splittes på ,
SplitSaveDevice = Split(DeviceTypeVersion, ",", -1)

For Each Choice in SplitSaveDevice
    'Udskriv ObjectArrayet baseret på Counter
    Response.Write("DeviceTypeVersion er = " & Choice & "<br>")

    'Split nu ObjectetVærdierne op i mindre dele, splittes på | og bruger Counteren til at definere hvilket Array
    SaveDevice = Split(Choice, "|")

    'Tildel værdierne til variabler som bruges til database
    DeviceId = SaveDevice(0)
    DeviceType = SaveDevice(1)

    'GEM I DATABASE HER
    'SaveDevice = "Insert into T_DeviceRegistryBindingTabel ("

    'SaveDevice = strSQL & "DeviceId, "
    'SaveDevice = strSQL & "DeviceTypeId) "
   
    'SaveDevice = strSQL & "values( "
   
    'SaveDevice = strSQL & "'DeviceId', "
    'SaveDevice = strSQL & "'DeviceType')"
               
    'Conn.Execute(SaveDevice)
    Response.Write("DeviceId = " & DeviceId & "<br>")
    Response.Write("DeviceType = " & DeviceType & "<br>")
Next
%>
Avatar billede softspot Forsker
21. august 2005 - 15:34 #10
Bragte det dig videre, eller føler du stadig ikke det fungerer?
Avatar billede bojohansen Nybegynder
22. august 2005 - 14:13 #11
Skal lige få kigget på det lidt senere, røg i byen midt i det hele.
Så jeg orker ikke andet end sofa'en lige i dag ;-)
Avatar billede softspot Forsker
22. august 2005 - 14:15 #12
Fair nok :) Ser frem til at høre fra dig...
Avatar billede bojohansen Nybegynder
22. august 2005 - 15:19 #13
Nå, nu måtte jeg jo kigge lidt på det aligevel.
Det spiller jo fint, men jeg syntes det er lidt mærkeligt at jeg ikke kan finde noget info om Choice i VBScript V5.5 Documentation, men det er måske på tide at finde en nyere udgave af den.

Husk svar
Avatar billede softspot Forsker
23. august 2005 - 02:14 #14
Du fik et der så :)

Choice er bare et variabelnavn, så det finder du nok ikke i dokumentationen (ikke med nogen speciel betydning i det mindste).
Avatar billede softspot Forsker
23. august 2005 - 15:08 #15
Tak for point :)
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
Kurser inden for grundlæggende programmering

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