日历
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 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 | ||||
搜索标题
最新来客
我的好友
统计信息
- 访问量: 1580
- 日志数: 34
- 建立时间: 2008-03-07
- 更新时间: 2008-09-22
我的最新日志
-
转:CVS和VSS比较
2008-9-22
转自:http://www.51testing.com/?145812/action_viewspace_itemid_71896.html
*VSS*和*CVS*介绍
*VSS*的全名是(VisualSourceSafe),是微软公司开发的VisualStudio开发套件中
的版本控制部分,你可以通过从微软购买全套的VisualStudio套件,单独购买
SourceSafe来获得。因此SourceSafe拥有非常好的技术支持和非常详尽的技术文档。
*CVS*的全名是(ConcurrentVersionsSystem,并发版本系统),它是一个开源项
目,通过http://www。*cvs*home。org/网站,你直接可以获取到最新的程序或者
最新的源代码,因此*CVS*的使用是完全免费的。由于*CVS*仅可以在Unix平台下使
用,在windows下出现了*CVS*NT(http://www。*cvs*nt。org/)服务器和Win*Cvs*
(http://www。gui*cvs*。org/)客户端等开源产品
功能
文件修改方式
*VSS*主要采用独占模式(check_out,modify,check_in),也可以使用
(mutil_check_out,modify,check_in,merge)模式。在SourceSafe使用中独占模
式使用的比较为成熟和普遍,独占模式要求每个人都必须在改动文件之前做捡出
(check_out)标志,并且标志了后的文件无法被其他人修改,即文件被独占了,
在完成了修改后要及时捡入(check_in),释放修改权。check_in和check_out也
是人们对版本控制最开始的印象。
*CVS*采用了(update,modify,commit)工作方式。这是一种可以并发的版本控制
方式,即每个人都可以修改自己可访问的任意代码,代码不会被一个人单独占用,
两个人甚至多个人可以修改同一份代码,并且每个人的修改结果都不会被丢失。具
体的操作过程为:在修改代码之前先做update,以使本地的代码最新,然后就可以
修改代码了,修改完毕后,直接commit自己的修改结果。如果*CVS*没有发现冲
突,则代码可以直接进入*CVS*资源库,否则,*CVS*则标出冲突的文件的冲突部分
让你做合并。
文件历史
在这一点上*VSS*和*CVS*的功能都很近似,他们都可以保存了每个文件的变化历
史,并提供了一个自动的版本号,随时可以取出任何文件的历史版本。并和当前版
本做比较。都提供了自定义版本的label功能。检索历史和自定版本都非常的方
便。*VSS*还特别提供了对时间段,或者操作人的历史操作查询,使一个人一段时
间内对文件的操作一目了然。
项目版本管理
*VSS*并有直接对项目版本管理的支持,通过label来自定义一个版本号,可以解决
部分项目版本管理的问题,但这是远远不够的,当一个产品根据用户需求产生一系
列不同的项目版本时使用SourceSafe将非常难以管理。
*CVS*提供了比较完善的项目版本管理。*CVS*中可以把当前的工作定义成一个版
本,一旦生成版本了则版本中的数据被单独取出,处于版本中的文件将保持只读,
想获得一个项目的历史版本将轻而易举。同时,对于一个项目版本内部可以调整使
用不同的文件版本。
分支功能。
*CVS*和*VSS*都提供了建立分支和合并分支的功能,但在操作中*VSS*首先要做项目
共享,引入要分支的项目或文件然后做分支操作.*CVS*则是直接对文件或者项目做
分支,分支操作同时建立。
开发集成
*VSS*可以和VisualStudio中的其他开发工具比如VB,VC++等做到直接集成,毕竟
都是微软的产品么,同时由于*VSS*不光提供了图形界面也提供了命令行模式,所
以在Windows操作系统中的大部分其他开发工具都提供了对*VSS*操作的集成,只要
你安装了*VSS*的客户端。因此*VSS*在Windows平台下使用将会非常方便。
*CVS*本身是Unix系统上开发的,提供Unix上了命令行使用模式,因此和Unix上的
vi、Emacs可以直接和*CVS*一起工作,至于Unix系统下的图形环境的开发工具比如
eclipse,KDevelop和*cvs*集成都非常容易。本来在Windows平台上*CVS*的支持并
不好,但近一段时间,随着Win*CVS*易用性越来越好,Windows下的部分开发工具
已经提供了对Win*CVS*的支持,不过需要自己配置,而Windows下的Eclipse则直接
集成了*CVS*,开发中可进行*CVS*操作。从而使Windows下*CVS*使用也越来越方便了。
操作界面和配置管理
*VSS*在Windows下提供了单独的客户端和服务器端操作界面,界面和windows操作
系统风格一致,入门和使用都非常方便。即使被集成到别的开发工具中,它的使用
界面也基本一样。通过工具SourceSafeAdmin,用户管理,权限管理,系统配置非
常直观,基本不需要任何培训,直接看随程序自带的文档就可以准确使用。配置工
具中包括了*VSS*数据的备份和恢复,系统自带文档相当详尽。
*CVS*的界面以命令行为主,在Unix平台下没有图形界面,部分图形的开发工具可
能内嵌*CVS*客户端,在Windows平台下你可以选择用*CVS*NT搭建服务器,用
Win*CVS*作为客户端。*CVS*服务端配置在任何平台下都需要通过命令来完成,配
置过程比较复杂。有时甚至要直接编写配置文件,同时,客户端方面的培植也有些
技巧。没有经过培训或者一段时间的研究和测试,无法正常使用*CVS*完成正常工
作和用户、权限的培植管理等工作。
安全和网络
*VSS*仅可在局域网内部使用,服务器仅作为一个文件服务器,不需要运行任何程
序或者起后台服务,但必须要共享一个可写的文件夹。这成为了目前局域网上最容
易被病毒入侵的地方,必须定期做好病毒检查工作,安装病毒放火墙。安全性比较差。
*CVS*在局域网或者广域网内都可使用,作为服务器不需要共享任何资料,但必须
起服务,占用系统资源。客户端可以是任何不同平台,都是通过TCP/IP和特定的端
口来访问*CVS*服务器,有不同安全等级的访问协议可供选择。安全性强适用面广。
结论
SourceSafe适合在局域网范围内的,以Windows平台为主的中、小项目,以文件管
理为主要功能,使用方便,学习成本低,对服务器仅需要快速大容量的存储器也是
它的优势。
*CVS*可满足局域和广域不同的网络条件,提供不同级别安全性选择,在一台专门
服务器的配合下,客户可以使用任何平台开发项目。对于已经完成了开发过程进入
项目维护阶段,或者进入项目升级阶段的项目,可提供完善的项目版本管理支持。
不过在操作和使用上学习成本比较高。 -
转:如何学习自动化测试
2008-9-08
转自:http://www.51testing.com/?action/viewspace/itemid/92200.html
从事了几年测试工作,也着实见证了测试的发展,如今测试行业对从业者的要求是越来越高,不再仅仅局限于要求会写测试用例、会细致的执行测试、能有效的发现系统缺陷等;越来越多的企业对应聘者本身的技能要求也越来越高,招聘信息中诸如“精通VBscrīpt、Perl/Rbuy等至少一门脚本语言”、“至少熟悉一门开发语言”、“精通QTP、LR等自动化测试工具”、“有大型项目自动化实施成功经验”此类的字眼也逐渐增多。目前看来,除白盒测试内容和测试管理外,主流的方向有两个:功能自动化测试和性能测试。这就要求从业人员能够在短时间内快速的掌握这些知识,才能获取到更好的工作机会。本人是名功能自动化测试的工程师,以自己学习、工作的过程结合QTP讲讲该如何学习自动化测试
首先,想从事自动化测试,必须先了解What/Why/How,也就是常说的去了解什么是自动化测试、为什么要进行自动化测试、该如何进行自动化测试,这类的资料在网上有很多,这里就不做重复了
其次,需要根据项目的特点,选择合适的自动化测试工具,并了解工具的特性。以QTP为例,该如何去掌握它呢?对于初学者,大多数都是通过录制的方式来生成脚本,这个阶段应该掌握的基础知识有
1) QTP是如何去识别对象的,对于新手经常会出现录制的脚本回放的时候报错的现象,这个时候就应该考虑为什么呢?如果很了解QTP识别对象的原理啊,我想就能很快定位到原因了
2) 去掌握一些QTP对象的方法,如GetROPreperty、GetTOPreperty、ChildObjects等等,对于相似的方法应该去搞清楚到底区别在哪?像GetROPreperty、GetTOPreperty有什么区别等
3) 什么是Action参数、什么又是Test参数?两者有什么区别,又有什么联系,在同一Test和不同Test间这些参数如何工作
4) 什么是环境变量?环境变量是如何建立和使用的,环境变量在参数传递中和action参数、test参数有什么不同
5) 了解检查点的知识,明白什么是内置检查点,什么又是自定义检查点。并搞清楚在什么时候该如何使用检查点
6) 掌握对象库的操作,了解对象库对于测试的意义,象是否启用智能识别对测试脚本有何影响、为什么同一对象识别起来会有_1、_2之类的后缀等都是需要去研究清楚的问题
这几个问题都搞清楚的话,那基本就能够利用QTP生成正确的脚本了,当然以上只是部分必须掌握的内容,其实还是很多细节的设置,就需要在实际运用中去掌握了
接下来,就可以进一步提升自己的QTP运用水平了,这个阶段就需要去学习vbs知识和如何运用描述性编程实现脚本了,同时在这个过程中还需要去学习html知识、DOM、XML、以及像excel、word等的API知识了,总的来说,这个阶段应该掌握的内容大体上包括
1) VBscrīpt的基础知识,熟悉常用的方法和函数,掌握文件对象的操作等
2) 熟练掌握XML技术;excel、word等API对象,可以根据需要创建日志等
3) 熟练掌握DOM和HTML知识,能够结合这些技术对Web页面进行解析
4) 掌握数据库的基本操作语句,能够利用ADO对象进行数据操纵
5) 熟练掌握正则表达式,很多时候处理对象问题相当方便
6) 掌握如何调用dll进行工作
7) 能够利用QTP的自动化对象模型创建出需要的运行模式
8) 掌握WMI知识
以上只是我考虑到的部分,并不全面,呵呵,供大家参考,当然这些技术主要是针对Web系统运行,因为我们的系统就是B/S的,呵呵。如果这些知识都能够扎实的掌握的话,个人认为,基本上能够处理自动化过程中的绝大多数问题了,这个时候你对自动化测试的技术应该是有一定积累了
接下来就需要考虑自动化测试框架问题了。当脚本规模到了一定的程度,就会面临一些问题,如:
1) 如何有效的管理并调度脚本
2) 如何实现脚本运行的无人值守,测试过程中能够自动进行错误处理并进行日志记录
3) 如何生成简介明确的测试报告
4) 如何能够更加高效的维护测试脚本
5) 实现框架代码和业务代码的分层、业务脚本和业务数据的分离
这个阶段主要体现的是测试人员的测试思想,是可以脱离工具独立存在的过程。当然各个公司项目的实际情况不同,导致设计出来的思想不同,但总体上来说一般包括数据驱动和关键字驱动两种模式。后者实现的技术难度大于前者,大多数公司目前都采用的数据驱动模式。这个阶段不应局限于技术运用上,而需要从测试全局考虑,进行分层设计、模块化实现,减少代码之间的耦合
如果以上三个方面都能够做的很好的话,那么恭喜你,你已经可以独立负责项目的自动化测试建立工作了,呵呵!
总之,学习自动化测试需要在实际项目中进行,这样提高的会比较快,项目中运用了很多种技术,自动化实施过程会碰见各种各样的问题,是很好的学习机会,关键要善于总结、积累经验,只要能够把各个细节做好,那么你一定能够成为一名优秀的自动化测试工程师
-
测试WebTable中记录与数据库中记录相比较
2008-9-01
'打开预检测的WebTable所在页面
Browser...'快速排序:ReArr 是待排序数组, head和tail是该数组的最小下标和最大下标
Public Function QSort(ByRef ReArr, ByVal head, ByVal tail)Dim lef, rig
Dim pivotIf head < tail Then
lef=head
rig=tail
pivot=ReArr(lef)
While (lef <> rig)'strcmop(string,string,1) 1:代表按照汉字比较; 默认0:代表按照二进制比较
While (lef < rig and strcomp(ReArr(rig),pivot,1) > 0)
rig = rig-1
Wend
If lef <rig Then
ReArr(lef) = ReArr(rig)
lef = lef+1
End IfWhile (lef < rig and strcomp(ReArr(lef),pivot,1) < 0)
lef = lef+1
Wend
If lef <rig Then
ReArr(rig) = ReArr(lef)
rig = rig-1
End If
WendReArr(lef) = pivot
call QSort(ReArr, head, lef-1)
call QSort(ReArr, lef+1, tail)
End If
End Function'两数组比较
Public function ArrCmp(arr1,arr2,Rows1,Rows2)
If Rows1 <> Rows2 Then
Msgbox "WebTable与数据库记录数不一致!"
exit function
End If
For i = 0 to Rows1
If strcomp(arr1(i),arr2(i),1) <> 0 Then
msgbox "第" & i & "行记录不一致,请查看!"
Exit for
exit function
End If
Next
msgbox "成功!"
End Function
'初始化webtable信息,为遍历WebTable所有记录做准备(WebTable格式:第1行:标题,中间:记录,最后1行:页码行)
Dim tWebTable
Dim intWTRows
Dim intWTCols
Dim intWTPages
set tWebTable=Browser("...").Page("...").Frame("main").WebTable("grd...")
intWTRows=tWebTable.GetRoProperty("rows")
intWTCols=tWebTable.GetRoProperty("cols")
intWTPages=tWebTable.ChildItemCount(intWTRows,1,"Link") + 1
Dim arrWT()
Call TraverseWT(tWebTable,intWTRows,intWTCols,intWTPages)'使用getcelldata(i,j)的方法遍历webtable把表格内容存入一个数组中,将每条记录拼成一个字符串,构成一个一维数组
Public function TraverseWT(WebTable,byref WTRows,WTCols,WTPages)Dim intAllRows
Dim intCurRows
intAllRows = 0For k=1 to WTPages
If WebTable.Exist Then
intCurRows = WebTable.GetRoProperty("rows")-2
intAllRows = intAllRows + intCurRows
WTRows = intAllRows
End If
For i=2 to intCurRows+1
Dim strData1
strData1=""
For j=2 to WTCols-2
ReDim preserve arrWT(intAllRows-1)
strData1 = strData1 & WebTable.GetCellData(i,j) & "&"
arrWT(intAllRows - intCurRows + i-2) = strData1
Next
Next
If k< WTPages Then
WebTable.ChildItem(intCurRows+2,1,"Link",k-1).click
set WebTable=Browser("配电网管理系统_2").Page("配电网管理系统").Frame("main").WebTable("grd...")
End If
Next'调用排序函数
Call QSort(arrWT,0,intWTRows-3)End Function
'使用数据库连接组件ADODB连接后台数据库,使用数据结果集对象保存select查询结果,将每条记录拼成一个字符串,构成一个一维
数组
Dim Cnn
Dim Rst
Dim strCnn
Dim strSql
strCnn="Provider=OraOLEDB.Oracle.1;Password=fm;Persist Security Info=True;User ID=fm;Data Source=pms04"
Set Cnn=CreateObject("ADODB.Connection")
Cnn.Open strCnn
Set Rst=CreateObject("ADODB.Recordset")'sql查询语句
strSql="SELECT a.f_... || '&' || a.f_.... as f_String FROM vw_... ORDER BY a.f_...,a.f_..."Rst.open strSql,Cnn,1,3
'Rst.movelast '光标到最后一行
Dim iRow
iRow = Rst.recordcount-1
msgbox (iRow)i=1
Dim arrDB()
While not Rst.eof
Dim strData2
strData2 = Rst("f_String")
Dim num
reDim preserve arrDB(iRow)
arrDB(i-1) = strData2
i=i+1
Rst.movenext '光标到下一行
Wend
Dim intDBRows
intDBRows = i-2'调用排序函数
Call QSort(arrDB,0,intDBRows)'调用两数组比较函数
Call ArrCmp(arrWT,arrDB,intWTRows-1,intDBRows) -
vbs运算符之"+"、"&"
2008-9-01
"+":
计算两个数之和。
result = expression1 + expression2
参数
result任意数值变量。
expression1
任意表达式。
expression2
任意表达式。
说明
虽然也可以使用 + 运算符连接两个字符串,但是您仍应使用 & 运算符进行字符串的连接以避免混淆,提供易理解的代码。这是因为在使用 + 运算符时,有可能无法确定是做加法还是做字符串连接。
表达式的基本子类型决定了 + 运算符所做的操作,如下表所示:
如果 则 两个表达式都是数值 相加 两个表达式都是字符串 连接 一个表达式是数值,另一个表达式是字符串 相加 如果一个表达式或两个表达式都为 Null 表达式,则 result 为 Null。如果两个表达式都为Empty,则 result 为 Integer 子类型。但是如果一个表达式为 Empty,则返回另一个表达式作为 result。
"&":
强制两个表达式进行字符串连接。
result = expression1 & expression2
参数
result任意变量。
expression1
任意表达式。
expression2
任意表达式。
说明
任一 expression 不是字符串时,它将被转换为 String 子类型。如果两个表达式都为 Null,result 也为 Null。然而,如果仅有一个 expression 为 Null,则它和其他表达式连接时,按零长度字符串("") 处理。任何表达式为 Empty 时也按零长度字符串处理。本文来自: 脚本之家(www.jb51.net)
-
byval和byref的区别
2008-8-29
1、引用参数(ref)在可以作为引用参数在函数成员调用中传递之前,必须已明确赋值,而输出参数(out)在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值,在该函数成员正常返回前都必须已明确赋值。
2、在函数内部,引用参数(ref)被视为初始已赋值,输出参数(out)被视为初始未赋值。
3、默认地,VB中的所有参数都是值传递。只有在参数的修饰符中明确包含out或ref,才是引用传递。但是需要知道的是,当参数的类型是引用类型时,你传递的是一个对象的引用而不是实际的对象。二者区别:
byval 传递数值,实参和形参分处不同的内存单元,互不干扰!
byref 传递地址,实参和形参占用相同的内存单元,形参变则实参变!
通俗理解:
byval 一去不复返
byref 进去再出来,可能被更新!
在Javascrīpt中:
Boolean,Number,String型的参数是按值传递的 ==> 相当于VBS中的ByVal;
而Object型的参数(包括JS对象,Array对象,Function对象等),是按引用传递 ==> 相当于VBS中的ByRef -
转:获得汉字字符串拼音首字母
2008-8-29
转自:http://dev.csdn.net/article/39/39914.shtm
'返回给定字符串的首字母 Function IndexCode(ByVal IndexTxt As String) As String Dim i As Integer For i = 1 To IndexTxt.Length IndexCode = IndexCode & GetOneIndex(Mid(IndexTxt, i, 1)) Next End Function '得到单个字符的首字母 Private Function GetOneIndex(ByVal OneIndexTxt As String) As String If Asc(OneIndexTxt) >= 0 And Asc(OneIndexTxt) < 256 Then GetOneIndex = OneIndexTxt Else GetOneIndex = GetX(CInt(Format((Asc(OneIndexTxt) + 65536) \ 256 - 160, "00") & Format((Asc(OneIndexTxt) + 65536) Mod 256 - 160, "00"))) End If End Function '根据区位得到首字母 Private Function GetX(ByVal GBCode As Integer) As String '判断一级汉字 If GBCode >= 1601 And GBCode < 1637 Then GetX = "A" If GBCode >= 1637 And GBCode < 1833 Then GetX = "B" If GBCode >= 1833 And GBCode < 2078 Then GetX = "C" If GBCode >= 2078 And GBCode < 2274 Then GetX = "D" If GBCode >= 2274 And GBCode < 2302 Then GetX = "E" If GBCode >= 2302 And GBCode < 2433 Then GetX = "F" If GBCode >= 2433 And GBCode < 2594 Then GetX = "G" If GBCode >= 2594 And GBCode < 2787 Then GetX = "H" If GBCode >= 2787 And GBCode < 3106 Then GetX = "J" If GBCode >= 3106 And GBCode < 3212 Then GetX = "K" If GBCode >= 3212 And GBCode < 3472 Then GetX = "L" If GBCode >= 3472 And GBCode < 3635 Then GetX = "M" If GBCode >= 3635 And GBCode < 3722 Then GetX = "N" If GBCode >= 3722 And GBCode < 3730 Then GetX = "O" If GBCode >= 3730 And GBCode < 3858 Then GetX = "P" If GBCode >= 3858 And GBCode < 4027 Then GetX = "Q" If GBCode >= 4027 And GBCode < 4086 Then GetX = "R" If GBCode >= 4086 And GBCode < 4390 Then GetX = "S" If GBCode >= 4390 And GBCode < 4558 Then GetX = "T" If GBCode >= 4558 And GBCode < 4684 Then GetX = "W" If GBCode >= 4684 And GBCode < 4925 Then GetX = "X" If GBCode >= 4925 And GBCode < 5249 Then GetX = "Y" If GBCode >= 5249 And GBCode <= 5589 Then GetX = "Z" '判断二级汉字 If GBCode >= 5601 And GBCode <= 8794 Then Dim CodeData As String CodeData = "cjwgnspgcenegypbtwxzdxykygtpjnmjqmbsgzscyjsyyfpggbzgydywjkgaljswkbjqhyjwpdzlsgmrybywwccgznkydgttngjeyekzydcjnmcylqlypyqbqrpzslwbdgkjfyxjwcltbncxjjjjcxdtqsqzycdxxhgckbphffsspybgmxjbbyglbhlssmzmpjhsojnghdzcdklgjhsgqzhxqgkezzwymcscjnyetxadzpmdssmzjjqjyzcjjfwqjbdzbjgdnzcbwhgxhqkmwfbpbqdtjjzkqhylcgxfptyjyyzpsjlfchmqshgmmxsxjpkdcmbbqbefsjwhwwgckpylqbgldlcctnmaeddksjngkcsgxlhzaybdbtsdkdylhgymylcxpycjndqjwxqxfyyfjlejbzrwccqhqcsbzkymgplbmcrqcflnymyqmsqtrbcjthztqfrxchxmcjcjlxqgjmshzkbswxemdlckfsydsglycjjssjnqbjctyhbftdcyjdgwyghqfrxwckqkxebpdjpxjqsrmebwgjlbjslyysmdxlclqkxlhtjrjjmbjhxhwywcbhtrxxglhjhfbmgykldyxzpplggpmtcbbajjzyljtyanjgbjflqgdzyqcaxbkclecjsznslyzhlxlzcghbxzhznytdsbcjkdlzayffydlabbgqszkggldndnyskjshdlxxbcghxyggdjmmzngmmccgwzszxsjbznmlzdthcqydbdllscddnlkjyhjsycjlkohqasdhnhcsgaehdaashtcplcpqybsdmpjlpcjaqlcdhjjasprchngjnlhlyyqyhwzpnccgwwmzffjqqqqxxaclbhkdjxdgmmydjxzllsygxgkjrywzwyclzmcsjzldbndcfcxyhlschycjqppqagmnyxpfrkssbjlyxyjjglnscmhcwwmnzjjlhmhchsyppttxrycsxbyhcsmxjsxnbwgpxxtaybgajcxlypdccwqocwkccsbnhcpdyznbcyytyckskybsqkkytqqxfcwchcwkelcqbsqyjqcclmthsywhmktlkjlychwheqjhtjhppqpqscfymmcmgbmhglgsllysdllljpchmjhwljcyhzjxhdxjlhxrswlwzjcbxmhzqxsdzpmgfcsglsdymjshxpjxomyqknmyblrthbcftpmgyxlchlhlzylxgsssscclsldclepbhshxyyfhbmgdfycnjqwlqhjjcywjztejjdhfblqxtqkwhdchqxagtlxljxmsljhdzkzjecxjcjnmbbjcsfywkbjzghysdcpqyrsljpclpwxsdwejbjcbcnaytmgmbapclyqbclzxcbnmsggfnzjjbzsfqyndxhpcqkzczwalsbccjxpozgwkybsgxfcfcdkhjbstlqfsgdslqwzkxtmhsbgzhjcrglyjbpmljsxlcjqqhzmjczydjwbmjklddpmjegxyhylxhlqyqhkycwcjmyhxnatjhyccxzpcqlbzwwwtwbqcmlbmynjcccxbbsnzzljpljxyztzlgcldcklyrzzgqtgjhhgjljaxfgfjzslcfdqzlclgjdjcsnclljpjqdcclcjxmyzftsxgcgsbrzxjqqcczhgyjdjqqlzxjyldlbcyamcstylbdjbyregklzdzhldszchznwczcllwjqjjjkdgjcolbbzppglghtgzcygezmycnqcycyhbhgxkamtxyxnbskyzzgjzlqjdfcjxdygjqjjpmgwgjjjpkjsbgbmmcjssclpqpdxcdyykypcjddyygywchjrtgcnyqldkljczzgzccjgdyksgpzmdlcphnjafyzdjcnmwescsglbtzcgmsdllyxqsxsbljsbbsgghfjlwpmzjnlyywdqshzxtyywhmcyhywdbxbtlmswyyfsbjcbdxxlhjhfpsxzqhfzmqcztqcxzxrdkdjhnnyzqqfnqdmmgnydxmjgdhcdycbffallztdltfkmxqzdngeqdbdczjdxbzgsqqddjcmbkxffxmkdmcsychzcmljdjynhprsjmkmpcklgdbqtfzswtfgglyplljzhgjjgypzltcsmcnbtjbhfkdhbyzgkpbbymtdlsxsbnpdkleycjnycdykzddhqgsdzsctarlltkzlgecllkjljjaqnbdggghfjtzqjsecshalqfmmgjnlyjbbtmlycxdcjpldlpcqdhsycbzsckbzmsljflhrbjsnbrgjhxpdgdjybzgdlgcsezgxlblgyxtwmabchecmwyjyzlljjshlgndjlslygkdzpzxjyyzlpcxszfgwyydlyhcljscmbjhblyjlycblydpdqysxktbytdkdxjypcnrjmfdjgklccjbctbjddbblblcdqrppxjcglzcshltoljnmdddlngkaqakgjgyhheznmshrphqqjchgmfprxcjgdychghlyrzqlcngjnzsqdkqjymszswlcfqjqxgbggxmdjwlmcrnfkkfsyyljbmqammmycctbshcptxxzzsmphfshmclmldjfyqxsdyjdjjzzhqpdszglssjbckbxyqzjsgpsxjzqznqtbdkwxjkhhgflbcsmdldgdzdblzkycqnncsybzbfglzzxswmsccmqnjqsbdqsjtxxmbldxcclzshzcxrqjgjylxzfjphymzqqydfqjjlcznzjcdgzygcdxmzysctlkphtxhtlbjxjlxscdqccbbqjfqzfsltjbtkqbsxjjljchczdbzjdczjccprnlqcgpfczlclcxzdmxmphgsgzgszzqjxlwtjpfsyaslcjbtckwcwmytcsjjljcqlwzmalbxyfbpnlschtgjwejjxxglljstgshjqlzfkcgnndszfdeqfhbsaqdgylbxmmygszldydjmjjrgbjgkgdhgkblgkbdmbylxwcxyttybkmrjjzxqjbhlmhmjjzmqasldcyxyqdlqcafywyxqhz" GetX = Mid(CodeData, (Microsoft.VisualBasic.Left(CStr(GBCode), 2) - 56) * 94 + (Microsoft.VisualBasic.Right(CStr(GBCode), 2)), 1) End IfEnd Function
-
转:汉字排序
2008-8-29
转自:http://topic.csdn.net/t/20050903/11/4247360.html
Function HZSort(ByVal txt_DOC As String) As String
Dim m, n As Integer
Dim l As Integer
Dim HanZi() As String * 1
Dim tmp_Han As String
'Dim txt_DOC As String
'txt_DOC = txtHzList.Text
l = Len(txt_DOC)
ReDim HanZi(l - 1)
'剔除非汉字
For m = 1 To l
tmp_Han = Mid(txt_DOC, m, 1)
If Asc(tmp_Han) < 0 Then
HanZi(n) = tmp_Han
n = n + 1
End If
Next m
l = n - 1
'排序汉字
ReDim Preserve HanZi(l)
For m = 0 To (l - 1)
For n = (l - 1) To m Step -1
If Asc(HanZi(n)) > Asc(HanZi(n + 1)) Then
tmp_Han = HanZi(n)
HanZi(n) = HanZi(n + 1)
HanZi(n + 1) = tmp_Han
End If
Next n
Next m
'剔除重复字
n = 0
For m = 1 To l
If Asc(HanZi(m)) > Asc(HanZi(m - 1)) Then
n = n + 1
HanZi(n) = HanZi(m)
End If
Next m
HZSort = ""
For m = 0 To n
HZSort = HZSort & HanZi(m)
Next m
End Function -
记录集对象Open
2008-8-28
1、记录集对象Open的语法为:
recordset.Open SQL语句,数据库连接对象,游标类型,锁定类型,配置源其中前两个参数为必填项,其他的选填。
游标常量 对应常数值 游标说明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标,也是速度最快的游标。adOpenKeyset 1 启动一个关键集类型的游标。
adOpenDynamic 2 启动一个动态游标。
adOpenStatic 3 启动一个静态游标。
-------------------------------------------------------------
锁定常量 对应常数值 锁定说明
--------------------------------------------------------------
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增删改操作。
-------------------------------------------------------------
毫无疑问,使用默认值效率是最高的,(recordset.Open sql,conn,0,1)如果需要统计返回记录数以及分页操作的话,就至少必需启动一个集合类型的游标(recordset.Open sql,conn,1,1)
如果需要进行增删改操作的话,可以参考锁定说明,一般是使用常数3的类型(recordset.Open sql,conn,3,3)
另:
set rs=conn.execute(sql)
相当于
rs.open sql,conn,0,1--这两个有没有区别,有待进一步研究。
2、record.recordcount
1)统计结果集行数时,格式需要:
recordset.Open SQL语句,数据库连接对象,1,3
否则record.recordcount=-1
--为什么是“1,3”,看上面的语法说明,还不怎么理解,待研究。
2)如果表中不存在主键,也有可能出现值为-1的问题。
如果这方面的高手看到,希望能对我的两个疑问给予解答,谢谢大家。 -
转:VBS的快速排序
2008-7-08
转自:http://www.51testing.com/?141956/action_viewspace_itemid_84696.html
下面是VBS的快速排序代码,适合数字和字符串数组:
Public Function QSort(ByRef ReArr, ByVal head,ByVall tail)
ReArr是待排序数组,head和tail是该数组的最小下标和最大下标
Dim lef,rig
Dim pivotIf head<tail,Then
lef=head
rig=tail
pivot=ReArr(lef)
While (lef<>rig)While (lef<rig and ReArr(rig)>=pivot)
rig=rig-1
Wend
If lef<rig Then
ReArr(lef)=ReArr(rig)
lef=lef+1
End If
While (lef<rig and ReArr(lef)<=pivot)
lef=lef+1
WendIf lef<rig Then
ReArr(rig)=ReArr(lef)
rig=rig-1
End If
WendReArr(lef)=pivot
call QSort(ReArr,head,lef-1)
call QSort(ReArr,lef+1,tail)End If
End Function -
转:VBScript字符串函数介绍
2008-7-08
转自:http://xz7.2000y.net/mb/2/ReadNews.asp?NewsID=466508
1. Split(expression, delimiter, count, compare)
返回基于 0 的一维数组,其中包含指定数目的子字符串。
expression:必选。字符串表达式,包含子字符串和分隔符。如果 expression 为零长度字符串,Split 返回空数组,即不包含元素和数据的数组。
delimiter:可选。用于标识子字符串界限的字符。如果省略,使用空格 (" ") 作为分隔符。如果 delimiter 为零长度字符串,则返回包含整个 expression 字符串的单元素数组。
count:可选。被返回的子字符串数目,-1 指示返回所有子字符串。
compare:可选。compare 参数可以有以下值:0 执行二进制比较;1 执行文本比较;2 执行基于数据库(在此数据库中执行比较)中包含的信息的比较。2. Replace(expression, find, replacewith, compare, count, start)
返回字符串,其中指定数目的某子字符串被替换为另一个子字符串。
expression:必选。字符串表达式,包含要替换的子字符串。
find:必选。被搜索的子字符串。
replacewith:必选。用于替换的子字符串。
start:可选。expression 中开始搜索子字符串的位置。如果省略,默认值为 1。
count:可选。执行子字符串替换的数目。如果省略,默认值为 -1,表示进行所有可能的替换。
compare:可选。参数值同上。3. Mid(string, start, length)
从字符串中返回指定数目的字符。
string:字符串表达式,从中返回字符。如果 string 包含 Null,则返回 Null。
start:string 中被提取的字符部分的开始位置。如果 start 超过了 string 中字符的数目,Mid 将返回零长度字符串 ("")。
length:要返回的字符数。如果省略或 length 超过文本的字符数(包括 start 处的字符),将返回字符串中从 start 到字符串结束的所有字符。4. LTrim(string), RTrim(string), Trim(string)
返回不带前导空格 (LTrim)、后续空格 (RTrim) 或前导与后续空格 (Trim) 的字符串副本。
string:参数是任意有效的字符串表达式。如果 string 参数中包含 Null,则返回 Null。5. InStr(start, string1, string2, compare)
(InstrRev(start, string1, string2, compare))
返回某字符串在另一字符串中从头部出现的位置
(返回某字符串在另一字符串中从结尾出现的位置)。
start:可选。数值表达式,用于设置每次搜索的开始位置。如果省略,将从第一个字符的位置开始搜索。如果 start 包含 Null,则会出现错误。如果已指定 compare,则必须要有 start 参数。
string1:必选。接受搜索的字符串表达式。
string2:必选。要搜索的字符串表达式。
compare:可选。参数值同上。6. String(number, character)
返回具有指定长度的、重复字符组成的字符串。
number:返回字符串的长度。如果 number 参数包含 Null,则返回 Null。
character:指定字符或字符串表达式的字符代码,其中字符串表达式的第一个字符用于组成返回的字符串。如果 character 参数包含 Null,则返回 Null。7. Space(number)
返回由指定数目的空格组成的字符串。
number:参数为字符串中用户所需的空格数。8. Left(string, length), Right(string, length)
返回指定数目的从字符串的左边(右边)算起的字符。
string:字符串表达式,其最左边(右边)的字符被返回。如果 string 参数中包含 Null,则返回 Null。
length:数值表达式,指明要返回的字符数目。如果是 0,返回零长度字符串 ("");如果大于或等于 string 参数中的字符总数,则返回整个字符串。9. Len(string | varname)
返回字符串内字符的数目,或是存储一变量所需的字节数。
string:任意有效的字符串表达式。如果 string 参数包含 Null,则返回 Null。
varname:任意有效的变量名。如果 varname 参数包含 Null,则返回 Null。10. Asc(string)
返回与字符串的第一个字母对应的 ANSI 字符代码。
string:参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。11. Chr(charcode)
返回与指定的 ANSI 字符代码相对应的字符。
charcode:参数是可以标识字符的数字。从 0 到 31 的数字表示标准的不可打印的 ASCII 代码。例如,Chr(10) 返回换行符。12. LCase(string), UCase(string)
返回字符串的小写(大写)形式,所有大写(小写)字母和非字母字符保持不变。
string:参数是任意有效的字符串表达式。如果 string 参数中包含 Null,则返回 Null。13. Join(list, delimiter)
返回一个字符串,此字符串由包含在数组中的许多子字符串联接创建。
list:必选。包含要联接的子字符串一维数组。
delimiter:可选。在返回字符串中用于分隔子字符串的字符。如果省略,将使用空字符 ("")。 如果 delimiter 是零长度字符串,则在同一列表中列出全部项,没有分界符。14. StrComp(string1, string2, compare)
返回指示字符串比较结果的值。StrComp 函数有以下返回值:-1, 0, 1, Null。
string1, string2:必选。任意有效的字符串表达式。
compare:可选。参数值同上。15. StrReverse(string)
返回字符串,此字符串与指定字符串顺序相反。
string:参数是要进行字符反向的字符串。如果 string 是零长度字符串 (""),则返回零长度字符串。如果 string1 为 Null,则会出现错误。二、VBscrīpt其他函数介绍
1. Option Explicit
用于 scrīpt 级强制要求显式声明该 scrīpt 中的所有变量。如果使用 Option Explicit,该语句必须出现在 scrīpt 的任何过程之前。使用 Option Explicit 语句时,必须使用 Dim、Private、Public 或 ReDim 语句显式声明所有变量。如果试图使用未经声明的变量名,则会出现错误。2. UBound(arrayname, dimension)(LBound(arrayname, dimension))
返回指定数组维数的最大可用下标。(返回指定数组维的最小可用下标)。
arrayname:数组变量名,遵循标准变量命名约定。
dimension:指明要返回哪一维下界的整数。使用 1 表示第一维,2 表示第二维,以此类推。如果省略 dimension 参数,默认值为 1。
UBound 函数与 LBound 函数一起使用,用于确定数组的大小。使用 LBound 函数可以确定数组某一维的下界。所有维的默认下界均为 0。3. IsArray, IsDate, IsEmpty, IsNull, IsNumeric, IsObject
判断是否数组,日期,Empty,Null,数值或对象。4. CBool, CByte, CCur, CDate, CDbl, CInt, CLng, CSng, CStr
变量类型转换函数,分别转化为Boolean, Byte, Currency, Date, Double, Integer, Long, Single, String类型。5. On Error Resume Next
启动错误处理程序。若不使用 On Error Resume Next 语句,发生的任何运行时错误都将是致命的,即显示错误信息并终止运行。On Error Resume Next 会使程序从紧随产生错误的语句之后的语句继续执行,或是从紧随最近一次调用过程(该过程含有 On Error Resume Next 语句)的语句继续运行。这个语句可以不顾运行时错误,继续执行程序,之后您可以在过程内部建立错误处理例程。在调用另一个过程时,On Error Resume Next 语句变为非活动的。所以,如果希望在例程中进行内部错误处理,则应在每一个调用的例程中执行 On Error Resume Next 语句。6. Err.{property | method}
Err.Number为出错的个数。Err.Raise可以在代码中生成运行时的错误。Err.Clear可用于重新设置Err。7. RGB(red, green, blue)
返回代表 RGB 颜色值的整数。
red:必选。0 到 255 间的整数,代表颜色中的红色成分。
green:必选。0 到 255 间的整数,代表颜色中的绿色成分。
blue:必选。0 到 255 间的整数,代表颜色中的蓝色成分。8. 函数
[Public | Private] Function name [(arglist)]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function声明 Function 过程的名称、参数以及构成其主体的代码。
Public:表示 Function 过程可被所有 scrīpt 中的所有其他过程访问。
Private:表示 Function 过程只可被声明它的 scrīpt 中的其他过程访问。
name:Function 的名称,遵循标准的变量命名约定。
arglis:代表调用时要传递给 Function 过程的参数的变量列表。用逗号隔开多个变量。
statements:在 Function 过程的主体中执行的任意语句组。
expression:Function 的返回值。9. 过程
[Public | Private] Sub name [(arglist)]
[statements]
[Exit Sub]
[statements]
End Sub声明 Sub 过程的名称、参数以及构成其主体的代码。
10. Set ōbjectvar = {objectexpression | Nothing}
将对象引用赋给变量或属性。
objectvar:变量或属性的名称,遵循标准变量命名约定。
objectexpression:由对象名称、另一个已声明为相同对象类型的变量或返回相同对象类型的对象的函数或方法组成的表达式。
Nothing:停止 objectvar 与任何指定对象的关联。当没有其他变量引用 objectvar 原来所引用的对象时,如将其赋为 Nothing 会释放与该对象所关联的所有系统和内存资源。11. Rem comment 或 ' comment
用于包含程序中的解释性注释。comment 参数是需要包含的注释文本。在 Rem 关键字和 comment 之间应有一个空格。12. DateSerial(year, month, day)
对于指定的年、月、日,返回 Date 子类型的 Variant。13. TimeSerial(hour, minute, second)
返回一个 Date 子类型的 Variant,含有指定时、分、秒的时间。14. Date, Time, Now
系统的日期,时间。15. Year, Month, Day, Hour, Minute, Second
把日期或时间拆分开为年、月、日、小时、分钟、秒。16. DateDiff(interval, date1, date2)
interval:必选。字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔。
date1, date2:必选。日期表达式。用于计算的两个日期。
interval 参数可以有以下值:
yyyy 年
q 季度
m 月
y 一年的日数
d 日
w 一周的日数
ww 周
h 小时
m 分钟
s 秒17. Rnd(number)
number 参数可以是任意有效的数值表达式。Rnd 函数返回一个小于 1 但大于或等于 0 的随机数。要产生指定范围的随机整数,请使用以下公式:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
这里, upperbound 是此范围的上界,而 lowerbound 是此范围内的下界。18. TypeName(varname)
返回一个字符串,提供有关变量的 Variant 子类型信息。
TypeName 函数返回值如下:
Byte 字节值
Integer 整型值
Long 长整型值
Single 单精度浮点值
Double 双精度浮点值
Currency 货币值
Decimal 十进制值
Date 日期或时间值
String 字符串值
Boolean Boolean 值;True 或 False
Empty 未初始化
Null 无有效数据
<object type> 实际对象类型名
Object 一般对象
Unknown 未知对象类型
Nothing 还未引用对象实例的对象变量
Error 错误


