Avatar billede cyberkox Nybegynder
18. april 2006 - 16:09 Der er 33 kommentarer og
2 løsninger

Flere af samme dim volder problemer

Hey

Jeg har bygget en side på som følger:

if action = "opret" then
  Her oprettes en række i en db.
  og her dim'es i
  dim i
elseif action = "ret" then
  Her rettes en række i en db.
  og her dim'es i'en igen
  dim i
end if

Hvorfor melder den, at:
Name redefined
Dim i
----^

Jeg har jo delt siden op med min ifsætning?
Avatar billede fennec Nybegynder
18. april 2006 - 16:13 #1
ALLE variabler bliver dim'et før koden køres. Det er derfor lige meget om de står i en if-sætning.
Avatar billede softspot Forsker
18. april 2006 - 16:14 #2
Ja, men det er ikke det der er afgørende for om en dim kan bruges igen eller ej - det er scopet der afgør om du kan generklære et variabelnavn og i dit tilfælde ligger de to dim-sætninger i samme scope. Scope for dimensioneringer afgrænses f.eks. af sub og function, men altså ikke af if-sætninger.
Avatar billede softspot Forsker
18. april 2006 - 16:17 #3
Hvis du er rigtig doven lader du bare være med at dimensionere dine variabler (vil jeg dog ikke anbefale :)) - så slipper du for dette problem. Hvis du ikke kører med Option Explicit er der ikke umiddelbart nogen gevinst ved at dimensionere dine variabler i VBS.
Avatar billede cyberkox Nybegynder
18. april 2006 - 16:19 #4
Aha, den helt store problem er så, at dim'en "dimmens" i en .asp fil, der blir indkluderet på siden (jeg gør brug af en RTE editor, og ja, den blir jo inkludret de to steder, men i princippet ikke samtidig (og ja, så alligevel :)

Så hvordan undgår jeg dette ?
Avatar billede cyberkox Nybegynder
18. april 2006 - 16:20 #5
Endvidere kunne jeg godt tænke mig at få helt præcist fastlagt værdien af at en variabel dimensionere og hvad den gør ved denne?
Avatar billede softspot Forsker
18. april 2006 - 16:26 #6
Som sagt har det ringe eller ingen værdi at dimensionere en variabel, hvis du ikke kører med option explicit. På den anden side, hvis du kører med option explicit, så SKAL du dimensionere dine variable, hvilket har stor værdi ifht. at undgå stavefejl i variabelnavn, da siden fejler, hvis du forsøger at bruge en variabel der ikke er erklæret...

Ang. din kommentar fra 18/04-2006 16:19:08, så er jeg ikke helt sikker på at jeg forstår hvad du vil sige. Kan du evt. omformulere det?
Avatar billede fennec Nybegynder
18. april 2006 - 16:26 #7
Kan så nævne et includes bliver hentet ind FØR der dim's. Den samler altså det hele til en stor fil før den den overhoved læser koden. Derefter kikker den siden igennem for dim's og reservere plads til dem i hukommelsen (funktioner/subs undtaget. Der dim's først når funktionen køres og de får deres egen plads)

ps. Dette er meget forenklet, men det er sådan du skal opfatte kørslen af dine ASP sider.
Avatar billede cyberkox Nybegynder
18. april 2006 - 16:37 #8
Det lyder rigti interessant begge to. Jeg har lige to spm mere:
1. Uddyb option explicit ?
2. Jeg har stadig ikke set meningen i at dimensionere mine variabler? Virker det hurtigere, bedre eller hvad?

----------
Jo, ser i, jeg bruger en RTE editor til at skrive ting til databasen i et cms system, og siden tilfoej.asp er bygget op om en if-sætningen, hvor man enten kan rette i en tekst fra db eller oprette en tekst.

Derved er den linje så dobbelt: <!-- #include file="RTE_editor_inc.asp" --> og det er i denne fil, at i dimensioneres.

Spm. er nu, hvordan jeg får dette løst?
Avatar billede cpufan Juniormester
18. april 2006 - 17:35 #9
drop dim

har ingen praktisk betydning i dette tilfælde.

kan have betydning ved oprettelse af arrays,
hvilket det jo ikke er.
Avatar billede softspot Forsker
18. april 2006 - 18:09 #10
Ad 1. Option Explicit betyder blot at VBS-fortolkeren KRÆVER at alle variable er dimensioneret inden du kan bruge dem og det har som sagt den behagelige effekt, at du bliver mindet om hvis en variabel ikke er dimensioneret (og dermed er chancen for at du har variable med stavefejl mindre).

Ad 2. Uden Option Explicit har det som sådan ikke nogen effekt at dimensionere en variabel inden du bruger den, da VBS-fortolkeren sørger for at dimensionere dem hvis de ikke er dimensioneret i forvejen. Jeg vil altså fastholde (og jeg kan se at cpufan er enig) at der ikke er nogen grund til at dimensionere din variable hvis du ikke bruger Option Explicit.

Hvordan du løser det problem med at inkludere den samme fil 2 gange... tjaa... du kan jo lade være. Hvorfor ikke bare inkludere den ubetinget én gang... så er det problem løst? I øvrigt vil indeholdet blive inkluderet uanset om du lægger en betingelse omkring include eller ej (som fennec også er inde på). Hvis du ikke kan inkludere filen uden at der er en betingelse omkring, så har du et arkitektur-problem, som du bør løse i stedet for at forsøge, at vride armen rundt på ASP... :)
Avatar billede cyberkox Nybegynder
18. april 2006 - 23:20 #11
Men hvad vil det helt konkret sige at dimensionere sine variabler ?

Hvornår og i hvilken sammenhæng bruges der Option Explicit?
Avatar billede softspot Forsker
19. april 2006 - 00:09 #12
Som fennec siger: allokere plads i hukommelsen til den værdi som en variabel skal indeholde.

Option Explicit benyttes når du vil sikre dig at VBS ikke autoamtisk allokerer plads til variable (som den vil gøre hvis du IKKE bruger Option Explicit og IKKE dimensionerer dine variable inden du bruger dem) - dvs. den bør du altid bruge... :)
Avatar billede cyberkox Nybegynder
19. april 2006 - 08:13 #13
Aha, jojo, jeg blir jo klogere og klogere :)

Hvordan bruger man så Option Explicit?
Avatar billede softspot Forsker
19. april 2006 - 08:26 #14
Et eksempel:

<%@ language="vbscript" %>
<%
Option Explicit ' Dette SKAL være den første kodelinie i modulet

' sidens VBScriptkode
%>


Bemærk flg.:

1. Der må kun være en linie i en hel side (dvs. inklusiv alle includes der måtte være på en side) der har linien Option Explicit.

2. Linien Option Explicit SKAL være den første linie på en side, dvs. den SKAL placeres før noget VBScript-kode, men OGSÅ før noget somhelst HTML-kode (da HTML-kode af ASP omsættes til en Response.Write(HTML-kode) og dermed fungerer som en VBS kodelinie).


Mht. dim og nødvendigheden og brugen heraf, så er jeg nød til lige at korrigere migselv, for det har naturligvis en stor værdi at erklære lokale variable, dvs. variable som ligger i sub og functions selvom du ikke bruger Option Explicit. Dette sikrer at du ikke uforvarende kommer til at overskrive værdien af globale (PFUI!!!) variable der måtte have navnesammenfald. Det kan godt virke en smule overflødig i mindre siders VBS, men hvis du inkluderer mange filer med globale variable i flere sider, kan det godt være svært at gennemskue om en variabel er erklæret eller ej, så derfor et par tommelfingerregeler:

1. Brug såvidt muligt aldrig globale variable

2. Erklær ALTID lokale variable med dim, dvs. variable som opstår og nedlægges indenfor scopet af en sub eller function. Bemærk at parametre til en sub eller function allerede er erklæret lokalt idet de fremgår af parameterlisten.
Avatar billede fennec Nybegynder
19. april 2006 - 08:59 #15
softspot >>
Er det ikke lidt svært at undgå globale variable?? Jeg har i hvertfald altid flere af dem...
Mit trik er at navngive funktions variabler så de starter med f (f.eks fTemp), så jeg på den måde undgår, at de har samme navn som en af de globale.
Avatar billede softspot Forsker
19. april 2006 - 09:22 #16
fennec >> Jo, det kræver en del disciplin at undgå globale variable, men jeg tror godt det kan lade sig gøre, hvis man er rigtig artig... men man skal jo også tænke på omkostningerne ved at gennemføre sådan et projekt uden brug af globale variable, så derfor siger jeg også "såvidt muligt".

Det man skal opveje er risikoen for at få problemer med sammenblanding af globale og lokale variable og den tid man kan komme til at bruge på at fejlfinde pga. det kontra den tid man skal bruge ekstra for at håndtere at man ikke bruger globale variable (men det er nok mere et spørgsmål om at tænke på en bestemt måde, når man koder - og være konsekvent! :)

Din metode med en særlig navngivning af globale variable er også ganske effektiv og anbefalelsesværdig, men igen disciplineret udøvet - standarder er kun gode hvis de følges :)
Avatar billede cyberkox Nybegynder
19. april 2006 - 10:06 #17
Ahh, nu snakker i om globale og lokale variabler, hva mener i hermed ?

Scoops og funktioner. Funktioner ved jeg nok hva er, men hva er et scoops er jeg ikke helt klar over?

Er der flere fordele / muligheder ved Option Explicit?
Avatar billede fennec Nybegynder
19. april 2006 - 10:14 #18
dim GlobalVar

function xx()
dim LokalVar
 
end function
Avatar billede softspot Forsker
19. april 2006 - 10:21 #19
En global variabel er en variabel der kan "ses" overalt i programmet. En lokal variabel kan kun ses indenfor det scope hvor den er defineret (i VBS er det praktisk talt vel kun i sub og functions).

Eksempel:

<%
dim gTest ' Denne variabel er global
gTest = 5

function funcTest()
  dim lokalTest ' Denne variabel er lokal og kan kun ses og aflæses i funktionen funcTest
  lokalTest = 10 * gTest
  funcTest = lokalTest
end function

Response.Write "gTest = " & gTest & "<br>"
Response.Write "funcTest = " & funcTest() & "<br>"
Response.Write "lokalTest = " & lokalTest & "<br>"
%>

Som du måske kan se, så erklæres gTest globalt, dvs. udenfor nogen funktioner eller subs og er dermed global, hvorimod lokalTest erklæres inde i funktionen funcTest og er dermed lokal. lokalTest (som den er defineret i funktionen funcTest, dvs. med værdien 10) er ikke tilgængelig udenfor funktionen. Hvis du prøver at udføre koden, vil du opleve at den alligevel kan udføres, men at lokalTest er tom (og ikke 10 som man måske ville forvente).

Rent bort set fra det, så er dette et større område som du nok bør finde en bog der kan forklare dig, for det bliver nærmest til et onlinekursus, hvis alle disse begreber skal forklares her... :)
Avatar billede softspot Forsker
19. april 2006 - 10:23 #20
Lige en lille rettelse: lokalTest er naturligvis ikke 10 men 50 - jeg undskylder misinformationen...
Avatar billede softspot Forsker
19. april 2006 - 10:25 #21
Eksemplet har i øvrigt 2 scopes, det globale (som er synligt overalt) og funcTest (som kun er tilgængeligt for selve funktionens kodelinier).
Avatar billede cyberkox Nybegynder
19. april 2006 - 10:50 #22
Aah, nu er jeg helt med.. Tak skal i have begge to.. Jeg forhøjer lige pointene, for det var jo ikke helt det problemet var i starten :)

----------------------

Men tilbage til spørgsmål:
Problemet er, at denne Rich Text Editor jeg bruger, indgår to gange, fordi siden som sagt er delt i to vha af en if sætning. Og hver gang man skal bruge denne editor, skal man en fil. og det er er i denne fil at der jo så dim'es de samme variabler. Er jeg nødt til at splitte siden i 2 dokumenter så eller kan man slet ikk komme rundt om det?
Avatar billede softspot Forsker
19. april 2006 - 10:55 #23
Prøv i første omgang at fjerne (eller udkommentere) dim-sætningen og se om det ikke løser problemet...
Avatar billede fennec Nybegynder
19. april 2006 - 11:02 #24
Ved ikke om det er det softspot mener, men du skal bare flytte din dim uden for if-sætningen:

dim i
if action = "opret" then
  Her oprettes en række i en db.
elseif action = "ret" then
  Her rettes en række i en db.
end if

Hvis du bruger includes, skal alle dim's fjernes herfra, og smides ind i hoved dokumentet:

dim alle, variabler, fra, filerne
if action = "opret" then
  'Include fil1.asp
elseif action = "ret" then
  'Include fil2.asp
end if

Men det er det som softspot er modstander af :o)
Avatar billede softspot Forsker
19. april 2006 - 11:08 #25
Ja, at lægge dimensioneringer af (eller kendskab til) variable, som logisk hører til i en includefil, ud i den side der benytter includefilen er i direkte modstrid med almindelige principper om indkapsling, så hvis det er det du mener - har du fuldstændig ret i at jeg er modstander af det :D

Det være sagt, så lægger den gængse metode at kode ASP-sider på (dvs. ad-hoc programmering) ikke op til at man indkapsler, så det er et stykke hen ad vejen et spørgsmål om temperament... men jeg synes nu stadig at den finte med at dimensionere variable i siden der inkluderer er lige grov nok ;-)
Avatar billede fennec Nybegynder
19. april 2006 - 11:26 #26
softspot >>
Det er vi så også enige om, og det er en løsning jeg heller ikke vil fortrække.
Her ville jeg indkapsle indholdet af includes i en funktione også kalde den.

Men måske vi skulle se noget mere specifikt kode fra cyberkox. For afhængig af hvordan det ser ud, vil jeg anbefale forskellige løsninger...
Avatar billede softspot Forsker
19. april 2006 - 11:37 #27
enig :)
Avatar billede cyberkox Nybegynder
19. april 2006 - 14:28 #28
Jo, min kode ser sådan ud i grove træk:

if action = "opret" then

<!-- Her smides Web Wiz Rich Text Editor ind -->
<!-- #include file="RTE_editor_inc.asp" --> <- Den er den fil der har en MASSE dimmer i
<textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea>

Skriv til databasen


elseif action = "ret" then

<!-- Her smides Web Wiz Rich Text Editor ind -->
<!-- #include file="RTE_editor_inc.asp" --> <- Den er så den samme fil som før der har en MASSE dimmer i
<textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea>

Ret i databasen

end if
Avatar billede fennec Nybegynder
19. april 2006 - 14:35 #29
Der er vi så ude i noget med at lave indholdet af RTE_editor_inc.asp til en funktioen, men det komme så igen an på hvad der står i den...

Kan du smide hele koden fra RTE_editor_inc.asp herind, hvis den da ikke er alt for stor...
Avatar billede cyberkox Nybegynder
19. april 2006 - 15:10 #30
Joe, det kan jeg vel godt - Problemmet er bar at en side også kalder 2 sider mer og de næste gør det samme igen. Så det er ret omfattende at ændre det hele.?


<!--#include file="functions/RTE_functions_common.asp" -->
<!--#include file="RTE_configuration/RTE_setup.asp" -->
<%
Response.Write(vbCrLf & vbCrLf & "<link href=""RTE_configuration/default_style.css"" rel=""stylesheet"" type=""text/css"" />")
Response.Write(vbCrLf & "<script language=""JavaScript"" src=""RTE_javascript_common.asp"" type=""text/javascript""></script>")


'If this is an RTE enabled web browser load in the RTE content
If RTEenabled() <> "false" Then
   
'    'Load in Javascript for RTE browsers
    Response.Write(vbCrLf & "<script language=""JavaScript"" src=""RTE_javascript.asp?textArea=" & Server.URLEncode(strTextAreaName) & """ type=""text/javascript""></script>")

   

'If this is not an RTE enabled web browser load in the NON-RTE content
Else

    'Load in Javascript for non-RTE browsers
    Response.Write(vbCrLf & "<script language=""JavaScript"" src=""non_RTE_javascript.asp?textArea=" & Server.URLEncode(strTextAreaName) & """ type=""text/javascript""></script>")

    'Display an message that the user is using the non-RTE editor
    Response.Write(vbCrLf & "<script language=""JavaScript"">")
    Response.Write(vbCrLf & "    alert('Your web browser is not Rich Text Enabled.\nYou are using the standard text box area.');")
    Response.Write(vbCrLf & "</script>")
End If

'Create Toolbar and Iframes
Response.Write(vbCrLf & "<script language=""JavaScript"">WebWizRTEtoolbar('" & strFormName & "');</script>")

%>
Avatar billede fennec Nybegynder
19. april 2006 - 15:21 #31
Lige et lille ? til denne del:

if action = "opret" then
<!-- #include file="RTE_editor_inc.asp" -->
<textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea>
elseif action = "ret" then
<!-- #include file="RTE_editor_inc.asp" -->
<textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea>
end if

Det kan jo skrives sådan:

if mode = "opret" or mode = "ret" then
<!-- #include file="RTE_editor_inc.asp" -->
<textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea>
end if

Det skulle løse problemet.
Avatar billede cyberkox Nybegynder
19. april 2006 - 15:35 #32
Ahh, du åbnede lige øjnene op for mig..

Man kan ikke helt gøre det på din måde, men næsten så du hjalp mig lige til at finde løsningen :D

Tusind tak til jer begge to!

Softspot, smider du lige et svar.. I har begge fortjent point :)
Avatar billede softspot Forsker
19. april 2006 - 15:40 #33
Jo, det kommer her - velbekomme :)
Avatar billede cyberkox Nybegynder
19. april 2006 - 15:41 #34
Så kom der point til jer begge. Og endnu en gang tak for hjælpen og forklaringen :)
Avatar billede softspot Forsker
19. april 2006 - 15:42 #35
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

SAP Bruger- og rolleadministrator ved Forsvarsministeriets Regnskabsstyrelse

Capgemini Danmark A/S

Microsoft AI Solution Architect

Politiets Efterretningstjeneste

Centerchef til Center for Applikationer i PET

PensionDanmark

Projektleder

HusCompagniet A/S

IT-driftskonsulent