代码人生的小狗窝

一行行枯燥的代码,却描绘出人生的点点滴滴

您现在的位置是:首页>_SAP

[SAP ABAP开发技术总结]几个问题

发布时间:2018-08-14浏览(2728)

    [SAP ABAP开发技术总结]几个小问题

    声明:原创作品转载时请注明文章来自SAP师太博客并以超链接形式标明文章原始出处否则将追究法律责任!
    原文出自:
    以前做项目中遇到的,很多没来得急记下来,先贴几个吧

    9.   问题

    9.1.  ALV自带导出文件时字段数据末尾被截断问题

    发现有前导0时,导出会被截断:现发现VBAK-VBELN MARA-MFRNR都有这个问题,可能原因是他们带有转换输出与输入规则所导致

    image085

    image086

    另一种解决办法:

    image087 image088

    9.2.  Smartform Template无法显示减号后面内容

    Smartform中的Template里,如果输入的变量内容含有减号,则减号后面的内容会被丢掉

    image089

    问题原因:输出的内容超出了Template单元格的长度

    解决办法:更改TEMPLATE的长度,或者换成 TABLE

    9.3.  Smartform金额或者数量字段显示不出来

    image090

    9.4.  更新数据库表时,工作区或内表的结构需参考数据库表来定义

    使用使用MODIFY更新数据库表时,工作区或内表的行结构与数据库表结构中各字段声明顺序要相同,否则更新会错位,该内表最好参照数据库词典结构类型来声明,这样就不会有问题。

    9.5.  DELETE ADJACENT DUPLICATES…去重复

    DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING<f1><f2> ... | ALL FIELDS]

    注,在未使用COMPARING 选项时,要删除重复数据之前,一定要按照内表关键字声明的顺序来进行排序,才能删除重复数据,否则不会删除掉;如果指定了COMPARING 选项,则需要根据指定的比较字段顺序进行排序(如COMPARING <F1><F2>时,则需要sort by <F1><F2>,而不能是sort by <F2><F1>),才能删除所有重复数据

    9.6.  Text使用Excel打开乱码问题

    如果使用GUI_DOWNLOAD函数下载文本文件,或者是发送邮件的附件,在英文XP操作系统中使用英文Excel软件打开时,请使用 UTF-16LE 编码,否则可能出现乱码情况。

    data:  l_codepage(4) type n .
    data:  l_encoding(20).
    "
    根据编码名获取对应的CodePage
    callfunction'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
        external_name = 'UTF-16LE'
    IMPORTING
        sap_codepage  = l_codepage.
    l_encoding = l_codepage.

    data: convout type ref to cl_abap_conv_out_ce.
    convout = cl_abap_conv_out_ce=>create( encoding = l_encoding ).
    convout->write( data = lv_content )."
    将字符按照l_encoding编码格式转换为X类型(二进制)
    xstr =  convout->get_buffer( ).
    "
    在码流最前面加上编码信息,该编码由文本编辑软件在打开文件时使用

    concatenate cl_abap_char_utilities=>byte_order_mark_little
                     xstr into  xstr in byte mode.

    9.7.  VBFAEKPO联合查询问题

    由于VBFA-POSNN EKPO-EBELP字段的类型相同,但长度不一样(VBFA-POSNN6位的数字类型,而EKPO-EBELP5位数字类型,但VBAP-POSNR行项目号是6位数字类型,不会出现此类问题),所以它们不能进行关联查询,相似的还有VBFA- POSNV也是6位的。下面这个关联查询是查不出数据的,只能分两次查询:

    SELECT SINGLE vbeln posnn txz01 menge
     
    INTO (it_result-ebeln, it_result-ebelp, it_result-txz01 , it_result-menge_2)

     
    FROM vbfa AS
    v INNER JOIN ekpo AS e ON v~vbeln = e~ebeln AND v~posnn = e~ebelp AND e~knttp = 'E'"Where条件是根据销售单查找前置单据——采购单,V为采购单凭证类型
     
    WHERE  vbelv = it_result-vbeln AND posnv = it_result-posnr  AND vbtyp_n = 'V'.

    HNTTP:采购凭证中的帐户设置类型,E——生产/销售所需物料的采购

    分成两个可以正常查询:

    SELECT SINGLE vbeln posnn
     
    INTO (it_result-ebeln, it_result-ebelp)

     
    FROM vbfa AS v"Where条件是:先根据销售单查找到前置采购单的单号与行项目号
      WHERE  vbelv = it_result-vbeln AND posnv = it_result-posnr  AND vbtyp_n = 'V'.

    SELECT SINGLE  txz01 menge
     
    INTO (it_result-txz01, it_result-menge_2)

     
    FROM ekpo"Where条件是:再根据前面查出来的采购单号与行项目号,查出EKPO其他详细信息
     
    WHERE  ebeln = it_result-ebeln AND ebelp = it_result-ebelp AND knttp
    = 'E'.