引入单据体数据
来源:互联网 发布:爱心网络宣传语 编辑:程序博客网 时间:2024/04/28 23:06
需求背景:
部分单据的单据体数据行非常多,在单据维护界面录入效率不高,需要在Excel中录入后导入
技术难点:
1. 如何上传文件?
2. 如何读取上传的Excel文件?
案例设计:
此案例,需要包含两个界面,一个是需要引入单据体的单据A,另外一个,是用于上传文件的动态表单B。
在单据A上:
1. 增加一个菜单,引入单据体;
2. 用户点击引入单据体菜单后,弹出一个新窗口(文件上传动态表单B),供用户上传Excel文件
3. 确定文件上传完毕,调用第三方工具,读取Excel内容为DataSet对象
4. 把DataSet中的数据,逐行、逐字段,填写到单据体中
文件上传动态表单B:
1. 添加一个文件上传控件,设置文件后缀,必须为*.xls
2. 添加确定、取消两个按钮
3. 默认情况下,确定按钮时锁定的,只有上传文件完毕,才解锁
效果示意:
图一:在单据上增加引入单据体菜单
图二:文件上传界面
图三:待引入的单据体数据
部分单据的单据体数据行非常多,在单据维护界面录入效率不高,需要在Excel中录入后导入
技术难点:
1. 如何上传文件?
2. 如何读取上传的Excel文件?
案例设计:
此案例,需要包含两个界面,一个是需要引入单据体的单据A,另外一个,是用于上传文件的动态表单B。
在单据A上:
1. 增加一个菜单,引入单据体;
2. 用户点击引入单据体菜单后,弹出一个新窗口(文件上传动态表单B),供用户上传Excel文件
3. 确定文件上传完毕,调用第三方工具,读取Excel内容为DataSet对象
4. 把DataSet中的数据,逐行、逐字段,填写到单据体中
文件上传动态表单B:
1. 添加一个文件上传控件,设置文件后缀,必须为*.xls
2. 添加确定、取消两个按钮
3. 默认情况下,确定按钮时锁定的,只有上传文件完毕,才解锁
效果示意:
图一:在单据上增加引入单据体菜单
图二:文件上传界面
图三:待引入的单据体数据
示例代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel;using System.Data;using Kingdee.BOS;using Kingdee.BOS.Util;using Kingdee.BOS.JSON;using Kingdee.BOS.Core;using Kingdee.BOS.Core.DynamicForm;using Kingdee.BOS.Core.DynamicForm.PlugIn;using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;using Kingdee.BOS.Core.Bill;using Kingdee.BOS.Core.Bill.PlugIn;using Kingdee.BOS.Core.Metadata;using Kingdee.BOS.Core.Metadata.FieldElement;using Kingdee.BOS.ServiceHelper.Excel;namespace JDSample.FormPlugIn.Bill{ /// <summary> /// 引入单据体 /// </summary> [Description("引入单据体")] public class S151209ImportEntryEdit : AbstractBillPlugIn { /// <summary> /// 菜单点击事件 /// </summary> /// <param name="e"></param> public override void AfterBarItemClick(AfterBarItemClickEventArgs e) { if (e.BarItemKey.EqualsIgnoreCase("tb_JD_ImportEntry")) { // 显示文件上传界面,上传Excel文件 DynamicFormShowParameter showParam = new DynamicFormShowParameter(); showParam.FormId = "a6fe71c4beda4f7baf60411c4b5f3b3e"; this.View.ShowForm(showParam, new Action<FormResult>((formResult) => { if (formResult != null && formResult.ReturnData != null) { string fullFileName = formResult.ReturnData.ToString(); this.DoImportEntry(fullFileName); } })); } } /// <summary> /// 开始导入单据体 /// </summary> /// <param name="fullFileName">Excel文件</param> /// <remarks> /// 特别说明:此函数仅演示如何把Excel转换为DataSet, /// 并读取DataSet内容,填写到单据体, /// 未进行任何的安全处理,实际生产环境,需要对数据的合法性进行严格的判断 /// </remarks> private void DoImportEntry(string fullFileName) { using (ExcelOperation helper = new ExcelOperation(this.View)) { // 利用ExcelOperation对象,把xml文件,转为DataSet对象 // 参数说明: // filePath : 完整的文件名,包含了物理目录 // dataStartIndex : 数据开始行索引,从0开始。通常第一行为标题,第二行开始为数据行 // colNameIndex : 列名所在行索引,从0开始。如此参数为0,表明第一行为列名行 DataSet ds = helper.ReadFromFile(fullFileName, 1, 0); // 取第一个表格中的数据导入 DataTable dt = ds.Tables[0]; int rowIndex = this.Model.GetEntryRowCount("FEntity"); foreach (DataRow dataRow in dt.Rows) { // 单据体增加新行,并更新行索引 this.Model.CreateNewEntryRow("FEntity"); this.Model.SetEntryCurrentRowIndex("FEntity",rowIndex); // 设置基础资料字段值 this.Model.SetItemValueByNumber( "F_JD_MaterialId", Convert.ToString(dataRow["物料编码"]), rowIndex); // 设置普通字段值 this.Model.SetValue("F_JD_Qty", dataRow["数量"], rowIndex); // TODO : 设置其他字段值,此处略 rowIndex++; } } } } /// <summary> /// 上传单据体数据文件 /// </summary> /// <remarks> /// 界面说明: /// 1. 添加一个文件上传控件,设置文件后缀,必须为*.xls /// 2. 添加确定、取消两个按钮 /// 3. 默认情况下,确定按钮时锁定的,只有上传文件完毕,才解锁 /// </remarks> [Description("上传单据体数据文件")] public class S151209ImportFileUpdateEdit : AbstractDynamicFormPlugIn { /// <summary> /// 上传上来的文件名:完整的文件名,包含了物理路径 /// </summary> private string _fullFileName = string.Empty; public override void AfterBindData(EventArgs e) { this.View.GetControl("F_JD_BTNOK").Enabled = false; } /// <summary> /// 文件上传完毕,触发此事件:通过此事件获取上传上来的文件名 /// </summary> /// <param name="e"></param> public override void CustomEvents(CustomEventsArgs e) { if (e.Key.EqualsIgnoreCase("F_JD_FileUpdate")) { this.View.GetControl("F_JD_FileUpdate").SetCustomPropertyValue("NeedCallback", true); this.View.GetControl("F_JD_FileUpdate").SetCustomPropertyValue("IsRequesting", false); if (e.EventName.EqualsIgnoreCase("FileChanged")) {// 文件上传完毕 // 取文件上传参数,文件名 JSONObject uploadInfo = KDObjectConverter.DeserializeObject<JSONObject>(e.EventArgs); if (uploadInfo != null) { JSONArray json = new JSONArray(uploadInfo["NewValue"].ToString()); if (json.Count > 0) { // 取上传的文件名 string fileName = (json[0] as Dictionary<string, object>)["ServerFileName"].ToString(); this._fullFileName = this.GetFullFileName(fileName); // 解锁确定按钮 this.View.GetControl("F_JD_BTNOK").Enabled = true; } else { // 锁定确定按钮 this.View.GetControl("F_JD_BTNOK").Enabled = false; } } } } } /// <summary> /// 按钮点击事件 /// </summary> /// <param name="e"></param> public override void ButtonClick(ButtonClickEventArgs e) { if (e.Key.EqualsIgnoreCase("F_JD_BTNOK")) {// 确定 this.View.ReturnToParentWindow(new FormResult(this._fullFileName)); this.View.Close(); } else if (e.Key.EqualsIgnoreCase("F_JD_BTNCancel")) {// 取消 this.View.Close(); } } /// <summary> /// 产生完整的文件名,包含了物理路径 /// </summary> /// <param name="fileName"></param> /// <returns></returns> private string GetFullFileName(string fileName) { string dir = "FileUpLoadServices\\UploadFiles"; return PathUtils.GetPhysicalPath(dir, fileName); } }}
0 0
- 引入单据体数据
- 金蝶K3单据新增页面在单据体体现物料即时库存数据
- 单据元数据开发流程
- 单据
- 金蝶K3对特定单据表体数据进行列锁定
- 在EditUI类里面刷新单据数据
- 在EditUI类里面刷新单据数据
- K3 单据,单据体自定义字段显示及时库存
- 如何引入数据挖掘
- Vue 引入假数据
- NC单据期初数据从Excel导入
- 指定页面单据自动跳转并且自动加载原有数据
- BOS 单据保存时不弹出数据变动,是否保存
- nc 单据拓展字段 元数据导出脚本
- NC单据表体显示合计行
- 如何把子单据体的数值合计到单据体上
- 在单据维护界面仅下推选中的单据体行
- 如何通过插件携带第二个单据体到下游单据
- 基础算法-直接选择排序
- 大数据数据库技术简介与分类分析
- telnet 的使用
- SQL求一个表中非重复数据及其出现的次数
- binlog日志太多太大耗尽磁盘空间导致mysql卡死的问题解决
- 引入单据体数据
- hdoj 3789 奥运排序问题
- sizeof 的使用 (初学者);
- 逻辑回归数学推倒讲解
- 用VS打开html文件左下方不显示设计-拆分-源视图的解决方法
- XML (1)
- SpriteKit中为何不要在update方法中测试碰撞
- ARC与非ARC的区别就是对栈区与堆区的管理
- swig的相关命令