本文著作权属于江湖浪子@IT,任何人未经作者本人批准,不得转载。
 
在Sbo Addon开发中,经常为了业务实现,需要从当前的业务数据库中列举出符合条件信息,供业务操作人员进行选择,并且将选择之后的数据及其相关信息传递到当前的业务界面,或者填充当前的业务控件(比如编辑文本、下拉框等),或者填充Matrix中的指定Column,以及更加个性化的业务处理(比如根据选择的数据进行业务初始化、业务流程处理等)。
这的确是一个很常用的功能,有必要对其进行业务抽象和归纳,形成一个通用的数据选择功能。富盛Sbo程序开发框架有效的解决了这一问题。
因为业务不同,需要选择的业务数据也不同。就是说,这个通用的数据选择提供的选择数据是不确定的,自然选择条件是不确定的,提供操作用户的表示数据是不确定的,选择之后的传递到业务界面上的数据和业务操作也是不确定的。
1、检索条件、数据展示定制化
要展示不同的数据选择内容,并且展示数据可能来自不同的数据表中,甚至选择数据集的来源可能是SELECT语句,也完全可能是存储过程的返回集合,能够满足这种展示条件的只有使用Grid控件了。而Grid控件的数据来源是可以定制的,这又满足了数据检索条件不确定性的要求。
实现如下:
fsSbo.AddButton2Form(ref oForm, "btnChoose", "选择", 315, 10, 65, 20);
                            fsSbo.AddItem2Form(ref oForm, "2", BoFormItemTypes.it_BUTTON, 315, 80, 65, 20);
Grid grd = fsSbo.AddGrid2Form(ref oForm, "grdData", 5, 5, 530, 300);
                            grd.DataTable = oForm.DataSources.DataTables.Add("dtData");
                            grd.SelectionMode = BoMatrixSelect.ms_Single;
grd.DataTable.ExecuteQuery(strChooseDataSQL);
                            for (int i = 0; i < grd.DataTable.Columns.Count; i++)
                            {
                                if (grd.DataTable.Columns.Item(i).Type == BoFieldsType.ft_Integer || grd.DataTable.Columns.Item(i).Type == BoFieldsType.ft_Float)
                                    grd.Columns.Item(i).RightJustified = true;
grd.Columns.Item(i).Editable = false;
if (grd.Columns.Item(i).UniqueID.StartsWith("$$")) grd.Columns.Item(i).Visible = false;
                            }
grd.AutoResizeColumns();
当然,在数据展示的时候,应该考虑到行业习惯,Grid数据栏目如果是数据类型应该自动将其展示为右对齐,显然,这是可以办到的。
检索条件自动化、展示数据自动化、展示数据惯例化,看来都不是问题。在接下来要解决的是选择结果定制化,这也完全可以办到。
2、数据选择业务处理定制化
在选择数据窗口中,通过参数获得调用窗体及数据信息需要回写的控件Id,当然了,如果需要回写到Matrix中,除了需要指定这个Matrix的数据回写的列栏目,还应该指定需要回写的对应行;当然了,对于个性化的业务处理,在调用窗体中定义一个回调函数,在数据选择窗体的选择事件通过回调函数来完成个性化业务处理。
实现方法如下:
string[] strColumns = strFatherFields.Split(',');
                    string[] strValues = new string[strFatherFields.Length == 0 || frmFather != null ? dt.Columns.Count : strColumns.Length];
                    for (int i = 0; i < strValues.Length; i++)
                    {
                        string strValue = "";
                        if (dt.Columns.Item(i).Cells.Item(nSelectedRow).Value != null) strValue = dt.Columns.Item(i).Cells.Item(nSelectedRow).Value.ToString();
                        if (i < dt.Columns.Count) strValues[i] = strValue;
                    }
if (strFatherFId.Length > 0 && strColumns.Length > 0)
                    {
                        Form frm = fsSbo.fsSboApplication.Forms.Item(strFatherFId);
oForm.Close();
frm.Freeze(true);
                        for (int i = 0; i < strColumns.Length; i++)
                        {
                            if (strMtxId.Length > 0 && nMtxRow > 0)
                            {
                                Matrix mtx = (Matrix)frm.Items.Item(strMtxId).Specific;
                                Column oColumn = mtx.Columns.Item(strColumns[i]);
if (oColumn.Type == BoFormItemTypes.it_EDIT || oColumn.Type == BoFormItemTypes.it_EXTEDIT)
                                    fsSbo.SetValue2MtxEditText(ref mtx, strColumns[i], nMtxRow, strValues[i]);
                                else if (oColumn.Type == BoFormItemTypes.it_COMBO_BOX)
                                    fsSbo.SetValue2MtxCombox(ref mtx, strColumns[i], nMtxRow, strValues[i]);
                            }
                            else
                            {
                                Item oItem = frm.Items.Item(strColumns[i]);
                                if (oItem.Type == BoFormItemTypes.it_COMBO_BOX)
                                    fsSbo.SetValue2Combox(ref frm, strColumns[i], strValues[i]);
                                else if (oItem.Type == BoFormItemTypes.it_EDIT || oItem.Type == BoFormItemTypes.it_EXTEDIT)
                                    fsSbo.SetValue2EditText(ref frm, strColumns[i], strValues[i]);
                            }
                        }
if (frm.Mode != BoFormMode.fm_ADD_MODE) frm.Mode = BoFormMode.fm_UPDATE_MODE;
frm.Freeze(false);
                        frm.Refresh();
                        frm.Update();
                    }
                    else if (frmFather != null)
                    {
                        string strFormId = oForm.UniqueID;
oForm.Close();
frmFather.SetReturnValue4SelectForm(strValues, strFatherFields);
                    }
3、如何调用
既然完成了业务处理,调用这个通用的数据选择功能就很简单了。当然将这个调用写成一个通用的函数是个很好的习惯。富盛Sbo程序开发框架就是这样完成的。
public Boolean OpenChooseDataForm(string strTitle, string strFatherId, string strQuerySQL, string strFatherFields, string strMtxId, int nMtxRow)
        {
            Boolean bRet = false;
            try
            {
                fsSboChooseDataBase frm = new fsSboChooseDataBase(this);
                frm.ChooseDataSQL = strQuerySQL;
                frm.FatherFields = strFatherFields;
                frm.FatherFormId = strFatherId;
                if (strMtxId.Length > 0 && nMtxRow > 0)
                {
                    frm.FatherMatrixId = strMtxId;
                    frm.FatherMatrixRow = nMtxRow;
                }
               
                bRet = ShowForm(frm, "ChooseData" + strFatherId, strTitle);
            }
            catch (Exception ex)
            {
                ShowMsg("错误:" + ex.Message);
            }
return bRet;
        }
这里的fsSboChooseDataBase就是上述我们讨论的通用数据选择业务实现类了。
4、实例
在富盛打叶复烤生产管理系统中,广泛的使用这一通用数据选择功能。
4.1 通过以下代码实现加工协议选择,选择之后的信息被回填到业务选择界面的编辑文本中。
string strSQL = "", strTitle = "", strFields = "";
strTitle = "选择加工协议";
                    strSQL = "SELECT DocEntry as [$$DocEntry], U_DealCode 加工协议, U_DealName 协议描述, U_DealNo 档案编号, U_WrkBatNo 生产批次, U_CardCode 委托方, U_CardName 委托方名称, U_PlanSD 计划开始, U_PlanED 计划结束  FROM [@FSCXFWORKDEALINFO] WHERE IsNull(U_Stts,'0') in ('2','3')";
                    strFields = "DealEntry,emDealCode,emDealName,emDealNo,emBatNo,emCardCode,emCardName";
bRet = fsSbo.OpenChooseDataForm(strTitle, oForm.UniqueID, strSQL, strFields, "", -1);
实现的数据选择界面如下:
选后数据回写到以下界面
4.2 通过以下代码实现加工物料选择,选择之后的信息被回填到业务选择界面的Matrix中。
string strSQL = "", strTitle = "选择投料";
string strDealEntry = fsSbo.GetValue4EditText(oForm, "DealEntry");
                if (strDealEntry.Length > 0)
                {
                        strSQL = "SELECT U_ItemCode 物料代码, U_ItemName 物料描述, U_BaseItem as [$$BaseItem], U_BaseCode as [$$BaseCode], U_GrdEntry as [$$GrdEntry], U_GrdCode 等级, U_FromCode as [$$FromCode], U_FromName [产地], U_ItemAge 年限, IsNull(U_Qty,0) - IsNull(U_Qtyed,0) [$$RemQty], U_ItemGrp [$$ItemGrp], U_WhsCode [$$WhsCode], DocEntry as [$$DocEntry], U_Qty 计划加工, U_Qtyed 已加工, U_Notes 备注 FROM [@FSCXFWORKDEALLINE1] WHERE U_ItemGrp in (" + fsSbo.fsSboMes4CxF.ItemGroupCodeBeforePick + ") AND DocEntry=" + strDealEntry + (strItemList.Length > 0 ? " AND U_ItemCode not in (" + strItemList + ")" : "");
                    bRet = fsSbo.OpenChooseDataForm(strTitle, this, strSQL, "REQUEST");
                }
数据选择界面如下:
选后数据回写到以下界面:
<>

转载于:https://blog.51cto.com/foresun/94859

Sbo通用数据选择功能的实现相关推荐

  1. 写一个通用数据访问组件

    出处:http://www.csharp-corner.com willsound(翻译) 我收到过好多Email来问我如何用一个通用的数据提供者(data provider)在不失自然数据提供者(n ...

  2. 通用数据级别权限的框架设计与实现(4)-单条记录的权限控制

    查看上篇文章通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤,我们开始在原来的基础上实现单条权记录的权限控制. 相信前面的列表权限控制,很多系统都可以做到,但如何在上面列表的权限过滤中实现通 ...

  3. 通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤

    查看上篇文章通用数据级别权限的框架设计与实现(2)-数据权限的准备工作,我们开始数据列表的权限过滤. 原理:我们在做过滤列表时,根据用户权限自动注入到相关SQL中,实现相关过滤,如果拥有全部权限,则不 ...

  4. ASP.NET2.0通用数据访问类

    .NET框架自带的数据提供器包括SQLServer(System.Data.SqlClient).Oracle    (System.Data.Oracleclient).OLEDB(System.D ...

  5. 【业务建模_2】通用数据工具

    [业务建模_2]通用数据工具 背景 在公司做数据工作会接触很多相关工具,这里会汇总一些核心并更理想化的工具. 工具汇总 1.打点平台 module,op,参数数组(s0-s5),常用参数,[实际打点位 ...

  6. EF通用数据层封装类(支持读写分离,一主多从)

    浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,Servic ...

  7. java 通用组件_写一个通用数据访问组件

    出处:http://www.csharp-corner.comwillsound(翻译)我收到过数据库 出处:http://www.csharp-corner.com willsound(翻译) 我收 ...

  8. 金融数据密码机、通用数据密码机、签名验证服务器规格

    这里写自定义目录标题 金融数据密码机EVSM 功能描述 接口规范 加密算法 性能参考 通用数据密码机GVSM 功能描述 接口规范 加密算法 性能参考 签名验证服务器SVSM 功能描述 接口规范 加密算 ...

  9. Service Mesh中的通用数据平面API设计

    原文地址:https://blog.envoyproxy.io/the-universal-data-plane-api-d15cec7a 作者:Matt Klein 译者:敖小剑 校对:宋净超 正如 ...

最新文章

  1. C/C++版数据结构之链表三
  2. Android 面试 - compileSdkVersion、minSdkVersion、targetSdkVersion、buildToolsVersion
  3. mybatis plus generator配置
  4. 关于DNS服务中查询域名的命令
  5. Python之爬虫-段子网
  6. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波10 - 直方图处理 - 局部直方图处理
  7. 【UOJ168】元旦老人与丛林【图论证明】【最大权闭合子图】【dinic动态推流】
  8. PostgreSQL SSL启用与CA证书生成、配置
  9. 源码编译altas mysql_Atlas的安装
  10. F2FS文件系统论文解读
  11. java毕业设计HTML5旅游网站源码+系统+数据库+lw文档+调试运行
  12. (3/3) 在 Cocos creator 中使用 steam api , steam 成就
  13. 松柏先生: 做品牌自己挣钱不算什么, 能让1000名山区绣娘都挣钱才牛!
  14. 周志华----第5章神经网络(误差逆传播算法)
  15. foxmail收取服务器邮件次数,Foxmail:如何设置收取历史邮件?
  16. G3D 渲染引擎简介
  17. Golang底层原理学习笔记(一)
  18. java 三个字母组合_每天AC系列(三):电话号码的字母组合
  19. (附源码)ssm+mysql+基于SSM框架的图片分享及评价网站设计与实现 毕业设计201524
  20. 《从一到无穷大》中的程序思维

热门文章

  1. python学习笔记(四):函数
  2. C# 之 static的用法详解
  3. 【Python基础】07、Python类与面向对象
  4. Excel 2013中单元格添加下拉列表的方法
  5. iOS学习之iOS沙盒(sandbox)机制和文件操作复习
  6. java Arrays Generic
  7. 修改Linux内核启动图片
  8. 经典java NIO框架
  9. 推荐Web开发人员应有的7款免费的Android应用
  10. 浅谈ICMP Flood***原理