HR 信息类型 itab 行的条件循环清除?
Conditional loop clearing of HR infotype itab lines?
我不知道 ABAP - 但我的同事(也不知道)向我展示了他想出的一些代码,其中包含太多 if 语句。
在 JavaScript 中,我本可以改进它,但在 ABAP 中,我有点不知所措,因为我缺少数组 ;)。我发现使用了内部表。但是我还是想不通。
代码放在EPI-USE制作的查询管理器的一列中。
这只是一种调整查询结果的方法,我注意到如果我尝试创建报告 ("already in a program") 并且创建 class 或方法 ("在声明新 Class 之前关闭 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 块并遵循这些规则:
条件:
如果 PA0013-RVNUM
为空,则所有其他属性都必须设置为空。
如果 PA0013
-Value 为空,则所有后续 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 填充它们。
这是这个程序的样子。完全不能保证它的工作原理和你的 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.
这是您的任务的快速截图。
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'.
它建立在信息类型 pa0000 and pa0013 use PERNR
key that is always ascending in table, so in the above code it is used like a row_number().
的假设之上
代码使用的不是像你的水平结构(许多 PERNR 排成一排),而是垂直结构(每行一个 PERNR),并且线被视为属性元组(pernr + stat)并且整个数据集表示一名员工。
RVNUM
可以为所有元组分配相同的值(如在您的示例中)或不同的值(如在我的示例中),此代码对两种情况都有效。
P.S。 Reject() 标准 JS 库中的函数 ,因此在生产性开发中使用它会使代码的可移植性降低,只坚持这个自定义库,当然你以 reject() 为例,将收到较少的答案。
我不知道 ABAP - 但我的同事(也不知道)向我展示了他想出的一些代码,其中包含太多 if 语句。 在 JavaScript 中,我本可以改进它,但在 ABAP 中,我有点不知所措,因为我缺少数组 ;)。我发现使用了内部表。但是我还是想不通。
代码放在EPI-USE制作的查询管理器的一列中。 这只是一种调整查询结果的方法,我注意到如果我尝试创建报告 ("already in a program") 并且创建 class 或方法 ("在声明新 Class 之前关闭 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 块并遵循这些规则:
条件:
如果 PA0013-RVNUM
为空,则所有其他属性都必须设置为空。
如果 PA0013
-Value 为空,则所有后续 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 填充它们。
这是这个程序的样子。完全不能保证它的工作原理和你的 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.
这是您的任务的快速截图。
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'.
它建立在信息类型 pa0000 and pa0013 use PERNR
key that is always ascending in table, so in the above code it is used like a row_number().
代码使用的不是像你的水平结构(许多 PERNR 排成一排),而是垂直结构(每行一个 PERNR),并且线被视为属性元组(pernr + stat)并且整个数据集表示一名员工。
RVNUM
可以为所有元组分配相同的值(如在您的示例中)或不同的值(如在我的示例中),此代码对两种情况都有效。
P.S。 Reject() 标准 JS 库中的函数