作者laechan (小太保)
看板mud_sanc
标题[分享] ASP 与 XML part3
时间Thu Apr 5 17:23:55 2012
这篇主要讲我最近写过的程式。
filter_data.asp
这个程式其实有用到我在圣殿写 select 指令的经验,因为
select 後面接的东西是「不定数目」的,而 select 可以依
据所给的数目,产生相符的资料列表。
filter_data 的概念类似,比方我有 10000 笔资料,每个资
料有 n 个资料项目,而我希望程式可以为我筛出我想要的资
料,简易写法就是..
' 以 , 号分隔
tmps = split(request("input_data"),",")
' 取出 sizeof(tmps)
j = CInt(UBound(tmps))
tmp="<table>"
' 10000 笔资料
for each data in datas
' 取得回应的 xml 本文
set xml = Https.ResponseText
jj = 0
' 先判断 xml 里面的资料是否完全符合筛选条件
for i = 0 to j
if InStr(xml,tmps(i) > 0 then
jj = jj+1
end if
next
' 完全 match 才显示
if jj = j then
tmp=tmp & "<tr><th>" & data.name & "</th>"
for i = 0 to j
tmp = tmp & "<th>" & data.item(i) & "</th>"
next
tmp=tmp & "</tr>"
end if
next
其显示的结果类似底下
给定的筛选条件: level, gender, race
输出的结果
┌──────┬──┬──┬───┐
│laechan │120 │male│human │
├──────┼──┼──┼───┤
│norr │120 │male│devil │
├──────┼──┼──┼───┤
│....
给的筛选条件越多,列表就会越长。
data_list.asp、data_show.asp、data_modify.asp
data_list.asp 是把捞出的 10000 笔资料做列表用。
然後每一笔资料都会设超连结,点下去後就会呼叫
data_show.asp,它会显示该笔资料的可变更项目以
及不可变更项目,可变更的包括..
直接改值
<input type=text name=xxx value=ooo>
下拉式选单
<select name=xxx><option selected>选项1<option>选项2...</select>
比方某笔资料若以厂商附的程式去设定,其某资料项
目的下拉可选项多达数百笔,但实际上只有几十笔会
用到而已,因此若用我写的网页介面去选就很快,因
为我有把不会用到的那数百笔略过。
假设有更动资料,就会使用到底下的按钮
<input type=submit name=submit1 value=update>
它会在页面出现一个[update]钮, 按下去後它会呼叫
data_modify.asp, 这时就根据我传过去给它的资料来
做更新,其方式如下...
for each item in request.form
response.write "item name = " & item
response.write "item value = " & request.form(item)
next
所以就会有 keyname 跟其对应值,这时就可以包成 xml..
tmp = ""
for each item in request.form
tmp = tmp & "<" & item & ">" & request.form(item) & "</" & item & ">"
next
比方某个 item 是 "UserLevel", 值是 120, 那经过
上面的包装就变成..
<UserLevel>120</UserLevel>
包成 xml 後丢给 server 就可以更新该笔资料。
再来是一些 html 语法
让页面固定以繁体中文显示
<Meta Http-Equiv="Content-Type" Content="text/html; Charset=Big5">
设定本文的背景颜色
<body bgcolor=#FFFFCC>
在网页显示一个文字输入区
<textarea name=textarea cols=100 rows=20></textarea>
它必须被包在 form 里面, 则读取这个文字输入区的值的方法
就是 request.form("textarea")
(也就是说读它的方法并不是 request("textarea") )
而在 textarea 里面的换行(\n), 其符号则是 vbcrlf
附带一提, 还有 vbtab 这个就相当於按 tab 键後的符号
读取 client 端的 ip 位址
<% ip = Request.ServerVariables("REMOTE_ADDR") %>
相关字串函数
len(str) 读取字串长度
mid(str,a,b) 从字串的第a个字元开始, 读取长度b的字串
例如 mid("123456",3,3) = "345"
InStr(str,substr) 它会回传 substr 在 str 的第几个位置
例如 InStr("123456","345") = 3
replace(str,substr1,substr2) 把 str 里面的 substr1 换成 substr2
CInt(str) 把某个变数强制变成整数
CStr(str) 把某个变数强制变成字串
CLng(str) 把某个变数强制变成长整数(>32767用的)
其中差点被 CLng 搞死,因为 VB 的整数范围是 -32767~32767
,可是我要处理的资料范围有时会超过(因为是用编号制),在
for 时就会出问题,因此要先经过长整数的处理.
再来讲一个 response.cookies 的替代方法,它很好用,但
是它不能用来纪录一些键值为特殊符号的东西, 例如...
keyname = "123&"
它在做 response.cookies(keyname) 时会出问题。
我後来就采用以前在圣殿用过的方法,改用阵列储存,方式
如下..
原本:
for each item in request.form
response.cookies(item) = request.form(item)
next
改成
dim data1(10000)
dim data2(10000)
i = 1
for each item in request.form
data1(i) = item
data2(i) = request.form(item)
i = i + 1
next
排序的时候就这样做,比方我们希望依照 item 的字串顺序排
for i1 = 0 to i-1
for i2 = 1 to i
if strcomp(data1(i1),data1(i2)) > 0 then
' 调换两个 data1 的位置
tmp = data1(i1)
data1(i1) = data1(i2)
data1(i2) = tmp
' 同时别忘了也要调换两个 data2 的位置
tmp = data2(i1)
data2(i1) = data2(i2)
data2(i2) = tmp
end if
next
next
strcomp 即 strcmp(c, java, ..),而上面使用的就是简单的
排序方法。
ASP 里面函数的简易使用方法
<%
function test_func(a)
test_func = "<th align=left>" & a & "</th>"
end function
%>
它的意思就是,比方说我们令 tmp = test_func("abc")
那麽它的结果就是 <th align=left>abc</th>
也就是直接把函数名当成变数来用,则到 end function 之前
看 test_func 的值变成什麽, 它就会是函数的回传值.
函数可以有效缩减程式行数并减少错误。
在公司写程式可以写的这麽顺利,很大的原因归功於在圣殿跟
字串、阵列、mapping 资料等「搏斗」的经验,尤其是字串处
理,大抵上难搞的字串处理在圣殿几乎都经历过了,例如说
/u/l/laechan/workroom.c
1.解出 workroom.c (档案名)
2.解出 /u/l/laechan/ (目录名)
3.去掉 .c (物件用)
像这种的我若在圣殿就会用 while 居多(土法炼钢的话),在
asp 我更直接─用 for 硬干。
第二个原因仍旧是在圣殿的 coding 经验。因为 asp 我是仓促
之下学的,而且急着要用,所以我等同於一边找资料,一边写
程式,在工具有限的情况下,我至少知道要怎麽组合一些现有
的工具来达到我想要的结果。
例如说,假设圣殿没有 strcmp 函数,那麽要怎麽做字串比较
?尤其是要比较的字串其长度又都不一定的情况呢?
1.先计算最长字串长度
2.针对长度不足的字串做补 "0", 例如 "laechan" -> "laechan0000"
3.再把字串套进特定的算式做处理
不过这个只能应急用,比方只比一下前几个字母这样。
(最好的方法还是自己写一个 strcmp, 只要参考 c or java 的
函式库写法即可)
就像我在圣殿常说的,很多系统其实都是简单工具的组合之下
的产物,它们其实并不难,重点是要懂得如何运用手边的工具
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 223.140.164.51