BizXML
(v2.3)
前言:2.0版本重大改变和调整的地方是界面排版,旨在对各类设备屏幕大小的兼容,包括PC、手机、平板客户端以及浏览器方式访问的界面大小屏幕的自动适应,同时增加表格逻辑(xLogic)及Javascript的支持。
目录
2.17.5. 三方接口(MagicCtrl第三方软件方法接口)
背景:无论是数字化、信息化还是互联网+,产品的标准化设计与用户的个性化应用需求始终碰撞着,任何标准化的产品无论设计得多么的完善也无法满足用户的个性化需求,而用户拿到系统后第一件事就是提出个性化定制的要求,界面定制调整、业务流程修改、业务逻辑变更等从系统上线开始就无休止的持续下去,而这一切基本都需要厂商、集成商研发工程师参与其中,周期长、难度大、繁琐。
本文档详细描述了BizXML,即业务扩展标记语言(Business XML),第一章介绍它的背景、基本概念和用途;第二章介绍BizXML的框架结构它们的解释执行机制BIA(BizXML Interpretation Algorithm);第三章介绍各类控件元素的使用及语法;第四章介绍事件处理及相关逻辑控制;第五章介绍界面的动态排版及特性;第六章开放式事件接口;第七章节介绍了SQL执行的规则。
BizXML即Business XML,以将应用设计从软件开发中分离出来的软件架构作为核心思想,业务应用前沿的设计工程师无需软件开发能力,而是发挥自己在业务应用方面的专长,深耕于业务关系与逻辑控制等业务息息相关的内容,或使用BizXML工具或简单编写几行BizXML脚本即可实现实用的应用,由于无需编译程序,应用设计所见即所得,所以业务应用上线可以加快90%以上。BizXML解析执行平台则由专业的软件开发人员站在平台设计的高度遵循BizXML标准来设计开发。
BizXML是一套完整的业务设计规范,类似于VoiceXML解决IVR个性化灵活定制的问题,BizXML实现的是Business业务界面流程逻辑的个性化应用定制,适合于包括但不仅限于客户关系管理系统(CRM)、呼叫中心业务及报表系统、数据库管理系统、办公自动化(OA)、企业资源管理(ERP)、商业流程管理(BPM)、知识库、企业信息化、数据报表、分析、数据集成、数据仓储等等业务应用,极大地解放了一大批专业研发人员无休止的个性化定制工作,也给用户最大限度的便利、灵活和自由。
BizXML最早出现于2007年,作为一种基于XML对话的设计语言,它的出现是为了简化3UCS一个名为3uBI(3UCS Business Intelligence)项目中业务流程/逻辑灵活定制的开发过程。经过3UCS与BizXML支持者及相关开发团队共同努力已日期完善,并且结合3UCS融合通信平台可获得智能多媒体通讯如VoIP、统一通信、互动联络、视频会议、即时通讯等诸多便利。
BizXML的出现完美的解决了标准化平台设计与个性化应用需求的矛盾,它创造性地将个性化定制简化到极致,以至于用户无需专业软件开发基础即可在超短时间内自行完成定制适合自己行业应用需求的软件,也就是BizXML的个性化工作可以开放给用户自己,无需专业的研发人员的参与。
BizXML智能业务提供灵活的动态界面设计支持,用户界面的布局及内容由用户登录系统时返回的界面设计模版决定(XML),因此每个用户登录后显示的界面都可以不尽相同,可用操作也可不一样,每个用户不同时间不同地点登录也可以显示不同的界面。当然每个用户登录界面也可以相同,但BizXML的灵活性可以让每个用户获得的服务与数据也不同,可用操作也不同,使得业务更灵活方便,特别是在运营服务中更彰显智能本色。
一个简单的例子,下面是一个应用页面的代码,包含两个组件(桔色文字,TextBox,Button),实现二维码/条码的扫描并将扫描结果填入TextBox中。(Language部分可以单独于文件实现多语言支持,组件都是包含于<Ctrls></Ctrls>元素内,组件化软件标准规范:http://3ucs.com/bizxml)
<WndTap Name="orderinfo" Text="orderinfo">
<Language name="orderinfo"><Lang name="orderinfo" value="客户下单"/></Language>
<Ctrls>
<GroupBox Name="GBorderinfo" Text="orderinfo" Size="100,100"><Ctrls>
<TextBox Name="TB_layout" Size="100,20" Text="" tooltip="商品编码"></TextBox>
<Button Name="Barcode" Size="80,20" Text="扫一扫" OnClick="(TB_layout)barcode"/>
</Ctrls></GroupBox>
</Ctrls></WndTap>
将上面的代码复制到BizTool自动化工具之“BizXML Editor”后点击“预览”将将弹出“客户下单”窗口,这个窗口及内容就是由复制进来的代码创建产生的效果。

在手机上将显示下面的界面,可以直接扫码,扫码结果将填入左边的文本框内。

BizXML要求平台采用C/S架构,但又可以提供类B/S架构的访问模式,由服务器(Biz Server)、客户机(BizFrm)、BizXML脚本(layout)三部分组成,同时提供Web服务引擎方便用户使用浏览器访问。
服务器端Biz Server运行于服务器,接受用户登录授权及相关管理与操作,同位于服务器的还有BizXML脚本(layout),默认位于服务器安装目录下的layout文件夹中,亦可根据自己的需求设置,它们由一个或一系列XML文件组成,用于定义不同用户窗体界面布局、业务流程逻辑等信息。它们在服务端共同提供用户信息、权限布局管理及数据库访问等支撑。当用户登录时系统根据预设的用户信息给客户机返回响应得界面及逻辑脚本供显示及用户输入处理。在数据库方面要求支持支持常用数据库,如MySQL、MSSQL、Oracle、IBM_DB2、DBASE、Paradox、Excel、Ascii、Foxpro、MSAccess、postgreSQL等等。
客户机端(BizFrm)运行于用户电脑、智能终端(智能手机、平板电脑等),显示业务界面及内容、接受用户输入并做出响应且与服务器交互完成业务逻辑处理输出结果给用户。
以3UCS业务系统为例,其服务器组件为xPlus(i3uBI.exe),基本配置文件为i3uBI.ini(3UCS Server安装根目录下),该配置数据库为i3u.mdb,若使用MSSql参考i3uBI(mssql).ini配置即可。其中下面的语句是取登录用户的密码及窗口布局(缺省返回i3u.xml)的,您也可以增加提取更多的项,如用户组、权限什么的,这些参数都会缓存,在以后的操作中都可以使用。
authQuery=select Password,Layout from userlogin where user_name='%{UserName}'
您若使用的是MySql,可能会出现中文字符乱码情况或访问不正常,可在sql节添加characterset=utf-8
类似于3UCS,上面也使用到了模版替换法则,具体内容可参见SQL访问执行说明。上例中如登录用户为6178,该语句为:select user_pwd as Password,Layout from userlogin where user_name='6178',当然在I3uBI平台的模版替换不仅仅在SQL执行中,您可以在下面看到:OnClick="nis3ucs:%{TB_TEL} 1"此处,若TB_TEL值为12345,那么该控件点击后执行的命令是发送消息"nis3ucs:12345 1",即直接呼出号码12345。
NISU登录时自动获取i3uBI服务器的地址及端口,其设置就是前述业务应用接口之CRM的配置,在软交换中NIS配置里将CRM值设为相应ip地址及端口,例如
crm=192.168.1.2:999。
客户机方面3UCS提供了NISU、xPlus、i3u等版本给与对BizXML的支持。
下面的图片是BizXML定制在不同平台设备上呈现出来的界面,分别是PC、手机、浏览器(PC、手机浏览器)。














BizXML的根元素标签为BXML,故所有有效代码都封闭于<BXML>与</BXML>之间,所以根文件的元素必须存在<BXML></BXML>(<XI3uWnd></XI3uWnd>作为3UCS早期定义的内部标签,故3UCS的平台产品是支持对XI3uWnd的解析支持,等同于BXML)方可正常解析,被包含的文件不做此要求。
<BXML/>的属性。
|
属性名 |
说明 |
|
appid |
应用ID,string |
|
title |
应用标题,string, |
|
navtype |
tab/tree,缺省根据顶层页面数决定, |
|
Ver |
申明BizXML最低版本 |
|
font-family |
使用的默认字体 |
|
font-size |
使用的默认文字大小 |
|
icons |
使用的图标库icons文件路径或网页路径 |
|
debug |
是否显示某些提示信息 |
|
secret |
保密设置:secret,默认为true,即客户端不能查看应用代码,也不可以开启开发者模式修改调试应用,此处该值为应用级配置值 |
|
developer |
开发者模式,此处该值为应用级配置值,0(none),1(view),2(edit ui),3(edit all,ui and logic);详见开发者模式 |
|
timetolive |
保持连接,当连接断开后数秒内重连服务器,如设置为0则不重连。 |
|
signinbguri |
登录界面的背景图片,例如:signinbguri="http://localhost/markers.png" |
|
WSSC |
web size scale coefficent |
<BXML/>的直属元素可以是DbDetails、EventHandlers、EventTriggers、WndTaps、Var、Language等。
|
标签名 |
用途 |
|
DbDetails |
用来定义数据源等数据访问的相关信息,如数据库类型、主机位置、初始数据库名等等,可以缺省,缺省时共享系统定义的数据库连接。 |
|
EventHandlers |
用于定义外部事件的处理,如电话呼入、接通、挂断等等。 |
|
EventTriggers |
用于定义系统自触发事件,如定时器,周期性出发某类操作。 |
|
Var |
(此处)为全局变量定义,定义时可以直接使用全局变量名,但赋值、读取时需使用前缀“session”或“app”,例如<var name="appname" expr="3ucs"/>,但读取时应为%{session.appname}或%{app.appname}。 |
|
Language |
此处为全局语言包,系统在对语言个性化处理时先在本页面语言包查找匹配,如未找到就在全局语言包查找 |
|
ErrorMsg |
错误信息的易读性处理包,将服务器返回的错误信息通过规则比对后呈现给用户更易理解的信息,例如:<Error name=".*PO_INV_OVER_RECEIPT.*" value="采购接收超量"/> |
|
webconfig |
web引擎专用设置 |
|
CSS |
|
|
WndTaps |
页面集,即用于显示或操作的窗体界面集合,子元素定义一个或多个页面(WndTap),页面的父元素只能是WndTaps。 |
每个页面(窗体)并用<WndTap></WndTap>封闭,每个页面(窗体)可以有控件如button并定义于<Ctrls> </Ctrls>内;也可以拥有子窗体定义于<WndTaps></WndTaps>;还可有专属变量,定义方式为<var name="3ucs" expr=""/>;
页面间可互相调用与访问、跳转,如赋值、读取等,例如%{custom.TB_mobile}将访问custom页面的TB_mobile控件。而要访问或赋值各控件的子参数(例如访问TextBox名为 “tb_rcdfn”的变量“cdrid”)类似于%{tb_rcdfn[cdrid]}、%{Provicelist[province_code]};赋值则直接使用控件名或控件[变量名],如custom.TB_mobile,tb_rcdfn[cdrid]。
框架及窗体的基本属性隶属于<BXML></BXML>
整个框架的第一默认字体("宋体",95),若不可用则使用第二默认(“MS Sans Serif”,80)、第三默认字体(“MicroSoft Sans Serif”,90),第一默认字体创建失败则创建第二默认字体,由于后者比前者小,经调整大小,二者实际大小相当。用户可以指定自己的字体,如<BXML font-size="80" font-family="MicroSoft Sans Serif">(参见尺寸表)。
用户相关参数及控制(如权限控制)也可以额外通过页面嵌套来实现,如下所示,在其所属的窗体布局(layout)根页面(eg:mylayout.xml)里定义其数据库连接参数,同时若出现config定义,系统自动读取新的相关参数信息,若该参数中含有新的窗体布局(layout)则选用新的定义(例如,若下面的config返回的参数中含有有效的layout数据,则将终止当前layout的载入而是载入新的layout信息,此时位于本配置区域的“purview”亦失效,不会被访问,因此须在返回的新的layout里配置purview,eg:
<DbDetails><purview>select m.module,m.purview from modules as m left join userlogin as u on u.bizrole=m.role_id where user_name='%{UserName}'</purview></DbDetails>)。
模块访问权限控制由purview定义,需返回module与purview值,跟layout类似,当用户脚本(BizXML)中存在purview配置时将覆盖先前出现的定义(即无论是i3ubi的配置还是先前bizxml脚本的配置都对当前用户无效)。Module的purview值为真时对应模块将开放给该用户访问,此处的module为xi:include中声明为module的内容,例如<xi:include module="report" href="mylayout\myreport.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>就是需要权限控制的report模块,而<xi:include href="mylayout\mykb.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>就不会受模块访问控制而呈现给所有拥有该layout的用户。
<?xml version="1.0" encoding="UTF-8"?>
<BXML>
<DbDetails>
<SubDriver>MySQL</SubDriver>
<Host>localhost</Host>
<database>billing</database>
<characterset>utf8</characterset>
<sqlMode>NO_BACKSLASH_ESCAPES</sqlMode>
<User>i3u</User>
<password>i3u</password>
<config>select * from userlogin where user_name='%{userName}'</config>
<purview>select m.module,m.purview from modules as m left join userlogin as u on u.bizrole=m.role_id where user_name='%{UserName}'</purview>
</DbDetails>
<EventHandlers>
<EventHandler Event="ReceivedCall('%{callerid}')">
<assign name="contact.TB_mobile" expr="%{callerid}"/>
<assign name="contact.TB_callid" expr="%{input}"/>
<DbDetails>
<Where>where base_mobil='%{contact.TB_mobile}'</Where></DbDetails>
<submit next="contact.ContactList" namelist="DbDetails" method="post"/>
</EventHandler>
<EventHandler Event="CallAlerting('%{input}')" Handler="(contact.TB_callid)SetText(%{input});"/>
<EventHandler Event="CallDisconnected()">
<assign name="topmost" expr="nis3ucs:USS|b"/></EventHandler>
</EventHandlers>
<EventTriggers>
<Trigger name="click" oneshot="0" Interval="10" dest="sms.search"></Trigger>
<Trigger name="click" oneshot="0" Interval="30" dest="sms.searchUserLst"></Trigger>
</EventTriggers>
<WndTaps>
<xi:include href="\mycontacts.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="\mycasespro.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="\mysoftswitch.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include module="report" href="\myreport.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="\mypd.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="\mykb.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="\myivr.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<WndTap Name="3UCS Server" Text="服务器管理(webAd)">
<Ctrls>
<WebBrowser Name="webAd" Url="http://%{serverip}:666"></WebBrowser>
</Ctrls></WndTap>
</WndTaps></BXML>
开发者模式,开发者可以在该模式启用后查看控件应用代码、控件属性、参变量及事件触发序列等,也可以在线修改属性来调整修改UI或业务逻辑逻辑等;模式分4级:0,未开启;1,仅查看;2,可修改UI界面;3,可修改全部,包括UI及逻辑。
开发者模式的设置分服务端设置与应用代码(<BXML/>元素属性)设置;服务端设置在服务端软件配置处设置,对该服务端提供服务的所有应用有效;应用代码设置仅对本应用有效,<BXML/>元素属性之“secret”与“developer”共同作用该模式的开启:当属性“secret”有明确赋值时,若值为1,即明确表明该应用不可以开启开发者模式,而值为0时“developer”属性值才起作用,而当属性“secret”没有出现时系统将向服务端申请开启该模式,由服务端返回结果。
developer值决定是否开启或何种方式开启开发者模式,developer取值可以为0、1、2、3或密码/(密码+“,ui”) /(用户名+密码)/(用户名+密码+“,ui”)的MD5值(MD5值可以通过3UCS XOne的“Get MD5”菜单生成)或sessionId/(sessionId+“,ui”) (每个用户使用客户端登录时每次登录的sessionId都不一样,可在服务端log日志查到);
值为“0/1/2/3”直接决定是否开启该模式,决定用户是否可查看代码等;值为字符串时按字符串规则匹配输入的授权码,与该值匹配才可以开启对应的开发者模式(可编辑);例如配置值为“密码”的MD5值,则输入的授权码的MD5值与该配置值匹配就将开发者模式设为3(可修改全部),如配置为“密码+“,ui”的MD5值时则计算输入的授权码+“,ui”的组合字符串的MD5值与该配置值匹配时开启模式为2,若配置值为“用户名+密码”的MD5值时则计算当前登录用户名+授权码的MD5值与配置值进行匹配,成功后开启开发者模式3。
3UCS Server自4.2.0.2版本开始支持XML的“xi:include”方式,要求所有文档为UTF-8编码格式,否则不处理。可以包含文件及文字,您可以在不同的文档里定制各个不同模块,然后通过该方式整合在一起。
|
属性名 |
说明 |
|
module |
声明为模块,接受模块访问控制 |
|
href |
被包含的内容的位置(相对于包含文件),必须为有效; |
|
xpointer |
被包含内容在文档中的位置ID,若缺失将包含整个文档; |
|
parse |
指明包含方式,默认为XML元素,若声明为“text”,被包含文件内容将被以text文字方式置入。 |
<xi:include module="report" href="mylayout\myreport.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
子目录mylayout中myreport.xml将被包含,但由于被声明为“report”模块,故受到模块访问权限控制。
<xi:include href="update.txt" xmlns:xi="http://www.w3.org/2001/XInclude" parse="text"/>
同一目录中的update.txt内容将被以文本方式置入。
当根文件的根元素例如<BXML debug="1">中debug置为1时它会自动将合成后的文件保存,保存的文件名在原文件名前加“tmp_”,例如根文件为i3u.xml;合并后为tmp_i3u.xml;每个文档只允许一个根元素。
自激发事件EventTriggers
<EventTriggers>
<EventTrigger name="name" dest="ctrl" oneshot="0" interval="10"></EventTrigger>
</EventTriggers>
|
属性名 |
说明 |
|
name |
系统自激发事件名 |
|
dest |
事件影响的控件名称 |
|
oneshot |
是否为单次激发,置为0则周期性激发,间隔为interval值(秒)。主要用于button触发click事件。 |
采用“BrowseFile”指令浏览文件,例如打开文件浏览窗口将得到的文件名连同路径填入TB_layout(TextBox)中:
Button控件的OnClick属性方式
<TextBox Name="filepath" Size="150,20"/>
<Button Name="selfile" Size="100,24" Text="浏览文件" OnClick="(filepath)BrowseFile:,filter=*.xml|*.xml|,localdir="/>
或子元素OnClick触发方式
<Button Name="selfile" Size="100,24" Text="浏览文件">
<OnClick><assign name="filepath" expr="browsefile" function=""/></OnClick></Button>
将上面的代码复制到“BizXML Editor”后点击“预览”将弹出窗口显示文本框及“浏览文件”按钮,点击按钮将打开资源管理器选择文件,选中后该文件路径将填入左边文本框中。

采用“SendFile”指令发送文件可以采用OnClick属性方式:
<Button Name="upload" Size="100,24" Text="上传窗体布局" OnClick="SendFile:,filter=*.xml|*.xml|,dir=layout,localdir="/>
或OnClick子元素触发方式
<Button Name="upload" Size="100,24" Text="上传窗体布局">
<OnClick>
<assign name="topmost" expr="SendFile:,filter=*.xls|*.xls|,dir=layout,localdir="/>
</OnClick></Button>
<assign name="topmost" expr="SendFile:,filter=*.*|*.*|,dir=file/%{user_id},localdir=,query=insert into attachment (filename,path,attachment,description,reftbl, refid, created_by, creation_date, last_update_by, last_update_date) values('%{_upload_file_name}','file/%{user_id}/','file/%{user_id}/%{_upload_file_name}','%{description}','vtiger_projecttask',%{projecttaskid}, '%{user_id}',now(),'%{user_id}',now())"/>
参数说明:SendFile:冒号后可指定文件名,若未指定则弹出文件管理器选择文件;“filter”为文件过滤条件设置;“dir”为服务器文件路径;“locadir”为本地路径,可指定;“query”为服务端完成操作后执行的语句,例如更新数据库等。
|
内置属性 |
说明 |
|
_upload_file_name |
(客户端有效)上传操作最终上传的文件名 |
|
_upload_dir |
(客户端有效)上传操作最终上传的路径名 |
|
DataPath |
(服务端有效)服务器文件存放路径 |
|
DataName |
(服务端有效)文件名 |
采用“getfile”指令发送文件可以采用OnClick属性方式:
<Button Name="playrecord" Size="100,24" Text="播放录音" OnClick="GetFile:%{tb_rcdfn},dir=record,localdir="/>
或OnClick子元素触发方式
<Button Name="playrecord" Size="100,24" Text="播放录音">
<OnClick><assign name="topmost" expr="GetFile:%{CallList[recFn]},dir=record,localdir="/>
</OnClick></Button>
参数说明:GetFile:冒号后可指定文件名,若未指定则弹出文件管理器选择文件, “dir”为服务器文件路径,“locadir”为本地路径,可指定;“query”为服务端完成操作后执行的语句,例如更新数据库、TTS应用等。
|
内置属性 |
说明 |
|
filename |
(客户端有效)下载操作最终保存的文件名 |
|
dir |
(客户端有效)下载操作最终保存的路径名 |
|
DataPath |
(服务端有效)服务器文件存放路径 |
|
DataName |
(服务端有效)文件名 |
目录的管理操作是将一个目录当作一个数据库表来操作。
例如获取“log”目录下所有目录和文件,并展示在DirList(ListCtrl)中:
<ListCtrl Name="DirList" loadedclick="1" OnLoad="init" Size="400,200">
<DbDetails>
<Database>log</Database>
<datatype>dir</datatype>
<queryFormat>select * from log</queryFormat>
</DbDetails>
</ListCtrl>
返回的文件信息为:"filename","size","modify","type","filetype";
查询语句可以附加where条件,条件可以是filetype("doc","xls","txt","pdf","cpp","csv","file","symbolic link","Dir","CharDevice","BlockDevice","Fifo","SocketDevice"……),也可以的filename文件名;
删除目录文件:
<Button Name="deldir" Clickneedconfirm="true" Size="100,20" Text="Deldir"><OnClick>
<DbDetails>
<Database>log</Database>
<datatype>dir</datatype>
<queryFormat>delete from log where filename='%{DirList[filename]}'</queryFormat>
</DbDetails>
<submit namelist="DbDetails"/>
</OnClick></Button>
将删除DirList选中的文件。
文件过滤,每两个“|”为一组,第一个为用于显示的文件类型字符串,第二个用于筛选该类型的字符串,一组里若多个类型则内部用“;”分隔开,结束位置为双“|”。下面例子将使用了三组类型,分别是Excel (*.xls)、Excel (*.xlsx)、Execl Files (*.xls;*.xlsx),各自表达的意思分别是显示xls文件、xlsx文件、显示xls和xlsx文件。
filter=Excel (*.xls)|*.xls|Excel (*.xlsx)|*.xlsx|Execl Files (*.xls;*.xlsx)|*.xls;*.xlsx||
使用接收文件GetFile并将“dir”参数设置为“tts”,可将query的文本内容转换为语音并保存在指定的文件里(第一个参数),“GetFile:a.wav,dir=tts,query=%{DirList[0]},localdir=”将列表框选中行第一列的文字转换为语音报错在a.wav并传送给客户端供播放[完整代码见demo文件之ctrls/ctrls_filemanage.xml]。
使用上传文件SendFile并设定cmd参数为unzip命令,可将上传的zip文件解压至指定的目录中,unzip命令的参数依次为要解压的文件、解压的目录,若解压目录缺失则取 文件路径+文件名 为路径,[完整代码见demo文件之ctrls/ctrls_filemanage.xml]
<assign name="topmost" expr="SendFile:,filter=MyType Files (*.zip)|*.zip||,dir=files,localdir=,cmd=unzip "%{datapath}\%{_upload_file_name}" "%{datapath}""/>
使用上传文件SendFile并设定itfname、codebase、engine、sessionid等参数如下,即可将上传的WAV文件转换为文字:[完整代码见demo文件之ctrls/demo_ai.xml]
itfname=ai_itf,codebase=XBizAIBridge.dll,engine=xASR_cs,sessionid=stt_en_us
打开消息窗口发送即时消息。eg:
<Button Name="sendMsg" Text="发消息" Size="50,20" tooltip="打开消息窗口">
<OnClick><assign name="topmost" expr="nis3ucs:im|%{UserList[user_name]}"/>
</OnClick></Button>
打开消息窗口向UserList选中的记录参数user_name的用户发送消息。

打开其他程序,使用exec指令,例如打开TB_TEL为网站啥的就调用IE,您可以用它来下载文件啥的。若为空,直接打开资源管理器了。eg:
<Button Name="ie" Size="35,24" Text="EXEC" OnClick="exec:%{TB_TEL}"/>
<Button Name="ie" Size="35,24" Text="EXEC">
<OnClick><assign name="topmost" expr="exec:%{TB_TEL}"/>
</OnClick></Button>
<Button Name="ie" Size="35,24" Text="EXEC">
<OnClick><assign name="topmost" expr="exec:http://3ucs.com"/>
</OnClick></Button>
BizXML的数据源可以是数据库,如Mysql、Sqlite、MSSQL等等,也可以是NoSql数据库、config(ini)文件、文件目录、MQTT/IOT、AI_ITF,都可以使用SQL语法来访问,后面将会详细介绍。
ListCtrl等控件拥有Onload的属性,可以将sql语句赋值给Onload,控件初始化时会通过Onload来初始化其数据,例如下面代码中用sql语句赋值给“OnLoad”属性,CallList控件初始化时会使用该sql语句来读取数据库初始化数据列表并显示。
<ListCtrl Name="CallList" PageSize="50" Location="20,60" Size="700,500" Heading="记录号,30;通话记录号,50;主叫,100;接转号码,100;被叫,100;录音,100;开始时间,150;通话时长,40;得分,30;" OnLoad="sql:select cdrid,sessionId,callerid,calledid,calleeid,recFn,starttime,duration,score from gwcalls where (callerid='%{UserLst}' or calledid='%{UserLst}') and starttime like '%{DateTimeStart}%' ORDER BY `gwcalls`.`starttime` DESC limit %{StartRow},%{PgSize}" OnClick="SetText(tb_rcdfn,%5);SetText(tb_rcdfn[cdrid],%0)"/>
后续数据更新可通过其他控件如Button的OnClick事件来触发更新。
<Button Name="search" Location="30,30" Size="100,24" Text="查找"
OnClick="(CallList)sql:select cdrid,sessionId,callerid,calledid,calleeid,recFn,starttime,duration,score from gwcalls where (callerid='%{UserLst}' or calledid='%{UserLst}') ORDER BY `gwcalls`.`starttime` DESC limit %{StartRow},%{PgSize}"></Button>
BizXML提供了格式化生成SQL语句的能力,将SQL语句分拆成不同功能部分,便于编辑修改SQL的配置等,系统在执行时按照预定的规则重组SQL语句并做相关校核(比如INSERT语句中必须输入项的校验等)。
<ListCtrl Name="callRecLst" PgSize="50" Location="20,40" Size="600,300" Heading="记录号,30;主叫,100;被叫,100;开始时间,100;通话时长,100;总时长,100">
<DbDetails Fcsm="false" mode="select">
<Table>gwcalls</Table>
<Index>cdrid</Index>
<Data>cdrid,callerid,calledid,starttime,duration,totalduration</Data>
<Order>cdrid desc</Order>
<Where>cdrid=1</Where>
<QueryFormat>select %{Data } from %{Table } where %{Where } limit %{StartRow},%{PgSize}</QueryFormat>
</DbDetails>
</ListCtrl>
[注] 参数Host、Database、SubDriver、User、Password、Table在旧版本中会添加db前缀(非用户宏观配置内(用户宏观配置处不允许添加Db前缀,因此建议所有地方都不要添加该前缀),主要在控件处理内),后续版本将修正过来,同时也对旧代码做兼容处理。
这里实际生成的sql语句为:
select cdrid,callerid,calledid,starttime,duration,totalduration from gwcalls where cdrid=1 limit %{StartRow},%{PgSize}
|
DbDetails属性 |
说明 |
|
Fcsm |
Field ctrl smart match, 用于自动匹配数据库字段与控件实现自动的数据交换,方便对控件的赋值语句及取值语句 |
|
mode |
数据库操作模式(select、insert、update等),mode参数缺失时将从queryformat里提取 |
fcsm、mode参数若均缺失将不能执行fcsm)参数用于自动匹配数据库字段与控件实现自动的数据交换,方便对控件的赋值及取值操作,前提为field name 与 Ctrl Name 相同且位于同一页面,此处为脚本的方便性,增加了<DataEx/>元素,类似于<Data/>,它是<Data/>的补充,对应不同的操作有不同的特性,例如:
insert模式下为<Data>id,value</Data>里面的filed自动生成field及value并呈现在insert语句中,而<DataEx>name,age;'%{Tb_name}', '%{Tb_age}’ </DataEx>,自动匹配时将自动将分号前的“name,age”补充至insert语句的field部分,而分号后面的部分“'%{Tb_name}', '%{Tb_age}’”补充至value部分;
在update模式下,<Data>id,value</Data>里的field自动生成update的field-value表示id='%{id}',value='%{value}',而<DataEx>name='%{Tb_name}', age='%{Tb_age}’</DataEx>也将生成相应的表达式补充至其后,共同成为该语句的data部分。若需<DataEx>呈现,必与<Data/>同时呈现。如果<Data/>的数据格式为相应的操作的格式,fcsm将不做自动匹配操作。<v3.3>
在“QueryFormat”未赋值或不存在时自动以“select %{ Data } from %{ Table } where %{ Where } order by %{ Order }”生成sql语句。
如果需要初始化时就访问数据库,在<ListCtrl /〉等控件相应添加属性OnLoad="init"即可。
用户可以通过其他的事件来触发相应的控件访问数据库,传递过来的参数遵循替换法则,即传递过来了某个参数如<Where/>参数,目标控件的<DbDetails/>内的<Where/>将被新的参数内容替换,该参数内容将保持参与数据库的执行操作,直至有新的传入来替换,例如下面的代码当按钮(searchcalls)按下时(OnClick)custom窗体的子窗体CallRec的控件callRecLst将执行数据库的访问,且将<Where>参数传入给callRecLst参与数据库的执行。
<Button Name="searchcalls" Visible="true" Enabled="true" Size="100,24" Text="查找通话记录">
<OnClick>
<if cond="%{custom.TB_mobile}">
<DbDetails>
<Where>SUBSTRING(callerid,-11)='%{custom.TB_mobile}' or SUBSTRING(calledid,-11)='%{custom.TB_mobile}'</Where>
</DbDetails>
<submit next="custom.CallRec.callRecLst" namelist="DbDetails"/>
</if>
</OnClick></Button>
call updatestatus(17)
调用函数(暂不支持返回值)
exec QT_Fiber_Evt_Compare '%{Address}', '%{fibernumber}','%{Wave}','%{DataPath}'
在Sql语句里有类似%{StartRow},%{PgSize}(须数据库支持)时可以方便实现翻页功能:
<Button Name="FirstPage" Size="100,20" Text="首页" OnClick="(ContactList)GetPage(First)"/>
<Button Name="PrePage" Size="100,20" Text="上一页" OnClick="(ContactList)GetPage(Pre)"/>
<Button Name="NextPage" Size="100,20" Text="下一页" OnClick="(ContactList)GetPage(Next)">
“export”指示导出,type指示导出类型,现只有csv(excel)支持,当此处未明确指明时读取<export></export>内容如下所示csv;Filename指示导出的文件名,相对于程序安装根目录,若未指明或空则读取<filename> </filename>内容,如下为tmp.csv。
<Button Name="export" Location="130,10" Size="100,24" Text="导出" >
<onclick><dbdetails>
<export type="%{Type}" Filename="%{FileName}">csv</export>
<filename>tmp.csv</filename></dbdetails>
<submit next="callRecLst" namelist="dbdetails"/></onclick></Button>
<TextBox Name="Type" Location="230,10" Size="100,24" Text=""/>
<TextBox Name="FileName" Location="330,10" Size="100,24" Text=""/>
<ListCtrl Name="callRecLst" PgSize="50" Location="20,40" Size="600,300" OnLoad="init" Heading="记录号,30;主叫,100;被叫,100;开始时间,100;通话时长,100;总时长,100">
<DbDetails>
<Table>gwcalls</Table>
<Index>cdrid</Index>
<Data>cdrid,callerid,calledid,starttime,duration,totalduration</Data>
<Order>cdrid desc</Order>
<Where>cdrid>1</Where></DbDetails>
</ListCtrl>
将“datatype”设置为NoSQL,Database值设为对应的配置文件,下面的代码将访问immsg数据库读取7102发出的信息[完整代码见demo文件之ctrls/ctrls_NoSql.xml]:
<ListCtrl Name="NoSQLLst" PageSize="10" loadedclick="1" OnLoad="init" Size="450,150">
<DbDetails>
<Database>..\..\3UCS\\xdb\\immsg.conf</Database>
<datatype>NoSQL</datatype>
<queryFormat>select * from immsg where sendto='7102' order by id desc</queryFormat>
</DbDetails>
</ListCtrl>
将上面的代码复制到“BizXML Editor”后点击“预览”将弹出窗口显示7102发出的消息列表,如下图所示。

BizXML提供NoSQL支持,规范为基于google的LevelDB二次开发的时序数据库,并要求提供SQL语法支持。
ID为记录插入的时间ms(毫秒)值,score为ID的分钟值即Value(ID)/6000。
iot数据库拥有key“topic”,immsg数据库拥有key“recvfrom”“sendto”
查询语句类似于MySQL语句,默认倒序查询:
select [columns] from [table] where [where] order by order limit [limitstr] key [keystart] score [score]
limit的offset可略去即limit 0,100;limit 100;limit ,100都合法,都是取前100条记录
score可以指定score_start,score_end;例如score 0,100000;score 10000;score ,1000000均合法,另外可以使用时间值来设置score,例如score 1 hour ago 表示查询一小时前的;score ,1 hour ago表示查询现在至一小时前的记录;score 2021-05-01表示查询2021-05-01之前的记录
示例:
select * from iot;
select * from iot where topic='xxx';
select * from iot limit 0,100 score ,4 week ago
select %{dev_data[columns]} from iot where topic='%{dev_data[dev_type]}/%{dev_data[dev_id]}/%{dev_data[data_id]}/%{dev_data[data_param]}' limit 0,100 score ,4 week ago
select * from iot limit 100 score now();
select * from iot where topic='%{mqtt_topic}' limit 0,100 score now(),2021-05-05 20:10
select * from iot where topic='devices/desoutter01/sys/61/detail' and key='%{YU5A4A554012100410003818643410}'
将“datatype”设置为MQTT,Database值设为MQTT,下面的代码将更新“mqtt_topic”控件里topic的值为“topic_value”控件的值(可能会失败,比如当前IOT系统不存在对应的topic)[完整代码见demo文件之ctrls/ctrls_NoSql.xml]:
<Button Name="mqtt_update" Clickneedconfirm="true" Size="80,20" weight="80" Text="修改MQTT" tooltip="以SQL方式提交修改文本框mqtt_topic中主题的值为文本框topic_value中的值">
<OnClick>
<DbDetails>
<Database>mqtt</Database>
<datatype>mqtt</datatype>
<queryFormat>set %{mqtt_topic}='%{topic_value}'</queryFormat>
</DbDetails>
<submit next="topic_value" namelist="DbDetails"/>
</OnClick></Button>
<SetVisible name="insertp" Visible="0"/> 隐藏控件insertp
<SetVisible name="insertp" Visible="1"/> 显示控件insertp
<SetEnabled name="TB_num" enabled="0"/> 禁用控件TB_num
<SetEnabled name="TB_num" enabled="1"/> 启用控件TB_num
被禁用的控件不能做任何操作,如TextBox禁用后连复制等都不允许。
<submit next="insert" function="click"/>
next——接受事件的控件
function——事件名称(须为接受控件所能处理的事件名称),取值为”onok”、”oncancel”且当前窗口为”popup”时将关闭当前窗口。
TextBox:enchange,enterkey
Combobox:editchange, selchange,selendok; resetcontent
Button:click
ListCtrl:savetofile; import; resetcontent
每个页面进入时会激发当前页面的Activate事件,对应的处理事件为该页面的OnActivate内容,即<OnActivate></OnActivate>
<WndTap Name="cases" Text="工单信息">
<Ctrls>Button Name="insert" Location="330,270" Size="100,24" Text="新增"></Ctrls>
<OnActivate>
<alert next="insert" expr="%{session.basecode}"/></OnActivate>
</WndTap>
目前对下列控件的部分事件响应并可作相应的操作(下述事件元素出现在相应控件时同时会禁用其相应的属性内容,如<OnClick></OnClick>会忽略OnClick="onclickmsg0"):
Button——Click(点击按钮)<OnClick></OnClick>
ComboBox——SELCHANGE(选择项改变)<OnSelChange></OnSelChange>,SELENDOK(选择好)< OnSelEndOk></ OnSelEndOk>
TextBox——CHANGE(内容修改、更新)<OnEnChange> </OnEnChange>,ENTER_KEY(回车)<OnEnterKey></OnEnterKey>
示例:
<Button Name="update" Clickneedconfirm="true" Location="550,120" Size="50,24" Text="修改" >
<OnClick>
<if cond="%{CB_orderState[id]}!=0">
<alert next="xx" expr="只能修改未确认订单"/>
<else/>
<DbDetails>
<queryFormat>Update s_order set o_name='%{TB_name}' where o_id=%{TB_code} and o_state=0</queryFormat></DbDetails>
<submit next="update" namelist="DbDetails" method="post"/>
</if>
</OnClick></Button>
<ComboBox Name="CB_name" SelectedIndex="0" Location="90,180" Size="150,300" Text=""
OnLoad="sql:select s_p_name.p_name,s_p_name.p_id from s_p_name where s_p_name.p_state=1">
<OnSelChange>
<if cond="%{CB_name[p_id]}<16">
<SetEnabled name="TB_num" enabled="0"/>
<assign name="CB_xinghao" expr="-1" function="SetSel"/>
<assign name="CB_price" expr="-1" function="SetSel"/>
<DbDetails>
<queryFormat>select x_desc,id from dbo.s_xinghao where p_name=%{CB_name[p_id]}</queryFormat></DbDetails>
<submit next="CB_xinghao" namelist="DbDetails"/>
<assign name="TB_total" expr="0"/>
<assign name="TB_num" expr="0"/>
<elseif cond="%{CB_name[p_id]}=24"/>
<SetEnabled name="TB_num" enabled="0"/>
<assign name="CB_xinghao" expr="-1" function="SetSel"/>
<assign name="CB_price" expr="-1" function="SetSel"/>
<DbDetails><queryFormat>select x_desc,id from dbo.s_xinghao where p_name=%{CB_name[p_id]}</queryFormat></DbDetails>
<submit next="CB_xinghao" namelist="DbDetails"/>
<assign name="TB_total" expr="0"/>
<assign name="TB_num" expr="0"/>
<else/>
<SetEnabled name="TB_num" enabled="0"/>
<DbDetails>
<queryFormat>select x_desc,id from dbo.s_xinghao where p_name=%{CB_name[p_id]}</queryFormat></DbDetails>
<submit next="CB_xinghao" namelist="DbDetails" method="post"/>
<DbDetails>
<queryFormat>select p_dj,p_id from s_product where p_name=%{CB_name[p_id]}</queryFormat></DbDetails>
<submit next="CB_price" namelist="DbDetails" method="post"/>
<assign name="TB_total" expr="0"/>
<assign name="TB_num" expr="0"/>
</if>
</OnSelChange></ComboBox>
系统的变量分如下几类:
1、 系统全局变量:系统初始化、登陆时带入的变量如serverip、userid、password及用户关联的参变量(例如业务服端设置的授权查询语句:select user_pwd as Password,Layout from userlogin where user_name='%{UserName}' 会将参数Password、Layout作为变量传入);生存期为用户登录期间;
2、 $this、$parent变量:$this指向控件所属的的wndtap(页面),$parent指向控件所属wndtap的父wndtap(父页面)
3、 框架全局变量,定义于xml中,界面的根元素的子元素,带有前缀app或session的,生存期为整个登陆期:如:
<BXML debug="1">
<var name="contactdb" expr="base"/>
<var name="contactwtp" expr="contact"/>
可以在任何地方赋值或读取,如<assign name="app.contactid" expr="1"/>;
4、 临时变量,如<assign name="basecode" expr="1"/>中的“basecode”,生存期较短,仅存在于页面激活的短暂时间,一旦页面切换至其他页面该变量消失,再次进入该页面也不存在。
5、 页面局部变量,通过var声明的变量,如<var name="3ucs" expr=""/>(WndTap子元素,Ctrls前,例如<WndTap Name="custom" Text="客户信息"><WndTaps/><var name="3ucs" expr=""/><Ctrls/><WndTap/>),与临时变量的区别就在于它被通过声明var声明了,生存期为页面存在的所有时间,无论其激活与否。
6、 控件附属变量,附属格式为:控件名[变量名],如TB_code[basecode]中basecode附属于控件TB_code,可以通过<assign name=“TB_code[basecode]" expr="1"/>赋值;另外通过sql语句获取控件数据时也会将字段内容绑定给该控件。如:<ComboBox Name="CB_name" Visible="true" Enabled="true" ReadOnly="false" SelectedIndex="0" OnLoad="sql:select s_p_name.p_name,s_p_name.p_id from s_p_name where s_p_name.p_state=1" LocationX="90" LocationY="180" SizeWidth="150" SizeHeight="300" Text=""> 中p_name、p_id绑定给相应的项值并将p_name显示在列表空中供选择,引用时CB_name[p_id]就是选中项的p_id值。他们的生存期为控件内容未改变(与该页面切换或是否激活无关),即一旦内容发生改变,这些变量就会发生改变。
BizXML提供多语言支持,通过定义不同语言包来实现界面的用户相关的多语言应用,例如A、B用户同时使用一套业务应用,但A可以使用英文界面,而B用户可以使用简体中文界面。
语言包可以直接在XML主文件中定义也可以在单独定义在XML文件中通过包含的方式来提供支持,语言包应该使用UTF-8格式编码,包含格式如下:
<xi:include href="groups_lan.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
语言定义与语言包分有全局和局部之分,定义或包含于主文件<BXML></BXML>之内<WndTaps>之前的为全局,作用于整个应用;
或者定义或包含于WndTap的<WndTap></WndTap>之内<Ctrls>之前的为局部,仅有效于该页面。
在语言选择显示过程中优先在本页面的局部语言Language中匹配,未找到有效匹配定义则去全局语言包定义中匹配。
定义格式如下:
<Language name="groups">
<Lang name="domain" value="域名"/>
</Language>
value值“域名”即为domain的显示文字。
数据的多控件复位可通过GroupBox来处理,发送给GroupBox的复位请求会自动传递给其子空间,包括子GroupBox,详见GroupBox复位;
搜索查询功能通过GroupBox Search来提供了诸多便利,,详见GroupBox搜索;
打印功能通过GroupBox来提供,基于GroupBox设定打印区域,详见GroupBox列印
ListCtrl提供了丰富的数据统计功能,如MDX等,详见ListCtrl数据统计
MagicCtrl提供了第三方软件接口、算法等方法的类COM接口,详见MagicCtrl接口
……
BizXML框架内预定义了一些常用控件如:Button、TextBox、ListCtrl,etc,本章将大致介绍这些控件及如何使用。
控件的父元素只能是Ctrls,即只能包含于<Ctrls></Ctrls>之间,WndTap,GroupBox通过包含Ctrls元素来定义控件。
例如,定义静态文本可以是下面的示例代码:
<Label Name="lb " Visible="true" Enabled="true" Size="100,30" Text="武汉科技大学" ToolTip="3UCS"></Label><BR/>
<Label Name="lb_index" Size="50,20" Text="3UCS"/>
将上面的代码复制到“BizXML Editor”后点击“预览”将弹出窗口显示文本:

控件部分属性值如OnClick等可以以子元素方式的方式如<OnClick></OnClick>方式定义,当以元素方式定义了该属性,系统将会忽略属性方式的定义。
任何一个控件都具有通用的基本属性:
|
属性名 |
说明 |
|
Name |
控件名称,用于标识识别与引用,同一页面不应有重复,不可缺失 |
|
Text |
显示的文字,显示给用户(如Label等)或输入(如TextBox等) |
|
DataType |
控件数据类型,默认为空,不设置,可设置的值为"NUMERIC","DATETIME","STRING" |
|
Visible |
是否显示,true显示,false不显示;缺失默认true,即显示控件 |
|
Enabled |
使能,禁用或使能;缺省默认true,即使能控件,可操作 |
|
ReadOnly |
只读,缺省默认为false |
|
Location; LocationX,LocationY |
位置,指示该控件位于本页面框体的位置,左上角为(0,0),向右向下增量;前者定义为Location="30,30",后者定义为LocationX="30" LocationY="30",当该参数缺失即未定义时系统采用自动排版生成该控件的位置 |
|
Size; SizeWidth,SizeHeight |
大小,指定宽度与高度;前者定义为Size="30,30",后者定义为SizeWidth="30" SizeHeight="30" |
|
ToolTip |
控件提示,当鼠标置于其上方示显示设置的文字,可用于提示用户操作方法 |
|
GroupBox |
指定该控件所属GroupBox,一般用于在GroupBox外围定义的Ctrl |
|
Weight |
控件占所属GroupBox的宽度值(比例,设定Weight的控件在动态计算宽度时将对这些控件的Weight至累加,各控件所占宽度由其Weight值占总Weight值比例决定), |
|
|
打印控制参数(输出至打印机),1:打印输出,0:不打印;默认1 |
|
printfixheight |
打印控制参数(输出至打印机),是否按设定高度打印表,限定区域打印,不影响后续控件设定的打印位置,默认为真;若设为否,则打印实际数据后根据实际打印的高度调整后续控件打印位置。 |
最常用的控件之一,它主要接受按钮点击处理,事件方法可在属性OnClick声明如OnClick="onclickmsg0",也可定义子元素如
<OnClick>onclickmsg1</OnClick>,
定义子元素后属性方法失效(例如下例执行onclickmsg1而不是执行onclickmsg0),且定义子元素的方面灵活些,因为它还可以定义更多参数及条件执行。
<Button Name="update" Size="100,20" Text="修改" Clickneedconfirm="1" OnClick="onclickmsg0"><OnClick>onclickmsg1</OnClick></Button>
|
属性名 |
说明 |
|
OnClick |
Click事件处理方式 |
|
Clickneedconfirm |
点击该操作是否需要二次确认,缺失默认否,若点击需要确认后执行可添加属性="true", |
|
IntervalClick |
点击间隔,默认2(秒),点击间隔时间少于该值时会忽略点击并提示点击频繁 |
|
icon |
图标,支持TTF字符库,如fontawesome等语言包里也可定义,格式为”icon_”+控件名;例如<Lang name="icon_addone" value="fas fa-plus"/> |
|
sqlpkinsert |
Sql插入操作时返回自动增加id值将赋值给sqlpkinsert |
Button控件子元素
|
标签名 |
说明 |
|
OnClick |
Click事件处理方式; |
|
OnFecthFileEnd |
文件提取完成事件处理[filename(文件名称), file(文件,含路径与名称), result(1,0,成功与否)] |
|
OnSendFileEnd |
文件发送完成事件处理[filename(文件名称), file(文件,含路径与名称), result(1,0,成功与否)] |
例如OnClick="(UserList)sql:select * from userlogin where 1" 将在button点击后传递给控件是UserList,即访问数据库并将结果返回给UserList表中,如果缺省小括号及控件名,返回给Button自己,只是Button不处理而已。
又例如
<OnClick><if cond="%{custom.TB_mobile}">
<DbDetails><Where>SUBSTRING(callerid,-11)='%{custom.TB_mobile}' </Where></DbDetails>
<submit next="custom.CallRec.callRecLst" namelist="DbDetails" method="post"/></if></OnClick>
在custom.TB_mobile不为空时访问callRecLst定义的数据库参数但使用本语句内定义的条件Where语句。
<CheckBox Name="activeStatus" Size="200, 20" Text="启用" Checked="true"></CheckBox>
该控件可接受处理事件,相关逻辑定义于子元素OnChecked内。
|
属性名 |
说明 |
|
Checked |
初始化时是否checked |
CheckBox控件子元素
|
标签名 |
说明 |
|
OnChecked |
OnChecked事件处理方式; |
赋值Check "CheckBox3": <assign name="CheckBox3" expr="1"/>
ComboBox下拉列表选择控件
<ComboBox name="qid" size="120,100" tooltip="问题题号" SelectedIndex="0" OnLoad="init"></ComboBox>
下拉选择框ComboBox特有属性有:
|
属性名 |
说明 |
|
Type |
类型,1——Simple,仅Edit(编辑);2——Dropdown,Edit+List(可编辑及下拉选择);3——Droplist,仅List(下拉选择),默认3 |
|
LimitText |
允许控件输入的最多字符数,默认无限制。(在Type为3时无效) |
|
SelectedIndex |
指示初始化载入数据后选择的项,若不选择则删除该属性;该控件每次载入新数据后若会自动选择指定项,例如SelectedIndex=”0”,控件自动设置当前选择的项为第0项,若未设置SelectedIndex,则设为未选,即SelectedIndex值为-1 |
|
SelectedString |
指示初始化载入数据后选择的项,若不选择则删除该属性;该控件每次载入新数据后若会自动选择指定项,例如SelectedIndex=”aa”,控件自动设置当前选择的项值为“aa”的项,若未设置SelectedString,则设为未选,取SelectedIndex值 |
|
OnLoad |
(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可 |
|
OnEditChange |
EditChange事件处理逻辑,当存在子元素OnEditChange时自动覆盖 |
|
OnSelChange |
SELCHANGE事件处理逻辑,当存在子元素OnSelChange时自动覆盖 |
|
OnSelEndOk |
SELENDOK事件处理逻辑,当存在子元素OnSelEndOk时自动覆盖 |
|
Items |
定义下拉列表选项(可以为1|2|3或1~3或1~3*10),当有动态选项(例如通过Sql语句从数据库加载)时将被覆盖 |
|
PageNav |
定义该下拉列表为翻页导航,根据返回的页数自动生成页目导航,例如系统返回8页,将自动添加的选项为0,1,2,3,4,5,6,7 |
通过Sql语句加载给控件的数据首字段将被显示,其它字段的内容将作为属性附属于各项值,可以通过属性方法来获取,如CB_eyeill控件select p_name,id from dbo.eyeill将把p_name字段的值显示在下拉框CB_eyeill中,而引用选中的项的值可以是CB_eyeill[p_name]和CB_eyeill[id]。
下列参数可以通过%{控件名[参变量名]}获取,eg:%{UserList[itemcount]}将获取UserList的当前页的记录数
|
参数名 |
说明 |
|
selectedindex |
当前选择项的序号,从0开始 |
|
windowtext |
控件当前显示的文字或输入的文字,方便获取窗口当前的文字而开放出来的属性,获取方法相同,如控件名为CB_eyeill,则CB_eyeill[windowtext]就是CB_eyeill显示的文字。 |
|
length |
控件当前显示的文字或输入的文字的长度 |
|
itemcount |
控件选项数目 |
|
letter |
控件当前显示文字的汉语拼音(全部小写) |
|
letteru |
控件当前显示文字的汉语拼音(全部大写) |
|
letters |
控件当前显示文字的汉语拼音(只返回小写首字母) |
|
lettersu |
控件当前显示文字的汉语拼音(只返回大写首字母) |
|
letterfu |
控件当前显示文字的汉语拼音(首字母大写) |
|
letterd |
控件当前显示文字的汉语拼音(全部小写+分隔符) |
也可以通过属性Items="6178|6179|6180|6181定义框内选项列表替代OnLoad方式获取的数据
子元素DbDetails定义其访问数据的方式逻辑。
SetSelNoEvent、SetSel实现对Combobox的赋值,二者的区别在于SetSelNoEvent仅仅改变选择项而不触发SELENDOK也不能触发SELCHANGE事件,而SetSel还会触发SELENDOK和SELCHANGE事件,示例如下:(name为Combobox之name;expr为将赋于Combobox的值,可以为选项的序号,-1清空选择,可选择的项从0开始递增,也可以是选项的文字;function为方法,如SetSel,SetSelNoEvent,SetValue<控件变量,相关于当前选中的项,所赋值生存期等同于控件原生数据,即items数据,如果Combobox数据在类似sql执行返回更新数据items时通过SetValue所赋值亦将消失>);
<assign name="CB_content" expr="-1" function="SetSel"/>
<assign name="CB_media" expr="-1" function="SetSel"/>
<assign name="CB_newCustomer" expr="-1" function="SetSel"/>
<assign name="UserLst" expr="%{SeatsNo}" function="SetSel"/>
内容的清空可通过函数resetcontent来实现,如<submit next="CB_eyeill" method="post" function="resetcontent"/>
项的遍历通过foreach来实现,eg:对名为“qid”的Combobox遍历(依次取每个下拉选项的id变量)
<foreach><assign name="astr1" expr="%{qid[id]};-"/></foreach>
<Submit next="qid" namelist="foreach" function="foreach"/>
|
标签名 |
说明 |
|
reset |
复位控件至初始化状态 |
|
resetcontent |
清空控件数据 |
|
foreach |
对每行数据执行相同的操作,即数据遍历 |
|
EditChange |
对该控件触发该事件 |
|
SELCHANGE |
对该控件触发该事件 |
|
SELENDOK |
对该控件触发该事件 |
项的遍历通过foreach来实现,eg:对名为“qid”的Combobox遍历(依次取每个下拉选项的id变量)
<foreach><assign name="astr1" expr="%{qid[id]};-"/></foreach>
<Submit next="qid" namelist="foreach" function="foreach"/>
ComboBox目前可响应的事件有:
EditChange(Dropdown模式时Edit文字发生改变)<OnEditChange></OnEditChange>,
SelChange(选择项改变)<OnSelChange> </OnSelChange>,
SELENDOK(选择好)< OnSelEndOk></ OnSelEndOk>,DataChange(选项内容发生改变)<OnDataChange></ OnDataChange >。
|
事件名 |
标签名 |
说明 |
|
EditChange |
OnEditChange |
编辑窗口输入内容发生改变(选择改变不触发该事件) |
|
SELCHANGE |
OnSELCHANGE |
手动选择选项发生改变;另外通过SetSel选择项值也会触发该事件,选项值清空且之前有选择(选项序号大于等于0)时也触发该事件; |
|
SELENDOK |
OnSELENDOK |
手动选择选项改变且选择完成时触发该事件,另外通过SetSel选择项值也会触发该事件,选项值清空且之前有选择(选项序号大于等于0)时也触发该事件。 |
Combobox控件子元素
回车(EnterKey)只能触发SELENDOK而不能触发SELCHANGE事件;
<ComboBox Name="CB_eyeill" Items="A|B" Type="2" OnLoad="sql:select p_name,id from dbo.eyeill" Size="100,300" SelectedIndex="-1">
<OnEditChange>
<if cond="%{CB_eyeill[windowtext]}">
<DbDetails>
<queryFormat>select p_name,id from dbo.eyeill where p_name like '%%{CB_eyeill[windowtext]}%'</queryFormat></DbDetails>
<submit next="CB_eyeill" namelist="DbDetails" method="post"/>
<else/>
<DbDetails><queryFormat>select p_name,id from dbo.eyeill</queryFormat></DbDetails>
<submit next="CB_eyeill" namelist="DbDetails" method="post"/>
</if>
</OnEditChange>
</ComboBox>
<ComboBox Name="Provicelist" SelectedIndex="0" Size="130,100" OnSelChange="(citylist)sql:select city_name,city_code from city where city_province_code=%{Provicelist[province_code]}" OnLoad="sql:select province_name,province_code from province"></ComboBox>
GroupBox类似于html中的div,用于自动排版及集合处理功能的实现、Tab显示等支持,可嵌套,即GroupBox可包含GroupBox,其使用类似于WinTap,子元素为<Ctrls></Ctrls>,所有控件包含于<Ctrls></Ctrls>。GroupBox可不显示,此时Text属性为空(参见布局与排版)。其可具有Tabs显示特性,设置feature=”tab”该GroupBox将显示为一个Tab(部分版本可能还没支持),同一层次的GroupBox将作为同一个Tab组件显示,每个Groupbox为一个Tab。
|
属性名 |
说明 |
|
Text |
非空为正常显示控件,为空时布局控件,不显示 |
|
feature |
Tab,多GroupBox实现Tab显示与切换 |
|
Cols |
布局控制,自动根据桌面大小计算宽度,类似于Booststrap的列控制,eg: cols="xs12 sm6 md4" |
|
multiline |
|
【注:name不应该包含空格之类特殊字符,否则在网页版tab切换中会失败】
Eg:部门管理的GroupBox再包含了个操作GroupBox,可以通过控制GroupBox的可见状态来控制它及其子控件的可见状态
<GroupBox Name="GroupBox1" Text="部门管理" Size="100,100"><Ctrls>
<TextBox Name="dep_name_cn" Size="60,20" ToolTip="中文名"/>
<TextBox Name="dep_name_eng" Size="100,20" ToolTip="英文名"/>
<BR/>
<ListCtrl Name="TpList" PageSize="10" Size="300,150" OnLoad="init" Heading="部门名(中),80;部门名(英),80;城市代码,100;" OnClick="SetSel(provinces[narc],%{province}); SetSel(areas[narc],%{areas}); SetSel(citys[narc],%{zone_id})">
<DbDetails fcsm="1">
<DbTable>bizdep</DbTable>
<Data>dep_name_cn,dep_name_eng,zone_id,floor(zone_id/10000) as province, floor(zone_id/100) as areas,dep_id</Data>
<Queryformat>select %{data} from %{dbtable} %{where} limit %{StartRow},%{PgSize}</Queryformat>
</DbDetails>
</ListCtrl>
<TAB/><GroupBox Name="tpop" Text="操作" Size="100,100"><Ctrls>
<Button Name="search" Text="刷新" Size="100,24">
<OnClick><DbDetails><Where/></DbDetails><submit next="TpList" namelist="DbDetails"/></OnClick>
</Button><BR/>
<Button Name="PrePage" Text="上一页" Size="50,24" OnClick="(TpList)GetPage(Pre)"/>
<Button Name="NextPage" Text="下一页" Size="50,24" OnClick="(TpList)GetPage(Next)"/>
</Ctrls></GroupBox>
</Ctrls></GroupBox>
其size为其初始大小,当其内部空间所占用空间超过该区域时其自动调整为能包含这些控件的区域大小最小值。
另外,其内控件若未明确指定位置(Location),各控件在GroupBox的位置都会自动留有一定的间距。
【说明】由于历史原因,为了兼容,GroupBox的width、height设定值在0至100之间(含100不含0)其大小根据子元素占用自动计算,但若有设定cols属性则按父GroupBox及Cols参数计算。
|
标签名 |
说明 |
|
reset |
复位子控件(含子控件的子控件)至初始化状态 |
|
resetcontent |
清空子控件(含子控件的子控件)数据 |
|
search |
|
|
|
提供打印功能 |
复位分两种,一种是复位数据至初始状态,function属性置为“reset”,GroupBox内的所有控件(含子Groupbox的控件)均复位,初始值的设为初始值,需初始读取数据库的以初始数据库方式读取数据初始化,如:
<submit next="GBDEDITbizdep" function="reset"/>;
另一种只是将数据清空,置空,如
<submit next="GBDEDITbizdep" function="resetcontent"/>。
为了实现高效的搜索功能及简化代码,设计了该集合式搜索方法,通过将search参数传递给某个用于包含搜索条件控件的Groupbox来触发搜索,下面的代码就是将要通过GBDEDITbizdep的控件作为搜索条件按照search定义的搜索规则将查询结果传递给bizdepLst控件。
<search next="bizdepLst" inputed="1" listed="0" prefixwhere="1">
<zone_id op="(" ref="day" enabled="true" />
</search>
<submit next="GBDEDITbizdep" namelist="search" function="search"/>
|
search属性 |
说明 |
可缺省?(缺省值) |
|
next |
接收搜索结果的控件,可以是ListCtrl、TextBox等 |
search[GroupBox prop] |
|
inputed |
是否忽略未输入的控件值,为真时忽略,否则所有控件值均作为搜索条件 |
true |
|
listed |
是否只将search标签内列举的控件作为搜索条件,为真时仅使用列举的控件而忽略Groupbox内其他控件,否则检查Groupbox所有控件。 |
false |
|
prefixwhere |
是否自动添加“where”前缀 |
false |
|
prefixand |
是否自动添加“and”前缀 |
false |
|
|
|
|
search子元素为控件名为tag(eg:控件名为“zone_id”)
|
控件(字段)属性 |
说明(eg:字段zone_id) |
可缺省?(缺省值) |
|
op |
即operator,默认为“=“, |
= |
|
ref |
设定取值参数,如果有设定则取设定参数对应的值,否则若DbDetails.Index有效则取Index,否者取“Text”值 |
Index[DbDetails] |
|
enabled |
是否启用为搜索条件。 |
true |
|
format |
按照format格式生成查询条件 Eg: format="option_header_id=(select option_header_id from option_line where option_line_id=%{opvalue})" |
|
OP取值
|
“OP”取值 |
说明 |
|
|
EQUALS(=) |
= |
|
|
NOT_EQUAL(!) |
!= |
|
|
RANGE_START_INCLUSIVE([) |
>= |
|
|
RANGE_END_INCLUSIVE(]) |
<= |
|
|
RANGE_START_NOT_INCLUSIVE(() |
> |
|
|
RANGE_END_NOT_INCLUSIVE()) |
< |
|
|
submit属性 |
说明 |
可缺省?(缺省值) |
|
next |
GroupBox名 |
|
|
namelist |
将namelist的内容一并提交 |
|
|
function |
“search”指明为GroupSearch |
|
|
|
|
|
打印/列印GroupPrint
BizXML提供了打印/列印支持,打印效果为所见即所得,可以直接将显示的界面及内容直接列印至打印机或PDF之类的输出,可方便实现格式套打或类似于水晶报表的丰富的列印格式,提供该支持的组件/控件是“GroupBox”,直接发送列印指令给GroupBox,如“GBTagPrint”,“GBTagPrint”将自动将其内部的可视组件的内容按相应格式输出至打印机接口,实现打印输出。
<submit next="GBTagPrint" function="print"/>
<printer device="" PaperSize="" Orientation="2" copies=""/><submit next="GBTagPrint" function="print" namelist="printer"/>
第一条语句不带打印机设置,使用的是系统默认打印机及缺省配置参数打印;
第二条语句带有打印机配置参数,这里也提供了两种配置方式,一种是弹出配置窗口选择或输入参数(如device="",声明参数名称但参数值为空,此时系统会自动弹出配置窗口),一种在该配置里直接声明参数及参数值(Orientation="2",系统直接以横向打印方式替代纵向打印)。
这里可供配置的打印参数有"Device", "Copies", "PaperSize", "PaperLength", "PaperWidth", "Duplex", "Orientation", "Color", "DefaultSource", 各参数分别为打印机名称,打印份数,纸张尺寸,纸张长度(自定义纸张大小或可在任意长度的页面上打印的点阵打印机等设备以十分之一毫米为单位),纸张宽度(类似于纸张长度),双面打印模式(是否双面:1单面 / 2双面),打印方向(1纵向 2横向),打印颜色(1单色, 2彩色打印),默认进纸方式(0自动选择, 1是纸匣1,2是纸匣2);
仅对于打印机设备,选择要打印的纸张大小。如果纸张的长度和宽度都由 PaperLength 和 PaperWidth 成员设置,则可以将PaperSize设置为 零 。 否则,可将PaperSize 参数设置为大于或等于 DMPAPER_USER 或打印纸张尺寸表预定义值之一的设备特定值(参见打印纸张尺寸表)。
打印所使用的字体及大小可以使用"font-family"/"font-size"设置,默认"Times New Roman"/"13",GroupBox控件若设定了字体/大小任意一项,将使用该设置值及缺省值,否则使用应用设定的字体/大小值(BXML元素设定值)。(字体大小参见尺寸表)
需要说明的是,由于BizXML内部Size单位使用的的计算机屏幕显示单位,即96DPI(96 dot per inch)。【尺寸转换,100毫米为例,(100/25.4)*96=378(96为屏幕默认显示DPI)】
另外GroupBox本身有10的默认边距(margin)。参数xadjust,yadjust用于调整边距,可正可负,负数相对向左向上偏移对应的单位。
该控件在手机版本、Web不支持。
<IpAddress Name="IpAddress1" Size="200, 20" IP="192.168.0.10"></IpAddress>
<Label Name="lb_CaseSln" Text="解决方案" Size="50,20"/>
属性Align默认为左对齐即Align="left", 可为"right"(右对齐), "center"(居中)
|
属性名 |
说明 |
|
Align |
文字横向对齐方式,取值left、center、right,默认 "left", 可为"right"(右对齐), "center"(居中) |
|
vAlign |
文字纵向对齐方式,取值top、center、bottom,默认center |
显示时将对Label的Text做语言本地化处理,语言本地化处理使用的语言库为 “Language”定义的语言包,为页面“WinTap”或框架“BXML”的子元素。
列表控件也挺常用。
|
属性名 |
说明 |
|
PageSize |
页面长度,指示列表每页显示记录条数,方便sql等语句实现翻页 |
|
AutoSizeCol |
0:不调整列宽度;1:按列表表头字符宽度调整列宽度;2:按列表列数据调整列宽度;3:按列表表头及列表数据宽度自动调整列宽度 |
|
Filtering |
对指定列的数值按配置参数筛选突出显示 |
|
Sum |
指示是否自动对该表进行行/列的汇总,定义为Sum="row,col",目前仅对列有效,值col为1(true)时对列汇总sum,sumcols指明对几列自动汇总,定义为sumcols="0,1,2"(对第0、第1、第2列汇总sum)。 |
|
SumCols |
需要汇总的列,用逗号分隔开 |
|
SwapRowCol |
将列与行交换显示,仅在数据内容只有一行的情况下生效 |
|
OnLoad |
初始化OnLoad指示列表控件载入时执行的操作,例如访问sql语句等 |
|
Operator |
弹出式菜单(PopupMenu,PC右键弹出,移动设备长按弹出,网页点击菜单按钮) |
|
OnClick |
指定点击记录后的操作逻辑,例如SetText(TB_code,%0) 将记录第0列值填入TB_Code(TextBox)中,当存在子元素OnClick时被覆盖 |
|
Heading |
指示列表表头文字参数,例如Heading="记录号,30;主叫,100;被叫,100;开始时间,100;通话时长,100;总时长,100" |
|
loadedclick |
指示列表载入数据后是否自动触发点击第0条记录的操作,如该值为1则执行并按照OnClick指定的方法操作 |
|
DataJoin |
多类数据(MDX)智能拼接显示的格式 |
|
DataJoinKey |
MDX数据关联的主键值,即哪一个字段作为识别同一行数据的标识 |
|
HeaderLines |
表头显示/打印的行数,默认为1 |
|
linesPerRow |
每行数据显示/打印的行数,默认显示打印一行(不换行) |
|
HeaderHeight |
表头显示/打印高度,默认为0,行高由HeaderLines测算取得,如HeaderHeight设为非0则取HeaderHeight 而HeaderLines失效, |
|
RowHeight |
行高显示/打印高度,默认为0,行高由linesPerRow测算取得,如RowHeight设为非0则取RowHeight而linesPerRow失效, |
|
HeaderHeight |
表头显示/打印高度,默认为0,行高由HeaderLines测算取得,如HeaderHeight设为非0则取HeaderHeight 而HeaderLines失效, |
|
colsDisplay |
显示的列数,仅在Heading缺失且DataJoin缺失时有效。默认值-1,显示所有列;值0:显示可见最多列(由字段显示长度*5决定);值大于0显示指定列数 |
|
PrintNoHeader |
打印控制参数,为真不打印表头,默认否,打印表态 |
|
PrintHeaderOnly |
打印控制参数,为真只打印表头,默认否,打印全表 |
|
PrintBorder |
打印控制参数,为真打印边框,默认为真 |
|
PrintVLines |
打印控制参数,为真打印行分割线,默认为真 |
|
PrintHLines |
打印控制参数,为真打印列分割线,默认为真 |
|
printfixheight |
是否按设定高度打印表,限定区域打印,不影响后续控件设定的打印位置,默认为真;若设为否,则打印实际数据后根据实际打印的高度调整后续控件打印位置。 |
|
标签名 |
说明 |
|
DbDetails |
数据源及参数定义, |
|
operator |
弹出式菜单及处理定义 |
|
Editor |
可编辑列的定义 |
|
OnClick |
点击事件定义 |
|
|
|
|
|
|
|
标签名 |
说明 |
|
reset |
复位控件至初始化状态 |
|
resetcontent |
清空控件数据 |
|
initial |
提供初始化查询,即按控件初始化的条件进行查询显示数据 |
|
foreach |
对每行数据执行相同的操作,即数据遍历 |
|
setfilter |
筛选突出显示支持 |
|
removefilter |
筛选突出显示支持 |
|
setsel |
选中指定行 |
|
move |
向上/向下移动指定行 |
|
ExchangeData |
接收其他控件传递的数据 |
|
copy |
复制选中行的指定列columns数据,多列以“,”分隔开,columns为空时复制整行。 |
|
load |
从文件加载数据,支持CSV(含增强CSV)格式。 |
|
datadump |
数据保存至某临时文件 |
|
datareload |
从临时文件加载数据 |
|
savetofile |
保存至文件,即导出数据 |
|
import |
|
|
BizXMLToolInit |
BizTool支持,初始化 |
|
BizXMLTest |
BizTool支持,BizTool预览 |
一般以DbDetails方式定义数据的获取,可以是数据库、目录文件等等。
<ListCtrl Name="UserList" Size="600,200" Heading="headingmsg" OnLoad="onloadmsg" OnClick="onclickmsg">
<DbDetails>dbmsg</DbDetails>
</ListCtrl>。
您可以只显示需要显示的列值,其它的列值将以该字段名为属性名附属于该行(记录),列名或列号都可以用来获取列值,引用方法类似于引用列,如:select x,y,z from d;获取列表值即引用x(第0列)就是0(完整的为%0)或x(完整的为%{x})。外部操作(该ListCtrl之外的控件)引用列表中值时只能引用当前选择的行且访问方式有所区别,须标明控件名,即为%{控件名[列号或列名或字段名]},eg:%{userlist[0]}将返回当前选择项的第0列值。
下列参数值可以通过%{控件名[参变量名]}获取,eg:%{UserList[rowcount]}将获取UserList的当前页的记录数
|
参数名 |
说明 |
|
currentpage |
当前页序号,从0开始 |
|
countsperpage |
当前每页显示记录数 |
|
rowcount |
本页实际记录数(行数) |
内容的清空可通过函数resetcontent来实现,如
<submit next="UserList" method="post" function="resetcontent"/>
也可以对ListCtrl进行选择或赋值操作,如选中ListCtrl“quests”第三行(行号从0开始),
<assign name="quests" expr="3" function="setsel"/>
对quests表的当前选中行参数名“xx”赋值“3”,即表格数据,
<assign name="quests[xx]" expr="3" function="setvalue"/>。
如果ListCtrl数据在类似sql执行返回更新数据items时,通过SetValue所赋值亦将消失。
行内容的遍历通过foreach来实现,eg:对名为“quests”的ListCtrl遍历(依次取每行的id变量)
<foreach><assign name="title" expr="%{quests[id]};-"/></foreach><Submit next="quests" namelist="foreach" function="foreach"/>
OnClick指定点击记录后的操作,例如SetText(TB_code,%0) 将记录第0列值填入TB_Code(TextBox)中;
定义的SQL参数也可以以子元素的方式呈现如<DbDetails>dbmsg</DbDetails>(参见数据库访问),此时若需要初始化执行SQL载入数据只需设置属性OnLoad="init",若OnLoad置为其他值则执行其值内容;
ListCtrl的数据常常需要保存至文件或更新至数据库,可用如下操作更新数据库,当属性selected为1时操作仅对被选择的行,否则对表中所有显示的行:
<import button="export" selected="1">sql:update s_order set o_state=3 where o_id=%0;update s_order set o_state=3 where o_id=%0</import><submit next="OrderList" namelist="import" method="post" function="import"/>
保存至文件用下面语法,格式为CSV,当属性selected为1时操作仅对被选择的行,否则对表中所有显示的行。
<Save selected="1"></Save><submit next="OrderList" namelist="Save" method="post" function="savetofile"/>
复制某些列的内容例句如下,columns指定要复制的列,若为多列则以’,’分隔,复制的数据以’\t’分隔,columns为空时则复制整行。
<Copy columns="item_number,item_id_m"/><submit namelist="Copy" function="Copy"/>
ListCtrl最常用来做的工作是数据统计与显示,3UCS提供了多维数据矩阵MDX功能来方便开发人员使用简单的SQL语句实现复杂的数据汇总统计分析及灵活设置字段显示顺序、拼接、组合等。MDX目前支持数据值为数字或字符串,用datatype明示,例如datatype="string"表明MDX将数据视作string来处理,缺省用作数字来处理。MDX申明格式为<MDX places="1" datatype="string">x,y,z</MDX>,x、y、z分别为三个维度的字段名,MDX将获取的数据在内部重新整理为下面的矩阵格式用于显示:
key y0 y1 y2 y3
x0 z z z z
x1 z z z z
为了更好的说明及演示MDX的效果,我们在demo目录建立了一个mdx.db的sqlite数据库,里面有数据表item、item_property、item_properties、item_sale。下面有两个ListCtrl,区别在于第二个使用了MDX配置项,可以分别复制到BizTool里预览看下效果不同在哪:
<ListCtrl Name="item_vLst" Size="700,450" OnLoad="init" Heading="" >
<DbDetails>
<SubDriver>SQLite</SubDriver>
<Database>layout\demo\mdx.db</Database>
<DbTable>item_sale s left join item i on i.item_id_m=s.item_id_m</DbTable>
<Data>item_number,user,amount</Data>
</DbDetails>
</ListCtrl>

将未使用MDX的代码复制到“BizXML Editor”预览显示的是下面数据:

<ListCtrl Name="item_vLst" Size="700,450" OnLoad="init" DataJoin="%{this}" Heading="" >
<DbDetails>
<SubDriver>SQLite</SubDriver>
<Database>layout\demo\mdx.db</Database>
<DbTable>item_sale s left join item i on i.item_id_m=s.item_id_m</DbTable>
<Data>item_number,user,amount</Data>
<MDX>item_number,user,amount</MDX>
</DbDetails>
</ListCtrl>
将使用了MDX的代码复制预览显示的下面的数据:

仔细对比下显示的结果的区别,MDX不正是我们想要的数据统计的结果么?而要获得这个的结果用传统方式需要复杂的存储过程或编程实现,但在MDX的里只需简单增加“<MDX>item_number,user,amount</MDX>”及“DataJoin="%{this}"”即可。
MDX不仅可以用于数字类汇总分析,还可以用于文本类的分析。下面的代码处理的是文字类的,故datatype值设为string:
<ListCtrl Name="item_vLst" Size="700,450" OnLoad="init" DataJoin="%{this}" Heading="" >
<DbDetails>
<SubDriver>SQLite</SubDriver>
<Database>layout\demo\mdx.db</Database>
<DbTable>item_properties i left join item_property i0 on i.property_id=i0.property_id</DbTable>
<Data>item_id_m,i0.prop_display_name propname,i.property_value propvalue</Data>
<MDX datatype="string">item_id_m,propname,propvalue</MDX>
</DbDetails>
</ListCtrl>
是否使用MDX结果也有明显的区别如下,左边未使用MDX,右边使用MDX:
|
item_id_m |
propname |
propvalue |
|
1 |
color |
red |
|
1 |
cpu |
868 |
|
2 |
color |
pink |
|
2 |
cpu |
870 |
有使用MDX
|
item_id_m |
color |
cpu |
|
1 |
red |
868 |
|
2 |
pink |
870 |
MDX既可以单独使用,亦可以组合使用,ListCtrl拥有一个主数据源,用“DbDetails”申明(this代表ListCtrl主数据,即<ListCtrl ……><DbDetails></DbDetails>……</ListCtrl>定义的数据,),同时可以有多个带有“ID”标识的“MDX”,它们的数据通过“DataJoin”配置拼接, “DataJoinKey”用来指明各个结果数据关联的字段名,下面代码简单演示了主数据(this)与MDX(id为prop)的数据拼接:
<ListCtrl Name="item_vLst" ToolTip="ttp_item_v" Size="700,450" OnLoad="init" DataJoin="%{this}%{prop}" DataJoinKey="item_id_m" Heading="" loadedclick="0">
<DbDetails >
<SubDriver>SQLite</SubDriver>
<Database>layout\demo\mdx.db</Database>
<DbTable>item i</DbTable>
<Data>i.item_id_m,item_number</Data>
<Order>item_id_m </Order>
</DbDetails>
<MDX id="prop" datatype="string">
<DbDetails>
<SubDriver>SQLite</SubDriver>
<Database>layout\demo\mdx.db</Database>
<DbTable>item_properties i left join item_property i0 on i.property_id=i0.property_id</DbTable>
<Data>item_id_m,i0.prop_display_name propname,i.property_value propvalue</Data>
<MDX>item_id_m,propname,propvalue</MDX>
</DbDetails>
</MDX>
</ListCtrl>
预览的数据显示为:
|
item_id_m |
料号 |
color |
cpu |
|
1 |
UCIN_M_0 |
red |
868 |
|
2 |
UCIN_M_1 |
pink |
870 |
MDX申明里的“y”维度的数据也可以不完全显示,可以用“()”来申明,“|”进行分隔,如“y(a|b|c)”告诉MDX只显示a、b、c字段并且显示的顺序也是a、b、c,比如上面的声明“propname(color)”将只显示color列,而cpu列数据将不显示,下面实例也有多个MDX用到这个。
但可能也需要用MDX进行拼接传统方式查询的数据,此时我们只需申明关联字段即可,即<MDX>座席号,,</MDX>,下面实例中ID为saleinfo的MDX就是这么用的。
下面这段代码完整呈现了复杂数据多表多查询一体化展示,[实际项目中的代码,因demo中无相关数据,无法展示]
<ListCtrl Name="meidaAnalysisLst" Visible="true" Enabled="true" DataJoin="%{this}[%{this[Total(座席号)]} as 总数]%{media}[%{media[Total(座席号)]} as 总数]%{consulting}[%{consulting[Total(座席号)]} as 总数]%{ordertype}[%{ordertype[Total(座席号)]} as 总数]%{saleinfo}" DataJoinKey="seatsno" Size="600,500">
<MDX id="media" remark="媒体分析">
<DbDetails>
<Table>s_history as s inner join s_meiti as m on s.h_mt=m.m_id</Table>
<Index> </Index>
<MDX>座席号,m_desc(中国之声|网络推广|北京新闻广播05:45-6:00|北京城市广播15:08-15:23|各地方广播媒体|天津经济台|平面报纸广告|老用户订购|呼出|电视广告|外地电视广告|文艺之声|北京故事台|媒体不祥|其他),cnts</MDX>
<Data>s.seatsno as 座席号,m.m_desc, count(*) as cnts</Data>
<Order></Order>
<Where>year(h_dt)='%{YearMon[year]}' and month(h_dt)='%{YearMon[month]}' and day(h_dt)='%{YearMon[day]}' and h_mt!=21</Where>
<queryFormat>select %{data} from %{dbtable} where %{where} group by seatsno,m_desc</queryFormat>
</DbDetails>
</MDX>
<MDX id="consulting" remark="内容分类">
<DbDetails>
<Table>s_history as s inner join s_zx_concent as z on s.z_id =z.id</Table>
<Index> </Index>
<MDX>座席号,z_desc(咨询活动|咨询眼病|售后问题|其它) ,cnts</MDX>
<Data>s.seatsno as 座席号,z.z_desc, count(*) as cnts</Data>
<Order></Order>
<Where>year(h_dt)='%{YearMon[year]}' and month(h_dt)='%{YearMon[month]}' and day(h_dt)='%{YearMon[day]}' and h_mt!=21</Where>
<queryFormat>select %{data} from %{dbtable} where %{where} group by seatsno,z_desc </queryFormat>
</DbDetails>
</MDX>
<MDX id="ordertype" remark="订购新老">
<DbDetails>
<Table>s_history as s inner join call_ordertype as c on s.callOrderType =c.id</Table>
<Index> </Index>
<MDX>座席号,info_type(老订|新订|他人续单|新未购|重复未购|售后未购),cnts</MDX>
<Data>s.seatsno as 座席号,c.info_type, count(*) as cnts</Data>
<Order></Order>
<Where>year(h_dt)='%{YearMon[year]}' and month(h_dt)='%{YearMon[month]}' and day(h_dt)='%{YearMon[day]}' and h_mt!=21</Where>
<queryFormat>select %{data} from %{dbtable} where %{where} group by seatsno,info_type</queryFormat>
</DbDetails>
</MDX>
<MDX id="saleinfo" datatype="string">
<DbDetails>
<Table>s_order as s inner join s_order_detail as d on s.o_id=d.o_id inner join s_product as p on d.p_id=p.p_id</Table>
<Index>o_id</Index>
<MDX>座席号,,</MDX>
<Data>o_jobno as 座席号,sum(case when p_name=14 and num between 4 and 7 then 1 else 0 end) as '4~7',sum(case when p_name=14 and num between 8 and 11 then 1 else 0 end) as '8~11',sum(case when p_name=14 and num between 12 and 15 then 1 else 0 end) as '12~15',sum(case when p_name=14 and num between 16 and 19 then 1 else 0 end) as '16~19',sum(case when p_name=14 and num>=20 then 1 else 0 end) as '20以上',sum(case when p_name=23 and num between 1 and 3 then 1 else 0 end) as '蓝莓1~3',sum(case when p_name=23 and num between 4 and 6 then 1 else 0 end) as '蓝莓4~6',sum(case when p_name=23 and num >=7 then 1 else 0 end) as '蓝莓7盒以上'</Data>
<Order>s_order.o_id desc</Order>
<Where>year(o_dt)='%{YearMon[year]}' and month(o_dt)='%{YearMon[month]}' and day(o_dt)='%{YearMon[day]}'</Where>
<queryFormat>select %{data} from (select s.o_jobno,p.p_name,d.p_num as num from %{dbtable} where %{where}) as b group by o_jobno</queryFormat>
</DbDetails>
</MDX>
<DbDetails remark="进线分类">
<Host></Host>
<Database></Database>
<SubDriver></SubDriver>
<User></User>
<Password></Password>
<Table>s_history as s inner join in_calltype as c on s.newcustomer=c.id</Table>
<Index> </Index>
<MDX>座席号,typedesc(新|老|拜访来电|断线|重复进线),cnts</MDX>
<Data>s.seatsno as 座席号,c.typedesc, count(*) as cnts</Data>
<Order></Order>
<Where>year(h_dt)='%{YearMon[year]}' and month(h_dt)='%{YearMon[month]}' and day(h_dt)='%{YearMon[day]}' and h_mt!=21</Where>
<queryFormat>select %{data} from %{dbtable} where %{where} group by seatsno,typedesc</queryFormat>
</DbDetails>
</ListCtrl>
数据统计结果显示如下:
|
座席号 |
新 |
老 |
拜访来电 |
断线 |
重复进线 |
总数 |
中国之声 |
网络推广 |
北京新闻广播05:45-6:00 |
北京城市广播15:08-15:23 |
各地方广播媒体 |
天津经济台 |
平面报纸广告 |
老用户订购 |
呼出 |
电视广告 |
外地电视广告 |
文艺之声 |
北京故事台 |
媒体不祥 |
其他 |
总数 |
咨询活动 |
咨询眼病 |
售后问题 |
其它 |
总数 |
老订 |
新订 |
他人续单 |
新未购 |
重复未购 |
售后未购 |
总数 |
4~7 |
8~11 |
12~15 |
16~19 |
20以上 |
蓝莓1~3 |
蓝莓4~6 |
蓝莓7盒以上 |
|
124 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
125 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
表格显示的数据是按规定格式拼接组合:
DataJoin="%{this}[%{this[Total(座席号)]} as 总数]%{media}[%{media[Total(座席号)]} as 总数]%{consulting}[%{consulting[Total(座席号)]} as 总数]%{ordertype}[%{ordertype[Total(座席号)]} as 总数]%{saleinfo}"
this代表ListCtrl主数据,即<DbDetails remark="进线分类"></DbDetails>定义的数据,其他的入media、consulting、ordertype、saleinfo都是类似于<MDX id="media" remark="媒体分析" datatype="string" places="2">;(datatype 数据类型可为数字/文字,缺省为数字,places为小数点位数,在数据类型为数字时有效,缺省为0)
而<MDX>座席号,m_desc(中国之声|网络推广|北京新闻广播05:45-6:00|北京城市广播15:08-15:23|各地方广播媒体|天津经济台|平面报纸广告|老用户订购|呼出|电视广告|外地电视广告|文艺之声|北京故事台|媒体不祥|其他),cnts</MDX>坐席号是关联各个MDX拼接的关键字,这样各个统计的结果如124座席的数据全部显示在124行中,m_desc是各列的名称,后面括号及其内的值定义了统计显示的列,若该列无数据当数字类型为整形时填0为字符串时填空,如括号及内容省略将显示有数据的列;
DataJoin="%{this(wo_number,item_number,queue_quantity,running_quantity,completed_quantity,routing_sequence,routing_seq_num,standard_operation)}%{prop}":主数据(this)仅显示wo_number,item_number,queue_quantity,running_quantity,completed_quantity,routing_sequence,routing_seq_num,standard_operation字段,其他隐藏。
ListCtrl也提供了动态字段的支持,从数据库读取或生成字段名,然后生成列表数据。下面实例中自动根据系统时间显示本周的房型及价格明晰,系统先“<Data Dynamic="true">”配置的语句读取日期序列,然后根据日期序列按照<DataFormat>格式生成主数据实际要查询的字段序列,其中<DataFormat> 中的“'%{dt}'”是日期序列中的某个日期 [实际项目中的代码,因demo中无相关数据,无法展示]:
<ListCtrl Name="rmPrDtl" Visible="true" Enabled="true" Size="720,90" Remark="Price Detail list" autosizecol="1">
<DbDetails>
<Data>
<Data Dynamic="true">sql:select FROM_UNIXTIME(dt,'%Y-%m-%d') as dt from ctu_roomrates where hotel_id=%{hostels.TB_code} and dt >= UNIX_TIMESTAMP('%{DtStart}') and dt < UNIX_TIMESTAMP('%{DtEnd}') group by dt;</Data>
<DataFormat>max(getRoomPrice(roomtp_id,'%{dt}')) as '%{dt}'</DataFormat>
</Data>
<Table>ctu_roomrates</Table>
<Order></Order>
<Where>where hotel_id=%{hostels.TB_code} and dt >= UNIX_TIMESTAMP('%{DtStart}') and dt < UNIX_TIMESTAMP('%{DtEnd}')</Where>
<queryFormat>select distinct(roomtp_id) as 序号,max(roomtp_name) as 房型,%{data} from %{dbtable} %{where} group by roomtp_id</queryFormat>
</DbDetails>
</ListCtrl>
输出的列表显示如下:
|
序号 |
房型 |
2013/10/28 |
2013/10/29 |
2013/10/30 |
2013/10/31 |
2013/11/1 |
2013/11/2 |
2013/11/3 |
|
1 |
温馨标准间 |
260 |
260 |
260 |
260 |
260 |
260 |
260 |
|
2 |
精致大床房 |
238 |
238 |
238 |
238 |
238 |
238 |
238 |
|
3 |
精装修高低床 |
60 |
60 |
60 |
60 |
60 |
60 |
60 |
|
4 |
实惠四人间 |
50 |
50 |
50 |
50 |
50 |
50 |
50 |
|
5 |
普通高低床 |
40 |
40 |
40 |
40 |
40 |
40 |
40 |
<operator refresh="1" firstpage="1" prepage="1" nextpage="1">
<EvalTbl rules="" table="mrp_planordermenu">
<rules><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="rule/mrp_planordermenu.xml"/></rules>
<inputs order_type="%{vPlannedOrderLst[order_type]}" orgtype="%{orgtp}"/>
<outputs menus="text" disabled="disabled"/></EvalTbl>
<op text="requisition" mustselected="false" needconfirm="0">
<DbDetails><Where>order_type='prq'</Where></DbDetails><submit namelist="DbDetails"/></op>
</operator>
|
operator属性名 |
说明 |
|
refresh |
是否有refresh菜单项,缺省无;icon值为icon_refresh |
|
initial |
是否有initial菜单项,缺省无,另外当refresh值非空initial未设置且Listctrl属性onload="init"时有initial菜单项;icon值为icon_initial |
|
firstpage |
是否有firstpage菜单项,缺省无;icon值为icon_firstpage |
|
prepage |
是否有prepage菜单项,缺省无;icon值为icon_prepage |
|
nextpage |
是否有nextpage菜单项,缺省无;icon值为icon_nextpage |
|
op属性名 |
说明 |
|
text |
菜单显示的文字,支持语言本地化处理 |
|
mustselected |
是否必须选中列表项才有效,该值决定该菜单在列表项无选择时是否显示,缺省为必须选中 |
|
Icon |
菜单项icon图标,默认为"icon_"+text支持语言本地化处理 |
|
Checked |
菜单项是否Checkable,定义该属性即表明该菜单项可Checkable,该属性值为该菜单项的初始check状态 |
|
needconfirm |
点击后是否需要弹出确认窗口进行操作确认,可选值“1”“true”表示需要,“0”“false”表示不需要,缺省为“false否(不需要)” |
|
Confirmmsg |
点击确认操作的提示信息 |
<Operator>与<op>均可以使用rule即< EvalTbl>按设定规则执行显示隐藏或条件执行等,可对菜单做EvalTbl也可对菜单项做EvalTbl,均为各自的子元素。
菜单EvalTbl处理:输出项(outputs属性值)可以是属性text及disabled;text为各菜单项的text值,用";"分隔开;“disabled”值决定菜单工作与列表显示模式(disabled为真时将显示text罗列出的菜单项,而其他项将隐藏;为否时反之即列表隐藏模式)
菜单项EvalTbl处理:输出项(outputs属性值)可以是属性text、disabled及handler(等同于op子元素);。
对指定列的数值按配置参数进行筛选突出显示,配置参数定义为filtering="column, upper, lower, dir, color, customtxt",其含义依次为突出显示列编号(列号起始于0)、列项值的上限值、下限值、突出显示限值区间内(false)还是外(true)、突出显示的颜色、显示的特别字符。
例如filtering="7,预定,预定,0",突出显示第7列列项值在“预定”与“预定”内的,而filtering="0, 5,20,1"将突出显示项值大于20或小于5的,下例中有配置了3个filter,以”;”分隔开,第一个对列3项值为“新任务”的文字设为红色显示,第二个对列3项值为“进行中”的文字绿色显示,第三个对列8项值为“1”的文字替换为 红色“●”显示。
<ListCtrl Name="vtiger_projecttask_vLst" ToolTip="ttp_vtiger_projecttask" Size="700,420" loadedclick="0" onload="init" colsDisplay="10" filtering="3,新任务,新任务,1,#ff0000;3,进行中,进行中,1,#00ff00;8,1,1,1,#ff0000,●">…</ListCtrl>
亦可动态设置Filter或移除,如下操作分别设置或移除filter。
<assign name="UserList" expr="0,6,7000,0" function="SetFilter"/>;
<assign name="UserList" expr="0" function="RemoveFilter"/>
<TextBox Name="TB_CaseDesc" Size="500,20" Text=""/>
<TextBox Name="taginfo" Size="300,100" Text="" ToolTip="提取参数">
<text><item name="airvalue" tag="div[class=carousel-inner] div div div" parentdata="0" index="0" attr="" ></item></text>
</TextBox>
TextBox提供文字的输入修改等,特有属性有:
|
属性名 |
说明 |
|
Text |
初始化时显示的文字,<text></text>具有相同功用 |
|
MultiLine |
指示控件文字是否允许多行;当该参数缺省时系统根据字体大小及控件高度(Height)来自动判断单行显示或多行显示 |
|
Readonly |
只读模式,默认为false,即可读写 |
|
Password |
指示该控件为Password样式,为真时不真实显示字符而是以“*”代替 |
|
Number |
指示该控件是否为仅接受数字输入,为真时只能输入数字 |
|
LimitText |
允许控件输入的最多字符数,默认无限制 |
|
EscapeString |
<BR/> 保存时将回车符用<BR/>替换,显示时显示回车(目前系统不允许回车键,默认自动替换为空字符,显示空字符) |
|
EscapeStringTab |
"<TAB/>保存时将tab格式符用<TB>替换,显示时显示tab格式符(系统不允许tab格式符,默认替换为<TAB/>,显示<TAB/>) |
|
OnLoad |
(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可 |
|
TextType |
Digit数字格式,将TextBox文字作为数字处理 |
|
EnChangeDelay |
延时设定的毫秒数触发输入改变事件,默认不延时 |
|
barcode |
控件内建扫描二维码功能及按钮,该值大于0时带有相机设备有效,主要是手机上。 |
|
Align |
文字横向对齐方式,取值left、center、right,默认 "left", 可为"right"(右对齐), "center"(居中) |
|
vAlign |
文字纵向对齐方式,取值top、center、bottom,默认center |
通过Sql语句加载给控件的数据首字段将被显示,其它字段的内容将作为属性附属于各项值,可以通过属性方法来获取,如CB_eyeill控件select p_name,id from dbo.eyeill将把p_name字段的值显示在下拉框CB_eyeill中,而引用选中的项的值可以是CB_eyeill[p_name]和CB_eyeill[id]。
下列参数可以通过%{控件名[参变量名]}获取,eg:%{UserList[rowcount]}将获取UserList的当前页的记录数
|
参数名 |
说明 |
|
Length |
当前显示的文字的长度 |
|
letter |
控件当前显示文字的汉语拼音(全部小写) |
|
letteru |
控件当前显示文字的汉语拼音(全部大写) |
|
letters |
控件当前显示文字的汉语拼音(只返回小写首字母) |
|
lettersu |
控件当前显示文字的汉语拼音(只返回大写首字母) |
|
letterfu |
控件当前显示文字的汉语拼音(首字母大写) |
|
letterd |
控件当前显示文字的汉语拼音(全部小写+分隔符) |
可以接受处理的事件有:
CHANGE(内容修改、更新)<OnEnChange> </OnEnChange>,
ENTER_KEY(回车)<OnEnterKey></OnEnterKey>。
|
事件名 |
标签名 |
说明 |
|
EditChange |
OnEnChange |
编辑窗口输入内容发生改变(选择改变不触发该事件) |
|
ENTER_KEY |
OnEnterKey |
回车 |
可以接受数据库返回的数据,通过事件触发,如点击Button执行SQL返回值(首行)给TextBox,TextBox显示首列值,其他的值作为变量保存并有效于TextBox未修改期内,一旦修改则消失。
<TextBox Name="TB_CaseDesc" Size="500,20" Text=""/>
<TextBox Name="tb_totalrecs" Enabled="false" ReadOnly="false" Size="40,20" Text="">
<DbDetails>
<DbTable>*</DbTable>
<Index>h_id </Index>
<Data> </Data>
<Order></Order>
<Where></Where>
<queryFormat></queryFormat>
</DbDetails>
</TextBox>
在可以触发事件的地方发送给tb_totalrecs即可,也可以将上面的DbDetails直接包含在事件内就行:
<DbDetails/><submit next="tb_totalrecs" namelist="DbDetails" method="post"/>
可以使用assign赋值给textbox,例如<assign name="ctrltext" expr="2" function=""/>
function可以接受的是Assign(SetText、SetValue)、AddText,默认为assign;
AddText将expr的值追加至textbox的现有值末尾。若赋值给textbox附属变量则指明即可,如<assign name="ctrltext[id]" expr="2" function=""/>便将2赋值给ctrltext的附属变量id了。
|
标签名 |
说明 |
|
reset |
复位控件至初始化状态 |
|
resetcontent |
清空控件数据 |
|
initial |
初始化控件,同reset |
<DateTime Name="DateTimeStart" Format="yyyy-MM-dd" Size="100,20" Text="2 weeks "/>
DateTime提供日期时间的输入修改等,可以是单一时间,也可以是时间段(时间区间)特有属性有:
|
属性名 |
说明 |
|
text |
初始设置时间值或时间区间的起始时间值,缺省为控件首次显示时的时间 |
|
text2 |
时间区间的结束时间,当该值不为空时控件为时间段,即有两个日期时间值 |
|
format |
日期时间显示格式,获取的日期时间值也是使用该格式,缺省为"yyyy-MM-dd" |
可访问的独有参数有:year、month、day、hour、minute、second、week分别为控件当前值的年、月、日、小时、分、秒、 一周的第几天[1,7];firstDayOfWeek、firstDayOfMonth、firstDayOfYear、lastDayOfWeek、lastDayOfMonth、lastDayOfYear分别为该控件当前值所属期间的该星期的第一天、该月的第一天、该年的第一天、该星期的最后一天、该月的最后一天、该年的最后一天,时间格式为该控件的format值;curdatetime当前时间,时间格式为该控件的format值,curdatetimeutc为当前时间的utc数值。
例如:%{DateTimeStart[year]}
|
参数名 |
说明 |
|
datetime |
返回控件的日期时间值,以format设定的格式呈现 |
|
datetime2 |
当控件为时间区间模式时返回结束的时间值,以format设定的格式呈现 |
|
year |
控件当前值的年 |
|
month |
控件当前值的月 |
|
day |
控件当前值的日 |
|
hour |
控件当前值的小时 |
|
minute |
控件当前值的分 |
|
second |
控件当前值的秒 |
|
week |
控件当前值的一周的第几天[1,7] |
|
firstDayOfWeek |
控件当前值所属期间的该星期的第一天 |
|
firstDayOfMonth |
控件当前值所属期间的该月的第一天 |
|
firstDayOfYear |
控件当前值所属期间的该年的第一天 |
|
lastDayOfWeek |
控件当前值所属期间的该星期的最后一天 |
|
lastDayOfMonth |
控件当前值所属期间的该月的最后一天 |
|
lastDayOfYear |
控件当前值所属期间的该年的最后一天 |
|
curdatetime |
当前时间(系统时间而非控件时间),时间格式为该控件的format值 |
|
curdatetimeutc |
当前时间(系统时间而非控件时间)的utc数值 |
d 一位数或两位数的天数。
dd 两位数的天数。 一位数天数的前面加一个零。
ddd 三个字符的星期几缩写。
dddd 完整的星期几名称。
h 12 小时格式的一位数或两位数小时数。
hh 12 小时格式的两位数小时数。 一位数数值前面加一个 0。
H 24 小时格式的一位数或两位数小时数。
HH 24 小时格式的两位数小时数。 一位数数值前面加一个 0。
m 一位数或两位数分钟值。
mm 两位数分钟值。 一位数数值前面加一个 0。
M 一位数或两位数月份值。
MM 两位数月份值。 一位数数值前面加一个 0。
MMM 三个字符的月份缩写。
MMMM 完整的月份名。
s 一位数或两位数秒数。
ss 两位数秒数。 一位数数值前面加一个 0。
t 单字母 A.M./P.M. 缩写(A.M. 被显示为 "A")。
tt 双字母 A.M./P.M. 缩写(A.M. 被显示为 "AM")。
y 一位数的年份(2001 显示为“1”)。
yy 年份的最后两位数(2001 显示为“01”)。
yyyy 完整的年份(2001 显示为“2001”)。
Text属性可以为空,默认值为页面初始化控件时的时间,其值可以类似下述表示:
"5-03-1999 12:34:56"
"15-06-01 12:34:56 PST"
"5-06-02 12:34:56"
"5-23-1999 12:34am"
"5-23-00 12:34am"
"1999-23-04 12:34:56"
"5/03/1999 12:34:56"
"15/06/1999 12:34:56"
"15/06/01 12:34:56 PST"
"5/06/02 12:34:56"
"5/23/1999 12:34am"
"5/23/00 12:34am"
"1999/23/04 12:34:56"
"Mar 3, 1999 12:34pm"
"3 Jul 2004 12:34pm"
"12:34:56 5 December 1999"
"10 minutes ago"——比当前时间早10分钟
"2 weeks"——从现在时间向后推2个星期;。
SetValue(DateTimeStart,"2012-01-01 11:11");
<assign name="DateTimeStart" expr="2012-01-01 11:11"/>。
赋值支持的值格式参见本控件的Format属性值,
另外提供了“相对时间”的支持,eg:“1999-23-04 12:34:56;10:0;0;0”,“;”后面的表示相对于前面的时间偏移的时间值,此示例表示设定值相对于1999-23-04 12:34:56向后推迟10天,“%{createdt};10:0:0”的设定值相对于createdt的时间值向后推延10小时[10:0:0这种表述方式最大支持为天,最小为秒]。
该控件可接受处理的事件为OnChanged,处理逻辑为子元素OnChanged。
eg: <OnChanged><assign name="modified" expr="%{created};100:0:0:0"/></OnChanged>
<WebBrowser Name="WebBrowser1" Size="600,300" Url="http://www.3ucs.com"/>
<WebBrowser Name="chat" Size="700,600" Url="http://%{serverip}/bb/index.php"/>
webview打开页面<assign name="webview" expr="http://3ucs.com"/>
webview页面加载完毕后触发OnChanged事件
输入参数设置
|
属性名 |
说明 |
|
Url |
Web url address |
|
Userid |
用于访问的userid |
|
Password |
用于访问web的相对应的password |
|
Namelist |
要提交的参数 |
|
Urlencoded |
Urlencoded模式 |
下列参数可以通过%{控件名[参变量名]}获取,eg:%{WebBrowser1[rowcount]}将获取UserList的当前页的记录数
|
参数名 |
说明 |
|
sourcecode |
页面源代码 |
|
LocationUrl |
页面URL,eg: |
|
LocationName |
页面the name of the resource,页面标题,eg:三优通信 |
|
FullName |
要提交的参数 |
|
ReadyState |
页面加载状态 0 (READYSTATE_UNINITIALIZED Default initialization state.) 1 (READYSTATE_LOADING Object is currently loading its properties.) 2 (READYSTATE_LOADED Object has been initialized.) 3 (READYSTATE_INTERACTIVE Object is interactive, but not all of its data is available.) 4 (READYSTATE_COMPLETE Object has received all of its data.) |
|
HTTPStatusCode |
HTTP_STATUS_BAD_REQUEST (400) HTTP_STATUS_DENIED (401) HTTP_STATUS_PAYMENT_REQ (402) HTTP_STATUS_FORBIDDEN (403) HTTP_STATUS_NOT_FOUND (404) HTTP_STATUS_BAD_METHOD (405) HTTP_STATUS_NONE_ACCEPTABLE (406) HTTP_STATUS_PROXY_AUTH_REQ (407) HTTP_STATUS_REQUEST_TIMEOUT (408) HTTP_STATUS_CONFLICT (409) HTTP_STATUS_GONE (410) HTTP_STATUS_LENGTH_REQUIRED (411) HTTP_STATUS_PRECOND_FAILED (412) HTTP_STATUS_REQUEST_TOO_LARGE (413) HTTP_STATUS_URI_TOO_LONG (414) HTTP_STATUS_UNSUPPORTED_MEDIA (415) HTTP_STATUS_RETRY_WITH (449) HTTP_STATUS_SERVER_ERROR (500) HTTP_STATUS_NOT_SUPPORTED (501) HTTP_STATUS_BAD_GATEWAY (502) HTTP_STATUS_SERVICE_UNAVAIL (503) HTTP_STATUS_GATEWAY_TIMEOUT (504) HTTP_STATUS_VERSION_NOT_SUP (505) |
|
<item |
详见HTML页面内容的操作与处理(及触发click事件) |
HTML页面内容的操作与处理(及触发click事件):
<Label Name="Label2" Size="100,20" Text="12. WebBrowser"/>
<TextBox Name="URLADDR" Size="400,20" Text="http://localhost"/>
<Button Name="URLNAV" Text="打开" Size="50,20" OnClick="(WebBrowser1)%{URLADDR}"/>
<Button Name="retrieve" Size="30,20" Text="提取">
<OnClick>
<assign name="TextBox1" expr="%{WebBrowser1[p]}"><p>%{taginfo}</p></assign>
</OnClick></Button>
<Button Name="changeval" Size="30,20" Text="赋值">
<OnClick>
<assign name="WebBrowser1[p]" expr="%{TextBox1}"><p>%{taginfo}</p></assign>
</OnClick></Button>
<TAB/><BR/>
<TextBox Name="taginfo" Size="300,100" Text="" ToolTip="提取参数">
<text><item name="airvalue" tag="div[class=carousel-inner] div div div" parentdata="0" index="0" attr="" ></item></text>
</TextBox>
<TextBox Name="TextBox1" Size="500,100" Text="网页内容或提取的内容" ToolTip="网页内容或提取的内容"/>
<BR AutoHeight="1"/><WebBrowser Name="WebBrowser1" Size="500,400">
<OnChanged><assign name="TextBox1" expr="%{WebBrowser1}"/></OnChanged>
</WebBrowser>
Button“Retrieve”、“changeval”分别对网页中的元素值提取出来或赋值(当赋的值为“_click_”系统的行为自动转换为对该元素触发click事件),上述示例中元素的锚点通过taginfo来设置,而示例中的taginfo中tag="div[class=carousel-inner] div div div"表明该元素的是div,其上一级也是div,上上一级也是div,上上上一级是div且class为carousel-inner,如我们取值或赋值是当前该元素,补充的参数parentdata="0",否则改为1;若我们取值赋值为html内容,则补充参数HTML="1",默认为0,纯文本; frame参数用于页面有多个frame时指定要提取的frame序号。
|
tag |
网页元素的锚点,eg:tag="div[class=carousel-inner] div div div" tag="div[class=morinfo] div[class=mt1]" tag="div[class=message] p b" tag="div[class=message] p strong" tag="SELECT[name=view] Option[15]" tag="div h1" tag="div[class=dbx-content] div a" |
|
attr |
提取元素的内容类别,eg:attr="href",取href值,默认为空,提取文本Text, |
|
HTML |
指明提取的内容为HTML而非文本Text,在attr为空时有效 |
|
parentdata |
指明要提取的元素是本元素还是父元素,默认为0,本元素 |
|
index |
指明要提取的元素的序号,多个网页元素锚点相同时可通过该方式指明,默认为0 |
|
frame |
用于页面有多个frame时指定要提取的frame序号 |
<item tag="BODY DIV[class=list-mid] DIV[class=lm-con] DIV[id=main-content-list] DIV[class=post-list] UL LI[class=payed] UL LI[class=post clf] DIV[class=post-main] DIV[class=detail] DIV[class=post-title-wrap] H2[class=post-title ellipsis] A[class=text-highlight]" index="3" attr="href" name="airvalue" parentdata="0"/>
<item tag="TABLE TBODY TR" name="airvalue" parentdata="0" index="13"><item tag="td" parentdata="0"/></item>
<RadioButton Name="RadioButton1" Size="120,20" Text="Radio Option 1" Checked="false"/>
该控件可接受处理OnChecked事件,同一组控件只需设置单个控件的OnChecked事件处理即可。
|
属性名 |
说明 |
|
Checked |
初始化时是否checked |
|
RadioManager |
Radiobutton组的主Radiobutton |
RadioButton控件子元素
|
标签名 |
说明 |
|
OnChecked |
OnChecked事件处理方式; |
数字增减按钮
<SpinButton Name="SpinButton1" Size="20,20" Minimum="0" Maximum="100" Value="50"/>
|
属性名 |
说明 |
|
Minimum |
SpinButton的range最大值 |
|
Maximum |
SpinButton的range最小值 |
|
Value |
初始化值 |
<TrackBar Name="TrackBar1" Size="150,20" Minimum="0" Maximum="100" Value="50" TickFrequency="10"></TrackBar>
|
属性名 |
说明 |
|
Minimum |
TrackBar的range最大值 |
|
Maximum |
TrackBar的range最小值 |
|
TickFrequency |
TrackBar显示标尺的刻度间隔 |
|
Value |
初始化值 |
<GraphChart Name="GraphChart0" Size="200,200" Type="1" Animation="0" Title="231" SubTitle="12345" OnLoad="init" Text="GraphChart -Pie">
|
属性名 |
说明 |
|
Title |
图表里有二个title,这个是上面的那个 |
|
SubTitle |
紧跟Title下面的title文字 |
|
Type |
类型,0[bar]——Bar(柱状图),1[pie]——Pie(饼状图),2[line]——Line(线状图) |
|
Animation |
1——动画模式显示,0——静态显示; |
|
OnLoad |
(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可 |
|
Segcol |
指定segment对应的列,缺省为首列(第0列),若segcol值有设置则取设置值,若设置值明确设定为空,则系统自动生成自然数序列(0,1,2,3,…)为Segment列。 |
|
swapsegserie |
交换Segment和Series, |
|
bggradient |
背景渐变色填充,参数以“|”分割开,前两个为渐变色参数,RGB值,可以接受的格式类似(15,255,0)或#0FFF00,第三个参数为渐变方式Vertical——纵向,Horizontal——横向 |
|
bgcolor |
背景色,RGB值,可以接受的格式类似(15,255,0)或#0FFF00,当bggradient存在时bgcolor将被忽略 |
|
titlecolor |
Title的字体颜色,RGB值,可以接受的格式类似(15,255,0)或#0FFF00 |
|
subtitlecolor |
SubTitle字体颜色,RGB值,可以接受的格式类似(15,255,0)或#0FFF00 |
绘制图表的数据既可以是从数据库中获取,使用<DbDetails/>参数。
数据格式如下(segcol未明确设置时):
对于类型0(BAR)、2(Line),数据第一列为x坐标,余下的每一列的字段名为系列名,列值为该列对应各x坐标的y坐标值。
对于类型1(PIE),数据第一列为各饼块的名称,第二列值为对应的值。
下图图例数据为demo文件之ctrls/demodata.csv,具体代码参见demo文件之ctrls/ctrls_chart.xml


Graphchart提供了“chartme”支持,即可以使用其他控件如ListCtrl数据绘制图表,例如下例:在图表report.record2.GraphChart1绘制pdcfgList<ListCtrl>的显示数据,namelist所引用的chart元素的name指明了图表,即窗体report子窗体record2的名为GraphChart1图表。
<Button Name="chart" Text="图表" Size="50,20">
<OnClick><chart name="report.record2.GraphChart1"/>
<submit next="pdcfgList" namelist="chart" function="chartme"/>
</OnClick></Button>
< ListBox Name="ListBox1" Size="200,100" Items="List Item 1|List Item 2|List Item 3" SelectedIndex="1"></ListBox>
|
属性名 |
说明 |
|
OnLoad |
(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可 |
|
Items |
定义下拉列表选项(可以为1|2|3或1~3或1~3*10),当有动态选项(例如通过Sql语句从数据库加载)时将被覆盖 |
|
SelectedIndex |
指示初始化载入数据后选择的项,若不选择则删除该属性;该控件每次载入新数据后若会自动选择指定项,例如SelectedIndex=”0”,控件自动设置当前选择的项为第0项,若未设置SelectedIndex,则设为未选,即SelectedIndex值为-1 |
除可以获取当前被选中项的显示文字外还可以额外下列参数(变量)以及附属变量(如通过sql获取的未显示的字段内容、使用SetValue设置的变量,关联当前被选中项)
|
参数名 |
说明 |
|
selectedindex |
当前选择项的序号,从0开始 |
|
itemcount |
控件选项数目 |
BR换行符,用于自动排版,属性有:
Size,定义为Size="x,y";x定义相对于左边界(0)右移宽度,y定义新行相对于上一行的间距,当x、y为0或未定义表示size不做修改而使用上一次的定义值。系统默认为<BR/>即默认为(0,30),新行第一个控件的默认位置LocationX为0,LocationY相对于上一行下移30个单位,或其它指定值,该值一旦修改,该页面的<BR/>将采用该新值直至被修改如<BR Size="30,0"/>(新行第一控件右移30单位,下移上一次被修改的下移单位)。
Autoheight,定义为Autoheight="x",x可以为1或0,默认0。仅影响本次,取值为1时自动计算上一行的最大高度,系统自动下移。
<BR/>
TAB:控件间距,用于自动排版,属性有:
Size,定义为Size="x,y";x定义相对于左边界(0)右移宽度,y目前无效,当x未定义表示size不做修改而使用上一次的定义值。系统默认为<TAB/>即默认为(20,0),新行第一个控件的默认位置LocationX为20,或其它指定值,该值一旦修改,该页面的<BR/>将采用该新值直至被修改如<TAB Size="30,0"/>(新行第一控件右移30单位,下移上一次被修改的下移单位)。
<TAB/>
<Calendar name="alendar" size="420,300" tooltip="问题题号" OnLoad="init"></ComboBox>
下拉选择框Calendar特有属性有:
|
属性名 |
说明 |
|
OnLoad |
(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可 |
|
ViewSpan |
显示时间期间0——按星期显示,1——按月显示 |
通过Sql语句加载给控件的数据(todotype, Subject, Startdatetime, DueDatetime)字段将被显示,其它字段的内容将作为属性附属于各项值,可以通过属性方法来获取,如CB_eyeill控件select p_name,id from dbo.eyeill将把p_name字段的值显示在下拉框CB_eyeill中,而引用选中的项的值可以是CB_eyeill[p_name]和CB_eyeill[id]。
|
Todotype |
类型,如task、email、call,etc |
|
Subject |
事件主题 |
|
Startdatetime |
事件开始时间 |
|
DueDatetime |
时间结束时间 |
由于这里需要的数据有专用的名称(todotype, Subject, Startdatetime, DueDatetime),这里便引用了<Dfmap/>子元素,来方便数据库表字段与控件所需数据名称的匹配,例如<dfmap><map name="Todotype " value="mytype"/></dfmap>将所需的“Todotype”与数据库表字段名“mytype”对应起来,返回的数据里“mytype”字段的数据将以“Todotype”参数呈现。
下列参数可以通过%{控件名[参变量名]}获取,eg:%{UserList[rowcount]}将获取UserList的当前页的记录数
也可以通过属性Items="6178|6179|6180|6181定义框内选项列表替代OnLoad
子元素DbDetails定义其访问数据的方式逻辑。
Calendar目前可响应的事件有:OnClick鼠标点击事件。
可以设置ViewSpan和显示的时间点,例如<assign name="calendar" function="setviewspan" expr="1"/>
<assign name="calendar" function="SetViewDate" expr="2014-01-22 08:00:00"/>
正如控件名称,它是一个特别的控件,可以呈现不同的控件类型和效果,可以用来显示文本,也可以是超链接,图片显示也可以是按钮,可以闪烁,可以淡入淡出等等,可以用作Carousel显示图片/文字跑马灯,也可以用来实现Tree显示树形目录……
同时也可以作为接口宿主,承载了一个外部接口的功能,即可以调用第三方DLL文件使用外部自定义Interface接口提供更多自定义的功能,方便与外部数据/软件交互,比如Excel自动化、二维码/条码扫描或生成、AI算法交互等等。
<MagicCtrl Name="magic_lay_name" color="0x00ff00" Link="LinkLine:2;HoverColor:0x234511;UseHand:2;Tip:tooltipinfo" href="http://3ucs.com" button="type:0;text:0;width:123;height:20;" font="bold:1;height:2;Italic:1;StrikeOut:0;Face:宋体" single_line="" br_offset="" line_align="" line_width="" line_space="" fadeout="max:1;min:2;speed:4;" sparkle="interval:300;timeout:1000;color:0x00ff00|0xff0000|0x0000ff" Size="60,20" Text="magic_name" Align="Right">
<interface id="xExcelA" type="IBizInterface" codebase="xexcel.dll" dir="layout/ucin/" classid="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" version="1.0"/></ MagicCtrl >
显示的内容可以是从是动态数据,例如显示SQL方式获取数据,eg:select 'min:0' as fadeout,'tip:test' as link, 'i love you' as text,'layout/ucin,play.png' as images,返回的字段内容text为显示的文字,images为显示的图片,fadeout将是显示的淡入淡出的效果,但若返回的字段不包含任何效果或特性信息,将取用xml定义的效果特性信息,这些信息包括button(text除外)、Link(tip除外)、fadeout 、sparkle、color、single_line、br_offset 、line_align、line_width、line_space、font
[注:下表中的标识名(大小写不敏感)应该保留而不应用于显示的内容的一部分]
|
属性名 |
说明 |
|
OnLoad |
(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可 |
|
Feature |
Carousel,类似于web,但PC、手机客户端也支持该方式,方便图片轮显。 |
|
button |
Button按钮设置。Type:是否构造为checkbox型的按钮,0-正常按钮,1-CheckBox型按钮,2-快按响应按钮(0时鼠标按下抬起后才触发Click事件,2则按下时就触发Click事件);text:按钮上的文字;width:强制按钮长度;height:强制按钮的高度; |
|
loadedclick |
指示列表载入数据后是否自动触发点击第0条记录的操作,如该值为1则执行并按照OnClick指定的方法操作 |
|
href |
超链接URL |
|
Link |
链接的参数设置。LinkLine:下划线规格,0-没有下划线,1-鼠标移上去有下划线,2-始终有下划线;HoverColor:鼠标移上去时颜色;UseHand:鼠标移上去时是否用手型;Tip:鼠标移上去时的tip提示信息 |
|
fadeout |
淡入淡出效果设置。Max,min指定其对象被淡化的Alpha值最大与最小,0~255之间;speed指定淡入淡出速度值0~255之间,默认15 |
|
sparkle |
闪烁效果设置。Interval:闪烁时间间隔,毫秒(ms),默认300;timeout:闪烁时长,超过则停止闪烁,默认无休止闪烁;color:闪烁的颜色变换,16进制值,“|”分割开,默认0xFF0000|0x00FF00|0x0000FF即蓝绿红(ColorREF)。 |
|
color |
字体颜色,16进制格式,例如0x12ff00 |
|
single_line |
0-不启用强制单行显示 1-启用单行显示 2-如果单行显示不下,最后三个字节以“...”结尾 |
|
br_offset |
换行后,第二行开始每行的行首偏移 |
|
line_align |
设置行的对齐方式:0-行上对齐,1-行中对齐,2-行下对齐 |
|
line_width |
行的显示宽度,默认自动宽度。 |
|
line_space |
行间距离默认0 |
|
images |
显示的图片,以“,”分割,第一项为图片所在服务器的路径,后续分别为图片文件名(分别对应于:常规显示、鼠标悬停、鼠标按下),可以一个也可以多个。Eg:layout/ucin,logo.png;图片所在服务器的路径可以省去,即第一个参数可以第一个图片的名称,此时将直接从本地默认路径(安装路径平行路径,<默认3UCS>\Users\用户名\)目录下读取图片;亦可以指定图片本地路径,该路径参数在第一个图片名称里呈现,如layout/ucin,data/refresh.png,它指定本地目录为安装目录子文件夹data |
|
font |
字体设置。FaceName:字体;bold:是否黑体;Italic:是否斜体;StrikeOut:是否带删除线 |
由于这里需要的数据有专用的名称(text、images等),这里便引用了<Dfmap/>子元素,来方便数据库表字段与控件所需数据名称的匹配,例如<dfmap><map name="text" value="name"/></dfmap>将所需的“text”与数据库表字段名“name”对应起来,返回的数据里“name”字段的数据将以“text”参数呈现。
OnClick鼠标点击事件。
使用示例:
<MagicCtrl Name="magic_lay_name" fadeout="min:0;" link="tip:12345" images="layout/ucin,logo.png" Size="160,80" OnLoad="init">
<dfmap><map name=\"text\" value=\"idx\"/></dfmap>
<DbDetails><queryFormat>select 'min:0' as fadeout,'tip:test' as link, 'i love you' as text,'layout/ucin,play.png' as images</queryFormat></DbDetails>
<OnClick><alert expr="%{magic_lay_name[text]}"/>
</OnClick>
</MagicCtrl>
<MagicCtrl Name="magic_lay_name1" color="0x00ff00" Link="LinkLine:2;HoverColor:0x234511;UseHand:2;Tip:tooltipinfo"
sparkle="interval:300;color:0x00ff00|0xff0000|0x0000ff" OnLoad="init"
font="bold:1;height:22;Italic:1;StrikeOut:0;Face:宋体" href="http://3ucs.com" Size="60,20" Text="magic_name" Align="Right">
<DbDetails><queryFormat>select 'min:0' as fadeout,'tip:test' as link,'50' as line_width, 'adsfasd fasfaf afaf fds afa 3ucs' as text,'layout/ucin,play.png' as images</queryFormat></DbDetails>
<OnClick><alert expr="%{magic_lay_name1[text]}"/>
</OnClick>
</MagicCtrl>
引入采用interface子元素,使用的是类COM技术但比COM更简单灵活,无需COM基础,自然也不支持不支持标准COM技术,具体参见BizXML Interface相关开发使用说明。
一个Magic控件可以有多个不同Interface接口,以id/classid识别。
<interface id="print" type="IBizInterface" codebase="mybizprint.dll" dir="layout/ucin/" classid="81D27722-87F2-4760-83DD-EF5C30FA08E4" version="1.53"/>
<MagicCtrl Name="xExcel" fadeout="min:0;" link="tip:read excel to list" text="xExcel" images="" Size="80,20">
<interface id="xExcelA" type="IBizInterface" codebase="xexcel.dll" dir="layout/ucin/" classid="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" version="1.0"/>
<OnClick><magicdata x="" function="read" sheet="%{sheetname}" filename="%{excel_file}"/>
<submit next="xexcel" namelist="magicdata" function="6BACF5C9-AF7A-481E-AE7A-B81378D097BF"/></OnClick>
<OnEvent_6BACF5C9-AF7A-481E-AE7A-B81378D097BF_1>
<info next="tst" expr="%{xExcel[6BACF5C9-AF7A-481E-AE7A-B81378D097BF.stat]};%{xExcel[6BACF5C9-AF7A-481E-AE7A-B81378D097BF.statmsg]}"/>
<if cond="0==%{xExcel[6BACF5C9-AF7A-481E-AE7A-B81378D097BF.stat]}">
<ExchangeData name="dataList"/>
<submit next="xexcel" dataSect="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" namelist="ExchangeData" function="ExchangeData"/>
</if>
</OnEvent_6BACF5C9-AF7A-481E-AE7A-B81378D097BF_1>
</MagicCtrl>
接口Interface属性(上面例子中“OnEvent_ xExcelA_1”等通过于“OnEvent_6BACF5C9-AF7A-481E-AE7A-B81378D097BF_1”,“{xExcel[xExcelA.stat]}”等同于“{xExcel[6BACF5C9-AF7A-481E-AE7A-B81378D097BF.stat]}”)
|
属性名 |
说明 |
|
id |
接口标识,用于标识接口,事件触发及获取接口相关信息时可使用其来识别接口, |
|
type |
接口类型。 |
|
codebase |
接口对应的文件,系统自动从服务器中的dir指定的目录提取该文件 |
|
dir |
位于服务器的路径 |
|
classid |
接口class ID,由接口内部创建并提供给调用宿主,用于标识接口,事件触发及获取接口相关信息时可使用其来识别接口 |
|
version |
当前应用中所要求的最低版本,当版本低于所要求的版本时系统自动尝试从服务器获取新的版本,版本不符不调用接口 |
接口Interface Event 信息
|
参数名 |
说明 |
|
stat |
接口返回的状态信息代码 |
|
statmsg |
接口返回的状态信息文字 |
|
bi_status |
接口的运行状态,0-NULL,1-INITIAL,2-RUNNING,3-WILLEXIT,4-WILLRESET,5-EXITING,6-RESETING,7-TERMINATE,8-DONE |
|
[…] |
接口返回的数据列表 |
通过<submit/>向接口interface传递数据的方式有两种,
一种是在namelist指定的元素(如"ExchangeData")里直接设定,下面语句中barencoder为Magic控件,内包含一个接口“52881E29-8DBE-48e1-9A17-29346DA8D513”(生成二维码),先设定filename取值控件或变量“barcodefn”,数据为“data”元素,即控件或变量“barcodefnrs”的值,同时“c”元素及值“fafasf”也会作为数据对传递给接口。比如可以将“barcodefn”的内容生成二维码图片。[完整代码见demo文件之ctrls/ctrls_magic.xml]
<magicdata x="" filename="%{barcodefn}"><data>%{barcodefnrs}</data><c>fafasf</c></magicdata>
<submit next="barencoder" namelist="magicdata" function="52881E29-8DBE-48e1-9A17-29346DA8D513"/>
另一种使用其它控件传递给接口,下面的语句是将ListCtrl “ExcelList”的表数据传递给Magic控件的接口“6BACF5C9-AF7A-481E-AE7A-B81378D097BF”(Excel自动化),其实就是通过接口格式化输出数据给Excel表格文件,它是先设目标next的值为ListCtrl “ExcelList”,并在ExchangeData里设置name值为接口所属的控件 “xExcel”。 [完整代码见demo文件之ctrls/demo_excel.xml]
<ExchangeData name="xExcel" DataSect="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" function="write" filename="%{excelfn}"/>
<submit next="ExcelList" namelist="ExchangeData" function="ExchangeData"/>。
可以直接读取对应接口的数据值,下面语句取得Magic控件“bardecoder”之接口“52881E29-8DBE-48e1-9A17-29346DA8D513”的“data”值并赋值给控件“barcodefnrs”。[完整代码见demo文件之ctrls/ctrls_magic.xml]
<assign name="barcodefnrs" expr="%{bardecoder[52881E29-8DBE-48e1-9A17-29346DA8D513.data]}"/>
也可以直接将接口的数据传递给对应控件,下面的语句就是将Magic控件“xexcel”之接口“6BACF5C9-AF7A-481E-AE7A-B81378D097BF”的数据传递给ListCtrl“ExcelList”。比如可以通过接口读取Excel文件到ListCtrl中。[完整代码见demo文件之ctrls/ demo_excel.xml]
<ExchangeData name="ExcelList"/>
<submit next="xexcel" dataSect="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" namelist="ExchangeData" function="ExchangeData"/>
<if cond="cond1">……<elseif cond="cond2"/>…….<else/>……</if>
<if cond="%{CB_resvStatus[id]}==1">判断控件CB_resvStatus的id变量是否为“1”,当id为“1”判为真执行内部语句,否则执行elseif条件判断或else语句。
Cond表达式可参考javascript真伪语法,可组合使用&& || () 等等。
<notify/>在电脑状态栏弹出提示框,需用户点击方可消失,点击后触发“OnTBNotifierRtn”事件。如提示新消息,未处理事务等。
属性:next关联的控件名,expr提示的内容。
例如:
<notify next="tst" expr="您有新预定%{resv.resvNew[SnapShot]}"/>。
<alert/>警示,提醒,需用户点击。
属性:next关联的控件名,expr提示的内容。
例如:
<alert next="CB_roomAvlb" expr="%{lb_roomno}不能为空"/>
<info/>在窗体中央位置显示提示框,几秒后自动消失
属性:next关联的控件名,expr提示的内容。
例如
<info next="tst" expr="操作成功"/>
<confirm/>常用于button,当按钮按下时可根据条件选择是否弹出确认框,用户选择后赋值给控件confirmed变量,例如button名为update,将影响update[confirmed],可通过访问该值(%{update[confirmed]})做下步操作。
<if cond="%{innsLst[CityID]}"><if cond="%{innsLst[CityID]}!=%{citys[city_code]}">
<confirm expr="要修改所在城市么?"/>
<if cond="!%{update[confirmed]}"><assign name="break" expr="1"/></if></if></if>
<submit/>提交执行,处理相关事务,比如sql执行。
|
属性名 |
说明 |
|
next |
目标控件名称 |
|
function |
方式,其有效值为目标控件支持的function |
|
namelist |
参数列表,next被执行的控件名 |
|
delay |
非网页版操作延迟处理,单位毫秒 |
属性:namelist参数列表,next被执行的控件名,function方式。例如
提交给innsLst控件参数DbDetails执行相关操作,多为数据库访问:
<DbDetails/><submit namelist="DbDetails" next="innsLst"/>
将ListCtrl或ComboBox等控件HistoryList内容清空:
<submit next="HistoryList" function="resetcontent"/>。
<assign/>赋值操作,可以对变量、控件进行赋值
|
属性名 |
说明 |
|
name |
被赋值的控件名称 |
|
function |
为赋值操作的方式方法,其有效值为目标控件支持的function |
|
expr |
赋值的内容(可以使用javascript,将expr内容置于“js()”小括号中即可,即js(expr) |
|
delay |
非网页版操作延迟处理,单位毫秒, |
格式为<Assign name="ctrlname" expr="expr" function="function"/>,ctrlname为被赋值的控件名称,expr为赋值的内容(可以使用javascript,将expr内容置于“js()”小括号中即可,即js(expr),function为赋值操作的方式方法,例如:
对hotelid变量赋值,值为页面hostels控件TB_code的值:
<assign name="hotelid" expr="%{hostels[TB_code]}"/>
对TextBox控件TB_desc赋值,值为同一页面的CB_roomAvlb控件的附属变量description:
<assign name="TB_desc" expr="%{CB_roomAvlb[description]}"/>
对于TextBox而言,function可以是:AddText——追加文字,SetText、SetValue——直接赋值,也可以为空,即为SetText;系统在执行操作前如果expr值为数学运算会自动执行该运算将结果赋值给控件。
对Combobox控件赋值,即选择其-1项为当前选择,实际是清空选择项:
<assign name="CB_content" expr="-1" function="SetSel"/>
调用外部事件也可以通过Assign来实现<assign name="topmost" expr="nis3ucs:"/>,当需要传递给整个框架外围时name值可设为"topmost",例如下载文件:
<assign name="topmost" expr="GetFile:%{CallList[recFn]},dir=record,localdir="/>
上传文件:
<assign name="topmost" expr="SendFile:, filter=*.xls|*.xls|, dir=layout, localdir="/>
呼出电话(参见NISU电话呼叫控制):
<assign name="topmost" expr="nis3ucs:%{TB_customPhone}#0 1"/>
置忙(参见NISU坐席状态设置) :
<assign name="topmost" expr="nis3ucs: USS|b "/>
<SetEnabled name="TB_num" enabled="0"/> 禁用控件TB_num
<SetEnabled name="TB_num" enabled="1"/> 启用控件TB_num
被禁用的控件不能做任何操作,如TextBox禁用后连复制等都不允许。
<SetVisible name="insertp" Visible="0"/> 隐藏控件insertp
<SetVisible name="insertp" Visible="1"/> 显示控件insertp
<Sleep Interval="10"/>
操作在此处暂停,Interval取值范围为10ms~10000ms(10毫秒~10秒),超出该范围将被就近压缩至该范围内。
该事件源于Notify窗口(由<notify/>触发显示在状态栏处的提示窗口)被点击,用于处理相关事件,该元素的父元素可以使〈WndTap〉,也可以是各个控件如〈button/〉(但必须是产生〈notify/〉的控件哦。)例如:
<WndTap Name="resv" Text="预订信息">
<var name="hotelid" expr="0"/>
<var name="rmtpChg" expr="0"/>
<Ctrls>
</Ctrls>
<OnTBNotifierRtn><alert next="CB_roomAvlb" expr="OnTaskbarNotifierRtn"/> </OnTBNotifierRtn>
</WndTap>
页面切换时被激活的页面将触发该事件,用于处理相关事件,该元素的父元素可以使〈WndTap〉例如:
<WndTap Name="resv" Text="预订信息">
<var name="hotelid" expr="0"/>
<var name="rmtpChg" expr="0"/>
<Ctrls>
</Ctrls>
<OnActivate><DbDetails/>
<if cond="%{hotelid}!=%{hostels.TB_code}">
<assign name="hotelid" expr="%{hostels.TB_code}"/>
<DbDetails/><submit namelist="DbDetails" next="CB_roomTpye"/></if>
<if cond="%{rmtpChg}!=%{roomtype.ChangeId}">
<assign name="rmtpChg" expr="%{roomtype.ChangeId}"/>
<DbDetails/><submit namelist="DbDetails" next="CB_roomTpye"/></if>
<submit next="search" method="post" function="click"/>
</OnActivate>
</WndTap>
Sql执行完成后返回会触发该事件,用于处理相关事件,该元素的父元素可以使〈WndTap〉,也可以是各类控件如〈button/〉(但必须是获得该sql执行结果的控件哦)。此时会有临时变量OnChangedCtrl(隶属于窗体页面)可访问获取控件的Name。例如:
<WndTap Name="resv" Text="预订信息">
<Ctrls>
</Ctrls>
<OnChanged><if cond="%{resv.resvNew[IsDataChanged]}>0">
<if cond="%{resv.resvNew[SnapShot]}">
<notify next="tst" expr="您有新预定 %{resv.OnChangedCtrl} %{resv.resvNew[SnapShot]}"/></if></if>
</OnChanged>
</WndTap>
EvalTbl是BizXML的独特设计的基于表格的逻辑算法(同时提供JavaScript支持,注意:js里“>”“<”应使用“>”“<”代替,或使用“<![CDATA[]]>”标记js脚本,且不能出现注释符“//”),提供基于表格的逻辑规则引擎,表格各列分别为逻辑输入列、逻辑输出列,用户输入数据按相应输入列的算法进行真值运算,求出真值行取出逻辑结果。BizXML开放应用逻辑/业务逻辑算法接口,方便用户表自行定义逻辑规则表,系统解析逻辑表,将输入参数按照一定规则运算后得到逻辑结果并输出。其调用格式如下[注意:EvalTbl大小写敏感]:
<EvalTbl rules="%{ctrls.tablerules}" table="tblname" remark="case-senstive">
<rules></rules>
<inputs input1="%{EvalTblTest}" input2="yellow" …/>
<outputs output1="EvalTblTest[Result]" …/></EvalTbl>
rules为用户定义的逻辑逻辑表描述,提供两种方式来指定代码,一个是将逻辑逻辑表包含于“EvalTbl”的脚本内,如:<rules><Tables>…</Tables></rules>,即“内嵌方式”,另一个是在页面其他代码中以var等方式定义,然后在Eval中引用,如<EvalTbl rules="%{ctrls.tablerules}"…,即“引用方式”,内嵌方式优先级高于引用方式。
table参数指定本次运算使用的表名,必须存在于rules中。
Inputs定义了输入参数值对,即逻辑表中的输入列,可以一对或多对,如input1、input2,他们均为逻辑表中Inputs中的属性Attr名,取值可以是页面的控件参数值,如“%{EvalTblTest}”,亦可常量,输入的值为多个“或”(OR)值时以“|”隔开。
Outputs定义了输出参数值,即逻辑表中的输出的某列,如output1,运算完成将output1的结果存放在控件后变量里,如“EvalTblTest[Result]”就是将output1结果赋值给控件EvalTblTest的Result参数。
逻辑表中Value的id为Value值字符串的id值,相同id对应的字符串应该相同。id(0,1,2)为保留字符值(INVALID_STRING = 0; EMPTY_STRING = 1;EXPLICIT_NULL_STRING = 2),因此分配的id值应从3开始。
Operation为运算方式,
|
EQUALS( = ) |
1 |
(0x1) |
|
NOT_EQUAL( !=,<> ) |
2 |
(0x2) |
|
LESS_THAN( < ) |
4 |
(0x4) |
|
LESS_THAN_EQUAL( <= ) |
8 |
(0x8) |
|
GREATER_THAN( > ) |
16 |
(0x10) |
|
GREATER_THAN_EQUAL( >= ) |
32 |
(0x20) |
|
RANGE_INCLUSIVE( [] ) |
64 |
(0x40) |
|
RANGE_END_INCLUSIVE( (] ) |
128 |
(0x80) |
|
RANGE_START_INCLUSIVE( [) ) |
256 |
(0x100) |
|
RANGE_NOT_INCLUSIVE( () ) |
512 |
(0x200) |
|
JAVASCRIPT |
1024 |
(0x400) |
|
GETS |
2048 |
(0x800) |
3UCS Server安装包中xLogician.exe程序可以用来帮助设计逻辑表格。
|
会员 类别 |
界定标准 |
|
A类 |
最近一年内内消费金额在2000元以上∕或年度消费频次在4次及以上用户 |
|
B类 |
最近一年消费在1000-1999元以内∕或年度消费频次在2次及以上用户 |
|
C类 |
最近一年消费在1-999金额∕或年度消费频次在1次及以上用户 |
|
D1类 |
最近1-2年未消费 |
|
D2类 |
最近2-3年未消费 |
|
D3类 |
最近3年以上为消费 |

逻辑代码(memberlevel.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Tables>
<Table name="memberlevel">
<Inputs>
<Attr>annualamount</Attr>
<Value op="32" id="3">2000</Value>
<Value/>
<Value op="32" id="4">1000</Value>
<Value/>
<Value op="32" id="5">1</Value>
<Value/>
<Value/>
<Value/>
<Value/>
<Value/>
<Value/>
<Value/>
</Inputs>
<Inputs>
<Attr>annualtimes</Attr>
<Value/>
<Value op="32" id="6">4</Value>
<Value/>
<Value op="32" id="7">2</Value>
<Value/>
<Value op="32" id="5">1</Value>
<Value/>
<Value/>
<Value/>
<Value/>
<Value/>
<Value/>
</Inputs>
<Inputs>
<Attr>noneyears</Attr>
<Value/>
<Value/>
<Value/>
<Value/>
<Value/>
<Value/>
<Value op="1" id="5">1</Value>
<Value op="1" id="7">2</Value>
<Value op="1" id="8">3</Value>
<Value/>
<Value/>
<Value/>
</Inputs>
<Outputs>
<Attr>level</Attr>
<Value op="1" id="9">A</Value>
<Value op="1" id="9">A</Value>
<Value op="1" id="10">B</Value>
<Value op="1" id="10">B</Value>
<Value op="1" id="11">C</Value>
<Value op="1" id="11">C</Value>
<Value op="1" id="12">D1</Value>
<Value op="1" id="13">D2</Value>
<Value op="1" id="14">D3</Value>
<Value op="1" id="14">D3</Value>
<Value/>
<Value/>
</Outputs>
</Table>
</Tables>
BizXML代码(demo文件之logicdemo.xml)
<?xml version="1.0" ?>
<WndTap Name="logicdemo" Text="表格逻辑">
<var name="MemberLevelTbl"><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="memberlevel.xml"/></var>
<Ctrls>
<GroupBox Name="GroupBoxLogicM" Text="会员逻辑演示"><Ctrls>
<Label Name="lb_input1" Text="输入1:" Size="50,20"/><ComboBox Name="annualamount" Size="100,100" Items="100|1000|2000" SelectedIndex="0"/>
<BR/><Label Name="lb_input2" Text="输入2:" Size="50,20"/><ComboBox Name="annualtimes" Size="100,100" Items="1|2|5" SelectedIndex="1"/>
<BR/><Label Name="lb_input3" Text="输入3:" Size="50,20"/><ComboBox Name="noneyears" Size="100,100" Items="1|2|5" SelectedIndex="1"/>
<BR/><Label Name="lb_output" Text="输出:" Size="50,20"/><TextBox Name="EvalTblTest1" Size="50,20" ToolTip="EvalTableTest"></TextBox>
<Button Name="cal" Size="50,20" Text="计算">
<OnClick>
<EvalTbl rules="%{MemberLevelTbl}" table="memberlevel">
<inputs annualamount="%{annualamount}" annualtimes="%{annualtimes}" noneyears="%{noneyears}"/><outputs level="EvalTblTest1"/></EvalTbl>
</OnClick>
</Button>
</Ctrls></GroupBox>
</Ctrls></WndTap>
<TextBox Name="TB_filename" Size="150,20" Text="material.mdb" tooltip="js 获取文件后缀">
<OnEnchange>
<assign name="filetp" expr="js('%{TB_filename}'.substr('%{TB_filename}'.indexOf('.')))"/>
</OnEnchange></TextBox>
<TextBox Name="filetp" Size="150,20" Text=".mdb"></TextBox>
2.0版本增强了GroupBox的功能,它在原有基础上增加了界面排版的属性支持,即它可以单单用来辅助排版,类似于“HTML”中的“DIV”,仅用来辅助排版的Groupbox的Text属性应该为空。
2.0使用了栅格思想,将要显示的屏幕横向分为12块,同时根据屏幕大小将屏幕分为xs(超小屏,手机)、sm(小屏幕,平板)、md(中等屏幕、普通电脑显示屏)、lg(超大屏幕),通过设置GroupBox的“cols”属性(如cols=”xs12 sm6 md4 lg3”)来规定其在不同大小屏幕横向占位。
每个元素(控件)的位置可以精确指定,通过对每个元素的属性location(位置)来指定,有两个方式,方式LocationX="30" LocationY="20"等同于Location="30,20",都是将该元素放置于窗口左上角原点横向右移30个单位,纵向下移20个单位的位置,这个基本可以是该窗口排列的第一个元素。元素的大小也是两个方式,SizeWidth="50" SizeHeight="24"等同于Size="50,24"。
新的版本中也增加了些新的支持方便排版的功能,即可以不用指定每个元素的位置而是由系统自动适应。这里就增加了些控制元素,如<BR/>换行、<TAB/>留空、<GroupBox/>组群,参见相关元素的使用说明。
BizXML可以提供MQTT客户机,用来与MQTT服务器通信,启动MQTT客户端:
<mqtt function="start"/>
停止MQTT客户端:
<mqtt function="stop"/>
显示MQTT客户机状态,expr值mqtt_status为接收状态值的控件,如果expr(控件名)缺失则自动设置当前控件作为接收MQTT状态的控件,当未设置状态接收控件时系统自动将其发送给主程序处理【例如(目前)XOne会显示该状态】:
<mqtt function="config" name="status" expr="mqtt_status"/>
配置MQTT服务器主机IP地址:
<mqtt function="config" name="host" expr="192.168.0.1"/>
配置MQTT服务器主机端口:
<mqtt function="config" name="port" expr="1883"/>
向MQTT服务器注册主题expr值(topic, devices/%{station_code}/sys/14),接收控件为next值(controller_psetsub)【station_code为该页面控件,%{station_code}即取该控件的值】:
<mqtt function="subscribe" next="controller_psetsub" expr="devices/%{station_code}/sys/14"/>
向MQTT服务器发布主题topic(devices/%{station_code}/poscostart)的值(expr值):
<mqtt function="publish" topic="devices/%{station_code}/poscostart" delay="2000" expr="1" />
新来电 ReceivedCall
userid 使用者帐户ID;
password 使用者帐户密码;
callerid 来电主叫号码;
input CallID通话标示ID,唯一性,可用于区分通话
呼出回铃 CallAlerting
remoteuser 对端用户号码或ID;
input CallID通话标示ID,唯一性,可用于区分通话;
通话接通 CallConnected
remoteuser 对端用户号码或ID;
input CallID通话标示ID,唯一性,可用于区分通话;
通话挂断 CallDisconnected
处理方式示例 (于<EventHandlers> </EventHandlers>)
来电弹屏
<EventHandler Event="ReceivedCall('%{callerid}')" Handler="(custom.TB_mobile)SetText(%{callerid});(custom.TB_phone)SetText(%{input})"/>
挂机自动置忙方便处理表单,坐席需手动切换至空闲
<EventHandler Event="CallDisconnected()">
<assign name="topmost" expr="nis3ucs:USS|b"/></EventHandler>
可以调用Getfile、Sendfile、BrowseFile、ihttp、recordvoice、stoprecordvoice、playvoice、pauseplayvoice、stopplayvoice等内建功能,调用方式有两种方式,一种是作为OnClick属性来调用,例如发起对文本框“TB_TEL” 进行电话呼叫:
<Button Name="dial" Size="80,20" Text="呼叫" OnClick="nis3ucs:%{TB_TEL} 1"/>
另一种使用assign元素,例如上面语句可以是:
<Button Name="dial" Size="80,20" Text="呼叫"><OnClick><assign name="topmost" expr="nis3ucs:%{TB_TEL} 1"</OnClick> </Button >
ihttp:访问http页面提交数据并将http服务器返回的数据传递给指定的文本框之类的控件,提交方式可以是Get或Post。下面语句使用http之Get方式获取网址“http://3ucs.com/mesapi?s=1”内容并将结果赋值给控件(文本框)“t_val”:
<Button Name="ihttp" Size="80,20" weight="100" Text="http" OnClick="(t_val)ihttp: http://3ucs.com/mesapi?s=1"/>
下面语句使用http之POST方式获取网址“http://3ucs.com/mesapi?s=1,postdata=a=1&b=2”内容并将结果赋值给控件(文本框)“t_val”:
<Button Name="ihttp" Size="80,20" weight="100" Text="http" OnClick="(t_val)ihttp: http://3ucs.com/mesapi?s=1,postdata=a=1&b=2"/>
下面语句使用http之POST方式获取t_param控件/变量设置的网址的内容并将结果赋值给控件(文本框)“t_val”:
<Button Name="ihttp" Size="80,20" weight="100">
<OnClick>
<assign name="t_val" expr="ihttp:%{t_param}" function=""/>
</OnClick></Button>
手机客户端额外支持的功能与模块(陆续增加中)
扫码:barcode
拍照:takephoto;
选取图片:takephoto:1;
拍视频takevideo;
选取视频:takevideo:1;
位置(2D):location; (3D):location3
Wifi ssid:wifissid; WIFI BASE ID:wifibssid
摇一摇:shake
登陆:signin
注册:register
手写图片:signature
<TextBox Name="barcode_res" Size="100,20" Text=""></TextBox>
<Button Name="barcode" signInRequired = "true" Size="80,20" Text="扫码" OnClick="(barcode_res)barcode"/>
<Button Name="barcode" Size="80,20" Text="barcode">
<OnClick>
<assign name="barcode_res" expr="barcode" function=""/>
</OnClick></Button>
…….
BizXML内置SQL访问处理单元,可以访问几乎所有数据库,同时您也许注意到:配置中的SQL语句频繁出现类似“%g”、“%{UserName}”内容,这里特别说明下(大小写要区分噢!!!!——2014年以后发布的版本大小写不敏感)。
[注:当系统输出的名称多于一个字符时需用{}包含,执行时将替换为该通电话开始时间。]
3UCS的SQL访问单元为提供更加灵活的方式,采用了模型替换方式。“%g”、“%{UserName}”就是需替换内容。其中“g”、“UserName”为系统内置变量名称(区分大小写),系统在执行该SQL语句时直接替换该变量名称的内容为该变量的值(可用变量params参见各模块单元说明)。例如:
软交换SQLPasswordAuth中
Query=SELECT Password FROM users WHERE UserName = '%1'
[注:替换为登录软交换用户的名称,外面有单引号指明为字符串,对应数据库字段为“UserName”。下面的“%u”类似]
Query=SELECT Password FROM users WHERE UserName = '%u'
比如目前登录软交换的用户为1234,系统执行的SQL语句为:
SELECT Password FROM users WHERE UserName = '1234',返回Password。
又如软交换CDR中
StartQueryAlt=INSERT INTO calls (gkname, starttime, sessid, callno, username, calling, called, duration, disconnectcause) VALUES ('%g', '%{setup-time}', '%s', %n, '%u', '%{Calling-Station-Id}', '%{Called-Station-Id}', %d, %c)
比如该通电话软交换名称为g=3ucs,开始时间setup-time =2004-07-01 15:32:28,记录ID为s =12345,通话ID为n =98999234567,主叫用户名u=bx,主叫号码Calling-Station-Id =6100,被叫号码为Called-Station-Id =6120,持续时长d=30s,结束原因为c =16,执行时SQL语句为:
INSERT INTO calls (gkname, starttime, sessid, callno, username, calling, called, duration, disconnectcause) VALUES ('3ucs', '2004-07-01 15:32:28', '12345', 98999234567, 'bx', '6100', '6120',30,16)
多语句执行及将结果作为后续语句的输入条件,例如下面语句最终返回的是userlogin表的查询结果:
CALL mylayout.GETSAL(1,@a,@b);SELECT @a username,@b b;SELECT * from mylayout.userlogin where user_name='%{username}';
assign 之function,尤其是在combobox,易漏掉Setsel
文中提到的Demo代码如无特殊说明均为下xPlusServer(3UCS/Server)安装目录下文件夹layout\demo\及下级相关文件夹,例如D:\Program Files (x86)\3UCS\Server\layout\demo
<interface id="xExcel" dir="layout/ucin/" type="IBizInterface" codebase="xexcel.dll" classid="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" version="3.0"/>
其中id/dir/根据应用设计需要自定义,id跟classid用于识别,classid为接口的唯一标识,使用dll实现,一个MagicCtrl可以有多个不同接口。
传递给接口的参数有两类,分别是配置类参数与交换数据,在xExcel中配置参数有:
|
参数名 |
说明 |
|
filename |
Excel文件名(含完整路径), |
|
function |
read/write/execmacro/GetValue,分别用于读Excel/写Excel/运行Excel宏/读指定的单元格 |
|
sheet |
指定的sheet名,缺省时取第一个sheet |
|
OptionMode |
Excel打开模式,0,mustexist;1,createifnotexist;2 truncate if exist ;read default 0,write default 2; |
|
explicit |
Function=Write时是否明确指定ListCtrl列名与Excel单元格的对应关系,用于复杂的格式化输出至Excel,例如sdj="M65"就是将ListCtrl中当前行列名为sdj的数据输出至Excel文件中的M65单元格 |
|
visible |
操作excel时是否显示Excel界面,若不显示则为后台运行。 |
|
autosave |
操作完成自动保存Excel文件 |
|
blankskip |
在explicit为真时Write Excel单元格时若ListCtrl数据为空白时是否跳过该单元格保持其原有状态 |
|
TL,BR |
Excel起始/终止单元格id;有效于规范read/write,例如TL="A2"指明从A2单元格开始操作,TL="N2"指明从N2单元格开始操作,BR="P5"指明读操作终止于单元格 |
|
dataoffset |
指明ListCtrl输出至Excel时从第几列开始,默认从第0列 |
|
macro |
运行Excel宏的宏名 |
|
mapkey, mapkeycol, mapvalcol |
用于 “GetValue” function,在Excel文件sheet中mapkeycol指定列查找mapkey值所在的sheet行,返回该行中mapvalcol指定列的值[格式为mapkey<>value](mapvalcol可以指定多列,以’,’分隔,输出的内容对应多列,格式为colname<>value)。 |
|
ListCtrl列名 |
在explicit为真时Write Excel指明列名与Excel单元格对应关系。 |
|
stat,statmsg,bi_status…… |
|
语法使用示例[完整代码见demo文件之ctrls/demo_excel.xml],将ListCtrl“ExcelList”表中数据写到Excel文件中,文件路径/名由excelfn参数或文本框设定:
<ExchangeData name="xExcel" DataSect="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" function="write" OptionMode="1" filename="%{excelfn}"/><submit next="ExcelList" namelist="ExchangeData" function="ExchangeData"/>
将ListCtrl“ptdy_vLst”表中选中行的指定列数据写到Excel文件指定单元格中(列名“sdj”对应单元格“M65”, 列名“sBZQDJ”对应单元格“M79”),文件路径/名由excelfn参数或文本框设定:
<ExchangeData name="xExcel" visible="true" DataSect="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" function="write" OptionMode="0" explicit="1" sdj="M65" sBZQDJ="M79" filename="%{excelfn}"/><submit next="ptdy_vLst" namelist="ExchangeData" function="ExchangeData"/>
通过Magic控件“xexcel”的接口“6BACF5C9-AF7A-481E-AE7A-B81378D097BF”读取“excelfn”指定的Excel文件中“sheet”指定的sheet表格数据:
<magicdata x="" function="read" sheet="%{sheet}" filename="%{excelfn}"></magicdata><submit next="xexcel" namelist="magicdata" function="6BACF5C9-AF7A-481E-AE7A-B81378D097BF"/>
将读取接口中的Excel数据传递给ListCtrl“ExcelList”显示及后续操作:
<ExchangeData name="ExcelList"/><submit next="xexcel" dataSect="6BACF5C9-AF7A-481E-AE7A-B81378D097BF" namelist="ExchangeData" function="ExchangeData"/>
在A列中查找‘excel_sql’内值对应等行,返回该行B列对应的值(例子中结果最后将显示在ListCtrl“ExcelList”)
<magicdata function="GetValue" mapkey="%{excel_sql}" mapkeycol="A" mapvalcol="B" sheet="%{sheet}" filename="%{excelfn}"></magicdata><submit next="xexcel" namelist="magicdata" function="6BACF5C9-AF7A-481E-AE7A-B81378D097BF"/>
<interface id="barencode" type="IBizInterface" codebase="barencode.dll" dir="layout/ucin/" classid="B65ABE3E-702E-4762-99FD-FB40546733B0" version="3.1"/>
其中id/dir/根据应用设计需要自定义,id跟classid用于识别,classid为接口的唯一标识,使用dll实现,一个MagicCtrl可以有多个不同接口。
传递给接口的参数有两类,分别是配置类参数与交换数据,在生成配置参数有:
|
参数名 |
说明 |
|
filename |
生成的二维码/条码(输出)保存的文件名(含完整路径), |
|
type |
二维码/条码格式,缺省值为58(二维码),码形对应表见下表。 |
|
width |
Width of the generated symbo |
|
height |
Symbol height,default 50 |
|
scale |
Scale factor for adjusting size of image |
|
secure |
(PDF417 and QR Code) Error correction level |
|
notext |
Show human readable text Human readable text, which usually consists of the input data plus one or more check digits. Uses UTF-8 formatting. |
将控件/变量“barcodefnrs”的内容通过Magic控件“barencoder”之接口“barencode”生成二维码,并将二维码图片保存至控件/变量“barcodefn”设置的文件[完整代码见demo文件之ctrls/ctrls_magic.xml]
<magicdata filename="%{barcodefn}"><data>%{barcodefnrs}</data></magicdata> <submit next="barencoder" namelist="magicdata" function="barencode"/>
|
数值 |
码形Barcode Name |
|
1 |
Code 11 |
|
2 |
Standard Code 2 of 5 |
|
3 |
Interleaved 2 of 5 |
|
4 |
Code 2 of 5 IATA |
|
6 |
Code 2 of 5 Data Logic |
|
7 |
Code 2 of 5 Industrial |
|
8 |
Code 3 of 9 (Code 39) |
|
9 |
Extended Code 3 of 9 (Code 39+) |
|
13 |
EAN |
|
16 |
GS1-128 (UCC.EAN-128) |
|
18 |
Codabar |
|
20 |
Code 128 (automatic subset switching) |
|
21 |
Deutshe Post Leitcode |
|
22 |
Deutshe Post Identcode |
|
23 |
Code 16K |
|
24 |
Code 49 |
|
25 |
Code 93 |
|
28 |
Flattermarken |
|
29 |
GS1 DataBar-14 |
|
30 |
GS1 DataBar Limited |
|
31 |
GS1 DataBar Extended |
|
32 |
Telepen Alpha |
|
34 |
UPC A |
|
37 |
UPC E |
|
40 |
PostNet |
|
47 |
MSI Plessey |
|
49 |
FIM |
|
50 |
LOGMARS |
|
51 |
Pharmacode One-Track |
|
52 |
PZN |
|
53 |
Pharmacode Two-Track |
|
55 |
PDF417 |
|
56 |
PDF417 Truncated |
|
57 |
Maxicode |
|
58 |
QR Code |
|
60 |
Code 128 (Subset B) |
|
63 |
Australia Post Standard Customer |
|
66 |
Australia Post Reply Paid |
|
67 |
Australia Post Routing |
|
68 |
Australia Post Redirection |
|
69 |
ISBN (EAN-13 with verification stage) |
|
70 |
Royal Mail 4 State (RM4SCC) |
|
71 |
Data Matrix |
|
72 |
EAN-14 |
|
75 |
NVE-18 |
|
76 |
Japanese Postal Code |
|
77 |
Korea Post |
|
79 |
GS1 DataBar-14 Stacked |
|
80 |
GS1 DataBar-14 Stacked Omnidirectional |
|
81 |
GS1 DataBar Expanded Stacked |
|
82 |
PLANET |
|
84 |
MicroPDF417 |
|
85 |
USPS OneCode |
|
86 |
Plessey Code |
|
87 |
Telepen Numeric |
|
89 |
ITF-14 |
|
90 |
Dutch Post KIX Code |
|
92 |
Aztec Code |
|
93 |
DAFT Code |
|
97 |
Micro QR Code |
|
98 |
HIBC Code 128 |
|
99 |
HIBC Code 39 |
|
102 |
HIBC Data Matrix |
|
104 |
HIBC QR Code |
|
106 |
HIBC PDF417 |
|
108 |
HIBC MicroPDF417 |
|
112 |
HIBC Aztec Code |
|
128 |
Aztec Runes |
|
129 |
Code 32 |
|
130 |
Composite Symbol with EAN linear component |
|
131 |
Composite Symbol with GS1-128 linear component |
|
132 |
Composite Symbol with GS1 DataBar-14 linear component |
|
133 |
Composite Symbol with GS1 DataBar Limited component |
|
134 |
Composite Symbol with GS1 DataBar Extended component |
|
135 |
Composite Symbol with UPC A linear component |
|
136 |
Composite Symbol with UPC E linear component |
|
137 |
Composite Symbol with GS1 DataBar-14 Stacked component |
|
138 |
Composite Symbol with GS1 DataBar-14 Stacked Omnidirectional component |
|
139 |
Composite Symbol with GS1 DataBar Expanded Stacked component |
|
140 |
Channel Code |
|
141 |
Code One |
|
142 |
Grid Matrix |
<interface id="bardecode" type="IBizInterface" codebase="bardecode.dll" dir="layout/ucin/" classid="52881E29-8DBE-48e1-9A17-29346DA8D513" version="3.1"/>
其中id/dir/根据应用设计需要自定义,id跟classid用于识别,classid为接口的唯一标识,使用dll实现,一个MagicCtrl可以有多个接口。
传递给接口的参数有两类,分别是配置类参数与交换数据,在生成配置参数有:
|
参数名 |
说明 |
|
filename |
生成的二维码/条码(输出)保存的文件名(含完整路径), |
将控件/变量barcodefn的值作为要解码的filename传递给Magic控件“bardecoder”之接口“52881E29-8DBE-48e1-9A17-29346DA8D513”进行二维码/条码解码[完整代码见demo文件之ctrls/ctrls_magic.xml]:
<magicdata filename="%{barcodefn}"></magicdata><submit next="bardecoder" namelist="magicdata" function="52881E29-8DBE-48e1-9A17-29346DA8D513"/>
通过info窗口显示解码数据同时使用assign将解码数据赋值给控件/变量“barcodefnrs”:
<OnEvent_52881E29-8DBE-48e1-9A17-29346DA8D513_1><info next="tst" expr="%{bardecoder[52881E29-8DBE-48e1-9A17-29346DA8D513.data]}"/><assign name="barcodefnrs" expr="%{bardecoder[52881E29-8DBE-48e1-9A17-29346DA8D513.data]}"/></OnEvent_52881E29-8DBE-48e1-9A17-29346DA8D513_1>
|
中文字号 |
英文字号(磅) |
毫米 |
像素 |
|
1英寸 |
72pt |
25.30mm |
95.6px |
|
大特号 |
63pt |
22.14mm |
83.7px |
|
特号 |
54pt |
18.97mm |
71.7px |
|
初号 |
42pt |
14.82mm |
56px |
|
小初 |
36pt |
12.70mm |
48px |
|
一号 |
26pt |
9.17mm |
34.7px |
|
小一 |
24pt |
8.47mm |
32px |
|
二号 |
22pt |
7.76mm |
29.3px |
|
小二 |
18pt |
6.35mm |
24px |
|
三号 |
16pt |
5.64mm |
21.3px |
|
小三 |
15pt |
5.29mm |
20px |
|
四号 |
14pt |
4.94mm |
18.7px |
|
小四 |
12pt |
4.23mm |
16px |
|
五号 |
10.5pt |
3.70mm |
14px |
|
小五 |
9pt |
3.18mm |
12px |
|
六号 |
7.5pt |
2.56mm |
10px |
|
小六 |
6.5pt |
2.29mm |
8.7px |
|
七号 |
5.5pt |
1.94mm |
7.3px |
|
八号 |
5pt |
1.76mm |
6.7px |
|
值 |
含义 |
|
DMPAPER_LETTER |
字母,8 1/2- by 11 英寸 |
|
DMPAPER_LEGAL |
法律,8 1/2- by 14 英寸 |
|
DMPAPER_9X11 |
9- by 11 英寸工作表 |
|
DMPAPER_10X11 |
10- 11 英寸工作表 |
|
DMPAPER_10X14 |
10- 14 英寸工作表 |
|
DMPAPER_15X11 |
15- by 11 英寸工作表 |
|
DMPAPER_11X17 |
11- by 17 英寸工作表 |
|
DMPAPER_12X11 |
12- by 11 英寸工作表 |
|
DMPAPER_A2 |
A2 工作表,420 x 594 毫米 |
|
DMPAPER_A3 |
A3 工作表,297- by 420 毫米 |
|
DMPAPER_A3_EXTRA |
A3 额外 322 x 445 毫米 |
|
DMPAPER_A3_EXTRA_TRAVERSE |
A3 额外横向 322 x 445 毫米 |
|
DMPAPER_A3_ROTATED |
A3 旋转纸,420 乘 297 毫米 |
|
DMPAPER_A3_TRAVERSE |
A3 横向 297 x 420 毫米 |
|
DMPAPER_A4 |
A4 工作表,210- by 297 毫米 |
|
DMPAPER_A4_EXTRA |
A4 工作表,9.27 x 12.69 英寸 |
|
DMPAPER_A4_PLUS |
A4 Plus 210 x 330 毫米 |
|
DMPAPER_A4_ROTATED |
A4 旋转纸,297 乘 210 毫米 |
|
DMPAPER_A4SMALL |
A4 小纸,210 by 297 毫米 |
|
DMPAPER_A4_TRANSVERSE |
A4 横向 210 x 297 毫米 |
|
DMPAPER_A5 |
A5 工作表,148- by 210 毫米 |
|
DMPAPER_A5_EXTRA |
A5 额外 174 x 235 毫米 |
|
DMPAPER_A5_ROTATED |
A5 旋转纸,210 乘 148 毫米 |
|
DMPAPER_A5_TRANSVERSE |
A5 横向 148 x 210 毫米 |
|
DMPAPER_A6 |
A6 工作表,105- 乘 148 毫米 |
|
DMPAPER_A6_ROTATED |
A6 旋转纸,148 乘 105 毫米 |
|
DMPAPER_A_PLUS |
SuperA/A4 227 x 356 毫米 |
|
DMPAPER_B4 |
B4 工作表,250- by 354 毫米 |
|
DMPAPER_B4_JIS_ROTATED |
B4 (JIS) 旋转工作表,364 乘 257 毫米 |
|
DMPAPER_B5 |
B5 工作表,182- by 257 毫米纸 |
|
DMPAPER_B5_EXTRA |
B5 (ISO) 额外 201 x 276 毫米 |
|
DMPAPER_B5_JIS_ROTATED |
B5 (JIS) 旋转工作表,257 乘 182 毫米 |
|
DMPAPER_B6_JIS |
B6 (JIS) 纸,128 乘 182 毫米 |
|
DMPAPER_B6_JIS_ROTATED |
B6 (JIS) 旋转工作表,182 乘 128 毫米 |
|
DMPAPER_B_PLUS |
SuperB/A3 305 x 487 毫米 |
|
DMPAPER_CSHEET |
C 工作表,17- by 22 英寸 |
|
DMPAPER_DBL_JAPANESE_POSTCARD |
双日明信片,200 by 148 毫米 |
|
DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED |
双日本明信片旋转,148 乘 200 毫米 |
|
DMPAPER_DSHEET |
D 工作表,22 by 34 英寸 |
|
DMPAPER_ENV_9 |
#9 信封,3 7/8- by 8 7/8 英寸 |
|
DMPAPER_ENV_10 |
#10 信封,4 1/8- by 9 1/2 英寸 |
|
DMPAPER_ENV_11 |
#11 信封,4 1/2- by 10 3/8 英寸 |
|
DMPAPER_ENV_12 |
#12 信封,4 3/4- by 11 英寸 |
|
DMPAPER_ENV_14 |
#14 信封,5- by 11 1/2 英寸 |
|
DMPAPER_ENV_C5 |
C5 信封,162- by 229 毫米 |
|
DMPAPER_ENV_C3 |
C3 信封,324 by 458 毫米 |
|
DMPAPER_ENV_C4 |
C4 信封,229- by 324 毫米 |
|
DMPAPER_ENV_C6 |
C6 信封,114- by 162 毫米 |
|
DMPAPER_ENV_C65 |
C65 信封,114 by 229 毫米 |
|
DMPAPER_ENV_B4 |
B4 信封,250- by 353 毫米 |
|
DMPAPER_ENV_B5 |
B5 信封,176- by 250 毫米 |
|
DMPAPER_ENV_B6 |
B6 信封,176- by 125 毫米 |
|
DMPAPER_ENV_DL |
DL 信封,110- by 220 毫米 |
|
DMPAPER_ENV_INVITE |
信封邀请 220 x 220 mm |
|
DMPAPER_ENV_ITALY |
意大利信封,110- by 230 毫米 |
|
DMPAPER_ENV_MONARCH |
君主信封, 3 7/8- by 7 1/2 英寸 |
|
DMPAPER_ENV_PERSONAL |
6 3/4 信封,3 5/8- by 6 1/2 英寸 |
|
DMPAPER_ESHEET |
E 工作表,34 by 44 英寸 |
|
DMPAPER_EXECUTIVE |
行政, 7 1/4- by 10 1/2 英寸 |
|
DMPAPER_FANFOLD_US |
US Std Fanfold, 14 7/8- by 11 英寸 |
|
DMPAPER_FANFOLD_STD_GERMAN |
德国 Std Fanfold, 8 1/2- by 12 英寸 |
|
DMPAPER_FANFOLD_LGL_GERMAN |
德国法律范福尔德, 8 - by 13 英寸 |
|
DMPAPER_FOLIO |
Folio, 8 1/2- by 13 英寸纸 |
|
DMPAPER_ISO_B4 |
B4 (ISO) 250- by 353 毫米纸张 |
|
DMPAPER_JAPANESE_POSTCARD |
日本明信片,100-by 148 毫米 |
|
DMPAPER_JAPANESE_POSTCARD_ROTATED |
日本明信片旋转,148 乘 100 毫米 |
|
DMPAPER_JENV_CHOU3 |
日语信封周 #3 |
|
DMPAPER_JENV_CHOU3_ROTATED |
日本信封 Chou #3 旋转 |
|
DMPAPER_JENV_CHOU4 |
日语信封 Chou #4 |
|
DMPAPER_JENV_CHOU4_ROTATED |
日本信封周 #4 旋转 |
|
DMPAPER_JENV_KAKU2 |
日语信封 Kaku #2 |
|
DMPAPER_JENV_KAKU2_ROTATED |
日语信封 Kaku #2 旋转 |
|
DMPAPER_JENV_KAKU3 |
日语信封 Kaku #3 |
|
DMPAPER_JENV_KAKU3_ROTATED |
日语信封 Kaku #3 旋转 |
|
DMPAPER_JENV_YOU4 |
日语信封 You #4 |
|
DMPAPER_JENV_YOU4_ROTATED |
日语信封你 #4 旋转 |
|
DMPAPER_LAST |
DMPAPER_PENV_10_ROTATED |
|
DMPAPER_LEDGER |
账本,17 by 11 英寸 |
|
DMPAPER_LEGAL_EXTRA |
法定额外 9 1/2 x 15 英寸。 |
|
DMPAPER_LETTER_EXTRA |
字母额外 9 1/2 x 12 英寸。 |
|
DMPAPER_LETTER_EXTRA_TRANSVERSE |
字母额外横向 9 1/2 x 12 英寸。 |
|
DMPAPER_LETTER_ROTATED |
字母旋转 11 by 8 1/2 英寸 |
|
DMPAPER_LETTERSMALL |
小写字母,8 1/2- by 11 英寸 |
|
DMPAPER_LETTER_TRANSVERSE |
字母横向 8 1/2 x 11 英寸 |
|
DMPAPER_NOTE |
注意,8 1/2- by 11 英寸 |
|
DMPAPER_P16K |
中国 16K,146- by 215 毫米 |
|
DMPAPER_P16K_ROTATED |
中国 16K 旋转,215 by 146 毫米 |
|
DMPAPER_P32K |
中国 32K,97- by 151 毫米 |
|
DMPAPER_P32K_ROTATED |
中国 32K 旋转,151 乘 97 毫米 |
|
DMPAPER_P32KBIG |
中国 32K (大) 97- 乘 151 毫米 |
|
DMPAPER_P32KBIG_ROTATED |
中国 32K (大) 旋转,151- by 97 毫米 |
|
DMPAPER_PENV_1 |
中国信封 #1, 102- by 165 毫米 |
|
DMPAPER_PENV_1_ROTATED |
中国信封 #1 旋转,165- x 102 毫米 |
|
DMPAPER_PENV_2 |
中国信封 #2, 102- by 176 毫米 |
|
DMPAPER_PENV_2_ROTATED |
中国信封 #2 旋转,176- x 102 毫米 |
|
DMPAPER_PENV_3 |
中国信封 #3, 125- by 176 毫米 |
|
DMPAPER_PENV_3_ROTATED |
中国信封 #3 旋转,176- x 125 毫米 |
|
DMPAPER_PENV_4 |
中国信封 #4, 110- by 208 毫米 |
|
DMPAPER_PENV_4_ROTATED |
中国信封 #4 旋转, 208- by 110 毫米 |
|
DMPAPER_PENV_5 |
中国信封 #5, 110- by 220 毫米 |
|
DMPAPER_PENV_5_ROTATED |
中国信封 #5 旋转, 220- x 110 毫米 |
|
DMPAPER_PENV_6 |
中国信封 #6, 120- by 230 毫米 |
|
DMPAPER_PENV_6_ROTATED |
中国信封 #6 旋转, 230- by 120 毫米 |
|
DMPAPER_PENV_7 |
中国信封 #7, 160- by 230 毫米 |
|
DMPAPER_PENV_7_ROTATED |
中国信封 #7 旋转,230- x 160 毫米 |
|
DMPAPER_PENV_8 |
中国信封 #8,120- x 309 毫米 |
|
DMPAPER_PENV_8_ROTATED |
中国信封 #8 旋转,309- x 120 毫米 |
|
DMPAPER_PENV_9 |
中国信封 #9,229- x 324 毫米 |
|
DMPAPER_PENV_9_ROTATED |
中国信封 #9 旋转,324 x 229 毫米 |
|
DMPAPER_PENV_10 |
中国信封 #10,324- x 458 毫米 |
|
DMPAPER_PENV_10_ROTATED |
中国信封 #10 旋转,458- x 324 毫米 |
|
DMPAPER_QUARTO |
Quarto,215 by 275 毫米纸 |
|
DMPAPER_STATEMENT |
语句,5 1/2- by 8 1/2 英寸 |
|
DMPAPER_TABLOID |
小报,11- 乘 17 英寸 |
|
DMPAPER_TABLOID_EXTRA |
小报,11.69 x 18 英寸 |