Foxtable(狐表)用户栏目专家坐堂 → 取字符检索问题求教


  共有3280人关注过本帖树形打印复制链接

主题:取字符检索问题求教

帅哥哟,离线,有人找我吗?
hitzfeld
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:537 积分:5272 威望:0 精华:0 注册:2017/9/1 23:28:00
取字符检索问题求教  发帖心情 Post By:2021/2/2 14:12:00 [只看该作者]

我有个需求是这样,取A表的单号查找B表对应记录,但是由于B表首字符存在多种可能性,所以需要把首字符去除再查找。我写了下面的代码报错,求指点
For Each dr As DataRow In DataTables("供应商对账表").DataRows
    Dim drs As String = dr("单号")
Dim  gdh As String = drs.SubString(2,7)
Dim sq As DataRow
sq = DataTables("WH_STOCK").SQLFind("SUBSTRING('number',2,7) = '"& gdh &"'") 
next
其中错误就在SQLFind("SUBSTRING('workbillno',2,7)  = '"& gdh &"'") ,个人觉得应该是SQLFIND不支持取字符的表达式?如果都不取字符,则代码能正常运行。但是加了取字符的表达式就报错“未将对象引用设置到对象的实例”。
[此贴子已经被作者于2021/2/2 14:19:11编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111422 积分:567186 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/2/2 14:13:00 [只看该作者]

什么数据库?

 回到顶部
帅哥哟,离线,有人找我吗?
hitzfeld
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:537 积分:5272 威望:0 精华:0 注册:2017/9/1 23:28:00
  发帖心情 Post By:2021/2/2 14:18:00 [只看该作者]

SQL server 2005

 回到顶部
帅哥哟,离线,有人找我吗?
hitzfeld
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:537 积分:5272 威望:0 精华:0 注册:2017/9/1 23:28:00
  发帖心情 Post By:2021/2/2 14:20:00 [只看该作者]

抱歉,代码简化的有点乱了,实际应该是SQLFind("SUBSTRING('number',2,7) = '"& gdh &"'") 

 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111422 积分:567186 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/2/2 14:22:00 [只看该作者]

sq = DataTables("WH_STOCK").SQLFind("SUBSTRING([number],2,len([number]) - 1) = '" & gdh & "'") 

 回到顶部
帅哥哟,离线,有人找我吗?
hitzfeld
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:537 积分:5272 威望:0 精华:0 注册:2017/9/1 23:28:00
  发帖心情 Post By:2021/2/2 14:30:00 [只看该作者]

蓝老师,仍然报错.........首字符后面的字符串长度是固定的,不需要len([number]) - 1,我用了len([number]) - 1和固定数值都报同样错误

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111422 积分:567186 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/2/2 14:32:00 [只看该作者]

完整代码发上来

 回到顶部
帅哥哟,离线,有人找我吗?
hitzfeld
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:537 积分:5272 威望:0 精华:0 注册:2017/9/1 23:28:00
  发帖心情 Post By:2021/2/2 14:34:00 [只看该作者]

For Each dr As DataRow In DataTables("供应商对账表").DataRows
    Dim drs As String = dr("G单号")
Dim  gdh As String = drs.SubString(1,8)
Dim sq As DataRow
sq = DataTables("WH_STOCK").SQLFind("SubString([workbillno],1,8) = '"& gdh &"' and warehouse = '内仓' and inorout= 'in' AND orderdate is not null") 
dr("workbillno") = sq("workbillno")
dr("SupplierName") = sq("SupplierName")
dr("CardBoard_l") = sq("CardBoard_l")
dr("CardBoard_w") = sq("CardBoard_w")
dr("material") = sq("material")
dr("sort") = sq("sort")
dr("planNumber") = sq("planNumber")
dr("InNumber") = sq("InNumber")
dr("orderdate") = sq("orderdate")
dr("issuedate") = sq("issuedate")
dr("Customerno") = sq("Customerno")
dr("Itemname") = sq("Itemname")
Next

 回到顶部
帅哥,在线噢!
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111422 积分:567186 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/2/2 14:36:00 [只看该作者]

示例三

通常应该在代码中判断是否找到了符合条件的行,然后再运行后续的代码。
例如要找出最近一次订购产品数量超过1000的订单,并显示订单的日期和客户:

Dim dr As DataRow
dr = 
DataTables("订单").SQLFind("数量 > 1000","日期 Desc")
If 
dr IsNot Nothing Then '如果找到的话
    Output.Show(
"日期:" & dr("日期"))
    Output.Show(
"客户:" & dr("客户"))

End If

如果我们不加上判断,直接:

Dim dr As DataRow
dr = 
DataTables("订单").SQLFind("数量 > 1000","日期 Desc")
Output.Show(
"日期:" & dr("日期"))
Output.Show(
"客户:" & dr("客户"
))

一旦订单表并不存在订购数量超过1000的订单,那么Find方法返回Nothing,导致后续代码运行出错。


 回到顶部
帅哥哟,离线,有人找我吗?
hitzfeld
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:537 积分:5272 威望:0 精华:0 注册:2017/9/1 23:28:00
  发帖心情 Post By:2021/2/2 14:43:00 [只看该作者]

蓝老师,加上判断虽然不报错,但是无法返回任何结果,且界面会卡住大约15秒。
实际上库数据量不大,如果不加取字符的SubString,运行时间不超过1秒。

即使我在sqlfind语句下面加上msgbox(sq(“workbillno”)),也不会返回结果。说明一直都是错误的
[此贴子已经被作者于2021/2/2 14:50:39编辑过]

 回到顶部
总数 11 1 2 下一页