如何使用多个字段在内部表上过滤

发布于 2025-01-22 10:22:27 字数 1417 浏览 0 评论 0原文

我的要求是使用多个字段过滤内部表。

CONSTANTS:lc_star TYPE c VALUE '*'.

DATA: lit_x_all    TYPE STANDARD TABLE OF ztt WITH NON-UNIQUE KEY extsystem ccode ekorg werks matkl,
      lit_filter_e TYPE SORTED TABLE OF ztt-extsystem WITH NON-UNIQUE KEY table_line,
      lit_filter_o TYPE SORTED TABLE OF ztt-ekorg WITH NON-UNIQUE KEY table_line,
      lit_filter_c TYPE SORTED TABLE OF ztt-ccode WITH NON-UNIQUE KEY table_line,
      lit_filter_w TYPE SORTED TABLE OF ztt-werks WITH NON-UNIQUE KEY table_line.

SELECT * 
      FROM ztt 
      WHERE a = @i_a
      INTO TABLE @lit_x_all.

LOOP AT i_pit_input INTO DATA(lwa_input).

  "filter to avoid select statement in loop

  lit_filter_e = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-extsystem ) ).
  DATA(lit_final_e) = FILTER #( lit_approver_all IN lit_filter_e WHERE extsystem = table_line ).

  lit_filter_o = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-ekorg ) ).
  DATA(lit_final_o) = FILTER #( lit_final_e IN lit_filter_o WHERE ekorg = table_line ).

  lit_filter_c = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-ccode ) ).
  DATA(lit_final_c) = FILTER #( lit_final_o IN lit_filter_c WHERE ccode = table_line ).

  lit_filter_w = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-werks ) ).
  DATA(lit_final_w) = FILTER #( lit_final_c IN lit_filter_w WHERE werks = table_line ).

ENDLOOP.

目前,我正在为每个字段使用上述代码。我们可以使用单个过滤器而不是多个过滤器达到相同的要求吗?

谢谢 phani

My requirement is to filter internal table using multiple fields.

CONSTANTS:lc_star TYPE c VALUE '*'.

DATA: lit_x_all    TYPE STANDARD TABLE OF ztt WITH NON-UNIQUE KEY extsystem ccode ekorg werks matkl,
      lit_filter_e TYPE SORTED TABLE OF ztt-extsystem WITH NON-UNIQUE KEY table_line,
      lit_filter_o TYPE SORTED TABLE OF ztt-ekorg WITH NON-UNIQUE KEY table_line,
      lit_filter_c TYPE SORTED TABLE OF ztt-ccode WITH NON-UNIQUE KEY table_line,
      lit_filter_w TYPE SORTED TABLE OF ztt-werks WITH NON-UNIQUE KEY table_line.

SELECT * 
      FROM ztt 
      WHERE a = @i_a
      INTO TABLE @lit_x_all.

LOOP AT i_pit_input INTO DATA(lwa_input).

  "filter to avoid select statement in loop

  lit_filter_e = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-extsystem ) ).
  DATA(lit_final_e) = FILTER #( lit_approver_all IN lit_filter_e WHERE extsystem = table_line ).

  lit_filter_o = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-ekorg ) ).
  DATA(lit_final_o) = FILTER #( lit_final_e IN lit_filter_o WHERE ekorg = table_line ).

  lit_filter_c = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-ccode ) ).
  DATA(lit_final_c) = FILTER #( lit_final_o IN lit_filter_c WHERE ccode = table_line ).

  lit_filter_w = VALUE #( ( CONV #( lc_star ) ) ( lwa_input-werks ) ).
  DATA(lit_final_w) = FILTER #( lit_final_c IN lit_filter_w WHERE werks = table_line ).

ENDLOOP.

Currently I am using above code with filter for each field. Can we achieve same requirement with single filter instead of multiple filters?

Thanks
Phani

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失去的东西太少 2025-01-29 10:22:27

表也可以使用表格理解或表达式表达式表达式表达式进行表进行过滤,以供表。操作员过滤器为此特殊情况提供了缩短格式,并且更有效地执行。

就像在您的情况下使用过滤器在您的情况下过滤一样,因为您使用value构造函数有效地发出“恒星案例”和“滤波器值情况”来执行表格理解是更好的选择:

DATA(result) = VALUE #(
  FOR entry IN entries
    WHERE (
      ( a = '*' OR a = filter-a ) AND
      ( b = '*' OR b = filter-b )
      "...
    )
    ( entry )
).

这也应该更快地使用,因为它可以避免产生多个中级内部表。

The documentation states:

Table filtering can also be performed using a table comprehension or a table reduction with an iteration expression for table iterations with FOR. The operator FILTER provides a shortened format for this special case and is more efficient to execute.

As in your case filtering with FILTER does not work as you're effectively ORing the 'star case' and 'filter value case', using the VALUE constructor to perform table comprehension is the better choice:

DATA(result) = VALUE #(
  FOR entry IN entries
    WHERE (
      ( a = '*' OR a = filter-a ) AND
      ( b = '*' OR b = filter-b )
      "...
    )
    ( entry )
).

This should also be by magnitutes faster as it avoids the creation of multiple intermediate internal tables.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文