BizXML

v2.0

 

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

 

目录

1.     概述... 4

1.1.          什么是BizXML.. 4

1.2.          BizXML架构... 4

1.3.          BizXML界面样例... 4

1.4.          实例解析... 6

2.     BizXML解析基本规则... 7

2.1.          基本规则... 7

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

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

2.4.          包含文件... 8

2.5.          自激发事件... 8

2.6.          文件与目录操作... 8

2.7.          即时消息... 9

2.8.          执行第三方程序... 9

2.9.          数据库访问... 10

2.10.        动态显示/隐藏控件... 11

2.11.        动态禁用/启用控件... 11

2.12.        事件触发... 11

2.13.        事件响应... 11

2.14.        变量... 12

2.15.        多语言支持... 12

3.     BizXML控件使用... 12

3.1.          Button按钮... 12

3.2.          CheckBox. 12

3.3.          ComboBox. 12

3.4.          GroupBox. 12

3.5.          IpAddress Deprecated... 12

3.6.          Label 12

3.7.          ListCtrl... 12

3.8.          TextBox. 12

3.9.          DateTime. 12

3.10.        WebBrowser 12

3.11.        RadioButton. 12

3.12.        SpinButton. 12

3.13.        TrackBar 12

3.14.        GraphChart 12

3.15.        ListBox. 12

3.16.        BR.. 12

3.17.        TAB.. 12

3.18.        Calendar 12

3.19.        MagicCtrl 12

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

4.1.          IF条件... 12

4.2.          Notify. 12

4.3.          Alert 12

4.4.          Info. 12

4.5.          Confirm.. 12

4.6.          Submit 12

4.7.          Assign. 12

4.8.          SetEnabled. 12

4.9.          SetVisible. 12

4.10.        OnTBNotifierRtn. 12

4.11.        OnActivate. 12

4.12.        OnChanged. 12

4.13.        EvalTbl(自定义业务逻辑xLogic... 12

5.     布局与排版... 12

6.     开放的接口... 12

6.1.          事件及参数... 12

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

7.     SQL访问执行说明... 12

 

 

1.      概述

 

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

 

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

1.1.  什么是BizXML

BizXMLBusiness XML,以将应用设计从软件开发中分离出来的软件架构作为核心思想,业务应用前沿的设计工程师无需软件开发能力,而是发挥自己在业务应用方面的专长,深耕于业务关系与逻辑控制等业务息息相关的内容,或使用BizXML工具或简单编写几行BizXML脚本即可实现实用的应用,由于无需编译程序,应用设计所见即所得,所以业务应用上线可以加快90%以上。BizXML解析执行平台则由专业的软件开发人员站在平台设计的高度遵循BizXML标准来设计开发。

BizXML是一套完整的业务设计规范,类似于VoiceXML解决IVR个性化灵活定制的问题,BizXML实现的是Business业务界面流程逻辑的个性化应用定制,适合于包括但不仅限于客户关系管理系统(CRM)、呼叫中心业务及报表系统、数据库管理系统、办公自动化(OA)、企业资源管理(ERP)、商业流程管理(BPM)、知识库、企业信息化、数据报表、分析、数据集成、数据仓储等等业务应用,极大地解放了一大批专业研发人员无休止的个性化定制工作,也给用户最大限度的便利、灵活和自由。

BizXML最早出现于2007年,作为一种基于XML对话的设计语言,它的出现是为了简化3UCS一个名为3uBiz3UCS Business Intelligence)项目中业务流程/逻辑灵活定制的开发过程。经过3UCSBizXML支持者及相关开发团队共同努力已日期完善,并且结合3UCS融合通信平台可获得智能多媒体通讯如VoIP、统一通信、互动联络、视频会议、即时通讯等诸多便利。

BizXML的出现完美的解决了标准化平台设计与个性化应用需求的矛盾,它创造性地将个性化定制简化到极致,以至于用户无需专业软件开发基础即可在超短时间内自行完成定制适合自己行业应用需求的软件,也就是BizXML的个性化工作可以开放给用户自己,无需专业的研发人员的参与。

BizXML智能业务提供灵活的动态界面设计支持,用户界面的布局及内容由用户登录系统时返回的界面设计模版决定(XML),因此每个用户登录后显示的界面都可以不尽相同,可用操作也可不一样,每个用户不同时间不同地点登录也可以显示不同的界面。当然每个用户登录界面也可以相同,但BizXML的灵活性可以让每个用户获得的服务与数据也不同,可用操作也不同,使得业务更灵活方便,特别是在运营服务中更彰显智能本色。

 

1.2.  BizXML架构

BizXML要求平台采用C/S架构,但又可以提供类B/S架构的访问模式,由服务器(Biz Server)、客户机(BizFrm)、BizXML脚本(layout)三部分组成。

服务器端Biz Server运行于服务器,接受用户登录授权及相关管理与操作,同位于服务器的还有BizXML脚本(layout),默认位于服务器安装目录下的layout文件夹中,亦可根据自己的需求设置,它们由一个或一系列XML文件组成,用于定义不同用户窗体界面布局、业务流程逻辑等信息。它们在服务端共同提供用户信息、权限布局管理及数据库访问等支撑。当用户登录时系统根据预设的用户信息给客户机返回响应得界面及逻辑脚本供显示及用户输入处理。在数据库方面要求支持支持常用数据库,如MySQLMSSQLOracleIBM_DB2DBASEParadoxExcelAsciiFoxproMSAccesspostgreSQL等等。

客户机端(BizFrm)运行于用户电脑、智能终端(智能手机、平板电脑等),显示业务界面及内容、接受用户输入并做出响应且与服务器交互完成业务逻辑处理输出结果给用户。

3UCS业务系统为例,其服务器组件为i3uBI.exe,初始配置文件为i3uBI.ini3UCS Server安装根目录下),该配置数据库为i3u.mdb,若使用MSSql参考i3uBI(mssql).ini配置即可。其中下面的语句是取登录用户的密码及窗口布局(缺省返回i3u.xml)的,您也可以增加提取更多的项,如用户组、权限什么的,这些参数都会缓存,在以后的操作中都可以使用。

authQuery=select user_pwd as 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提供了NISUi3u等版本给与对BizXML的支持。

1.3.  BizXML界面样例

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

 

  

 

1.4.  实例解析

业务逻辑脚本语法经过多次优化使得设计更加的简单便捷,节省了大量的人力、缩短了二次开发的周期,下面的界面及脚本就是角色配置与管理的界面及对应的脚本内容。

一个简单的例子,下面是一个应用页面的代码,包含两个组件(桔色文字,TextBoxButton),实现二维码/条码的扫描并将扫描结果填入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" id="orderinfo" 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><OnChanged></OnChanged><OnActivate></OnActivate></WndTap>

 

2.      BizXML解析基本规则

2.1.  基本规则

BizXML的根元素为BXML,故所有有效代码都封闭于<BXML></BXML>之间,所以根文件的元素必须存在<BXML></BXML>方可正常解析,被包含的文件不做此要求。

BizXML的直属元素可以是DbDetailsEventHandlersEventTriggersWndTapsVar

DbDetails用来定义数据库访问的相关信息,如数据库类型、主机位置、初始数据库名等等,可以缺省,缺省时共享系统定义的数据库连接。

EventHandlers用于定义外部事件的处理,如电话呼入、接通、挂断等等。

EventTriggers用于定义系统自触发事件,如定时器,周期性出发某类操作。

WndTaps便是用于显示或操作的窗体界面,即页面,一个窗体可以包含窗体组(WndTaps),也可以是单个窗体(WndTap)。

Var(此处)为全局变量定义,定义时可以直接使用全局变量名,但赋值、读取时需使用前缀“session”或“app”,例如<var name="appname" expr="3ucs"/>,但读取时应为%{session. appname }%{app. appname }

<WndTaps></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_mobiletb_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)根页面(egmylayout.xml)里定义其数据库连接参数,同时若出现config定义,系统自动读取新的相关参数信息,若该参数中含有新的窗体布局(layout则选用新的定义(例如,若下面的config返回的参数中含有有效的layout数据,则将终止当前layout的载入而是载入新的layout信息,此时位于本配置区域的“purview”亦失效,不会被访问,因此须在返回的新的layout里配置purvieweg<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定义,需返回modulepurview值,跟layout类似,当用户脚本(BizXML)中存在purview配置时将覆盖先前出现的定义(即无论是i3ubi的配置还是先前bizxml脚本的配置都对当前用户无效)。Modulepurview值为真时对应模块将开放给该用户访问,此处的modulexi: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}' or base_phone='%{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="mylayout\mycontacts.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

<xi:include href="mylayout\mycasespro.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

<xi:include href="mylayout\mysoftswitch.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

<xi:include module="report" href="mylayout\myreport.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

<xi:include href="mylayout\mypd.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

<xi:include href="mylayout\mykb.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

<xi:include href="mylayout\myivr.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

<xi:include href="ctrls.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.  包含文件

3UCS Server4.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"/>

子目录mylayoutmyreport.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.5.  自激发事件

自激发事件EventTriggers

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

name——系统自激发事件名,

dest——事件影响的控件名称,

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

 

2.6.  文件与目录操作

浏览文件“BrowseFile,例如打开文件浏览窗口将得到的文件名连同路径填入TB_layoutTextBox)中:

<Button Name="BrowseFile" Size="100,24" Text="浏览文件" OnClick="(TB_layout)BrowseFile:,filter=*.xml|*.xml|,localdir=">

发送文件“sendfile   eg

<Button Name="SendFile" Location="430,120" Size="100,24" Text="上传窗体布局" OnClick="SendFile:,filter=*.xml|*.xml|,dir=layout,localdir="/>

或替换上面的OnClick属性模式

<Button Name="SendFile" Location="430,120" Size="100,24" Text="上传窗体布局"> <OnClick><assign name="topmost" expr="SendFile:, filter=*.xls|*.xls|, dir=layout, localdir="/> </OnClick></Button>

接收文件“getfile    eg

<Button Name="getrfn" Location="230,120" Size="100,24" Text="播放录音" OnClick="GetFile:%{tb_rcdfn},dir=record,localdir="/>

<Button Name="getrfn" Location="230,120" Size="100,24" Text="播放录音"><OnClick><assign name="topmost" expr="GetFile:%{CallList[recFn]},dir=record,localdir="/> </OnClick></Button>

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

获取目录文件列表:

     <ListCtrl Name="DirList" loadedclick="1" OnLoad="init" Size="400,200">

              <DbDetails>

                  <Database>log</Database>

                  <datatype>dir</datatype>

                  <queryFormat>select * from log</queryFormat>

                  </DbDetails>

              </ListCtrl>

将获取目录log的所有目录和文件,并展示在DirListListCtrl)中。

删除目录文件:

     <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.  即时消息

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

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

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

                     </Button>

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

 

2.8.  执行第三方程序

打开其他程序,使用exec指令,例如打开TB_TEL为网站啥的就调用IE,您可以用它来下载文件啥的。若为空,直接打开资源管理器了。eg

<Button Name="ie" LocationX="240,90" Size="35,24" Text="EXEC" OnClick="exec:%{TB_TEL}"/>

<Button Name="ie" LocationX="240,90" Size="35,24" Text="EXEC"><OnClick><assign name="topmost" expr="exec:%{TB_TEL}"/></OnClick></Button>

 

2.9.  数据库访问

直接sql语句方式,eg

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

 

Sql格式访问:

<ListCtrl Name="callRecLst" Visible="true" Enabled="true" PgSize="50" Location="20,40" Size="600,300"

Heading="记录号,30;主叫,100;被叫,100;开始时间,100;通话时长,100;总时长,100">

<DbDetails Fcsm=="false" mode="insert">

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

[]   参数HostDatabaseSubDriverUserPasswordTable在旧版本中会添加db前缀(非用户宏观配置内(用户宏观配置处不允许添加Db前缀,因此建议所有地方都不要添加该前缀),主要在控件处理内),后续版本将修正过来,同时也对旧代码做兼容处理。

这里实际生成的sql语句为select cdrid,callerid,calledid,starttime,duration,totalduration from gwcalls where cdrid=1 limit %{StartRow},%{PgSize}

Fcsmmode参数:field ctrl smart matchmodeselectinsertupdate,数据库操作模式,mode参数缺失时将从queryformat里提取,若均缺失将不能执行fcsm)参数用于自动匹配数据库字段与控件实现自动的数据交换,省去对控件的赋值语句及取值语句,前提为field name Ctrl Name 相同且位于同一页面,此处为脚本的方便性,增加了<DataEx/>元素,类似于<Data/>,它是<Data/>的补充,对应不同的操作有不同的特性,例如:insert模式下为<Data>id,value</Data>里面的filed自动生成fieldvalue并呈现在insert语句中,而<DataEx>name,age;'%{Tb_name}', '%{Tb_age}’ </DataEx>,自动匹配时将自动将分号前的“name,age”补充至insert语句的field部分,而分号后面的部分“'%{Tb_name}', '%{Tb_age}’”补充至value部分;在update模式下,<Data>id,value</Data>里的field自动生成updatefield-value表示id='%{id}',value='%{value}',而<DataEx>name='%{Tb_name}', age='%{Tb_age}’</DataEx>也将生成相应的表达式补充至其后,共同成为该语句的data部分。若需<DataEx>呈现,必与<Data/>同时呈现。如果<Data/>的数据格式为相应的操作的格式,fcsm将不做自动匹配操作。<v3.3>

在“QueryFormat”未赋值或不存在时自动以“select %{ Data } from %{ Table } where %{ Where } order by %{ Order }”生成sql语句。

如果需要初始化时就访问数据库,在<ListCtrl /〉等控件相应添加属性OnLoad="init"即可。

用户可以通过其他的事件来触发相应得控件访问数据库,传递过来的参数遵循替换法则,即传递过来了某个参数如<Where/>参数,目标控件的<DbDetails/>内的<Where/>将被新的参数内容替换,该参数内容将保持参与数据库的执行操作,直至有新的传入来替换,例如下面的代码当按钮(searchcalls)按下时(OnClickcustom窗体的子窗体CallRec的控件callRecLst将执行数据库的访问,且将<Where>参数传入给callRecLst参与数据库的执行。

<Button Name="searchcalls" Visible="true" Enabled="true" Location="430,170" Size="100,24" Text="查找通话记录">

<OnClick><if cond="%{custom.TB_mobile}">

<DbDetails><Where>SUBSTRING(callerid,-11)='%{custom.TB_mobile}' or SUBSTRING(calledid,-11)='%{custom.TB_mobile}'</Where></DbDetails>

<submit next="custom.CallRec.callRecLst" namelist="DbDetails"/>

</if></OnClick></Button>

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

call updatestatus(17)

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

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

翻页实现

Sql语句里有类似%{StartRow},%{PgSize}(须数据库支持)时可以方便实现翻页功能:

<Button Name="FirstPage" Location="30,500" Size="100,24" Text="首页" OnClick="(ContactList)GetPage(First)"/>

<Button Name="PrePage" Location="130,500" Size="100,24" Text="上一页" OnClick="(ContactList)GetPage(Pre)"/>

<Button Name="NextPage" Location="230,500" Size="100,24" Text="下一页" OnClick="(ContactList)GetPage(Next)">

数据导出

“export”指示导出,type指示导出类型,现只有csvexcel)支持,当此处未明确指明时读取<export></export>内容如下所示csvFilename指示导出的文件名,相对于程序安装根目录,若未指明或空则读取<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.      动态显示/隐藏控件

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

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

 

2.11.      动态禁用/启用控件

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

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

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

 

2.12.      事件触发

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

next——接受事件的控件

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

TextBoxenchange,enterkey

Comboboxeditchange, selchange,selendok; resetcontent

Buttonclick

ListCtrlsavetofile; import; resetcontent

 

2.13.      事件响应

每个页面进入时会激发当前页面的Activate事件,对应的处理事件为该页面的OnActivate内容,即<OnActivate></OnActivate>

<WndTap Name="cases" Text="工单信息">

<Ctrls>Button Name="insert"        Location="330270" 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="550120" 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="90180" 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.14.      变量

系统的变量分如下几类:

1、 系统全局变量:系统初始化、登陆时带入的变量如serveripuseridpassword及用户关联的参变量(例如业务服端设置的授权查询语句:select user_pwd as Password,Layout from userlogin where user_name='%{UserName}' 会将参数PasswordLayout作为变量传入);生存期为用户登录期间;

2、 $this$parent变量:$this指向控件所属的的wndtap(页面),$parent指向控件所属wndtap的父wndtap(父页面)

3、 框架全局变量,定义于xml中,界面的根元素的子元素,带有前缀appsession的,生存期为整个登陆期:如:

<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_namep_id绑定给相应的项值并将p_name显示在列表空中供选择,引用时CB_name[p_id]就是选中项的p_id值。他们的生存期为控件内容未改变(与该页面切换或是否激活无关),即一旦内容发生改变,这些变量就会发生改变。

 

2.15.      多语言支持

BizXML提供多语言支持,通过定义不同语言包来实现界面的用户相关的多语言应用,例如AB用户同时使用一套业务应用,但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 name="groups">

<Lang name="domain" value="域名"/>

</Language>

        value值“域名”即为domain_id的显示文字。

3.      BizXML控件使用

 

BizXML框架内预定义了一些常用控件如:ButtonTextBoxListCtrletc,本章将大致介绍这些控件的使用。

任何一个控件都具有通用的基本属性:

Name

控件名称,用于标识识别与引用,同一页面不应有重复,不可缺失

Text

显示的文字,显示给用户

Visible

是否显示,true显示,false不显示;缺失默认true,即显示控件

Enabled

使能,禁用或使能;缺失默认true,即使能控件,可操作

ReadOnly

只读,缺失默认为false

Location;

LocationX,LocationY

位置,指示该控件位于本页面框体的位置,左上角为(00),向右向下增量;前者定义为Location="30,30",后者定义为LocationX="30" LocationY="30",当该参数缺失即未定义时系统采用自动排版生成该控件的位置

Size;

SizeWidth,SizeHeight

大小,指定宽度与高度;前者定义为Size="30,30",后者定义为SizeWidth="30" SizeHeight="30"

ToolTip

控件提示,当鼠标置于其上方示显示设置的文字,可用于提示用户操作方法

GroupBox

指定该控件所属GroupBox,一般用于在GroupBox外围定义的Ctrl

print

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

printfixheight

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

eg定义了一个静态文本显示为“序号”可以是下面的任意

<Label Name="lb_index" Visible="true" Enabled="true" Location="30,30" Size="30,30" Text="序号" ToolTip="XX序号"></Label>

eg

<Label Name="lb_index" LocationX="30" LocationY="30" SizeWidth="50" SizeHeight="20" Text="序号"/>

Label可以作为其他控件的子元素出现,默认与该控件等高,宽度智能控制<暂未支持>

 

3.1.  Button按钮

最常用的控件之一,它主要处理事件,若需要点击后确认后执行可添加属性="true",事件方法可在属性OnClick声明如OnClick="onclickmsg0",也可定义子元素如<OnClick>onclickmsg1</OnClick>,定义子元素后属性方法失效(例如下例执行onclickmsg1而不是执行onclickmsg0),且定义子元素的方面灵活些,因为它还可以定义更多参数及条件执行。

OnClick

Click事件处理方式

Clickneedconfirm

点击该操作是否需要二次确认,缺失默认否

sqlpkinsert

Sql插入操作时返回自动增加id值将赋值给sqlpkinsert

<OnFecthFileEnd/>,<OnSendFileEnd/>[filename(文件名称), file(文件,含路径与名称), result(1,0,成功与否)]

<Button Name="update" Visible="true" Enabled="true" LocationX="130" LocationY="170" SizeWidth="100" SizeHeight="24" Text="修改" Clickneedconfirm="1" OnClick="onclickmsg0"><OnClick>onclickmsg1</OnClick></Button>

例如OnClick="(UserList)sql:select * from userlogin where 1" 影响的控件是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.2.  CheckBox

<CheckBox Name="activeStatus" Visible="true" Enabled="true" LocationX="30" LocationY="115" SizeWidth="200" SizeHeight="24" Text="启用" Checked="true"></CheckBox>

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

Checked

初始化时是否checked

 

3.3.  ComboBox

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

下拉选择框ComboBox特有属性有:

“windowtext”是方便获取窗口当前的文字而开放出来的属性,获取方法相同,如控件名为CB_eyeill,则CB_eyeill[windowtext]就是CB_eyeill显示的文字。

Type

类型,1——Simple,仅Edit(编辑);2——DropdownEdit+List(可编辑及下拉选择);3——Droplist,仅List(下拉选择)

LimitText

允许控件输入的最多字符数,默认无限制。(在Type3时无效)

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

控件当前显示的文字或输入的文字

length

控件当前显示的文字或输入的文字的长度

itemcount

控件选项数目

letter

控件当前显示文字的汉语拼音(全部小写

letteru

控件当前显示文字的汉语拼音(全部大写)

letters

控件当前显示文字的汉语拼音(只返回小写首字母

lettersu

控件当前显示文字的汉语拼音(只返回大写首字母

letterfu

控件当前显示文字的汉语拼音(首字母大写

letterd

控件当前显示文字的汉语拼音(全部小写+分隔符

也可以通过属性Items="6178|6179|6180|6181定义框内选项列表替代OnLoad

子元素DbDetails定义其访问数据的方式逻辑。

ComboBox目前可响应的事件有:EditChange(Dropdown模式时Edit文字发生改变)<OnEditChange></OnEditChange>,SelChange选择项改变<OnSelChange> </OnSelChange>SELENDOK选择好< OnSelEndOk></ OnSelEndOk>DataChange(选项内容发生改变)<OnDataChange></ OnDataChange >

赋值:SetSelNoEventSetSel实现对Combobox的赋值,二者的区别在于SetSelNoEvent仅仅改变选择项而不触发SELENDOK也不能触发SELCHANGE事件,而SetSel还会触发SELENDOKSELCHANGE事件,示例如下:(nameComboboxnameexpr为将赋于Combobox的值,可以为选项的序号,-1清空选择,可选择的项从0开始递增,也可以是选项的文字;function为方法,如SetSelSetSelNoEventSetValue<控件变量,相关于当前选中的项,所赋值生存期等同于控件原生数据,即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"/>

事件的触发:

回车(EnterKey)只能触发SELENDOK而不能触发SELCHANGE事件

EditChange——编辑窗口输入内容发生改变(选择改变不触发该事件);

SELCHANGE——手动选择选项发生改变;另外通过SetSel选择项值也会触发该事件,选项值清空且之前有选择(选项序号大于等于0)时也触发该事件;

SELENDOK——手动选择选项改变且选择完成时触发该事件,另外通过SetSel选择项值也会触发该事件,选项值清空且之前有选择(选项序号大于等于0)时也触发该事件。

<ComboBox Name="CB_eyeill" Visible="true" Enabled="true" Items="A|B" Type="2" OnLoad="sql:select p_name,id from dbo.eyeill" LocationX="90" LocationY="230" SizeWidth="100" SizeHeight="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" Visible="true" Enabled="true"  SelectedIndex="0" LocationX="30" LocationY="185" SizeWidth="130" SizeHeight="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.4.  GroupBox

GroupBox类似于html中的div,用于自动排版,可嵌套,即GroupBox可包含GroupBox,其使用类似于WinTap,子元素为<Ctrls></Ctrls>,所有控件包含于<Ctrls></Ctrls>GroupBox可不显示,此时Text属性为空(参见布局排版)。其可具有Tabs显示特性,设置feature=tab”该GroupBox将显示为一个Tab(部分版本可能还没支持),同一层次的GroupBox将作为同一个Tab组件显示,每个Groupbox为一个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的位置都会自动留有一定的间距。

复位GroupReset(content):

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

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

搜索GroupSearch:

<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

 

search[GroupBox prop]

inputed

 

true

listed

 

false

prefixwhere

 

false

prefixand

 

false

 

 

 

search子元素为控件名为tageg:控件名为“zone_id”)

控件(字段)属性

说明(eg:字段zone_id)

可缺省?(缺省值)

op

 

=

ref

 

Index[DbDetails]

enabled

 

true

format

按照format格式生成查询条件

Eg: format="option_header_id=(select option_header_id from option_line where option_line_id=%{opvalue})"

 

OP取值

“OP”取值

说明

 

EQUALS( = )

=

 

NOT_EQUAL( ! )

!=

 

RANGE_START_INCLUSIVE( [ )

>=

 

RANGE_END_INCLUSIVE( ] )

<=

 

RANGE_START_NOT_INCLUSIVE( ( )

 

RANGE_END_NOT_INCLUSIVE( ) )

 

 

submit属性

说明

可缺省?(缺省值)

next

GroupBox

 

namelist

namelist的内容一并提交

 

function

search”指明为GroupSearch

 

 

 

 

打印/列印GroupPrint: <submit next="GBTagPrint" function="print"/>

BizXML提供了打印/列印支持,可以直接将显示的界面及内容直接列印至打印机或PDF之类的输出,可方便实现类似于水晶报表的丰富的列印格式,提供该支持的组件/控件是“GroupBox”,直接发送列印指令给GroupBox,如“GBTagPrintGBTagPrint将自动将其内部的可视组件的内容按相应格式输出至打印机接口,实现打印输出。

需要说明的是,由于BizXML内部Size单位使用的的计算机屏幕显示单位,即96DPI96 dot per inch)。另外GroupBox本身有10的默认边距(margin)。

参数xadjust,yadjust用于调整边距,可正可负,负数相对向左向上偏移对应的单位。

尺寸转换,100毫米为例,(100/25.4*96=378(96为屏幕默认显示DPI)

 

3.5.  IpAddress Deprecated

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

<IpAddress Name="IpAddress1" Visible="true" Enabled="true" LocationX="30" LocationY="55" SizeWidth="200" SizeHeight="24" IP="192.168.0.10"></IpAddress>

 

3.6.  Label

<Label Name="lb_CaseSln " Visible="true" Enabled="true" Text="解决方案" LocationX="30" LocationY="120" SizeWidth="50" SizeHeight="20"/>

属性Align默认为左对齐即Align="left", 可为"right"(右对齐), "center"(居中)

 

3.7.  ListCtrl列表

列表控件也挺常用。独有属性有:linesPerRow (1)每行数据显示/打印的行数,默认显示打印一行(不换行)

PageSize

页面长度,指示列表每页显示记录条数,方便sql等语句实现翻页

AutoSizeCol

0:不调整列宽度;1:按列表表头字符宽度调整列宽度;2:按列表列数据调整列宽度;3:按列表表头及列表数据宽度自动调整列宽度

Filtering

突出显示,定义为filtering="column,upper,lower,dir",其含义依次为突出显示列编号、列项值的上限值、下限值、突出显示限值区间内(false)还是外(true)。例如filtering="7,预定,预定,0",突出显示蒂列项值在预定预定内的,而"0, 5,20,1"将突出显示项值大于20或小于5,eg: <assign name="UserList" expr="0,6,7000,0" function="SetFilter"/>;<assign name="UserList" expr="0" function="RemoveFilter"/>

Sum

指示是否自动对该表进行行/列的汇总,定义为Sum="row,col",目前仅对列有效,值col1true)时对列汇总sumsumcols指明对几列自动汇总,定义为sumcols="0,1,2"(对第0、第1、第2列汇总sum)

SumCols

需要汇总的列,用逗号分隔开

SwapRowCol

将列与行交换显示,仅在数据内容只有一行的情况下生效

OnLoad

初始化OnLoad指示列表控件载入时执行的操作,例如访问sql语句等

Operator

弹出式菜单(PopupMenuPC右键弹出,移动设备长按弹出,网页?)

OnClick

指定点击记录后的操作逻辑,例如SetText(TB_code,%0) 将记录第0列值填入TB_CodeTextBox)中,当存在子元素OnClick时被覆盖

Heading

指示列表表头文字参数,例如Heading="记录号,30;主叫,100;被叫,100;开始时间,100;通话时长,100;总时长,100"

loadedclick

指示列表载入数据后是否自动触发点击第0条记录的操作,如该值为1则执行并按照OnClick指定的方法操作

DataJoin

多类数据(MDX)智能拼接显示的格式

DataJoinKey

MDX数据关联的主键值,即哪一个字段作为识别同一行数据的标识

HeaderLines

表头显示/打印的行数,默认为1

linesPerRow

每行数据显示/打印的行数,默认为1

HeaderHeight

表头显示/打印高度,默认为0,行高由HeaderLines测算取得,如HeaderHeight设为非0则取HeaderHeight HeaderLines失效,

RowHeight

行高显示/打印高度,默认为0,行高由linesPerRow测算取得,如RowHeight设为非0则取RowHeightlinesPerRow失效,

HeaderHeight

表头显示/打印高度,默认为0,行高由HeaderLines测算取得,如HeaderHeight设为非0则取HeaderHeight HeaderLines失效,

colsDisplay

显示的列数,仅在Heading缺失且DataJoin缺失时有效。默认值-1,显示所有列;值0:显示可见最多列(由字段显示长度*5决定);值大于0显示指定列数

PrintNoHeader

打印控制参数,为真不打印表头,默认否,打印表态

PrintHeaderOnly

打印控制参数,为真只打印表头,默认否,打印全表

PrintBorder

打印控制参数,为真打印边框,默认为真

PrintVLines

打印控制参数,为真打印行分割线,默认为真

PrintHLines

打印控制参数,为真打印列分割线,默认为真

printfixheight

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

您可以只显示需要显示的列值,其它的列值将以该字段名为属性名附属于该行(记录),列名或列号都可以用来获取列值,引用方法类似于引用列,如: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进行选择或赋值操作,如<assign name="quests" expr="3" function="setsel"/>选中ListCtrl“quests”第三行(行号从0开始),

<assign name="quests[xx]" expr="3" function="setvalue"/>quests表的当前选中行赋值“3”给参数名“xx”即表格数据,如果ListCtrl数据在类似sql执行返回更新数据items时通过SetValue所赋值亦将消失。

行内容的遍历通过foreach来实现,eg:对名为“quests”ListCtrl遍历(依次取每行的id变量)

<foreach><assign name="title" expr="%{quests[id]};-"/></foreach><Submit next="quests" namelist="foreach" function="foreach"/>

OnClick指定点击记录后的操作,例如SetText(TB_code,%0) 将记录第0列值填入TB_CodeTextBox)中;

定义的SQL参数也可以以子元素的方式呈现如<DbDetails>dbmsg</DbDetails>(参见3.1.3节之数据库访问),此时若需要初始化执行SQL载入数据只需设置属性OnLoad="init",若OnLoad置为其他值则执行其值内容;

 

<ListCtrl Name="UserList" Visible="true" Enabled="true" PageSize="10" loadedclick="0" LocationX="20" LocationY="155" SizeWidth="600" SizeHeight="200" Heading="headingmsg" OnLoad="onloadmsg" OnClick="onclickmsg"><DbDetails>dbmsg</DbDetails></ListCtrl>

数据导入导出:ListCtrl的数据常常需要保存至文件或更新至数据库,可用如下操作

<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"/>更新数据库,当属性selected1时操作仅对被选择的行,否则对表中所有显示的行。

<Save selected="1"></Save><submit next="OrderList" namelist="Save" method="post" function="savetofile"/>保存至文件,格式为CSV,当属性selected1时操作仅对被选择的行,否则对表中所有显示的行。

ListCtrl常常用来做数据统计的显示,3UCS提供了MDX功能来方便使用者使用简单的sql语句实现复杂的数据统计及灵活设置字段显示顺序、拼接、组合等。MDX目前支持数据值为整形或字符串。呈现格式如下:

<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"             LocationX="20" LocationY="50" SizeWidth="600" SizeHeight="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>定义的数据,其他的入mediaconsultingordertypesaleinfo都是类似于<MDX id="media" remark="媒体分析">

<MDX>座席号,m_desc(中国之声|网络推广|北京新闻广播05:45-6:00|北京城市广播15:08-15:23|各地方广播媒体|天津经济台|平面报纸广告|老用户订购|呼出|电视广告|外地电视广告|文艺之声|北京故事台|媒体不祥|其他),cnts</MDX>坐席号是关联各个MDX拼接的关键字,这样各个统计的结果如124座席的数据全部显示在124行中,m_desc是各列的名称,后面括号及其内的值定义了统计显示的列,若该列无数据当数字类型为整形时填0为字符串时填空,如括号及内容省略将显示有数据的列;

DataJoin="%{this(wo_number,item_number,queue_quantity,running_quantity,completed_quantity,routing_sequence,routing_seq_num,standard_operation)}%{prop}":主数据(this)仅显示wo_number,item_number,queue_quantity,running_quantity,completed_quantity,routing_sequence,routing_seq_num,standard_operation字段,其他隐藏。

ListCtrl也提供了动态字段的支持,从数据库读取或生成字段名,然后生成列表数据。例如自动根据系统时间显示本周的房型及价格明晰:

<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

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

“disabled”值决定菜单工作与列表显示模式(disabled为真 将显示text,即menus返回值罗列的菜单而其他的将隐藏)或列表隐藏模式,mustselected值决定该菜单在列表项无选择时是否显示,needconfirm该菜单项是否需要确认,可选值“1”“true”表示需要,“0”“false”表示不需要,缺省为“false否(不需要)”。

3.8.  TextBox

TextBox提供文字的输入修改等,特有属性有:

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文字作为数字处理

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

控件当前显示文字的汉语拼音(全部小写+分隔符

可以接受处理的事件有TextBox——CHANGE内容修改、更新<OnEnChange> </OnEnChange>ENTER_KEY(回车)<OnEnterKey></OnEnterKey>

可以接受数据库返回的数据,通过事件触发,如点击Button执行SQL返回值(首行)TextBox,TextBox显示首列值,其他的值作为变量保存并有效于TextBox未修改期内,一旦修改则消失。

<TextBox Name="TB_CaseDesc" Visible="true" Enabled="true" ReadOnly="false" LocationX="90" LocationY="90" SizeWidth="500" SizeHeight="24" Text=""/>

<TextBox Name="tb_totalrecs" Visible="true" Enabled="false" ReadOnly="false"            LocationX="380" LocationY="30" SizeWidth="40" SizeHeight="24" 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可以接受的是AssignSetTextSetValueAddText,默认为assign

AddTextexpr的值追加至textbox的现有值末尾。若赋值给textbox附属变量则指明即可,如<assign name="ctrltext[id]" expr="2" function=""/>便将2赋值给ctrltext的附属变量id了。

3.9.  DateTime

<DateTime Name="DateTimeStart" Visible="true" Enabled="true" Format="yyyy-MM-dd" Location="30,10" SizeWidth="100" SizeHeight="20"  Text="2 weeks "></DateTime>

Format(格式)字符串说明

 Url

Web url address

Userid

用于访问的userid

Password

用于访问web的相对应的password

Namelist

要提交的参数

Urlencoded

Urlencoded模式

一位数或两位数的天数。

 dd  两位数的天数。 一位数天数的前面加一个零。

ddd  三个字符的星期几缩写。

dddd  完整的星期几名称。

 h  12 小时格式的一位数或两位数小时数。

 hh  12 小时格式的两位数小时数。 一位数数值前面加一个 0

 H  24 小时格式的一位数或两位数小时数。

 HH  24 小时格式的两位数小时数。 一位数数值前面加一个 0

 m  一位数或两位数分钟值。

 mm  两位数分钟值。 一位数数值前面加一个 0

 M  一位数或两位数月份值。

 MM  两位数月份值。 一位数数值前面加一个 0

 MMM  三个字符的月份缩写。

 MMMM  完整的月份名。

 s  一位数或两位数秒数。

 ss  两位数秒数。 一位数数值前面加一个 0

 t  单字母 A.M./P.M. 缩写(A.M. 被显示为 "A")。

 tt  双字母 A.M./P.M. 缩写(A.M. 被显示为 "AM")。

 y  一位数的年份(2001 显示为“1”)。

 yy  年份的最后两位数(2001 显示为“01”)。

 yyyy  完整的年份(2001 显示为“2001”)。

Text属性可以为空,默认值为页面初始化控件时的时间,其值可以类似下述表示: "5-03-1999 12:34:56""15-06-01 12:34:56 PST""5-06-02 12:34:56""5-23-1999 12:34am" "5-23-00 12:34am""1999-23-04 12:34:56""5/03/1999 12:34:56""15/06/1999 12:34:56""15/06/01 12:34:56 PST""5/06/02 12:34:56""5/23/1999 12:34am""5/23/00 12:34am""1999/23/04 12:34:56" "Mar 3, 1999 12:34pm""3 Jul 2004 12:34pm""12:34:56 5 December 1999"

"10 minutes ago"——比当前时间早10分钟、"2 weeks"——从现在时间向后推2个星期;。

赋值,SetValue(DateTimeStart,"2012-01-01 11:11")<assign name="DateTimeStart" expr="2012-01-01 11:11"/>。赋值支持的值格式参见本控件的Text属性,另外提供了相对时间的支持,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这种表述方式最大支持为天,最小为秒]

可访问的独有参数有:yearmonthdayhourminutesecondweek分别为控件当前值的年、月、日、小时、分、秒、 一周的第几天[1,7]firstDayOfWeekfirstDayOfMonthfirstDayOfYearlastDayOfWeeklastDayOfMonthlastDayOfYear分别为该控件当前值所属期间的该星期的第一天、该月的第一天、该年的第一天、该星期的最后一天、该月的最后一天、该年的最后一天,时间格式为该控件的format值;curdatetime当前时间,时间格式为该控件的format值,curdatetimeutc为当前时间的utc数值。

例如:%{DateTimeStart[year]}

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

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

 

3.10.      WebBrowser

<WebBrowser Name="WebBrowser1" Location="200,55" Size="600,300" Url="http://www.3ucs.com"></WebBrowser>

<WebBrowser Name="chat" Location="0,0" Size="700,600" Url="http://%{serverip}/bb/index.php">

</WebBrowser>

Url

Web url address

Userid

用于访问的userid

Password

用于访问web的相对应的password

Namelist

要提交的参数

Urlencoded

Urlencoded模式

 

3.11.      RadioButton

       <RadioButton Name="RadioButton1" Visible="true" Enabled="true" LocationX="30" LocationY="325" SizeWidth="120" SizeHeight="24" Text="Radio Option 1" Checked="false"></RadioButton>

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

Checked

初始化时是否checked

RadioManager

Radiobutton组的主Radiobutton

 

3.12.      SpinButton

数字增减按钮

<SpinButton Name="SpinButton1" Visible="true" Enabled="true" LocationX="30" LocationY="55" SizeWidth="20" SizeHeight="40" Minimum="0" Maximum="100" Value="50"></SpinButton>

Minimum

SpinButtonrange最大值

Maximum

SpinButtonrange最小值

Value

初始化值

 

3.13.      TrackBar

<TrackBar Name="TrackBar1" Visible="true" Enabled="true" LocationX="30" LocationY="210" SizeWidth="150" SizeHeight="30" Minimum="0" Maximum="100" Value="50" TickFrequency="10"></TrackBar>

Minimum

TrackBarrange最大值

Maximum

TrackBarrange最小值

TickFrequency

TrackBar显示标尺的刻度间隔

Value

初始化值

 

3.14.      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"即可

swapsegserie

交换SegmentSeries

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/>参数。

亦可以使用“chartme”方法从其它的ListCtrl获取,即可以直接使用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>

数据格式如下:

对于类型02,数据第一列为x坐标,余下的每一列的字段名为系列名,列值为该列对应各x坐标的y坐标值。

select sid as x,sum(case when (qid,qx,qy,aorder)=(12,1,1,0) then aint else 0 end) as '12-1-1-0',sum(case when (qid,qx,qy,aorder)=(12,2,1,0) then aint else 0 end) as '12-2-1-0',sum(case when (qid,qx,qy,aorder)=(12,3,1,0) then aint else 0 end) as '12-3-1-0',sum(case when (qid,qx,qy,aorder)=(12,1,2,0) then aint else 0 end) as '12-1-2-0',sum(case when (qid,qx,qy,aorder)=(12,2,2,0) then aint else 0 end) as '12-2-2-0',sum(case when (qid,qx,qy,aorder)=(12,3,2,0) then aint else 0 end) as '12-3-2-0',sum(case when (qid,qx,qy,aorder)=(12,1,3,0) then aint else 0 end) as '12-1-3-0',sum(case when (qid,qx,qy,aorder)=(12,2,3,0) then aint else 0 end) as '12-2-3-0',sum(case when (qid,qx,qy,aorder)=(12,3,3,0) then aint else 0 end) as '12-3-3-0' from cati_aint where qid=12 group by sid

x

12-1-1-0

12-2-1-0

12-3-1-0

12-1-2-0

12-2-2-0

12-3-2-0

12-1-3-0

12-2-3-0

12-3-3-0

3

2

3

4

2

4

3

3

4

5

4

4

5

5

5

4

3

4

5

3

5

3

5

3

4

4

3

5

3

3

对于类型1,数据第一列为各饼块的名称,第二列值为对应的值。

select callerid as name,count(*) as val from gwcalls where   starttime between UNIX_TIMESTAMP('2016-12-11')-86400000 and UNIX_TIMESTAMP('2016-12-11')+86400 group by callerid

name

val

2166039606

22

6120

6

6178

22

3.15.      ListBox

< Name="ListBox1" Visible="true" Enabled="true" LocationX="30" LocationY="185" SizeWidth="200" SizeHeight="100" Items="List Item 1|List Item 2|List Item 3" SelectedIndex="1"></ListBox>

OnLoad

(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可

Items

定义下拉列表选项(可以为1|2|31~31~3*10),当有动态选项(例如通过Sql语句从数据库加载)时将被覆盖

SelectedIndex

指示初始化载入数据后选择的项,若不选择则删除该属性;该控件每次载入新数据后若会自动选择指定项,例如SelectedIndex=”0”,控件自动设置当前选择的项为第0项,若未设置SelectedIndex,则设为未选,即SelectedIndex值为-1

除可以获取当前被选中项的显示文字外还可以额外下列参数(变量)以及附属变量(如通过sql获取的未显示的字段内容、使用SetValue设置的变量,关联当前被选中项)

selectedindex

当前选择项的序号,从0开始

itemcount

控件选项数目

 

3.16.      BR

BR换行符,用于自动排版,属性有:

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

Autoheight,定义为Autoheight="x"x可以为10,默认0。仅影响本次,取值为1时自动计算上一行的最大高度,系统自动下移。

<BR/>

3.17.      TAB

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

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

<TAB/>

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

类型,如taskemailcalletc

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

正如控件名称,它是一个特别的控件,可以呈现不同的控件类型和效果,可以用来显示文本,也可以是超链接,图片显示也可以是按钮,可以闪烁,可以淡入淡出等等,另外它还承载了一个外部接口的功能,即可以调用第三方DLL文件使用外部自定义Interface接口提供更多自定义的功能。

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

显示的内容可以是从是动态数据,如使用Sql方式提取的数据库数据,egselect 'min:0' as fadeout,'tip:test' as link, 'i love you' as text,'layout/ucin,play.png' as images,返回的字段内容text为显示的文字,images为显示的图片,fadeout将是显示的淡入淡出的效果,但若返回的字段不包含任何效果或特性信息,将取用xml定义的效果特性信息,这些信息包括buttontext除外)、Linktip除外)、fadeout sparklecolorsingle_linebr_offset line_alignline_widthline_spacefont

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

OnLoad

(控件初始化)载入时执行的操作载入选项列表数据,例如访问sql语句等,若欲初始化时使用<DbDetails/>定义的参数访问数据库设OnLoad="init"即可

Feature

Carousel,类似于web,但PC、手机客户端也支持该方式,方便图片轮显。

button

Button按钮设置。Type:是否构造为checkbox型的按钮,0-正常按钮,1-CheckBox型按钮,2-快按响应按钮(0时鼠标按下抬起后才触发Click事件,2则按下时就触发Click事件);text:按钮上的文字;width:强制按钮长度;height:强制按钮的高度;

href

超链接URL

Link

链接的参数设置。LinkLine:下划线规格,0-没有下划线,1-鼠标移上去有下划线,2-始终有下划线;HoverColor:鼠标移上去时颜色;UseHand:鼠标移上去时是否用手型;Tip:鼠标移上去时的tip提示信息

fadeout

淡入淡出效果设置。Maxmin指定其对象被淡化的Alpha值最大与最小,0~255之间;speed指定淡入淡出速度值0~255之间,默认15

sparkle

闪烁效果设置。Interval:闪烁时间间隔,毫秒(ms),默认300timeout:闪烁时长,超过则停止闪烁,默认无休止闪烁;color:闪烁的颜色变换,16进制值,“|”分割开,默认0xFF0000|0x00FF00|0x0000FF即红绿蓝。

color

字体颜色,16进制格式,例如0x12ff00

single_line

0-不启用强制单行显示        1-启用单行显示 2-如果单行显示不下,最后三个字节以“...”结尾

br_offset

换行后,第二行开始每行的行首偏移

line_align

设置行的对齐方式:0-行上对齐,1-行中对齐,2-行下对齐

line_width

行的显示宽度,默认自动宽度。

line_space

行间距离默认0

images

显示的图片,以“,”分割,第一项为图片所在服务器的路径,后续分别为图片文件名(分别对应于:常规显示、鼠标悬停、鼠标按下),可以一个也可以多个。Eglayout/ucin,logo.png图片所在服务器的路径可以省去,即第一个参数可以第一个图片的名称,此时将直接从本地默认路径(安装路径平行路径,<默认3UCS>\Users\用户名\)目录下读取图片;亦可以指定图片本地路径,该路径参数在第一个图片名称里呈现,如layout/ucin,data/refresh.png,它指定本地目录为安装目录子文件夹data

font

字体设置。FaceName:字体;bold:是否黑体;Italic:是否斜体;StrikeOut:是否带删除线

由于这里需要的数据有专用的名称(textimages),这里便引用了<Dfmap/>子元素,来方便数据库表字段与控件所需数据名称的匹配,例如<dfmap><map name="text" value="name"/></dfmap>将所需的“text”与数据库表字段名“name”对应起来,返回的数据里“name”字段的数据将以“text”参数呈现。

目前可响应的事件有:OnClick鼠标点击事件

使用示例:

<MagicCtrl Name="magic_lay_name" fadeout="min:0;" link="tip:12345" images="layout/ucin,logo.png" Size="160,80" OnLoad="init">

<dfmap><map name=\"text\" value=\"idx\"/></dfmap>

        <DbDetails><queryFormat>select 'min:0' as fadeout,'tip:test' as link, 'i love you' as text,'layout/ucin,play.png' as images</queryFormat></DbDetails>

        <OnClick><alert expr="%{magic_lay_name[text]}"/>

        </OnClick>

</MagicCtrl>

<MagicCtrl Name="magic_lay_name1" color="0x00ff00" Link="LinkLine:2;HoverColor:0x234511;UseHand:2;Tip:tooltipinfo"

 sparkle="interval:300;color:0x00ff00|0xff0000|0x0000ff" OnLoad="init"

font="bold:1;height:22;Italic:1;StrikeOut:0;Face:宋体" href="http://3ucs.com" Size="60,20" Text="magic_name" Align="Right">

        <DbDetails><queryFormat>select 'min:0' as fadeout,'tip:test' as link,'50' as line_width, 'adsfasd fasfaf afaf fds afa 3ucs' as text,'layout/ucin,play.png' as images</queryFormat></DbDetails>

        <OnClick><alert expr="%{magic_lay_name1[text]}"/>

        </OnClick>

</MagicCtrl>

外部接口引入采用interface子元素,使用的是类COM技术但比COM更简单灵活,无需COM基础,自然也不支持不支持标准COM技术,具体参见BizXML Interface相关开发使用说明。

<interface id="print" type="IBizInterface" codebase="mybizprint.dll" dir="layout/ucin/" classid="81D27722-87F2-4760-83DD-EF5C30FA08E4" version="1.53"/>

 

4.      事件处理与流程控制

4.1.  IF条件

<if><elseif/><else/></if>

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

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执行。

属性:namelist参数列表,next被执行的控件名,function方式。例如

<DbDetails/><submit namelist="DbDetails" next="innsLst"/>提交给innsLst控件参数DbDetails执行相关操作,多为数据库访问。

<submit next="HistoryList" function="resetcontent"/>此处HistoryList应为ListCtrlComboBox,目的是清空其内容。

4.7.  Assign

<assign/>赋值操作,可以对变量、控件进行赋值

格式为<Assign name="ctrlname" expr="expr" function="function"/>ctrlname为被赋值的控件名称,expr为赋值的内容,function为赋值操作的方式方法,例如:

<assign name="hotelid" expr="%{hostels[TB_code]}"/>hotelid变量赋值,值为页面hostels控件TB_code的值;

<assign name="TB_desc" expr="%{CB_roomAvlb[description]}"/>TextBox控件TB_desc赋值,值为同一页面的CB_roomAvlb控件的附属变量description;对于TextBox而言,function可以是:AddText——追加文字,SetTextSetValue——直接赋值,也可以为空,即为SetText;系统在执行操作前如果expr值为数学运算会自动执行该运算将结果赋值给控件。

<assign name="CB_content" expr="-1" function="SetSel"/>Combobox控件赋值,即选择其-1项为当前选择,实际是清空选择项;

调用外部事件也可以通过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="/>上传文件

<assign name="topmost" expr="nis3ucs:%{TB_customPhone}#0 1"/>呼出电话;参见NISU电话呼叫控制

<assign name="topmost" expr="nis3ucs: USS|b "/>置忙;参见NISU坐席状态设置

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

</OnTBNotifierRtn>

</WndTap>

4.12.      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.13.      EvalTbl(自定义业务逻辑xLogic

EvalTblBizXML的独特设计的基于表格的逻辑算法(同时提供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定义了输入参数值对,即逻辑表中的输入列,可以一对或多对,如input1input2,他们均为逻辑表中Inputs中的属性Attr名,取值可以是页面的控件参数值,如“%{EvalTblTest}”,亦可常量。

Outputs定义了输出参数值,即逻辑表中的输出的某列,如output1,运算完成将output1的结果存放在控件后变量里,如“EvalTblTest[Result]”就是将output1结果赋值给控件EvalTblTestResult参数。

逻辑表中ValueidValue值字符串的id值,相同id对应的字符串应该相同。id(0,1,2)为保留字符值(INVALID_STRING = 0; EMPTY_STRING = 1;EXPLICIT_NULL_STRING = 2),因此分配的id值应从3开始。

Operation为运算方式,

EQUALS( = )

1

(0x1)

NOT_EQUAL( !=,<> )

2

(0x2)

LESS_THAN( < )

4

(0x4)

LESS_THAN_EQUAL( <= )

8

(0x8)

GREATER_THAN( > )

16

(0x10)

GREATER_THAN_EQUAL( >= )

32

(0x20)

RANGE_INCLUSIVE( [] )

64

(0x40)

RANGE_END_INCLUSIVE( (] )

128

(0x80)

RANGE_START_INCLUSIVE( [) )

256

(0x100)

RANGE_NOT_INCLUSIVE( () )

512

(0x200)

JAVASCRIPT

1024

(0x400)

GETS

2048

(0x800)

 

3UCS Server安装包中xLogician.exe程序可以用来帮助设计逻辑表格。

实例:计算会员的级别

会员

类别

界定标准

A

最近一年内内消费金额在2000元以上∕或年度消费频次在4次及以上用户

B

最近一年消费在1000-1999元以内∕或年度消费频次在2次及以上用户

C

最近一年消费在1-999金额∕或年度消费频次在1次及以上用户

D1

最近1-2年未消费

D2

最近2-3年未消费

D3

最近3年以上为消费

逻辑代码(memberlevel.xml

<?xml version="1.0" encoding="UTF-8"?>

<Tables>

<Table name="memberlevel">

<Inputs>

<Attr>annualamount</Attr>

<Value op="32" id="3">2000</Value>

<Value/>

<Value op="32" id="4">1000</Value>

<Value/>

<Value op="32" id="5">1</Value>

<Value/>

<Value/>

<Value/>

<Value/>

<Value/>

<Value/>

<Value/>

</Inputs>

<Inputs>

<Attr>annualtimes</Attr>

<Value/>

<Value op="32" id="6">4</Value>

<Value/>

<Value op="32" id="7">2</Value>

<Value/>

<Value op="32" id="5">1</Value>

<Value/>

<Value/>

<Value/>

<Value/>

<Value/>

<Value/>

</Inputs>

<Inputs>

<Attr>noneyears</Attr>

<Value/>

<Value/>

<Value/>

<Value/>

<Value/>

<Value/>

<Value op="1" id="5">1</Value>

<Value op="1" id="7">2</Value>

<Value op="1" id="8">3</Value>

<Value/>

<Value/>

<Value/>

</Inputs>

<Outputs>

<Attr>level</Attr>

<Value op="1" id="9">A</Value>

<Value op="1" id="9">A</Value>

<Value op="1" id="10">B</Value>

<Value op="1" id="10">B</Value>

<Value op="1" id="11">C</Value>

<Value op="1" id="11">C</Value>

<Value op="1" id="12">D1</Value>

<Value op="1" id="13">D2</Value>

<Value op="1" id="14">D3</Value>

<Value op="1" id="14">D3</Value>

<Value/>

<Value/>

</Outputs>

</Table>

</Tables>

BizXML代码(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>

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”,仅用来辅助排版的GroupboxText属性应该为空。

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.      开放的接口

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

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

参见2.2节,使用示例如下:

电话呼叫OnClick="nis3ucs:%{TB_TEL} 1"

 

手机客户端支持的功能与模块(陆续增加中)

扫码:barcode

拍照:takephoto

位置:location

Wifi ssidwifissid

摇一摇:shake

登陆:signin

注册:register

手写图片:signature

GetfileSendfileBrowseFilerecordvoicestoprecordvoiceplayvoicepauseplayvoicestopplayvoice

…….

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

7.      SQL访问执行说明

BizXML内置SQL访问处理单元,可以访问几乎所有数据库,同时您也许注意到:配置中的SQL语句频繁出现类似“%g”、“%{UserName}”内容,这里特别说明下(大小写要区分噢!!!!——2014年以后发布的版本大小写不敏感)。

[注:当系统输出的名称多于一个字符时需用{}包含,执行时将替换为该通电话开始时间。]

3UCSSQL访问单元为提供更加灵活的方式,采用了模型替换方式。“%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,记录IDs =12345,通话IDn =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)

 

8.      注意事项

Assign function,尤其是在combobox,漏掉Setsel