2023年2月

长文本会在 '-' 这个符号处自动换行

原理:SAP 标准SMARTFORMS 的功能,遇到 '-' 自动判断后面字段是否能在本行完全显示,不够则换行

注意:如果一行文本有多个 ‘-’ ,则 判断 '-' 和下一个 '-' 之间的文本是否能在本行完全显示,不能则换行

例:

str1 'SOP4-214-03示例一车间贴标泡罩装盒岗位SOP、SOP2-047-24实例二车间装箱岗位SOP、SOP2-231-57实例三车间激光打印岗位SOP'.
输出后为:(三行,换行2次)

SOP4-214-03示例一车间贴标泡罩装盒岗位SOP、SOP2-047-

24实例二车间装箱岗位SOP、SOP2-231-

57实例三车间激光打印岗位SOP

字符串处理结果:

str1 'SOP4-214- 03示例一车间贴标泡罩装盒岗位SOP、SOP2-047- 24实例二车间装箱岗位SOP、SOP2-231- 57实例三车间激光打印岗位SOP'.

输出后为:(不会换行,这里仅为部分替换)

SOP4-214- 03示例一车间贴标泡罩装盒岗位SOP、SOP2-047- 24实例二车间装箱岗位SOP、SOP2-231- 57实例三车间激光打印岗位SOP

解决办法:

可以用 

  REPLACE '-' WITH  '- ' INTO str1.
在 '-' 后加了一个空格,就可以解决了(如果有多个短横线,则需要全部替换,或者部分替换)

 

好像有能取消这个功能的方法,找了半天没找到,有大神做过的话,发个链接让我等学习学习,不胜感激!

 

 

字符串中包含单引号:单引号前面再加一个单引号

例:jest~stat = 'E0002'

   jest~stat = 'E0003' OR jest~stat = 'E0004'

IF z_stat IS INITIAL.
  z_stat 'jest~stat = ''E0002'''.
ELSE.
  z_stat 'jest~stat = ''E0003'' OR jest~stat = ''E0004'''.
ENDIF.

1、连接字符串

CONCATENATE {dobj1 dobj2 ...}|{LINES OF itab} 
             INTO result 
             [IN {BYTE|CHARACTER} MODE] 
            [SEPARATED BY sep] 
            [RESPECTING BLANKS]

 

2、拆分字符串:

SPLIT dobj AT sep INTO 
      { {result1 result2 ...} | {TABLE result_tab} } 
      [IN {BYTE|CHARACTER} MODE].

例:

DATA: str  TYPE string VALUE '字符串一 字符串二 字符串三 字符串四',
      str1 TYPE string,
      str2 TYPE string,
      str3 TYPE string.
SPLIT str AT space INTO str1 str2 str3.
WRITE: / str1, / str2, / str3.
字符串一
字符串二
字符串三 字符串四

注意:没有足够的目标字段,则用str的剩余部分填充最后目标字段。

可以用一个内表来接收拆分后的子串,可以自动增长,就不用担心目标字段不够用了。例子如下:

DATA: str    TYPE string VALUE '字符串一 字符串二 字符串三 字符串四'.
DATA: it_str TYPE TABLE OF string,
      wa_str LIKE LINE OF it_str.
SPLIT str AT space INTO TABLE it_str.
LOOP AT it_str INTO wa_str.
  WRITE: / wa_str.
ENDLOOP.
字符串一
字符串二
字符串三
字符串四

segment()函数

segmentval = text index = idx [sep|space = sep] )

根据指定的字符串sep或者指定的字符sapce来将text拆分,并返回第idx(从1开始)个片断

 

3、截断字符串:

SHIFT {c} [BY {n} PLACES] [{mode}].:

 

字符串移动

 

字符串替换

替换指定的字符串(老式的,已过时的)

REPLACE sub_string WITH new INTO dobj 
        [IN {BYTE|CHARACTER} MODE] 
        [LENGTH len].

 

替换某个区间上的字符串

REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new
                [IN {BYTE|CHARACTER} MODE].

OFFSET or LENGTH必须要指定一个,如果指定了OFFSET,但未指定LENGTH时,替换的内容从OFFSET到dobj的最后;如果指定了LENGTH,但未指定OFFSET时,OFFSET将隐含为0。OFFSETLENGTH需要大于或等于0,通过OFFSET与LENGTH定位到的子字符串段必须要位于dobj里。

replace

返回码:

0 ——替换成功,并且结果未被截断

2 ——替换成功,但结果右边被截断

4 ——未找到要替换的字符串

 

replace()函数regex

replaceval = text [off = off] [len = len] with = new )

replaceval = text {sub = substring}|{regex = regex} with = new [case = case] [occ = occ] )

使用new替换指定的子符串,返回String类型。

 

搜索字符串

SEARCH <c> FOR <str> <options>.

contains()函数regex

matches()函数regex

count()函数regex

 

 

 

 

 

 

一、FOR ALL ENTRIES IN 案例

今天碰到工单报工统计分析表查询速度特别慢

经查看源代码:

  SELECTafpo~dwerk afko~aufnr afpo~matnr AS plnbez afpo~charg afpo~psmng afko~fevor afko~aufplFROMafko INNER JOIN afpoON afko~aufnr =afpo~aufnrINTO CORRESPONDING FIELDS OF TABLEit_afpoWHERE afpo~dwerk =p_dwerkAND afpo~aufnr INp_aufnrAND afpo~matnr INp_matnrAND afko~fevor INp_fevorAND afpo~charg INp_charg.IF f_wr = 'X'.SELECT *
      FROMafruINTO CORRESPONDING FIELDS OF TABLEit_afruFOR ALL ENTRIES INit_afpoWHERE werks = it_afpo-dwerkAND aufnr = it_afpo-aufnrAND ersda INp_ersdaAND prdut INp_prdutAND stokz <> 'X'
       AND stzhl = 0.ELSE.SELECT *
      FROMafruINTO CORRESPONDING FIELDS OF TABLEit_afruFOR ALL ENTRIES INit_afpoWHERE werks = it_afpo-dwerkAND aufnr = it_afpo-aufnrAND ersda INp_ersdaAND prdut INp_prdut.ENDIF.

最近凭证打印需要附加打印条形码,遂做了一个小例子,结果还出现了很多的小问题,按领导的话说,这就是经验!

首先:SE73 -> 系统条形码 -> 更改 -> 创建 -> 选择 NEW 

 

然后输入名字和短文本:

选择编码类型,此处我选择Code 128。关于编码类型介绍引用一个博主的链接:https://www.cnblogs.com/mingdashu/p/7007747.html

选择条码对齐方式:

设置大小:

确定,生成请求号以后,该条码样式创建结束,先来测试一下:找到刚才创建的条码,运行

选择打印预览,可以自定义条码数据

 然后用你的手机扫一扫,或者扫码枪

 如果扫不到,不要担心,电脑分辨率的问题,把条码放大一下就扫到了

下面就要把这个条码样式应用在smartforms里面了

smartforms创建样式:

字符样式创建节点,标准设置条形码名称选择刚才创建的条码样式

激活,然后创建smartforms:ZTEST_TXM

定义一个变量,并赋值

创建条形码文本:附加创建的条形码字符格式,拖进变量字段

注意:如果附加不上字符格式,去除该段落格式和字符格式的字体大小,及间距数据,并且不要复制变量或者文本,先选择字符格式,然后手输或者从字段列表拖拽字段就可以

 

 

然后激活,运行smartforms:要是扫描还不识别,就运行命令:PDF!  导出本地PDF放大条形码

喏:放大

就识别了!

到此就完结了,有点过于详细是不是,哈哈!

 

如图,打印内容压在框线上,但是打印预览是正常的

预览图如下,预览是正常的

预览用PDF!命令,导出PDF,也是正常的,就直接打印有问题,不是打印机的问题,用Adobe PDF打印机也是不行

如果只有一例的话用上述命令保存PDF文件可以解决,

如果大批量的话,调整样式,右缩进0.05CM 

让多余的显示在下一行就可以了,哪怕多缩进一些