BizXML

(v2.3)

 

前言:2.0版本重大改变和调整的地方是界面排版,旨在对各类设备屏幕大小的兼容,包括PC、手机、平板客户端以及浏览器方式访问的界面大小屏幕的自动适应,同时增加表格逻辑(xLogic)及Javascript的支持。

 

目录

1.     概述... 5

1.1.          什么是BizXML.. 5

1.2.          一个简单实例... 5

1.3.          BizXML架构... 6

1.4.          BizXML界面样例... 7

1.4.1.            PC客户端... 8

1.4.2.            手机客户端... 13

1.4.3.            PC浏览器... 13

1.4.4.            手机浏览器访问... 14

2.     BizXML脚本基本规则... 15

2.1.          基本规则... 15

2.2.          框架基本属性... 16

2.3.          权限与访问控制... 16

2.4.          开发者模式... 17

2.5.          包含文件(Include) 18

2.6.          自激发事件(EventTriggers) 18

2.7.          文件与目录操作(File and Dir) 19

2.7.1.       浏览文件“BrowseFile”. 19

2.7.2.       发送文件“SendFile”. 19

2.7.3.       接收文件“GetFile”. 20

2.7.4.       目录操作管理... 20

2.7.5.       文件过滤筛选规则... 20

2.8.          即时消息(IM) 20

2.9.          执行第三方程序(Exec) 21

2.10.        数据源(库)访问(DbDetails)... 21

2.10.1.     直接SQL语句方式... 21

2.10.2.     直接SQL格式方式... 22

2.10.3.     数据更新... 23

2.10.4.     调用存储过程(暂不支持返回值)... 23

2.10.5.     翻页实现... 23

2.10.6.     数据导出... 23

2.10.7.     访问NoSQL数据库... 24

2.10.8.     访问IOT系统... 25

2.11.        动态显示/隐藏控件(SetVisible) 25

2.12.        动态禁用/启用控件(SetEnabled) 25

2.13.        事件触发(Submit) 26

2.14.        事件响应(On…) 26

2.15.        变量(Var) 27

2.16.        多语言支持... 28

2.17.        特色功能... 29

2.17.1.         复位(GroupBox复位)... 29

2.17.2.         搜索(GroupBox搜索)... 29

2.17.3.         打印/列印(GroupBox列印)... 29

2.17.4.         数据统计MDX(ListCtrl数据统计)... 29

2.17.5.         三方接口(MagicCtrl第三方软件方法接口)... 29

3.     BizXML控件... 30

3.1.          概述... 30

3.2.          Button按钮... 31

3.3.          CheckBox. 32

3.4.          ComboBox. 32

3.4.1.            属性... 32

3.4.2.            赋值... 33

3.4.3.            可处理的function. 33

3.4.4.            数据遍历... 34

3.4.5.            事件的触发与处理... 34

3.5.          GroupBox. 35

3.5.1.            可处理的function. 36

3.5.2.            复位(GroupBox复位)... 36

3.5.3.            搜索(GroupBox搜索)... 36

3.5.4.            打印/列印(GroupBox列印)... 37

3.6.          IpAddress (Deprecated)... 38

3.7.          Label 38

3.8.          ListCtrl列表... 38

3.8.1.            属性... 38

3.8.2.            ListCtrl控件子元素... 39

3.8.3.            可处理的function. 40

3.8.4.            数据获取与显示... 40

3.8.5.            数据遍历... 41

3.8.6.            数据导入导出... 41

3.8.7.            数据统计特性(多维数据矩阵MDX)... 41

3.8.8.            数据动态字段... 47

3.8.9.            菜单(operator)... 48

3.8.10.         筛选突出显示... 49

3.9.          TextBox. 49

3.9.1.            可处理的function. 51

3.10.        DateTime. 51

3.10.1.         Format(格式)字符串说明... 52

3.10.2.         赋值... 53

3.10.3.         事件处理... 53

3.11.        WebBrowser 53

3.12.        RadioButton. 55

3.13.        SpinButton. 56

3.14.        TrackBar 56

3.15.        GraphChart 56

3.16.        ListBox. 58

3.17.        BR.. 58

3.18.        TAB.. 58

3.19.        Calendar 58

3.20.        MagicCtrl 59

3.20.1.         属性... 60

3.20.2.         响应事件... 61

3.20.3.         外部接口... 61

4.     事件处理与流程控制... 64

4.1.          IF条件... 64

4.2.          Notify. 64

4.3.          Alert 64

4.4.          Info. 64

4.5.          Confirm.. 64

4.6.          Submit 64

4.7.          Assign. 65

4.8.          SetEnabled. 65

4.9.          SetVisible. 65

4.10.        Sleep. 66

4.11.        OnTBNotifierRtn. 66

4.12.        OnActivate. 66

4.13.        OnChanged. 66

4.14.        EvalTbl(自定义业务逻辑xLogic)... 67

4.15.        JS示例(仅控件赋值)... 70

5.     布局与排版... 71

6.     MQTT.. 72

7.     开放的接口... 73

7.1.          事件及参数... 73

7.2.          调用框架内部功能与模块... 73

8.     SQL访问执行说明... 75

9.     注意事项... 76

10.           附录... 77

10.1.        Demo代码文件... 77

10.2.        外部接口... 77

10.2.1.         EXCEL自动化xExcel接口... 77

10.2.2.         生成二维码/条码... 78

10.2.3.         扫描二维码/条码... 81

10.3.        字体与大小... 81

10.4.        打印纸张尺寸表... 82

 

 

1.      概述

 

背景:无论是数字化、信息化还是互联网+,产品的标准化设计与用户的个性化应用需求始终碰撞着,任何标准化的产品无论设计得多么的完善也无法满足用户的个性化需求,而用户拿到系统后第一件事就是提出个性化定制的要求,界面定制调整、业务流程修改、业务逻辑变更等从系统上线开始就无休止的持续下去,而这一切基本都需要厂商、集成商研发工程师参与其中,周期长、难度大、繁琐。

 

本文档详细描述了BizXML,即业务扩展标记语言(Business XML),第一章介绍它的背景、基本概念和用途;第二章介绍BizXML的框架结构它们的解释执行机制BIA(BizXML Interpretation Algorithm);第三章介绍各类控件元素的使用及语法;第四章介绍事件处理及相关逻辑控制;第五章介绍界面的动态排版及特性;第六章开放式事件接口;第七章节介绍了SQL执行的规则。

1.1.  什么是BizXML

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的灵活性可以让每个用户获得的服务与数据也不同,可用操作也不同,使得业务更灵活方便,特别是在运营服务中更彰显智能本色。

1.2.  一个简单实例

一个简单的例子,下面是一个应用页面的代码,包含两个组件(桔色文字,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”后点击“预览”将将弹出“客户下单”窗口,这个窗口及内容就是由复制进来的代码创建产生的效果。

20230809_101001

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

 

 

1.3.  BizXML架构

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的支持。

1.4.  BizXML界面样例

下面的图片是BizXML定制在不同平台设备上呈现出来的界面,分别是PC、手机、浏览器(PC、手机浏览器)。

1.4.1.     PC客户端

20210408_153354

gx20210603_111348-

20211025_092751

1574393187863923

1574392973767962

1574389899011559

1574392120440468

1569828768095821

 

1574315326519745

1574392291201375.png

1.4.2.     手机客户端

inv_android  Screenshot_2019-10-27-15-10-16.png  Screenshot_2019-11-22-10-27-53.png

1.4.3.     PC浏览器

1.4.4.     手机浏览器访问

Screenshot_2019-12-22-16-40-56  Screenshot_2019-12-22-16-27-43  Screenshot_2019-12-22-16-28-37

 

2.      BizXML脚本基本规则

2.1.  基本规则

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]。

 

2.2.  框架基本属性

框架及窗体的基本属性隶属于<BXML></BXML>

整个框架的第一默认字体("宋体",95),若不可用则使用第二默认(“MS Sans Serif”,80)、第三默认字体(“MicroSoft Sans Serif”,90),第一默认字体创建失败则创建第二默认字体,由于后者比前者小,经调整大小,二者实际大小相当。用户可以指定自己的字体,如<BXML font-size="80" font-family="MicroSoft Sans Serif">(参见尺寸表)。

 

2.3.  权限与访问控制

用户相关参数及控制(如权限控制)也可以额外通过页面嵌套来实现,如下所示,在其所属的窗体布局(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>

 

2.4.  开发者模式

开发者模式,开发者可以在该模式启用后查看控件应用代码、控件属性、参变量及事件触发序列等,也可以在线修改属性来调整修改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。

 

2.5.  包含文件(Include)

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;每个文档只允许一个根元素。

 

2.6.  自激发事件(EventTriggers)

自激发事件EventTriggers

<EventTriggers>

<EventTrigger name="name" dest="ctrl" oneshot="0" interval="10"></EventTrigger>

</EventTriggers>

属性名

说明

name

系统自激发事件名

dest

事件影响的控件名称

oneshot

是否为单次激发,置为0则周期性激发,间隔为interval值(秒)。主要用于button触发click事件。

 

 

2.7.  文件与目录操作(File and Dir)

2.7.1.  浏览文件“BrowseFile”

采用“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”后点击“预览”将弹出窗口显示文本框及“浏览文件”按钮,点击按钮将打开资源管理器选择文件,选中后该文件路径将填入左边文本框中。

20230809_152039

2.7.2.  发送文件“SendFile”

采用“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

(服务端有效)文件名

 

2.7.3.  接收文件“GetFile”

采用“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

(服务端有效)文件名

 

2.7.4.  目录操作管理

目录的管理操作是将一个目录当作一个数据库表来操作。

例如获取“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选中的文件。

2.7.5.  文件过滤筛选规则

文件过滤,每两个“|”为一组,第一个为用于显示的文件类型字符串,第二个用于筛选该类型的字符串,一组里若多个类型则内部用“;”分隔开,结束位置为双“|”。下面例子将使用了三组类型,分别是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||

2.7.6.  文本转语音(TTS)

使用接收文件GetFile并将“dir”参数设置为“tts”,可将query的文本内容转换为语音并保存在指定的文件里(第一个参数),“GetFile:a.wav,dir=tts,query=%{DirList[0]},localdir=”将列表框选中行第一列的文字转换为语音报错在a.wav并传送给客户端供播放[完整代码见demo文件之ctrls/ctrls_filemanage.xml]。

2.7.7.  上传ZIP文件并解压至指定目录

使用上传文件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 &quot;%{datapath}\%{_upload_file_name}&quot; &quot;%{datapath}&quot;"/>

2.7.8.  AI语音识别(调用服务端接口)

使用上传文件SendFile并设定itfname、codebase、engine、sessionid等参数如下,即可将上传的WAV文件转换为文字:[完整代码见demo文件之ctrls/demo_ai.xml]

itfname=ai_itf,codebase=XBizAIBridge.dll,engine=xASR_cs,sessionid=stt_en_us

2.8.  即时消息(IM)

打开消息窗口发送即时消息。eg:

<Button Name="sendMsg" Text="发消息" Size="50,20" tooltip="打开消息窗口">

<OnClick><assign name="topmost" expr="nis3ucs:im|%{UserList[user_name]}"/>

</OnClick></Button>

打开消息窗口向UserList选中的记录参数user_name的用户发送消息。

android03

 

2.9.  执行第三方程序(Exec)

打开其他程序,使用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>

 

2.10.      数据源(库)访问(DbDetails)

BizXML的数据源可以是数据库,如Mysql、Sqlite、MSSQL等等,也可以是NoSql数据库、config(ini)文件、文件目录、MQTT/IOT、AI_ITF,都可以使用SQL语法来访问,后面将会详细介绍。

2.10.1.  直接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>

 

2.10.2.  直接SQL格式方式

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"即可。

 

2.10.3.  数据更新

用户可以通过其他的事件来触发相应的控件访问数据库,传递过来的参数遵循替换法则,即传递过来了某个参数如<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>

2.10.4.  调用存储过程(暂不支持返回值)

call updatestatus(17)

调用函数(暂不支持返回值)

exec QT_Fiber_Evt_Compare '%{Address}', '%{fibernumber}','%{Wave}','%{DataPath}'

2.10.5.  翻页实现

在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)">

2.10.6.  数据导出

 “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>

2.10.7.  访问NoSQL数据库

将“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发出的消息列表,如下图所示。

20230810_093926

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}'

 

2.10.8.  访问IOT系统

将“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>

2.11.      动态显示/隐藏控件(SetVisible)

<SetVisible name="insertp" Visible="0"/>                隐藏控件insertp

<SetVisible name="insertp" Visible="1"/>                显示控件insertp

 

2.12.      动态禁用/启用控件(SetEnabled)

<SetEnabled name="TB_num" enabled="0"/>                   禁用控件TB_num

<SetEnabled name="TB_num" enabled="1"/>                   启用控件TB_num

被禁用的控件不能做任何操作,如TextBox禁用后连复制等都不允许。

 

2.13.      事件触发(Submit)

<submit next="insert" function="click"/>

next——接受事件的控件

function——事件名称(须为接受控件所能处理的事件名称),取值为”onok”、”oncancel”且当前窗口为”popup”时将关闭当前窗口。

TextBox:enchange,enterkey

Combobox:editchange, selchange,selendok; resetcontent

Button:click

ListCtrl:savetofile; import; resetcontent

 

2.14.      事件响应(On…)

每个页面进入时会激发当前页面的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]}&lt;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>

 

2.15.      变量(Var)

系统的变量分如下几类:

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值。他们的生存期为控件内容未改变(与该页面切换或是否激活无关),即一旦内容发生改变,这些变量就会发生改变。

 

2.16.      多语言支持

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的显示文字。

 

2.17.      特色功能

2.17.1.   复位(GroupBox复位)

数据的多控件复位可通过GroupBox来处理,发送给GroupBox的复位请求会自动传递给其子空间,包括子GroupBox,详见GroupBox复位;

2.17.2.   搜索(GroupBox搜索)

搜索查询功能通过GroupBox Search来提供了诸多便利,,详见GroupBox搜索;

2.17.3.   打印/列印(GroupBox列印)

打印功能通过GroupBox来提供,基于GroupBox设定打印区域,详见GroupBox列印

2.17.4.   数据统计MDX(ListCtrl数据统计)

ListCtrl提供了丰富的数据统计功能,如MDX等,详见ListCtrl数据统计

2.17.5.   三方接口(MagicCtrl第三方软件方法接口)

MagicCtrl提供了第三方软件接口、算法等方法的类COM接口,详见MagicCtrl接口

……

 

3.      BizXML控件

3.1.  概述

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”后点击“预览”将弹出窗口显示文本:

20230810_142213

控件部分属性值如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值比例决定),

print

打印控制参数(输出至打印机),1:打印输出,0:不打印;默认1

printfixheight

打印控制参数(输出至打印机),是否按设定高度打印表,限定区域打印,不影响后续控件设定的打印位置,默认为真;若设为否,则打印实际数据后根据实际打印的高度调整后续控件打印位置。

 

3.2.  Button按钮

最常用的控件之一,它主要接受按钮点击处理,事件方法可在属性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语句。

 

3.3.  CheckBox

<CheckBox Name="activeStatus" Size="200, 20" Text="启用" Checked="true"></CheckBox>

该控件可接受处理事件,相关逻辑定义于子元素OnChecked内。

属性名

说明

Checked

初始化时是否checked

CheckBox控件子元素

标签名

说明

OnChecked

OnChecked事件处理方式;

赋值Check "CheckBox3": <assign name="CheckBox3" expr="1"/>

3.4.  ComboBox

ComboBox下拉列表选择控件

<ComboBox name="qid" size="120,100" tooltip="问题题号" SelectedIndex="0" OnLoad="init"></ComboBox>

3.4.1.     属性

下拉选择框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定义其访问数据的方式逻辑。

3.4.2.     赋值

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"/>

3.4.3.     可处理的function

标签名

说明

reset

复位控件至初始化状态

resetcontent

清空控件数据

foreach

对每行数据执行相同的操作,即数据遍历

EditChange

对该控件触发该事件

SELCHANGE

对该控件触发该事件

SELENDOK

对该控件触发该事件

3.4.4.     数据遍历

项的遍历通过foreach来实现,eg:对名为“qid”的Combobox遍历(依次取每个下拉选项的id变量)

<foreach><assign name="astr1" expr="%{qid[id]};-"/></foreach>

<Submit next="qid" namelist="foreach" function="foreach"/>

 

3.4.5.     事件的触发与处理

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>

 

3.5.  GroupBox

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参数计算。

3.5.1.     可处理的function

标签名

说明

reset

复位子控件(含子控件的子控件)至初始化状态

resetcontent

清空子控件(含子控件的子控件)数据

search

提供GroupBox搜索

print

提供打印功能

 

3.5.2.     复位(GroupBox复位)

复位分两种,一种是复位数据至初始状态,function属性置为“reset”,GroupBox内的所有控件(含子Groupbox的控件)均复位,初始值的设为初始值,需初始读取数据库的以初始数据库方式读取数据初始化,如:

<submit next="GBDEDITbizdep" function="reset"/>;

另一种只是将数据清空,置空,如

<submit next="GBDEDITbizdep" function="resetcontent"/>。

 

3.5.3.     搜索(GroupBox搜索)

为了实现高效的搜索功能及简化代码,设计了该集合式搜索方法,通过将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

 

 

 

 

3.5.4.     打印/列印(GroupBox列印)

打印/列印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用于调整边距,可正可负,负数相对向左向上偏移对应的单位。

 

3.6.  IpAddress (Deprecated)

该控件在手机版本、Web不支持。

<IpAddress Name="IpAddress1" Size="200, 20" IP="192.168.0.10"></IpAddress>

 

3.7.  Label

<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”的子元素。

 

3.8.  ListCtrl列表

列表控件也挺常用。

3.8.1.     属性

属性名

说明

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

是否按设定高度打印表,限定区域打印,不影响后续控件设定的打印位置,默认为真;若设为否,则打印实际数据后根据实际打印的高度调整后续控件打印位置。

 

3.8.2.     ListCtrl控件子元素

标签名

说明

DbDetails

数据源及参数定义,

operator

弹出式菜单及处理定义

Editor

可编辑列的定义

OnClick

点击事件定义

 

 

 

 

 

3.8.3.     可处理的function

标签名

说明

reset

复位控件至初始化状态

resetcontent

清空控件数据

initial

提供初始化查询,即按控件初始化的条件进行查询显示数据

foreach

对每行数据执行相同的操作,即数据遍历

setfilter

筛选突出显示支持

removefilter

筛选突出显示支持

setsel

选中指定行

move

向上/向下移动指定行

ExchangeData

接收其他控件传递的数据

copy

复制选中行的指定列columns数据,多列以“,”分隔开,columns为空时复制整行。

load

从文件加载数据,支持CSV(含增强CSV)格式。

datadump

数据保存至某临时文件

datareload

从临时文件加载数据

savetofile

保存至文件,即导出数据

import

导入数据

BizXMLToolInit

BizTool支持,初始化

BizXMLTest

BizTool支持,BizTool预览

 

3.8.4.     数据获取与显示

一般以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所赋值亦将消失。

3.8.5.     数据遍历

行内容的遍历通过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置为其他值则执行其值内容;

 

3.8.6.     数据导入导出

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"/>

 

3.8.7.     数据统计特性(多维数据矩阵MDX)

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>

20230808_104025

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

20230808_104143

<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的代码复制预览显示的下面的数据:

20230808_104504

仔细对比下显示的结果的区别,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&gt;=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 &gt;=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字段,其他隐藏。

3.8.8.     数据动态字段

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 &gt;= UNIX_TIMESTAMP('%{DtStart}') and dt &lt; 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 &gt;= UNIX_TIMESTAMP('%{DtStart}') and dt &lt; 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

3.8.9.     菜单(operator)

<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子元素);。

3.8.10.   筛选突出显示

对指定列的数值按配置参数进行筛选突出显示,配置参数定义为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"/>

3.9.  TextBox

<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

&lt;BR/&gt; 保存时将回车符用<BR/>替换,显示时显示回车(目前系统不允许回车键,默认自动替换为空字符,显示空字符)

EscapeStringTab

"&lt;TAB/&gt;保存时将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了。

3.9.1.     可处理的function

标签名

说明

reset

复位控件至初始化状态

resetcontent

清空控件数据

initial

初始化控件,同reset

 

3.10.      DateTime

<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数值

3.10.1.   Format(格式)字符串说明

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个星期;。

3.10.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这种表述方式最大支持为天,最小为秒]。

3.10.3.   事件处理

该控件可接受处理的事件为OnChanged,处理逻辑为子元素OnChanged。

eg: <OnChanged><assign name="modified" expr="%{created};100:0:0:0"/></OnChanged>

 

3.11.      WebBrowser

<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>

 

3.12.      RadioButton

 <RadioButton Name="RadioButton1" Size="120,20" Text="Radio Option 1" Checked="false"/>

该控件可接受处理OnChecked事件,同一组控件只需设置单个控件的OnChecked事件处理即可。

属性名

说明

Checked

初始化时是否checked

RadioManager

Radiobutton组的主Radiobutton

RadioButton控件子元素

标签名

说明

OnChecked

OnChecked事件处理方式;

 

3.13.      SpinButton

数字增减按钮

<SpinButton Name="SpinButton1" Size="20,20" Minimum="0" Maximum="100" Value="50"/>

属性名

说明

Minimum

SpinButton的range最大值

Maximum

SpinButton的range最小值

Value

初始化值

 

3.14.      TrackBar

<TrackBar Name="TrackBar1" Size="150,20" Minimum="0" Maximum="100" Value="50" TickFrequency="10"></TrackBar>

属性名

说明

Minimum

TrackBar的range最大值

Maximum

TrackBar的range最小值

TickFrequency

TrackBar显示标尺的刻度间隔

Value

初始化值

 

3.15.      GraphChart

<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

bar_line

pie

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>

 

3.16.      ListBox

< 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

控件选项数目

 

3.17.      BR

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/>

3.18.      TAB

TAB:控件间距,用于自动排版,属性有:

Size,定义为Size="x,y";x定义相对于左边界(0)右移宽度,y目前无效,当x未定义表示size不做修改而使用上一次的定义值。系统默认为<TAB/>即默认为(20,0),新行第一个控件的默认位置LocationX为20,或其它指定值,该值一旦修改,该页面的<BR/>将采用该新值直至被修改如<TAB Size="30,0"/>(新行第一控件右移30单位,下移上一次被修改的下移单位)。

<TAB/>

3.19.      Calendar

<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"/>

 

3.20.      MagicCtrl

正如控件名称,它是一个特别的控件,可以呈现不同的控件类型和效果,可以用来显示文本,也可以是超链接,图片显示也可以是按钮,可以闪烁,可以淡入淡出等等,可以用作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

3.20.1.   属性

 [注:下表中的标识名(大小写不敏感)应该保留而不应用于显示的内容的一部分]

属性名

说明

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”参数呈现。

3.20.2.   响应事件

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>

3.20.3.   外部接口

引入采用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"/>

4.      事件处理与流程控制

4.1.  IF条件

<if cond="cond1">……<elseif cond="cond2"/>…….<else/>……</if>

<if cond="%{CB_resvStatus[id]}==1">判断控件CB_resvStatus的id变量是否为“1”,当id为“1”判为真执行内部语句,否则执行elseif条件判断或else语句。

Cond表达式可参考javascript真伪语法,可组合使用&& || () 等等。

4.2.  Notify

 <notify/>在电脑状态栏弹出提示框,需用户点击方可消失,点击后触发“OnTBNotifierRtn”事件。如提示新消息,未处理事务等。

属性:next关联的控件名,expr提示的内容。

例如:

<notify next="tst" expr="您有新预定%{resv.resvNew[SnapShot]}"/>。

4.3.  Alert

<alert/>警示,提醒,需用户点击。

属性:next关联的控件名,expr提示的内容。

例如:

<alert next="CB_roomAvlb" expr="%{lb_roomno}不能为空"/>

4.4.  Info

<info/>在窗体中央位置显示提示框,几秒后自动消失

属性:next关联的控件名,expr提示的内容。

例如

<info next="tst" expr="操作成功"/>

4.5.  Confirm

<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>

4.6.  Submit

<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"/>。

4.7.  Assign

<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 "/>

4.8.  SetEnabled

<SetEnabled name="TB_num" enabled="0"/>            禁用控件TB_num

<SetEnabled name="TB_num" enabled="1"/>            启用控件TB_num

被禁用的控件不能做任何操作,如TextBox禁用后连复制等都不允许。

4.9.  SetVisible

<SetVisible name="insertp" Visible="0"/>           隐藏控件insertp

<SetVisible name="insertp" Visible="1"/>           显示控件insertp

4.10.      Sleep

<Sleep Interval="10"/>

操作在此处暂停,Interval取值范围为10ms~10000ms(10毫秒~10秒),超出该范围将被就近压缩至该范围内。

4.11.      OnTBNotifierRtn

该事件源于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>

4.12.      OnActivate

页面切换时被激活的页面将触发该事件,用于处理相关事件,该元素的父元素可以使〈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>

4.13.      OnChanged

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>

4.14.      EvalTbl(自定义业务逻辑xLogic)

EvalTbl是BizXML的独特设计的基于表格的逻辑算法(同时提供JavaScript支持,注意:js里“>”“<”应使用“&gt;”“&lt;”代替,或使用“<![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年以上为消费

xlogic

逻辑代码(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>

4.15.      JS示例(仅控件赋值)

<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>

5.      布局与排版

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/>组群,参见相关元素的使用说明。

6.      MQTT

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" />

 

7.      开放的接口

7.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>

7.2.  调用框架内部功能与模块

可以调用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>

…….

 

8.      SQL访问执行说明

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}';

 

 

 

9.      注意事项

assign 之function,尤其是在combobox,易漏掉Setsel

 

10. 附录

 

10.1.      Demo代码文件

文中提到的Demo代码如无特殊说明均为下xPlusServer(3UCS/Server)安装目录下文件夹layout\demo\及下级相关文件夹,例如D:\Program Files (x86)\3UCS\Server\layout\demo

10.2.      外部接口

10.2.1.   EXCEL自动化xExcel接口

<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"/>

 

10.2.2.   生成二维码/条码

<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

10.2.3.   扫描二维码/条码

<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>

 

10.3.      字体与大小

中文字号

英文字号(磅)

毫米

像素

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

 

10.4.      打印纸张尺寸表

值

含义

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 英寸