青春与成就 是人生的两大财富 / 当你享受青春时 你必须要吃点苦 / 当你失去青春时 成就会成为你的拥有 / 否则 青春之后就一无所有

发布新日志

  • 测试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 pivot

    If 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 If

      While (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
     
     Wend

     ReArr(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 = 0

    For 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;

数据统计

  • 访问量: 17431
  • 日志数: 33
  • 建立时间: 2008-03-07
  • 更新时间: 2008-09-22

RSS订阅

Open Toolbar