先进先出的数据冲销处理

博客围绕销售订单和销售发货单的数据处理展开,因客户发货时无法指定对应订单,需以先进先出方式统计销售订单执行情况。给出示例数据创建表及插入数据的 SQL 语句,还展示了查询处理过程以得出订单执行情况结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先进先出的数据冲销处理

--示例数据:
create table 销售订单(单号 varchar(10),日期 datetime,货品编码 varchar(10),数量 int)
insert 销售订单 
select 'A1','2005-5-1','ABCD',100 union all
select 'A2','2005-5-3','ABCD',200 union all
select 'A3','2005-5-4','ABCD',300 union all
select 'A4','2005-5-8','ABCD',500

create table 销售发货单(单号 varchar(10),日期 datetime,货品编码 varchar(10),数量 int)
insert 销售发货单
select 'B1','2005-5-05','ABCD',250 union all
select 'B2','2005-5-07','ABCD',100 union all
select 'B3','2005-5-10','ABCD',150'
GO

问题描述:
    对于示例数据中的销售订单和销售发货单,由于客户在做销售发货时无法指定本次是要发那一张订单的东西。所以销售订单无法与销售发货单关联。客户要求以先进先出的方式统计销售订单的执行情况。对于示例数据,要求结果如下:
单号        日期             货品编码    订单数量    发货数量     待执行数量       
---------- ----------------- ------------- -------------- --------------- ------------------ 
A1         2005-05-01   ABCD       100            100              0
A2         2005-05-03   ABCD       200            200             0
A3         2005-05-04   ABCD       300            200            100
A4         2005-05-08   ABCD       500            0                 500
                                      合计          1100         500             600

--查询处理的过程
select 
    a.单号,a.日期,a.货品编码,
    订单数量=a.数量,
    发货数量=isnull(case when a.s数量<b.数量 then a.数量 else b.数量-a.p数量 end,0),
    待执行数量=case when a.s数量<b.数量 then 0 else a.s数量-isnull(b.数量,a.p数量) end
into # from(
    select 单号,日期=convert(char(10),日期,120),货品编码,
        数量=sum(数量),
        p数量=isnull((select sum(数量) from 销售订单
    where 货品编码=a.货品编码
        and(datediff(day,日期,min(a.日期))>0
        or datediff(day,日期,min(a.日期))=0 and 单号<a.单号)),0),
        s数量=isnull((select sum(数量) from 销售订单
            where 货品编码=a.货品编码
                and(datediff(day,日期,min(a.日期))>0
                or datediff(day,日期,min(a.日期))=0 and 单号<=a.单号)),0)
    from 销售订单 a
    group by 单号,convert(char(10),日期,120),货品编码
)a 
    left join(
        select 货品编码,数量=sum(数量)
        from 销售发货单
        group by 货品编码
    )b on a.货品编码=b.货品编码
        and a.p数量<b.数量
order by a.单号,a.日期,a.货品编码

select * from #
union all
select '','','合计',sum(订单数量),sum(发货数量),sum(待执行数量) from #
drop table #

原帖地址

### SAP物料主数据冲销接口实现方式 在SAP系统中,物料主数据冲销通常涉及通过特定的功能模块或BAPI来完成操作。以下是关于如何利用SAP的标准功能和接口实现物料主数据冲销的具体说明。 #### 使用BAPI进行物料凭证冲销 SAP提供了专门用于物料凭证冲销的BAPI `BAPI_GOODSMVT_CANCEL`[^1]。此BAPI允许开发者通过编程的方式取消已创建的物料移动记录(Material Document)。为了成功调用该BAPI并执行冲销操作,需注意以下几点: - **输入参数** 需要提供物料凭证号 (`MAT_DOC`) 和年份 (`DOC_YEAR`) 来唯一标识目标物料凭证。这些信息可以从后台 `MKPF` 中获取。 - **返回值处理** 调用完成后,应检查返回的消息集合 (Return Table),以确认操作是否成功以及是否存在错误消息。 - **示例代码** 下面是一个ABAP代码片段,展示如何调用 `BAPI_GOODSMVT_CANCEL` 进行物料凭证冲销: ```abap DATA: lv_matdoc TYPE bapi2017_gm_head_02-mat_doc, lv_docyear TYPE bapi2017_gm_head_02-doc_year, lt_return TYPE STANDARD TABLE OF bapiret2. " 设置物料凭证编号及年份 lv_matdoc = '1234567890'. " 替换为实际的物料凭证号 lv_docyear = '2023'. " 替换为实际的年份 " 调用BAPI进行冲销 CALL FUNCTION 'BAPI_GOODSMVT_CANCEL' EXPORTING mat_doc = lv_matdoc doc_year = lv_docyear IMPORTING return = lt_return. " 处理返回结果 LOOP AT lt_return INTO DATA(ls_return). IF ls_return-type = 'E' OR ls_return-type = 'A'. WRITE: / 'Error occurred:', ls_return-message. ELSEIF ls_return-type = 'S'. WRITE: / 'Success message:', ls_return-message. ENDIF. ENDLOOP. ``` #### Java调用SAP接口实现冲销 如果需要从外部系统(如Java应用)调用SAP接口,则可以通过Web Services技术实现。具体步骤如下: 1. 利用工具生成客户端存根文件。例如,在命令行运行以下脚本生成针对指定WSDL的服务端代码[^2]: ```bash %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% D:\axis-1_4\BC_FIDocCreate_Sender_SI_FIDocRev_OB.wsdl ``` 2. 编写Java程序调用服务。下面是一段伪代码演示如何调用远程SAP Web Service接口: ```java import generated.BAPIGOODSMVTCANCEL; import generated.Return; public class SapGoodsMovementCancel { public static void main(String[] args) { BAPIGOODSMVTCANCEL service = new BAPIGOODSMVTCANCEL(); String materialDocument = "1234567890"; // 物料凭证号 int documentYear = 2023; // 年份 Return response = service.cancelGoodsMovement(materialDocument, documentYear); System.out.println("Response Message: " + response.getMessage()); } } ``` #### 注意事项 - 在正式环境中部署之前,务必使用事务码SE37测试所选BAPI的行为及其参数配置[^1]。 - 如果遇到复杂场景下的异常情况,请仔细分析日志输出,并参照官方文档排查问题原因。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值