用友T6全功能100站点应用实例中库存管理的库龄分析

库存账龄是在某时间节点,某种或某类存货的库存时间的加权平均值,跟库存周转率关系明显。库存周转率越高,库存账龄越低,可是二者又不是反比关系。不能简单把库存账龄看成库存周转率的一个衍生指标来对待 ,

主界面 (如图2.4.1图1)。

目的:一、库存成本的控制。二、存货跌价准备计提。

功能:【所有导出】将当前页的所有仓库相应的所有产品导出到EXCEL文档。【选择导出】将当前页选择的的产品导出到Excel文档。【查询】多条件筛选查询数据(如图2.4.1 图2)。【定位】查询某产品定位到某行,假设产品在多个仓库,能够选择下条定位(如图2.4.2 图3)。

主界面:

2.4.1(图1)

筛选查询框:

2.4.2(图2)

定位查询框:

从界面上能够看到00我们这里用到的控件有

控件名称说明

日期控件(DateTimePicker)控件能够在工具箱直接拖动至窗口。拖至窗口后右击属性能够改动控件的样式和各种属性,还能够编辑事件。

下拉框(ComboBox)

文本(TextBox)

button(Button)

表格(DataGridView)

复选框(CheckBox)

功能实现:

第一步:数据库

1、表与关系

表1:  出入库记录明细表(InAndOutOfInventoryRecordList)

[td]

列名数据类型主键/外键说明

InAndOutOfInventoryRecordListIDint - Identity主键出入库记录明细ID

Quantitydecimal (18, 3)数量

TheUnitPricedecimal (18, 3)单位价格

InAndOutOfInventoryRecordIDint外键存货ID

TheInventoryIDint外键出入库存记录ID

表2:  出入库记录表(InAndOutOfInventoryRecord)

[td]

列名数据类型主键/外键说明

InAndOutOfInventoryRecordIDint - Identity主键出入库存记录ID

WarehouseID_Dispatchint外键仓库ID_出库

ForTheTypeIDint外键出入库类型ID

WarehouseInventory_IDint外键仓库ID_入库

OoperateDatedatetime操作日期

2、模糊查询匹配

第一步:界面层(UIL)代码,写在查询button点击事件

截图效果:

首先选择好模糊匹配定位(比方输入“双”字,假设选择左模糊。则查出“双XX”的产品,假设选择右模糊,则查出“XX双”,假设选择包括能够为左、右模糊加上“XX双XX”,假设是精确查询,则为“双”的产品)

代码:

private voidbtnFixedPosition_Click(object sender, EventArgs e)        {            stringstrRowFilter = "";   //查询条件            stringstrProductName = txtProductName1.Text.Trim();  //定位到筛选后的一行            if(strProductName == "") { return; }            if(radLeft.Checked)    //左模糊            {                strRowFilter = string.Format("产品名称 like '%{0}'", strProductName.Trim());            }            else            {                if(radRight.Checked)  //右模糊                {                    strRowFilter = string.Format("产品名称 like '{0}%'", strProductName.Trim());                }                else                {                    if(radContain.Checked)  //包括模糊                    {                        strRowFilter = string.Format("产品名称 like '%{0}%'", strProductName.Trim());                    }                    else       //精确查询                    {                        strRowFilter = string.Format("产品名称 like '{0}'", strProductName.Trim());                    }                }            }            dvtest = newDataView(dtExisting) { RowFilter =strRowFilter };            dttest = dvtest.ToTable();            if(dttest.Rows.Count > 1)  //是否筛选后有一行以上            {                btnNext.Enabled = true;  //下一个  button 启用            }            else            {                btnNext.Enabled = false;  //下一个  button 不启用            }            intTpage = 0;            FixedPosition(intTpage);        } 

3、库龄明细查询分析(依据产品ID与相应的存库进行分析)

第一步:数据库的存储过程

if(@Type='btnCountAnalysis_Click_SELECTBeLaidUpQuantity')  --查询入库量计算库龄账龄   BEGIN   DECLARE @出入库流水表 TABLE (产品名称 char(30),出入库时间 nchar(10), 出入库数量 decimal,时间 DATETIME)   --创建暂时表       INSERT@出入库流水表      SELECT LTRIM(RTRIM(TheProductTable.ProductName)) AS 产品名称,      CONVERT(nchar(10),InAndOutOfInventoryRecord.OoperateDate , 20) AS 出入库时间,       LTRIM(RTRIM(CAST(-InAndOutOfInventoryRecordList.Quantity AS DECIMAL))) AS 出入库数量,      InAndOutOfInventoryRecord.OoperateDate AS 时间      FROM  InAndOutOfInventoryRecordListINNER JOIN      InAndOutOfInventoryRecord ON InAndOutOfInventoryRecordList.InAndOutOfInventoryRecordID= InAndOutOfInventoryRecord.InAndOutOfInventoryRecordIDINNER JOIN      TheInventoryTable ON InAndOutOfInventoryRecordList.TheInventoryID = TheInventoryTable.TheInventoryID INNER JOIN      TheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductID      WHERE InAndOutOfInventoryRecord.WarehouseID_Dispatch!= 0 AND      InAndOutOfInventoryRecordList.TheInventoryID IN      (SELECT TheInventoryTable.TheInventoryID AS 存货ID      FROM  TheInventoryTableINNER JOIN      TheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductID      WHERE TheProductTable.ProductID = 3 AND TheInventoryTable.WarehouseID = 1)  --产品ID、仓库ID      UNION ALL      SELECT LTRIM(RTRIM(TheProductTable.ProductName)) AS 产品名称,      CONVERT(nchar(10),InAndOutOfInventoryRecord.OoperateDate , 20) AS 出入库时间,       LTRIM(RTRIM(CAST(InAndOutOfInventoryRecordList.Quantity AS DECIMAL))) AS 出入库数量,      InAndOutOfInventoryRecord.OoperateDate AS 时间      FROM  InAndOutOfInventoryRecordListINNER JOIN      InAndOutOfInventoryRecord ON InAndOutOfInventoryRecordList.InAndOutOfInventoryRecordID= InAndOutOfInventoryRecord.InAndOutOfInventoryRecordIDINNER JOIN      TheInventoryTable ON InAndOutOfInventoryRecordList.TheInventoryID = TheInventoryTable.TheInventoryID INNER JOIN      TheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductID      WHERE InAndOutOfInventoryRecord.WarehouseInventory_ID!= 0 AND      InAndOutOfInventoryRecordList.TheInventoryID IN      (SELECT TheInventoryTable.TheInventoryID AS 存货ID      FROM  TheInventoryTableINNER JOIN      TheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductID      WHERE TheProductTable.ProductID = @ProductID AND TheInventoryTable.WarehouseID = @WarehouseID)  --产品ID、仓库ID      ORDER BYInAndOutOfInventoryRecord.OoperateDate;             SELECT 产品名称,库龄,CASE WHEN 出入库数量 > 数量 THEN 数量 ELSE 出入库数量 END AS数量      FROM (            SELECT 产品名称,            DATEDIFF(DAY,出入库时间,GETDATE()) AS 库龄,   --与今天相比,计算出相差的天数            出入库数量,            (                SELECT ISnull(SUM(CAST(出入库数量 AS DECIMAL)),0)                FROM @出入库流水表                WHERE 产品名称 =(SELECT ProductName FROM TheProductTable WHERE TheProductTable.ProductID = @ProductID)                AND 出入库时间 <= GETDATE() AND                (出入库时间 <= 出入库流水表.出入库时间 OR(出入库时间 > 出入库流水表.出入库时间 AND 出入库数量 < 0))            )AS数量            FROM  @出入库流水表 AS 出入库流水表            WHERE 产品名称 =(SELECT ProductName FROM TheProductTable WHERE TheProductTable.ProductID = @ProductID) and 出入库时间 <= GETDATE() and 出入库数量 > 0         ) as计算表      WHERE 数量 > 0      SELECT *FROM @出入库流水表   END

第二步:逻辑层(BLL)代码

        ///<summary>        ///查询入库量计算库龄账龄        ///</summary>        ///<param name="intProductID">产品ID</param>        ///<param name="intWarehouseID">仓库ID</param>        ///<returns></returns>        [OperationContract]        public DataSetbtnCountAnalysis_Click_SELECTBeLaidUpQuantity(intintProductID, int intWarehouseID)        {            SqlParameter[] SQlCMDpas = {                                             newSqlParameter("@Type",SqlDbType.Char),                                             new SqlParameter("@ProductID", SqlDbType.Int),//产品ID                                             new SqlParameter("@WarehouseID", SqlDbType.Int),//仓库ID                                        };           SQlCMDpas[0].Value = "btnCountAnalysis_Click_SELECTBeLaidUpQuantity";           SQlCMDpas[1].Value = intProductID;           SQlCMDpas[2].Value = intWarehouseID;            return myDALMethod.QueryDataSet("InventoryManage_frm_StockLookIntoTheDistance",SQlCMDpas);        }

第三步:界面层(UIL)代码。在具体库龄窗口的Load事件中绑定的数据

截图效果(在主界面点击相应的产品相应的仓库的具体库龄):


截图效果(具体库龄的主界面):

左边为产品相应的库龄与及相应库龄的数量。右边为相应产品的出入库情况(时间、数量)

截图效果(点击同样库龄合并数量):

将同样库龄的数量加起来(为什么出现同样库龄?由于在某天对该产品的进出次数多!)

代码:

(一)Load事件:

DataSet dsAgeAnalysis =myfrm_StockLookIntoTheDistance.btnCountAnalysis_Click_SELECTBeLaidUpQuantity(intProductID,intWarehouseID);           dgvInventoryAgeAnalysis.DataSource = dsAgeAnalysis.Tables[0];  //查询库龄           dgvDiscrepancyAgeAnalysis.DataSource = dsAgeAnalysis.Tables[1];  //具体出入明细           ChangeColour();  //出库标识 入库 标识 颜色

(二) 合计数量

#region 合计        ///        ///合计        ///        ///        ///        private voidbtnTotal_Click(object sender, EventArgs e)        {           listAgeAnalysis.Clear();  //又一次点击时。清空库龄集合            DataTable dtSumAgeAnalysis = new DataTable();   //保存合计的库龄           dtSumAgeAnalysis = ((DataTable)(dgvInventoryAgeAnalysis.DataSource)).Clone();            for (int intRows = 0;intRows < dgvInventoryAgeAnalysis.Rows.Count; intRows++)            {               if (!listAgeAnalysis.Exists(i => i ==Convert.ToInt32(dgvInventoryAgeAnalysis.Rows[intRows].Cells["库龄"].Value)))               {                   listAgeAnalysis.Add(Convert.ToInt32(dgvInventoryAgeAnalysis.Rows[intRows].Cells["库龄"].Value));                   dtSumAgeAnalysis.Rows.Add();                   dtSumAgeAnalysis.Rows[dtSumAgeAnalysis.Rows.Count - 1]["产品名称"] =dgvInventoryAgeAnalysis.Rows[intRows].Cells["产品名称"].Value;                   dtSumAgeAnalysis.Rows[dtSumAgeAnalysis.Rows.Count - 1]["库龄"] =dgvInventoryAgeAnalysis.Rows[intRows].Cells["库龄"].Value;                   dtSumAgeAnalysis.Rows[dtSumAgeAnalysis.Rows.Count - 1]["数量"] = 0;               }               if (listAgeAnalysis.Exists(i => i == Convert.ToInt32(dgvInventoryAgeAnalysis.Rows[intRows].Cells["库龄"].Value)))               {                   dtSumAgeAnalysis.Rows[dtSumAgeAnalysis.Rows.Count - 1]["数量"] = Convert.ToInt32(dtSumAgeAnalysis.Rows[dtSumAgeAnalysis.Rows.Count- 1]["数量"])                        + Convert.ToInt32(dgvInventoryAgeAnalysis.Rows[intRows].Cells["数量"].Value);               }            }           dgvInventoryAgeAnalysis.DataSource = dtSumAgeAnalysis;        }       #endregion 

(三)出库标识 入库 标识 颜色

///<summary>        ///出库标识 入库 标识 颜色        ///</summary>        void ChangeColour()        {            for (int intRows = 0;intRows < dgvDiscrepancyAgeAnalysis.Rows.Count; intRows++)            {               if (Convert.ToInt32(dgvDiscrepancyAgeAnalysis.Rows[intRows].Cells["出入库数量"].Value) > 0)               {                    dgvDiscrepancyAgeAnalysis.Rows[intRows].DefaultCellStyle.BackColor= Color.Gold;  //为入库               }               else               {                   dgvDiscrepancyAgeAnalysis.Rows[intRows].DefaultCellStyle.BackColor = Color.OldLace; //为出库               }            }        }用友T6全功能100站点应用实例百度网盘下载: 用友T6全功能100站点应用实例.rar (456.98 KB, 下载次数: 54) 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容