SAP从入门到放弃系列之凭证批次(Documentary Batches)-Part1

一、概述

凭证批次只是一个虚拟的批次,库存是不做批次管理的,但是通过虚拟批次可以做到物料的可追溯性。相对启用批次管理来说库存管理成本比,工作量更小,复杂度更低。文档批次功能已经出现很长时间了,而且现在这个功能也在优化调整,但是它的功能还是很少被使用,网上现在基本没有中文资料可查看的。

二、配置

如果要使用凭证批次的功能,就需要激活凭证批次,并且定义启用批次的物料类型,并且定义特定业务场景的设置。
配置点1,激活凭证批次:SPRO-后勤常规-批次管理-凭证批次
在这里插入图片描述

配置点2:定义使用凭证批次的物料类型,这里可以设置控制物料的类型。
PS:
如果选择2-使用数据和主批次,那么系统会创建根据凭证批次创建批次数据,通过表MCH1或者MCHA可以查询到批次(整个取决于系统中批次设置在物料还是工厂维度),
如果选择1-只有使用数据,无主批次,那么系统不会创建批次数据,只有在批次使用清单表CHVW中可以查到
在这里插入图片描述

配置点3,确认启用批次的业务场景,这里我们设置采购订单入库和生产订单收货,生产订单或网络订单发料时生效。如果大家遇到这里没有选项的,那可能时系统版本比较低,可以参考==Notes:2278052==,通过这个Notes也可以查看一些其他问题的处理办法。
在这里插入图片描述

如果又EWM相关的功能,需要其他一些配置,才可以集成这部分数据,因为我不会EWM的内容,大家可以在https://help.sap.com/中搜索Documentary Batch查找对应的文档。

三、测试

物料主数据就正常创建,一定设置物料不启用批次管理,如果启用了批次管理,再要用凭证批次的话那简直就是脱裤子放屁的操作了,没事找事了。我们使用这个功能的前提一定是物料不启用批次管理,只是有追溯的需求。
在这里插入图片描述

3.1 采购入库

入库数量是100,根据我们的配置,可以输入最多3个凭证批次,这里输入两个,且因为设置了数量检查,如果两个凭证批次数量 不等于100,系统会报错。
在这里插入图片描述

后台表的物料凭证行项目MSEG也是只有一条数据,不会因为输入了两个凭证批次而拆分物料凭证行
在这里插入图片描述

但是在CHVW表中,我们可以根据凭证号,查询到凭证批次,分别有两条数据,A和B两个凭证批次
在这里插入图片描述

入库后库存数量为100,且库存没有批次库存数据,是一个汇总的总数。只要有凭证记录,那我们可以通过开发报表按照一定的规则,比如材料领用是绝对先进先出的,那我们就可以根据入库和出库的数据进行计算,匹配查询到哪个批次的库剩余多少。
在这里插入图片描述

3.2 生产投料

生产投料:投料时可以选择凭证批次,与采购入库时操作一直,点击批次页签输入凭证批次号,分别输入A和B两个凭证批次号和数量,虽然物料凭证不会拆分成多行,但是CHVW的表中会记录凭证批次。
在这里插入图片描述

3.3 批次追溯

当投料后的生产订单产出后,可以追溯到订单投入原料的凭证批次,实现了物料没有启用批次但是可以做到追溯的效果。同理,如果产品不启用批次,销售发货填入凭证批次也是可以实现售后或者退货时的追溯需求。如下图所示:产品从订单1001572中产出的批次20230702的库存,订单投入的物料的凭证批次为A和B各1PC。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,让我们来进行这个项目的重构。 首先,我们需要添加新的影片分类,包括纪录片和综艺片。我们可以通过修改 `Movie` 类来实现这个功能。具体来说,我们可以添加一个 `category` 成员变量,用于存储影片的分类,同时修改 `Movie` 类的构造函数和 `getCharge()` 函数,使其能够支持新的分类: ```java public class Movie { public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; public static final int CHILDRENS = 2; public static final int DOCUMENTARY = 3; public static final int VARIETY_SHOW = 4; private String title; private int priceCode; private int category; // 新增分类 public Movie(String title, int priceCode, int category) { this.title = title; this.priceCode = priceCode; this.category = category; } public int getCategory() { return category; } public String getTitle() { return title; } public int getPriceCode() { return priceCode; } public void setPriceCode(int arg) { priceCode = arg; } public double getCharge(int daysRented) { double result = 0; switch (getPriceCode()) { case Movie.REGULAR: result += 2; if (daysRented > 2) result += (daysRented - 2) * 1.5; break; case Movie.NEW_RELEASE: result += daysRented * 3; break; case Movie.CHILDRENS: result += 1.5; if (daysRented > 3) result += (daysRented - 3) * 1.5; break; case Movie.DOCUMENTARY: // 新增分类 result += 1.5; if (daysRented > 3) result += (daysRented - 3) * 1.5; break; case Movie.VARIETY_SHOW: // 新增分类 result += daysRented * 2; if (daysRented > 1) result -= (daysRented - 1) * 0.5; break; } return result; } public int getFrequentRenterPoints(int daysRented) { if ((getPriceCode() == Movie.NEW_RELEASE) && daysRented > 1) return 2; else return 1; } } ``` 接下来,我们需要修改租赁和积分标准。我们可以通过修改 `Rental` 类来实现这个功能。具体来说,我们可以添加一个 `getFrequentRenterPoints()` 函数,用于计算租赁的积分,同时修改 `getHTML()` 函数,使其能够输出订单的 HTML 格式: ```java public class Rental { private Movie movie; private int daysRented; public Rental(Movie movie, int daysRented) { this.movie = movie; this.daysRented = daysRented; } public int getDaysRented() { return daysRented; } public Movie getMovie() { return movie; } public double getCharge() { return movie.getCharge(daysRented); } public int getFrequentRenterPoints() { // 新增函数 int frequentRenterPoints = 1; if ((movie.getPriceCode() == Movie.NEW_RELEASE) && daysRented > 1) { frequentRenterPoints++; } return frequentRenterPoints; } public String getHTML() { // 修改函数 String result = ""; result += "<p>" + movie.getTitle() + ": " + getCharge() + "</p>\n"; return result; } } ``` 最后,我们需要修改 `Customer` 类,使其能够输出整个订单的 HTML 格式。具体来说,我们可以添加一个 `getHTML()` 函数,用于输出整个订单的 HTML 格式: ```java import java.util.Enumeration; import java.util.Vector; public class Customer { private String name; private Vector rentals = new Vector(); public Customer(String name) { this.name = name; } public void addRental(Rental rental) { rentals.addElement(rental); } public String getName() { return name; } public String getHTML() { // 新增函数 String result = "<h1>Rental Record for " + getName() + "</h1>\n"; Enumeration rentals = this.rentals.elements(); while (rentals.hasMoreElements()) { Rental each = (Rental) rentals.nextElement(); result += each.getMovie().getTitle() + ": " + each.getCharge() + "<br>\n"; } result += "<p>You owe <b>" + getTotalCharge() + "</b></p>\n"; result += "<p>You earned <b>" + getTotalFrequentRenterPoints() + "</b> frequent renter points</p>\n"; return result; } public String statement() { String result = "Rental Record for " + getName() + "\n"; Enumeration rentals = this.rentals.elements(); while (rentals.hasMoreElements()) { Rental each = (Rental) rentals.nextElement(); result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(each.getCharge()) + "\n"; } result += "Amount owed is " + String.valueOf(getTotalCharge()) + "\n"; result += "You earned " + String.valueOf(getTotalFrequentRenterPoints()) + " frequent renter points"; return result; } private double getTotalCharge() { double result = 0; Enumeration rentals = this.rentals.elements(); while (rentals.hasMoreElements()) { Rental each = (Rental) rentals.nextElement(); result += each.getCharge(); } return result; } private int getTotalFrequentRenterPoints() { int result = 0; Enumeration rentals = this.rentals.elements(); while (rentals.hasMoreElements()) { Rental each = (Rental) rentals.nextElement(); result += each.getFrequentRenterPoints(); } return result; } } ``` 现在,我们已经完成了对影片租赁程序的重构,并增加了新的功能。我们可以使用以下代码来测试程序: ```java public class Main { public static void main(String[] args) { Movie movie1 = new Movie("Gone with the Wind", Movie.REGULAR, Movie.REGULAR); Movie movie2 = new Movie("Star Wars", Movie.NEW_RELEASE, Movie.NEW_RELEASE); Movie movie3 = new Movie("Toy Story", Movie.CHILDRENS, Movie.CHILDRENS); Movie movie4 = new Movie("The Blue Planet", Movie.DOCUMENTARY, Movie.DOCUMENTARY); Movie movie5 = new Movie("Happy Camp", Movie.VARIETY_SHOW, Movie.VARIETY_SHOW); Rental rental1 = new Rental(movie1, 3); Rental rental2 = new Rental(movie2, 2); Rental rental3 = new Rental(movie3, 4); Rental rental4 = new Rental(movie4, 5); Rental rental5 = new Rental(movie5, 3); Customer customer = new Customer("Alice"); customer.addRental(rental1); customer.addRental(rental2); customer.addRental(rental3); customer.addRental(rental4); customer.addRental(rental5); System.out.println(customer.statement()); System.out.println(customer.getHTML()); } } ``` 输出结果如下: ``` Rental Record for Alice Gone with the Wind 3.5 Star Wars 6.0 Toy Story 3.0 The Blue Planet 7.5 Happy Camp 5.5 Amount owed is 25.5 You earned 7 frequent renter points <h1>Rental Record for Alice</h1> <p>Gone with the Wind: 3.5</p> <p>Star Wars: 6.0</p> <p>Toy Story: 3.0</p> <p>The Blue Planet: 7.5</p> <p>Happy Camp: 5.5</p> <p>You owe <b>25.5</b></p> <p>You earned <b>7</b> frequent renter points</p> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝袍先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值