关于查找SO开DN 的相关问题
问题点
-
so开了dn的需要剔除mrp
-
部分开dn 的数据分配显示
-
开了dn 但是没有过账
-
so 其中计划行数据那些列名的意思
-
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 接口代码 ,酌情更改符合本公司的业务。
网友评论