Reading25. Inventories

本文详细探讨了存货的成本认定及发出存货的计量方法,包括个别计价法、先进先出法、后进先出法及加权平均法,并对比了不同方法在IFRS与U.S. GAAP下的应用。此外,还讨论了存货减值处理及其对财务报表的影响。

25.1 Initial recognition of cost of inventory

25.1.1 生产成本(Product costs)and 期间成本(period costs)

Product costs(capitalized) Period costs(expensed)
Purchase cost—discounts and rebates Abnormal waste of materials, labor, or overhead
Conversion costs including labor and production overhead Storage costs
Other costs necessary to bring the inventory to its present location and condition Administrative overhead
Selling costs

25.2 发出存货的计量

25.2.1 发出存货的计价方法(Inventory COGS valuation method)

一、个别计价法(Specific Identification)

The actual costs incurred to purchase the items specifically identified as sold

二、先进先出法(First-In, First-Out (FIFO))

Oldest goods purchased (or manufactured) are sold first

三、后进先出法(Last-In, First-Out (LIFO))

Newest goods purchased (or manufactured) are sold first

COGS reflect current costs

四、加权平均法(Weighted Average Cost)

Assigns the average cost of the goods available for sale

五、总结对比

IFRS U.S. GAAP
Specific identification
Weighted average cost
First-in, first-out (FIFO)
Last-in, first-out (LIFO) ×
  • Assuming increasing prices

    B/S
    LIFO FIFO
    Inventory
    Current Assets Lower Higher
    Quick ratio No change No change
    Current ratio Lower Higher
    Inventory turnover Higher Lower
    Total assets Lower Higher
    Total asset turnover Higher Lower
    Debt-to-assets Higher Lower
    Equity Lower Higher
    I/S
    LIFO FIFO
    COGS Higher Lower
    Operating margin Lower Higher
    Tax Lower Higher
    Net Income Lower Higher
    Net profit margin Lower Higher
    ROA, ROE<1 Lower Higher

25.2.2 存货盘点方法

一、实地盘存法(Periodic inventory system)

Inventory value and COGS are determined at the end of an accounting period.

Need a purchase account

二、永续盘存法(Perpetual inventory system)

Inventory value and COGS are updated continuously

Inventory purchased and sold is recorded directly in inventory when the transactions occur.

三、总结归纳

Perpetual inventory system= Periodic inventory system in FIFO and specific identification method

Perpetual inventory system≠ Periodic inventory system in LIFO and weighted average cost method

25.2.3 后进先出法的特殊问题

一、后进先出储备(LIFO Reserve)

I n v e n t o r y F I F O = I n v e n t o r y L I F O + L I F O   R e s e r v e C O G S F I F O = C O G S L I F O – Δ L I F O   R e s e r v e Inventory_{FIFO} = Inventory_{LIFO} + LIFO \ Reserve \\ COGS_{FIFO} = COGS_{LIFO} – ΔLIFO \ Reserve InventoryFIFO=InventoryLIFO+LIFO ReserveCOGSFIFO<

<think>嗯,用户希望将C# LINQ代码转换为SQL Server查询,同时要逐行分析。首先,我需要仔细理解每一行LINQ的作用,然后对应到SQL的语法。 第一行的UnitOfWork.Where是筛选条件,对应的应该是SQL中的WHERE子句。条件包括MaterialId相等,Number大于FreezeNumber,IsCheckLock为false,Remark不等于“出库异常,待盘点”。这里要注意的是,InventoryLoc和Inventories之间的关联,可能需要JOIN操作。 然后是Include(x => x.Inventories),这说明需要加载关联的Inventories实体。在SQL中,这应该通过INNER JOIN来实现,连接条件是InventoryLoc.InventoryId等于Inventories.Id,假设外键是InventoryId。不过用户的实际表结构可能不同,需要确认关联字段,但根据常规设计,这里暂时假设如此。 接下来是OrderBy和ThenBy,对应SQL的ORDER BY子句。Mfd字段升序排列,然后是StoreAreaId是否在AreaIds列表中。这里需要注意的是,AreaIds.Contains需要转换为SQL的IN语句,但排序时可能需要根据是否在列表中进行排序,可能需要使用CASE表达式来生成一个排序优先级。 然后foreach循环处理库存分配,这部分可能涉及业务逻辑,在SQL中可能需要使用游标或临时表,但用户没有给出具体逻辑,所以暂时无法转换,需要进一步询问。 现在考虑生成SQL查询的结构:SELECT需要的字段,FROM InventoryLoc,JOIN Inventories,WHERE条件,ORDER BY子句。同时要注意LINQ中的Include会导致一次性获取关联实体,所以JOIN是必须的。 另外,变量outDet.MaterialId在C#中是参数,对应SQL中应该是参数化查询,用@MaterialId占位符。AreaIds是一个列表,可能需要用表值参数或者IN子句,但这里在排序中使用Contains,可能需要用CASE WHEN StoreAreaId IN (...) THEN 0 ELSE 1 END来排序,这样在IN中的AreaIds会优先排序。 需要确认AreaIds是动态生成的列表,因此在SQL中可能需要作为参数传递,比如使用WHERE IN (@AreaIds),但这里是在排序中,所以可能需要动态SQL或者应用层处理,不过用户可能希望直接在SQL中实现,所以用CASE表达式更合适。 综上,最终的SQL结构大致如下: SELECT ... FROM InventoryLoc INNER JOIN Inventories ON ... WHERE MaterialId = @MaterialId AND Number > FreezeNumber AND IsCheckLock = 0 AND Remark <> N'出库异常,待盘点' ORDER BY Mfd, CASE WHEN StoreAreaId IN (@AreaIds) THEN 0 ELSE 1 END; 不过需要处理AreaIds作为参数的问题,可能需要将列表拆分为多个参数,或者使用表值参数。但根据用户提供的代码,AreaIds是一个列表,可能在C#中生成,所以在转换为SQL时,可能需要使用字符串分割或者其他方法传递。但为了简化,可能在SQL中使用IN列表,比如将AreaIds作为逗号分隔的字符串,然后用STRING_SPLIT函数处理,但这样可能影响性能。 或者,在应用层生成动态SQL,但用户希望生成等效的SQL查询,所以可能需要假设AreaIds是已知的,直接写在IN子句中。不过更合理的做法是使用参数化查询,比如使用WHERE StoreAreaId IN (SELECT value FROM STRING_SPLIT(@AreaIds, ',')),但排序中的处理可能需要不同的方法。 可能用户更关注的是结构,所以先按照CASE表达式处理排序部分,AreaIds作为变量传入。 另外,注意C#中的x.IsCheckLock == false对应SQL中的IsCheckLock = 0,假设该字段是bit类型。 在字段名前可能需要加上表别名,比如InventoryLoc.Number,Inventories.MaterialId等,需要确认表结构和关联条件。 总结步骤: 1. 分析LINQ中的Where条件,转换为WHERE子句。 2. Include转换为JOIN。 3. OrderBy和ThenBy转换为ORDER BY,处理Contains为CASE表达式。 4. 处理变量参数,如@MaterialId和@AreaIds。 5. 确保SQL语法正确,比如使用N''处理Unicode字符串,使用正确的比较运算符。 可能遗漏的地方是表之间的关联条件,需要明确InventoryLoc和Inventories的关系,通常是外键关联。比如InventoryLoc.InventoryId = Inventories.Id,但用户代码中是x.Inventories.MaterialId,所以可能关联条件是InventoryLoc.InventoryId = Inventories.Id,然后Inventories.MaterialId等于外部参数。 最后,生成SQL时要使用正确的别名,比如FROM InventoryLoc AS il INNER JOIN Inventories AS i ON il.InventoryId = i.Id,然后在WHERE子句中使用i.MaterialId = @MaterialId。 需要确保所有引用的字段都来自正确的表,比如Number和FreezeNumber属于InventoryLoc,而StoreAreaId属于Inventories。 现在把这些思考整理成结构化的回答,并生成相关问题。</think>### 逐行代码分析与SQL转换 #### 1. LINQ查询解析 原始C#代码: ```csharp var invlocss = UnitOfWork.Where<InventoryLoc>( x => x.Inventories.MaterialId == outDet.MaterialId && x.Number > x.FreezeNumber && x.IsCheckLock == false && x.Remark != "出库异常,待盘点") .Include(x => x.Inventories); ``` #### 等效SQL语句(基础查询): ```sql SELECT il.*, i.* FROM InventoryLoc il INNER JOIN Inventories i ON il.InventoryId = i.Id -- 假设通过InventoryId关联 WHERE i.MaterialId = @MaterialId AND il.Number > il.FreezeNumber AND il.IsCheckLock = 0 AND il.Remark <> N'出库异常,待盘点' ``` #### 2. 排序逻辑解析 ```csharp matInvLocs = invlocss.OrderBy(x => x.Mfd) .ThenBy(x => AreaIds.Contains(x.Inventories.StoreAreaId)); ``` #### 等效SQL排序实现: ```sql ORDER BY il.Mfd ASC, CASE WHEN i.StoreAreaId IN (SELECT value FROM STRING_SPLIT(@AreaIds, ',')) THEN 0 ELSE 1 END ASC ``` #### 3. 完整SQL查询 ```sql DECLARE @MaterialId INT = 123; -- 示例参数 DECLARE @AreaIds VARCHAR(MAX) = '1,2,3'; -- 示例区域ID集合 SELECT il.*, i.* FROM InventoryLoc il INNER JOIN Inventories i ON il.InventoryId = i.Id WHERE i.MaterialId = @MaterialId AND il.Number > il.FreezeNumber AND il.IsCheckLock = 0 AND il.Remark <> N'出库异常,待盘点' ORDER BY il.Mfd ASC, CASE WHEN i.StoreAreaId IN (SELECT value FROM STRING_SPLIT(@AreaIds, ',')) THEN 0 ELSE 1 END ASC ``` ### 关键实现差异说明 1. **Include映射**:`Include(x => x.Inventories)` 对应显式的 `INNER JOIN` 操作[^1] 2. **条件组合**:C#的 `&&` 运算符对应SQL的 `AND` 逻辑 3. **特殊排序**:`AreaIds.Contains()` 需通过 `CASE` 表达式实现优先级排序 4. **字符串处理**:中文常量需使用 `N''` 声明为Unicode字符串 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值