以下是引用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