美文网首页
关于查找SO开DN 的相关问题

关于查找SO开DN 的相关问题

作者: abapCiCi | 来源:发表于2021-01-28 22:21 被阅读0次

关于查找SO开DN 的相关问题

问题点

  1. so开了dn的需要剔除mrp

  2. 部分开dn 的数据分配显示

  3. 开了dn 但是没有过账

  4. so 其中计划行数据那些列名的意思

  5. v_v2 的badi 增强 来符合自己企业的mrp分配逻辑

清理已开DN 的SO

这个问题就好玩了,在我最开始的时候看到别人有用lips 来看是否有引用自so的vgbel 和 vgpos字段来辨别.但是后来又用vbfa 用凭证流数据来看获取是否已开dn。关于这两者的区别我想这篇文章能够给你帮助。

csdn 作者简答​
但是针对备料单和普通订单的类型又有不一致的情况,所以我分了两次获取sql数据在通过如下代码获取分组数据来判断so是否还有未开dn数量。

 SELECT
 vbak~auart,
 vbak~kunnr,
 vbak~vkorg,
 vbap~matnr,
 vbap~vbeln,
 vbap~posnr,
 CASE WHEN vbap~zzrcrd = '00000000' THEN vbap~zzrmpd
 ELSE  vbap~zzrcrd
 END AS zzrcrd,
 vbap~kwmeng,
 vbfa~rfmng,
 CAST( ' ' AS  CHAR ) AS delete
 FROM @lt_sort AS lt
 INNER JOIN vbak ON
 vbak~kunnr = lt~kunnr
 AND  vbak~vkorg = lt~vkorg
 INNER JOIN vbap ON vbap~vbeln = vbak~vbeln
 AND  vbap~matnr = lt~matnr
 LEFT  JOIN vbfa   ON
 vbfa~vbelv = vbap~vbeln
 AND vbfa~posnv = vbap~posnr
 AND vbfa~rfmng   NE 0
 AND vbfa~vbtyp_n = 'J'
 AND vbfa~vbtyp_v = 'C'
*      AND likp~wbstk NE 'C'
 WHERE
 vbap~abgru EQ ''
 AND vbak~auart IN ( 'ZOR', 'ZKB' )" 非备料单 退货单
*    AND   vbap~kwmeng NE vbfa~rfmng
 APPENDING TABLE @lt_zc_tab"正常订单数量
 ." 以销售组织 物料 客户汇总
​

 LOOP AT  lt_ddsl_tab INTO DATA(ls_ddsl_tab) GROUP BY ( key1 = ls_ddsl_tab-vbeln
 key2 = ls_ddsl_tab-posnr
 key3 = ls_ddsl_tab-zzrcrd
 key4 = ls_ddsl_tab-matnr
 key5 = ls_ddsl_tab-vkorg
 key6 = ls_ddsl_tab-kunnr
 key7 = ls_ddsl_tab-kwmeng
 )
 ASSIGNING FIELD-SYMBOL(<fs_ddsl_tab>).
 lv_sum =  <fs_ddsl_tab>-key7.
 ls_ddsl-menge = REDUCE #( INIT sum = lv_sum
 FOR  j IN GROUP <fs_ddsl_tab>
 NEXT sum = sum  - j-rfmng
 ).
 ls_ddsl-vbeln  = <fs_ddsl_tab>-key1.
 ls_ddsl-posnr  = <fs_ddsl_tab>-key2.
 ls_ddsl-zzrcrd = <fs_ddsl_tab>-key3.
 ls_ddsl-matnr = <fs_ddsl_tab>-key4.
 ls_ddsl-kunnr = <fs_ddsl_tab>-key6.
 ls_ddsl-vkorg = <fs_ddsl_tab>-key5.
 APPEND ls_ddsl  TO  lt_ddsl.
 CLEAR ls_ddsl.
 ENDLOOP.

然后删除数量为空的即可。

我的思路是通过sql 和 内表的前期处理来获取数据。然后直接read tab 或者内表相互联接赋值。 虽然我也看过别人直接在loop 里面 select single 但是这个就不讲武德了。 今天为什么写文章的原因就是看到V_V2 里面代码的写法惊呆了如下图所示

SELECT vbap~vbeln vbap~posnr vbap~matnr vbap~werks
 vbap~bedae vbap~erdat vbap~zzrmpd vbap~fixmg vbap~lprio
 vbap~prosa vbap~pstyv vbap~sobkz vbap~sumbd
 vbap~uepos vbap~uepvw
 vbap~sgt_rcat
 vbak~auart vbak~kunnr
 vbak~vbtyp vbap~lfgsa vbap~besta
*          exclude unsupported scenarios by marc fields
 v_marc_md~apokz v_marc_md~sgt_scope v_marc_md~fsh_mg_arun_req
 vbap~zzrmpd AS edatu_min   " 破坏了sap 的分配逻辑 ,只用rmpd来比较
 FROM        vbap
 INNER JOIN  vbak
 ON          vbak~vbeln EQ vbap~vbeln
 INNER JOIN vbep
 ON vbep~vbeln = vbap~vbeln
 AND vbep~posnr = vbap~posnr
 AND vbep~wmeng NE 0
 AND vbep~edatu NE space
 LEFT OUTER JOIN v_marc_md          " For marc an outer join is necessary otherwise
 ON v_marc_md~matnr = vbap~matnr " you will not get items with out plant and will
 AND v_marc_md~werks = vbap~werks " not see where it is missing, anyway only APOKZ
*                                         is selected which is fine WITH space WITH out plant
 INTO CORRESPONDING FIELDS OF TABLE lt_sales_select
 WHERE vbap~matnr IN ( 'B2B-XH-A(LF)(SN)' )
 AND vbap~werks IN ( '1001','1101','2001','2101' )
 AND ( vbak~auart EQ 'ZOR' OR vbak~auart EQ 'ZKB' OR vbak~auart EQ 'ZBO' )
 AND vbap~pstyv IN ( SELECT pstyv FROM tvap WHERE posgr NE space AND eterl NE space )
 AND vbap~abgru = ''
 AND ( vbap~sobkz NE 'E' OR vbap~bedae IN ( SELECT bedae FROM t459a WHERE bedar IN ( SELECT bedar FROM t459k WHERE mntga EQ space ) ) )
*        vbuk
 AND     vbak~vbtyp IN (if_sd_doc_category=>inquiry,                     "A
 if_sd_doc_category=>quotation,                   "B
 if_sd_doc_category=>order,                       "C
 if_sd_doc_category=>sched_agree,                 "E
 if_sd_doc_category=>sched_agree_ext_serv_agent,  "F
 if_sd_doc_category=>contract,                    "G
 if_sd_doc_category=>order_wo_charge,             "I
 if_sd_doc_category=>independent_reqts_plan,      "W
 if_sd_doc_category=>master_contract )            "0
​
 AND     vbak~gbstk IN (' ', 'A', 'B')        "nicht erledigt 总体状态
 AND     vbak~rfgsk IN (' ', 'A', 'B')        "nicht voll kopiert 总参考状态
****从这里开始都是重点  ******************
 AND   (
*        总体交货状态
 vbak~lfgsk IN (' ', 'A', 'B')   "没有处理 部分处理
 OR ( vbak~lfgsk =  'C'     " 完全处理
 AND vbak~lfstk IN (' ', 'A', 'B')"交货状态
 AND vbak~costa IN ('A', 'B', 'C')"确认状态
 AND vbak~abstk =  'B' "拒绝状态
 )
 )
*                                  没有处理  部分处理
 AND     vbap~absta IN (' ', 'A', 'B')    "拒绝状态
 AND   ( vbap~prosa = 'B' "物料确定激活
 OR
 vbap~gbsta IN (' ', 'A', 'B')
 AND vbap~rfgsa IN (' ', 'A', 'B')
 AND vbap~lfgsa IN (' ', 'A', 'B')
 )
​
 ORDER BY vbap~zzrmpd vbap~werks vbap~matnr

他这里 直接就是通过so 的head 和 item 里面的字段状态来判断是不是开dn 以及部分开dn ,这就是起码要有强大的业务顾问知识给到才敢这样写,也就sap自己知道为什么这样写。你看看是否开dn 完全没有用到dn 表获取或者其他的表来获取。全是so的表哦。 后面我还多次验证了。他还可以剔除掉非正常so 订单等等额外的功能。所以今天看v_v2 的 源码收货颇多。

开了DN 的没有过账

" 已开dn 没有 bl
 SELECT likp~vkorg ,ps~matnr ,likp~kunnr ,SUM( vbfa~rfmng ) AS rfmng
 FROM likp
 INNER JOIN vbfa ON vbfa~vbeln = likp~vbeln
 LEFT  JOIN vbap AS ps ON ps~vbeln = vbfa~vbelv AND ps~posnr =  vbfa~posnv
 WHERE
 likp~wbstk NE 'C' "未完全过账"
 AND likp~vkorg IN @s_vkorg
 AND ps~matnr   IN @s_matnr
*    AND likp~vkorg IN @s_vkorg
 GROUP BY likp~vkorg ,ps~matnr ,likp~kunnr
 INTO TABLE  @lt_mchb

数量的含义

确认数量:co06 中的挂单数量

舍入数量:以销售单位计的修正数量。销售订单 计划行的 需求数量舍入的数量。

BADI

report SDV03V02 中sap 预留了BADI 等待你来实现

 IF lb_sdv03v02_dbsys_opt IS BOUND. "Active BADI Implementation​
 CALL BADI lb_sdv03v02_dbsys_opt->xtab_select_sales
 EXPORTING
 ir_smatnr    = s_matnr[]
 ir_swerks    = s_werks[]
 iv_sort_prio = v_sort_prio
 iv_maco_c    = p_maco_c
 iv_ddeliv    = p_ddeliv
 iv_selektion = selektion
 iv_apoactive = gv_apoactive
 iv_logsys    = gv_logsys
 IMPORTING
 et_err_tab   = err_tab
 CHANGING
 ct_matunv    = matunv[]
 ct_xtab      = xtab[].
​
 ELSEIF cl_db_sys=>is_in_memory_db IS NOT INITIAL.  "e.g. Hana
​
 CALL METHOD cl_im_sdv03v02_hdb_opt=>if_sdv03v02_dbsys_opt~xtab_select_sales
 EXPORTING
 ir_smatnr    = s_matnr[]
 ir_swerks    = s_werks[]
 iv_sort_prio = v_sort_prio
 iv_maco_c    = p_maco_c
 iv_ddeliv    = p_ddeliv
 iv_selektion = selektion
 iv_apoactive = gv_apoactive
 iv_logsys    = gv_logsys
 IMPORTING
 et_err_tab   = err_tab
 CHANGING
 ct_matunv    = matunv[]
 ct_xtab      = xtab[].
​
 ELSE.  "Other database

这句话的意思就是 你如果激活并且实施了我的BADI 就用你的。最终 以 Xtab[]这张表作为基础数据。 你可以影响哪些数据来进行so挂单。 也就是实现atp的基础数据。 我建议先复制原来的badi 接口代码 ,酌情更改符合本公司的业务。

相关文章

网友评论

      本文标题:关于查找SO开DN 的相关问题

      本文链接:https://www.haomeiwen.com/subject/excftltx.html