2011年9月28日 星期三

VBScript仿JQuery

前言

  其實這東西根本就是仿JQuery寫的,為什麼要寫呢??因為真的中毒太深,JQuery真的太方便了,
但問題來了,我手上工作有些是前輩寫的,有時客戶要求修改,修改沒問題,但遇到VBScript
,就.....有問題,變的感覺卡卡,小小東西修個老半天,所以就決定讓這東西誕生。

Tips

set obj = jVB("form")
set obj = jVB("#btn1")
set obj = jVB(".btn1")
set obj = jVB("input[name=tt]")
set obj = jVB(name=tt)
set obj = jVB(document.getElementById("btn1"))
set obj = jVB(".btn1,#btn2,.btn3,form")可以次讀取多個
有這幾種收集方式,而且開頭不能用代號向$符號,這是我感到遺憾的。

程式碼

            '製作日期:1000913
'版本:1.8
'修改日期:1000914
'修改內容:增加搜尋條件
'修改日期:1000915
'修改內容:新增length取出搜尋筆數
'修改日期:1000916
'修改內容:修改搜尋時錯誤
'修改日期:1000917
'修改內容:新增搜尋方式input[name=tt],name=tt,新增index屬性
'修改日期:1000919
'修改內容:增加搜尋精準度,debug jFind方法
'修改日期:1000920
'修改內容:加強toNext toPrev
'修改日期:1000921
'修改內容:新增focus
'修改日期:1000922
'修改內容:新增submit
'使用說明
'搜尋節點方式:tagName,id,class,物件 四種範例如下
'set obj = jVB("form")
'set obj = jVB("#btn1")
'set obj = jVB(".btn1")
'set obj = jVB("input[name=tt]")
'set obj = jVB(name=tt)
'set obj = jVB(document.getElementById("btn1"))
'set obj = jVB(".btn1,#btn2,.btn3,form")可以次讀取多個
'屬性
'obj.text 讀str = obj.text/寫obj.text = str
'obj.html 讀str = obj.html/寫obj.html = str
'obj.value 讀str = obj.value/寫obj.value = str
'obj.index 讀取節點本身位置以0為開頭
'方法
'obj.getXML(argNum) 回傳指定Xml節點物件
'obj.attr(argStr) 屬性設定 讀obj.argStr("id")/寫obj.argStr("title:xxyy,className:aabb")
'obj.removeAttr(argStr) 刪除屬性 寫obj.removeAttr("id")
'obj.css(argStr) style設定 讀obj.argStr("color")/寫obj.argStr("font-size:17pt,color:red;")
'obj.removeCss(argStr) 刪除屬性
'obj.addClass(argStr) class設定 寫obj.addClass("xxyy")
'obj.removeClass(argStr)移除class設定 寫obj.removeClass("xxyy")
'obj.parent() 回到父節點
'obj.parents("id|class|tagName")回到指定父節點
'obj.toNext() '到下一個節點
'obj.toPrev() '道上一個節點
'obj.remove() '清除自己本身
'obj.allEmpty() '清除自己的內容
'obj.children(tagName|id|class|number)'回傳指定子節點
'obj.hide() '物件隱藏
'obj.show() '物件顯示
'obj.disabled(boolean) '物件癱瘓
'jVBPost(sUrl,sData,bSync)sUrl:傳送網址,sData:傳送的資料 "data1:123,data2:456" bSync:true=非同步|false=同步
'obj.jFind("id|class|tagName")在搜尋節點內容
Class controlDOM
private aCore(0)
property get index()
objCore = aCore(0)
set objTarget = objCore(0)
set objList = objTarget.parentNode.firstChild
i = 0
while not objList is objTarget
i = i + 1
set objList = objList.nextSibling
wend
index = i
end property
Property let core(aObj)
aCore(0)= aObj
End Property
property Get text() '取得節點內純文字 as string'
if isArray(aCore(0)) then
objCore = aCore(0)
text = objCore(0).innerText
end if
End property
property let text(argStr) '設定節點內容存文字'
if isArray(aCore(0)) then
for each objTemp in aCore(0)
objTemp.innerText = argStr
next
end if
end property
property Get html() '取得節點內容文字 as string'
if isArray(aCore(0)) then
objCore = aCore(0)
html = objCore(0).innerHTML
end if
End property
property let html(argStr)
if isArray(aCore(0)) then
for each objTemp in aCore(0)
objTemp.innerHTML = argStr'設定節點內容文字'
next
end if
End property
property let value(argStr) '設定val'
On Error Resume Next
if isArray(aCore(0)) then
for each objTemp in aCore(0)
objTemp.value = argStr'設定節點內容文字'
next
end if
end property
property get value() '取得val'
on Error Resume Next
objCore = aCore(0)
value = objCore(0).value
if err.number > 0 then value = ""
end property
' '--------------屬性End------------------------------------'
sub submit()
objCore = aCore(0)
set objTarget = objCore(0)
if LCase(objTarget.tagName) = "form" then
objTarget.submit
end if
end sub
Function focus()
objCore = aCore(0)
set objTarget = objCore(0)
objTarget.focus()
set focus = me
end function
Function length()
length = UBound(aCore(0))
end Function
Function getXML(iArg)
objCore = aCore(0)
if IsNumeric(iArg) then
set getXML = objCore(iArg)
end if
end function
Function attr(arg) '回傳屬性值 as String'
On Error Resume Next
if inStr(arg,":") > 0 then
a = getkeyval(arg)
for each aStr in a
objCore = aCore(0)
for each objTemp in objCore
objTemp.setAttribute aStr(0),aStr(1)
next
next
set attr = me
else
objCore = aCore(0)
if isObject(objCore(0).getAttribute(arg)) then
set attr = objCore(0).getAttribute(arg)
else
attr = objCore(0).getAttribute(arg)
end if

end if
End Function
Function removeAttr(arg)
aKey = split(arg,",")
objCore = aCore(0)
for each str in aKey
for each objTemp in objCore
objTemp.removeAttribute(str)
next
next
set removeAttr = me
end Function
Function css(arg)
on Error Resume Next
if inStr(arg,":") > 0 then
aCondition = getkeyval(arg)
for each aStr in aCondition
objCore = aCore(0)
for each objTemp in objCore
objTemp.getAttribute("style").setAttribute aStr(0),aStr(1)
next
next
set css = me
else
objCore = aCore(0)
css = objCore(0).getAttribute("style").getAttribute(arg)
end if
end Function
function removeCss(arg)
aKey = split(arg,",")
objCore = aCore(0)
for each str in aKey
for each objTemp in objCore
objTemp.getAttribute("style").removeAttribute str
next
next
set removeCss = me
end function
Function addClass(arg)
objCore = aCore(0)
for each objTemp in objCore
sClass = objTemp.getAttribute("className")
sClass = sClass & space(1) & arg
objTemp.setAttribute "className",sClass
next
set addClass = me
end Function
Function removeClass(argStr)
objCore = aCore(0)
for each objTemp in objCore
sClass = objTemp.getAttribute("className")
aClass = split(sClass," ")
sClass = ""
for each str in aClass
if str <> argStr then
sClass = sClass & str & space(1)
end if
next
objTemp.setAttribute "className",sClass
next
set removeClass = me
end Function
Function parent()'傳回上一層節點 as object'
if isArray(aCore(0)) then
objCore = aCore(0)
set objTarget = objCore(0).parentNode
set parent = reFinishObj(objTarget)
end if
end Function
Function parents(arg) '傳回指定父節點 as object'
objCore = aCore(0)
set objTarget = objCore(0)
aKeyVal = checkType(arg)
'do while not UCase(objTarget.getAttribute(aKeyVal(0))) = UCase(aKeyVal(1))
do while not checkCondition(objTarget,aKeyVal)
set objTarget = objTarget.parentNode
if UCase(objTarget.tagName) = objTarget.scopeName then exit do
loop
set parents = reFinishObj(objTarget)
end Function
Function children(arg) '傳回子節點 as object'
objCore = aCore(0)
set objTarget = objCore(0)
ReDim aTarget(objTarget.children.length)
if IsNumeric(arg) then
i = 0
for each objTemp in objTarget.childNodes
if objTemp.nodeName <> "#text" then
set aTarget(i) = objTemp
i = i + 1
end if
next
set objxx = aTarget(arg)
set children = reFinishObj(aTarget(arg))
elseif not IsNumeric(arg) and not isArray(arg) then
aChildren = vbsearch(objTarget,arg)
set children = reFinishObj(aChildren)
end if
end Function
Function toNext()'到下一個節點'
On Error Resume Next
for each objTarget in aCore(0)
do
set objTarget = objTarget.nextSibling
loop while objTarget.nodeName = "#text"
aTemp = ArrayAdd(aTemp,objTarget)
next
set toNext = reFinishObj(aTemp)
if err.number >0 then toNext = nothing
end Function
Function toPrev()'到上一個節點'
On Error Resume Next
for each objTarget in aCore(0)
do
set objTarget = objTarget.previousSibling
loop while objTarget.nodeName = "#text"
aTemp = ArrayAdd(aTemp,objTarget)
next
set toPrev = reFinishObj(aTemp)
if err.number >0 then toPrev = nothing
end Function
Function append(arg)'從物件內容後方插入'
sTarget=""
if isObject(arg) then
sTarget=arg.outerHTML
elseif not isArray(arg) then
sTarget = arg
end if
sTarget = me.html & sTarget
me.html = sTarget
set append = me
End Function
Function prepend(arg)'從物件內容'
sTarget=""
if isObject(arg) then
sTarget=arg.outerHTML
elseif not isArray(arg) then
sTarget = arg
end if
sTarget = sTarget & me.html
me.html = sTarget
set prepend = me
end Function
Function remove()
objCore = aCore(0)
for each objTemp in objCore
objTemp.parentNode.removeChild(objTemp)
next
set remove = me
end Function
Function allEmpty()
me.html = ""
set emptyAll = me
end Function
private Function reFinishObj(objXml)
set tempDOM = new controlDOM
if isArray(objXml) then
tempDOM.core = objXml
else
tempDOM.core = array(objXml)
end if
set reFinishObj = tempDOM
end Function
Private Function IIf(condition,value1,value2)
If condition Then IIf = value1 Else IIf = value2
End Function
Private Function checkType(argStr)'檢查搜尋型態
if Instr(argStr,"#") > 0 then
aTemp = array(array("id",Trim(Right(argStr,len(argStr)-1)),"="))
elseif InStr(argStr,".") > 0 then
aTemp = array(array("ClassName",Trim(Right(argStr,len(argStr)-1)),"="))
elseif InStr(argStr,"[") > 0 then
arg = Replace(Replace(argStr,"["," "),"]","")
aTemp = split(arg," ")
aTemp(0) = array("tagName",Trim(aTemp(0)),"=")
if Instr(aTemp(1),"=") > 0 or Instr(aTemp(1),"<>") > 0 then
sCondition = iif(Instr(aTemp(1),"=") > 0,"=","<>")
aKeyVal = iif(Instr(aTemp(1),"=") > 0,split(aTemp(1),"="),split(aTemp(1),"<>"))
aKeyVal(0) = Replace(LCase(aKeyVal(0)),"class","className")
aTemp(1) =array(Trim(aKeyVal(0)),Trim(aKeyVal(1)),sCondition)
end if
elseif InStr(argStr,"=") > 0 or InStr(argStr,"<>") > 0 then
sCondition = iif(InStr(argStr,"=") > 0,"=","<>")
aKeyVal = iif(InStr(argStr,"=") > 0,split(argStr,"="),split(argStr,"<>"))
aKeyVal(0) = Replace(LCase(aKeyVal(0)),"class","className")
aTemp = array(array(Trim(aKeyVal(0)),Trim(aKeyVal(1)),sCondition))
else
aTemp = array(array("tagName",argStr,"="))
end if
checkType = aTemp
end function
private Function getkeyval(arg)
a = split(arg,",")
for i = 0 to UBound(a)
a(i)=split(a(i),":")
next
getkeyval = a
end function
Function ArrayAdd(oldArray,val)
listNum = 0
oldNum = 0 '舊陣列數
addNum = 0 '追加陣列數
if isArray(oldArray) and isArray(val) then
oldNum = UBound(oldArray)
addNum = UBound(val)
addVal = val
elseif isArray(oldArray) and not isArray(val) then
oldNum = UBound(oldArray)
addNum = 0
addVal = array(val)
elseif not isArray(oldArray) and isArray(val) then
ArrayAdd = val
exit function
elseif not isArray(oldArray) and not isArray(val) then
ArrayAdd = array(val)
exit function
end if
ReDim newArray(oldNum+addNum+1)
'將舊資料寫入新陣列
for each objData in oldArray
if isObject(objData) then
set newArray(listNum) = objData
else
newArray(listNum) = objData
end if
listNum = listNum + 1
next
'將新資料寫入
for each objData in addVal
if isObject(objData) then
set newArray(listNum) = objData
else
newArray(listNum) = objData
end if
listNum = listNum +1
next
ArrayAdd = newArray
End Function
Function vbsearch(objXML,target)'objXML被收尋物件:target搜尋目標
if isObject(target) then
vbsearch = array(target)
exit function
end if
aKeyVal = checkType(target)
isId = iif(UBound(Filter(aKeyVal(0),"id"))=-1,array(""),Filter(aKeyVal(0),"id"))
if isId(0) = "id" then
aVal = aKeyVal(0)
aTemp = array(document.getElementById(aVal(1)))
elseif objXML.hasChildNodes() then '檢查搜尋物件是否有子物件
for each obj in objXML.children '讀取每個子物件
sTempClass = obj.getAttribute(isId(0))'用來確認子物件特定屬性名稱
sTempTagName = obj.tagName
if obj.hasChildNodes() then'查詢有無子物件
aChildXML = vbsearch(obj,target)'回傳符合條件子物件陣列
end if
if checkCondition(obj,aKeyVal) then '查詢物件是否符合條件
aTemp = ArrayAdd(aTemp,ArrayAdd(aChildXML,obj))'
aChildXML = empty
else'不符合條件
if isArray(aChildXML) then'子物件陣列是陣列
aTemp = ArrayAdd(aTemp,aChildXML)
aChildXML = empty
end if
end if
next
end if
vbsearch = aTemp
End Function
Function checkCondition(objXML,KVC)'檢查條件是否吻合
bResult = true
set re = new RegExp
for each aKVC in KVC
sCD = Trim("" & objXML.getAttribute(aKVC(0))) '取出值
'sCD = iif(aKVC(0)="tagName",LCase(sCD),sCD)
re.IgnoreCase = iif(aKVC(0)="tagName",true,false)
re.Pattern=aKVC(1)'
bAns = eval(true & aKVC(2) & re.test(sCD))
bResult = bResult And bAns
next
checkCondition = bResult
end function
Function show()
me.removeCss("display")
set show = me
end function
function hide()
me.css("display:none")
set hide = me
end function
function disabled(bArg)
if bArg then
me.attr("disabled:disabled")
else
me.removeAttr("disabled")
end if
set disabled = me
end function
function jFind(arg)
aVal = split(arg,",")
for each str in aVal
for each objXML in aCore(0)
if isObject(objXML) then
aTemp = vbsearch(objXML,str)'尋找到特定物件後
end if
if isArray(aTemp) then aFind = ArrayAdd(aFind,aTemp)'只要有搜尋到都放入aFind
next
next
set jFind = reFinishObj(aFind)
end function
End Class
Function jVB(target)
set objDOM = new controlDOM '繳活controlDOM'
if not isObject(target) then aTarget = split(target,",") else aTarget = array(target)
for each sTarget in aTarget
aTemp = objDOM.ArrayAdd(aTemp,objDOM.vbsearch(document.body,sTarget))
next
objDOM.core = aTemp
set jVB = objDOM
end Function
function jVBPost(sUrl,dataStr,bSync) '網址,傳送資料串
dataStr = Replace(dataStr,",","&")
dataStr = Replace(dataStr,":","=")
set xmlHttp =CreateObject("Microsoft.XMLHTTP")
xmlHttp.open "POST",sUrl,bSync 'false同步true非同步
xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlHttp.send dataStr
jVBPost = xmlHttp.responseText
end function

檔案下載


載點:jVB.rar


結語



  雖然只寫了幾樣,但在使用上幫助我減少很多困擾,畫面也乾淨了,如果各位高手有使用

並且發現有錯誤,或有更好的提議,請不要吝嗇指教謝謝。



Louis的標籤:

2011年2月13日 星期日

SQL 語法組成要素

SQL 語法組成要素

  1. DDL 資料定義語言
  2. DML 資料維護語言
  3. DCL 資料控制語言
  4. TCL 事務控制語言
  5. DQL 數據查詢語言
  6. FCL 流量控制語言

DDL 資料定義語言

簡稱 全名
DDL Data Definition Language

種類 所有類型
DDL種類 CREATE,ALTER,DROP

DML 資料維護語言

簡稱 全名
DML Data Manipulation Language

種類 所有類型
DML種類 INSERT,UPDATE,DELEC

DCL 資料控制語言

簡稱 全名
DCL Data Contol Language

種類 所有類型
DCL種類 GRANT,REVOKE,DENY

TCL 事務控制語言

簡稱 全名
TCL Transactional Control Language

種類 所有類型
TCL種類 COMMIT,SAVEPOINT,ROLLBACK

DQL 數據查詢語言

簡稱 全名
DQL Data Query Language

種類 所有類型
DQL種類 SELECT

FCL 流量控制語言

簡稱 全名
FCL Flow Control Language

種類 所有類型
FCL種類 IF...ELSE,WHILE,BREAK

2011年2月9日 星期三

儲存特殊字元方法

特殊字元儲存方式

再存儲時有時會遇到特殊中文字,存入資料庫時,字元都變成??等情形解決方法如下。
程式碼部分
Create Table t2
(sid int,sname nvarchar(10))
Go
insert into t2 values(1,'楊堃菓')
insert into t2 values(2,N'楊堃菓')
顯示結果
編號 姓名
1 楊??
2 楊堃菓

SQL資料類型

  1. 數值類型
  2. 日期時間
  3. 字串類型

數值類型

數字類型 資料類型 位元組數
精確數值 tinyint(0~255) 1
smallint(-2^15~2^15-1) 2
int(-2^31~2^31-1) 4
bigint(-2^63~2^63-1) 8
近似數值 float[(n)]
-1.79E+308~-2.23E-308
0及2.23E-308~1.79E+308
n:科學記號標記法尾數的位元數目
n:1-24 佔4
n:25-53 佔8
real
-3.40E+38 ~ -1.18E-38
0及1.18E-38 ~ 3.40E+38
4
金融貨幣 money
-922,337,203,685,477.5808 ~
922,337,203,685,477.5807
8
smallmoney
-214,748.3648 ~
214,748.3647
4
其他數值 bit(1'0'NULL) 1

日期時間

日期時間資料類型 範圍與精準度 位元組數
datetime 1753:01:01 ~ 9999:12:31
精準度:0.00333秒
8
datetime2 0001-01-01 00:00:00.0000000 ~
9999-12-31 23:59:59.9999999
精準度:100奈秒
6到8
datetimeoffset 0001-01-01 00:00:00.0000000 ~
9999-12-31 23:59:59.9999999
(以UTC為單位)精準度:100奈秒
8到10
smalldatetime 1900:01:01 ~ 2079:06:06
精準度:1分鐘
4
date 1900:01:01 ~ 9999:12:31
精準度:1日
3
time 00:00:00.0000000 ~ 23:59:59.9999999
精準度:100奈秒
3到5

字串類型

字元字串類型 資料類型 位元組數
非UNICODE字元 char[(n)],固定長度1-8000 0-8000
varchar[(n)],可變長度1-8000 0-8000
varchar(max),可變儲存體 0-2GB
text,可變長度資料 0-2GB
UNICODE字元 nchar[(n)],固定長度1-4000 0-8000
nvarchar[(n)],可變長度1-4000 0-8000
nvarchar(max),可變儲存體 0-2GB
ntext,可變長度資料 0-2GB
使用UNICODE格式,每個字元都以16bit計算,包括英文,如果使用非UNICODE,如varchar(30),原本可存放30字元,但由於中文字必須耗掉2個byte空間,所以中文字只能存放15個字,這類情形。

2011年2月7日 星期一

Select 查詢方法總整理

  1. 基礎設定
  2. DATEPART 回傳時間指定部分如:時或分或年
  3. DATEDIFF 回傳開始與結束之間的差
  4. Between .. And .. 用來篩選資料範圍
  5. In 指定範圍
  6. 當遇到NULL時處理方式
  7. TSQL字元符號的使用
  8. Except 用來比較表格與表格之間,只回傳2個表格不相同部分
  9. Interset 用來比較表格與表格之間,只回傳2個表格相同部分
  10. Tablesample 用於亂數取出資料量,如果要用於採樣工作可以試試看
學習SQL語法,最基本不畏忽視SELECT,為了日後方便,整理一下
SELECT select_list
[INTO new_table_name]
FORM table_list | view_list
[WHERE search_conditions]
[GROUP BY group_by_list]
[HAVING search_conditions]
[ORDER BY order_list [ASC | DESC]]
[]:有或無都可以

Where DATEPART(datepart , date)
條件 說明
datepart

普遍使用條件

datepart 縮寫
year yyyy,yy
month mm,m
day dd,d
hour hh
minute mi,n
second ss,s
date 篩選條件必須是時間格式
範例
Select ID,date From TEST

Where DATEPART(MM,date) = 11 --找出11月份者
更詳細解說

Where DATEDIFF(datepart , startdate , enddate)
條件 說明
datepart

普遍使用條件

datepart 縮寫
year yyyy,yy
month mm,m
day dd,d
hour hh
minute mi,n
second ss,s
startdate 篩選條件必須是時間格式
enddate 篩選條件必須是時間格式
範例 Select ID,startdate,enddate From TEST
Where DATEDIFF(yyyy,startdate,enddate) < 20 ---找出年與年差未滿20年者
更詳細解說

Where id Between 1 And 5
說明 指定資料區間,常常會使用到,如年齡範圍,日期範圍,生日等等...
範例 Select ID From Test
Where ID Between 1 And 5

Where name In('Tom','Jack','Louis')
說明 搜尋清單中符合條件
範例 Select name From Test
Where name In('Tom','Jack','Louis')

當值為NULL時處理方式

尋找值為NULL
方法 說明
IS 或 IS NOT NULL 可以搜尋出NULL 或者 不是NULL的資料
name = NULL 竟可能不要使用這方法,但如果要使用必須要這樣做SET ANSI_NULLS OFFSelect name From
Where name=NULL (這樣就可以正常使用)
ISNULL() 這函式,可以幫忙解決如果是NULL則,以什麼方法顯示,如Where ISNULL(NAME,'N/A') 這樣如果NAME為NULL則以N/A字串顯示

T-SQL 字串處理方式

符號 說明
% 該符號代表1個字元以上的任意字元
_ 該符號代表任意單一字元
[-] 包含指定範圍字元 範例:'[S-V]'ing ,會搜尋出 Sing,Ting,Uing,Ving
[^] 包含不再指定範圍內 範例:'M[^c]',會搜尋第一字元為M,第二字元不為c的字串

Except 與 Interset使用方式

範例 Select name,title From Test
Except | Interset
Select name,title From Test2
多數用來比較資料表與資料表之間的不同

Tablesample 使用方式

基本語法 Select ... From ...
Tablesample (N ROWS | N PERCENT)
Repeatable(SEED)
這可以取得亂數,但卻有缺點,取得資料會是固定區塊 參考資料SQL2008 3-26頁
改良語法 Select Top 10 name,title,CHECKSUM(NEWID())
From Test
Order By CHECKSUM(NEWID())
這方法是靠NEWID()產生一組ID,在靠CHECKSUM()函式作計算,即可產生唯一數值,再靠Order By以及TOP ,就可產生完美亂數清單