[asp][excel]dropdown probleem

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
Hoi, met pijn en moeite heb ik het voor elkaar gekregen om een excel connectie te maken. Waarom? Ik zal het ff uitleggen.

Iemand kan een een excel sheet uppen, met data (logisch :))
Maar die data moet wel op een fatsoenlijke manier in een MS SQL db gepropt worden. De velden in deze db zijn voorgedefineerd en daar mag niet van afgeweken worden. Nu dacht ik, door dropdowns te vullen, met de veldnamen uit het excel sheet, dan kan ik daarna wel die db vullen met de gegevens uit het sheet.

Nu heb ik de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<%
' Selected constants from adovbs.inc
Const adOpenStatic = 3
Const adLockPessimistic = 2

Dim cnnExcel
Dim rstExcel
Dim I
Dim iCols
Dim Bestandsnaam
Dim Veldnaam

' This is all standard ADO except for the connection string.
' You can also use a DSN instead, but so it'll run out of the
' box on your machine I'm using the string instead.
Bestandsnaam = session("xls")
Veldnaam = Request.Form ("sheetname")
Set cnnExcel = Server.CreateObject("ADODB.Connection")
cnnExcel.Open "DBQ=d:\wwwroot\xls_files\"&Bestandsnaam & ";" & "DRIVER={Microsoft Excel Driver (*.xls)};"

' Same as any other data source.
' FYI: TestData is my named range in the Excel file
Set rstExcel = Server.CreateObject("ADODB.Recordset")
rstExcel.Open "SELECT * FROM [" & Veldnaam & "];", cnnExcel, adOpenStatic, adLockPessimistic


' Get a count of the fields and subtract one since we start
' counting from 0.
iCols = rstExcel.Fields.Count
%>
<link rel="stylesheet" href="verhuiskrt.css" type="text/css">
<h1>Koppel hier uw data!</h1>
<form name="excell" method="post" action="xlsfiledbinsert.asp">
  <table width="637" border="0">
    <tr> 
    <td width="218"> 
      <h1>Vaste Waardes</h1>
    </td>
    <td width="409"> 
      <h1>Uw database</h1>
    </td>
    </tr>
    <tr> 
    <td width="218"> 
      <input type="text" name="VOORNAAM" value="Voornaam">
    </td>
    <td width="409"> 
      <select name="vnaam1">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
      <select name="vnaam2">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
    </td>
    </tr>
    <tr> 
    <td width="218"> 
      <input type="text" name="ACHTERNAAM" value="Achternaam">
    </td>
    <td width="409"> 
      <select name="anaam1">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
      <select name="anaam2">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
    </td>
    </tr>
    <tr> 
    <td width="218"> 
      <input type="text" name="ADRES" value="Adres">
    </td>
    <td width="409"> 
      <select name="adres1">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
      <select name="adres2">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
      <select name="adres3">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
    </td>
    </tr>
    <tr> 
    <td width="218"> 
      <input type="text" name="POSTCODE" value="Woonplaats">
    </td>
    <td width="409"> 
      <select name="woonplaats">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
    </td>
    </tr>
    <tr> 
    <td width="218"> 
      <input type="text" name="POSTCODE" value="Postcode">
    </td>
    <td width="409"> 
      <select name="postcode1">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
      <select name="postcode2">
        <option selected>Selecteer:</option>
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
      </select>
    </td>
    </tr>
  </table>
  <br>
  <input type="submit" name="Submit" value="Verder!">
</form>
<%
rstExcel.Close
Set rstExcel = Nothing

cnnExcel.Close
Set cnnExcel = Nothing
%>

het lukt me wel om die dropdowns te vullen met de veldnamen, alleen als ik een veld niet gebruik, dan blijft ie op Selecteer: staan deze waarde wordt dan ook meegegeven. Maar hij moet die juist negeren.

Iemand een oplossing / idee.

p.s.: ideeen om dit simpeler te doen zijn ook welkom natuurlijk :)

--edit: sorry voor het verne*ken van de layout :)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 23:09

Skinny

DIRECT!

die
code:
1
<option value=-1>selecteer :

ook een value meegeven (bijvoorbeeld -1) en dan bij het uitlezen van de gekozen waarden checken of het niet -1 is...

SIZE does matter.
"You're go at throttle up!"


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
uhm... die had ik ook een keer gedaan en toen werkte het helemaal niet meer, maar ik zie dat het nu ook niet meer werkt. :(

Ik zal er idd nog eens ff naar kijken. Dank je iig

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
damn... zodra ik dus value -1 eraan hang, dan doet ie het niet meer:

Deze error krijg ik:

Kan het item niet vinden in de collectie die overeenkomt met de gewenste naam of het gewenste nummer

:(

/edit:

ik heb het nu wel dat ie geen error meer geeft, er moest nog een For loop tussen.

Maar hij geeft nu keihard als value "-1" mee.

* TeeDee heeft zich weer eens in de nesten gewerkt :)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 23:09

Skinny

DIRECT!

wat is de inhoud van je "xlsfiledbinsert.asp" ?? waar het <form> naartoe post ?

SIZE does matter.
"You're go at throttle up!"


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%
' formulier gegevens ophalen
Dim VOORNAAM, ACHTERNAAM, ADRES, WOONPLAATS, POSTCODE
VOORNAAM = Request.form ("vnaam1")&" "& Request.form ("vnaam2")
ACHTERNAAM = Request.form ("anaam1")&" "& Request.form ("anaam2")
ADRES = Request.form ("adres1")&" "& Request.form ("adres2")&" "& Request.form ("adres3")
WOONPLAATS = Request.form ("woonplaats")
POSTCODE = Request.form ("postcode1")&" "& Request.form ("postcode2")
' ffies debuggen
Response.write " De voornaam: "&VOORNAAM&"<br>"
Response.write " De achternaam: "&ACHTERNAAM&"<br>"
Response.write " Het adres: "&ADRES&"<br>"
Response.write " De Woonplaats: "&WOONPLAATS&"<br>"
Response.write " De Postcode: "&POSTCODE&"<br>"
%>

Ik doe eerst ffies simpele response.writes om te checken...

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 23:09

Skinny

DIRECT!

Ik zit trouwens nog eens naar de pagina (in je 1e post) te kijken, maar waarom print je de hele tijd hetzelfde veld (I) ??

Bijvoorbeeld

Regel : VOORNAAM - SELECT 1 (VNAAM1) - SELECT 2 (VNAAM2)

Ik snap wel ongeveer je bedoeling, maar wat is je logica achter de huidige opzet ?

SIZE does matter.
"You're go at throttle up!"


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
omdat door middel van die drop downs de juiste waardes aan bepaalde db velden gehangen moeten worden.

Want dat kan niet automatisch verwerkt worden. Elke gebruiker _kan_ namelijk een andere database uploaden.

edit: ik zei dat trouwens een paar posts hoger, er moest nog een For loopje tussen dus:
code:
1
2
        <option value="<%=rstExcel.Fields.Item(I).Name%>"><%=rstExcel.Fields.Item(I).Name%></option>
        <%Next 'I%>

Ik zal dat eigenlijk in de 1e post er nog bij moeten zetten :)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 23:09

Skinny

DIRECT!

Vergeet ff die bovenstaande code...

Even een situatieschets :

Je krijgt een geuploade Excel sheet van een gebruiker.

1. Is deze sheet nou altijd in hetzelfde formaat ? Dat wordt niet echt duidelijk uit je tekst. Wil je dit formaat dan forceren of laat je de gebruiker de keus (zie 2)

2. Wil je de gebruiker de mogelijkheid geven om zelf aan te geven welke kolom in de Excel sheet overeekomt met welke kolom in de database ?

SIZE does matter.
"You're go at throttle up!"


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
1. ja, het kan een willekeurige excel zijn.

2. de gebruiker zal dat zelf moeten doen ja, omdat ik echt niet weet hoe je dat kunt automatiseren.

voorbeeld van 2.:
gebruiker1: excel sheet met 28 velden
naam, achternaam, tussenvoegsel etc. etc.

gebruiker2: excel sheet met 28 velden
voornaam, familienaam, etc. etc.

dan ga je volgens mij al op je bek...

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 23:09

Skinny

DIRECT!

mijn ASP syntax kennis is een beetje weggezakt dus hierbij wat pseudo-code ;) , naja bijna ASP... Geen ASP server hier, dus checken kan ik het niet, maar dit is mijn idee :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%
Const adOpenStatic = 3
Const adLockPessimistic = 2
Dim cnnExcel
Dim rstExcel
Dim I
Dim iCols
Dim Bestandsnaam
Dim Veldnaam

Bestandsnaam = session("xls")
Veldnaam = Request.Form ("sheetname")
Set cnnExcel = Server.CreateObject("ADODB.Connection")
cnnExcel.Open "DBQ=d:\wwwroot\xls_files\"&Bestandsnaam & ";" & "DRIVER={Microsoft Excel Driver (*.xls)};"

Set rstExcel = Server.CreateObject("ADODB.Recordset")
rstExcel.Open "SELECT * FROM [" & Veldnaam & "];", cnnExcel, adOpenStatic, adLockPessimistic


REM ******* Maak een array met daarin alle Excel sheet velden
Dim ExcelFieldArray As String(rstExcel.Fields.Count - 1)

For myField = 0 To rstExcel.Fields.Count - 1
    
    ExcelFieldArray(myField) = rstExcel.Fields(myField).Name

Next myField

REM ******* Maak een array met daarin alle vereiste velden

Dim VereisteVelden AS String(4)
VereisteVelden(1) = "Naam"
VereisteVelden(2) = "Adres"
VereisteVelden(3) = "Postcode"
VereisteVelden(4) = "Woonplaats"


%>

<FORM NAME="excell" METHOD="post" ACTION="xlsfiledbinsert.asp">
<TABLE>

<%

REM ******* Loop door alle vereiste velden

For RequiredField = 1 To UBound(VereisteVelden)

    Response.Write "<TR><TD>" & VereisteVelden(RequiredField) & "</TD><TD> Koppelen met : "
    Response.Write "<SELECT NAME='" & VereisteVelden(RequiredField) & "'>"
    
      REM ******* Loop door alle Excel sheet velden (als <OPTION>)
    For ExcelField = 0 To Ubound(ExcelFieldArray)

        Response.Write "<OPTION VALUE='" & ExcelFieldArray(ExcelField).Name & "'>" & ExcelFieldArray(ExcelField).Name

    Next ExcelField 

    Response.Write "</SELECT></TD></TR>"

Next RequiredField

%>

</TABLE>
</FORM>

Maak een array met de vereiste velden, een array met de velden in de Excel sheet en doe dan het volgende :


- Loop door alle vereiste velden.
- Maak voor elk vereiste veld een regel met twee kolommen.
- Kolom 1 : Naam vereiste veld
- Kolom 2 : Een <SELECT> met daarin alle waardes uit die Excel sheet (ook gehaald uit een array)

[edit]Goh, toch wel in een goede bui vandaag :)

SIZE does matter.
"You're go at throttle up!"


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
tnx, ben al een klein stukje verder iig (moest nog wel her en der wat aanpassen), maar zodra ik er helemaal uit ben post ik het hier natuurlijk nog ff....

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
dit probleem heb ik overwonnen.. (dankzij Skinny) nu het volgende: (wederom een layout verneuker :)) In deze code wil ik dus een variabel aantal velden koppelen met een vast aantal gegevens die in een db gezet worden. Hij haalt dus uit de vorige pagina de geselecteerde velden (middels de dropdown pagina (het vorige probleem dus, hierboven beschreven), en dan is het dus zaak om de waardes uit die velden te halen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<%
' Selected constants from adovbs.inc
Const adOpenStatic = 3
Const adLockPessimistic = 2

Dim cnnExcel
Dim rstExcel
Dim I
Dim iCols
Dim Bestandsnaam
Dim Veldnaam

' This is all standard ADO except for the connection string.
' You can also use a DSN instead, but so it'll run out of the
' box on your machine I'm using the string instead.
Bestandsnaam = session("xls")
Response.write bestandsnaam&"<br>"
Veldnaam = Request.Form ("sheetname")
Response.write Veldnaam&"<br>"
Set cnnExcel = Server.CreateObject("ADODB.Connection")
cnnExcel.Open "DBQ=d:\wwwroot\xls_files\"&Bestandsnaam & ";" & "DRIVER={Microsoft Excel Driver (*.xls)};"
Set rstExcel = Server.CreateObject("ADODB.Recordset")
rstExcel.Open "SELECT * FROM ["&Veldnaam&"];", cnnExcel, adOpenStatic, adLockPessimistic

' Get a count of the fields and subtract one since we start
' counting from 0.
iCols = rstExcel.Fields.Count

'dbvars aanmaken
Dim DBVOORNAAM, DBACHTERNAAM, DBADRES, DBPOSTCODE, DBWOONPLAATS
Dim vnaam1, vnaam2, anaam1, anaam2, adres1, adres2, adres3, woonplaats, postcode1, postcode2
if (request.form("vnaam1")<> "-1") Then vnaam1=rstExcel.Fields.Item(request.form("vnaam1")).Value end if
if (request.form("vnaam2")<> "-1") Then vnaam2=rstExcel.Fields.Item(request.form("vnaam2")).Value end if
if (request.form("anaam1")<> "-1") Then anaam1=rstExcel.Fields.Item(request.form("anaam1")).Value end if
if (request.form("anaam2")<> "-1") Then anaam2=rstExcel.Fields.Item(request.form("anaam2")).Value end if
if (request.form("adres1")<> "-1") Then adres1=rstExcel.Fields.Item(request.form("adres1")).Value end if
if (request.form("adres2")<> "-1") Then adres2=rstExcel.Fields.Item(request.form("adres2")).Value end if 
if (request.form("adres3")<> "-1") Then adres3=rstExcel.Fields.Item(request.form("adres3")).Value end if
if (request.form("woonplaats")<> "-1") Then woonplaats=rstExcel.Fields.Item(request.form("woonplaats")).Value end if
if (request.form("postcode1")<> "-1") Then postcode1=rstExcel.Fields.Item(request.form("postcode1")).Value end if
if (request.form("postcode2")<> "-1") Then postcode2=rstExcel.Fields.Item(request.form("postcode2")).Value end if

'data koppelen opdat het makkelijk geinsert wordt! :)
DBVOORNAAM = vnaam1&" "&vnaam2
DBACHTERNAAM = anaam1&" "&anaam2
DBADRES = adres1&" "&adres2&" "&adres3
DBWOONPLAATS = woonplaats
DBPOSTCODE = postcode1&" "&postcode2

%>
<form name="form1" method="post" action="jobdbinsert.asp">
  <table width="500" border="1" cellspacing="0" cellpadding="0">
    <tr> 
    <td><font face="Verdana, Arial, Helvetica, sans-serif" size="2">VOORNAAM</font></td>
    <td><font face="Verdana, Arial, Helvetica, sans-serif" size="2">ACHTERNAAM</font></td>
    <td><font face="Verdana, Arial, Helvetica, sans-serif" size="2">ADRES</font></td>
    <td><font face="Verdana, Arial, Helvetica, sans-serif" size="2">POSTCODE</font></td>
    <td><font face="Verdana, Arial, Helvetica, sans-serif" size="2">WOONPLAATS</font></td>
    </tr>
    <tr> 
<%
rstExcel.MoveFirst
Do while Not rstExcel.EOF
For I = 0 To iCols -1
Response.write "<td>"
Response.write DBVOORNAAM
Response.write "</td>"
Next
Loop
%>
<%
rstExcel.MoveFirst
Do while Not rstExcel.EOF
For I = 0 To iCols -1
Response.write "<td>"
Response.write DBACHTERNAAM
Response.write "</td>"
Next
Loop
%>
<%
rstExcel.MoveFirst
Do while Not rstExcel.EOF
For I = 0 To iCols -1
Response.write "<td>"
Response.write DBADRES
Response.write "</td>"
Next
Loop
%>
<%
rstExcel.MoveFirst
Do while Not rstExcel.EOF
For I = 0 To iCols -1
Response.write "<td>"
Response.write DBPOSTCODE
Response.write "</td>"
Next
Loop
%>
<%
rstExcel.MoveFirst
Do while Not rstExcel.EOF
For I = 0 To iCols -1
Response.write "<td>"
Response.write DBWOONPLAATS
Response.write "</td>"
Next
Loop
%>
</tr>
</table>
<br>
<input type="submit" name="Submit" value="Submit">
</form>
<%
rstExcel.Close
Set rstExcel = Nothing

cnnExcel.Close
Set cnnExcel = Nothing
%>

nou zou je vragen: select ie het excel file, en de juiste sheetname? Yup, ik heb bovenin 2 response.write's neergezet en die geven netjes de juiste file en sheetname weer.
Hij geeft de volgende error:

ADODB.Fields error '800a0cc1'
Kan het item niet vinden in de collectie die overeenkomt met de gewenste naam of het gewenste nummer.

Verder heb ik ook nog het een en ander getest natuurlijk:
met een stukje code van asp101:
http://www.asp101.com/samples/xl_data.asp

als ik dit , de code van asp101, gebruik ipv mijn eigen dcode: dan geeft ie netjes de veldnamen en de gegevens weer uit het excel sheet.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
ik heb ook nog het volgende geprobeerd:

handmatig het filename en veldnaam in te voeren om dmv zoiets tot resultaat te komen. Niks, maar ja, die ene code van asp101.com werkt wel perfect... maar dit gewoon niet.. .snap er echt helemaal niks meer van....

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:04
/edit: hier stond blaat :(

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1