以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  取字符检索问题求教  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=160431)

--  作者:hitzfeld
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2021/2/2 14:13:00
--  
什么数据库?
--  作者:hitzfeld
--  发布时间:2021/2/2 14:18:00
--  
SQL server 2005
--  作者:hitzfeld
--  发布时间:2021/2/2 14:20:00
--  
抱歉,代码简化的有点乱了,实际应该是SQLFind("SUBSTRING(\'number\',2,7) = \'"& gdh &"\'") 
--  作者:有点蓝
--  发布时间:2021/2/2 14:22:00
--  
sq = DataTables("WH_STOCK").SQLFind("SUBSTRING([number],2,len([number]) - 1) = \'" & gdh & "\'") 
--  作者:hitzfeld
--  发布时间:2021/2/2 14:30:00
--  
蓝老师,仍然报错.........首字符后面的字符串长度是固定的,不需要len([number]) - 1,我用了len([number]) - 1和固定数值都报同样错误
--  作者:有点蓝
--  发布时间:2021/2/2 14:32:00
--  
完整代码发上来
--  作者:hitzfeld
--  发布时间: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

--  作者:有点蓝
--  发布时间: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
--  发布时间:2021/2/2 14:43:00
--  
蓝老师,加上判断虽然不报错,但是无法返回任何结果,且界面会卡住大约15秒。
实际上库数据量不大,如果不加取字符的SubString,运行时间不超过1秒。

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