以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  查询某列的值为某个字符串的开头字符串的行  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=38529)

--  作者:东坡一剑
--  发布时间:2013/7/31 11:36:00
--  查询某列的值为某个字符串的开头字符串的行
我想从后台数据表{货号名称单价}中寻找[货号]列为某个字符串的开头字符串的行,为此在表{入库复件}的datacolchanged事件中设置了代码,但没有成功。代码为:
 
If e.DataCol.Name = "产品条码" Then
    If e.DataRow.IsNull("产品条码") = False Then
        Dim dr As DataRow
        Dim dt As DataTable
        Dim s,sh,s1,s2,s3 As String
        Dim cmd As new SQLCommand
        cmd.C
        cmd.CommandText = "select 产品名称,季别 from {货号名称单价} where" & "" & e.DataRow("产品条码") & ".startswith([货号])"
        dt = cmd.ExecuteReader
        If dt.DataRows.count > 0 Then
            dr = dt.DataRows(0)
            s = e.NewValue
            e.DataRow("货号") = sh = dr("货号")
            e.DataRow("色号1")=s1 = s.SubString(sh.length - 1,2)
            e.DataRow("色号2")=s2 = s.SubString(sh.length + 1,2)
            e.DataRow("尺码号")=s3 = s.SubString(sh.length + 3)
           
        Else
            Dim sp As New DotNetSpeech.SpVoice()
            sp.Speak("此产品无记录,请添加!", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)
            e.Cancel = True
            MainTable = Tables("货号名称单价")
        End If
    End If
错误提示为:
.NET Framework 版本:2.0.50727.6407
Foxtable 版本:2013.5.12.1
错误所在事件:
详细错误信息:
FROM 子句语法错误。


能帮我看看select语句错在什么地方吗?
这个任务有完成的办法吗?
 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:例子.foxdb

[此贴子已经被作者于2013-7-31 11:40:11编辑过]

--  作者:狐狸爸爸
--  发布时间:2013/7/31 11:42:00
--  

打不开你的文件,因为没有数据源。

 

我蒙一下,你是要查找货号列以当前行的产品条码开始的行吧,如果这样,代码应该是:

 

Dim dr As DataRow
Dim dt As DataTable
Dim s,sh,s1,s2,s3 As String
Dim cmd As new SQLCommand
cmd.C
cmd.CommandText = "select 产品名称,季别 from {货号名称单价} where 货号 Like \'?" &   e.DataRow("产品条码") & "\'"
dt = cmd.ExecuteReader
If dt.DataRows.count > 0 Then
    dr = dt.DataRows(0)
    s = e.NewValue
    e.DataRow("货号") = sh = dr("货号")
    e.DataRow("色号1")=s1 = s.SubString(sh.length - 1,2)
    e.DataRow("色号2")=s2 = s.SubString(sh.length + 1,2)
    e.DataRow("尺码号")=s3 = s.SubString(sh.length + 3)
   
Else
    Dim sp As New DotNetSpeech.SpVoice()
    sp.Speak("I am from china.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)
    e.Cancel = True
    MainTable = Tables("货号名称单价")
End If

 

SQL的语法和函数,请参考:

http://www.foxtable.com/help/topics/0688.htm

http://www.foxtable.com/help/topics/0692.htm

http://www.foxtable.com/help/topics/1827.htm


--  作者:东坡一剑
--  发布时间:2013/7/31 15:22:00
--  

有可能你没有完全理解我的意思,我打个比方:

输入一个条码:L12345678001,其中:

货号为:L1234

色号1为:56

色号2为:78

尺码号为:001

 

但是,货号的长度不固定,导致条码的长度也不固定,因此根据条码来生成货号等要区分好几种情况,逻辑比较复杂,而且很不灵活。所幸色号1和色号2 的位数是固定的,因此我想寻找一种更灵活的方式来生成货号。所以我的意思是:

 

查找货号 是 当前行的产品条码 的开始 的 行


--  作者:狐狸爸爸
--  发布时间:2013/7/31 15:26:00
--  

那就将这一行:

cmd.CommandText = "select 产品名称,季别 from {货号名称单价} where 货号 Like \'?" &   e.DataRow("产品条码") & "\'"

 

改为:

cmd.CommandText = "select 产品名称,季别 from {货号名称单价} where 产品条码 Like \'?" &   e.DataRow("货号") & "\'"


--  作者:东坡一剑
--  发布时间:2013/7/31 15:48:00
--  

问题是{货号名称单价}里并没有名为“产品条码"的列,而且,通配符?不是表示任何单个字符吗?用在这里我还是理解不了。

 

我把相关的两个表从定向为内部表了,不知能否打开。有劳了!

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:例子.foxdb


--  作者:狐狸爸爸
--  发布时间:2013/7/31 16:04:00
--  
这个我也没有办法,建议要么统一货号长度,要么规范产品条码,在货号和后续内容之间用一个符号隔开,以便根据输入的条码获取货号进行查询。
--  作者:Bin
--  发布时间:2013/7/31 16:21:00
--  
"select 产品名称,季别 from {货号名称单价} where 货号 Like \'" & e.DataRow("产品条码") & "%\'" 

这样不能满足你需求吗

--  作者:东坡一剑
--  发布时间:2013/7/31 16:21:00
--  

还是谢谢你!忙了大半天,挺感激的。

不过现实的应用中这种情况还是挺多的。建议foxtable能增强相应的功能来满足这种需求。


--  作者:东坡一剑
--  发布时间:2013/7/31 16:45:00
--  

我把代码调成这样,货号已经生成,不过生成了两个,第一个是正确的值,随即又被修改成了空格,你帮忙看看,怎样才能不被修改成空格,如果能做到,我的问题就解决了!

Dim s As String = e.NewValue
Dim sh As String
For Each dr As DataRow In DataTables("货号名称单价").DataRows
    If s.startswith(dr("货号")) Then
    MessageBox.Show(dr("货号"))
        sh = dr("货号")
    End If
Next
MessageBox.Show(sh)
e.DataRow("货号") = sh

 

可以用下面的条码测试

GL1352340150170

[此贴子已经被作者于2013-7-31 16:50:17编辑过]

--  作者:狐狸爸爸
--  发布时间:2013/7/31 16:47:00
--  

这个简单:

 

Dim s As String = e.NewValue
Dim sh As String
For Each dr As DataRow In DataTables("货号名称单价").DataRows
    If dr.isnull("货号") = False andalso s.startswith(dr("货号"))  Then
        sh = dr("货号")

        exit for
    End If
Next
e.DataRow("货号") = sh

[此贴子已经被作者于2013-7-31 16:55:16编辑过]