草庐IT

SAP 交货单与HU指派关系数据不一致问题的解决方案

Suzhou BOY 2023-03-28 原文

SAP 交货单与HU指派关系数据不一致问题的解决方案

 

 

我所在的项目是一个超大型的Global SAP项目,客户是一家跨国企业巨头,其SAP系统早已实施十几年了。除了SAP系统,客户还有其它各种外部系统,比如WMS系统等。

 

我的合作伙伴是一家印度的知名咨询公司,该公司有近乎100号印度人在这个项目上。客户这些年每年都有一些优化项目在做,我和这些印度同事们根据客户总部的安排,有需要实施的SAP优化项目就参与其中,没有优化项目需要实施就做运维。

 

近期客户总部以及乙方合作伙伴没有给我安排实施项目,所以我加入了有近乎50人的运维团队,主要解决客户业务团队提出的各种问题,为客户的业务部门保驾护航。该运维团队基本都是印度人,我和另外2个中国的SAP同行在运维团队里主要负责客户中国区工厂的运维支持。

 

近日接到了项目上用户提出的一个比较棘手的问题,让我纠结了几天。通过在项目上跟印度同事一起寻找解决方案,让我对于印度同行们有更多的了解。他们在项目上工作的专业技能和态度,他们的文档能力,都给笔者留下了比较深刻的印象。

 

如今问题已经解决,闲来无事写下这篇文字,做一个记录。

 

 

 

Part I:问题描述

 

 

客户美国公司的某个用户提出他需要删除一个外向交货单,无法删除,所以报了一个TICKET给到我们运维团队。我刚好手头没其它事,就主动接了这个TICKET。

 

该外向交货单是一个公司间STO流程里的交货单,交货单因故需要删除。不过经过业务人员的一顿操作猛于虎,弄成的结果就是:该交货单相关的Handling Unit都已经被un-assigned(解除分配)了,且这些HU都已经没有库存了,就是一些空的HU了,该批次号的库存在发货工厂里也没有了。

 

VL03N显示该交货单,其Pack界面里,已经没有任何HU信息了,

 

 

 

 

 

但是因为操作不当等种种原因,导致该交货单的document flow里还是能看到这些HU号码信息。如下图示:

 

 

 

 

 

要想删除交货单,一定要将交货单里的picked quantity清零,且需要将已经相关的批次号删除掉。

 

但是因为交货单之前做拣配时候关联的HU解绑出问题了,凭证流表(VBFA)里还残留有数据。这使得业务人员无法将清空picked quantity以及批次号,系统会提醒说:Delivery still contains handling units.如下图示:

 

 

 

 

 

也就是说现在外向交互单,业务人员已经无法正常取消其拣配,无法将凭证流里的HU信息正常删除掉,所以就没有办法将该交货单正常删除了。

 

尼玛,一不小心接了一个烫手山芋!

 

 

 

Part II: 我的解决方案

 

接到这个ticket,我第一反应就是这是一个由于业务人员操作不当或者数据库更新异常导致的疑难杂症,常规手段已经无法解决了。

 

所以我想到的解决方法是只能在Debug模式下将VBFA里该交货单相关的HU数据行删除掉,然后去修改交货单里的picked quantity以及清理批次号信息,然后就可以正常删除该交货单了。

 

Debug改SAP表数据以解决很多疑难杂症,是很多SAP同行在万不得已的时候都会想到和用到的终极解决方案。这个方案是纯粹技术手段,并且是上不了台面的手段。当然这个解决方案对于解决类似由于业务人员操作失误或者数据库更新异常等导致的疑难杂症,是非常简单且快捷有效的!

 

这种手段这在很多民营企业的SAP项目里屡试不爽。不过以笔者参与的诸多大型跨国企业的GLOBAL SAP项目经历来看,Debug改SAP表数据绝不是轻易可以做的事情。大型跨国企业里的SAP系统,对于权限控制极为严格。很多权限是不会开放给IT部门的,Debug改SAP表数据的权限更是不可能轻易开放给运维团队的。

 

所以当我将自己想到的解决方案跟运维团队的相关负责人沟通,他们表示这种解决方案不是不可以,但是不推荐;只能在别无他法的时候才能考虑,并且需要客户的业务部门同意,客户总部IT老大以及运维部门老大审批,然后申请专门的Firefighter账号,才能去执行Debug改表。

 

看得出,项目上对于这种技术手段的控制是非常严格的,虽然没有一刀切的绝对禁止,但是设计了非常严谨而复杂的管控流程。我对此表示理解,毕竟客户是跨国大公司,做什么都要讲究合规,都有规范的流程。

 

 

 

Part III:印度人的解决方案

 

运维团队负责人在项目上干了很多年,很明显对于类似的疑难杂症有相关处理经验。他要求我所在的DOMAIN内其他几个印度同事也帮忙看看这个问题,以找出更为可行的解决方案。这让笔者挺欣慰的,技术上有疑难杂症可以在团队内部得到帮助和建议,这不就是team work么?

 

不通过DEBUG改表的方式能解决这个问题?我倒是想看看这些印度人到底有啥好办法。两天后,印度同事给出了方案,不过步骤很多,都是业务人员就能有权限执行的操作:

 

1)先通过701盘盈方式造出该物料批次的少量库存。毕竟该物料批次的库存已经没有了。

2)系统上的外向交互单的包装(Packing)是通过SHPCON这种message type的IDoc方式进行的。所以通过WE19复制其它IDoc的方式产生一个新的SHPCON类型的IDoc,然后reprocess这个IDoc, SAP系统就能自动更新交货单的Packing信息,将凭证流里的HU信息自动更新(老的垃圾HU数据被清除,新的HU增加进去)。

3)正常手段对该交货单执行unpack,删除HU。

4)正常手段删除交货单。

5)最后执行702盘亏方式将第一步里造出的少量库存清除掉。

 

看完印度同事的解决方案,我表示很震惊,不能不对他们暗自佩服,居然还可以这么玩!不过他也表示,先让业务人员按照这个执行,如果不可行最后还得要debug删除表数据来解决。解决方案发给用户没多久,用户就反馈说按这个方案解决了问题,交货单已顺利删除!

 

 

至此,挂在我名下的这个TICKET可以关闭了,我也可以松口气儿。

 

 

 

-完-

 

写于2023-1-13.

有关SAP 交货单与HU指派关系数据不一致问题的解决方案的更多相关文章

  1. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  2. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  3. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  4. ruby - Rails 组合多个 activerecord 关系 - 2

    我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代

  5. ruby-on-rails - Ruby on Rails - has_one 关系,如何检查它是否具有现有关联? - 2

    我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])

  6. ruby-on-rails - Ruby/Rails - 检查 HABTM 关系记录中是否存在子 ID - 2

    我有一组名为Tasks和Posts的资源,它们之间存在has_and_belongs_to_many(HABTM)关系。还有一个连接它们的值的连接表。create_table'posts_tasks',:id=>falsedo|t|t.column:post_id,:integert.column:task_id,:integerend所以我的问题是如何检查特定任务的ID是否存在于从@post.tasks创建的数组中?irb(main):011:0>@post=Post.find(1)=>#@post.tasks=>[#,#]所以我的问题是,@post.tasks中是否存在"@task

  7. Ruby On Rails 模型、 View 和 Controller 之间的关系 - 2

    根据我目前的理解,如果我必须描述Rails应用程序的各个组件如何协同工作以响应请求,我会说以下内容:1)路由确定哪些请求URL映射到哪些Controller方法。2)Controller方法从模型中获取信息并将该信息(以全局变量的形式)传递给相应的View模板。3)View模板使用存储在全局变量中的数据来构造最终响应。在上面的解释中,几个组件之间的关系是明确的,不可否认的;即:1)路由和Controller方法2)Controller方法和View模板其实上面的关系是一对一的。但是,模型类与其相邻组件类型(即Controller)的关系并不明确。是的,Controller从模型中检索信

  8. ruby - Mongoid 3 中 Rails 模型的强一致性 - 2

    我希望特定模型的所有数据库交互都通过集群中的mongo主节点,因此我将模型设置为使用强一致性。classPhotoincludeMongoid::Documentwithconsistency::strongfield:number,type:Integer#let'ssayaphotonumberisuniqueinthedbvalidate:unique_numberend但这似乎不起作用,因为当我保存两张非常靠近的照片时,我仍然遇到验证错误。photo1#dbhasnumber=1forthisobjectphoto1.update_attributes(number:2)pho

  9. ruby-on-rails - 本地 gem 的“bundle 安装”没有解决依赖关系,而 'gem install' 可以 - 2

    我在目录“/home/enterprise/pkg”中有一个本地gem(enterprise-0.0.1.gem)。它依赖于active_directorygem(v1.5.5),这是在它的enterprise.gemspec文件中指定的,如下所示:-gem.add_dependency("active_directory")在我的应用程序的Gemfile中,我添加了以下行:-gem'enterprise','0.0.1',path=>'/home/enterprise/pkg'当我做的时候bundleinstall在我的应用程序的源目录中,只安装了企业gem。因此,我遇到了引用act

  10. ruby-on-rails - Rails/Mongoid 与 Struct 的关系问题 - 2

    我正在构建这个图书馆应用程序,它有3个类。国家、图书馆和书籍。国家有许多图书馆,图书馆属于一个国家。图书馆有很多书,书是嵌入图书馆的。但是,当我执行此auto_pick_job时,我们到达top_free_book并调用library.state。由于某种原因,library.state为nil。我希望恢复状态但没有骰子。我调用和创建库的方式如下。所以图书馆将永远属于一个现有的国家。state=Stats.find(x)library=state.libaries.new(info)library.save_optimistic!我也很感激使用Struct的关系帮助。classStat

随机推荐