资源描述
参照Edit编程指南
参照Edit编程指南(V872)
下面所有参照ID只用来测试使用,可能不作最终的参照ID
1、控件引用
2、使用示例
2.1 元素据定义参照
属性设置
RefEdit.RefType= Reftypes.RefArchive
例如:
示例1:直接调用存货参照
调用存货初始化(窗体参照):
EdtArchive.RefType=RefArchive
Call Me.EdtArchive.Init(g_oLogin, "Inventory_AA", False, "")
示例2:直接调用仓库档案参照
调用仓库初始化(列表参照)
EdtArchive.RefType=RefArchive
Call Me.EdtArchive.Init(g_oLogin, "warehouse_AA",False, "")
其中参数值"Inventory","warehouse"均表示参照ID,
示例3:程序动态设置部分元素据定义示例:
EdtArchive.RefType=RefArchive
Call Me.EdtArchive.Init(g_oLogin, "Inventory_AA", False, "")
sMetaXML = "<Ref><RefSet bMultiSel='0' iShowStyle='1' /></Ref>"
Call EdtArchiveUser.Init(g_oLogin, "Inventory", False, sMetaXML)
其参照格式元素据定义:参照元素据定义.xml
2.2 枚举参照
属性设置:
EdtRefEnum.RefType = Reftypes.RefEnumType
2.2.1、调用类型1(完整型)
( 其XML格式定义: 参照枚举元素据参数定义.xml)
例如:
Dim sXml As String
sXml = "<Ref> " & _
" <RefSet cRetFld='code' cCheckFlds='code,name' cShowFld='name'>" & _
" </RefSet>" & _
" <DataSrc>" & _
" <DataGrid provider='XML' cDataSrcID='' >" & _
" <Item code='0' name='无换算率'/>" & _
" <Item code='1' name='固定换算率'/>" & _
" <Item code='2' name='浮动换算率'/>" & _
" </DataGrid>" & _
" </DataSrc>" & _
"<RefColSet>" & _
"<U8ColSet>" & _
" <Data>" & _
" <ColSet cFld='code' bDisp='1' cCaption='' iColWidth='0' iAlign='1'/>" & _
"<ColSet cFld='name' bDisp='1' cCaption='' iColWidth='1500' iAlign='1'/>" & _
" </Data>" & _
"</U8ColSet>" & _
"</RefColSet>" & _
"</Ref>"
EdtRefEnum.RefType = Reftypes.EnumType
Call Me.EdtRefEnum.Init(g_oLogin, sXml, False, "")
2.2.2、调用类型2(简约型)
格式定义:同UFComboBox控件的SetEnumMapString("") 格式保持一致
例如:
Dim strEnum As String
strEnum = "1{#}0{##}是{#}否"
Call Me.EdtRefEnum.Init(g_oLogin, strEnum, False, "")
2.2.3、调用类型3(数据库型)
应用场景:对于参照的枚举数据需要从AA_Enum中读取;
格式定义:( 其XML格式定义: 参照枚举元素据参数定义.xml)
例如(示例格式为XML简写格式):
Dim sXML As String
sXML = "<Ref><DataSrc>" & _
" <DataGrid provider='DB' cEnumTypeID='AA.ARCHIVE.boolean' >" & _
"</DataGrid>" & _
"</DataSrc></Ref>"
Call RefEditEnumDB.Init(g_oLogin, sXML, False, "")
2.3 日历调用
直接设置属性:
EdtDate.RefType = Reftypes.RefDate
2.4 计算器调用
直接设置属性:
EdtCal.RefType = Reftypes.RefCalculator
2.5 自定义数据参照调用
(推荐用2.8 用户自定义数据源参照)
属性设置:
EdtArchive.RefType = RefTypes.RefUserDefine
元素据定义、显示数据完全有调用者实现
示例1:树表结构窗体参照
示例2:表结构窗体参照
示例3:列表参照
下面将三个示例一起实现
第一步:初始化:
Call RefUserDefineEdit.Init(Me, "inventory")
Call RefUserDefineSimpleEdit.Init(Me, "warehouse")
Call RefUserDefineSimpleEdit_List.Init(Me, "warehouse_list")
第二步:实现获取元素据方法
'------------------------------------------------
'功能:实现自定义参照的获取元素据
'------------------------------------------------
Public Sub GetSrvRefMeta(sRefID As String, sXML As String, MetaXML As String, sMsg As String, bFlag As Boolean)
Select Case LCase(sRefID)
Case "inventory"
MetaXML = "<Ref cRefName='存货自定义参照' cEntityKeyFld='cInvCode' cEntityNameFld='cInvName'> " & _
" <RefSet cCheckFlds='cInvCode,cInvName' iFilterStyle='1'>" & _
" </RefSet>" & _
"<DataSrc>" & _
"<DataClass cDataSrcID='InventoryClass' cRefClsName='存货分类' bRule='1' clsCode='cInvCCode' clsName='cInvCName' sortField='cInvCCode'/>" & _
"<DataGrid cDataSrcID='Inventory' clsCode='cInvCCode'/>" & _
"</DataSrc>" & _
"<RefColSet><U8ColSet><Data>" & _
" <ColSet cFld='cInvCode' bDisp='1' cCaption='存货编码' iColWidth='1000' iAlign='1'/>" & _
" <ColSet cFld='cInvname' bDisp='1' cCaption='存货名称' iColWidth='1500' iAlign='1'/>" & _
" </Data></U8ColSet></RefColSet>" & _
"</Ref>"
Case "warehouse"
MetaXML = "<Ref cRefName='仓库自定义参照' cEntityKeyFld='cWhcode' cEntityNameFld='cWhName' > " & _
" <RefSet cCheckFlds='cWhcode,cWhName' iShowStyle='0' iFilterStyle='1'>" & _
" </RefSet>" & _
"<DataSrc>" & _
"</DataSrc>" & _
"<RefColSet><U8ColSet><Data>" & _
" <ColSet cFld='cWhcode' bDisp='1' cCaption='仓库编码' iColWidth='1000' iAlign='1'/>" & _
" <ColSet cFld='cWhName' bDisp='1' cCaption='仓库名称' iColWidth='1500' iAlign='1'/>" & _
" </Data></U8ColSet></RefColSet>" & _
"</Ref>"
Case "warehouse_list"
MetaXML = "<Ref cRefName='仓库自定义参照' cEntityKeyFld='cWhcode' cEntityNameFld='cWhName'> " & _
" <RefSet cCheckFlds='cWhcode,cWhName' iShowStyle='1' iFilterStyle='1'>" & _
" </RefSet>" & _
"<DataSrc>" & _
"</DataSrc>" & _
"<RefColSet><U8ColSet><Data>" & _
" <ColSet cFld='cWhcode' bDisp='1' cCaption='仓库编码' iColWidth='1000' iAlign='1'/>" & _
" <ColSet cFld='cWhName' bDisp='1' cCaption='仓库名称' iColWidth='1500' iAlign='1'/>" & _
" </Data></U8ColSet></RefColSet>" & _
"</Ref>"
End Select
End Sub
第三步:实现获取数据方法
Public Sub GetSrvData(sRefID As String, sXML As String, RstClass As ADODB.Recordset, RstGrid As ADODB.Recordset, RstColSet As ADODB.Recordset, sMsg As String, bFlag As Boolean)
If bLogin = False Then
MsgBox "Login first!"
Exit Sub
End If
Dim cnn As New ADODB.Connection
Dim sWhereSql As String
cnn.ConnectionString = g_oLogin.ufdbname
cnn.Open
bFlag = True
If Len(sXML) > 0 Then
Dim dom As New DOMDocument
Call dom.loadXML(sXML)
sWhereSql = dom.documentElement.selectSingleNode("filtersql").Text
If Len(sWhereSql) > 0 Then
sWhereSql = " where " + sWhereSql
End If
End If
Select Case LCase(sRefID)
Case "inventory"
bFlag = GetRst(cnn, "select cast(0 as bit) as bRefSelectColumn cInvCCode,cInvCName from inventoryclass", RstClass, sMsg)
If bFlag = True Then
bFlag = GetRst(cnn, "select cInvCode,cInvName from Inventory" + sWhereSql, RstGrid, sMsg)
End If
Case "warehouse", "warehouse_list"
bFlag = GetRst(cnn, "select cast(0 as bit) as bRefSelectColumn cWhcode,cWhName from warehouse" + sWhereSql, RstGrid, sMsg)
End Select
cnn.Close
Set cnn = Nothing
End Sub
2.6 完全自定义
设置属性:
EdtArchive.RefType = RefTypes.RefUserBrowse
自己实现控件消息
EditArchive_UserBrowse(sXML)
2.7 RichText编辑框
直接设置属性:
EdtDate.RefType = Reftypes. RefRichText
2.8 附件
设置属性:
EdtArchive.RefType = RefTypes. RefAccessories
自己实现控件消息
EditArchive_UserBrowse(sXML)
2.8 用户自定义数据源参照
设置属性:
EdtArchive. RefType=RefTypes.RefUserDataSource
参照控件调用示例:
Dim sMetaXML As String
sMetaXML = "<Ref cRefName='Meta数据库自定义数据源参照示例' cEntityKeyFld='cRefID' cEntityNameFld='cRefName'> " & _
" <RefSet cCheckFlds='cRefID,cRefName' iFilterStyle='1'>" & _
" </RefSet>" & _
"<DataSrc>" & _
"<DataGrid cUserDataSrcQrySelectPart='select cRefID,cRefName from UFMeta_001..refdesign' cUserDataSrcQryOrderPart='Order by cRefID ASC'/>" & _
"</DataSrc>" & _
"<RefColSet><U8ColSet><Data>" & _
" <ColSet cFld='cRefID' bDisp='1' cCaption='参照编码' iColWidth='2000' iAlign='1'/>" & _
" <ColSet cFld='cRefName' bDisp='1' cCaption='参照名称' iColWidth='3000' iAlign='1'/>" & _
" </Data></U8ColSet></RefColSet>" & _
"</Ref>"
EdtRefUserDataSource.RefType = RefTypes.RefUserDataSource
Call EdtRefUserDataSource.Init(g_oLogin, "", False, sMetaXML)
参照服务调用示例:
Dim sMetaXML As String
sMetaXML = "<Ref cRefName='存货自定义数据源参照' cEntityKeyFld='cInvCode' cEntityNameFld='cInvName'> " & _
" <RefSet cCheckFlds='cInvCode,cInvName' iFilterStyle='1'>" & _
" </RefSet>" & _
"<DataSrc>" & _
"<DataClass cDataSrcID='InventoryClass' cRefClsName='存货分类' bRule='1' clsCode='cInvCCode' clsName='cInvCName' cUserDataSrcQrySelectPart='select cInvCCode,cInvCName from InventoryClass' cUserDataSrcQryWherePart='' cUserDataSrcQryOrderPart='Order by cInvCCode ASC'/>" & _
"<DataGrid cDataSrcID='Inventory' clsCode='cInvCCode' cUserDataSrcQrySelectPart='select cInvCode,cInvName from Inventory' cUserDataSrcQryWherePart='' cUserDataSrcQryOrderPart='Order by cInvCode ASC'/>" & _
"</DataSrc>" & _
"<RefColSet><U8ColSet><Data>" & _
" <ColSet cFld='cInvCode' bDisp='1' cCaption='存货编码' iColWidth='2000' iAlign='1'/>" & _
" <ColSet cFld='cInvname' bDisp='1' cCaption='存货名称' iColWidth='3000' iAlign='1'/>" & _
" </Data></U8ColSet></RefColSet>" & _
"</Ref>"
Dim obj As New U8RefService.IService
obj.RefType = RefUserDataSource
obj.FillText = EdtServiceRefUserDataSource.Text
obj.RefID = ""
obj.MetaXML = sMetaXML
Dim retRstClass As ADODB.Recordset, retRstGrid As ADODB.Recordset
Dim sErrMsg As String
If obj.ShowRef(g_oLogin, retRstClass, retRstGrid, sErrMsg) = False Then
MsgBox sErrMsg
Else
If Not (retRstGrid Is Nothing) Then
MsgBox retRstGrid.Fields(1).Value
End If
End If
2.9 Web参照调用
Web参照调用和C/S调用基本相同:其加载步骤如下:
1、加载RefEdit控件到Web页面
2、设置属性
3、初始化Init接口
4、所有的关于URL传入一定为URL虚拟目录的根目录
配置文件:
1、注册组件:U8WebRefS.dll
2、在虚拟目录的根目录下建立目录名为U8BaseService,然后将文件U8WebRefS.ASP 放入此目录即可
示例1:调用存货档案:
1、设置属性:
<object classid="clsid:0E2FDA55-039D-4774-96FB-252507AD2544" id="EdtArchive" width="280" height="19">
<param name="RefType" value="1">
</object>
2、初始化:
在初始化时调用方法:
call EdtArchive.init(Nothing, Document.URL & "?refid=inventory_AA",true,"")
示例2:调用枚举
1、设置属性:
<object classid="clsid:0E2FDA55-039D-4774-96FB-252507AD2544" id="EdtRefEnumSimple" width="280" height="19">
<param name="RefType" value="4">
</object>
2、初始化:
在初始化时调用方法:
call EdtRefEnumSimple.Init (Nothing,Document.URL & "?refid= 0{#}1{##}否{#}是", true, "")
示例3:调用日历:
引用控件后,直接设置属性即可
<object classid="clsid:0E2FDA55-039D-4774-96FB-252507AD2544" id="EdtRefDate" width="280" height="19">
<param name="RefType" value="2">
</object>
示例4:调用计算器
引用控件后,直接设置属性即可
<object classid="clsid:0E2FDA55-039D-4774-96FB-252507AD2544" id="EdtRefCalculator" width="280" height="19">
<param name="RefType" value="3">
</object>
3、属性描述:
AutoHideCmd:
是否自动隐藏Button按钮
AutoDisplayText:
设置参照是否自动检查赋值Text属性是否正确,并显示相关信息,默认为true,即当RefType为RefArchive、RefUserDefine 、RefEnumType时,控件自动根据参照定义查询和显示相关内容
AutoExchangeText:
是否自动切换Text与DisplayText值的显示,默认为true,即当RefType为RefArchive、RefUserDefine类型时,且AutoExchangeText属性为true时,则若控件获得焦点,则显示Text内容,若离开焦点时,则显示DisplayText内容
AutoFormatDouble
是否自动格式浮点数,默认为true,即格式化
注:日期强制格式化
CancelMatchRefWnd:
是否取消因模糊匹配到多项记录而弹出参照窗口,默认为false
CheckMode
获取参照检查模式
Public Enum CheckModes ' 检查数据模式
CheckNone = -1
BtnRefClick = 0 '0:点击参照Btn的Click事件;
InputText = 1 '1:填写的的数据,然后看看是否唯一;
SetText = 2 '2:设置属性Text后检查
End Enum
CheckedValid
是否检查完毕有效性,运行时只读
EnumTypeString:
枚举字符串,与属性IsEnum一起使用
使用示例:
EdtEnumTypeString.RefType = RefEnumType
EdtEnumTypeString.EnumTypeString = "0{#}1{##}否{#}是"
EdtEnumTypeString.IsEnum = True
EdtEnumTypeString.Text = "0"
IsEditArch:
是否编辑档案,默认为true。
有些情况可能因为功能互斥、不能实现循环调用,需要屏蔽档案的编辑功能
IsEnum:
是否为枚举参照
IsUserDefArch:
是否是自定义项参照,默认为false
LanguageID:
多语属性
其枚举内容如下:
zh_CN = 0
zh_TW = 1
en_US = 2
对应属性设置,若在给控件初始化时,传给Login对象的,可以不用设置该属性,控件根据Login对象自动获取多语属性,对应没有传入Login对象,若需要控制多语,
MessageStyle:
数据错误提示处理方式
Public Enum MessageStyles '数据错误提示处理方式
ShowErrorTip = 0 '通过tip显示消息,默认方式
HideErrorTip = 1 '隐藏tip显示消息
ShowErrorMsg = 2 '通过Msg弹出消息
End Enum
则必须设置该属性
MultiRetStyle:
多选时多值返回风格
其枚举:
RetSingle = 0 :表示只返回第一个数据集的相关内容,即按照参照定义返回内容,和单选返回处理方式是一致的;
RetMultiCode = 1 :表示Text=“”,DisplayText=多选的编码,之间用“ ; ”(即:空格+英文分号+空格)
RetMultiName = 2 :表示Text=“”,DisplayText多选的名称,之间用“ ; ”(即:空格+英文分号+空格)
MultiTextElement:
对于多选内容,需要返回所有的返回字段和显示字段的内容,且格式为XML的格式,
只读属性
其格式为:
<data cRetFld="cInvcode" cShowFld="cInvCode,cInvName">
<Item value="201" DisplayText="201 - sdfas201"/>
<Item value="204" DisplayText="204 - sdfas204"/>
<Item value="208" DisplayText="208 - sdfas208"/>
<Item value="211" DisplayText="211 - sdfas211"/>
<Item value="213" DisplayText="213 - sdfas213"/>
</data>
MultiTextXML:
多选赋值属性
只写属性
示例:
Dim sXML As String
sXML = "<data cRetFld='cInvCode' cShowFld='cInvName'>"
sXML = sXML + "<Item value='10001' DisplayText='fuziname10001'/>"
sXML = sXML + "<Item value='10004' DisplayText='fuziname10004'/>"
sXML = sXML + "<Item value='10010' DisplayText='fuziname10010'/>"
sXML = sXML + "</data>"
EdtArchive.MultiRetStyle = RetMultiName
EdtArchive.MultiTextXML = sXML
DisplayText:
用来显示的内容,对于除参照属性为RefArchive、RefEnumType,RefUserDefine外,其Text和DisplayText默认是一致的
RefType:
设置参照类型,目前包括参照、枚举、日历、计算器、无(等同Edit)
RefNone = 0 没有参照,等同Edit
RefArchive = 1 参照档案,必须通过预制参照元素据方可使用
RefDate = 2 参照日历档案
RefCalculator = 3 参照计算器
RefEnumType = 4 参照枚举
RefUserDefine = 5 用户实现元素据和数据
RefUserBrowse = 6 用户自己实现参照
RefFile = 7 参照文件
RefRichText=8 多行编辑框,类似记事本
RememberLastRst:
是否选中上次选择的记录,即第一次参照返回数据后,再次点击参照,若RememberLastRst=true,则系统自动选中上次记录
RetStyle:
返回方式
Public Enum RetStyles
UnDefine = -1 -1、未定义 (默认)
Code_CodeName = 0 0、返回主键,显示主键+描述
Code_Name = 1 1、返回主键,显示描述(代码中修改)
Code_Code = 2 2、返回主键,显示主键(代码中修改)
Name_Name = 3 3、返回描述,显示描述(代码中修改)
End Enum
Text:
用来保存到数据库的值,设置该属性时,对应参照、自定义参照,且属性AutoDisplayText=true,将会查询数据库内容,根据参照元素定义显示DisplayText
注意1:对于参照属性为RefArchive、RefUserDefine,其控件获得焦点将显示Text内容,若离开焦点,将显示DisplayText内容
注意2:对于参照属性为RefArchive,若m_AutoDisplayText = False,输入一个值,或者m_AutoDisplayText = true输入一个非法值时,此时真正的Text内容为空,但为了方便业务组获取Text内容,此时Text内容为用户输入的内容。
Valid:
表示当前的内容是否合法
其它属性
与Edit相同,此处不再列举
4、事件
1、值改变消息 TextChange
消息定义:Public Event TextChange ()
该消息表示从进入RefEdit控件开始到离开RefEdit控件之后,若参数值发生改变,将触发该消息,在中间过程变化将不触发该消息
2、点击参照获取过滤消息和是否取消参照 BeforeBrowse
(1)、限C/S使用消息定义:
Public Event BeforeBrowse(ByRef sXMLFilterPara As String, sSQL As String,ByRef Cancel As Boolean)
(2)、限Web使用消息定义:
Public Event BeforeBrowseWeb (ByRef sXMLFilterPara As Variant, ByRef sSQL As Variant, ByRef Cancel As Variant)
参数说明:
sXMLFilter:XML格式条件
sSQL :过滤条件串
其格式为:
sXMLFilter = "<RefConditions>"
sXMLFilter = sXMLFilter + "<Condition paramName='@cDepCode' paramValue='001' />"
sXMLFilter = sXMLFilter + "</RefConditions>"
Cancel:当赋值为True时,表示此时不用参照
注意:参数名paramName严格区分大小写,即示例中@cDepCode是严格区分大小写
3、数据填充消息 AfterBrowse
消息定义:Public Event AfterBrowse (ByRef RstClass As ADODB.Recordset, ByRef RstGrid As ADODB.Recordset, ByRef sXML As String)
该消息表示在弹出参照,并选择完成数据后,程序员可能需要填写其他数据,其中参数含义:
RstClass: 对于有分类的参照,若操作员选择分类后,将返回选择的分类记录
RstGrid:返回列表的数据
sXML: 预留参数
注意:参照有可能没有参照回数据,但是也触发该消息
4、激活保存按钮消息 ActiveSaveBtn
消息定义:Public Event ActiveSaveBtn()
对于点击参照按钮、或
展开阅读全文