Dynamic drop down list

M

mcgrew.michael

I hope this is the right group. I am very new to ASP so this is
probably a stupid question. I have some vbscript that query's AD and
populates a recordset. I know the recorset contains the information I
want by doing a Response.write. I am having problems dynamically
creating a drop down list from the data in the recordset. The drop down
is created but it is empty. Any help would be greatly appreciated. A
sample of the code:

<%
'On Error Resume Next
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
strOU = "OU=Generic Accounts,"
' Use ADO to search Active Directory.
Set objCommand = CreateObject("ADODB.Command")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection
strBase = "<LDAP://" & strOU &" " & strDNSDomain &">"
strFilter = "(&(objectCategory=person)(objectClass=user))"
strQuery = strBase & ";" & strFilter & ";cn;subtree"
objCommand.CommandText = strQuery
objCommand.Properties("Page Size") = 100
objCommand.Properties("Timeout") = 30
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
sName = objRecordSet.Fields("cn").Value
'Response.Write(sName)
genericAccount = "<option value= & '"sName"' & >"

objRecordSet.MoveNext
Loop
%>
<html><head><title>Dynamic Drop-Down Menu Example</title></head>
<body>
<form method="POST" action="test3.asp">
<p><select size="1" name="GenericAccounts">
<%=genericAccount%>
</select></p>
</form>
</body>
</html>
 
M

Michael Kujawa

genericAccount = "<option value= & '"sName"' & >"

I would think should be

genericAccount = genericAccount & "<option value='" & sName & "'>" & sName &
"</option>"
 
M

mcgrew.michael

Thanks Michael. That did the trick.

Michael said:
genericAccount = "<option value= & '"sName"' & >"

I would think should be

genericAccount = genericAccount & "<option value='" & sName & "'>" & sName &
"</option>"
 
B

Bob Barrows [MVP]

I hope this is the right group. I am very new to ASP so this is
probably a stupid question. I have some vbscript that query's AD and
populates a recordset. I know the recorset contains the information I
want by doing a Response.write. I am having problems dynamically
creating a drop down list from the data in the recordset. The drop
down is created but it is empty. Any help would be greatly
appreciated. A sample of the code:

<%
'On Error Resume Next
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
strOU = "OU=Generic Accounts,"
' Use ADO to search Active Directory.
Set objCommand = CreateObject("ADODB.Command")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection
strBase = "<LDAP://" & strOU &" " & strDNSDomain &">"
strFilter = "(&(objectCategory=person)(objectClass=user))"
strQuery = strBase & ";" & strFilter & ";cn;subtree"
objCommand.CommandText = strQuery
objCommand.Properties("Page Size") = 100
objCommand.Properties("Timeout") = 30
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute

This line is not needed - upon opening, the recordset is already
pointing at the first record unless EOF is true.:
objRecordSet.MoveFirst

Do Until objRecordSet.EOF
sName = objRecordSet.Fields("cn").Value
'Response.Write(sName)

Here is the problem:
genericAccount = "<option value= & '"sName"' & >"

Two problems:
1. You are overwriting genericAccount with each pass through the loop.
I' m sure that's not what you intended.
2. You've put the quotes in the wrong places - this line should generate
an error. I notice the first "On Error" line is commented out, so it's
puzzling you aren't getting an error message. When you view the page's
source in the browser, what do you see?
The line should be:
genericAccount = genericAccount & "<option value='" & sName & "'>"


Anyways, this is an inefficient way to accomplish this task. Here is
what I would do:

Set objRecordSet = objCommand.Execute
dim arData, i
If Not objRecordSet.EOF then arData = objRecordSet.GetRows(,,"cn")
objRecordSet.close : set objRecordSet= nothing
if isArray(arData) then
for i = 0 to ubound(arData,2)
genericAccount = genericAccount & "<option value='" & _
arData(0,i) & "'>"
next
end if
 
A

Adrienne Boswell

(e-mail address removed) wote:
I hope this is the right group. I am very new to ASP so this is
probably a stupid question.

There is no such thing as a stupid question, just people acting stupid.
I have some vbscript that query's AD and
populates a recordset. I know the recorset contains the information I
want by doing a Response.write. I am having problems dynamically
creating a drop down list from the data in the recordset. The drop down
is created but it is empty. Any help would be greatly appreciated. A
sample of the code:
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
sName = objRecordSet.Fields("cn").Value
'Response.Write(sName)
genericAccount = "<option value= & '"sName"' & >"

objRecordSet.MoveNext
Loop
'Response.Write(sName)
genericAccount = "<option value= & '"sName"' & >"

objRecordSet.MoveNext
Loop
%>
<html><head><title>Dynamic Drop-Down Menu Example</title></head>
<body>
<form method="POST" action="test3.asp">
<p><select size="1" name="GenericAccounts">
<%=genericAccount%>
</select></p>
</form>
</body>
</html>

You have your loop in a strange place. You can create the value as a
string, and then place it in your HTML, or you can generate it in the
HTML. But, you should not be regenerating the same HTML over and over
again. Eg:

<% 'run query and open recordset %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html lang="en">
<head>
<title>Dynamic Drop-Down Menu Example</title>
</head>
<body>
<form method="POST" action="test3.asp">
<label for="genericaccounts">Accounts</label>
<select name="genericaccounts" id="genericaccounts">
<% while not objRecordset.EOF
sName = objRecordSet.Fields("cn").Value
%>
<option value="<%=sName%>" <% if genericaccounts = sname
then%>selected="selected"<%end if%>><%=sName%></option>
<% objRecordset.Movenext
wend
objRecordset.Close
set objRecordset = nothing
'close connection to db if not needed again on page
%>
</select>
</form>
</body>
</html>

OR:

<%
while not objrecordset.EOF
genericaccounts = genericaccounts "<option value=" & chr(034) & sname &
chr(034) & "</option>&vbcrlf"
objrecordset.Movenext
'close recordset and close connection if not needed again
%>
<select name="genericaccounts">
<%=genericaccounts%>
</select>
</form>

OR even better would be to use the GetString method described here:
<http://www.4guysfromrolla.com/webtech/102600-1.shtml>

Do you see? You were overwriting the HTML over and over again. It is
also nice to show a value selected if the user has selected it. I
would _strongly_ suggest closing elements, it makes it easier to debug.
Although the closing tag for the option element is not required, it
might make your life easier.
 
B

Bob Barrows [MVP]

Adrienne said:
You have your loop in a strange place. You can create the value as a
string, and then place it in your HTML, or you can generate it in the
HTML. But, you should not be regenerating the same HTML over and over
again. Eg:

I, on the other hand, think it's easier for maintenance if server-side
code is separated from html as much as possible, so I firmly agree with
his choice to run his loop before the <html> element, set his html to a
variable and response.write the variable later on inside the <html>
element. However, this is just a personal preference.
 
D

Dave Anderson

Bob said:
Anyways, this is an inefficient way to accomplish this task.
Here is what I would do:

Set objRecordSet = objCommand.Execute
dim arData, i
If Not objRecordSet.EOF then arData = objRecordSet.GetRows(,,"cn")
objRecordSet.close : set objRecordSet= nothing
if isArray(arData) then
for i = 0 to ubound(arData,2)
genericAccount = genericAccount & "<option value='" & _
arData(0,i) & "'>"
next
end if

And if your data has an apostrophe in it? I would opt for something more
like this:

genericAccount = genericAccount & "<option value=""" & _
Server.HTMLEncode(arData(0,i)) & """>" & _
Server.HTMLEncode(arData(0,i)) & "</option>"

I always use double quotes and Server.HTMLEncode() to write attributes
values from data sources outside my control. To be more precise, I would
also use HTMLEncode once per data item, would optionally set the selected
attribute, and would do the whole thing in JScript.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,066
Latest member
VytoKetoReviews

Latest Threads

Top