创建费用化采购订单(PR->PO)

本场景是更具PR创建PO采购订单,由于业务需求,需要通过采购申请创建费用化采购订单,前台可以将直接将服务、科目分配等数据自动带出来

BAPI则要通过相关操作才能完成

费用化采购申请可通过IW31创建

BAPI : BAPI_PO_CREATE1

前台操作

 

输入采购申请和行项目自动带出相关数据

 

 

 

ITEM赋值的时候注意需要填写科目分配类别/项目类别/以及pack_no字段

pack_no字段会与服务结构字段对应,这里pack_no可以给一个流水(例:0000000001)

bapiesllc结构父包赋值

pckg_no与item中的pckg_no对应

line_no是行号,子包中的line_no会跟着父包流水下去

subpckg_no子包中的pckg_no对应

跟具采购申请单号以及行项目去AFVC去取包编号

包编号+1为子包编号

拿着子包编号取esll表中取子包中相关服务数据

子包bapiesllc赋值

pckg_no父包中的subpckg_no对应

line_no接着父包line_no的流水号

ext_line服务行的编号:取服务中的数据即可,也可流水

pln_pckg为子包的编号

hi_line_no为父包的pckg_no

其余数据可在表中取出

pckg_no为子包的pack_no

line_no子包的line_no

填充计划行

bapi赋值

    DATA: wa_bapimepoheader_input  TYPE bapimepoheader,
          wa_bapimepoheader_output TYPE bapimepoheader,
          wa_bapimepoheaderx       TYPE bapimepoheaderx.

    DATA: wa_return    TYPE bapiret2,
          wa_poitem    TYPE bapimepoitem,
          wa_poitemx   TYPE bapimepoitemx,
          wa_posche    TYPE bapimeposchedule,
          wa_poschex   TYPE bapimeposchedulx,
          wa_account   TYPE bapimepoaccount,
          wa_accountx  TYPE bapimepoaccountx,
          wa_text_item TYPE bapimepotext,
          wa_pocond    TYPE bapimepocond,
          wa_pocondx   TYPE bapimepocondx,
          wa_pose      TYPE bapiesllc,

          it_return    TYPE TABLE OF bapiret2,
          it_poitem    TYPE TABLE OF bapimepoitem,
          it_poitemx   TYPE TABLE OF bapimepoitemx,
          it_posche    TYPE TABLE OF bapimeposchedule,
          it_poschex   TYPE TABLE OF bapimeposchedulx,
          it_account   TYPE TABLE OF bapimepoaccount WITH HEADER LINE,
          it_text_item TYPE TABLE OF bapimepotext WITH HEADER LINE,
          it_accountx  TYPE TABLE OF bapimepoaccountx  WITH HEADER LINE,
          it_pocond    TYPE TABLE OF bapimepocond,
          it_pocondx   TYPE TABLE OF bapimepocondx,
          lt_pose      TYPE TABLE OF bapiesllc.

    DATA: lv_itemno TYPE vbap-posnr.
    DATA: lv_ebeln TYPE ekko-ebeln.
    DATA:lv_line_no       LIKE bapiesllc-line_no  VALUE '0000000001'.
    DATA: posrvaccessvalues TYPE TABLE OF bapiesklc  WITH HEADER LINE.

    DATA : ext_line TYPE char10  .
*PO 抬头
    wa_bapimepoheader_input-comp_code  = input-bukrs.        "公司代码
    wa_bapimepoheader_input-doc_type   = input-bsart.        "订单类型
    wa_bapimepoheader_input-creat_date = sy-datum.           "创建日期
    wa_bapimepoheader_input-vendor     = input-lifnr.        "供应商
    wa_bapimepoheader_input-purch_org  = input-ekorg.        "采购组织
    wa_bapimepoheader_input-pur_group  = input-ekgrp.        "采购组
    wa_bapimepoheader_input-currency   = input-waers.        "货币
    wa_bapimepoheader_input-doc_date   = input-order_data.   "凭证日期
    wa_bapimepoheader_input-pmnttrms   = input-zterm.        "付款条件

    wa_bapimepoheaderx-comp_code  = 'X'.
    wa_bapimepoheaderx-doc_type   = 'X'.
    wa_bapimepoheaderx-creat_date = 'X'.
    wa_bapimepoheaderx-vendor     = 'X'.
    wa_bapimepoheaderx-purch_org  = 'X'.
    wa_bapimepoheaderx-pur_group  = 'X'.
    wa_bapimepoheaderx-currency   = 'X'.
    wa_bapimepoheaderx-doc_date   = 'X'.
    wa_bapimepoheaderx-pmnttrms   = 'X'.

****取服务**

    DATA : pack_no TYPE numc10 .
    DATA:lv_sub_pack_no TYPE numc10 .
    DATA:lv_ext TYPE numc10.
    pack_no = 1 .
    LOOP AT input-item INTO DATA(ls_item) .
      IF input-zse IS NOT INITIAL .
*        IF input-zse IS NOT INITIAL .
        wa_pose-pckg_no = pack_no." '0000000001'    .
        wa_pose-line_no = lv_line_no    .
        wa_pose-outl_level = 0           ."test
        wa_pose-outl_ind = 'X'             ."test
        wa_pose-subpckg_no = pack_no + 1 .

        lv_sub_pack_no =  wa_pose-subpckg_no .
        APPEND wa_pose TO lt_pose .
        CLEAR :wa_pose.
*        ENDIF .
        SELECT SINGLE packno FROM afvc INTO @DATA(lv_afvc) WHERE banfn = @ls_item-banfn AND bnfpo = @ls_item-bnfpo .
        IF sy-subrc = 0 .
          lv_afvc = lv_afvc + 1 .
        ENDIF .
        lv_line_no = 1.
        lv_ext = 0.
        SELECT * FROM esll INTO TABLE @DATA(lt_esll) WHERE packno = @lv_afvc .
        LOOP AT lt_esll INTO DATA(ls_esll) .
          lv_line_no = lv_line_no + 1.
          lv_ext = lv_ext + 10.
          wa_pose-pckg_no    =  lv_sub_pack_no .
          wa_pose-line_no    =  lv_line_no.
          wa_pose-ext_line   =  lv_ext.               "服务确认行项目编号
          wa_pose-outl_level = 0.
*        wa_pose-matl_group    = 'F08011' . "test
          wa_pose-quantity   = ls_esll-menge.                "数量
          wa_pose-base_uom   = ls_esll-meins .    "单位"ls_zentrysheet01-base_uom.       "单位
          wa_pose-gr_price   = ls_esll-tbtwr.    "ls_zentrysheet01-gr_price.             "总价
          wa_pose-short_text = ls_esll-ktext1." ls_zentrysheet01-short_text.             "短文本
          wa_pose-pln_pckg      = lv_afvc  .       "原始包装编号
          wa_pose-pln_line      = ls_esll-introw.       "输入:计划包行
          wa_pose-hi_line_no = pack_no.

          posrvaccessvalues-pckg_no = lv_sub_pack_no.
          posrvaccessvalues-line_no = lv_line_no.
          posrvaccessvalues-serno_line = '01'.
          posrvaccessvalues-percentage = 100.
          posrvaccessvalues-serial_no = '01'.

          APPEND posrvaccessvalues.
          APPEND wa_pose TO lt_pose .
          CLEAR :wa_pose ,ls_esll .
        ENDLOOP .

        wa_posche-po_item = ls_item-ebelp .
        wa_posche-sched_line = '0001' .
        wa_posche-preq_no = ls_item-banfn .
        wa_posche-preq_item = ls_item-bnfpo .
        APPEND wa_posche TO it_posche .

        wa_poschex-po_item = ls_item-ebelp .
        wa_poschex-sched_line = '0001' .
        wa_poschex-po_itemx = 'X' .
        wa_poschex-sched_linex = 'X ' .
        wa_poschex-preq_no = 'X' .
        wa_poschex-preq_item = 'X' .
        APPEND wa_poschex TO it_poschex .
      ENDIF .
******************
      IF ls_item-loekz = 'L' .
        wa_poitem-delete_ind = 'L' .
      ENDIF .

      wa_poitem-po_item     = ls_item-ebelp. "采购订单行项目
      wa_poitem-trackingno  = input-no.      "跟踪号
      wa_poitem-preq_no     = ls_item-banfn.    "采购申请
      wa_poitem-preq_item   = ls_item-bnfpo.    "采购申请行
      wa_poitem-quantity    = ls_item-menge.    "采购数量
      wa_poitem-gr_ind      = 'X'.           "收货标识
      wa_poitem-gr_basediv  = 'X'.           "标识:基于收货的发票验证
      wa_poitem-tax_code    = ls_item-mwskz.    "税码

      IF input-zse IS NOT INITIAL .
        SELECT SINGLE * FROM eban INTO @DATA(lv_eban) WHERE banfn = @ls_item-banfn AND bnfpo = @ls_item-bnfpo .
        IF sy-subrc = 0 .
          wa_poitem-acctasscat = lv_eban-knttp."科目分配类别
          wa_poitem-item_cat   = lv_eban-pstyp."项目类别
          wa_poitem-pckg_no    = pack_no."
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = wa_poitem-pckg_no
            IMPORTING
              output = wa_poitem-pckg_no.
        ENDIF .
      ENDIF .
      APPEND wa_poitem TO it_poitem.
      CLEAR : wa_poitem .

      IF ls_item-loekz = 'L' .
        wa_poitemx-delete_ind = 'X' .
      ENDIF .
      wa_poitemx-po_item    = ls_item-ebelp.  "采购订单行项目
      wa_poitemx-po_itemx   = 'X'.  "采购订单行项目
      wa_poitemx-trackingno = 'X'.  "跟踪号
      wa_poitemx-preq_no    = 'X'.  "采购申请
      wa_poitemx-preq_item  = 'X'.  "采购申请行
      wa_poitemx-quantity   = 'X'.  "采购数量
      wa_poitemx-gr_ind     = 'X'.  "收货标识
      wa_poitemx-gr_basediv = 'X'.
      wa_poitemx-tax_code   = 'X'.
      IF input-zse IS NOT INITIAL .
        wa_poitemx-acctasscat = 'X'."科目分配类别
        wa_poitemx-item_cat   = 'X'."项目类别
        wa_poitemx-pckg_no    = 'X'."
      ENDIF .
      APPEND wa_poitemx TO it_poitemx.
      CLEAR : wa_poitemx .


      wa_pocond-itm_number  = ls_item-ebelp.
      wa_pocond-cond_type   = 'PBXX'.
      wa_pocond-cond_value  = ls_item-netpr.
      wa_pocond-currency    = input-waers.
      wa_pocond-cond_p_unt  = ls_item-peinh.
      IF input-erp_no IS INITIAL .
        wa_pocond-change_id   = 'U'.
      ELSE.
        wa_pocond-change_id   = 'U'.
      ENDIF.

      APPEND wa_pocond TO it_pocond.
      CLEAR wa_pocond.

      wa_pocondx-itm_number  = ls_item-ebelp.
      wa_pocondx-itm_numberx = 'X'.
      wa_pocondx-cond_type   = 'X'.
      wa_pocondx-cond_value  = 'X'.
      wa_pocondx-currency  = 'X'.
      wa_pocondx-cond_p_unt  = 'X'.
*      wa_pocondx-condorigin  = 'X'.
      wa_pocondx-change_id   = 'X'.
      APPEND wa_pocondx TO it_pocondx.
      CLEAR wa_pocondx.
      CLEAR :ls_item .
      pack_no = lv_sub_pack_no + 1.
    ENDLOOP .
    IF input-erp_no IS INITIAL .
      CALL FUNCTION 'BAPI_PO_CREATE1'
        EXPORTING
          poheader          = wa_bapimepoheader_input
          poheaderx         = wa_bapimepoheaderx
*         TESTRUN           = 'X'
        IMPORTING
          exppurchaseorder  = lv_ebeln
          expheader         = wa_bapimepoheader_output
        TABLES
          return            = it_return
          poitem            = it_poitem
          poitemx           = it_poitemx
          poschedule        = it_posche
          poschedulex       = it_poschex
*         poaccount         = it_account[]
*         poaccountx        = it_accountx[]
*         potextitem        = it_text_item
          pocond            = it_pocond
          pocondx           = it_pocondx
          poservices        = lt_pose
          posrvaccessvalues = posrvaccessvalues[].

      LOOP AT it_return INTO wa_return WHERE type = 'E' OR type = 'A' .
        output-return-msgtx = output-return-msgtx && wa_return-message .
      ENDLOOP .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你提供的`Sort`函数实现了一个简单的冒泡排序算法来按照学生总分从高到低对链表进行排序。代码中使用了结构体成员变量之间的赋值和字符串拷贝操作。 但是你的代码存在一个问题,就是在内层循环中,你没有更新`pr`指针。这会导致每次交换后,`pr`指针都保持不变,而应该向前移动一个位置。 以下是修复这个问题的修改后的代码: ```c void Sort(STU *head) { STU *p, *now, *pr; p = head->next; now = head; pr = head; while (p != NULL) { while (p->next != NULL) { if ((p->score[0] + p->score[1] + p->score[2]) < (p->next->score[0] + p->next->score[1] + p->next->score[2])) { strcpy(pr->num, p->num); strcpy(pr->name, p->name); strcpy(pr->major, p->major); pr->classNo = p->classNo; pr->score[0] = p->score[0]; pr->score[1] = p->score[1]; pr->score[2] = p->score[2]; strcpy(p->num, p->next->num); strcpy(p->name, p->next->name); strcpy(p->major, p->next->major); p->classNo = p->next->classNo; p->score[0] = p->next->score[0]; p->score[1] = p->next->score[1]; p->score[2] = p->next->score[2]; strcpy(p->next->num, pr->num); strcpy(p->next->name, pr->name); strcpy(p->next->major, pr->major); p->next->classNo = pr->classNo; p->next->score[0] = pr->score[0]; p->next->score[1] = pr->score[1]; p->next->score[2] = pr->score[2]; } p = p->next; pr = pr->next; // 添加这一行来更新pr指针 } p = now->next; now = now->next; } } ``` 这样,`pr`指针在内层循环中会向前移动一个位置,确保下一次交换时指向正确的位置。 请记得在调用`Sort`函数时传入合适的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值