宏与子程序

时间:2015-11-12 15:30:22

标签: macros sap abap

我试图了解在哪种情况下使用宏或子程序是一个更好的主意。

例如,我正在创建一个程序来解析一个巨大的xml,它有数百个字段和属性,我正在定义子程序和宏来获取那些节点,属性等。所以这些子程序(或宏)被称为 数千次

以下是我可以使用的示例子例程和宏;

MACRO

DEFINE xml_get_code_att_2.
  node = xml_node_iterator->get_next( ).
  while node is not initial.
    if lv_lastchild is not initial and node->get_name( ) eq lv_lastchild.
      xml_node_iterator = xml_node->create_iterator( ).
      exit.
    endif.
    if node->get_name( ) = &1.
      clear: list, nodee.
      list = node->get_attributes( ).
      nodee = list->get_named_item( 'listID' ).
      if nodee is not initial.
        &2 = nodee->get_value( ).
      endif.
    node = xml_node_iterator->get_next( ).
  endwhile.
  if node is initial.
    xml_node_iterator = xml_node->create_iterator( ).
  endif.
END-OF-DEFINITION

SUBROUTINE

FORM xml_get_code_att_2 USING p_name CHANGING p_listid
  node = xml_node_iterator->get_next( ).
  temp = node->get_name( ).
  while node is not initial.
    if lv_lastchild is not initial and node->get_name( ) eq lv_lastchild.
      xml_node_iterator = xml_node->create_iterator( ).
      exit.
    endif.
    if node->get_name( ) = p_name.
      clear: list, nodee.
      list = node->get_attributes( ).
      nodee = list->get_named_item('listID' ).
      if nodee is not initial.
        p_listid = nodee->get_value( ).
      endif.
    endif.
    node = xml_node_iterator->get_next( ).
  endwhile.
  if node is initial.
    xml_node_iterator = xml_node->create_iterator( ).
  endif.
endform.

那么哪一个更好用?

2 个答案:

答案 0 :(得分:10)

理解差异很重要:宏在编译时处理,而表单(您可能更好地使用方法)在运行时处理。

至于您询问的建议:使用宏来构造代码。宏是一个痛苦的... ...自然调试。宏最好用于缩短单个指令或短代码片段而无需分支或循环。对于其他一切,请使用方法(或表格,如果必须)。

此外,要解析和处理XML,您可能需要检查现有的框架和技术......

答案 1 :(得分:1)

MACROS无法调试 - 我再也不会使用MACRos了。 MACROS是以前的R2 - 来自SAP的主机世界的一些遗留问题。

使用宏可以实现真正难看的东西。有一个表trmac放置宏。如果他们不知道TRMAC表,您可以在任何abap代码中使用这些宏并驱动其他gracy。这是SAP 80的编程风格。不要那样做。