webForumDet fria alternativet

Optimering av do-loop

14 svar · 295 visningar · startad av martinpartin

martinpartinMedlem sedan jan. 2001373 inlägg
#1

Hej, Skulle behöva tips & ideér hur man optimera den Do-loop till så lite kod som möjligt och så snabb så möjligt...

Ska köra 38 000 ggr... är det problem ? har testat med 50 st än så länge...

Tankar o tips ang. detta mottages med glädje.


Do Until RS.EOF 

I_counter = i_counter + 1

If IsNull(RS("notification")) then
   str_noti = Cstr("-")
Else
   str_noti = Cstr(RS("Notification"))
End If
If IsNull(RS("Title")) then
   str_Title = Cstr("-")
Else
   str_Title = Cstr(RS("Title"))
End If

If IsNull(RS("Phone2")) then
   str_phone2 = Cstr("-")
Else
   str_phone2 = Cstr(RS("Phone2"))
End If

Set objContact = adsDomain.Create("contact", "cn=" & Cstr(RS("Name")))

objContact.put "DisplayName", Cstr(RS("Name"))
objContact.SetInfo
objContact.put "mail", Cstr(RS("Mail"))
objContact.put "mailNickname", Cstr(RS("Memoid"))
objContact.SetInfo
objContact.put "proxyAddresses", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "targetAddress", "SMTP:"& Cstr(RS("Mail")) &""
objContact.SetInfo
objContact.put "telephoneNumber", Cstr(RS("Phone1"))
objContact.put "Homephone", str_phone2
objContact.put "Department", Cstr(RS("Department"))
objContact.put "Title", str_title
objContact.put "Info", str_noti
objContact.SetInfo

Response.Write("Contact created!("& i_counter &")<BR>")

RS.MoveNext
Loop
@ndersMedlem sedan juni 200032 969 inlägg
#2

Eftersom jag inte har en aning om vad adsDomain.Create() håller på med, så är det lite svårt att svara på frågan.

Vad avgör var du har placerat objContact.SetInfo i koden?

martinpartinMedlem sedan jan. 2001373 inlägg
#3

Så... fick lite felmeddelanden innan när jag körde utan o bryta av med den ibland..

Men tog bort alla utom än o det fungerade ändå.. :)

Hämtar från access DB och sedan lägger objektet in information i Active Directory

Ny kod:


Do Until RS.EOF 

I_counter = i_counter + 1

If IsNull(RS("notification")) then
   str_noti = Cstr("-")
Else
   str_noti = Cstr(RS("Notification"))
End If
If IsNull(RS("Title")) then
   str_Title = Cstr("-")
Else
   str_Title = Cstr(RS("Title"))
End If

If IsNull(RS("Phone2")) then
   str_phone2 = Cstr("-")
Else
   str_phone2 = Cstr(RS("Phone2"))
End If

Set objContact = adsDomain.Create("contact", "cn=" & Cstr(RS("Name")))

objContact.put "DisplayName", Cstr(RS("Name"))
objContact.put "mail", Cstr(RS("Mail"))
objContact.put "mailNickname", Cstr(RS("Memoid"))
objContact.put "proxyAddresses", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "targetAddress", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "telephoneNumber", Cstr(RS("Phone1"))
objContact.put "Homephone", str_phone2
objContact.put "Department", Cstr(RS("Department"))
objContact.put "Title", str_title
objContact.put "Info", str_noti
objContact.SetInfo

Response.Write("Contact created!("& i_counter &")<BR>")

RS.MoveNext
Loop
OveRRidEMedlem sedan feb. 200112 078 inlägg
#4

Använd while istället för Do Until. Det skall visst vara mer prestandasnålt.

while not rs.eof 
   'baluba
rs.movenext
wend
martinpartinMedlem sedan jan. 2001373 inlägg
#5

Set adsDomain = GetObject("LDAP://OU=MEMODir, dc=****,dc=****")

martinpartinMedlem sedan jan. 2001373 inlägg
#6

Ok.. litar på dig override.. tack ! Fler tips ?


While not RS.eof 

I_counter = i_counter + 1

If IsNull(RS("notification")) then
   str_noti = Cstr("-")
Else
   str_noti = Cstr(RS("Notification"))
End If
If IsNull(RS("Title")) then
   str_Title = Cstr("-")
Else
   str_Title = Cstr(RS("Title"))
End If

If IsNull(RS("Phone2")) then
   str_phone2 = Cstr("-")
Else
   str_phone2 = Cstr(RS("Phone2"))
End If

Set objContact = adsDomain.Create("contact", "cn=" & Cstr(RS("Name")))

objContact.put "DisplayName", Cstr(RS("Name"))
objContact.put "mail", Cstr(RS("Mail"))
objContact.put "mailNickname", Cstr(RS("Memoid"))
objContact.put "proxyAddresses", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "targetAddress", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "telephoneNumber", Cstr(RS("Phone1"))
objContact.put "Homephone", str_phone2
objContact.put "Department", Cstr(RS("Department"))
objContact.put "Title", str_title
objContact.put "Info", str_noti
objContact.SetInfo

Response.Write("Contact created!("& i_counter &")<BR>")

RS.movenext
Wend
martinpartinMedlem sedan jan. 2001373 inlägg
#7

Den behöver inte sätta "-" .. kan fortfarande vara Null...
Ville slippa felmeddelande från Cstr
Men det måste vara en str när man sätter in den i AD't


If IsNull(RS("Phone2")) then
   str_phone2 = Cstr("-")
Else
   str_phone2 = Cstr(RS("Phone2"))
End If
@ndersMedlem sedan juni 200032 969 inlägg
#8

Hur ofta ska du köra den här koden?

Om det är en engångsföreteelse så tycker jag du ska brassa på ordentligt i Server.ScriptTimeout, och sedan köra så det ryker. (och hålla tummarna... ;) )

@ndersMedlem sedan juni 200032 969 inlägg
#9

martinpartin skrev:

Den behöver inte sätta "-" .. kan fortfarande vara Null...
Ville slippa felmeddelande från Cstr
Men det måste vara en str när man sätter in den i AD't

Ok. Då räcker det här:

Do Until RS.EOF 

I_counter = i_counter + 1

Set objContact = adsDomain.Create("contact", "cn=" & Cstr(RS("Name")))

objContact.put "DisplayName", Cstr(RS("Name"))
objContact.put "mail", Cstr(RS("Mail"))
objContact.put "mailNickname", Cstr(RS("Memoid"))
objContact.put "proxyAddresses", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "targetAddress", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "telephoneNumber", Cstr(RS("Phone1"))
objContact.put "Homephone", "" & RS("Phone2")
objContact.put "Department", Cstr(RS("Department"))
objContact.put "Title", "" & RS("Title")
objContact.put "Info", "" & RS("notification")
objContact.SetInfo

Response.Write("Contact created!("& i_counter &")<BR>")

RS.MoveNext
Loop

Du kan lägga "" & framför alla värden du hämtar direkt ur recordsetet, så undviker du null.

mvh

martinpartinMedlem sedan jan. 2001373 inlägg
#10

en gång i veckan ca :) ska försöka lösa det inkrementellt på nått sätt sen.. Server.Scriptout.. Har inte ens tänkt så långt.. Ska kolla på den. Behövs nog.. hmm. :)

martinpartinMedlem sedan jan. 2001373 inlägg
#11

ahhh tack för det sista anders

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#12

Indentera koden i loopen så den blir tydligare...

Istället för alla IsNull prylar:

str_noti = RS("Notification") & ""
str_Title = RS("Title") & ""
str_phone2 = RS("Phone2") & ""
martinpartinMedlem sedan jan. 2001373 inlägg
#13

Fungerade inte med... & ""

Fick ett meddelande som inte ens microsoft visste..

martinpartinMedlem sedan jan. 2001373 inlägg
#14

Körde med detta och det funka

objContact.put "Info", RS("Notification") & " "

martinpartinMedlem sedan jan. 2001373 inlägg
#15

Så detta alltså.. känns faktiskt som det går snabbare !! :)


While not RS.eof 
I_counter = i_counter + 1
Set objContact = adsDomain.Create("contact", "cn=" & Cstr(RS("Name")))
objContact.put "DisplayName", Cstr(RS("Name"))
objContact.put "mail", Cstr(RS("Mail"))
objContact.put "mailNickname", Cstr(RS("Memoid"))
objContact.put "proxyAddresses", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "targetAddress", "SMTP:"& Cstr(RS("Mail")) &""
objContact.put "telephoneNumber", Cstr(RS("Phone1"))
objContact.put "Homephone", RS("Phone2") & " "
objContact.put "Department", Cstr(RS("Department"))
objContact.put "Title", "" & RS("Title") & " "
objContact.put "Info", RS("Notification") & " "
objContact.SetInfo
Response.Write("Contact created!("& i_counter &")<BR>")
RS.movenext
Wend
132 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)