字段处理
在设计许可证之类的打印标签时,我把一个较长的字段在表中分成两个字段进行处理,如单位名称、地址等,因为在标签打印的时候,一个字段的内容有时放在一行,有时要放在两行,如果不分的话,会出现乱码,(常有全角和半角混合的情况而不能用substr()函数)请问如何合并在一个字段而又能解决以上情况?
简而言之,就是如何处理全角和半角字符混合字段的分行打印?
问题点数:80、回复次数:16Top
1 楼vongates968(Gate)回复于 2002-11-12 10:59:10 得分 10
是不是可以試一下substrc()呀,它好像是不分單字節還是雙字節吧!!
還有相關函數:AT_C(),LEFTC(),RIGHTC(),STUFFC()可以參考喲Top
2 楼luwq168(后备甜心)回复于 2002-11-15 23:27:07 得分 0
比如有这样二个字段:
1、解放东路148号B幢7楼108室
2、中山北路12号C幢8楼101室
在打印时分成二行:
1、解放东路148号
B幢7楼108室
2、中山北路12号
C幢8楼101室
设该字段为Dz
怎样用每行一个表达式进行正确打印?Top
3 楼luwq168(后备甜心)回复于 2002-11-16 22:45:28 得分 0
?Top
4 楼zhjame(三人行,必有我师)回复于 2002-11-17 12:30:34 得分 0
我看不用分,在REPORT下调用自定义过程就可以解决了。Top
5 楼luwq168(后备甜心)回复于 2002-11-17 14:03:11 得分 0
这是我的目的!!!Top
6 楼newfang(传说中的MIC)回复于 2002-11-17 15:17:05 得分 10
计算标签宽度,看它可以容下多少字。
不行就转行嘛!Top
7 楼luwq168(后备甜心)回复于 2002-11-17 16:56:49 得分 0
如何转行????方法????函数????Top
8 楼luwq168(后备甜心)回复于 2002-11-17 17:04:44 得分 0
宽度是确定的!!Top
9 楼luwq168(后备甜心)回复于 2002-11-17 17:19:33 得分 0
问题在于,半角字符的奇偶数不确定,不能用确定的结束位和开始位进行简单处理!!我设计的程序在套印许可证时,单位名称和地址在正本上放在一行,在副本上放在二行(较长时),每行宽度14个汉字,请高手解决!!Top
10 楼mudong(木东)回复于 2002-11-18 11:29:38 得分 40
只是对这个问题有兴趣、说一点想法、供参考(没有实际做过)
基本想法是判断第28个字符是否与后一个字符合起来是一个全角字符。若是、放在下一行打印。
那么先要分出某一个字符是全角还是半角字符、比如ASCII码<127?
然后需要“数出来”前28个字符有多少个半角字符。如是奇数、分在下一行...
Top
11 楼zhjame(三人行,必有我师)回复于 2002-11-18 12:35:23 得分 10
不要用半角函数,改用双字节函数啊,
atcc()
lenc()
substrc()
都是双字节函数啊
看看MSDN后面的介绍吧。Top
12 楼vongates968(Gate)回复于 2002-11-18 12:51:13 得分 10
只要你用的函數都是32位的就好了呀,樓上說的對呀,我也有說過上面的函數
要多試,就會好了!!Top
13 楼mudong(木东)回复于 2002-11-18 15:37:07 得分 0
zhjame(三人行,必有我师) 说的对。只要注意子串长度便成。Top
14 楼luwq168(后备甜心)回复于 2002-11-19 00:13:58 得分 0
我觉得mudong(木东)的想法可行,分行打印函数确实也有一个,只不过好象不能用在标签表达式里(我曾查到过但记不得了是什么函数了)它的作用是这样的:设temp="This is a pig."
set memowidth to 一个数值(这很难懂)
该函数名(temp)
然后输出:
This is
a pig.
我再重申一遍,如果用双字节函数,还是要涉及到结束位和开始位的设定,可能碰到从一个汉字的一半开始,造成乱码,这是行不通的.
Top
15 楼luwq168(后备甜心)回复于 2002-11-19 00:58:23 得分 0
我理解有误。
双字节函数的使用又造成另外一个问题,就是它把半角字符也当成一个汉字,可能使打印的结果前面一行长短不一,半角字符多的时候会很短。如何解决?Top
16 楼luwq168(后备甜心)回复于 2002-11-19 02:13:07 得分 0
我已找到解决办法,设计函数如下:
FUNCTION dwdz
PARA dwdz0,n
x=0
for i=0 to 28
x=iif(ISLEADBYTE(substr(dwdz0,i)),x+1,x)
endfor
if x%2=0
dwdz1=substr(dwdz0,1,28)
dwdz2=substr(dwdz0,29,56)
else
dwdz1=substr(dwdz0,1,27)
dwdz2=substr(dwdz0,28,56)
endif
do case
case n=1
return dwdz1
case n=2
return dwdz2
endcase
请大家批评指正!!!Top




