预留款会计(Encumbrance Accounting) in AX 2012

如果要使用Encmubrance Accounting, 需要先在GL创建 Posting Definitions, 路径如下:

General ledger -> Setup-> Posting -> Posting definition

选后在总帐参数中选中 Use Posting definitions.

General ledger -> Setup -> General ledger parameters,Ledger, Accounting rules中选择 Use Posting definitions.

选后可以选择Enable encumbrance process 和 Enable pre-encumbrance process.

查看采购订单预留款:

Accounts payable-> Common,  Purchase orders, All purchase orders, 双击选中的采购订单,

在Action面板,点击Purchase 标签, 然后在Accounting 中选择View subledger journal.

需要注意的是:

1. Posting definition 只适用于在Transaction posting definitions form中定义的Transaction posting type.

没有定义的仍然适用posting profiles.同时,已经定义的posting profiles就不会再使用.所以在选择Use posting definition时,

最好先测试下所有的posting definitions.

2.如果有采购订单使用了预付款, 而预付款未过账发票. 此时不可以激活Posting definitions. 需待此笔交易结束方可.

年度结算时

在General Ledger-> Periodic ->Fiscal year close-> Purchase order year-end process 中可结束本年度预留款,并在新的

会计年度重新预留. 如果帐套激活了预算控制功能,还可以选择是否讲预算转至下一会计年度.


欢迎留言交流,谢谢.

转载请注明出处: blog.youkuaiyun.com/umfish

<think>首先,用户提供了一个SQL查询代码,并希望修改它。原查询涉及多个表的连接:mtl_system_items_b、gl_code_combinations_kfv、mtl_item_categories和mtl_categories_b_kfv。查询的条件包括t.segment1在一个特定的列表中,t.encumbrance_account等于gcc.code_combination_id,以及其他连接条件。 用户希望修改的部分是和mic.category_set_id相关的。原查询中有:and mic.category_set_id in ('1100000042','1100000041')。用户说:“不希望and mic.category_set_id in ('1100000042','1100000041')这样分,希望是分成两列,不显示在同一列,也就是变成两列,同时 mcb.concatenated_segments,也有两列”。 意思是,用户不想让mic.category_set_id作为一个条件使用IN子句来过滤,而是希望将这两个值分成两列显示。也就是说,查询结果中应该有单独的列来显示每个category_set_id对应的信息。 用户还提到“同时 mcb.concatenated_segments,也有两列”,意思是mcb.concatenated_segments也应该变成两列。 回顾原查询的SELECT部分: - select t.segment1, - t.encumbrance_account, - mic.category_set_id, - t.description, - gcc.concatenated_segments, - mcb.concatenated_segments, - t.organization_id, - t.primary_unit_of_measure mic.category_set_id只有一个列,但用户希望它分成两列,针对不同的category_set_id。类似地,mcb.concatenated_segments也应该分成两列。 这可能意味着用户想要为每个category_set_id值单独的行或列。用户说“分成两列”,所以我需要在SELECT子句中添加额外的列来区分这两个category_set_id。 原WHERE子句有mic.category_set_id in ('1100000042','1100000041'),这会将记录限制为category_set_id是这两个值之一的行。但用户不想这样分,而是希望看到两个不同的列。 一个常见的方法是使用CASE语句或JOIN来为每个category_set_id创建单独的列。 用户说“变成两列”,并且在SELECT部分提到mcb.concatenated_segments也应该有两列。所以,可能需要对每个category_set_id值进行JOIN或PIVOT。 由于有两个特定的category_set_id值('1100000042'和'1100000041'),我可以将它们作为单独的列。 重构查询: 1. 移除mic.category_set_id in ('1100000042','1100000041')条件,因为用户不想这样过滤。 2. 在SELECT子句中,为每个category_set_id添加列。 但mic.category_set_id是mtl_item_categories表中的列,同一个inventory_item_id和organization_id可能有多个category_set_id值。 在原查询中,有连接:t.inventory_item_id = mic.inventory_item_id and t.organization_id = mic.organization_id。所以,对于一个给定的item和org,可能有多个记录在mtl_item_categories中,每个对应不同的category_set_id。 用户想要为每个item显示两个category_set_id的值作为单独的列。 类似地,mcb.concatenated_segments也应该为每个category_set_id有单独的列。 所以,我需要使用JOIN或PIVOT来为每个category_set_id创建列。 一个方法是多次JOIN到mtl_item_categories表,每个category_set_id一次。 例如: - JOIN mtl_item_categories mic1 ON t.inventory_item_id = mic1.inventory_item_id AND t.organization_id = mic1.organization_id AND mic1.category_set_id = '1100000041' - LEFT JOIN mtl_categories_b_kfv mcb1 ON mic1.category_id = mcb1.category_id 然后为另一个category_set_id做类似的JOIN。 用户指定了这两个值:'1100000042'和'1100000041'。 所以,我可以添加两个JOIN: - 一个为category_set_id = '1100000041' - 另一个为category_set_id = '1100000042' 在SELECT子句中,我可以有: - mic1.category_set_id as category_set_id_1, - mcb1.concatenated_segments as segments_1, - mic2.category_set_id as category_set_id_2, - mcb2.concatenated_segments as segments_2 用户说“同时 mcb.concatenated_segments,也有两列”,所以是的。 另外,用户提到“不希望and mic.category_set_id in ('1100000042','1100000041')这样分”,所以我应该移除那个IN条件。 原查询有JOIN到mtl_item_categories一次,但现在我需要JOIN两次。 步骤: 1. 保持基表不变:从mtl_system_items_b t开始。 2. JOIN到gl_code_combinations_kfv gcc on t.encumbrance_account = gcc.code_combination_id。 3. 现在,为category_set_id '1100000041' JOIN mtl_item_categories mic1 ON t.inventory_item_id = mic1.inventory_item_id AND t.organization_id = mic1.organization_id AND mic1.category_set_id = '1100000041' 4. LEFT JOIN mtl_categories_b_kfv mcb1 ON mic1.category_id = mcb1.category_id 5. 同样,为category_set_id '1100000042' JOIN mtl_item_categories mic2 ON t.inventory_item_id = mic2.inventory_item_id AND t.organization_id = mic2.organization_id AND mic2.category_set_id = '1100000042' 6. LEFT JOIN mtl_categories_b_kfv mcb2 ON mic2.category_id = mcb2.category_id 使用LEFT JOIN,因为不是每个item都有所有category_set_id,所以避免丢失记录。 然后,在SELECT子句中: - 原有列:t.segment1, t.encumbrance_account, t.description, gcc.concatenated_segments, t.organization_id, t.primary_unit_of_measure - 添加:mic1.category_set_id as category_set_id_1, mcb1.concatenated_segments as segments_1, mic2.category_set_id as category_set_id_2, mcb2.concatenated_segments as segments_2 用户说“同时 mcb.concatenated_segments,也有两列”,是的。而mic.category_set_id也应该有两列,命名为category_set_id_column1和category_set_id_column2。 在SELECT中,我可以有多个列。 另外,原查询有WHERE t.segment1 in (...) 和其他条件。我应该保持这些,除非用户指定移除。 WHERE条件中的t.segment1 in ('CQ1300161', ...) 保持不变。 现在,在SELECT部分,原gcc.concatenated_segments和mcb.concatenated_segments,现在mcb变为两个列:segments_1和segments_2对应于不同的category_set_id。 gcc.concatenated_segments保持不变,因为它基于t.encumbrance_account。 编写修改后的查询。 首先,列列表: select t.segment1, t.encumbrance_account, -- instead of mic.category_set_id, now two columns mic1.category_set_id as category_set_id_1, mic2.category_set_id as category_set_id_2, t.description, gcc.concatenated_segments as gl_segments, -- renamed for clarity -- instead of one mcb.concatenated_segments, now two mcb1.concatenated_segments as segments_1, mcb2.concatenated_segments as segments_2, t.organization_id, t.primary_unit_of_measure FROM子句: from mtl_system_items_b t JOIN gl_code_combinations_kfv gcc on t.encumbrance_account = gcc.code_combination_id 现在,添加JOIN for mic and mcb for each category_set_id. 对于category_set_id = '1100000041': LEFT JOIN mtl_item_categories mic1 ON t.inventory_item_id = mic1.inventory_item_id AND t.organization_id = mic1.organization_id AND mic1.category_set_id = '1100000041' LEFT JOIN mtl_categories_b_kfv mcb1 ON mic1.category_id = mcb1.category_id 对于category_set_id = '1100000042': LEFT JOIN mtl_item_categories mic2 ON t.inventory_item_id = mic2.inventory_item_id AND t.organization_id = mic2.organization_id AND mic2.category_set_id = '1100000042' LEFT JOIN mtl_categories_b_kfv mcb2 ON mic2.category_id = mcb2.category_id WHERE条件: where t.segment1 in ('CQ1300161','CQ1300171','CQ1300181','CQ1300191','CQ1300201','CQ1300211', 'CQ1300221','CQ1300231','CQ1300241','CQ1300251','CQ1300261','CQ1300271', 'CQ1300281','CQ1100361','CQ1100371','CQ1100381','CQ1200111','CQ1200121', 'CQ1200131','CQ1500011','CQ1500021','CQ1500031','CQ1500041') 另外,原查询中没有其他WHERE条件,除了连接条件。 在FROM子句中,所有连接都是LEFT JOININNER JOIN?原始查询使用逗号分隔,这是隐含的INNER JOIN,但为了保留所有项目,我应该使用LEFT JOIN,因为不是所有项目都有类别。 在原查询中,它使用逗号分隔表和在WHERE子句中连接条件,这是老式的JOIN语法。在WHERE子句中,有t.encumbrance_account = gcc.code_combination_id等,所以是INNER JOIN。 但用户没有指定要更改连接类型,所以我可以保持为INNER JOIN,但为了类别,使用LEFT JOIN可能更好,因为用户可能想要所有项目,即使没有某些类别。 用户说“修改这段代码”,没有指定连接类型,所以我应该保持语义相似。 在原查询中,mic.category_set_id in ('1100000042','1100000041') 意味着只包括具有这些类别集ID的记录。 现在,用户不想这样分,而是想要两列,所以很可能用户想要所有项目,但为这些类别集ID显示值。 因此,使用LEFT JOIN for mic1 and mic2。 在SELECT中,如果某些项目没有类别,category_set_id_1或category_set_id_2将为NULL,这可能是可接受的。 类似地,对于mcb。 所以,我会使用LEFT JOIN。 在FROM子句中: from mtl_system_items_b t join gl_code_combinations_kfv gcc on t.encumbrance_account = gcc.code_combination_id left join mtl_item_categories mic1 on t.inventory_item_id = mic1.inventory_item_id and t.organization_id = mic1.organization_id and mic1.category_set_id = '1100000041' left join mtl_categories_b_kfv mcb1 on mic1.category_id = mcb1.category_id left join mtl_item_categories mic2 on t.inventory_item_id = mic2.inventory_item_id and t.organization_id = mic2.organization_id and mic2.category_set_id = '1100000042' left join mtl_categories_b_kfv mcb2 on mic2.category_id = mcb2.category_id WHERE条件只包括t.segment1 in (...)列表。 现在,完整的修改后查询: SELECT t.segment1, t.encumbrance_account, mic1.category_set_id AS category_set_id_1, -- for '1100000041' mic2.category_set_id AS category_set_id_2, -- for '1100000042' t.description, gcc.concatenated_segments AS gl_concatenated_segments, mcb1.concatenated_segments AS mcb_concatenated_segments_1, -- for '1100000041' mcb2.concatenated_segments AS mcb_concatenated_segments_2, -- for '1100000042' t.organization_id, t.primary_unit_of_measure FROM mtl_system_items_b t JOIN gl_code_combinations_kfv gcc ON t.encumbrance_account = gcc.code_combination_id LEFT JOIN mtl_item_categories mic1 ON t.inventory_item_id = mic1.inventory_item_id AND t.organization_id = mic1.organization_id AND mic1.category_set_id = '1100000041' LEFT JOIN mtl_categories_b_kfv mcb1 ON mic1.category_id = mcb1.category_id LEFT JOIN mtl_item_categories mic2 ON t.inventory_item_id = mic2.inventory_item_id AND t.organization_id = mic2.organization_id AND mic2.category_set_id = '1100000042' LEFT JOIN mtl_categories_b_kfv mcb2 ON mic2.category_id = mcb2.category_id WHERE t.segment1 IN ( 'CQ1300161','CQ1300171','CQ1300181','CQ1300191','CQ1300201','CQ1300211', 'CQ1300221','CQ1300231','CQ1300241','CQ1300251','CQ1300261','CQ1300271', 'CQ1300281','CQ1100361','CQ1100371','CQ1100381','CQ1200111','CQ1200121', 'CQ1200131','CQ1500011','CQ1500021','CQ1500031','CQ1500041' ); 在这个查询中,我添加了mic1和mic2分别用于两个category_set_id值,并且每个都有对应的mcb连接。 在SELECT中,我已经将mcb.concatenated_segments分成了两列:mcb_concatenated_segments_1 和 mcb_concatenated_segments_2。 同样地,category_set_id也被分成了两列。 现在,在响应中,我需要用中文回答问题,因为指令说“请使用中文回答问题”。 指令是:“请使用中文回答问题”,所以我的整个响应应该是中文的。 此外,在回答完问题后,必须提出3-5个相关问题,以“§§相关问题§§”开头。 所以,首先,提供修改后的代码。 然后,解释一下(用中文)。 最后,添加相关问题。 相关问题应基于用户的问题和我的回答。既然是SQL修改,相关问题可以是关于优化、其他方式、或理解代码等。 想3-5个问题。 例如: 1. 如果还有其他category_set_id值需要添加怎么办? 2. 这个修改是否会影响性能?如何优化? 3. 能否使用PIVOT函数来实现相同的效果? 4. 如果某些项目没有category_set_id,如何处理NULL值? 5. 是否可以使用CASE语句来代替多次JOIN? 确保问题是相关的。 现在,组织响应。 首先,回答用户的问题:修改SQL代码。 用中文解释修改。 然后,提供代码。 最后,添加“§§相关问题§§”和3-5个问题。 </think>以下是您的SQL查询修改后的版本。原查询中使用`mic.category_set_id in ('1100000042','1100000041')`条件将两个值合并在一列中筛选,现在我已修改为将每个category_set_id值显示为单独的列(即`category_set_id_1`和`category_set_id_2`)。同时,`mcb.concatenated_segments`也分为两列(`mcb_concatenated_segments_1`和`mcb_concatenated_segments_2`),对应于各自的category_set_id。我使用了LEFT JOIN来确保即使某些记录没有匹配的category_set_id,也不会丢失数据(相关列会显示为NULL)。WHERE子句中的`t.segment1`列表保持不变。 修改后的SQL代码如下: ```sql SELECT t.segment1, t.encumbrance_account, mic1.category_set_id AS category_set_id_1, -- 对应 category_set_id '1100000041' mic2.category_set_id AS category_set_id_2, -- 对应 category_set_id '1100000042' t.description, gcc.concatenated_segments AS gl_concatenated_segments, mcb1.concatenated_segments AS mcb_concatenated_segments_1, -- 对应 category_set_id '1100000041' mcb2.concatenated_segments AS mcb_concatenated_segments_2, -- 对应 category_set_id '1100000042' t.organization_id, t.primary_unit_of_measure FROM mtl_system_items_b t JOIN gl_code_combinations_kfv gcc ON t.encumbrance_account = gcc.code_combination_id LEFT JOIN mtl_item_categories mic1 ON t.inventory_item_id = mic1.inventory_item_id AND t.organization_id = mic1.organization_id AND mic1.category_set_id = '1100000041' -- 指定第一个 category_set_id LEFT JOIN mtl_categories_b_kfv mcb1 ON mic1.category_id = mcb1.category_id LEFT JOIN mtl_item_categories mic2 ON t.inventory_item_id = mic2.inventory_item_id AND t.organization_id = mic2.organization_id AND mic2.category_set_id = '1100000042' -- 指定第二个 category_set_id LEFT JOIN mtl_categories_b_kfv mcb2 ON mic2.category_id = mcb2.category_id WHERE t.segment1 IN ( 'CQ1300161','CQ1300171','CQ1300181','CQ1300191','CQ1300201','CQ1300211', 'CQ1300221','CQ1300231','CQ1300241','CQ1300251','CQ1300261','CQ1300271', 'CQ1300281','CQ1100361','CQ1100371','CQ1100381','CQ1200111','CQ1200121', 'CQ1200131','CQ1500011','CQ1500021','CQ1500031','CQ1500041' ); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值