简介
尽管SAP目前正在推广使用Business Objects data Services的"最佳实践数据迁移",但LSMW仍然是许多项目的首选工具。
LSMW是免费的,使用简单,可以或多或少自动处理许多事情。
在本博客和随后的博客中,我想分享我最近项目的一些经验。我不是一个程序员,所以我展示的任何ABAP代码都不一定是最好的。但是,数据迁移是一次性的,因此代码是否美观高效通常并不重要(当然,除非您有非常大的数据量)。我假设你已经熟悉LSMW了。如果你是一个初学者,那么还有很多其他的SCN帖子可以帮助你。
LSMW的优点之一有时可能是缺点。LSMW控制在转换步骤中生成的程序中的数据流。它读取输入记录,应用转换逻辑,向输出缓冲区写入(如果有多个段,则为每个段写入)一条记录,并在处理完与事务相关的所有记录后,写入事务。但是,有时您希望知道下一个输入记录的内容,大数据100,并在处理当前记录时使用此信息。不幸的是,当LSMW读取一条记录时,上一条记录已经被写入并且不再可用。这可以通过使用"预读"技术来解决。
用例
这里有一些可能使用预读技术的例子:
以上都发生在我最近的一个项目中。我现在将使用RFBIBL00示例来解释该技术。
工作示例
如果您想处理总账预订,应收账款未清项或应收账款未清项然后SAP提供标准批量输入程序RFBIBL00,您可以在
LSMW:
中选择该程序,以便在我们的项目中传输期初余额遗留系统提供的输入文件是一个包含有限字段数的平面文件。输入文件中的Oracle平衡段用于确定利润中心。输入账户实际上是一个Oracle总账账户,使用LSMW中的查找表进行转换。
输入文件按公司代码、货币密钥和Oracle平衡段排序。为这些值的每个组合编写单独的总账文档。这张单据是由一个冲销账户的预订来平衡的。如果余额已正确加载,则抵销科目的余额当然为零。在测试期间,总账转换表不完整,因此添加了一些代码以允许处理,即使某些输入记录无效–在这种情况下,抵销科目将有余额,但我们可以看到处理的内容。
结构关系如您所料:
我们需要自行确定扁平输入文件当密钥发生变化时,我们只有在读取下一条记录时才知道这一点。因此,我们更改LSMW程序中的控制流,以便可以"预读"到下一条记录。
LSMW通常在记录块的末尾写入一条输出记录,并在事务块的末尾写入一个事务。使用预读技术,我们在事务块的BEGIN\u中执行此操作。此时,我们仍然有上一个转换的记录,下一个输入记录也可用,因此我们可以检查是否有密钥更改。有两件事必须处理:
现在让我们看看每个块的代码。由于抵消预订必须在不同的地方进行,此代码已放入表单例程中。
开始交易
*更改公司或货币代码时,需要新的文档
*我们在此处写入上一个文档的平衡分录,
*在BBKPF的记录末尾添加一个新的标题
如果不是上一个bukrs,则为首字母和(infle bukrs ne prev bukrs或
infle waers ne)prev\u waers或infle balseg ne prev\u balseg)。
执行偏移量输入。
h\u writehdr='X'。请在BBPKF记录的结尾检查此项
endif。
我们定义了一些变量来包含前面的关键字字段值:prev\u bukrs、prev\u waers和prev\u balseg。当我们读取第一条记录时,它们有一个初始值。否则,如果值更改,我们将记账写入抵销科目,淘客推广怎么做,并设置标志以写入新文档的标题记录。
结束记录(BGR00)
*在第一个转移记录。
如果g\U cnt\U transactions\U read=1。
转移记录。
如果g\U cnt\U transactions\U group=5000。
g\U cnt\U transactions\U group=0.
传输会话记录
endif.
BGR00为批量输入会话记录。这是标准编码,只是我们用读取事务计数的测试取代了"最初"测试。
记录结束(BBKPF)
公司变更时,货币代码或平衡段
*开始一个新的文档
如果h\U writehdr='X'或prev\U bukrs是初始的
*检查prev\U bukrs以获得第一个标题
转移记录
h\U writehdr="."endif.
*在这里设置以前的值
prev\U bukrs=infle bukrs.
prev\U waers=infle waers.
prev\U balseg=infle balseg.
BBKPF是文档标题。我们为第一条记录以及键更改时编写一个头。我们还在此处更新以前的键值。
结束记录(BBSEG)
如果跳过记录,则返回是。
转移记录。
更新平衡项的运行总数
如果infie-NEWBS='40'。
g\u wrbtr\u sum=g\u wrbtr\u sum+h\u wrbtr。
g\u dmbtr\u sum=g\u dmbtr\u sum+h\u dmbtr。
其他过帐键50
g\ U wrbtr\ U sum=g\ U wrbtr\ U sum–h\ U wrbtr.
g\ U dmbtr\ U sum=g\ U dmbtr\ U sum–h\ U dmbtr.
endif.
g\ U item\ U count=g\ U item\ U count+1.
如果g\ U item\ U count=949."将文档拆分到949个项目后
执行抵销\输入。
g\ U item\ U count=0。"写入记录
传输此记录'BBKPF'后重置项目计数。"写入下一块的标题
endif.
endif.