1

我不知道 ABAP - 但我的同事(也不知道)向我展示了他提出的一些代码,其中包含太多的 if 语句。在 JavaScript 中我可以改进它,但在 ABAP 中我有点迷失,因为我错过了我的数组;)。我发现使用的是内部表格。但我还是想不通。

代码放置在 EPI-USE 制作的查询管理器的列中。这只是一种调整查询结果的一种方法,我注意到如果我尝试创建报告(“已经在程序中”)并且如果我创建一个类或方法(“关闭 try-catch-block在声明新类之前”)。

问题非常简单:

有一个人有很多属性,值是数字。这些是属性

PA0013-RVNUM

PA0013_01-PERNR    
PA0013_02-PERNR
PA0013_03-PERNR
PA0013_04-PERNR
PA0013_05-PERNR    
PA0013_06-PERNR

PA0000_01-STAT2    
PA0000_02-STAT2
PA0000_03-STAT2    
PA0000_04-STAT2
PA0000_05-STAT2
PA0000_06-STAT2

我想循环通过 PA0013-Block 并遵循以下规则:

条件:

如果PA0013-RVNUM为空,则所有其他属性都必须设置为空。

如果-ValuePA0013为空,则所有以下PA0013-Values 都必须设置为空(而不是前面的)。

如果PA0013-Value 为空,则必须将相应的PA0000-Value 设置为空。

第一个循环之后:

如果任何PA0000-Values 的值为 3,则执行命令REJECT.以将行从结果中踢出。

我的 JS 代码如下所示:

var pa0013Array=[    
    PA0013_01-NUM
    PA0013_02-NUM
    PA0013_03-NUM
    PA0013_04-NUM
    PA0013_05-NUM
    PA0013_06-NUM];
var pa0000Array=[ 
    PA0000_01-NUM
    PA0000_02-NUM
    PA0000_03-NUM
    PA0000_04-NUM
    PA0000_05-NUM
    PA0000_06-NUM];
var emptyRest = (PA0005-NUM) ? false : true;

for (var i = 0;i < pa0013Array.length;i++)
{
    if (pa0013Array[i] == "") {
        emptyRest = true;
    }
    if (emptyRest) {
        pa0013Array[i]="";
        pa0000Array[i]="";
    }
}
if (pa0000Array.indexOf(3) != -1) { 
    reject();
}

有人可以通过将我的 js 代码“翻译”成 ABAP 来帮助我吗?

我的同事在所有条件下都做了这样的事情:

IF PA0013-RVNUM is INITIAL.
  PA0013_01-PERNR = ''.
  PA0013_02-PERNR = ''.
  PA0013_03-PERNR = ''.
  PA0013_04-PERNR = ''.
  PA0013_05-PERNR = ''.
  PA0013_06-PERNR = ''.
ENDIF.
IF PA0013_01-PERNR = ''.
  PA0013_02-PERNR = ''.
  PA0013_03-PERNR = ''.
  PA0013_04-PERNR = ''.
  PA0013_05-PERNR = ''.
  PA0013_06-PERNR = ''.
ENDIF.

...

IF PA0013_01-PERNR = ''.
  PA0000_01-STAT2 = ''.
ENDIF.

...

IF PA0000_01-STAT2 = 03.
    REJECT.
ENDIF.

他告诉我他将 PERNR 设置为空,以便查询不会用错误的 PERNR 填充它们。

4

2 回答 2

2

这是这个程序的样子。完全不能保证它可以正常工作并执行您的 JavaScript 所做的事情。

REPORT ZZZ.

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      main,
      reject.
  PRIVATE SECTION.
    TYPES:
      BEGIN OF t_num,
        num TYPE string,
      END OF t_num.
    CLASS-DATA:
      pa0013_01 TYPE t_num,
      pa0013_02 TYPE t_num,
      pa0013_03 TYPE t_num,
      pa0013_04 TYPE t_num,
      pa0013_05 TYPE t_num,
      pa0013_06 TYPE t_num,
      pa0000_01 TYPE t_num,
      pa0000_02 TYPE t_num,
      pa0000_03 TYPE t_num,
      pa0000_04 TYPE t_num,
      pa0000_05 TYPE t_num,
      pa0000_06 TYPE t_num,
      pa0005 TYPE t_num.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD main.
    DATA(lt_pa0013) = VALUE string_table(
      ( pa0013_01-num ) ( pa0013_02-num ) ( pa0013_03-num )
      ( pa0013_04-num ) ( pa0013_05-num ) ( pa0013_06-num )
    ).
    DATA(lt_pa0000) = VALUE string_table(
      ( pa0000_01-num ) ( pa0000_02-num ) ( pa0000_03-num )
      ( pa0000_04-num ) ( pa0000_05-num ) ( pa0000_06-num )
    ).
    DATA: lt_pa0000_hash TYPE SORTED TABLE OF string WITH NON-UNIQUE KEY TABLE_LINE.
    DATA(l_flg_empty_rest) = COND #( WHEN pa0005-num <> 0 THEN abap_false ELSE abap_true ).

    LOOP AT lt_pa0013 ASSIGNING FIELD-SYMBOL(<fs_pa0013>).
      IF <fs_pa0013> IS INITIAL.
        l_flg_empty_rest = abap_true.
      ENDIF.
      IF l_flg_empty_rest = abap_true.
        CLEAR <fs_pa0013>.
        lt_pa0000[ sy-tabix ] = space.
      ENDIF.
    ENDLOOP.

    lt_pa0000_hash = lt_pa0000.

    IF lt_pa0000_hash[ `3` ] IS INITIAL.
      reject( ).
    ENDIF.
  ENDMETHOD.

  METHOD reject.
    ASSERT 0 = 0.
  ENDMETHOD.
ENDCLASS.
于 2016-02-29T16:23:35.123 回答
0

这是您的任务的快速拍摄。

TYPES: BEGIN OF hr_employee,
        PA0013_rvnum TYPE pa0013-RVNUM,
        PA0013_pernr TYPE pa0013-pernr,
        PA0000_stat1 TYPE pa0000-stat1,
       END OF hr_employee.

DATA: lt_employee TYPE TABLE OF hr_employee.

SELECT a~rvnum a~pernr o~stat1 UP TO 5 ROWS
  INTO TABLE lt_employee
  FROM pa0000 AS o
  JOIN pa0013 AS a
  ON o~pernr = a~pernr.

LOOP AT lt_employee ASSIGNING FIELD-SYMBOL(<fs_emp>).
  IF <fs_emp>-pa0013_pernr IS INITIAL.
    CLEAR <fs_emp>-pa0000_stat1.
    MODIFY lt_employee FROM VALUE hr_employee( PA0013_pernr = space ) TRANSPORTING pa0013_pernr WHERE pa0013_pernr > <fs_emp>-pa0013_pernr.
  ENDIF.
  CHECK <fs_emp>-pa0013_rvnum IS INITIAL.
  CLEAR <fs_emp>.
ENDLOOP.
DELETE lt_employee WHERE pa0013_rvnum = '3'.

它建立在信息类型pa0000pa0013使用PERNR在表中始终升序的键的假设之上,因此在上面的代码中它像row_number()一样使用。

该代码不像您那样使用水平结构(一行中有许多 PERNR),而是使用垂直结构(每行一个 PERNR),并且将行视为属性元组(pernr + stat),整个数据集代表一个员工。

RVNUM可以为所有元组分配相同的值(例如在您的示例中)或不同的值(例如在我的示例中),此代码对两种情况都应该有效。

PS Reject()函数不包含在标准 JS 库中,因此在生产性开发中使用它会使您的代码不那么可移植,只坚持这个自定义库,当然您会收到更少的答案,例如给出 reject() .

于 2020-12-08T11:04:21.357 回答