Foxtable(狐表)用户栏目专家坐堂 → 查询某列的值为某个字符串的开头字符串的行


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

主题:查询某列的值为某个字符串的开头字符串的行

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


加好友 发短信
等级:小狐 帖子:366 积分:2478 威望:0 精华:0 注册:2013/1/13 23:43:00
查询某列的值为某个字符串的开头字符串的行  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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


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


加好友 发短信
等级:小狐 帖子:366 积分:2478 威望:0 精华:0 注册:2013/1/13 23:43:00
  发帖心情 Post By:2013/7/31 15:22:00 [只看该作者]

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

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

货号为:L1234

色号1为:56

色号2为:78

尺码号为:001

 

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

 

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


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/7/31 15:26:00 [只看该作者]

那就将这一行:

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

 

改为:

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


 回到顶部
帅哥哟,离线,有人找我吗?
东坡一剑
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:366 积分:2478 威望:0 精华:0 注册:2013/1/13 23:43:00
  发帖心情 Post By:2013/7/31 15:48:00 [只看该作者]

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

 

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

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


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/7/31 16:04:00 [只看该作者]

这个我也没有办法,建议要么统一货号长度,要么规范产品条码,在货号和后续内容之间用一个符号隔开,以便根据输入的条码获取货号进行查询。

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178530 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2013/7/31 16:21:00 [只看该作者]

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

这样不能满足你需求吗

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


加好友 发短信
等级:小狐 帖子:366 积分:2478 威望:0 精华:0 注册:2013/1/13 23:43:00
  发帖心情 Post By:2013/7/31 16:21:00 [只看该作者]

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

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


 回到顶部
帅哥哟,离线,有人找我吗?
东坡一剑
  9楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:366 积分:2478 威望:0 精华:0 注册:2013/1/13 23:43:00
  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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编辑过]

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