| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1973 人关注过本帖
标题:select 语句遭遇长度不够的情况
取消只看楼主 加入收藏
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
select 语句遭遇长度不够的情况
我自己写的语句如下:
运行后发现用函数的这一列(LEFT(ck,AT('To',x)-1))有很多内容没有显示出来,就是那种口字的符号显示,拉宽了也不能正确显示,请看看有没有解决方案。

SELECT no,date,dw,LEFT(ck,AT('To',x)-1),pn,qty,qtyinvoice,amt,type,po,ln,pi,remark FROM chdd WHERE '仓库调拨单据'$type


数据库如下:

no    date    dw    ck    pn    qty    qtyinvoice    amt    type    po    ln    pi    remark
CHG031225    2014-3-4    调拨    辅料仓 To 镜片产线仓    A11.20.001350    80000    0    800    仓库调拨单据        0        
CHG031356    2014-3-26    调拨    不良品仓 To 废品仓    A01.21.000731    72611    0    726.11    仓库调拨单据        0        1223-0312入库NG物料0325批准报废
搜索更多相关主题的帖子: 解决方案 数据库 仓库 镜片 
2014-04-28 16:42
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
我自己的想法是吧这些仓库调拨单据的拆分出来,直接点做调拨入库,调拨出库。这样将会便于理解以及处理,谢谢。
2014-04-28 16:43
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
回复 5 楼 hu9jj
感谢回答。
那请问需要怎么样才能实现我的目标?
我的希望是讲原本只有一行信息的调拨单据,拆分成两行记录,一行是调拨入库,另外一行是调拨出库记录,这两行记录其他的都可以相同,只不过仓库不一样。
2014-04-28 17:29
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
以下是引用tlliqi在2014-4-28 17:25:01的发言:

截取字段是什么目的?



该字段中包含两个仓库,而且该条记录是表示物料从一个仓库调拨进入另外一个仓库。
现在的目的是讲这一条调拨记录拆分成两行,一个调拨出库,另外一个调拨入库。
谢谢您的回答。
2014-04-28 17:30
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
就好比第一条数据:
CHG031225    2014-3-4    调拨    辅料仓 To 镜片产线仓    A11.20.001350    80000    0    800    仓库调拨单据        0        

我需要拆分成下面两条记录:
调拨入库:
CHG031225    2014-3-4    调拨    镜片产线仓    A11.20.001350    80000    0    800    调拨入库        0        
调拨出库:
CHG031225    2014-3-4    调拨    辅料仓        A11.20.001350    80000    0    800    调拨出库        0
2014-04-28 17:32
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
以下是引用asdf_123000在2014-4-28 17:51:40的发言:

5楼已经回答了

你好,感谢回复。
我需要知道的不是原因,我希望知道的是如何解决这个问题,将一行拆解成为两行。
在拆解过程中如何截取字段不会出现乱码。
谢谢。
2014-04-28 17:59
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
以下是引用taifu945在2014-4-28 20:26:07的发言:

亲,字符串有含全角字符的请用LEFTC()、RIGHTC()、SUBSTRC()等一些支持全角字符的函数哦,AT()貌似也有相关支持全角的函数哦。


主要是中文的,应该没有全角吧。
2014-04-28 20:59
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
以下是引用sdta在2014-4-28 18:26:43的发言:

分两行容易



谢谢。
请问具体代码如何编写呢?
insert into chdd (select * from chdd)?
然后
delete from chdd where type ='调拨单据'
2014-04-28 21:00
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
以下是引用liuxingang28在2014-4-28 21:31:18的发言:

就楼主所遇到的问题来说,主要是对 Select 语句的理解不够透彻。问题出在以表达式 LEFT(ck,AT('To',x)-1) 作为列字段时,该列的字段长度等于满足条件的第一个表达式的计算结果的长度。比如,第一条记录 ck 的值为“辅料仓 To 镜片产线仓”时,LEFT(ck,AT('To',x)-1)=“辅料仓 ”,则该字段的长度被定义成 7。此时,对于下一条记录“不良品仓 To 废品仓”时,虽然LEFT(ck,AT('To',x)-1)=“不良品仓 ”,但是由于字段长度是 7,所以系统只能保存前 7 个字符,即:“不良品”加上半个“仓”,就会出现乱字符。

假设 ck 字段的长度为20,正确的写法是:SELECT no,date,dw,PADR(LEFT(ck,AT('To',x)-1),20),pn,qty,qtyinvoice,amt,type,po,ln,pi,remark FROM chdd WHERE '仓库调拨单据'$type

也可以改为 CAST()函数:SELECT no,date,dw,CAST(LEFT(ck,AT('To',x)-1) AS C(20)),pn,qty,qtyinvoice,amt,type,po,ln,pi,remark FROM chdd WHERE '仓库调拨单据'$type


感谢你,成功的解决了问题,竟然是cast函数的问题。

在这个过程中我自己也用VBA来做了一个,主要用的是分裂的技术,共享出来如下:

Sub aa()
    fir = [a65536].End(xlUp).Row
    Range(Cells(1, 1), Cells([a65536].End(xlUp).Row, "m")).AutoFilter field:=9, Criteria1:="=*仓库调拨单据*", Operator:=xlAnd
    Range(Cells(2, 1), Cells([a65536].End(xlUp).Row, "m")).SpecialCells(xlCellTypeVisible).Copy
    Cells([a65536].End(xlUp).Row + 1, 1).PasteSpecial xlPasteValues
    fis = [a65536].End(xlUp).Row
    Range(Cells(fir + 1, "i"), Cells(fis, "i")) = "调拨入库"
    Range(Cells(fir + 1, "d"), Cells(fis, "d")).TextToColumns Destination:=Cells(fir + 1, "d"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, 9), Array(2, 9), Array(3, 2)), TrailingMinusNumbers:=True
   
    Range(Cells(2, 1), Cells(fir, "m")).SpecialCells(xlCellTypeVisible).Copy
    Cells([a65536].End(xlUp).Row + 1, 1).PasteSpecial xlPasteValues
    fit = [a65536].End(xlUp).Row
    Range(Cells(fis + 1, "i"), Cells(fit, "i")) = "调拨出库"
    Range(Cells(fis + 1, "d"), Cells(fit, "d")).TextToColumns Destination:=Cells(fis + 1, "d"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 9), Array(3, 9)), TrailingMinusNumbers:=True
   
End Sub
2014-04-28 21:43
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
收藏
得分:0 
新手来着,之前用vba的,没有更好办法的情况下比较容易会到VBA的老套路里面去。
2014-04-29 09:03
快速回复:select 语句遭遇长度不够的情况
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012317 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved