首页 文章

如何在ABAP中声明和循环内部表并对条件执行操作?

提问于
浏览
0

我不知道ABAP - 但我的同事(也不知道它)向我展示了他提出的一些代码,它包含了太多if-statements . 在JavaScript中,我可以改进它但在ABAP中我有点迷失,因为我错过了我的数组;) . 我发现使用了内部表格 . 但我仍然无法弄明白 .

代码放在由EPI-USE制作的查询管理器的列中 . 这只是一种调整查询结果的方法,我注意到如果我尝试创建报告("already in a program")并且创建一个类或方法("close try-catch-block before declaring new Class"),我会收到错误 .

问题非常简单:

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

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并遵循以下规则:

Conditions:

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

如果 PA0013 -Value为空,则必须将 PA0013 -Values设置为空(不是前面的值) .

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

After the first Loop:

如果任何 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填充它们 .

1 回答

  • 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.
    

相关问题