• ABAP代码:
    SELECT  *
    FROM
    BKPF
    WHERE BUKRS = '1000' AND
    BELNR BETWEEN '0100029201' AND  '0100029301' AND
    GJAHR = '2009'

    经ST05跟踪后,实际转换为Oracle的查询语句:
    SELECT
      *
    FROM
      "BKPF"
    WHERE
      "MANDT" = '300' AND "BUKRS" = '1000' AND "BELNR" >= '0100029201' AND "BELNR"
      <= '0100029301' AND "GJAHR" = 2009
    注意后面代码的黑体部分少了引号,在SAP的数据字典里面,BKPF-GJAHR字段的类型为NUMC,实际在Oracle里面是VARCHAR2,Open Sql转换为Oracle Sql之后,GJAHR的实际值2009由字符类型变成了数字类型。

    有什么影响呢?

    在这个语句的执行计划里面,带引号的语句,执行计划选择的索引是BKPF~0,而在SAP转换后的语句里面,执行计划选择了索引BKPF~BUT,这时候查询的速度非常慢,即使你只查询2个订单。

    解决方案?

    目前还没有想到根本的解决方法。我的同事用个临时方法,他把凭证范围的号码一个罗列,把BETWEEN条件变成了IN('0100029201', '0100029202'),这样执行计划就正确的使用了BKPF~0

  • chapter 8 可维护性
    维护性高程序的标志:面对同一个需求,更改代码少,花费时间少。
    可维护性差的原因:代码可读性差,结构不合理,同一功能重复出现。
    为什么需要可维护性:由于需求的变更,程序需要在开发后由不同的人不断维护,而维护工作占IT预算的很大比例。

    8.1 SAP标准软件的可维护性
     8.1.1 OSS Notes
     使用Note Assistant的好处
      不要申请Change Key
      自动更改源代码(FM的接口参数、ABAP Dictionary修改必须ABAP开发人员人工进行)
      检查notes是否与当前的版本和补丁包匹配
      检查系统中是否有应用notes的需要的前置notes,如果没有自动导入和应用。
      在系统升级或打补丁包的时候,在SPAU和SPDD两个事务码中,可以检测已经应用的nots哪些是新版本仍需使用的,并自动应用这些notes

     8.1.2 客户修改
     SAP预置的修改方式,这要做升级后用户的修改和SAP标准程序仍可以和平共处。
      USER EXIT: 在软件预定的位置,引用一个在INCLUDE文件中的子程序,例如MV45AFZZ
      Ehancement:R3 3.1引入,使用SMOD/CMOD管理,在系统中以Function Moudule的方式体现,在标准程序中使用CALL CUSTOMER-FUNCTION调用。Ehancement以项目的方式组织、激活和禁用。在系统升级时,可以临时禁用Ehancement测试标准功能是否按照期待的方式运行。
      BADI: 以面向对象方式实现,可以由第三方公司创建,使用SE18/SE19管理。如果设置为multiple use,可以有多个活动的Implementation。使用filter功能,可以在运行时从多个Implementation中进行选择执行。
     
     修改SAP系统源代码,升级后由于SAP修改了源代码,可能已做的修改无法正常运行。
      尽可能使用Modification Assistant修改源代码,这样在升级的使用SE95可以管理所有的Modification。使用Modification Assistant的修改,可以在SPAU中系统自动识别出来,如果新版本允许此修改,这个修改可以重新应用。
      尽量在SAP源程序修改少量代码,具体的实现放在INCLUDE子程序中。

    8.2 自开发ABAP软件的可维护性
    8.2.1 Separating Different Actions, 不知道如何翻译,实际的含义就是模块化
    程序的可维护性主要取决于程序的组织方式,有经验的开发人员会将处理语句分组划分,封装到form,function module或method中。
    子程序的命名应该是自解释的,比较好的方式是动词+名词的命名,如read_data, process_date。
    备注:个人认为作者的举例不恰当,规则是对的,但是太简单,需要细化。
    报表程序的可重用性:一般情况下,报表输出部分不应该和数据的选择、处理、更新部分混在一起,否则程序无法重用。最好使用Function Moudle的方式进行封装,目前SAP的web话报表大多是使用了RFC技术,逐渐使用了一些method的方式。
    module pool程序的可维护性:与报表重用的原则是一致,但更加困难。原因是module pool程序的组织方式把响应界面和业务逻辑代码经常混在一起。module pool程序web化的是不合算的(成本太高),新的替代webdynpro技术会强制分离界面处理和业务逻辑代码。

    8.2.2 提高可读性
    命名规则:不要需求完美的命名规则,更重要的是开发团队持续遵守同一规则。命名规则可以参考abap开发之外的领域。

  • SU20: 维护授权字段

    SU21: 维护权限对象

    SU24: 维护权限对象和事务码的关系

  • 以前碰到过类似的情况,记不清怎么处理了,依稀记得是重新传输了几次才解决。

    这次在PRD系统的处理办法是:

    1、查看传输日志,没有错误信息。

    2、重新激活程序,失败。

    3、重新激活Report Text,失败。

    当我想生成新的传输申请号重新传输的时候,同事建议我重新激活屏幕试一下。

    4、在SE38中打开报表默认的屏幕1000,重新激活,OK!

  • 后台配置:SPRO -> Production -> Shop Floor Control -> System Modifications -> Enhancements for Order Maintenance

    PPCO0005: Determination for storage location and backflushing when order is created. It is only used during BOM explosion (that is when
    you create an order with CO01 or read master data) or if components are copied from a planned order to a production order.

    notes 126881, Storage location is determinated by these settings:
    1. work center
    2. bill of material
    3. material master

    PPCO0008  Enhancement for adding and changing components.

    PS: use transaction OMK0 to maintance Production Supply Area