分享一个总仓核算模式下循环获取物料期末单价的C#方法(向前寻找12个月)

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

分享一个总仓核算模式下循环获取物料期末单价的C#方法(向前寻找12个月)

有些财务想通过期末结存单价计算物料清单的成本(系统只支持采购订单/采购入库/采购发票/采购价目表/物料参考成本)或者是在即时库存看到物料的期末结存单价,此方法递归查询物料最新一期的期末结存单价。分仓核算模式下,需要关联核算范围表 获取仓库信息 方面里面添加仓库参数即可。

 /// <summary>

        /// 总仓模式:获取物料的期末结存单价,期末数量为0则获取发出单价/收入单价,最大向前追溯12个月 ctx当前上下文,fma物料编码,year年份,qj期间,i默认0 返回一个List<string> List[0] 单价 List[1] 取价期间

        /// </summary>

        /// <param name="ctx"></param>

        /// <param name="fma"></param>

        /// <param name="year"></param>

        /// <param name="qj"></param>

        /// <param name="i"></param>

        /// <returns></returns>

        public List<string> GetCost(Context ctx, string fma, int year, int qj,int i, int zz)

        {

           

            List<string> msgs = new List<string>();

            if (i > 12)

            {

                return null;

            }

            else

            {

                if (i == 0)

                {

                    string sql = string.Format("select  a.FBEGINADJAMOUNT,FENDINITKEY,FQTY,a.FOUTSTOCKQTY,a.FCURRENTINQTY,a.FCURRENTINAMOUNT,a.FCURRENTOUTAMOUNT,isnull(e.FADJUSTMENTAMOUNT,0)FADJUSTMENTAMOUNT from    T_HS_Balance  a inner join T_HS_StockDimension b on a.FDIMEENTRYID=b.FENTRYID  inner join T_BD_MATERIAL c on b.FMASTERID=c.FMASTERID   inner join T_HS_OUTACCTG d on a.FID=d.FID  left join (select  isnull(sum (FADJUSTMENTAMOUNT),0) FADJUSTMENTAMOUNT,FAcctgDimeEntryId  from   T_HS_ADJUSTMENTBILL a inner join  T_HS_ADJUSTMENTBILLENTRY b  on a.FID=b.FID  inner join T_HS_OUTACCTG c on a.FACCTGID=c.FID  where    FYEAR='{1}' and FPERIOD='{2}'   group by  FAcctgDimeEntryId) e on a.FDIMEENTRYID=e.FACCTGDIMEENTRYID inner join T_HS_CALDIMENSIONS f on a.FDIMENSIONID=f.FDIMENSIONID  and f.FACCTSYSTEMID='1' and f.FFINORGID='{3}' where    c.FUSEORGID='{3}'   and  FENDINITKEY=1  and c.FNUMBER='{0}'     ", fma, year, qj, zz);

                    DataTable table = this.Select(sql, ctx);

                    if (table != null && (Convert.ToDecimal(table.Rows[0]["FQTY"]) != 0 || Convert.ToDecimal(table.Rows[0]["FOUTSTOCKQTY"]) != 0 || Convert.ToDecimal(table.Rows[0]["FCURRENTINQTY"]) != 0))

                    {

                        if (Convert.ToDecimal(table.Rows[0]["FQTY"]) == 0)//结存数量为0

                        {

                            if (Convert.ToDecimal(table.Rows[0]["FOUTSTOCKQTY"]) == 0)//发出数量为0

                            {

                                msgs.Add(Math.Round(Convert.ToDecimal(table.Rows[0]["FCURRENTINAMOUNT"]) / Convert.ToDecimal(table.Rows[0]["FCURRENTINQTY"]), 6).ToString());

                                msgs.Add(string.Format("'{0}'年{1}期收入单价", year, qj));

                                return msgs;

                            }

                            else

                            {


                                msgs.Add(Math.Round(Convert.ToDecimal(table.Rows[0]["FCURRENTOUTAMOUNT"]) / Convert.ToDecimal(table.Rows[0]["FOUTSTOCKQTY"]), 6).ToString());

                                msgs.Add(string.Format("{0}年{1}期发出单价", year, qj));

                                return msgs;

                            }

                        }

                        else

                        {

                            msgs.Add(Math.Round((Convert.ToDecimal(table.Rows[0]["FBEGINADJAMOUNT"]) - Convert.ToDecimal(table.Rows[0]["FADJUSTMENTAMOUNT"]) - Convert.ToDecimal(table.Rows[0]["FCURRENTOUTAMOUNT"]) + Convert.ToDecimal(table.Rows[0]["FCURRENTINAMOUNT"])) / Convert.ToDecimal(table.Rows[0]["FQTY"]), 6).ToString());

                            msgs.Add(string.Format("{0}年{1}期期末余额", year, qj));

                            return msgs;

                        }

                    }


                    else

                    {

                        i++;

                        if (i < qj)

                        {


                            return GetCost(ctx, fma, year, qj - i,i, zz);

                        }

                        else

                        {

                            return GetCost(ctx, fma, year - 1, qj - i + 12,i, zz);

                        }


                    }

                }


                else

                {

                    string sql = string.Format("select  a.FBEGINADJAMOUNT,a.FQTY,a.FOUTSTOCKQTY,a.FCURRENTINQTY,a.FCURRENTINAMOUNT,a.FCURRENTOUTAMOUNT,isnull(e.FADJUSTMENTAMOUNT,0)FADJUSTMENTAMOUNT from    T_HS_BALANCE_H  a inner join T_HS_StockDimension b on a.FDIMEENTRYID=b.FENTRYID  inner join T_BD_MATERIAL c on b.FMASTERID=c.FMASTERID   inner join T_HS_OUTACCTG d on a.FID=d.FID left join (select  isnull(sum (FADJUSTMENTAMOUNT),0) FADJUSTMENTAMOUNT,FAcctgDimeEntryId  from   T_HS_ADJUSTMENTBILL a inner join  T_HS_ADJUSTMENTBILLENTRY b  on a.FID=b.FID  inner join T_HS_OUTACCTG c on a.FACCTGID=c.FID  where    FYEAR='{1}' and FPERIOD='{2}'   group by  FAcctgDimeEntryId) e on a.FDIMEENTRYID=e.FACCTGDIMEENTRYID inner join T_HS_CALDIMENSIONS f on a.FDIMENSIONID=f.FDIMENSIONID  and f.FACCTSYSTEMID='1' and f.FFINORGID='{3}'  where  c.FUSEORGID='{3}' and  FENDINITKEY=1    and c.FNUMBER='{0}'  and FYEAR='{1}' and FPERIOD='{2}' ", fma, year, qj, zz);

                    DataTable table = this.Select(sql, ctx);

                    if (table != null && (Convert.ToDecimal(table.Rows[0]["FQTY"]) != 0 || Convert.ToDecimal(table.Rows[0]["FOUTSTOCKQTY"]) != 0 || Convert.ToDecimal(table.Rows[0]["FCURRENTINQTY"]) != 0))

                    {

                        if (Convert.ToDecimal(table.Rows[0]["FQTY"]) == 0)//结存数量为0

                        {

                            if (Convert.ToDecimal(table.Rows[0]["FOUTSTOCKQTY"]) == 0)//发出数量为0

                            {

                                msgs.Add(Math.Round(Convert.ToDecimal(table.Rows[0]["FCURRENTINAMOUNT"]) / Convert.ToDecimal(table.Rows[0]["FCURRENTINQTY"]), 6).ToString());

                                msgs.Add(string.Format("{0}年{1}期收入单价", year, qj));

                                return msgs;

                            }

                            else

                            {


                                msgs.Add(Math.Round(Convert.ToDecimal(table.Rows[0]["FCURRENTOUTAMOUNT"]) / Convert.ToDecimal(table.Rows[0]["FOUTSTOCKQTY"]), 6).ToString());

                                msgs.Add(string.Format("{0}年{1}期发出单价", year, qj));

                                return msgs;

                            }

                        }

                        else

                        {

                            msgs.Add(Math.Round((Convert.ToDecimal(table.Rows[0]["FBEGINADJAMOUNT"]) - Convert.ToDecimal(table.Rows[0]["FADJUSTMENTAMOUNT"]) - Convert.ToDecimal(table.Rows[0]["FCURRENTOUTAMOUNT"]) + Convert.ToDecimal(table.Rows[0]["FCURRENTINAMOUNT"])) / Convert.ToDecimal(table.Rows[0]["FQTY"]), 6).ToString());

                            msgs.Add(string.Format("{0}年{1}期期末余额", year, qj));

                            return msgs;

                        }

                    }


                    else

                    {

                        i++;

                        if (qj - 1 >= 1)

                        {


                            return GetCost(ctx, fma, year, qj - 1,i, zz);

                        }

                        else

                        {

                            return GetCost(ctx, fma, year - 1, qj - 1 + 12,i, zz);

                        }


                    }

                }

            }



        }


   /// <summary>

        /// 数据库查询

        /// </summary>

        /// <param name="sql">查询sql</param>

        /// <param name="ctx">上下文</param>

        /// <returns></returns>

        public DataTable Select(string sql, Context ctx)

        {

            DataSet table = DBServiceHelper.ExecuteDataSet(ctx, sql);

            if (!(table != null && table.Tables.Count > 0 && table.Tables[0].Rows.Count > 0))

            {

                return null;

            }

            else

            {

                return table.Tables[0];

            }

        }



楼主是值得我深深关注的大神。


牛逼

分享一个总仓核算模式下循环获取物料期末单价的C#方法(向前寻找12个月)

有些财务想通过期末结存单价计算物料清单的成本(系统只支持采购订单/采购入库/采购发票/采购价目表/物料参考成本)或者是在即时库存看到物...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息