ABAP选择屏幕建议

0

Posted by admin | Posted in 其它 | Posted on 26-07-2008

    选择屏幕是用户使用报表等大多数程序的第一步,选择屏幕的显示、操作非常丰富,看似简单,但是若不加以统一,一个项目中的程序将会是五花八门。为了改进用户体验,我在写程序的第一部,规范了选择屏幕的定义,设想如下,并且通过Check List检查各个可能出现的问题,斟酌中。大家有什么好的意见请留言。
    如下图所示:报表选择屏幕规范如下,只有一个F8 Execute按钮和一个Information按钮,这两个按钮都是自动的,F8按钮执行报表,Information按钮打开的是程序的文档。因此同时要求,程序员开发程序的时候为程序创建文档,文档内容有业务顾问协助完成。
    选择条件按块区分,按重要程度依次向下排列,复杂的选择屏幕可在此基础上分类后放在块中,依次摆放在选择屏幕上。
    可参照以下图示:必填选择条件放在最上面,可选放在下面,或分类放在下面。

abap-7-1

      一组业务含义的Checkbox或Radiobutton要放在一行。     数据量很小的如10个以内的字段,且是单值输入的话可以使用dropdown list输入。 

abap-7-2

    所有字段都必须有Search Help,尽量使用标准的,标准若不能满足,则自建Search Help。  如果报表有比较高的Performance要求,或本身逻辑复杂,性能较低,应增加部分额外的限制,如单据日期等缩小取数范围。 Authority Check,涉及到权限的字段应在选择屏幕上作为一个条件,在选择屏幕中检查权限给予提示信息。 Selection Screen Check List

Checklist

ABAP程序在线文档是否完备?

选择条件字段文本在相应的语言环境下是否正确?

选择条件字段必填、非必填设定是否合理?

选择条件是否按照重要程度、分类分块显示?

选择条件自上而下的排列顺序是否按重要程度排列?

Parameters和Select-option的选用是否合理?

SELECT-OPTIONS的NO-EXTENSION, NO INTERVALS设定是否合理?

选择条件字段是否设定了合理的MEMORY ID?

选择条件字段是否设定了合理的默认值?

选择条件是否会引起某些性能问题?

一组业务功能的CHECKBOX或RADIOBUTTON是否排成一行?

是否有Parameters字段可以设置为LISTBOX?

是否每个字段都有合适的Search Help?

选择条件的有效性是否进行了必要的检查?

涉及到权限检查的字段是否作为选择条件了?

所有的权限检查逻辑是否都在AT SELECITON-SCREEN完成了?

LIST-PROCESSING命令的使用

0

Posted by admin | Posted in 其它 | Posted on 26-07-2008

List-Processing用于在程序中任意地方开始List输出,可以放在代码的任何地方。LEAVE TO LIST-PROCESSING 这段命令做两件事:

切换到List输出模式

在这种模式下,标准的List输出所用到的命令:WRITE, ULINE, SKIP等全部可以使用,还包括AT LINE-SELECTION事件、功能码(Function keys)、20 个list level等。

将显示List 输出的屏幕设置为当前调用处的下个屏幕(Following Screen)

程序将离开当前屏幕进入List输出的屏幕,进行接下来的操作,但是Leave screen之后,仍将返回前一个调用Leave to list-processing这条命令屏幕的代码的下一行继续执行。示例代码写在最后了,下面说明一下重要的地方:

LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
PERFORM EDIT_LIST.
LEAVE SCREEN.

注意这一段代码,第一行的作用前面已经说过了,逻辑将转入下一屏幕(不是普通屏幕,是特殊屏幕)。第二行是一个子程序,在这里面要特别注意的是

  1. 设置STATUS, "SET PF-STATUS ‘XXXX’",如果不设置的话,会把调用该语句的屏幕的STATUS继承过去。
  2. 在设置STATUS之后,用WRITE等命令输出。
  3. LIST屏幕上的按钮响应目前还没研究明白,明白人请留言,谢谢!

LIST-PROCESSING的工作过程

运行时,MODULE-POOL放弃屏幕的控制权,可以执行LIST 输出代码,如WRITE等。我们可以选择让LIST输出屏幕替代当前屏幕,或者是作为下一个屏幕,但是不管是哪一种方式,LIST输出的屏幕将在当前屏幕逻辑执行完(LEAVE SCREEN或PAI执行完之时)之后显示,也就是说,WRITE等命令仍然是将输出的东西暂存在缓存中。

LIST输出作为下一个屏幕

将LEAVE TO LIST-PROCESSING放在PAI中,当LIST屏幕执行完之后,系统将重新进入当前屏幕PBO逻辑,显示屏幕。

LIST输出替换当前屏幕

将LEAVE TO LIST-PROCESSING放在PBO中,并以LEAVE SCREEN命令结束当前屏幕逻辑。这种情况下,当前屏幕将被替换,不再显示。

R/3系统中有一个DEMO:可以通过TCODE: TZ70运行。参考:SAP Online Help

**** ABAP module and form: ****

MODULE PREPARE_LIST OUTPUT.
LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
PERFORM EDIT_LIST.
LEAVE SCREEN.
ENDMODULE.

FORM EDIT_LIST.
SET PF-STATUS ‘LIST’.
SET TITLEBAR ‘LST’ WITH SFLIGHT-CONNID SFLIGHT-CARRID.

NEW-PAGE LINE-SIZE 72.
SELECT * FROM SFLIGHT WHERE CARRID = SFLIGHT-CARRID
AND CONNID = SFLIGHT-CONNID.
WRITE: / SY-VLINE NO-GAP,
SFLIGHT-FLDATE COLOR 4 INTENSIFIED OFF NO-GAP,
SY-VLINE NO-GAP,
SFLIGHT-PRICE COLOR 2 INTENSIFIED OFF NO-GAP,
…….
ENDFORM.

在ABAP中用EVAL_FORMULA执行Javascript进行公式计算

0

Posted by admin | Posted in 其它 | Posted on 26-07-2008

      最近在做一个报表,统计仓储费用,但是由于仓储费用条目差异很大,不同条目的计算方法不同,并且存在一些换算关系,最后我决定让用户自己编辑公式。

      一开始想到使用公式是因为EXCEL中的CELL有公式计算的功能,如果用ABAP实现,期初想自己写个程序解析公式,匹配变量后得到结果,这样做的话比较麻烦,得写一个公式解析器。后来想到让用户编辑符合ABAP代码的公式,动态生成子程序,但是这样做也不太现实,后来查资料发现有人已经想到过,的确不好用。

      最后我们想到的办法是让用户编辑JAVASCRIPT公式,用ABAP调用JAVASCRIPT解析器,计算表达式。

方法1:直接调用JAVASCRIPT PROCESSOR CLASS: cl_java_script

方法2:使用FUNCTION: EVAL_FOMULA

转帖一段代码:(原文:如何根据动态公式计算数据

方法一

report ZDEMO_COMPILE.
data jj type i.
perform Dynamicformula  using ‘ 900 + 7  % 3 ‘ jj.
write / jj.
perform Dynamicformula  using ‘ 900 + ( 7 + 10 )  % 3 ‘ jj.
write / jj.
perform Dynamicformula  using ‘ 900 * 30 + ( 7 + 10 )  % 3 ‘ jj.
write / jj.
*&———————————————————————*
*&      Form  Dynamicformula
*&———————————————————————*
*       text
*———————————————————————-*
*      –>SOURCE     text
*      –>RE         text
*———————————————————————-*
FORM Dynamicformula using  formula type STRING
                    changing re type I.
  data source type string.
  data return_value type string.
  data js_processor type ref to cl_java_script.
  js_processor = cl_java_script=>create( ).
  concatenate
    ‘result = ‘
    formula
     ‘;’
   into source.
  RETURN_VALUE = js_processor->evaluate( source ).
  re = RETURN_VALUE.
ENDFORM.                    "Dynamicformula

方法二
CALL FUNCTION ‘EVAL_FORMULA’
  EXPORTING
    FORMULA                       = ‘ ( 9 * 10 + ( 7 + 10 ) * 2 )  div 3  ‘
IMPORTING
   VALUE                         = jj
          .
write / jj.

用MB51作为物料凭证编号搜索帮助

0

Posted by admin | Posted in 其它 | Posted on 26-07-2008

      SAP ABAP程序的选择屏幕字段的搜索帮助通常来讲,我们是通过DICTIONARY创建的SEARCH HELP或DOMAIN上的CHECK TABLE等继承而来,某些情况下我们在定义PARAMETERS的时候使用MATCHCODE OBJECT指定特定的搜索帮助。除此之外,还有一些特殊的搜索帮助,采用了一些特别的方法,比如在标准程序中物料凭证编号,使用的就是MB51的程序,示例代码如下:

CONSTANTS: C_X TYPE C VALUE ‘X’.
PARAMETERS:P_MBLNR TYPE MKPF-MBLNR.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_MBLNR.  
  EXPORT C_X TO MEMORY ID ‘MB51_FLAG’.
  CALL TRANSACTION ‘MB51′.
  GET PARAMETER ID ‘MBN’ FIELD P_MBLNR.

如此,再通过MB51的选择屏幕选出物料凭证清单后,双击某张凭证后就返回到先前的选择屏幕,物料凭证编号就填好了。

ABAP DESCRIBE Keyword Usage All in One

0

Posted by admin | Posted in 其它 | Posted on 25-07-2008

The DESCRIBE keyword in ABAP Language is used to get what an object looks like. You can use this keyword statment to specify a lot of properties of a data object at runtime. The variant of DESCRIBE is listed below:

  • DESCRIBE FIELD (Field properties)
  • DESCRIBE TABLE (Properties of an interal table)
  • DESCRIBE DISTANCE (Distance between of two fields)
  • DESCRIBE LIST (Properties of lists in list buffer)

Do take care of one thing:

"The statement DESCRIBE is basically used to specify the properties of data objects of elementary data types. If DESCRIBE is used for structures or data objects of deeper data types like strings, internal tables, or reference variables, only elementary properties can be specified. Additional information, for example, the static or dynamic type of a reference variable cannot be determined by DESCRIBE. For this information, you must use the type classes of the Run Time Type Services(RTTS), which allow the specification all properties of data objects of all data types. Since the functions of the RTTS type classes comprise the complete functions of the DESCRIBE statement, the system classes can be used instead of the statement." By SAP Help

DESCRIBE FIELD dobj
  [TYPE typ [COMPONENTS com]]
  [LENGTH ilen IN {BYTE|CHARACTER} MODE]
  [DECIMALS dec]
  [OUTPUT-LENGTH olen]
  [HELP-ID hlp]
  [EDIT MASK mask].

  •   [TYPE typ [COMPONENTS com]] is used to specify the elementary type of a data object , you can get a one char identification. The addition tells you how many direct components are there in the data object.
  • [LENGTH ilen IN {BYTE|CHARACTER} MODE] is used to specify how many characters(capacity, not actual chars number) in bytes or characters MODE are there in the data objects.
  • [DECIMALS dec] The number of decimal places of the data object.
  • [OUTPUT-LENGTH olen] is used to to specify the output length on the screen of a data object . For string, the result is always 0.
  • [HELP-ID hlp] is used to specify the reference table and component of an elementary data ojbect. The result is a struc-comp like char string. You can spilt it into 2 data, and use ‘F4IF_FIELD_VALUE_REQUEST’ function to call f4 help screen.
  • [EDIT MASK mask] is used to specify the edit mask of a data object. This can be used to write a number as time format.

DESCRIBE TABLE itab [KIND knd] [LINES lin] [OCCURS n].

  • [KIND knd] is used to specify the table kind, which is one of T(Standard) S(Sorted) H(Hashed).
  • [LINES lin] is used to specify the line count of an internal table.
  • [OCCURS n] is used to specify the initial size of an internal table.

DESCRIBE DISTANCE BETWEEN dobj1 AND dobj2 INTO dst IN {BYTE|CHARACTER} MODE.

  • This is used to specify the distance of two component’s start position in one structure in byte or character MODE.

DESCRIBE LIST DESCRIBE LIST { {NUMBER OF {LINES|PAGES} n}
              | {LINE linno PAGE page}
              | {PAGE pagno page_properties} }
              [INDEX idx].

page_properties:

… [LINE-SIZE width]
    [LINE-COUNT length]
    [LINES lines]
    [FIRST-LINE first_line]
    [TOP-LINES top_lines]
    [TITLE-LINES title_lines]
    [HEAD-LINES header_lines]
    [END-LINES footer_lines] … .

This statment is used to get the attributes of list buffer, these attributes can be defined on the top of a program.

Here is some demo code attached:

DESCRIBE FIELD

*————————————————————*
* Demo code for describe field statement by www.imlex.net    *
*————————————————————*

DATA: BEGIN OF STRUC1,
        COMP1 TYPE C LENGTH 1,
        COMP2 TYPE STRING,
        BEGIN OF STRUC2,
           COMP1 TYPE C LENGTH 1,
          COMP2 TYPE I,
        END OF STRUC2,
        COMP3(10) TYPE P DECIMALS 2,
        COMP4 TYPE SY-DATUM,
        COMP5 TYPE S_FLTIME,
      END OF STRUC1,
      TYP1  TYPE C LENGTH 1,
      COMP1 TYPE I,
      TYP2  TYPE C LENGTH 1,
      COMP2 TYPE I,
      LEN1 TYPE I,
      LEN2 TYPE I,
      DECM TYPE I,
      OUTL TYPE I,
      HLPD(30) TYPE C,
      MASK TYPE STRING.

DESCRIBE FIELD: STRUC1        TYPE TYP1 COMPONENTS COMP1,
                STRUC1-STRUC2 TYPE TYP2 COMPONENTS COMP2.

DESCRIBE FIELD: STRUC1-COMP1 LENGTH LEN1 IN BYTE MODE,
                STRUC1-COMP1 LENGTH LEN2 IN CHARACTER MODE.

DESCRIBE FIELD: STRUC1-COMP3 DECIMALS DECM,
                STRUC1-COMP3 OUTPUT-LENGTH OUTL.

DESCRIBE FIELD: STRUC1-COMP4 HELP-ID HLPD,
                STRUC1-COMP5 EDIT MASK MASK.

*————————————————————*
* End of demo code for describe field statement.             *
*————————————————————*

DESCRIBE TABLE & DESCRIBE DISTANCE

*————————————————————*
* Demo code for describe table statement by www.imlex.net    *
*————————————————————*  

TYPES: BEGIN OF X_ITAB,
        FIELD1 TYPE I,
        FIELD2(6) TYPE C,
        FIELD3(10) TYPE P DECIMALS 2,
      END OF X_ITAB.
DATA: T_ITAB TYPE STANDARD TABLE OF X_ITAB INITIAL SIZE 20 WITH HEADER LINE.
DATA: KND TYPE C,
      LINE TYPE I,
      ONN TYPE I,
      DIS1 TYPE I,
      DIS2 TYPE I.

DESCRIBE TABLE T_ITAB KIND KND LINES LINE OCCURS ONN.

DESCRIBE DISTANCE BETWEEN:
         T_ITAB-FIELD1 AND T_ITAB-FIELD3 INTO DIS1 IN BYTE MODE,
         T_ITAB-FIELD1 AND T_ITAB-FIELD3 INTO DIS2 IN CHARACTER MODE.
*NOTES: You can only use describe distance statment on a structure
*       or table header line. A type or a no header table doesn’t work.

*————————————————————*
* End of demo code for describe table statement.             *
*————————————————————*

DESCRIBE LIST