-
测试WebTable中记录与数据库中记录相比较
2008-09-01 14:34:20
'打开预检测的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-09-01 09:53:35
"+":
计算两个数之和。
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-08-29 14:47:14
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 -
记录集对象Open
2008-08-28 10:41:41
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的问题。
-
给WEB页面属性为只读的文本框赋值
2008-07-08 14:22:48
webedit(" ").object.value="要设置的值“ 为其赋值 -
PDU(短信收发)
2008-06-03 13:57:06
1、PDU(短信)收发格式对比
摘自:http://blog.csdn.net/liguiman/archive/2007/06/20/1660125.aspx
很早以前做短信收发用的,供大家参考~~
图中左边是发送短信的PDU, 右边是接收短信的PDU
下边两排pdu和上面是对应的s 就是发送,R就是接收的。
关于更详细的信息,以后陆续会解释~2、PDU发送短信简明分析
摘自:http://www.ddic.cn/article.asp?articleid=49
例如短信息中心号码为深圳 +8613800755500
对方手机号码为 +8613612345678
要发送的信息为“中”
算法步骤:
一、地址部分,用字符串 addr 表示
1、将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 addr = "+8613800755500"
=> addr = "8613800755500F"
2、将奇数位和偶数位交换。
=> addr = "683108705505F0"
3、将短信息中心号码前面加上字符91,91是国际化的意思
=> addr = "91683108705505F0"
4、算出 addr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8 => "08"
=> addr = "0891683108705505F0"
二、手机号码部分,用字符串 phone
1、将手机号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 phone = "+8613612345678"
=> phone = "8613612345678F"
2、将手机号码奇数位和偶数位交换。
=> phone = "683116325476F8"
三、短信息部分,用字符串 msg 表示
1、转字符串转换为Unicode代码,例如“中”的unicode代码为 4E2D,
(好像是将中字的ASCII码分开,分别转成16进制)。因为我用DELPHI,
请vb朋友自己找例子,网上应该许多
function TfrmMain.str_Gb2UniCode( text: string ): String;
var
i,j,len:Integer;
cur:Integer;
t:String;
ws:WideString;
begin
Result:='';
ws := text;
len := Length(ws);
i := 1;
j := 0;
while i <= len do
begin
cur := ord(ws[i]);
FmtStr(t,'%4.4X',[cur]); //BCD转换
Result := Result+t;
inc(i);
//移位计数达到7位的特别处理
j := (j+1) mod 7;
end;
end;
即 msg = "中"
即 msg = str_Gb2UniCode( msg )
=> msg = "4E2D"2、将 msg 长度除2,保留两位16进制数,即 4E2D = 4 / 2 => "02",再加上 msg
=> msg = "024E2D"
四、组合
1、手机号码前加上字符串 11000D91,这是一些PDU代码,写死就行了,感兴趣可以参考相关PDU格式说明
即 phone = "11000D91" + phone
=> 11000D9168683116325476F8
2、手机号码后加上 000800 和刚才的短信息内容,000800也写死就可以了
即 phone = phone + "000800" + msg
即 11000D9168683116325476F8 + 000800 + 024E2D
=> phone = 11000D9168683116325476F8000800024E2D
3、phone 长度除以2,格式化成2位的十进制数
即 11000D9168683116325476F8000800024E2D => 36位 / 2 => 18
五、所以要发送的内容为
AT+CMGS=18<回车,ASCII为13>
addr+phone+<^Z>+换行回车<13和10>
即AT+CMGS=18<回车>0891683108705505F011000D91683116325476F8000800024E2D^Z换行回车
你先用AT指令试是 然后在用程序实现
function Encode7bit(Src:String):String;
var Dst:String;
i:Integer;
CurS,NextS:Byte;
TStr:String;
begin
for i:=1 to Length(Src) do begin
//当前是字符按8位分组的第8位,无需编码(8个字符已缩短为7个)
if (i mod 8)=0 then Continue;
//取当前位为数字
TStr:=Copy(Src,i,1);
CurS:=Ord(TStr[1]);
//当前右移位组中的第一个字符不移位
if (i mod 8)>1 then
CurS:=(CurS shr ((i mod 8)-1) );
//取后一位为数字如果到了字符的结束,不取
if i<Length(Src) then begin
TStr:=Copy(Src,i+1,1);
NextS:=Ord(TStr[1]);
end else
NextS:=0;
//后一位移位 左移
NextS:=(NextS shl (8-(i mod 8)));
//当前移位后加后一位移位后 转换成为十六进制
Dst:=Dst+IntToHex(CurS+NextS,2);
end;
Result:=Dst;
end;
function Decode7bit(Src:String):String;
var Dst:String;
i:Integer;
CurS,ProiS:Byte;
begin
for i:=1 to (Length(Src) div 2) do begin
//将当前位的十六进制转换为十进制
CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50
//取前一位十六进制转换为十进制
if (i mod 7)<>1 then
ProiS:=StrToInt('$'+Copy(Src,(i-2)*2+1,2)) //C8->200
else
ProiS:=0;
//前一位右移,即将当前字符前移的位取出来
if (i mod 7)>0 then
ProiS:=(ProiS shr (9-(i mod 7)))
else
ProiS:=(ProiS shr 2);
//当前位左移除掉高位
if (i mod 7)>0 then
CurS:=(CurS shl (i mod 7) )
else
CurS:=(CurS shl 7 );
//将第八位设置为0
CurS:=(CurS shr 1);
Dst:=Dst+Chr(CurS+ProiS);
//第七个十六进制内已包含有一个完整的字符
if (i mod 7)=0 then begin
CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50
CurS:=(CurS shr 1);
Dst:=Dst+Chr(CurS);
end;
end;//en for
Result:=Dst;
end;