用友ERP T6技术解析(六) 库龄分析
2.4 库存管理
2.4.1 库龄分析
介绍:库存账龄是在某时间节点,某种或某类存货的库存时间的加权平均值,跟库存周转率关系明显,库存周转率越高,库存账龄越低,可是二者又不是反比关系。不能简单把库存账龄看成库存周转率的一个衍生指标来对待 。
主界面 (如图2.4.1图1)。
目的:一、库存成本的控制。
二、存货跌价准备计提。
功能:【所有导出】将当前页的所有仓库相应的所有产品导出到Excel文档。【选择导出】将当前页选择的的产品导出到Excel文档。【查询】多条件筛选查询数据(如图2.4.1 图2)。【定位】查询某产品定位到某行。假设产品在多个仓库。能够选择下条定位(如图2.4.2 图3)。
主界面:
2.4.1(图1)
筛选查询框:
2.4.2(图2)
定位查询框:
2.4.3(图3)
从界面上能够看到00我们这里用到的控件有
控件名称 |
说明 |
日期控件(DateTimePicker) |
控件能够在工具箱直接拖动至窗口,拖至窗口后右击属性能够改动控件的样式和各种属性,还能够编辑事件。 |
下拉框(ComboBox) |
|
文本(TextBox) |
|
button(Button) |
|
表格(DataGridView) |
|
复选框(CheckBox) |
功能实现:
第一步:数据库
1、表与关系
2.4.4(图4)
表1: 出入库记录明细表(InAndOutOfInventoryRecordList)
列名 |
数据类型 |
主键/外键 |
说明 |
InAndOutOfInventoryRecordListID |
int - Identity |
主键 |
出入库记录明细ID |
Quantity |
decimal (18, 3) |
数量 |
|
TheUnitPrice |
decimal (18, 3) |
单位价格 |
|
InAndOutOfInventoryRecordID |
int |
外键 |
存货ID |
TheInventoryID |
int |
外键 |
出入库存记录ID |
表2: 出入库记录表(InAndOutOfInventoryRecord)
列名 |
数据类型 |
主键/外键 |
说明 |
InAndOutOfInventoryRecordID |
int - Identity |
主键 |
出入库存记录ID |
WarehouseID_Dispatch |
int |
外键 |
仓库ID_出库 |
ForTheTypeID |
int |
外键 |
出入库类型ID |
WarehouseInventory_ID |
int |
外键 |
仓库ID_入库 |
OoperateDate |
datetime |
操作日期 |
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') --查询入库量计算库龄账龄BEGINDECLARE @出入库流水表 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 JOINInAndOutOfInventoryRecord ON InAndOutOfInventoryRecordList.InAndOutOfInventoryRecordID= InAndOutOfInventoryRecord.InAndOutOfInventoryRecordIDINNER JOINTheInventoryTable ON InAndOutOfInventoryRecordList.TheInventoryID = TheInventoryTable.TheInventoryID INNER JOINTheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductIDWHERE InAndOutOfInventoryRecord.WarehouseID_Dispatch!= 0 ANDInAndOutOfInventoryRecordList.TheInventoryID IN(SELECT TheInventoryTable.TheInventoryID AS 存货IDFROM TheInventoryTableINNER JOINTheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductIDWHERE TheProductTable.ProductID = 3 AND TheInventoryTable.WarehouseID = 1) --产品ID、仓库IDUNION ALLSELECT 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 JOINInAndOutOfInventoryRecord ON InAndOutOfInventoryRecordList.InAndOutOfInventoryRecordID= InAndOutOfInventoryRecord.InAndOutOfInventoryRecordIDINNER JOINTheInventoryTable ON InAndOutOfInventoryRecordList.TheInventoryID = TheInventoryTable.TheInventoryID INNER JOINTheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductIDWHERE InAndOutOfInventoryRecord.WarehouseInventory_ID!= 0 ANDInAndOutOfInventoryRecordList.TheInventoryID IN(SELECT TheInventoryTable.TheInventoryID AS 存货IDFROM TheInventoryTableINNER JOINTheProductTable ON TheInventoryTable.ProductID = TheProductTable.ProductIDWHERE TheProductTable.ProductID = @ProductID AND TheInventoryTable.WarehouseID = @WarehouseID) --产品ID、仓库IDORDER 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 数量 > 0SELECT *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),//产品IDnew 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 合计///<summary>///合计///</summary>///<param name="sender"></param>///<param name="e"></param>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; //为出库}}}
以上技术仅供參考。禁止用于商业用途,上述内容不代表用友立场!
转载于:https://www.cnblogs.com/cxchanpin/p/7085973.html
用友ERP T6技术解析(六) 库龄分析相关推荐
- 用友ERP T6技术解析(五)产成品入库
2.3.2 产成品入库 介绍:产成品入库这个模块,是自己公司对自己生产的产品进行入库.主界面(2.3.2图1) 功能:[全部导出]将当前页的全部单据导出到Excel文档.[部分导出]将当前页选择的单据 ...
- 用友ERP T6 技术解析(一)
VS2010版本+SQL2008搭建WCF框架 1.1.1 搭建WCF服务端 第一步:打开VS2010界面,点击左上角文件,点击新建,选择项目 1.1.1(图1) 第二步:点击VisualC#模板,再 ...
- 用友ERT T6 技术解析(四)采购入库 上
第二章 功能实现 2.1 界面信息 2.1.1 登录 2.3 采购管理 2.3.1 采购入库 介绍:采购入库这个模块,是采购订单和审核订单与入库订单的集合模块.左边dgv是单据信息,右边dgv是左 ...
- 用友ERT T6 技术解析(四)采购入库 下
7.新增采购订单 第一步:数据库的存储过程 (1)新增单据表--采购入库单 <p align="left"></p><pre name="c ...
- SAP License:SAP的库龄分析表
问题:SAP系统没有标准的库龄分析报表,这个报表出具如何处理? 解决办法: 1.可以通过批次管理,然后再财务进行FIFO评估,但是这个办法经测试发现实现比较麻烦. 2.通过如下方法可以实现. MC46 ...
- SAP库存--历史库存相关数据,以及库存变化对应表的数据变化,可以用于库龄分析报表逻辑设计。
** 库龄分析 # 在后勤模块经常会用到库存相关的数据进行报表展示以及其他数据分析,这个就需要对于SAP库存值变化以及相关表的数据更新有一定的了解. SAP历史库存相关数据,以及库存变化对应表的数据变 ...
- 库龄分析-先进先出法
先过先出法在很多的企业都非常试用,而基于企业的管理能力与实际业务数据中的不完整性,会造成实际物料的出入库情况是无序的.而管理者需要看到一定期间的物料库龄,特别是对于A,B类物料的关注情况.这样就需要I ...
- oracle先进先出法,怎样能过SQL计算先进先出库龄分析?
记得提供建表脚本和测试数据: http://www.itpub.net/thread-1348543-1-1.html create table t_deposit ( name varchar2(1 ...
- 操作无法完成:- 创建/更新: 未设置强制字段.- 删除: 另一个模型要求删除记录。如果可能的话,把它存档模型: 库龄分析报表 (eno.md.payable.age.analyse.rpt)
出现情况:当刷新报表查询页面时,出现此错误,主要原因是刷新时默认调用了create方法,然后后台某个字段必输,而现在界面中为空. 问题解决: 出现此问题,主要是后台字段设置为必输.继承修改字段为非必输 ...
最新文章
- GNS3错误7200:无法开始Dynamips于端口7200
- 【生生被气死的一周】头秃
- 打印机服务器不支持1020,win10系统电脑安装hp1020打印机后无法使用的详细技巧
- 操作系统实验报告7:进程间通信—共享内存。实现一个带有n个单元的线性表的并发维护。
- php响应超过三十秒会报错么,如何捕捉致命错误:PHP中超过30秒的最大执行时间...
- 【BZOJ】1061: [Noi2008]志愿者招募
- oracle rac升级补丁及中间的错误提示
- Keil的安装与破解详细教程
- JAVA制作简单的查询身份证号信息小程序
- fastdfs原理及过程
- 破解密码——利用Windows PE操作系统破解Windows PIN
- Java项目的一些文件及其功能、使用方式。
- 华为usg系列防火墙-密码重置
- 论文阅读|目标检测之CE-FPN,将通道增强运用到上采样,减少信息丢失,同时添加了通道注意力机制
- 原生js实现简易的可旋转伸缩连线效果代码
- 开源海思开发板(HIVIEW开发板)
- .htaccess文件
- Linux内核变量中per-CPU的使用
- 百度地图API 实现地图多点标注
- 罗技无法使用计算机上的配置文件,为什么罗技G500s在电脑A上安装驱动程序并通过板载内存设置DPI和宏之后,在电脑B上使用时完全是出厂设置?...