我有一值勤表:
xm   rq
张三  1-5,10-14,18-23,27-30
李四  6-9,15-17,24-26
王五  5-15,20-22
现在我如何判断某一天某人是否在值班?
如:给定函数f(xm,rq)
得f(张三,20)=true;
f(李四,20)=false;
特请教该函数如何写?

解决方案 »

  1.   


    Function CardObjCheckIsAvai(CodeObj As String, rq As string) As Boolean
      ObjProjectCheckIsAvai = False 
     For i = LBound(rq)To UBound(rq) - 1
        ssnn.Open "SELECT * FROM TB_DRAWER WHERE (ITEMCODE = " & CodeObj  & ")", cn_desc
                Do While Not ssnn.EOF
                    if inst(ssnn("rq"),"rq") > 0
                         CardObjCheckIsAvai =true
                         exit do
                    endif
                    ssnn.MoveNext
                Loop
                ssnn.Close
            Next
    loop
      

  2.   

    Function CardObjCheckIsAvai(CodeObj As String, rq As string) As Boolean 
      ObjProjectCheckIsAvai = False            ssnn.Open "SELECT * FROM 表明  WHERE (xm = " & CodeObj  & ")", cn_desc 
                Do While Not ssnn.EOF 
                    if inst(ssnn("rq"),"rq") > 0 
                        CardObjCheckIsAvai =true 
                        exit do 
                    endif 
                    ssnn.MoveNext 
                Loop 
                ssnn.Close 
    End Function
      

  3.   

    '我没有用到数据库,
    '你可以不用第二个参数,第二个参数从数据库中取得.'取得的SQL语句加是  "Where xm = '" & xm & "'"code=VB]Option ExplicitPrivate Sub Command1_Click()
       MsgBox f("张三", "1-5,10-14,18-23,27-30", 25)
    End Sub
    Private Function f(ByVal xm As String, ByVal rqs As String, ByVal rq As Long) As Boolean
      Dim Arr1() As String
      Dim Arr2() As String
      
      f = False
      
      On Error GoTo Handler
      
      Arr1 = Split(rqs, ",")
      Dim i As Long
      
      For i = 0 To UBound(Arr1)
         Arr2 = Split(Arr1(i), "-")
           If CLng(Arr2(0)) <= rq And rq <= CLng(Arr2(1)) Then
              f = True
           End If
      Next
      
     Exit Function
     
    Handler:
        f = False
    End Function[/code]
      

  4.   

    "if inst(ssnn("rq"),"rq") > 0"
    并不能检查出20在字串18-23中.
      

  5.   

    不用Split分组,有没有其它的好方法?
      

  6.   

    直线思维的代码:
    Function GetValue(ByVal xm As String, ByVal rq As Long) As Boolean
        
        Dim cn As connection
        Dim rs As Recordset
        Dim arr
        Dim i As Long, j As Long
        Dim b As Long, e As Long
        
        '连接数据库
        Set cn = New connection
        'cn.open......
        '返回记录集
        Set rs = New Recordset
        'rs.open "select * from tb where xm='" & xm & "'",cn......
        arr = rs!xm
        arr = Split(arr, ",")
        For i = 0 To UBound(arr)
            b = Split(arr(i), "-")(0)
            e = Split(arr(i), "-")(1)
            For j = b To e
                If j = rq Then
                    GetValue = True
                    Exit Function
                End If
            Next j
        Next i
        
    End Function没测试......
      

  7.   

    那把条件改一下,刚才没看清楚,不好意思。。
    Function CardObjCheckIsAvai(CodeObj As String, rq As long ) As Boolean 
      ObjProjectCheckIsAvai = False ITEMCODE2() As String
              ssnn.Open "SELECT * FROM 表名  WHERE (xm = " & CodeObj  & ")", cn_desc 
                Do While Not ssnn.EOF 
                     ITEMCODE2 = Split(ssnn("rq"), "-")
                      For i = LBound(ITEMCODE2) To UBound(ITEMCODE2) - 1
                         if i = rq then
                            ObjProjectCheckIsAvai =true
                            exit do
                         endif
                      Next
                    ssnn.MoveNext 
                Loop 
                ssnn.Close 
    End Function
      

  8.   

    最好把这些基础信息存在数据库中 1个语句就可以查询得结果张三  1-5,10-14,18-23,27-30 
    李四  6-9,15-17,24-26 
    王五  5-15,20-22 xm  srq erq
    张三 1   5
    张三 10  14
    张三 18  23
    张三 27   30
    .
    .
    .
    查询某个人某天是否在值班
    select * from tb where xm='张三' and rq between srq and erq
    查询某天哪些人在值班
    select * from tb where rq between srq and erq
      

  9.   

    微软的office中有一个序列判断好象是lookup函数.但不知是怎么实现的.
      

  10.   

    可不可以生成一个临时表(或数组),根据日期序列给指定位置填充数值.然后检查某位置是否变化判断是否存在/
    如1-5,10-14,18-23,27-30 转化成:
    array a={1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,0}
    if a(20)=1 then f("张三",20)=true
      

  11.   

    不如用1个32bit 数据类型表示 也就是1个Long 整数 1~31Bit位代表某天1~31号是否在值
    处理基础数据的时候可以这样1-5
    2^5-2^(1-1)=(11111)2
    6-10
    2^10-2^(6-1)=1111100000然后把某个人所有值班数据转换后的值相加 活着用 or 运算也可以位运算比较快速且节省空间
      

  12.   

    "26-26","26" 有什么实质区别啊 自己判断下数组下标最大值不就好了 (我指使用split分组后的数组)
      

  13.   

    不谈算法,我觉得楼主思路要改一下
    首先你这是个数据库相关程序吧,那么如果你设计的数据库结构,连这样一个简单的查询SQL语句都实现不了,我觉得应该说设计是不成功的,至少是有问题的......
    还是建议你修改数据库结构,如果不能修改,那么就在当前字段存取数据的结构上动动脑筋.....
    表中的数据不是直接用来让用户看的,所以你的这种1-5,8-10这样的结构可以考虑改一下,以利于数据查询。比如你前面提到的用1和0的结构,这个要比你现在的结构好,还是看看你的示例数据:
    01-05,10-14,18-23,27-30 转换为11111000011111100011111100011110这样存储,那么要实现你现在的查询就简单了:
    select * from tb where xm='AA' and mid(rq,20,1)='1'
    ...........