1. View
function Query(Inputs , Outputs){
var code = "S";//结果,S为成功,E为失败
var msg = "";
try{
var sSRNumber = Inputs.GetProperty("SRNumber");//诉求编号
var sSearchExpr = "";
//判断必输
if(sSRNumber == "" ){
throw("sSRNumber不能为空");
}
//拼接诉求编号查询条件
if(sSRNumber != ""){
sSearchExpr = "[FT Research Task BC.FT Auxiliary9] = '" + sSRNumber + "'";
}
//执行查询
var bsQuery = TheApplication().GetService("EAI Siebel Adapter");
var psInput = TheApplication().NewPropertySet();
var psOutput = TheApplication().NewPropertySet();
psInput.SetProperty("OutputIntObjectName" , "FT Cloud Query Questionnaire Service IO");
psInput.SetProperty("SearchSpec" , sSearchExpr);
bsQuery.InvokeMethod("Query" , psInput , psOutput);
//获取查询结果,写入出参
var psData = psOutput.GetChild(0).Copy();
psData.SetType("Data");
Outputs.AddChild(psData);
}catch(e){
code = "E";
msg = e.message;
}finally{
Outputs.SetProperty("code" , code);
Outputs.SetProperty("msg" , msg);
}
}
第一步-去除字段上的多语言转换。
第二步-在Field上配置Aspect。
在配置Applet上的Aspect前,需要先在Field上配置Aspect。找到HAND Order上Field “Order Type”,添加两个Aspect Default Value:Aspect Default Value: Urgent Aspect Default Value: Supplement 分别对应紧急订单和补充计划订单。
第三步-确认需要做Aspect的Applet的Class
List Applet的Class必须是CSSFrameListBase或者其子类型(不可以是默认是CSSFrameList)。
Form Applet的Class必须是CSSFrameBase或者其子类型(不可以是默认是CSSFrame)。
第四步-在Applet上添加Default Aspect
分别在List Applet和Form Applet上添加以下UP:Name: Default Aspect Value: Supplement
略
function WebApplet_PreInvokeMethod (MethodName)
{
//判断点击事件传进来的参数名称,符合则进入
if( MethodName == "CheckOrder" ){
//新建一个对象,并且给它设置参数,key——value oIn输入
var oIn=TheApplication().NewPropertySet();
oIn.SetProperty("Applet Mode","3");
//弹出的Applet
oIn.SetProperty("Applet Name","FT Approval Popup Applet - Order");
//oOut输出,新建一个对象
var oOut=TheApplication().NewPropertySet();
//下面是调用BS的SLM Save List Service的LoadPopupApplet方法
var oBS=TheApplication().GetService("SLM Save List Service");
oBS.InvokeMethod("LoadPopupApplet",oIn,oOut);
//oOut = oBS.InvokeMethod("LoadPopupApplet",oIn);
//结束方法,下面的方法都终止掉
return (CancelOperation);
}
//继续进行下一个方法
return (ContinueOperation);
}
//TheApplication().RaiseErrorText("Hello World"); == alert("Hello World");
//通过值列表获取计划订单的显示值
var URGENT_ORDER = TheApplication().InvokeMethod("LookupValue","HAND_ORD_TYPE", "Urgent Order");
//获取当前这个Applet对应的BC对象实例
var bcOrder = this.BusComp();
//设置Order Type的值
bcOrder.SetFieldValue("Order Type", URGENT_ORDER);
//释放bc变量
bcOrder = null;
function Service_PreInvokeMethod (MethodName, Inputs, Outputs)
{
//为了保证代码的健壮性,function开始前应使用try{}catch(e){}finally{}来捕获并处理异常。
try
{
//每个客户化BS开头定义事务,以确保数据的完整性
//定义事务控制
var psTranIn = TheApplication().NewPropertySet();
var psTranOut = TheApplication().NewPropertySet();
var bsTran = TheApplication().GetService("EAI Transaction Service");
//开始事务
bsTran.InvokeMethod("BeginTransaction", psTranIn, psTranOut);
if (MethodName == "SubmitOrder")
{
SubmitOrder(Inputs, Outputs);
}
//如果逻辑正确结束,提交事务
//正常结束,提交事务
psTranIn.SetProperty("Abort", "false");
bsTran.InvokeMethod("EndTransaction", psTranIn, psTranOut);
}catch(e){
//如果捕获到异常,回滚事务
//捕获异常,回滚事务
psTranIn.SetProperty("Abort", "true");
bsTran.InvokeMethod("EndTransaction", psTranIn, psTranOut);
TheApplication().RaiseErrorText(e.message);
}finally{
//程序结束时,必须释放所有新创建的对象型变量
//释放对象
psTranIn = null;
psTranOut = null;
bsTran = null;
}
//所有客户化的BS都要返回CancelOperaton
return (CancelOperation);
}
//Function: SubmitOrder
//提交订单的逻辑
//输入参数:OrderId,需要提交的订单的Id
function SubmitOrder(Inputs, Outputs)
{
try
{
//获取订单BO,BC
var boOrder = TheApplication().GetBusObject("HAND Order");
var bcOrder = boOrder.GetBusComp("HAND Order");
var bcItem = boOrder.GetBusComp("HAND Order Item");
//获取参数
//GetProperty()是Property的一个最重要的方法之一,它的作用是获取Property Set里的某个键的值。我们这里是获取输入参数OrderId的值。
var orderId = Inputs.GetProperty("OrderId");
//根据输入参数OrderId查询出需要提交的订单
with (bcOrder)
{
//从下面一句开始到ExecuteQuery,是最常用的脚本BC查询操作步骤
//激活字段,查询前要激活所有你需要获取或者设置值的字段
ActivateField("Order Status");
//设置安全性,结合安全性的知识理解。代码中新开的BC实例一般用AllView安全性,确保能查到数据。但是界面上的实例不可更改安全性
SetViewMode(AllView);
//清空查询条件
ClearToQuery();
//设置查询条件,这里有两种设置查询条件的方法,SetSearchSpec和SetSearchExpr,我们建议使用SetSearchExpr,具体原因后续再分析
//SetSearchSpec("Id", orderId);
SetSearchExpr("[Id] = '" + orderId + "'");
//执行查询
ExecuteQuery(ForwardOnly);
//查询完成后,通过FirstRecord定位到查询结果的第一条记录,如果查询不到任何记录,则FirstRecord方法会返回false
if (!FirstRecord())
throw "找不到订单Id " + orderId + " !";
}
//查询订单下的订单行
with (bcItem)
{
ActivateField("Item Status");
//这里可以不需要对订单行设置头Id的查询条件,因为在获取BC时,订单行被BO里的Link限制为订单头的子,该条件会自动附加
ClearToQuery();
ExecuteQuery(ForwardOnly);
var bLineFound = FirstRecord();
//验证如果不存在至少一条订单行,报错
if (!bLineFound)
throw "请先录入订单行再提交!";
//以下是最典型的通过while循环查询出的记录做操作的例子
//循环所有订单行,更新订单行状态为待发运
var TO_BE_SHIPPED = TheApplication().InvokeMethod("LookupValue","HAND_ORD_ITEM_STATUS", "To Be Shipped");
while (bLineFound)
{
//SetFieldVaue是设置BC Field的值的方法
SetFieldValue("Item Status", TO_BE_SHIPPED);
//WriteRecord是保存记录的方法
WriteRecord();
//NextRecord是把记录定位到查询结果的下一条记录,如果已经是最后一条(即不存在下一条),返回false,跳出while循环
bLineFound = NextRecord();
}
}
//更新为订单行后,更新订单头状态
with (bcOrder)
{
var PENDING = TheApplication().InvokeMethod("LookupValue", "HAND_ORD_STATUS", "Pending");
SetFieldValue("Order Status", PENDING);
WriteRecord();
}
}catch(e){
//捕获异常,报错
throw e;
}finally{
//释放对象变量
bcItem = null;
bcOrder = null;
boOrder = null;
}
}
人机交互(按钮调用代码)
function WebApplet_PreInvokeMethod (MethodName)
{
//提交订单
if (MethodName == "SubmitOrder")
{
try
{
//获取Applet对应的BC实例
var bcOrder = this.BusComp();
//调用前先做一次界面的保存
bcOrder.WriteRecord();
//创建BS的输入参数和输出参数的Property Set
var psIn = TheApplication().NewPropertySet();
var psOut = TheApplication().NewPropertySet();
//设置输入参数OrderId的值为当前光标选中的订单头Id
psIn.SetProperty("OrderId", bcOrder.GetFieldValue("Id"));
//获取BS
var bsOrdSvc = TheApplication().GetService("HAND Order Service");
//调用BS的方法SubmitOrder
bsOrdSvc.InvokeMethod("SubmitOrder", psIn, psOut);
//注意,SNTO Order BC的Class必须是CSSBCBase或者其子类,否则不支持RefreshRecord方法
//此处为什么要对记录做刷新呢?因为BS里更新数据时基于一个全新的实例去更新的,
//并不影响当前界面的实例。为了使当前界面的实例能反馈给用户处理结果(订单状态字段改为“已提交”)
//因此需要刷新当前界面的实例
bcOrder.InvokeMethod("RefreshRecord");
//客户化方法,返回CancelOperation
return (CancelOperation);
}catch(e)
{
TheApplication().RaiseErrorText(e.message);
}finally
{
//释放对象
psIn = null;
psOut = null;
bsOrdSvc = null;
bcOrder = null;
}
}
//Hello World方法
else if (MethodName == "HelloWorld")
{
TheApplication().RaiseErrorText("Hello World");
return (CancelOperation);
}
return (ContinueOperation);
}
配置调用代码
Applet和BC上都有一个User Property叫Named Method。通过这个User Property,我们可以轻松地通过配置实现BS的调用。
//Applet进入的方法
function WebApplet_PreInvokeMethod (MethodName)
{
//点击确定,判断传参方法名是不是确定按钮
if( MethodName == "RandomAssign" )
{
//获取BO(业务对象)下名称为FT Lead的BC(业务组件)
var oBC = TheApplication().ActiveBusObject().GetBusComp("FT Lead");
//获取名称和Id
var agent = this.BusComp().GetFieldValue("Name");
var agentId = this.BusComp().GetFieldValue("Id");
//获取值列表上的值(值列表类型为FT_LEAD_STATUS,独立语言代码是Assignment)
var sState = TheApplication().InvokeMethod("LookupValue","FT_LEAD_STATUS","Assignment");
var sNew = TheApplication().InvokeMethod("LookupValue","FT_LEAD_STATUS","New");
with (oBC)
{
//获取第一条记录
var iRecord = FirstSelected();
while (iRecord)
{
SetFieldValue("FT Resp Agent Id",agentId);
SetFieldValue("FT Resp Agent Name",agent);
//这时候判断这个记录是不是新建的,是新建的就改成已分派Assignment
if(GetFieldValue("Status")==sNew )
{
SetFieldValue("Status",sState);
}
//写入
WriteRecord();
//下一条记录
iRecord = NextSelected();
}
}
//关闭当前页面(关闭弹出来的小窗口)
this.InvokeMethod("CloseApplet",TheApplication().NewPropertySet(),TheApplication().NewPropertySet());
return (CancelOperation);
}
return (ContinueOperation);
}
BO对象对应于配置中的BO,最常用的只有一个方法:GetBusComp,通过该方法获取BO里的BC。
常用的方法包括:
最常用的方法是:
最重要的两个方法是SetProperty和GetProperty。
除了以上的对象外,eScript还包含了javascript本身自带的所有对象和API,如Date, Math, Array, String等等。
首先,通过View –> Debug Window -> Watch来打开Debug的监控窗。其次,我们在代码里设置断点(在需要设置断点的代码行右键,Toggle Breakpoint)
然后开发Debug,点击提交按钮,我们可以看到代码执行到断点时停下来了,我们可以通过F8进行单步调试,当前执行到的代码行用蓝底色显示。
同时,代码中的变量的当前值,可以通过watch窗口查看