Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HR信息类型itab行的条件循环清除?_Javascript_Loops_Abap_Internal Tables_Sap Hr - Fatal编程技术网

Javascript HR信息类型itab行的条件循环清除?

Javascript HR信息类型itab行的条件循环清除?,javascript,loops,abap,internal-tables,sap-hr,Javascript,Loops,Abap,Internal Tables,Sap Hr,我不知道ABAP——但我的同事(也不知道)给我看了一些他想出的代码,其中包含了太多的if语句。 在JavaScript中,我本可以改进它,但在ABAP中,我有点迷失了,因为我缺少数组;)。我发现使用的是内部表。但我还是不明白 代码放置在EPI-USE创建的查询管理器的列中。 这只是一种调整查询结果的方法,我注意到如果我试图创建一个报告(“已经在程序中”)和创建一个类或方法(“在声明新类之前关闭try-catch块”),就会出现错误 问题非常简单: 有一个人有很多属性,值是数字。这些是属性 PA0

我不知道ABAP——但我的同事(也不知道)给我看了一些他想出的代码,其中包含了太多的if语句。 在JavaScript中,我本可以改进它,但在ABAP中,我有点迷失了,因为我缺少数组;)。我发现使用的是内部表。但我还是不明白

代码放置在EPI-USE创建的查询管理器的列中。 这只是一种调整查询结果的方法,我注意到如果我试图创建一个报告(“已经在程序中”)和创建一个类或方法(“在声明新类之前关闭try-catch块”),就会出现错误

问题非常简单:

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

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
-值为空,则必须将以下所有
PA0013
-值设置为空(而不是之前的值)

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

在第一个循环之后:

如果任何
PA0000
-值的值为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();
}


他告诉我他将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.
报告ZZZ。
类lcl_主定义最终创建专用。
公共部分。
类方法:
主要的,
拒绝
私人部分。
类型:
从数字开始,
num类型字符串,
结束t_num。
类别数据:
pa0013_01类型t_编号,
pa0013\U 02类型t\U编号,
pa0013\U 03类型t\U编号,
pa0013\U 04类型t\U编号,
pa0013_05型号t_编号,
pa0013_06类型t_编号,
pa0000_01类型t_数量,
pa0000_02类型t_数量,
pa0000_03型号t_编号,
pa0000_04型号t_编号,
pa0000_05型号t_编号,
pa0000_06型号t_编号,
pa0005类型t_num。
末级。
类lcl_主实现。
方法main。
数据(lt_pa0013)=值字符串_表(
(pa0013_01-num)(pa0013_02-num)(pa0013_03-num)
(pa0013_04-num)(pa0013_05-num)(pa0013_06-num)
).
数据(lt_pa0000)=值字符串_表(
(pa0000_01-num)(pa0000_02-num)(pa0000_03-num)
(pa0000_04-num)(pa0000_05-num)(pa0000_06-num)
).
数据:lt_pa0000_哈希类型排序的字符串表,带有非唯一键表_行。
数据(l_flg_empty_rest)=条件(当pa0005 num 0时,则为abap_false,否则为abap_true)。
在lt_pa0013处循环分配字段-SYMBOL()。
如果是首字母。
l\u flg\u empty\u rest=abap\u true。
恩迪夫。
如果l\u flg\u empty\u rest=abap\u true。
清楚的
lt_pa0000[sy tabix]=空间。
恩迪夫。
结束循环。
lt_pa0000_hash=lt_pa0000。
如果lt_pa0000_散列[`3`]是首字母。
拒绝()。
恩迪夫。
ENDMETHOD。
方法拒绝。
断言0=0。
ENDMETHOD。
末级。

以下是您完成任务的快捷方式

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'.
类型:从hr\U员工开始,
PA0013_rvnum类型PA0013 rvnum,
PA0013_/件PA0013型/件,
PA0000_stat1型PA0000-stat1,
人力资源部员工结束。
数据:hr\U员工的lt\U员工类型表。
最多可选择5行~rvnum a~ pernr o~ stat1
进入表lt\U员工
从pa0000到o
加入pa0013作为一个整体
关于o~pernr=a~pernr。
在lt_员工分配字段-SYMBOL()处循环。
如果-pa0013\u pernr为首字母。
清除-pa0000_stat1。
将lt_employee从值hr_employee(PA0013_pernr=空格)修改为PA0013_pernr,其中PA0013_pernr>-PA0013_pernr。
恩迪夫。
检查-pa0013_rvnum为初始值。
清楚的
结束循环。
删除其中pa0013\U rvnum='3'的lt\U员工。
它建立在这样一个假设之上,即infotypes和use
PERNR
键在表中总是升序的,所以在上面的代码中,它的使用就像一个函数

代码使用的不是水平结构(一行中有许多PERNR),而是垂直结构(每行一个PERNR),行被视为属性元组(PERNR+stat),整个数据集表示一名员工

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


p.S.Reject()函数在标准JS库中使用,因此在生产性开发中使用它,您的代码就变得不那么可移植了,只使用这个自定义库,当然,您会收到更少给出Reject()的答案举个例子。

你能在问题中包含你同事的代码,这样我们就可以对它进行评估吗?为什么你要在数组中写空字符串,而实际上你需要的是数字?因为我不知道它们是哪种类型,我刚才看到的只是数字和“PA0000_01-NUM=”从我同事的代码中,我猜他只是想覆盖这个值,不管我认为我同事的代码太长,与我的核心问题(标题中)无关他所做的只是为每个字段生成一个if语句,这就是他不需要创建内部表的原因,他的代码太长了,因为您已经使用了新的语法,但您可以通过以下方式回到旧语法:读取表lt\u pa0000\u hash WITH table KEY table\u line=
3
不传输任何字段。如果sy subrc为0。拒绝()。@icbytes我试图使用lt\u pa0000\u散列[
'3'
]但不知何故无法完成。如果您知道如何做,那么欢迎对代码进行改进!可能有优先权吗?或者试着四处转转
IF PA0000_01-STAT2 = 03.
    REJECT.
ENDIF.
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'.