Chinaunix首页 | 论坛 | 博客
  • 博客访问: 286433
  • 博文数量: 62
  • 博客积分: 2966
  • 博客等级: 少校
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-07 23:16
个人简介

Be a simple man

文章分类

全部博文(62)

文章存档

2012年(6)

2011年(15)

2010年(6)

2009年(3)

2008年(5)

2007年(27)

我的朋友

分类: 项目管理

2011-04-28 15:46:17

In the start routine transformation ZPP_O55->ZPP_C55

*$*$ begin of 2nd part global - insert your code only below this line  *
*begin add by zhangj26 for crd1112 on 26-Apr-2011
*global part data defination and perform in the global part2.
TYPES: BEGIN OF ty_chil,
        children TYPE /bi0/oimaterial,
       END OF ty_chil.

TYPES ty_t_chil TYPE STANDARD TABLE OF ty_chil.

TYPES:  BEGIN OF ty_node,
        node TYPE  /bi0/oimaterial,
        plant TYPE /bi0/oiplant,
        END OF ty_node.

DATA: BEGIN OF tree ,
       plant TYPE /bi0/oiplant,
       node TYPE /bi0/oimaterial,
       t_children TYPE STANDARD TABLE OF ty_chil,
       parent TYPE  /bi0/oimaterial,
       qty TYPE /bic/oizcomp_qty, "QUANTITY
       stock TYPE /bic/oizclabs_n1, " Unrestricted use
       maxbuild TYPE /bic/oizclabs_n2, "max build
      END OF tree.

DATA: t_tree LIKE  STANDARD TABLE OF tree WITH KEY node parent.

DATA: lt_tree LIKE TABLE OF tree WITH KEY node parent,
          wa_tree LIKE LINE OF lt_tree.
*&---------------------------------------------------------------------*
*&      Form  cal_leaf_build
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->leafnode       text
*      -->r_mb           text
*----------------------------------------------------------------------*
FORM cal_leaf_maxbuild USING leafnode LIKE tree
                       CHANGING r_mb TYPE i.
  IF leafnode-qty NE 0.
    r_mb = leafnode-stock /  leafnode-qty.
  ENDIF.

ENDFORM.                    "cal_leaf_maxbuild

*&---------------------------------------------------------------------*
*&      Form  cal_child_maxbuild
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->I_NODE     text
*      -->TREE       text
*      -->MB         text
*----------------------------------------------------------------------*
FORM cal_child_maxbuild USING i_node TYPE /bi0/oimaterial
                              tree LIKE t_tree
                        CHANGING mb TYPE i.
  DATA l_counter  TYPE i.
  DATA l_child    TYPE ty_chil.
  DATA l_cur_node LIKE LINE OF tree[].
  DATA l_tmp TYPE i.
  FIELD-SYMBOLS: LIKE LINE OF tree,
                 LIKE LINE OF tree,
                 TYPE ty_chil.

  CLEAR mb.
  "if the node is a leaf
  READ TABLE tree[]
    WITH KEY node = i_node
    ASSIGNING
    .
  IF sy-subrc = 0 AND -t_children[] IS INITIAL.
    PERFORM cal_leaf_maxbuild USING mb.
    -maxbuild = mb.
  ELSE.
    "Min(maxbuild for children[1]...maxbuild for children[n])
    READ TABLE tree[]
      WITH KEY node = i_node
      INTO l_cur_node.
    CHECK sy-subrc = 0.

    LOOP AT l_cur_node-t_children[] INTO l_child.
      l_counter = sy-tabix.
      READ TABLE tree[]
          WITH KEY node = l_child
          ASSIGNING .
      CHECK sy-subrc = 0.

      IF l_counter = 1.
        PERFORM cal_child_maxbuild USING -node tree
                  CHANGING mb.
        IF -t_children[] IS NOT INITIAL.
          mb =  mb / -qty.
        ENDIF.

      ELSEIF l_counter GT 1.
        PERFORM cal_child_maxbuild USING -node tree
                  CHANGING l_tmp.
        IF -t_children[] IS NOT INITIAL.
          l_tmp = l_tmp / -qty.
        ENDIF.
        IF l_tmp LT mb.
          mb = l_tmp.
        ENDIF.
      ENDIF.
      IF -t_children[] IS NOT INITIAL.
        -maxbuild = mb.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM.                    "cal_child_maxbuild
*$*$ end of 2nd part global - insert your code only before this line   *

************************************************************************
*&---------------------------------------------------------------------
**& Author           : ZHANGJ26
**& mail address     : zhangjiajuan@hotmail.com
**& Create Date      : 2011/04/22
**& Project          : ENT MasterAll BW Report
**& CRD Number       : CRD11112
**&---------------------------------------------------------------------
**local data defination   
    DATA
:   lt_node TYPE STANDARD TABLE OF ty_node,
           w_node TYPE ty_node.

    FIELD-SYMBOLS TYPE _ty_s_sc_1.

    LOOP AT SOURCE_PACKAGE ASSIGNING .
      w_node-node -material.
      w_node-plant -plant.
      APPEND w_node TO lt_node.
      CLEAR w_node.
      w_node-node -component.
      w_node-plant -plant.
      APPEND w_node TO lt_node.
      CLEAR w_node.
    ENDLOOP.

*get all node from the source_package
    SORT lt_node.
    DELETE ADJACENT DUPLICATES FROM lt_node COMPARING node.

*get comp_qty and stock from ZMM_TO57 into lt_mm_to57
    DATAlt_mm_to57 TYPE STANDARD TABLE OF /bic/azmm_to5700.
    IF NOT lt_node[] IS INITIAL.
      SELECT *
      FROM /bic/azmm_to5700
      INTO CORRESPONDING FIELDS OF TABLE lt_mm_to57
      FOR ALL ENTRIES IN lt_node
      WHERE mat_plant lt_node-node AND
            plant lt_node-plant.
      IF sy-subrc 0.
        SORT lt_mm_to57 BY mat_plant plant.
      ENDIF.
    ENDIF.

* build tree
    DATAlt_children TYPE ty_t_chil.
    FIELD-SYMBOLS TYPE ty_node.
    FIELD-SYMBOLS TYPE /bic/azmm_to5700.

    LOOP AT lt_node INTO w_node.
      wa_tree-node w_node.
      LOOP AT SOURCE_PACKAGE ASSIGNING  WHERE material =
      w_node-node.
        IF sy-subrc 0.
          APPEND -component TO lt_children.
        ENDIF.
      ENDLOOP.
      wa_tree-t_children lt_children.
      REFRESH lt_children.

      READ TABLE SOURCE_PACKAGE ASSIGNING  WITH KEY component =
      wa_tree-node.
      IF sy-subrc 0.
        wa_tree-parent -material.
      ELSE.
        CLEAR wa_tree-parent.
      ENDIF.
      wa_tree-plant -plant.
      wa_tree-qty -/bic/zcomp_qty.

      READ TABLE lt_mm_to57 ASSIGNING  WITH KEY mat_plant =
      wa_tree-node
                                                         plant =
                                                         wa_tree-plant
                                                         BINARY SEARCH.
      IF sy-subrc 0.
        wa_tree-stock -/bic/zclabs.
      ELSE.
        CLEAR wa_tree-stock.
      ENDIF.
      APPEND wa_tree TO lt_tree.
      CLEAR wa_tree.
    ENDLOOP.

*recursive algorithm to cal the maxbuild.
    FIELD-SYMBOLS LIKE LINE OF t_tree.
    DATAmax_build TYPE i.
    LOOP AT lt_tree ASSIGNING .
      IF -parent IS INITIAL.
        PERFORM cal_child_maxbuild USING -node
                                         lt_tree
                                   CHANGING max_build.
        -maxbuild max_build.
        clear max_build.
        EXIT.
      ENDIF.
    ENDLOOP.
*$*$ end of routine - insert your code only before this line         *-*
  ENDMETHOD.                

************************************************************************

阅读(1319) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~