U8单据列表控件摘要单据列表控件是供业务单据展示列表数据以及编辑处理的,并且集成了部分单据列表公共按钮、快捷过滤、翻页功能。
同时也支持直接通过单据列表编辑录入数据。
概念说明公共按钮是指单据列表固有的一些操作,如:查询、条件格式设置、布局等等;快捷过滤是一种更加直接快速的常用查询项目过滤,主要区别在于可以直接在列表主界面录入常用过滤项目内容进行查询;翻页功能集成则是指列表控件自带了翻页处理,业务模块使用时可以不用专门处理翻页的逻辑。
目标本文主要介绍单据列表控件的业务应用及相关注意事项,方便各类U8产品开发人员更好的使用高效开发产品。
文档内容一、列表控件(V11.0)增加的特性:1.集成【快捷过滤】功能;类似原来各列表界面里toolbar上的查询\刷新\[滤设]功能。
查询按钮下拉查询方案:默认操作兼容原有功能。
查询支持方案和快捷条件详细设置:【快捷过滤】相关的业务组代码调整:调整过滤对象的查询方法(UFGeneralFilter.FilterSrv.OpenFilter)调用,修改为调用过滤对象初始化方法(UFGeneralFilter.FilterSrv. InitBaseVarValue),参数传递与过滤对象查询原来的方法(UFGeneralFilter.FilterSrv.OpenFilter)兼容。
然后调用新单据列表控件的快捷过滤初始化方法(VouchList.InitFlt),把初始化好的过滤对象传入(如果没有过滤对象,也可以直接传入过滤对象ID或过滤对象名称+子系统号)。
代码修改前后对比示例如下(灰色字体部分是已经被注释的修改前的代码,下同):…(引用的是服务协议列表代码修改模型)Set m_opub = CreateObject("UFGeneralFilter.FilterSrv")' bSuccess = m_opub.OpenFilter(g_Login,"6729D410-233A-4674-A48A-2C34C17B82F6", "", "", ErrInfo)'lliang_2011-11-22_[单据列表]:快捷过滤bSuccess = m_opub.InitBaseVarValue(g_Login,"6729D410-233A-4674-A48A-2C34C17B82F6", "", "", ErrInfo)…Call VouchList.InitFlt (g_Login, m_opub, "", "", "", "", Err)参数1:Login对象参数2:过滤对象参数3:条件的Key参数4:过滤的名称参数5:子产品号参数6:返回的错误信息返回值:如果返回为False表明出现失败说明:你可以用参数2,忽略参数3、4、5或用参数3而忽略参数2和4、5或用参数4、5而忽略2和3.注意事项:调用此初始化方法的时机要求在Form_Load事件里,目前大部分产品的过滤对象调用(m_opub.OpenFilter)都是在相应的类模块或其他非窗体模块处理,所以需要各模块根据实际情况把过滤对象变量有效传递到窗体然后在Form_Load事件里调用。
推荐的方法是事前在窗体模块声明全局变量,然后在调用过滤对象的地方把已经初始化好的过滤对象暂时赋值给窗体的全局变量,最后在Form_Unload事件里即时的释放该全局变量。
…// 直接在列表控件(V11.0)新增的查询事件中(FilterClick)调用原来的“查询”功能即可,同时把此事件返回的过滤对象参数一并传递到原查询功能。
…Private Sub VouchList_FilterClick(fldsrv As Object)Operating ("filter",fldsrv)End Sub…注:是否显示快捷过滤依据的是原列表是否支持查询功能。
附:快捷过滤预置表:Data库的flt_quickconditionset表对应字段说明:filterid 过滤编号userid 用户编号,业务组预置用固定的systemitemName 用于快捷过滤的项的名称如:cDepName2.集成【翻页】功能;取代原来各列表界面手工翻页或采用平台翻页控件的功能。
【翻页】相关的业务组代码调整:1)业务代码原列表界面中使用平台的翻页控件(PagedivCtl)的情况:在调用平台翻页控件绑定分页引擎的地方直接修改为用列表控件(V11.0)绑定分页引擎,接口方法和传递参数完全兼容,同时删除原平台翻页控件并把相关的代码注释(包括原翻页控件涉及的事件),同时把原翻页控件对应的事件实现在列表控件对应的事件中实现(事件兼容)。
…(引用的是销售订单列表代码修改模型)'Call PagedivCtl1.BindPagediv(m_pagediv)'lliang_2011-11-22_[单据列表]: 翻页Call VchLst.BindPagediv(m_pagediv)…'Private Sub PagedivCtl1_BeforeSendCommand(cmdType As U8VouchList.UFCommandType, pageSize As Long, pageCurrent As Long)' Me.VchLst.SetVchLstRst Nothing' Me.VchLst.FillMode = FillOverwritePrivate Sub VchLst_BeforeSendCommand(cmdType As U8VouchList.UFCommandType, pageSize As Long, pageCurrent As Long)Me.VchLst.SetVchLstRst NothingMe.VchLst.FillMode = FillOverwriteEnd Sub…2)业务代码原列表界面没有采用平台的翻页控件,是自己处理的翻页功能的情况,时还不想采用先前到翻页控件的方式(原因:代码改动太大,可能出错的情况也多,而且直接影响由列表导航出的单据卡片翻页的界定范围),只是希望直接借用列表控件(V11.0)的翻页框架,而列表数据的获取保持不变(还是由业务组直接获取传递给列表控件)。
就此方案代码模板示例如下://1、申明分页引擎变量…(引用的是库存所有单据列表代码修改模型)'lliang_2011-12-02_[新单据列表]:Private WithEvents m_pagediv As Pagediv '分页引擎…//2、FormLoad事件里初始化分页引擎并绑定到列表控件(V11.0)上(列表数据的加载过程保持不变,并且此必须放到列表数据加载之前执行,并且确认列表数据加载后给原有的列表属性RecordCount正确赋值了-应该是总记录数,而不是当前页显示的记录数)Set m_pagediv = New Pagedivm_pagediv.PageInfo.CurrentPage = txtPage.Textm_pagediv.PageInfo.pageSize = txtSize.Text‘注:此两处代码赋值逻辑需要在运行期检查原控件值是否存在Call VouchList1.BindPagediv(m_pagediv)…//3、在列表控件新增的翻页相关的事件中实现原来的手工翻页逻辑。
Private Sub VouchList1_BeforeSendCommand(cmdType As U8VouchList.UFCommandType, pageSize As Long, pageCurrent As Long)txtSize.Text = pageSizeSelect Case cmdTypeCase UFFirstcmdFirst_ClickCase UFPreviouscmdPer_ClickCase UFNextcmdNext_ClickCase UFLastcmdLast_ClickCase UFOKcmdOK_ClickCase Else'End Select注:是否显示翻页依据的是原列表是否支持翻页功能。
3)业务代码原列表界面没有采用平台的翻页控件,而是自己处理的翻页功能的情况:这种情况需要首先把业务组手工增加的列表翻页功能到平台翻页控件,然后再根据第1)种情况对应的方法到列表控件(V11.0),也可由手工的列表翻页功能直接到列表控件(V11.0)的翻页。
至于如何从手工翻页功能到平台的翻页控件,这个可以咨询目前已经采用平台翻页控件的业务组成员处理(其中由列表导航出的单据卡片翻页的界定范围需要通过列表过滤条件串约束),在此也简单就代码修改过程示例说明一下:(新作单据列表时必须使用)…(引用的是库存的其他入库单列表代码修改模型)Private WithEvents m_pagediv As Pagediv '分页引擎Private m_coni As IPagedivConi '条件,基本上都是从U8Colset中进行初始化…//增加如下列表分页初始化方法,一个分页引擎事件。
Private Sub InitPagedivCtl(oColSet As Object, mCnn As Connection, VouchList As Object, strWhere As String)‘初始化分页控件Call InitConi(oColSet, strWhere , m_coni)Set m_pagediv = New PagedivCall m_pagediv.Initialize(mCnn, m_coni)‘Call PagedivCtl1.BindPagediv(m_pagediv)Call VouchList.BindPagediv(m_pagediv)Call m_pagediv.LoadDataEnd Sub…'初始化分页条件Public Sub InitConi(ByVal oColSet As Object, strWhere As String, m_coni As IPagedivConi) On Error GoTo ErrHandlerIf m_coni Is Nothing ThenSet m_coni = New DefaultPagedivConiEnd Ifm_coni.From = "KCOtherInList" '此处需要通过一个专门的方法获取列表对应的数据源(视图)名称If bGroupBy Then '是否查看汇总信息m_coni.SelectConi = Replace(oColSet.GetSqlSumString, "''", "' '")If strWhere = "" Then strWhere = "1=1"m_coni.Where = strWherem_coni.GroupBy = oColSet.GetSqlGroupStringm_coni.OrderID = oColSet.GetOrderStringEx' m_coni.RealTableName = clsVoucherLst.GetVoucherListSet("maintbl")' m_coni.RealPrimaryKey = clsVoucherLst.GetVoucherListSet("mainkey") Elsem_coni.SelectConi = oColSet.GetSqlStringm_coni.OrderID = oColSet.GetOrderStringExm_coni.Where = strWhere '相当于where部分m_coni.GroupBy = ""m_coni.RealTableName = "" ' clsVoucherLst.GetVoucherListSet("detailtbl")m_coni.RealPrimaryKey = "" 'clsVoucherLst.GetVoucherListSet("detailkey")m_coni.SumConi = ""End IfExitFnc:Exit SubErrHandler:End Sub…Private Sub m_pagediv_AfterGetData(rst As ADODB.Recordset, cnt As Long)VouchList1.SetVchLstRst NothingVouchList1.FillMode = FillOverwriteST_SetFormat VouchList1, CvouTypeVouchList1.DoFormatVouchList1.SumStyle = vlRecordAndGridsumVouchList1.SetVchLstRst rstIf Not IsNull(ColSet) ThenVouchList1.InitHead ColSet.getColInfoEnd IfVouchList1.RecordCount = cntEnd Sub…//在所有以前手工调用查询列表数据的地方修改为调用此列表初始化方法:InitPagedivCtl ' getListData VouchList1, ClsBill, CvouType, nPages, 1, txtSize.Text, sWhere, True, , , , bGroupBy, m_strGUID' VouchList1.RecordCount = ClsBill.ListCountCall InitPagedivCtl(ColSet, moLogin.AccountConnection, VouchList1, sWhere)…3.改变【行选择】功能;取代原来各列表界面里toolbar上的全选/全消功能,同时取代以前双击列表选择列打”Y”的功能。