Chinaunix首页 | 论坛 | 博客
  • 博客访问: 175133
  • 博文数量: 22
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 11:07
文章分类

全部博文(22)

文章存档

2011年(1)

2009年(2)

2008年(19)

我的朋友

分类:

2008-10-28 21:04:56

BADI:MB_DOCUMENT_BADI
Method:MB_DOCUMENT_UPDATE 
 
*----------------------------物料凭证内表------------------------------*
DATA:BEGIN OF IT_MAT_DOC OCCURS 0 ,
     ZACTYP LIKE ZMMI_OUT_REC-ZACTYP,"业务类型
     MBLNR LIKE MKPF-MBLNR,"物料凭证
     MJAHR LIKE MKPF-MJAHR,"会计年度
     BLDAT like MKPF-BLDAT,"凭证日期
     BUDAT like mkpf-BUDAT,"记账日期
     CPUDT like mkpf-CPUDT,"会计凭证输入日期
     USNAM like mkpf-USNAM,"用户名
     XBLNR like mkpf-XBLNR,"参考凭证号
     BKTXT like mkpf-BKTXT,"抬头文本
     ZEILE like mseg-ZEILE,"行项目
     BWART like mseg-BWART,"移动类型
     MATNR like mseg-MATNR,"物料编码
     WERKS like mseg-werks,"工厂
     LGORT like mseg-LGORT,"存储地点
     UMWRK LIKE MSEG-UMWRK,"收/发工厂
     UMLGO LIKE MSEG-UMLGO,"收/发库位
     MENGE like mseg-MENGE,"数量
     MEINS like mseg-MEINS,"基本单位
     ERFMG like mseg-ERFMG,"输入数量
     ERFME like mseg-ERFME,"输入单位
     LIFNR like mseg-LIFNR,"供应商号
     KUNNR like mseg-KUNNR,"客户号
     EBELN like mseg-EBELN,"采购订单编号
     FLAG(1),
     END OF IT_MAT_DOC.
FIELD-SYMBOLS: LIKE IT_MAT_DOC.



DATA:BEGIN OF ITAB OCCURS 0 ,
     ZACTYP(2),
     MBLNR(10),
     MJAHR(4),
     BLDAT(8),
     BUDAT(8),
     CPUDT(8),
     USNAM(12),
     XBLNR(16),
     BKTXT(25),
     ZEILE(4),
     BWART(3),
     MATNR(18),
     WERKS(4),
     LGORT(4),
     UMWRK(4),
     UMLGO(4),
     MENGE(15),
     MEINS(3),
     ERFMG(15),
     ERFME(3),
     LIFNR(10),
     KUNNR(10),
     EBELN(10),
     END OF ITAB.


data:wa_likp type likp.

DATA:L_VALUE_NEW_EXP LIKE PLFH-MGVGW.

*     文本生成txt定义变量
TYPESBEGIN OF txt_lines,
         line_txt(3000TYPE c,
       END   OF txt_lines.
DATA:  itab_line TYPE STANDARD TABLE OF txt_lines
WITH HEADER LINE.

*----------------------------------------------------------------------*
*                  Variables
*----------------------------------------------------------------------*
DATABEGIN OF headtab OCCURS 0 ,
        length    TYPE i ,
        decimals  TYPE i,
        type_kind TYPE c,
        name(30)  TYPE c,
      END OF headtab.

DATA descr_ref TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS:  TYPE abap_compdescr ,
                ,
                TYPE ANY .
DATA:G_MSG TYPE STRING.
DATA:G_MSGX TYPE XSTRING.

DATA: n TYPE i ,
      str TYPE string ,
      value TYPE string ,
      text1 TYPE c,
      m type i .

DATA:p_FILE TYPE STRING .
DATA:P_SIM_FILE TYPE STRING.

data:P_PATH(255TYPE C value '/usr/sap/trans'.

DATA : BEGIN OF result OCCURS 10,
        text(100),
      END OF  result.
DATA: sys_command(255).


*--------------------------------FTP参数--------------------------------*
DATA : filename(128) .
DATA: mi_key TYPE i VALUE 26101957,
      mi_handle TYPE i,
      slen TYPE i .
DATA: txttab TYPE truxs_t_text_data  .


DATA: l_ftpcommand(100TYPE c.  "FTP命令
data:pr_return         TYPE c.                 "返回参数

DATA: cons_source(128TYPE c VALUE '/usr/sap/trans/IBM/'.

data:     user(64TYPE c VALUE 'db' ,
            pwd(64TYPE c   value 'db' ,
            host(64TYPE c VALUE '192.168.0.8' ,
            dest LIKE rfcdes-rfcdest VALUE 'SAPFTP'.

DATA: enter_key TYPE c VALUE cl_abap_char_utilities=>cr_lf .
 
   DEFINE alpha_minus.
    call function 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = &1
      IMPORTING
        output = &1.
  END-OF-DEFINITION.

  DEFINE  alpha_manus.
    call function 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = &1
      IMPORTING
        output = &1.
  END-OF-DEFINITION.


  SELECT MKPF~MBLNR
         MKPF~MJAHR
         MKPF~BLDAT
         MKPF~BUDAT
         MKPF~CPUDT
         MKPF~USNAM
         MKPF~XBLNR
         MKPF~BKTXT
         MSEG~ZEILE
         MSEG~BWART
         MSEG~MATNR
         MSEG~WERKS
         MSEG~LGORT
         MSEG~UMWRK
         MSEG~UMLGO
         MSEG~MENGE
         MSEG~MEINS
         MSEG~ERFMG
         MSEG~ERFME
         MSEG~LIFNR
         MSEG~KUNNR
         MSEG~EBELN
  INTO  CORRESPONDING FIELDS OF TABLE IT_MAT_DOC
  FROM MKPF INNER JOIN MSEG ON MKPF~MBLNR = MSEG~MBLNR
                           AND MKPF~MJAHR = MSEG~MJAHR
                           AND MKPF~MANDT = MSEG~MANDT
  WHERE MSEG~MBLNR = MBLNR
    AND MSEG~MJAHR = MJAHR
    and MSEG~BWART IN ('101','102','122')
    AND MSEG~XAUTO = ''
    AND MKPF~MANDT = SY-MANDT
    AND MSEG~MANDT = SY-MANDT.

  LOOP AT IT_MAT_DOC ASSIGNING .
    CONDENSE :-XBLNR,-BKTXT .
    clear:wa_likp,L_VALUE_NEW_EXP.
    IF NOT -XBLNR IS  INITIAL.
      select single *  into wa_likp from likp where VBELN = -XBLNR and likp~mandt = sy-mandt.
      if wa_likp-LFART = 'EL'.
        IF -MEINS <> 'KG'.
          CALL FUNCTION 'CF_UT_UNIT_CONVERSION'
            EXPORTING
            MATNR_IMP           =  -MATNR
*       MEINS_IMP           = ' '
              UNIT_NEW_IMP        = 'KG'
              UNIT_OLD_IMP        = -MEINS
              VALUE_OLD_IMP       = '1'
           IMPORTING
             VALUE_NEW_EXP       = L_VALUE_NEW_EXP.
          IF SY-SUBRC <> 0.
            continue.
          ELSE.
            IF L_VALUE_NEW_EXP IS INITIAL.
              CONTINUE.
            ELSE.
              ITAB-MEINS = 'KG'.
              ITAB-MENGE = -MENGE * L_VALUE_NEW_EXP .
            ENDIF.
          ENDIF.

        ELSE.
          MOVE -MENGE TO ITAB-MENGE.
          MOVE -MEINS TO ITAB-MEINS.
        ENDIF.

        MOVE 'P2' TO ITAB-ZACTYP.
        MOVE -MBLNR TO ITAB-MBLNR.
        MOVE -MJAHR TO ITAB-MJAHR.
        MOVE -BLDAT TO ITAB-BLDAT.
        MOVE -BUDAT TO ITAB-BUDAT.
        MOVE -CPUDT TO ITAB-CPUDT.
        MOVE -USNAM TO ITAB-USNAM.
        MOVE -XBLNR TO ITAB-XBLNR.
        MOVE -BKTXT TO ITAB-BKTXT.
        MOVE -ZEILE TO ITAB-ZEILE.
        MOVE -BWART TO ITAB-BWART.
        alpha_minus -MATNR  .
        MOVE -MATNR TO ITAB-MATNR.
        MOVE -WERKS TO ITAB-WERKS.
        MOVE -LGORT TO ITAB-LGORT.
        MOVE -UMWRK TO ITAB-UMWRK.
        MOVE -UMLGO TO ITAB-UMLGO.
        MOVE -ERFMG TO ITAB-ERFMG.
        MOVE -ERFME TO ITAB-ERFME.
        alpha_minus -LIFNR  .
        MOVE -LIFNR TO ITAB-LIFNR.
        alpha_minus -KUNNR  .
        MOVE -KUNNR TO ITAB-KUNNR.
        MOVE -EBELN TO ITAB-EBELN.

        CONDENSE :ITAB-MENGE ,ITAB-ERFMG.
        APPEND ITAB.CLEAR ITAB.
      endif.
    endif.
  endloop.

  IF LINES( ITAB ) > 0 .
    descr_ref ?= cl_abap_typedescr=>describe_by_data( ITAB  ).
    LOOP AT descr_ref->components ASSIGNING .
      MOVE-CORRESPONDING  TO headtab.
      APPEND headtab.
    ENDLOOP.
    DESCRIBE TABLE headtab LINES n.

    LOOP AT ITAB ASSIGNING .
      CLEAR:g_msg.
      DO n TIMES."循环列
        CLEAR:value.
        ASSIGN COMPONENT sy-index OF STRUCTURE  TO .
        READ TABLE headtab INDEX sy-index.
        m = headtab-length / 2 .
        str =  .
        PERFORM addspace  USING str m str .
        if sy-index = 1 .
          CONCATENATE  g_msg  str INTO  g_msg.
        else.
          CONCATENATE  g_msg '||' str INTO  g_msg.
        endif.
        IF sy-index = n.
          CONCATENATE  g_msg '/@/' enter_key  INTO  g_msg.
          itab_line-line_txt = g_msg.
          APPEND itab_line.clear itab_line.
        ENDIF.
      ENDDO.
    ENDLOOP.
    TRANSLATE P_PATH TO LOWER CASE.
    CLEAR:p_FILE,P_SIM_FILE,filename.
    CONCATENATE P_PATH '/IBM/' 'SAP_OUT_PST_' sy-DATUM sy-UZEIT  INTO P_SIM_FILE.
    CONCATENATE P_PATH '/IBM/' 'SAP_OUT_PST_' sy-DATUM sy-UZEIT '.T00' INTO p_FILE.
    CONCATENATE  'SAP_OUT_PST_' sy-DATUM sy-UZEIT '.TXT' INTO   filename.
    DELETE DATASET  P_FILE.
    CLOSE DATASET  P_FILE.
    OPEN DATASET  P_FILE FOR OUTPUT IN TEXT MODE ENCODING UTF-8 .           "
    LOOP AT ITAB_LINE.
      TRANSFER ITAB_LINE-LINE_TXT TO P_FILE.
    ENDLOOP.
    CLOSE DATASET P_FILE.

    CLEAR:result ,result[],sys_command.
    CONCATENATE '/bin/ls'  p_FILE INTO sys_command SEPARATED BY ' '.
**执行系统程序,生成文件列表存放在内表RESULT.
    CALL 'SYSTEM' ID 'COMMAND' FIELD sys_command
                  ID 'TAB'     FIELD result-*sys*.

    READ TABLE result INDEX 1.
*读取文件列表,是否存在记录,不存在则报错
    IF sy-subrc <> 0.
      message '尚未生成文件,请核查' type 'E'.
      EXIT.
    ELSE.
      CONCATENATE P_SIM_FILE '.TXT' INTO P_SIM_FILE.
      CONCATENATE 'mv' p_FILE P_SIM_FILE INTO sys_command SEPARATED BY ' '.
      CALL 'SYSTEM'
      ID 'COMMAND' FIELD sys_command
      ID 'TAB' FIELD result-*sys*.

      CONCATENATE '成功生成文件:' P_SIM_FILE INTO G_MSG.
      if sy-subrc = 0 .
        message G_MSG type 'S'.
      endif.
    ENDIF.

*-------------------------- FTP处理------------------------------*
    slen = STRLEN( pwd ).

    CALL FUNCTION 'HTTP_SCRAMBLE'
      EXPORTING
        SOURCE      = pwd
        sourcelen   = slen
        key         = mi_key
      IMPORTING
        destination = pwd.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    CALL FUNCTION 'FTP_CONNECT'
      EXPORTING
        user            = user
        password        = pwd
        host            = host
        rfc_destination = 'SAPFTP' "SAPFTPA
      IMPORTING
        handle          = mi_handle
      EXCEPTIONS
        not_connected   = 1
        OTHERS          = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    CHECK sy-subrc = 0.
    CHECK sy-subrc = 0.
    l_ftpcommand = 'binary'.
    PERFORM frm_ftp_command USING l_ftpcommand pr_return.

* Change local directory
    CLEAR l_ftpcommand.
    CONCATENATE 'lcd' cons_source INTO l_ftpcommand SEPARATED BY space.
    PERFORM frm_ftp_command USING l_ftpcommand pr_return.
    IF pr_return = '1'.
      WRITE:/ sy-datum, sy-uzeit, sy-uname,  'FTP改变本地路径错误!'.
      STOP.
    ENDIF.

*------------------传输文件---------------------------*
    CLEAR l_ftpcommand.
    CONCATENATE 'put'  filename INTO l_ftpcommand SEPARATED BY space.
    PERFORM frm_ftp_command USING l_ftpcommand pr_return.
    CALL FUNCTION 'FTP_DISCONNECT'
      EXPORTING
        handle = mi_handle
      EXCEPTIONS
        OTHERS = 1.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.


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