zhaocg 2 лет назад
Родитель
Сommit
43a7522cfb

+ 523 - 0
BOS开发/4.2服务端常用代码.doc

@@ -0,0 +1,523 @@
+
+                               服务端常用代码
+
+1、 提交控制  1
+2、 权限检查  4
+3、 凭证生成前的控制   6
+4、 生成凭证  7
+5、 审核操作  8
+6、 编码规则  9
+7、 如何在服务端执行一段带参数的sql? 10
+8、 如何在服务端用带参数的sql取得结果集?   11
+9、 扩展开发  11
+
+   服务端代码的编写主要针对App目录下的               PurOrderControllerBean
+实现类,典型的代码有新增、修改、检验等操作,下面作分别介绍:
+
+   提交控制
+
+
+   用户在编辑界面上点击‘保存’按钮时应用框架会调用
+   PurOrderControllerBean的submit方法,通过重载PurOrderControllerBean父类的su
+   bmit方法,可以对要新增、修改的数据进行校验、修正或做一些相关的判断:
+
+
+    protected IObjectPK _submit(Context ctx, IObjectValue model)
+    throws BOSException, EASBizException
+    {
+       PurOrderInfo purOrderInfo = (PurOrderInfo) model;
+
+
+       //记录是否是新增,false表示是修改,据此可以作相关操作
+       boolean isAddNew = true;
+       if(purOrderInfo.getId()!=null&&_exists(ctx,new
+      ObjectUuidPK(purOrderInfo.getId())))
+       {
+           isAddNew = false;
+       }
+
+
+       //检查是否设置number
+       //checkNumber(ctx, otherBillInfo);
+
+
+       //调用父类的方法检查是否有重号
+       //super._checkNumberDup(ctx, null, purOrderInfo );
+
+
+       // 设置值对象中的一些默认值
+       setDefaultValue(ctx, purOrderInfo);
+
+
+       //校验值对象中的属性是否合法
+       checkValid(purOrderInfo);
+
+
+       //调用框架的提交方法
+       return  super._submit(ctx, purOrderInfo);
+    }
+   对于用户在编辑界面上点击‘暂存’按钮时调用  _save(Context ctx, IObjectValue
+   model)
+   方法, 其操作过程与调用_submit方法类似
+   _update(Context ctx, IObjectPK pk, IObjectValue model)方法供更新操作调用
+
+
+   对于服务端的submit方法在实际应用中对应新增(addNew)或修改(update),所以
+   在服务端的架构中submit方法是根据pk是否为空进一步调用addNew或update方法,然
+   后在服务端的实现类中可以重载addNew及update来做具体的处理,以下代码就是框架
+   的CoreBaseControllerBean类中的submit方法的实现:
+
+
+       /**
+        *
+        * @param ctx Context
+        * @param pk IObjectPK
+        * @param coreBaseInfo CoreBaseInfo
+        * @throws BOSException
+        */
+       protected void _submit(Context ctx  ,  IObjectPK  pk  ,  IObjectValue
+   model) throws
+           BOSException , EASBizException
+       {
+           CoreBaseInfo coreBaseInfo = (CoreBaseInfo) model;
+               if     (_isExistPropertyName(ctx     ,     coreBaseInfo     ,
+   IFWStatus.effectedStatus))
+           {
+               coreBaseInfo.setInt(IFWStatus.effectedStatus ,
+                                   EffectedStatusEnum.EFFECTED_VALUE);
+           }
+
+
+           ServiceStateManager.getInstance().enableNextCallServices();
+           if (coreBaseInfo.getId() != null && this._exists(ctx , pk))
+           //if (coreBaseInfo.getId() != null )
+           {
+               super.update(ctx , pk , coreBaseInfo);
+           } else {
+               super.addnew(ctx , pk , coreBaseInfo);
+           }
+       }
+
+
+       /**
+        *
+        * @param ctx Context
+        * @param coreBaseInfo CoreBaseInfo
+        * @throws BOSException
+        * @return IObjectPK
+        */
+       protected IObjectPK _submit(Context ctx , IObjectValue model) throws
+           BOSException , EASBizException    {
+           CoreBaseInfo coreBaseInfo = (CoreBaseInfo) model;
+               if     (_isExistPropertyName(ctx     ,     coreBaseInfo     ,
+   IFWStatus.effectedStatus)){
+               coreBaseInfo.setInt(IFWStatus.effectedStatus ,
+                                   EffectedStatusEnum.EFFECTED_VALUE);
+           }
+           IObjectPK retValue;
+
+
+           ServiceStateManager.getInstance().enableNextCallServices();
+           if (coreBaseInfo.getId() != null &&
+               this._exists(ctx , new ObjectUuidPK(coreBaseInfo.getId())))
+           //    if (coreBaseInfo.getId() != null)
+           {
+               retValue = new ObjectUuidPK(coreBaseInfo.getId());
+               super.update(ctx , retValue , coreBaseInfo);
+               return retValue;
+           }else{
+               retValue = super.addnew(ctx , coreBaseInfo);
+               return retValue;
+           }
+      }
+
+
+      在用户的服务端实现类中的代码如下:
+      protected void _addnew(Context ctx, IObjectPK pk, IObjectValue model)
+              throws BOSException, EASBizException {
+          PurOrderInfo purOrderInfo = (PurOrderInfo) model;
+
+
+           //检查是否设置number
+          checkNumber(ctx, otherBillInfo);
+
+
+          //检查是否有重号
+          checkNumberDup(ctx, null, purOrderInfo );
+
+
+          // 设置值对象中的一些默认值
+          setDefaultValue(ctx, purOrderInfo);
+
+
+          //校验值对象中的属性是否合法
+          checkValid(purOrderInfo);
+
+
+          //调用框架的提交方法
+          return  super._addNew(ctx, pk, purOrderInfo);
+      }
+
+
+      protected void _addnew(Context ctx, IObjectValue model)
+              throws BOSException, EASBizException {
+          PurOrderInfo purOrderInfo = (PurOrderInfo) model;
+
+
+          //检查是否设置number
+          checkNumber(ctx, otherBillInfo);
+
+
+          //检查是否有重号
+          checkNumberDup(ctx, purOrderInfo );
+
+
+          // 设置值对象中的一些默认值
+          setDefaultValue(ctx, purOrderInfo);
+
+
+          //校验值对象中的属性是否合法
+          checkValid(purOrderInfo);
+
+
+          //调用框架的提交方法
+          return  super._addNew(ctx, purOrderInfo);
+      }
+      update方法基本上同于addNew方法,这里省略。
+
+   权限检查
+
+
+   先了解一下权限接口类提供的有关权限项检查的方法
+       /**
+        *
+        * 描述:返回用户是否具有某项功能的权限
+        * @param userPK                    验权用户PK
+        * @param orgPK                      验权组织PK
+        * @param permItemName         权限项名称
+        * @return                                 true:有权 false:无权
+        * @throws BOSException
+        * @throws EASBizException
+        * @author:ryanzhou
+        */
+        public boolean hasFunctionPermission(
+               IObjectPK userPK,
+               IObjectPK orgPK,
+               String permItemName)
+           throws BOSException, EASBizException;
+
+
+       /**
+        *
+        * 描述:返回用户是否具有某项功能的权限
+        * @param userPK                    验权用户PK
+        * @param orgPK                      验权组织PK
+        * @param uiPK                        UI元数据PK
+        * @param actionPK                  业务操作的PK
+        * @return                                 true:有权 false:无权
+        * @throws BOSException
+        * @throws EASBizException
+        * @author:ryanzhou
+        */
+        public boolean hasFunctionPermission(
+               IObjectPK userPK,
+               IObjectPK orgPK,
+               IMetaDataPK uiPK,
+               IMetaDataPK actionPK)
+           throws BOSException, EASBizException;
+
+
+       /**
+        *
+        * 描述:检查用户是否具有某项功能的权限,
+        * 无权时会抛出包含提示信息的业务异常
+        * @param userPK                    验权用户PK
+        * @param orgPK                      验权组织PK
+        * @param permItemName         权限项名称
+        * @throws BOSException
+        * @throws EASBizException
+        * @author:ryanzhou
+        */
+        public void checkFunctionPermission(
+               IObjectPK userPK,
+               IObjectPK orgPK,
+               String permItemName)
+           throws BOSException, EASBizException;
+
+
+       /**
+        *
+        * 描述:检查用户是否具有某项功能的权限,
+        * 无权时会抛出包含提示信息的业务异常
+        * @param userPK                    验权用户PK
+        * @param orgPK                      验权组织PK
+        * @param uiPK                        UI元数据PK
+        * @param actionPK                  业务操作的PK
+        * @throws BOSException
+        * @throws EASBizException
+        * @author:ryanzhou
+        */
+        public void checkFunctionPermission(
+               IObjectPK userPK,
+               IObjectPK orgPK,
+               IMetaDataPK uiPK,
+               IMetaDataPK actionPK)
+           throws BOSException, EASBizException;
+   具体调用方法:
+        com.kingdee.eas.base.permission.IPermission perm= null;
+         perm =PermissionFactory.getLocalInstance(ctx );
+         perm.hasFunctionPermission(userPK, orgPK, uiPK,actionPK);
+   通过返回boolean值确定是否具有相应的权限项,根据不同的应用场景调用不同的应用
+   方法检验操作的功能权限或数据权限。
+
+
+
+   凭证生成前的控制
+
+
+   通过重载父类的_createVoucher方法实现其控制,
+   在做凭证生成动作之前进行相关的   断或则修改
+   例如:
+       protected void _createVoucher(Context ctx, String billId)
+             throws BOSException, EASBizException
+       {
+          IPurOrder purOrder= PurOrderFactory.getLocalInstance(ctx);
+          //创建pk对象
+          ObjectUuidPK pk = new ObjectUuidPK(billId);
+
+          //在客户端获取用户信息
+                  UserInfo         currentUser         =          (UserInfo)
+ctx.get(SysContextConstant.USERINFO)
+
+          //根据ID返回当前的值对象
+          PurOrderInfo purOrderInfo ;
+          purOrderInfo = get PurOrderInfo (ctx, pk);
+
+          //作相关判断
+          if (purOrderInfo!= null)
+          {
+          Date billDate = purOrderInfo.getBillDate();
+              if (billDate != null)
+             {
+                //作相应处里
+              }
+
+          // 已生成凭证,不能重复生成凭证
+          if (purOrderInfo.isFiVouchered())
+          {
+              throw new lBizException(‘*****’);
+          }
+          if (BillStatusEnum.AUDITED.equals(purOrderInfo.getBillStatus()))
+          {
+              //此过程中自动生成凭证
+              purOrderInfo.setFiVouchered(true);
+              purOrderInfo.update(pk, otherBillInfo);
+          }
+        }
+     }
+
+
+   生成凭证
+
+   下面是具体生成凭证的典型代码,也可以通过dap平台配置生成凭证
+       protected IObjectValue _genVoucher(Context ctx, String billID)
+             throws BOSException, EASBizException {
+       // 生成凭证,并返回集合
+       IObjectCollection tmpCollection = null;
+
+       //dap动态会计平台
+                   IDAPTransformer             iDAPTransformer             =
+DAPTransformerFactory.getLocalInstance(ctx);
+       //
+       CoreBillBaseCollection        coreTransCollection        =        new
+   CoreBillBaseCollection();
+       ObjectUuidPK pk = new ObjectUuidPK(billID);
+
+       //获取值对象
+       PurOrderInfo model = (PurOrderInfo) this.getValue(ctx, pk);
+       coreTransCollection.add(model);
+
+       //获取转换后的凭证值对象
+       tmpCollection=iDAPTransformer.transformAuto(coreTransCollection,
+                                        DAPVoucherTypeEnum.FIVoucher
+                                       ) ;
+
+
+       //创建凭证实体对象接口
+       IVoucher vchCtrl = (IVoucher) VoucherFactory.getLocalInstance(ctx);
+       //从集合众取出转换后凭证值对象
+       VoucherInfo vch = (VoucherInfo) tmpCollection.getObject(0);
+       VoucherInfo vch1 = new VoucherInfo();
+                  vch1            =            vchCtrl.exteriorLazyLoad(vch,
+VoucherInfo.getDefaultSelector());
+
+       return vch1;
+    }
+
+
+   审核操作
+
+
+   通过重载父类的_ audit方法实现审核控制,如下代码所示:
+   protected void _audit(Context ctx, IObjectPK  pk)  throws  BOSException,
+   EASBizException {
+       //对参数的常用判断
+       if ((pk == null)) {
+          throw new IllegalArgumentException();
+       }
+
+       // 当前用户
+                UserInfo          currentUser          =          (UserInfo)
+ctx.get(SysContextConstant.USERINFO);
+
+       // 当前日期
+       Date currentDate = new Date();
+
+       // 检查单据是否存在
+       // PurOrderBizException 是用户定义的异常类
+       boolean exist = exists(ctx, pk);
+       if (!exist)
+       {
+                                      throw                              new
+PurOrderBizException(PurOrderBizException.BILL_NOTEXIST);
+       }
+       PurOrderInfo purOrderInfo= getPurOrderInfo (ctx, pk);
+
+       //设置审核人
+       purOrderInfo.setAuditor(currentUser);
+
+
+       //设置审核日期
+       purOrderInfo.setAuditDate(currentDate);
+
+       //设置单据的状态为—已审核
+       purOrderInfo.setBillStatus(BillStatusEnum.AUDITED);
+
+       //更新实体,完成审核标记
+       update(ctx, pk, purOrderInfo);
+    }
+
+
+   编码规则
+
+   下面是判断是否定义了编码规则:
+    protected boolean isRuleAutoNumber( Context ctx,
+                              PurOrderInfo purOrderInfo,
+                              String strCompanyID)
+          throws EASBizException, BOSException
+    {
+       //系统工具,判断字符窜是否为‘空’
+       if (StringUtils.isEmpty(strCompanyID)) {
+          CompanyOrgUnitInfo aCompanyOrgUnitInfo = null;
+          if (purOrderInfo.getCompany() != null)
+          {
+              //获取公司信息
+              aCompanyOrgUnitInfo = purOrderInfo.getCompany();
+          }
+          Else
+          {
+              //获取当前财务组织
+
+
+              // ContextUtil 系统工具类,提供常用信息的获取
+
+
+              aCompanyOrgUnitInfo = ContextUtil.getCurrentFIUnit(ctx);
+
+          }
+          strCompanyID = aCompanyOrgUnitInfo.getId().toString();
+       }
+
+       //编码规则管理类
+       ICodingRuleManager iCodingRuleManager = null ;
+       iCodingRuleManager =CodingRuleManagerFactory.getLocalInstance(ctx);
+
+
+       //调用具体方法判断规则是否存在
+       if (iCodingRuleManager.isExist(otherBillInfo, strCompanyID))
+       {
+          return true;
+       }
+       return false;
+    }
+
+   如何在服务端执行一段带参数的sql?
+
+如果需要在服务端(ControllerBean)执行更新或删除的sql,该如何写呢?下面给个例
+子说明:
+    /**
+    *功能:更新给定id记录的名称和更新时间
+    */
+    private void executeSql(Context ctx, String  strName,String  id)  throws
+BOSException,EASBizException {
+                   StringBuffer            sql             =             new
+StringBuffer();   //对于要拼接字符串的用StringBuffer可以大大提高效率,如果只
+有一行用String就可以了
+        List params = new ArrayList();
+
+        sql.append(" update T_MY_TEST ");
+        sql.append(" set   FName = ?, FDate =? where FID=?");
+
+        params.add(strName);
+        Date date = new Date();
+        long time = date.getTime();
+        params.add(new Timestamp(time));
+        params.add(id);
+            com.kingdee.eas.util.app.DbUtil.execute(ctx,     sql.toString(),
+params.toArray());
+    }
+上面是更新的写法,对于删除来说和上面的基本相同。
+
+
+   如何在服务端用带参数的sql取得结果集?
+
+如果需要在服务端(ControllerBean)执行SQL来查询结果集并返回给客户端,该如何写
+呢?下面给个以Map形式返回Sql查询结果给客户端的例子:
+    /**
+    *功能:查询小于给定日期的所有记录的编码和名称(编码唯一)
+    */
+    Public Map getSqlData(Context ctx, Date curDate) throws BOSException{
+        StringBuffer sql = new StringBuffer();  
+//对于要拼接字符串的用StringBuffer可以大大提高效率,如果只有一行用String就可
+以了
+        Map mapData; 
+        List params = new ArrayList();
+        sql.append(" Select FNumber,FName From T_MY_TEST ");
+        sql.append(" where FDate < ?");
+       long time = curDate.getTime();
+       params.add(new Timestamp(time));
+           IRowSet rs = com.kingdee.eas.util.app.DbUtil.executeQuery(ctx,
+   sql.toString(), params.toArray());
+           try{
+               while(rs.next()){
+                  if(mapData == null)    {
+                     mapData = new HashMap();
+                  }
+                 
+   mapData.put(rs.getString("FNumber"),rs.getString("FName"));            }
+
+           }catch (SQLException e) {
+               throw new SQLDataException(e);
+           }
+           return mapData;
+       }
+
+
+   扩展开发
+
+
+如图:
+[pic]
+Bim会添加一个Ex后缀的java类 , 该类继承自实现类。
+
+
+如:
+public class ReceiveBillControllerBeanEx
+extends com.kingdee.eas.ma.crbg.app.ReceiveBillControllerBean;
+
+可以修改或覆盖EAS原有应用逻辑,应用框架会自动调用该类。
+
+
+
+
+                              <完>

+ 1843 - 0
BOS开发/4.3客户端常用代码.doc

@@ -0,0 +1,1843 @@
+
+客户端常用代码
+
+
+1   列表界面常用代码   3
+
+  1.1
+  初始化用户自己定义的查询过滤框(系统默认为每个定义的列表生成了通用过滤框,如
+  果采用系统通用过滤框则不需要实现下面的方法) 3
+  1.2  设置列表界面的默认过滤条件,可用来过滤列表数据, 也可以直接设置
+  mainQuery的值实现过滤 5
+  1.3  设置是否在调入列表界面之前先出过滤框 5
+  1.4  客户端对审核的操作  6
+  1.5  关联生成  6
+  1.6  动态调用UI界面,并在UI之间传递变量   7
+  1.7  关于编码规则  7
+  1.8  如何得到当前选中行的id 8
+  1.9  关于数字精度的设置  9
+  1.10 返回当前列表的主键  10
+  1.11 返回列表界面对应的编辑界面名称   11
+  1.12 返回远程调用接口 11
+
+2   编辑界面常用代码   11
+
+  2.1  获取菜单参数  11
+  2.2  客户端环境工具类 11
+  2.3  获取公司行政组织 12
+  2.4  获取当前公司本位币  12
+  2.5  期间工具  12
+  2.6  获取资源文件  12
+  2.7  消息框 13
+  2.8  SysUtil.abort()  13
+  2.9  com.kingdee.eas.base.uiframe.UIFactoryHelper  13
+  2.10 Tree操作  14
+  2.11 获取编号  14
+  2.12 获取汇率  15
+  2.13 数据库工具类  15
+  2.14 常用数据格式  15
+  2.15 初始化单据分录中的数据 16
+  2.16 载入编辑界面时设置明细默认值  16
+  2.17 BigDecimal类型的使用方式: 17
+  2.18 构造ObjectUuidPK 17
+  2.19 组织转换  17
+  2.20 获取不同类型的组织视图 17
+  2.21 弹出指定的F7框   18
+
+3   常用F7 Query 19
+
+  3.1  科目F7 19
+  3.2  科目表 19
+  3.3  客户F7 19
+  3.4  供应商F7  19
+  3.5  客商统一码F7  19
+  3.6  物料F7 19
+  3.7  辅助核算F7    19
+  3.8  币别F7 20
+  3.9  辅助核算类型F7   20
+  3.10 汇率F7 20
+  3.11 银行账户F7    20
+  3.12 银行F7 20
+  3.13 用户F7 20
+  3.14 银行F7 20
+
+4   代码实例  20
+
+  4.1  单据新增代码  20
+  4.2  单据修改代码  22
+  4.3  单据删除代码  22
+  4.4  获取集合  22
+  4.5  获取值对象    23
+  4.6  界面之间传递参数 23
+  4.7  给Query传过滤条件   24
+  4.8  接口方法的访问方式  25
+  4.9  传递上下文参数的接口访问方式  25
+  4.10 控件的初始化  25
+  4.11 F7赋值 26
+  4.12 设置单据分录单元格格式 28
+  4.13 设置单元格可编辑 28
+  4.14 删除行 29
+  4.15 F7专用选择界面的设置   29
+  4.16 获取各模块系统状态信息 31
+  4.17 获取当前登陆信息 31
+  4.18 获取参数平台参数设置的示例代码   31
+  4.19 网络互斥功能示手工控制 32
+  4.20 Tree- List实现方法1 32
+  4.21 Tree-List点击树上结点时形成过滤条件时的字段   32
+  4.22 Tree-树形控件的初始化级次  [optional]   33
+  4.23 Tree-树形空间的默认展开级次 [optional]  33
+  4.24 Tree-返回树形控件的根名称  33
+  4.25 Tree-数据过滤(重载实现对树的过滤)    33
+  4.26 Tree-控件基本使用   34
+   4.26.1 初始化树形控件  34
+   4.26.2 返回选中的树结点    35
+   4.26.3 返回树结点的值  35
+   4.26.4 删除类别时刷新当前结点的父结点,并定位到当前结点的父结点。 35
+   4.26.5 设置选中根结点  36
+   4.26.6 类别新增与修改时,刷新当前选中结点  36
+   4.26.7 修改类别时刷新当前结点的父结点,并定位到当前结点 36
+  4.27 手工发送消息  37
+
+
+   列表界面常用代码
+
+
+
+   tblMain
+   作为框架为list列表界面中的kdTable绑定的变量,通过它可以访问到列表上的每一行
+   、每一列,可以做数据检查,控制,格式化,行合并等操作
+
+
+
+
+
+
+
+   1
+     初始化用户自己定义的查询过滤框(系统默认为每个定义的列表生成了通用过滤框,
+     如果采用系统通用过滤框则不需要实现下面的方法)
+
+
+
+
+
+     dialog可在bos中继承CustomerQueryPanel UI新建用户自定义的过滤框
+
+
+     [pic]
+
+
+     在Bos中发布该元数据后,可以实例化该类并引用
+
+
+     在生成的dialog类中继承方法
+     getFilterInfo(),并实现用户想要的过滤条件,应用框架会在取数时调用dialog类
+     自动获取过滤条件
+
+
+     在ListUI类中重载方法initCommonQueryDialog
+
+
+     protected CommonQueryDialog initCommonQueryDialog()
+     {
+          dialog = super.initCommonQueryDialog();
+          try
+          {
+              dialog.addUserPanel(getUsierPanel());
+              dialog.setShowFilter(true);
+              dialog.setShowSorter(true);
+              dialog.setHeight(380);
+              dialog.setWidth(500);
+              dialog.setTitle(“客户自定义过滤框”);
+          }
+          catch (Exception e)
+          {
+              handUIException(e);
+          }
+          return dialog;
+       }
+       protected CustomerQueryPanel getUserPanel() throws Exception
+       {
+              if (this.userPanel == null)
+                 this.userPanel = new PurOrderQueryUI();
+              userPanel.onLoad();
+              return this.userPanel;
+       }
+
+
+       如上,可以实现通过在通用过滤界面上增加自定义的过滤框实现对列表数据的过
+       滤
+
+
+
+
+
+
+
+
+
+       2   设置列表界面的默认过滤条件,可用来过滤列表数据,   也可以直接设置
+     mainQuery的值实现过滤
+
+
+           protected EntityViewInfo getInitDefaultSolution()
+          {
+              EntityViewInfo ev = new EntityViewInfo();
+              FilterInfo filter = new FilterInfo();
+              //给filter赋过滤条件项
+              ev.setFilter(filter);
+              return ev;
+           }
+
+
+
+
+
+
+
+
+
+
+
+       3 设置是否在调入列表界面之前先出过滤框
+
+           protected boolean initDefaultFilter()
+          {
+              return true;
+           }
+
+
+
+
+
+
+
+
+
+
+
+       4 客户端对审核的操作
+
+        应用框架预定义了一个审核操作actionAuditing
+           public void actionAuditing_actionPerformed(ActionEvent e)  throws
+       Exception
+          {
+              //检查单据状态
+              if (!checkStatus(tblMain, BillStatusEnum.SUBMITED))
+              {
+                MsgBox.showInfo(this,
+                Day4Resource.getStrResource("isNotSubmitStatus"));
+                // 状态不正确,终止处理
+                 SysUtil.abort();
+              }
+              IPurOrder purorder = (IPurOrder) getBizInterface();
+              String[] billIdlist = getSelectedListId();
+
+
+              //常用的弹出对话框方法
+              int i = MsgBox.showConfirm2(this, "sureAudit");
+              if (i == MsgBox.OK)
+             {
+                 //审核操作
+                 purOrder.audit(new ObjectStringPK(bill));
+                 //完成其他业务逻控制
+                 // 刷新列表界面
+                 actionRefresh_actionPerformed(null);
+              }
+           }
+
+
+
+
+
+
+
+
+
+
+
+       5 关联生成
+
+           public void actionCreateTo_actionPerformed(ActionEvent e)  throws
+       Exception {
+              checkSelected();
+              // 未审核单据不能关联生成
+              if (!checkStatus(tblMain, BillStatusEnum.AUDITED)) {
+                 MsgBox.showInfo(this,  "billIsUnAudited");
+                 SysUtil.abort();
+              }
+              //有系统调用配置好的‘botp’规则
+              super.actionCreateTo_actionPerformed(e);
+           }
+
+
+
+
+
+
+
+
+
+       6 动态调用UI界面,并在UI之间传递变量
+
+
+
+           private void makePurOrderUI(PurOrderInfo srcBillInfo)
+                throws EASBizException, UIException,
+                 BOSException, Exception {
+                       String            destBillEditUIClassName           =
+       “com.kingdee….PurOrderEditUI”;
+              Map map = new UIContext(this);
+              map.put("srcBillID", srcBillInfo.getId().toString());
+              map.put(UIContext.OWNER, this);
+              map.put("srcBillBOSTypeString", destBillInfo.getBOSType());
+              IUIWindow uiWindow = null ;
+             // UIFactoryName.MODEL 为弹出模式
+             uiWindow = UIFactory.createUIFactory(UIFactoryName.MODEL).
+                    create(destBillEditUIClassName, map, null,
+                     OprtState.ADDNEW);
+              //可对创建的ui进行操作
+             //((CoreBillEditUI).uiWindow.getUIObject()).
+             //setMakeRelations(btpResult.getBOTRelationCollection());
+
+
+              //开始展现UI
+             uiWindow.show();
+           }
+
+
+
+
+
+
+
+
+
+       7 关于编码规则
+
+
+
+           // 是否存在编码规则
+           protected boolean isCodeRuleEnable(IObjectValue objValue)
+             throws EASBizException, BOSException {
+              String companyId = OrgInnerUtils.getCurCompany();
+              ICodingRuleManager codeRuleMgr = null;
+             codeRuleMgr  = CodingRuleManagerFactory.getRemoteInstance();
+              return codeRuleMgr.isExist(objValue, companyId);
+           }
+
+
+           // 得到自动编码
+           protected String getAutoCode(IObjectValue objValue)
+             throws EASBizException, BOSException {
+              String companyId = OrgInnerUtils.getCurCompany();
+             ICodingRuleManager codeRuleMgr = null;
+
+
+             codeRuleMgr = CodingRuleManagerFactory.getRemoteInstance();
+              if (codeRuleMgr.isUseIntermitNumber(objValue, companyId)) {
+                 return codeRuleMgr.readNumber(objValue, companyId);
+              } else {
+                 return codeRuleMgr.getNumber(objValue, companyId);
+              }
+
+
+           }
+
+
+
+
+
+
+
+
+
+       8 如何得到当前选中行的id
+
+
+
+           // 得到当前选中行的id
+           public String[] getSelectedListId() {
+              checkSelected();
+
+
+              // SelectManager 是kdtable中行管理类
+              ArrayList blocks = tblMain.getSelectManager().getBlocks();
+              ArrayList idList = new ArrayList();
+              Iterator iter = blocks.iterator();
+              while (iter.hasNext()) {
+                 KDTSelectBlock block = (KDTSelectBlock) iter.next();
+                 int top = block.getTop();
+                 int bottom = block.getBottom();
+
+
+                 for (int rowIndex = top; rowIndex <= bottom; rowIndex++)
+                {
+                     ICell cell = tblMain.getRow(rowIndex).
+                              getCell(getKeyFieldName());
+
+
+                     if (!idList.contains(cell.getValue())) {
+                        idList.add(cell.getValue());
+                     }
+                 }
+              }
+              String[] listId = null;
+              if (idList != null && idList.size() > 0) {
+                 Iterator iterat = idList.iterator();
+                 listId = new String[idList.size()];
+                 int index = 0;
+                 while (iterat.hasNext()) {
+                     listId[index] = (String) iterat.next();
+                     index++;
+                 }
+              }
+              return listId;
+           }
+
+
+
+
+
+
+
+
+
+       9 关于数字精度的设置
+
+
+
+       private void changeShowData(int fistRow, int lastRow)
+          throws EASBizException, BOSException
+       {
+              for (int i = fistRow; i <= lastRow; i++)
+             {
+                 IRow row = tblMain.getRow(i);
+                 // 根据币别设置精度
+                 ICell cell = row.getCell(“columnName”);
+
+
+                 //假定精度为2
+                 int precision = 2;
+                 if (cell != null && cell.getValue() != null) {
+                     try {
+                                            precision                      =
+       Integer.parseInt(cell.getValue().toString());
+                     } catch (Exception e) {
+                        precision = 2;
+                     }
+                 }
+           // 当该行的币别精度不能于原币精度时才更改精度
+           if (precision != basePrecision) {
+                     for (int j = 0; j <rowcount; j++) {
+
+
+
+       tblMain.getColumn("billDate").getStyleAttributes().setNumberFormat(
+                       "%{yyyy-MM-dd}t");
+
+
+       tblMain.getColumn("debitFor").getStyleAttributes().setNumberFormat(
+                       "%r{#,##0.00}f");
+
+
+
+       tblMain.getColumn("debitFor").getStyleAttributes().setHorizontalAlign(
+
+
+                       HorizontalAlignment.RIGHT);
+
+
+               tblMain.getColumn("endBalanceFor").getStyleAttributes()
+                       .setNumberFormat("%r{#,##0.00}f");
+
+
+               tblMain.getColumn("endBalanceFor").getStyleAttributes()
+                       .setHorizontalAlign(HorizontalAlignment.RIGHT);
+
+
+                     }
+                 }
+              }
+           }
+
+
+
+
+
+
+
+
+
+       10 返回当前列表的主键
+
+           protected String getKeyFieldName() {
+              return "id";
+           }
+
+
+
+
+
+
+
+
+
+       11 返回列表界面对应的编辑界面名称
+
+           protected String getEditUIName() {
+              return  client.PurOrderEditUI.class.getName();
+           }
+
+
+
+
+
+
+
+
+
+       12 返回远程调用接口
+
+           protected com.kingdee.eas.framework.ICoreBase getBizInterface()
+          throws Exception {
+              return  PurOrderFactory.getRemoteInstance();
+           }
+
+
+   编辑界面常用代码
+
+
+1 获取菜单参数
+
+   getUIContext().get("UIClassParam")
+
+2 客户端环境工具类
+
+       com.kingdee.eas.common.client.SysContext                           ;
+   静态存储用户当前登录信息,登录的当前组织信息(ContextUtil在服务端使用)
+
+
+
+    获得当前用户的环境变量
+
+    Context ctx = SysContext.getSysContext();
+
+   获得当前财务组织,其他组织如:销售等也可从环境变量中取得
+
+
+    SysContext.getSysContext().getCurrentFIUnit();
+
+    SysContext.getSysContext().getCurrentUserInfo() 取得用户信息
+
+
+
+
+
+
+3 获取公司行政组织
+
+
+
+    ICompanyOrgUnit    comOrg =null;
+
+   comOrg                                                                 =
+com.kingdee.eas.basedata.org.CompanyOrgUnitFactory.getRemoteInstance();
+
+
+   CompanyOrgUnitInfo   comOu   =ICompanyOrgUnit.getCompanyOrgUnitInfo(***)
+   根据不同需要调用相应方法。
+
+
+
+
+
+4 获取当前公司本位币
+
+
+
+    companyOrgUnitInfo.getBaseCurrency()
+
+
+
+
+
+5 期间工具
+
+
+
+   com.kingdee.eas.basedata.assistant.PeriodUtils
+   提供静态方法可获取期间,进行期间运算、比较等功能
+
+
+
+
+
+
+6 获取资源文件
+
+
+
+
+       EASResource.getString("com.kingdee.eas.base.TestResource","periodName"
+       )   注:TestResource 为bos中对应的资源文件名
+
+
+
+
+
+
+7 消息框
+
+
+
+   com.kingdee.eas.util.client.MsgBox.showWarning("***");
+   提供message对话框,只能在客户端使用,msgbox中提供了多种方法
+
+
+
+
+
+8 SysUtil.abort()
+
+
+
+    停止当前UI的所有操作,或终止服务端方法
+
+
+
+
+
+
+9 com.kingdee.eas.base.uiframe.UIFactoryHelper
+
+
+
+   可指定UI名称动态生成UI由用户加到java的panel中,实现多页签
+
+
+   com.kingdee.eas.base.uiframe.UIFactory.initUIObject(XXXXX)方法
+
+
+   可指定UI名称动态生成UI由框架自动载入
+
+
+
+
+
+
+10 Tree操作
+
+
+
+   com.kingdee.eas.basedata.org.client.tree.NewOrgTreeHelper
+   提供了多种构造组织树的静态方法
+
+
+   com.kingdee.eas.basedata.org.client.f7.*
+
+
+    如:
+        KDTree tree.setModel(new DefaultTreeModel(nodes));
+
+            TreePath path = new TreePath(rootNode.getPath());
+
+            tree.expandPath(path);
+
+            tree.setSelectionPath(path);
+
+
+
+
+
+
+11 获取编号
+
+
+
+   ICodingRuleManager iCodingRuleManager = null;
+
+
+   iCodingRuleManager  =  CodingRuleManagerFactory.getRemoteInstance();
+
+
+   //判断规则是否存在
+
+
+    iCodingRuleManager.isExist(billInfo, companyID)
+
+   //是否启用断号支持
+
+
+    iCodingRuleManager.isUseIntermitNumber(billInfo, companyID)
+
+    //读取当前最新编码
+
+    String sysNumber =  iCodingRuleManager.readNumber(billInfo,  companyID);
+
+
+    //没有启用断号支持功能,则获取编码规则产生的编码
+
+    String sysNumber  =  iCodingRuleManager.getNumber(billInfo,  companyID);
+
+
+
+
+
+
+12 获取汇率
+
+
+
+     IExchangRate  iexchangRate  =  ExchangeRateFactory.getRemoteInstance();
+汇率对象
+
+    companyOrgUnitInfo.getBaseExchangeTable().getId();
+
+   //获取当前公司汇率表
+
+
+   ExchangeRateInfo erInfo =  iexchangRate.getExchangeRate(exchangeTableID,
+   sourceCurrencyID,                                        destCurrencyID,
+   Calendar.getInstance().getTime());取得该公司两种
+
+
+   币别之间的汇率
+
+
+
+
+
+
+
+
+
+   13 数据库工具类
+
+
+
+   com.kingdee.eas.util.app.DbUtil
+   提供静态方法对数据库进行操作,不需要关注后台的数据库资源的释放(由系统处理)
+
+
+
+
+    如:executeQuery、execute
+
+
+
+
+
+14 常用数据格式
+
+
+
+                                                tblMain.getColumn("billDate"
+).getStyleAttributes().setNumberFormat("%{yyyy-MM-dd}t");
+
+
+tblMain.getColumn("creditFor").getStyleAttributes().setNumberFormat("%r{#,##
+0.00}f");
+
+   tblMain.getColumn("debitFor"
+   ).getStyleAttributes().setHorizontalAlign(HorizontalAlignment.RIGHT);
+
+
+
+
+
+
+
+
+
+   15 初始化单据分录中的数据
+
+
+
+        protected IObjectValue createNewDetailData(KDTable table)
+    {
+       PurOrderEntryInfo t2 = new PurOrderEntryInfo();
+           t2.set***(*);      //新增明细行时进行初始化
+       return t2;
+    }
+
+
+
+16 载入编辑界面时设置明细默认值
+
+
+    protected com.kingdee.bos.dao.IObjectValue createNewData()
+   {
+       //new 一个值对象
+
+
+        PurOrderInfo objectValue = new PurOrderInfo();
+
+        objectValue.getEntrys().add(new PurOrderEntryInfo());
+
+       objectValue.setCompany((CompanyOrgUnitInfo)(
+       SysContext.getSysContext().getCurrentFIUnit()));
+
+
+       objectValue.setCreator((UserInfo)(
+       SysContext.getSysContext().getCurrentUser()));
+
+
+        return objectValue;
+   }
+
+
+
+
+
+   17 BigDecimal类型的使用方式:
+
+
+
+   BigDecimal amounts = new BigDecimal(String.valueOf(0.00));
+
+
+
+
+
+
+
+   18 构造ObjectUuidPK
+
+
+
+   ObjectUuidPK pk = new ObjectUuidPK(paymentInfo.getId());
+
+
+
+
+
+
+
+   19 组织转换
+
+
+
+   SysContext.getSysContext().getCurrentFIUnit().castToFullOrgUnitInfo();
+
+
+
+
+
+
+
+
+
+   20 获取不同类型的组织视图
+
+   如:公司、成本中心、责任中心等
+   OrgViewF7 orgF7 = new OrgViewF7(this);
+
+
+   orgF7.setCurrentCUID(company.getId().toString());
+
+
+   orgF7.setMultiSelect(false);
+
+
+   orgF7.setOrgViewTypes(new OrgViewType[]{OrgViewType.COMPANY});
+
+
+   orgF7.setIsShowSub(true);
+
+
+   prmptCompany.setSelector(orgF7);
+
+
+
+
+
+21 弹出指定的F7框
+
+
+   KDCommonPromptDialog dlg = (KDCommonPromptDialog) selector;
+
+
+        if (dlg==null)
+        {
+          dlg = new KDCommonPromptDialog() ;
+          if(dlg.getQueryInfo()==null)
+          {
+              dlg.setQueryInfo(boxBizEle.getQueryAgent().getQueryInfo() );
+
+              try
+              {
+                                                   dlg.setEntityViewInfo(new
+EntityViewInfo(boxBizEle.getQueryAgent().getRuntimeEntityView().toString()))
+;
+              }
+              catch (com.kingdee.bos.sql.ParserException e)
+              {
+                 e.printStackTrace();
+              }
+
+
+dlg.setSelectorCollection(boxBizEle.getQueryAgent().getSelectorCollection())
+;
+
+
+dlg.setQueryExecutor(boxBizEle.getQueryAgent().getQueryExecutor());
+
+
+dlg.setEnabledMultiSelection(boxBizEle.getQueryAgent().isEnabledMultiSelecti
+on());
+
+
+dlg.setReturnValueType(boxBizEle.getQueryAgent().getReturnValueType());
+          }
+        }
+        dlg.show();
+
+        if (!dlg.isCanceled())
+        {
+          boxBizEle.setValue( ((Object[])dlg.getData())[0]);
+
+          ICell cell = pnlTables.getFoucusCell();
+
+          if(cell!=null)
+
+cell.setValue(((BgContractInfo)((Object[])dlg.getData())[0]).getContractNum(
+));
+        }
+
+
+   常用F7 Query
+
+
+1 科目F7
+
+   com.kingdee.eas.basedata.master.account.app.F7AccountViewQuery
+
+2 科目表
+
+   com.kingdee.eas.basedata.master.account.app.AccountTableQuery
+
+3 客户F7
+
+   com.kingdee.eas.basedata.master.cssp.app.F7CustomerQuery
+
+4 供应商F7
+
+   com.kingdee.eas.basedata.master.cssp.app.F7SupplierQuery
+
+5 客商统一码F7
+
+   com.kingdee.eas.basedata.master.cssp.app.F7BizAnalysisCodeQuery
+
+6 物料F7
+
+   com.kingdee.eas.basedata.master.material.app.F7MaterialQuery
+
+7 辅助核算F7
+
+   com.kingdee.eas.basedata.master.auxacct.app.F7AsstAccountQuery
+
+8 币别F7
+
+   com.kingdee.eas.basedata.assistant.app.F7CurrencyQuery
+
+9 辅助核算类型F7
+
+   com.kingdee.eas.basedata.master.auxacct.app.F7AsstActTypeQuery
+
+
+
+   10 汇率F7
+
+   com.kingdee.eas.basedata.assistant.app.F7ExchangeRateQuery
+
+11 银行账户F7
+
+   com.kingdee.eas.basedata.assistant.app.F7AccountBankQuery
+
+12 银行F7
+
+   com.kingdee.eas.basedata.assistant.app.F7BankQuery
+
+13 用户F7
+
+   com.kingdee.eas.base.permission.app.F7UserQuery
+
+14 银行F7
+
+   com.kingdee.eas.basedata.assistant.app.F7BankQuery
+
+
+
+   代码实例
+
+
+
+1 单据新增代码
+
+   如:新增一行付款单
+
+
+   //构造一条付款单信息(构造值对象)
+
+
+   PaymentBillInfo payInfo = new PaymentBillInfo();
+
+
+   payInfo.setNumber(“1001”);
+
+
+   //关联用户
+   UserInfo userInfo = new UserInfo();
+
+
+   userInfo.setId(BOSUuid.read("867d5df6-00f8-1000-e000-0009c0a81089sysu"));
+    //通过BOSUuid建立实体对象
+
+
+    userInfo.setName(“John”);
+
+
+    userInfo.setNumber(“2000”);
+   BigDecimal ex = new BigDecimal("343434.445");//建立属性
+
+
+   BigDecimal ex2 = new BigDecimal(12345678901234567.8);//错误
+
+
+   payInfo.setExchangeRate(ex);
+
+
+   payInfo.setCreator(userInfo);
+
+
+   payInfo.setAuditDate(new Date(System.currentTimeMillis()));//时间属性
+
+
+   Timestamp createdate =  new Timestamp(System.currentTimeMillis());
+
+
+   payInfo.setCreateDate(createdate);
+
+
+   payInfo.setBizState(BillBizState.create);//枚据属性
+
+
+   payInfo.setSave(true);//Boolean 属性
+
+
+   PaymentBillItemInfo itemInfo =   new PaymentBillItemInfo();//建立分录
+
+
+   itemInfo.setLineNo(34);
+
+
+   itemInfo.setAmounts(ex2);
+
+
+   payInfo.getEntries().add(itemInfo);//添加分录
+
+
+   payInfo.getEntries().add(new ErrandTaskItemInfo());//添加分录
+
+    调用新增方法进行保存
+
+                    IPaymentBill                 iPayBill                  =
+PaymentBillFactory.getRemoteInstance();//获取实体
+
+   IObjectPK                              pk                               =
+iPayBill.addnew(payInfo);//保存值对象,返回逻辑键,可以通过逻辑键获取值对象(
+如下)
+
+2 单据修改代码
+
+   修改一条付款单信息
+
+
+   IPaymentBill iPayBill = PaymentBillFactory.getRemoteInstance();
+
+   String id="8b35b903-00f8-1000-e000-0008c0a81089errt";
+
+
+   ObjectUuidPK pk = new ObjectUuidPK(BOSUuid.read(id));//建立逻辑键
+
+
+   PaymentBillInfo payInfo = iPayBill.getValue(pk);//获取值对象;
+
+
+   System.out.println("this:"+ payInfo.getExchangeRate());//获取属性
+
+
+   payInfo.setExchangeRate(ex);//修改属性属性
+
+
+   iPayBill.update(pk, payInfo);//更新数据
+
+
+3 单据删除代码
+
+   iPayBill.remove(pk);//通过逻辑键删除单据内容获取集合
+
+
+4 获取集合
+
+      CurrencyInfo cur = new CurrencyInfo();
+
+
+      ICurrency c = CurrencyFactory.getRemoteInstance();//建立实体对象
+      EntityViewInfo evi = new EntityViewInfo();//建立视图信息
+
+
+      FilterInfo i = new FilterInfo();//建立过滤条件
+
+
+      i.getFilterItems().add(new      FilterItemInfo("number",      "ddff",
+      CompareType.EQUELS));
+
+
+           i.getFilterItems().add(new     FilterItemInfo("id",      "ddff",
+      CompareType.EQUELS));
+
+
+       i. setMaskString(" (#0 and #1)");
+
+
+      evi.setFilter(i);//添加过滤条件
+
+
+      evi.getSelector().add(new SelectorItemInfo("id"));//添加获取属性
+
+
+      evi.getSelector().add(new SelectorItemInfo("*"));
+
+
+      evi.getSelector().add(new SelectorItemInfo("company.id"));
+
+
+      evi.getSelector().add(new SelectorItemInfo("company.name"));
+
+
+      //三种获取集合方法
+
+
+      1. 获取所有数据:
+      CurrencyCollection co = c. getCurrencyCollection ();//获取集合
+
+
+
+
+      2. 获取满足上述条件的所有数据
+      CurrencyCollection co = c.getCurrencyCollection(evi);//获取集合
+
+
+
+
+      3. 获取满足oql所写的条件的所有数据
+      CurrencyCollection co = c. getCurrencyCollection (evi);//获取集合
+
+
+
+      5 获取值对象
+
+       CurrencyInfo cur = new CurrencyInfo();
+       ICurrency c = CurrencyFactory.getRemoteInstance();//建立实体对象
+       String id="8b35b903-00f8-1000-e000-0008c0a81089errt";
+       ObjectUuidPK pk = new ObjectUuidPK(BOSUuid.read(id));//建立逻辑键
+       c.getValue(pk);  或 : c.getCurrencyInfo(pk);
+
+
+
+
+
+       6 界面之间传递参数
+
+      1. 收集父界面要传递给子界面的参数集
+       HashMap map = new HashMap();
+              map.put("Owner", this); //必须。被启动UI的父UI对象
+              map.put("EASMode", new Integer(this.EASMode));
+              map.put("table", this.accountTablePrompBox.getData());
+              map.put("cu", currentCtrlUnit);
+              map.put("auxAccount", this.asstAccountPromptBox.getData());
+
+
+              IUIFactory uiFactory = null;
+              uiFactory = UIFactory
+
+.createUIFactory("com.kingdee.eas.base.uiframe.client.UIModelDialogFactory")
+; //以模态对话框方式启动
+
+IUIWindow                             uiWindow                             =
+uiFactorycreate("com.kingdee.eas.basedata.master.auxacct.client.AccountSelec
+tUI", /* 被启动对象的类名称 */
+                           map);
+              uiWindow.show();
+      2. 在子界面获取传递下来的数据
+private void loadContext()
+{
+   int mode =  ((Integer)this.getUIContext().get("EASMode")).intValue();
+   AccountTableInfo       accountTableInfo       =       (AccountTableInfo)
+this.getUIContext().get("table");
+   CtrlUnitInfo cuInfo = (CtrlUnitInfo) this.getUIContext().get("cu");
+AsstAccountInfo         asstAccountInfo         =          (AsstAccountInfo)
+this.getUIContext().get("auxAccount");
+   AuxAccountEditUI           ui            =            (AuxAccountEditUI)
+this.getUIContext().get("Owner");
+}
+
+
+7 给Query传过滤条件
+
+   EntityViewInfo evi = new EntityViewInfo();
+       FilterInfo filterInfo = new FilterInfo(); //建立过滤条件
+       filterInfo.getFilterItems().add(
+              new FilterItemInfo("typelink.id", info.getId(),
+                    CompareType.EQUALS));
+       filterInfo.getFilterItems().add(
+              new FilterItemInfo("currencyCompany.id", companyID,
+                    CompareType.EQUALS));
+       filterInfo.setMaskString("#0 and #1 ");
+       evi.setFilter(filterInfo);
+
+
+       if (mainQuery == null) {
+           mainQuery = new EntityViewInfo();
+       }
+
+
+       mainQuery.setFilter(filterInfo); //添加过滤条件
+       this.execQuery();
+
+
+
+   8 接口方法的访问方式
+
+      3. 客户端访问
+       CurrencyInfo cur = new CurrencyInfo();
+       ICurrency c = CurrencyFactory.getRemoteInstance();//建立实体对象
+       c. getCurrencyCollection();
+      4. 服务端访问
+       CurrencyInfo cur = new CurrencyInfo();
+       ICurrency c = CurrencyFactory. getLocalInstance (ctx);//建立实体对象
+       c. getCurrencyCollection();
+
+
+
+       9 传递上下文参数的接口访问方式
+
+       PurOrderInfo cur = new PurOrderInfo();
+       IPurOrder              c              =              PurOrderFactory.
+   getRemoteInstanceWithObjectContext(ctx);//建立实体对象
+       c. getPurOrderCollection();
+
+
+     另query也支持上下文参数:
+     IQueryExecutor                          exec                          =
+     QueryExecutorFactory.getRemoteInstance(queryPK,ctx);
+     …
+
+10 控件的初始化
+
+       1.使用枚举给ComboBox控件赋值
+       public void setReceiveType()
+           {
+               this.kDComboBox2.removeAllItems();
+               List list = new List();
+               Iterator it = ReceiveType.iterator();
+               while (it.hasNext())
+               {
+                   list.add(ReceiveType.getEnum(it.toString()).toString());
+               }
+          }
+
+
+       2.使用值对象集合给ComboBox控件赋值
+        // 获取结算方式列表
+                   IAsstActTypeDefault            iAsstActType             =
+AsstActTypeDefaultFactory.getRemoteInstance();
+        AsstActTypeDefaultCollectioni asstActTypeColl = iAsstActType
+                .getAsstActTypeDefaultCollection(" where isAccountCussent  =
+1");
+        AsstActTypeDefaultInfo defaultVal = null;
+        int count = asstActTypeColl.size();
+        Object[] typeValue = new Object[count];
+        for (int i = 0; i < count; i++)
+        {
+              AsstActTypeDefaultInfo   value   =    (AsstActTypeDefaultInfo)
+asstActTypeColl.get(i);
+            if (value.isIsDefaultAccountPayable())
+            {
+                defaultVal = value;
+            }
+          ObjectUuidPK                pk                =                new
+       ObjectUuidPK(BOSUuid.read(value.getAsstActType().getString("id")));
+                       AsstActTypeInfo              asstInfo               =
+AsstActTypeFactory.getRemoteInstance().getAsstActTypeInfo(pk);
+            //cbi[i] = new ComBoxInfo(asstInfo, asstInfo.getName(), true);
+            String typeName = asstInfo.getName();
+            String typeId = asstInfo.getId().toString();
+            String typeQueryName = asstInfo.getDefaultQueryName();
+            String typeTableName = asstInfo.getRealtionDataObject();
+            int csType = 0; //asstActTypeInfo.getCsType().getValue();
+              asstActType   =   new    AsstActTypeUtils(typeName,    typeId,
+typeTableName, typeQueryName, csType);
+
+            typeValue[i] = (Object) asstActType;
+
+        }
+
+        ///String strQueryName = "F7SupplierQuery";
+        this.kDComAccountCussentType.removeAllItems();
+        this.kDComAccountCussentType.addItems(typeValue);
+        this.kDComAccountCussentType.setSelectedIndex(0);
+
+
+11 F7赋值
+
+      ObjectUuidPK pk = new ObjectUuidPK(id);
+                              IObjectValue             objVal             =
+      DynamicObjectFactory.getRemoteInstance().getValue(pk.getObjectTypei(),
+       pk);
+                bizPrompt.setData(objVal);
+private void setCompanyF7()
+    {
+        //公司的F7的设置
+        OrgType[] CompanyType = { OrgType.Company };
+
+        //首先定义需要显示那些树,这里只显示财务树
+        //为F7控件指定PromptBox
+        this.bizPromptCompany.setEditFormat("$number$");
+        this.bizPromptCompany.setDisplayFormat("$name$");
+        this.bizPromptCompany.setEditable(true);
+        this.bizPromptCompany.setCommitFormat("$number$");
+
+       OrgUnitTreePromptBox  boxCompany  =  new   OrgUnitTreePromptBox(this,
+       CompanyType, null,
+                OrgSelect.OnlySelectCompanyEntity, false, false, false);
+        bizPromptCompany.setSelector(boxCompany);
+        bizPromptCompany.setData(currentCompany);
+        bizPromptCompany.setEnabled(false);
+   }
+
+
+   //设置币别
+       private void setCurrency() throws EASBizException, BOSException
+       {
+           ICurrency iCurrency = null;
+           CurrencyCollection con = null;
+           try
+           {
+               iCurrency = CurrencyFactory.getRemoteInstance();
+               con = iCurrency.getCurrencyCollection(true);
+           }
+           catch (Exception e)
+           {
+               // TODO 自动生成 catch 块
+              MsgBox.showError(this,    EASResource.getString(resClassName,
+"currencyFail"));
+           SysUtil.abort();
+           }
+           if (con != null)
+           {
+               Object[] typeValue = new Object[con.size()];
+               int j = 0;
+               for (int i = 0; i < con.size(); i++)
+               {
+                   CurrencyInfo currencyInfo = (CurrencyInfo) con.get(i);
+                   String typeName = currencyInfo.getName();
+                   String typeId = currencyInfo.getId().toString();
+                   String typeQueryName = currencyInfo.getNumber();
+                  asstActType  =  new  AsstActTypeUtils(typeName,   typeId,
+typeQueryName);
+                   if (asstActType != null)
+                   {
+                       typeValue[i] = (Object) asstActType;
+if(typeId.equalsIgnoreCase(((CurrencyInfo)currentCompany.getBaseCurrency()).
+getId().toString()))
+                       {
+                           j = i;
+                       }
+                   }
+               }
+
+
+               this.bizPromptcurrency.removeAllItems();
+               this.bizPromptcurrency.addItems(typeValue);
+               //默认值为当前公司的本位币
+               this.bizPromptcurrency.setSelectedIndex(j);
+           }
+           else
+           {
+              MsgBox.showError(this,    EASResource.getString(resClassName,
+"currencyFail"));
+               SysUtil.abort();
+           }
+       }
+
+
+
+
+
+   12 设置单据分录单元格格式
+
+   // 设置单据分录格式
+           getDetailTable().getColumn(TB_RELABILL).setWidth(100);
+           getDetailTable().getColumn(TB_ORGUNIT).setWidth(180);
+           getDetailTable().getColumn(TB_BIZMAN).setWidth(100);
+
+   getDetailTable().getColumn(TB_PAYAMOUNT).setEditor(number_CellEditor);
+
+   getDetailTable().getColumn(TB_PAYAMOUNT).getStyleAttributes().setNumberFor
+   mat("%r-[=]{#.00}f");
+   getDetailTable().getColumn(TB_PAYAMOUNT).getStyleAttributes().setHorizonta
+   lAlign(HorizontalAlignment.RIGHT);
+
+
+
+
+
+   13 设置单元格可编辑
+
+for (int i = 0; i < kdtEntrys.getRowCount(); i++)
+ {
+
+kdtEntrys.getRow(i).getCell("orgUnit").getStyleAttributes().setLocked(false)
+;
+
+kdtEntrys.getRow(i).getCell("bizMan").getStyleAttributes().setLocked(false);
+
+ }
+
+//如果折扣金额为null则初始化为0
+ if (kdtEntrys.getRow(i).getCell("discountAmount").getValue() == null)
+ {
+                  kdtEntrys.getRow(i).getCell("discountAmount").setValue(new
+BigDecimal("0.0"));
+ }
+
+//汇总分录行金额
+BigDecimal amount = new BigDecimal("0");
+for (int i = 0, n = kdtEntrys.getRowCount(); i < n; i++)
+{
+amount = amount.add(UIRuleUtil.getBigDecimal(UIRuleUtil.getBigDecimalValue
+(kdtEntrys.getCell(i,TB_PAYAMOUNT).getValue())));
+}
+this.txtTotalAmounts.setText(null);
+this.txtTotalAmounts.setEnable(false);
+this.txtTotalAmounts.setText(amount);
+
+//和零比较
+if (amount.compareTo(new BigDecimal("0.00")) == 0)
+
+
+
+14 删除行
+
+public void actionDeleteLine_actionPerformed(ActionEvent e)throws  Exception
+{
+       IRow row = getSelectedRow();
+       if (row != null) {
+          kDTable1.removeRow(row.getRowIndex());
+       }
+    }
+
+
+
+
+15 F7专用选择界面的设置
+
+public void setF7Selector() throws Exception
+    {
+       KDBizPromptBox bizPromptBox = new KDBizPromptBox();// 要绑定的F7控件
+       CoreUIObject ui = null;// 父界面对象
+       CompanyOrgUnitInfo companyInfo = null; // 当前财务组织
+
+       // 客户
+                                                bizPromptBox.setSelector(new
+GeneralKDPromptSelectorAdaptor(bizPromptBox,                             new
+F7CustomerTreeDetailListUI(), ui));
+
+       // 供应商
+                                                bizPromptBox.setSelector(new
+GeneralKDPromptSelectorAdaptor(bizPromptBox,                             new
+F7SupplierTreeDetailListUI(), ui));
+
+       // 物料
+                                                bizPromptBox.setSelector(new
+GeneralKDPromptSelectorAdaptor(bizPromptBox,   new   F7MaterialTreeListUI(),
+ui));
+
+       // 职员
+       HashMap map = new HashMap();
+       map.put(PersonF7UI.ALL_ADMIN, "YES");
+       bizPromptBox.setSelector(new PersonPromptBox(ui, map));
+
+       // 公司
+       CompanyF7 org = new CompanyF7(ui);
+       org.setRootUnitID("");
+       bizPromptBox.setSelector(new CompanyF7(ui));
+
+       // 成本中心
+       bizPromptBox.setSelector(new CostCenterF7(ui));
+
+       // 行政组织
+       bizPromptBox.setSelector(new AdminF7(ui));
+
+       // 采购组织
+       bizPromptBox.setSelector(new PurchaseF7(ui));
+
+       // 库存组织
+       bizPromptBox.setSelector(new StorageF7(ui));
+
+       // 销售组织
+       bizPromptBox.setSelector(new SaleF7(ui));
+
+       // 利润中心组织
+       bizPromptBox.setSelector(new ProfitCenterF7(ui));
+
+       // 利润中心组织
+       bizPromptBox.setSelector(new ProfitCenterF7(ui));
+
+       // 科目
+       bizPromptBox.setSelector(new  AccountPromptBox(ui,  companyInfo,  new
+FilterInfo()));
+    }
+
+
+16 获取各模块系统状态信息
+
+public void getSystemStatue() throws EASBizException, BOSException
+    {
+       CompanyOrgUnitInfo companyInfo = null; // 当前财务组织
+                             //                       SystemStatusCtrolUtils
+工具类可获取各模块系统状态信息,如当前会计期间,系统是否启用或关闭等信息
+                              SystemStatusCtrolUtils.getCurrentPeriod(null/*
+上下文信息,如在客户端使用可为null      */,      SystemEnum.ACCOUNTSPAYABLE,
+companyInfo/**/);
+    }
+
+
+17 获取当前登陆信息
+
+public void getSystemInfo()
+    {
+       // SysContext工具类可获取当前登陆用户的信息,可根据需要进行调用。
+       // 举两例如下:
+                          SysContext.getSysContext().getCurrentUserInfo();//
+获取当前登陆用户信息
+       SysContext.getSysContext().getCurrentFIUnit();// 获取当前财务组织
+    }
+
+
+
+18 获取参数平台参数设置的示例代码
+
+public void getParam() throws EASBizException, BOSException
+    {
+       CompanyOrgUnitInfo companyInfo = null; // 当前财务组织
+       ObjectUuidPK orgPk = new ObjectUuidPK(companyInfo.getId());
+
+                                                                          //
+ParamManager工具类提供了不同的方法获取参数俱,可根据自己的需要进行调用,
+       // 示例如下:
+        ParamManager.getParamValue(null/*   上下文信息,客户端调用可以为null
+*/, orgPk, "AR_INIT_CHECK_TYPE");
+    }
+
+
+
+19 网络互斥功能示手工控制
+
+   public void doMutexService()
+    {
+                    IMutexServiceControl               mutex               =
+MutexServiceControlFactory.getRemoteInstance();
+
+       UserInfo user = null; // 请求锁有用户
+       String billId = null; // 要锁定/解锁的单据Id
+
+       // 请求锁定
+       mutex.requestObjIDForUpdate(billId, user.getString("id"));
+
+       // 解除锁
+       mutex.releaseObjIDForUpdate(billId);
+    }
+
+
+Tree:TreeBase(增加parentid级次)
+Data:DataBase、BillBase(增加关联关系,对Tree的引用)
+
+
+20 Tree- List实现方法1
+
+protected ITreeBase getTreeInterface() throws Exception
+{
+                                                                      return
+com.kingdee.eas.custom.TreeGroupTestTreeFactory.getRemoteInstance();
+}
+
+
+
+21 Tree-List点击树上结点时形成过滤条件时的字段
+
+如:protected String getQueryFieldName()
+{
+return "treeid.id";
+}
+
+
+
+22 Tree-树形控件的初始化级次  [optional]
+
+protected int getTreeInitialLevel()
+{
+    return TreeBuilderFactory.DEFAULT_INITIAL_LEVEL;
+}
+
+
+
+
+23 Tree-树形空间的默认展开级次 [optional]
+
+protected int getTreeExpandLevel()
+{
+    return TreeBuilderFactory.DEFAULT_EXPAND_LEVEL;
+}
+
+
+
+24 Tree-返回树形控件的根名称
+
+protected String getRootName()
+{
+return "TreeGroupTest";
+}
+
+
+
+25 Tree-数据过滤(重载实现对树的过滤)
+
+ getDefaultFilterForTree()方法,是默认的cu过滤条件
+
+
+
+
+26 Tree-控件基本使用
+
+
+1 初始化树形控件
+
+//treeMain控件名
+
+protected void initTree() throws Exception
+{
+
+TreeSelectionListener[] listeners = treeMain.getTreeSelectionListeners();
+
+TreeSelectionListener  treeSelectionListener = listeners[0];
+
+treeMain.removeTreeSelectionListener(treeSelectionListener);
+
+ITreeBuilder treeBuilder
+                                                                           =
+TreeBuilderFactory.createTreeBuilder(getLNTreeNodeCtrl(),getTreeInitialLevel
+() , getTreeExpandLevel(),getDefaultFilterForTree());
+
+if (getRootName() != null)
+{
+
+   KDTreeNode rootNode = new KDTreeNode(getRootObject());
+
+
+   ( (DefaultTreeModel) treeMain.getModel()).setRoot(rootNode);
+
+
+}
+else
+{
+    ( (DefaultTreeModel) treeMain.getModel()).setRoot(null);
+}
+
+//将数据填入控件中
+treeBuilder.buildTree(treeMain);
+
+//增加选择事件
+treeMain.addTreeSelectionListener(treeSelectionListener);
+
+}
+
+
+
+2 返回选中的树结点
+
+public KDTreeNode getSelectedTreeNode()
+{
+    return (KDTreeNode) treeMain.getLastSelectedPathComponent();
+}
+
+
+
+3 返回树结点的值
+
+return (TreeBaseInfo) ((KDTreeNode)
+       treeMain.getLastSelectedPathComponent()).getUserObject();
+
+
+
+
+4 删除类别时刷新当前结点的父结点,并定位到当前结点的父结点。
+
+    KDTreeNode treeNode = (KDTreeNode) treeMain
+        .getLastSelectedPathComponent();
+
+    if (treeNode != null && treeNode.getParent() != null)
+    {
+        TreePath parentPath = treeMain.getSelectionPath().getParentPath();
+
+        KDTreeNode parentNode = (KDTreeNode) treeNode.getParent();
+
+        parentNode.remove(treeNode);
+
+        treeMain.updateUI();
+
+        treeMain.setSelectionPath(parentPath);
+
+              treeBuilder.refreshTreeNode(treeMain       ,        parentNode
+,this.getDefaultFilterForTree());
+
+        treeMain.expandPath(parentPath);
+
+    }
+
+
+
+//刷新Query数据
+CacheServiceFactory.getInstance().discardQuery(this.mainQueryPK);
+
+
+5 设置选中根结点
+
+treeMain.setSelectionRow(0);
+
+
+
+
+
+6 类别新增与修改时,刷新当前选中结点
+
+    KDTreeNode treeNode = (KDTreeNode) treeMain
+        .getLastSelectedPathComponent();
+
+    if (treeNode != null && treeNode.getParent() == null)
+    {
+        TreePath oldPath = treeMain.getSelectionPath();
+
+                       treeBuilder.refreshTreeNode(treeMain                ,
+treeNode,this.getDefaultFilterForTree());
+
+        treeMain.setSelectionPath(oldPath);
+
+        treeMain.expandPath(oldPath);
+
+    }
+
+
+
+
+7 修改类别时刷新当前结点的父结点,并定位到当前结点
+
+             KDTreeNode          treeNode           =           (KDTreeNode)
+treeMain.getLastSelectedPathComponent();
+    if (treeNode != null && treeNode.getParent() != null)
+    {
+        TreePath oldPath = treeMain.getSelectionPath();
+
+        TreePath parentPath = treeMain.getSelectionPath().getParentPath();
+
+        KDTreeNode parentNode = (KDTreeNode) treeNode.getParent();
+
+              treeBuilder.refreshTreeNode(treeMain       ,        parentNode
+,this.getDefaultFilterForTree());
+
+        treeMain.setSelectionPath(TreePathUtil.getNewTreePath(treeMain ,
+                           treeMain.getModel() , oldPath));
+    }
+
+27 手工发送消息
+
+
+
+//以下是发送一个消息的核心片断,如果针对的是某组织批量发送,自己的需要取得组
+织的用户ID集合,然后构造receiver
+SenderAgent senderAgent = SenderAgent.getSenderAgent();
+Message message;
+Locale[] lcla = getContextLocales(ctx);//获取ctx的语言信息列表
+Locale locale = null;
+message = MessageFactory.newMessage("kingdee.workflow");//生成一个消息对象
+for (int j = 0, m = lcla.length; j < m; j++) {
+    //此处循环进行多语言消息的设置
+    locale = lcla[j];
+    message.setLocaleStringHeader("title","标题", locale);//设置消息标题
+               message.setLocaleStringHeader("sender","发送人"             ,
+locale);//设置发送人,属于文本,不是ID
+                                       message.setLocaleStringHeader("body",
+"消息体内容",Locale);//设置消息体内容,根据具体业务自己设定
+}
+
+message.setIntHeader("type", MsgType.NOTICE_VALUE);//设置消息类型为通知
+message.setIntHeader("bizType",
+MsgBizType.WORKFLOW_VALUE);//业务类型设置为工作流
+message.setIntHeader("sourceStatus",
+MsgSourceStatus.EMPTY_VALUE);//设置任务状态,此处是通知消息,所以设置空
+message.setIntHeader("priority",
+MsgPriority.MIDDLE_VALUE);//设置消息优先级,自己根据需要设定相应的级别
+
+message.setStringHeader("databaseCenter", ctx.getAIS());//得到数据中心
+message.setStringHeader("solution", ctx.getSolution());//设置解决方案
+
+message.setStringHeader("receiver",                '4ff9eebb-0108-1000-e000-
+15acc0a813c813B7DE7F;4ff9eebb-0108-1000-e000-1db0c0a813c813B7DE7F');
+//设置接收者,后面那参数是用户ID,多个ID可用分号";"分割
+senderAgent.sendMessage(message); //发送消息
+
+
+
+
+/**
+
+                           *                           获取ctx的语言信息列表
+
+                                                                           *
+
+                      *                      @param                      ctx
+
+                                  *                                  @return
+
+                                                                          */
+
+public     static     Locale[]     getContextLocales(Context     ctx)      {
+
+    Locale[] locales = null;
+    SolutionInfo solu = MetaDataLoaderFactory.getLocalMetaDataLoader(ctx)
+          .getSolution();
+
+
+    if (solu != null) {
+       LanguageCollection langs = solu.getLanguages();
+       if (langs != null) {
+
+
+          locales = new Locale[langs.size()];
+
+
+          for (int i = 0; i < langs.size(); i++) {
+              locales[i] = langs.get(i).getLocale();
+          }
+       }
+    }
+
+
+    return locales;
+}
+
+
+                          <完>

+ 1525 - 0
BOS开发/EASBOS开发客户端端常用代码.pdf

@@ -0,0 +1,1525 @@
+1                   ............................................................................................................... 3
+
+   1.1                  ................................................... 3
+
+   1.2              .......................................................................................................... 5
+   MAIN Q UERY
+   1.3                  ................................................................... 5
+   1.4
+   1.5              ....................................................................................................... 6
+   1.6
+   1.7          ........................................................................................................................... 6
+   1.8
+   1.9          UI  UI  .................................................................. 7
+   1.10
+   1.11             ................................................................................................................... 7
+   1.12
+                    ID .............................................................................................. 8
+
+                    ....................................................................................................... 9
+
+                    ................................................................................................. 10
+
+                        ......................................................................... 11
+
+                    ..................................................................................................... 11
+
+2                   ............................................................................................................. 11
+
+   2.1              ................................................................................................................. 11
+
+   2.2              ......................................................................................................... 11
+
+   2.3              ......................................................................................................... 12
+
+   2.4              ..................................................................................................... 12
+
+   2.5          ......................................................................................................................... 12
+
+   2.6              ................................................................................................................. 12
+
+   2.7          ............................................................................................................................. 13
+
+   2.8 SYS UTIL .ABORT () ............................................................................................................ 13
+
+   2.9 COM .KINGDEE .EAS.BASE .UIFRAME .UIF ACTORY HELPER ................................................. 13
+
+   2.10 TREE    ....................................................................................................................... 14
+
+   2.11             ..................................................................................................................... 14
+
+   2.12             ..................................................................................................................... 15
+
+   2.13             ............................................................................................................. 15
+
+   2.14             ............................................................................................................. 15
+
+   2.15                 ......................................................................................... 16
+
+   2.16                 ............................................................................. 16
+
+   2.17 BIGDECIMAL      ................................................................................... 17
+
+   2.18         OBJECT UUID PK.................................................................................................. 17
+
+   2.19             ..................................................................................................................... 17
+
+   2.20                 ......................................................................................... 17
+
+   2.21             F7 ...................................................................................................... 18
+3           F7 QUERY................................................................................................................... 19
+
+   3.1      F7 ........................................................................................................................... 19
+
+   3.2         ............................................................................................................................. 19
+
+   3.3      F7 ........................................................................................................................... 19
+
+   3.4         F7 ....................................................................................................................... 19
+
+   3.5               F7 ............................................................................................................... 19
+
+   3.6      F7 ........................................................................................................................... 19
+
+   3.7              F7 ................................................................................................................... 19
+
+   3.8      F7 ........................................................................................................................... 20
+
+   3.9               F7 ........................................................................................................... 20
+
+   3.10        F7 ....................................................................................................................... 20
+
+   3.11              F7 ............................................................................................................... 20
+
+   3.12        F7 ....................................................................................................................... 20
+
+   3.13        F7 ....................................................................................................................... 20
+
+   3.14        F7 ....................................................................................................................... 20
+
+4              ............................................................................................................................. 20
+
+   4.1               ................................................................................................................. 20
+
+   4.2               ................................................................................................................. 22
+
+   4.3               ................................................................................................................. 22
+
+   4.4              ......................................................................................................................... 22
+
+   4.5               ..................................................................................................................... 23
+
+   4.6                  ......................................................................................................... 23
+
+   4.7      Q UERY      ................................................................................................... 24
+
+   4.8                  ..................................................................................................... 25
+
+   4.9                  ................................................................................. 25
+
+   4.10                 ............................................................................................................. 25
+
+   4.11 F7     ........................................................................................................................... 26
+
+   4.12                 ......................................................................................... 28
+
+   4.13                 ..................................................................................................... 28
+
+   4.14             ......................................................................................................................... 29
+
+   4.15 F7              ................................................................................................ 29
+
+   4.16                 ......................................................................................... 31
+
+   4.17                 ..................................................................................................... 31
+
+   4.18                 ......................................................................... 31
+
+   4.19                 ......................................................................................... 32
+
+   4.20 TREE- L IST     1 ................................................................................................... 32
+
+   4.21 TREE-L IST      ................................................... 32
+
+   4.22 TREE-           [OPTIONAL ] ................................................................. 33
+
+   4.23 TREE-           [ OPTIONAL ] ............................................................... 33
+
+   4.24 TREE-           ....................................................................................... 33
+
+   4.25 TREE-        (  ) ........................................................................ 33
+
+   4.26 TREE-           ....................................................................................................... 34
+
+   4.26.1               ..................................................................................................... 34
+      4.26.2                 ................................................................................................. 35
+      4.26.3             ..................................................................................................... 35
+      4.26.4
+      4.26.5                                                                                         .............35
+      4.26.6             ..................................................................................................... 36
+      4.26.7
+   4.27                                                     ............................................................. 36
+                                                                                    ................................. 3 6
+
+                   ............................................................................................................. 37
+
+1
+
+   tblMain         list  kdTable
+
+1.1
+
+     dialog   bos        CustomerQueryPanel UI
+   Bos
+
+             dialog                  getFilterInfo()
+                         dialog
+
+   ListUI    initCommonQueryDialog
+
+protected CommonQueryDialog initCommonQueryDialog()
+
+{
+
+        dialog = super.initCommonQueryDialog();
+
+        try
+
+        {
+
+             dialog.addUserPanel(getUsierPanel());
+
+             dialog.setShowFilter(true);
+
+             dialog.setShowSorter(true);
+
+             dialog.setHeight(380);
+
+             dialog.setWidth(500);
+
+             dialog.setTitle(                         );
+
+        }
+
+        catch (Exception e)
+
+        {
+
+             handUIException(e);
+           }
+           return dialog;
+     }
+     protected CustomerQueryPanel getUserPanel() throws Exception
+     {
+
+                  if (this.userPanel == null)
+                         this.userPanel = new PurOrderQueryUI();
+
+                  userPanel.onLoad();
+                  return this.userPanel;
+     }
+
+1.2
+
+                              mainQuery
+
+                    protected EntityViewInfo getInitDefaultSolution()
+                    {
+
+                           EntityViewInfo ev = new EntityViewInfo();
+                           FilterInfo filter = new FilterInfo();
+                           // filter
+                           ev.setFilter(filter);
+                           return ev;
+                    }
+
+1.3
+
+     protected boolean initDefaultFilter()
+     {
+
+            return true;
+     }
+1.4
+
+                                                  actionAuditing
+     public void actionAuditing_actionPerformed(ActionEvent e) throws Exception
+     {
+
+            //
+            if (!checkStatus(tblMain, BillStatusEnum.SUBMITED))
+            {
+
+                  MsgBox.showInfo(this,
+                  Day4Resource.getStrResource("isNotSubmitStatus"));
+                  //
+                  SysUtil.abort();
+            }
+            IPurOrder purorder = (IPurOrder) getBizInterface();
+            String[] billIdlist = getSelectedListId();
+
+            //
+            int i = MsgBox.showConfirm2(this, "sureAudit");
+            if (i == MsgBox.OK)
+            {
+
+                  //
+                  purOrder.audit(new ObjectStringPK(bill));
+                  //
+                  //
+                  actionRefresh_actionPerformed(null);
+            }
+     }
+
+1.5
+
+     public void actionCreateTo_actionPerformed(ActionEvent e) throws Exception {
+            checkSelected();
+            //
+        if (!checkStatus(tblMain, BillStatusEnum.AUDITED)) {
+
+            MsgBox.showInfo(this, "billIsUnAudited");
+
+            SysUtil.abort();
+
+        }
+
+        //                      botp
+
+        super.actionCreateTo_actionPerformed(e);
+
+     }
+
+1.6         UI                  UI
+
+     private void makePurOrderUI(PurOrderInfo srcBillInfo)
+
+            throws EASBizException, UIException,
+
+            BOSException, Exception {
+
+        String destBillEditUIClassName = com.kingdee .PurOrderEditUI ;
+
+        Map map = new UIContext(this);
+
+        map.put("srcBillID", srcBillInfo.getId().toString());
+
+        map.put(UIContext.OWNER, this);
+
+        map.put("srcBillBOSTypeString", destBillInfo.getBOSType());
+
+        IUIWindow uiWindow = null ;
+
+        // UIFactoryName.MODEL
+
+        uiWindow = UIFactory.createUIFactory(UIFactoryName.MODEL).
+
+                create(destBillEditUIClassName, map, null,
+
+                OprtState.ADDNEW);
+
+        //          ui
+
+        //((CoreBillEditUI).uiWindow.getUIObject()).
+
+        //setMakeRelations(btpResult.getBOTRelationCollection());
+
+        //      UI
+
+        uiWindow.show();
+
+     }
+
+1.7
+     //
+     protected boolean isCodeRuleEnable(IObjectValue objValue)
+
+            throws EASBizException, BOSException {
+            String companyId = OrgInnerUtils.getCurCompany();
+            ICodingRuleManager codeRuleMgr = null
+            codeRuleMgr = CodingRuleManagerFactory.getRemoteInstance();
+            return codeRuleMgr.isExist(objValue, companyId);
+     }
+
+     //
+     protected String getAutoCode(IObjectValue objValue)
+
+            throws EASBizException, BOSException {
+            String companyId = OrgInnerUtils.getCurCompany();
+            ICodingRuleManager codeRuleMgr = null
+
+            codeRuleMgr = CodingRuleManagerFactory.getRemoteInstance();
+            if (codeRuleMgr.isUseIntermitNumber(objValue, companyId)) {
+
+                  return codeRuleMgr.readNumber(objValue, companyId);
+            } else {
+
+                  return codeRuleMgr.getNumber(objValue, companyId);
+            }
+
+     }
+
+1.8                            id
+
+     //                    id
+
+     public String[] getSelectedListId() {
+
+         checkSelected();
+
+         // SelectManager kdtable
+         ArrayList blocks = tblMain.getSelectManager().getBlocks();
+         ArrayList idList = new ArrayList();
+         Iterator iter = blocks.iterator();
+         while (iter.hasNext()) {
+
+               KDTSelectBlock block = (KDTSelectBlock) iter.next();
+               int top = block.getTop();
+               int bottom = block.getBottom();
+                  for (int rowIndex = top; rowIndex <= bottom; rowIndex++)
+                  {
+
+                         ICell cell = tblMain.getRow(rowIndex).
+                                              getCell(getKeyFieldName());
+
+                         if (!idList.contains(cell.getValue())) {
+                                idList.add(cell.getValue());
+
+                         }
+                  }
+            }
+            String[] listId = null;
+            if (idList != null && idList.size() > 0) {
+                  Iterator iterat = idList.iterator();
+                  listId = new String[idList.size()];
+                  int index = 0;
+                  while (iterat.hasNext()) {
+
+                         listId[index] = (String) iterat.next();
+                         index++;
+                  }
+            }
+            return listId;
+     }
+
+1.9
+
+     private void changeShowData(int fistRow, int lastRow)
+           throws EASBizException, BOSException
+
+     {
+                  for (int i = fistRow; i <= lastRow; i++)
+                  {
+                         IRow row = tblMain.getRow(i);
+                         //
+                         ICell cell = row.getCell( columnName );
+
+     //         2
+
+     int precision = 2;
+
+     if (cell != null && cell.getValue() != null) {
+
+         try {
+
+                precision = Integer.parseInt(cell.getValue().toString());
+                          } catch (Exception e) {
+                                 precision = 2;
+
+                          }
+                   }
+      //
+      if (precision != basePrecision) {
+
+                          for (int j = 0; j <rowcount; j++) {
+
+             tblMain.getColumn("billDate").getStyleAttributes().setNumberFormat(
+                          "%{yyyy-MM-dd}t");
+
+             tblMain.getColumn("debitFor").getStyleAttributes().setNumberFormat(
+                          "%r{#,##0.00}f");
+
+             tblMain.getColumn("debitFor").getStyleAttributes().setHorizontalAlign(
+                          HorizontalAlignment.RIGHT);
+
+             tblMain.getColumn("endBalanceFor").getStyleAttributes()
+                          .setNumberFormat("%r{#,##0.00}f");
+
+             tblMain.getColumn("endBalanceFor").getStyleAttributes()
+                          .setHorizontalAlign(HorizontalAlignment.RIGHT);
+
+                          }
+                   }
+             }
+      }
+
+1.10
+
+      protected String getKeyFieldName() {
+             return "id";
+
+      }
+1.11
+
+      protected String getEditUIName() {
+             return client.PurOrderEditUI.class.getName();
+
+      }
+
+1.12
+
+      protected com.kingdee.eas.framework.ICoreBase getBizInterface()
+      throws Exception {
+
+             return PurOrderFactory.getRemoteInstance();
+      }
+
+2
+
+2.1
+
+     getUIContext().get("UIClassParam")
+
+2.2
+
+      com.kingdee.eas.common.client.SysContext
+
+      (ContextUtil                       )
+
+     Context ctx = SysContext.getSysContext()
+
+     SysContext.getSysContext().getCurrentFIUnit()
+     SysContext.getSysContext().getCurrentUserInfo()
+2.3
+
+     ICompanyOrgUnit  comOrg =null;
+
+     comOrg = com.kingdee.eas.basedata.org.CompanyOrgUnitFactory.getRemoteInstance();
+
+     CompanyOrgUnitInfo comOu =ICompanyOrgUnit.getCompanyOrgUnitInfo(***)
+
+2.4
+
+      companyOrgUnitInfo.getBaseCurrency()
+
+2.5
+
+      com.kingdee.eas.basedata.assistant.PeriodUtils
+
+2.6
+EASResource.getString("com.kingdee.eas.base.TestResource","periodName")
+TestResource bos
+
+2.7                                                                      message
+
+      com.kingdee.eas.util.client.MsgBox.showWarning("***")
+                                                   msgbox
+
+2.8 SysUtil.abort()
+
+                     UI
+
+2.9 com.kingdee.eas.base.uiframe.UIFactoryHelper
+
+UI  UI  java panel
+
+com.kingdee.eas.base.uiframe.UIFactory.initUIObject(XXXXX)
+
+UI  UI
+2.10 Tree
+
+      com.kingdee.eas.basedata.org.client.tree.NewOrgTreeHelper
+
+      com.kingdee.eas.basedata.org.client.f7.*
+          :
+             KDTree tree.setModel(new DefaultTreeModel(nodes));
+                    TreePath path = new TreePath(rootNode.getPath());
+                    tree.expandPath(path);
+                    tree.setSelectionPath(path);
+
+2.11
+
+      ICodingRuleManager iCodingRuleManager = null;
+      iCodingRuleManager = CodingRuleManagerFactory.getRemoteInstance();
+      //
+      iCodingRuleManager.isExist(billInfo, companyID)
+      //
+      iCodingRuleManager.isUseIntermitNumber(billInfo, companyID)
+      //
+      String sysNumber = iCodingRuleManager.readNumber(billInfo, companyID);
+      //
+String sysNumber = iCodingRuleManager.getNumber(billInfo, companyID);
+
+2.12
+
+IExchangRate iexchangRate = ExchangeRateFactory.getRemoteInstance();
+
+companyOrgUnitInfo.getBaseExchangeTable().getId();
+
+//
+
+ExchangeRateInfo  erInfo         =     iexchangRate.getExchangeRate(exchangeTableID,
+
+sourceCurrencyID, destCurrencyID, Calendar.getInstance().getTime());
+
+2.13
+
+com.kingdee.eas.util.app.DbUtil                                        ,
+
+                  (                 )
+
+      executeQuery execute
+
+2.14
+
+     tblMain.getColumn("billDate" ).getStyleAttributes().setNumberFormat("%{yyyy-MM-dd}t");
+tblMain.getColumn("creditFor").getStyleAttributes().setNumberFormat("%r{#,##0.00}f");
+
+tblMain.getColumn("debitFor" ).getStyleAttributes().setHorizontalAlign(HorizontalAlignme
+nt.RIGHT);
+
+2.15
+
+      protected IObjectV alue createNewDetailData(KDTable table)
+
+{
+
+      PurOrderEntryInfo t2 = new PurOrderEntryInfo();
+
+      t2.set***(*);  //
+
+      return t2;
+
+}
+
+2.16
+
+      protected com.kingdee.bos.dao.IObjectValue createNewData()
+       {
+
+             //new
+             PurOrderInfo objectValue = new PurOrderInfo();
+
+             objectValue.getEntrys().add(new PurOrderEntryInfo());
+             objectValue.setCompany((CompanyOrgUnitInfo)( SysContext.getSysContext().getCurre
+             ntFIUnit()));
+             objectValue.setCreator((UserInfo)( SysContext.getSysContext().getCurrentUser()));
+
+             return objectValue;
+       }
+2.17 BigDecimal
+
+     BigDecimal amounts = new BigDecimal(String.valueOf(0.00));
+
+2.18  ObjectUuidPK
+
+ObjectUuidPK pk = new ObjectUuidPK(paymentInfo.getId());
+
+2.19
+
+     SysContext.getSysContext().getCurrentFIUnit().castToFullOrgUnitInfo()
+
+2.20
+
+     OrgViewF7 orgF7 = new OrgViewF7(this);
+     orgF7.setCurrentCUID(company.getId().toString());
+     orgF7.setMultiSelect(false);
+     orgF7.setOrgViewTypes(new OrgViewType[]{OrgViewType.COMPANY});
+     orgF7.setIsShowSub(true);
+     prmptCompany.setSelector(orgF7);
+2.21  F7
+
+      KDCommonPromptDialog dlg = (KDCommonPromptDialog) selector;
+
+             if (dlg==null)
+             {
+
+                    dlg = new KDCommonPromptDialog() ;
+                    if(dlg.getQueryInfo()==null)
+                    {
+
+                           dlg.setQueryInfo(boxBizEle.getQueryAgent().getQueryInfo() );
+
+                           try
+                           {
+
+                                  dlg.setEntityViewInfo(new
+EntityViewInfo(boxBizEle.getQueryAgent().getRuntimeEntityView().toString()));
+
+                           }
+                           catch (com.kingdee.bos.sql.ParserException e)
+                           {
+
+                                  e.printStackTrace();
+                           }
+
+      dlg.setSelectorCollection(boxBizEle.getQueryAgent().getSelectorCollection());
+
+                           dlg.setQueryExecutor(boxBizEle.getQueryAgent().getQueryExecutor());
+
+      dlg.setEnabledMultiSelection(boxBizEle.getQueryAgent().isEnabledMultiSelection());
+
+                           dlg.setReturnValueType(boxBizEle.getQueryAgent().getReturnValueType());
+                    }
+             }
+             dlg.show();
+
+             if (!dlg.isCanceled())
+             {
+
+                    boxBizEle.setValue( ((Object[])dlg.getData())[0]);
+
+                    ICell cell = pnlTables.getFoucusCell();
+
+                    if(cell!=null)
+     cell.setValue(((BgContractInfo)((Object[])dlg.getData())[0]).getContractNum());
+           }
+
+3    F7 Query
+
+3.1  F7
+
+   com.kingdee.eas.basedata.master.account.app.F7AccountViewQuery
+
+3.2
+
+   com.kingdee.eas.basedata.master.account.app.AccountTableQuery
+
+3.3  F7
+
+   com.kingdee.eas.basedata.master.cssp.app.F7CustomerQuery
+
+3.4  F7
+
+   com.kingdee.eas.basedata.master.cssp.app.F7SupplierQuery
+
+3.5      F7
+
+   com.kingdee.eas.basedata.master.cssp.app.F7BizAnalysisCodeQuery
+
+3.6  F7
+
+   com.kingdee.eas.basedata.master.material.app.F7MaterialQuery
+
+3.7      F7
+
+   com.kingdee.eas.basedata.master.auxacct.app.F7AsstAccountQuery
+3.8   F7
+
+   com.kingdee.eas.basedata.assistant.app.F7CurrencyQuery
+
+3.9           F7
+
+   com.kingdee.eas.basedata.master.auxacct.app.F7AsstActTypeQuery
+
+3.10  F7
+
+   com.kingdee.eas.basedata.assistant.app.F7ExchangeRateQuery
+
+3.11      F7
+
+   com.kingdee.eas.basedata.assistant.app.F7AccountBankQuery
+
+3.12  F7
+
+   com.kingdee.eas.basedata.assistant.app.F7BankQuery
+
+3.13  F7
+
+   com.kingdee.eas.base.permission.app.F7UserQuery
+
+3.14  F7
+
+   com.kingdee.eas.basedata.assistant.app.F7BankQuery
+
+4
+
+4.1
+//
+
+PaymentBillInfo payInfo = new PaymentBillInfo();
+
+payInfo.setNumber(         1);001
+
+//
+UserInfo userInfo = new UserInfo();
+
+userInfo.setId(BOSUuid.read("867d5df6-00f8-1000-e000-0009c0a81089sysu"));  //
+
+BOSUuid
+
+userInfo.setName(          John );
+
+userInfo.setNumber(            2000 );
+
+BigDecimal ex = new BigDecimal("343434.445");//
+
+BigDecimal ex2 = new BigDecimal(12345678901234567.8);//
+
+payInfo.setExchangeRate(ex);
+
+payInfo.setCreator(userInfo);
+
+payInfo.setAuditDate(new Date(System.currentTimeMillis()));//
+
+Timestamp createdate = new Timestamp(System.currentTimeMillis());
+
+payInfo.setCreateDate(createdate);
+
+payInfo.setBizState(BillBizState.create);//
+
+payInfo.setSave(true);//Boolean
+
+PaymentBillItemInfo itemInfo           new PaymentBillItemInfo();//
+
+itemInfo.setLineNo(34);
+
+itemInfo.setAmounts(ex2);
+
+payInfo.getEntries().add(itemInfo);//
+
+payInfo.getEntries().add(new ErrandTaskItemInfo());//
+      IPaymentBill iPayBill = PaymentBillFactory.getRemoteInstance();//
+     IObjectPK pk = iPayBill.addnew(payInfo);//
+
+4.2
+
+      IPaymentBill iPayBill = PaymentBillFactory.getRemoteInstance();
+      String id="8b35b903-00f8-1000-e000-0008c0a81089errt";
+      ObjectUuidPK pk = new ObjectUuidPK(BOSUuid.read(id));//
+      PaymentBillInfo payInfo = iPayBill.getValue(pk);//
+      System.out.println("this:"+ payInfo.getExchangeRate());//
+      payInfo.setExchangeRate(ex);//
+      iPayBill.update(pk, payInfo);//
+
+4.3
+
+     iPayBill.remove(pk);//
+
+4.4
+
+            CurrencyInfo cur = new CurrencyInfo();
+            ICurrency c = CurrencyFactory.getRemoteInstance();//
+            EntityViewInfo evi = new EntityViewInfo();//
+            FilterInfo i = new FilterInfo();//
+            i.getFilterItems().add(new FilterItemInfo("number", "ddff", CompareType.EQUELS));
+     i.getFilterItems().add(new FilterItemInfo("id", "ddff", CompareType.EQUELS));
+     i. setMaskString(" (#0 and #1)");
+     evi.setFilter(i);//
+     evi.getSelector().add(new SelectorItemInfo("id"));//
+     evi.getSelector().add(new SelectorItemInfo("*"));
+     evi.getSelector().add(new SelectorItemInfo("company.id"));
+     evi.getSelector().add(new SelectorItemInfo("company.name"));
+     //
+     1
+     CurrencyCollection co = c. getCurrencyCollection ();//
+
+     2
+     CurrencyCollection co = c.getCurrencyCollection(evi);//
+
+     3                oql
+
+     CurrencyCollection co = c. getCurrencyCollection (evi);//
+
+4.5
+
+     CurrencyInfo cur = new CurrencyInfo();
+
+     ICurrency c = CurrencyFactory.getRemoteInstance();//
+
+     String id="8b35b903-00f8-1000-e000-0008c0a81089errt";
+
+     ObjectUuidPK pk = new ObjectUuidPK(BOSUuid.read(id));//
+
+     c.getValue(pk);       : c.getCurrencyInfo(pk);
+
+4.6                                                    UI       UI
+
+             1
+             HashMap map = new HashMap();
+
+                           map.put("Owner", this); //
+                  map.put("EASMode", new Integer(this.EASMode));
+                  map.put("table", this.accountTablePrompBox.getData());
+                  map.put("cu", currentCtrlUnit);
+                  map.put("auxAccount", this.asstAccountPromptBox.getData());
+
+                  IUIFactory uiFactory = null;
+                  uiFactory = UIFactory
+           .createUIFactory("com.kingdee.eas.base.uiframe.client.UIModelDialogFactory"); //
+
+IUIWindow                           uiWindow                                                 =
+
+uiFactorycreate("com.kingdee.eas.basedata.master.auxacct.client.AccountSelectUI", /*
+                  */
+
+                             map);
+
+           uiWindow.show();
+
+   2
+
+private void loadContext()
+
+{
+      int mode = ((Integer)this.getUIContext().get("EASMode")).intValue();
+
+   AccountTableInfo accountTableInfo = (AccountTableInfo) this.getUIContext().get("table");
+
+   CtrlUnitInfo cuInfo = (CtrlUnitInfo) this.getUIContext().get("cu");
+
+AsstAccountInfo asstAccountInfo = (AsstAccountInfo) this.getUIContext().get("auxAccount");
+
+   AuxAccountEditUI ui = (AuxAccountEditUI) this.getUIContext().get("Owner");
+
+}
+
+4.7 Query
+
+     EntityViewInfo evi = new EntityViewInfo();
+             FilterInfo filterInfo = new FilterInfo(); //
+             filterInfo.getFilterItems().add(
+                           new FilterItemInfo("typelink.id", info.getId(),
+                                         CompareType.EQUALS));
+             filterInfo.getFilterItems().add(
+                           new FilterItemInfo("currencyCompany.id", companyID,
+                                         CompareType.EQUALS));
+             filterInfo.setMaskString("#0 and #1 ");
+             evi.setFilter(filterInfo);
+
+             if (mainQuery == null) {
+                    mainQuery = new EntityViewInfo();
+
+             }
+
+             mainQuery.setFilter(filterInfo); //
+      this.execQuery();
+
+4.8
+
+             3
+             CurrencyInfo cur = new CurrencyInfo();
+             ICurrency c = CurrencyFactory.getRemoteInstance();//
+             c. getCurrencyCollection();
+             4
+             CurrencyInfo cur = new CurrencyInfo();
+             ICurrency c = CurrencyFactory. getLocalInstance (ctx);//
+             c. getCurrencyCollection();
+
+4.9
+
+             PurOrderInfo cur = new PurOrderInfo();
+             IPurOrder c = PurOrderFactory. getRemoteInstanceWithObjectContext(ctx);//
+
+             c. getPurOrderCollection();
+
+             query
+         IQueryExecutor exec = QueryExecutorFactory.getRemoteInstance(queryPK,ctx);
+
+4.10
+
+      1         ComboBox
+
+      public void setReceiveType()
+
+          {
+
+             this.kDComboBox2.removeAllItems();
+
+             List list = new List();
+
+             Iterator it = ReceiveType.iterator();
+
+             while (it.hasNext())
+
+             {
+
+                list.add(ReceiveType.getEnum(it.toString()).toString());
+
+             }
+
+          }
+
+      2                  ComboBox
+
+      //
+   IAsstActTypeDefault iAsstActType = AsstActTypeDefaultFactory.getRemoteInstance();
+
+   AsstActTypeDefaultCollectioni asstActTypeColl = iAsstActType
+
+            .getAsstActTypeDefaultCollection(" where isAccountCussent = 1");
+
+   AsstActTypeDefaultInfo defaultVal = null;
+
+   int count = asstActTypeColl.size();
+
+   Object[] typeValue = new Object[count];
+
+   for (int i = 0; i < count; i++)
+
+   {
+
+         AsstActTypeDefaultInfo value = (AsstActTypeDefaultInfo) asstActTypeColl.get(i);
+
+         if (value.isIsDefaultAccountPayable())
+
+         {
+
+            defaultVal = value;
+
+         }
+
+         ObjectUuidPK                       pk                      =                     new
+
+   ObjectUuidPK(BOSUuid.read(value.getAsstActType().getString("id")));
+
+         AsstActTypeInfo                               asstInfo                           =
+
+AsstActTypeFactory.getRemoteInstance().getAsstActTypeInfo(pk);
+
+         //cbi[i] = new ComBoxInfo(asstInfo, asstInfo.getName(), true);
+
+         String typeName = asstInfo.getName();
+
+         String typeId = asstInfo.getId().toString();
+
+         String typeQueryName = asstInfo.getDefaultQueryName();
+
+         String typeTableName = asstInfo.getRealtionDataObject();
+
+         int csType = 0; //asstActTypeInfo.getCsType().getValue();
+
+         asstActType = new AsstActTypeUtils(typeName, typeId, typeTableName,
+
+typeQueryName, csType);
+
+         typeValue[i] = (Object) asstActType;
+
+   }
+
+   ///String strQueryName = "F7SupplierQuery";
+   this.kDComAccountCussentType.removeAllItems();
+   this.kDComAccountCussentType.addItems(typeValue);
+   this.kDComAccountCussentType.setSelectedIndex(0);
+
+4.11 F7
+
+   ObjectUuidPK pk = new ObjectUuidPK(id);
+
+            IObjectValue                               objVal                             =
+
+   DynamicObjectFactory.getRemoteInstance().getValue(pk.getObjectTypei(), pk);
+
+            bizPrompt.setData(objVal);
+
+private void setCompanyF7()
+
+{
+    //       F7
+
+    OrgType[] CompanyType = { OrgType.Company };
+
+    //
+
+    // F7                PromptBox
+
+    this.bizPromptCompany.setEditFormat("$number$");
+
+    this.bizPromptCompany.setDisplayFormat("$name$");
+
+    this.bizPromptCompany.setEditable(true);
+
+    this.bizPromptCompany.setCommitFormat("$number$");
+
+      OrgUnitTreePromptBox boxCompany = new OrgUnitTreePromptBox(this,
+      CompanyType, null,
+
+                    OrgSelect.OnlySelectCompanyEntity, false, false, false);
+      bizPromptCompany.setSelector(boxCompany);
+      bizPromptCompany.setData(currentCompany);
+      bizPromptCompany.setEnabled(false);
+}
+
+//
+
+    private void setCurrency() throws EASBizException, BOSException
+
+    {
+
+        ICurrency iCurrency = null;
+
+        CurrencyCollection con = null;
+
+        try
+
+        {
+
+             iCurrency = CurrencyFactory.getRemoteInstance();
+
+             con = iCurrency.getCurrencyCollection(true);
+
+        }
+
+        catch (Exception e)
+
+        {
+
+             // TODO                 catch
+
+        MsgBox.showError(this, EASResource.getString(resClassName, "currencyFail"));
+
+        SysUtil.abort();
+
+        }
+
+        if (con != null)
+
+        {
+
+             Object[] typeValue = new Object[con.size()];
+
+             int j = 0;
+
+             for (int i = 0; i < con.size(); i++)
+
+             {
+
+                 CurrencyInfo currencyInfo = (CurrencyInfo) con.get(i);
+
+                 String typeName = currencyInfo.getName();
+
+                 String typeId = currencyInfo.getId().toString();
+
+                 String typeQueryName = currencyInfo.getNumber();
+                              asstActType = new AsstActTypeUtils(typeName, typeId, typeQueryName);
+                                  if (asstActType != null)
+                                  {
+                                         typeValue[i] = (Object) asstActType;
+
+if(typeId.equalsIgnoreCase(((CurrencyInfo)currentCompany.getBaseCurrency()).getId().toString()
+))
+
+                                         {
+                                               j = i;
+
+                                         }
+                                  }
+                           }
+
+                           this.bizPromptcurrency.removeAllItems();
+                           this.bizPromptcurrency.addItems(typeValue);
+                           //
+                           this.bizPromptcurrency.setSelectedIndex(j);
+                    }
+                    else
+                    {
+                    MsgBox.showError(this, EASResource.getString(resClassName, "currencyFail"));
+                           SysUtil.abort();
+                    }
+             }
+
+4.12
+
+     //
+                   getDetailTable().getColumn(TB_RELABILL).setWidth(100);
+                   getDetailTable().getColumn(TB_ORGUNIT).setWidth(180);
+                   getDetailTable().getColumn(TB_BIZMAN).setWidth(100);
+                   getDetailTable().getColumn(TB_PAY AMOUNT).setEditor(number_CellEditor);
+
+     getDetailTable().getColumn(TB_PAYAMOUNT).getStyleAttributes().setNumberFormat("%r-
+     [=]{#.00}f");
+     getDetailTable().getColumn(TB_PAYAMOUNT).getStyleAttributes().setHorizontalAlign(Hor
+     izontalAlignment.RIGHT);
+
+4.13
+
+for (int i = 0; i < kdtEntrys.getRowCount(); i++)
+{
+        kdtEntrys.getRow(i).getCell("orgUnit").getStyleAttributes().setLocked(false);
+        kdtEntrys.getRow(i).getCell("bizMan").getStyleAttributes().setLocked(false);
+
+}
+
+//  null  0
+
+if (kdtEntrys.getRow(i).getCell("discountAmount").getValue() == null)
+
+{
+
+    kdtEntrys.getRow(i).getCell("discountAmount").setValue(new BigDecimal("0.0"));
+
+}
+
+//
+BigDecimal amount = new BigDecimal("0");
+for (int i = 0, n = kdtEntrys.getRowCount(); i < n; i++)
+{
+amount = amount.add(UIRuleUtil.getBigDecimal(UIRuleUtil.getBigDecimalValue
+(kdtEntrys.getCell(i,TB_PAYAMOUNT).getValue())));
+}
+this.txtTotalAmounts.setText(null);
+this.txtTotalAmounts.setEnable(false);
+this.txtTotalAmounts.setText(amount);
+
+//
+if (amount.compareTo(new BigDecimal("0.00")) == 0)
+
+4.14
+
+public void actionDeleteLine_actionPerformed(ActionEvent e)throws Exception {
+             IRow row = getSelectedRow();
+             if (row != null) {
+                    kDTable1.removeRow(row.getRowIndex());
+             }
+
+      }
+
+4.15 F7
+
+public void setF7Selector() throws Exception
+      {
+KDBizPromptBox bizPromptBox = new KDBizPromptBox();//    F7
+
+CoreUIObject ui = null;//
+
+CompanyOrgUnitInfo companyInfo = null; //
+
+             //
+             bizPromptBox.setSelector(new GeneralKDPromptSelectorAdaptor(bizPromptBox, new
+F7CustomerTreeDetailListUI(), ui));
+
+             //
+             bizPromptBox.setSelector(new GeneralKDPromptSelectorAdaptor(bizPromptBox, new
+F7SupplierTreeDetailListUI(), ui));
+
+             //
+             bizPromptBox.setSelector(new GeneralKDPromptSelectorAdaptor(bizPromptBox, new
+F7MaterialTreeListUI(), ui));
+
+//
+HashMap map = new HashMap();
+map.put(PersonF7UI.ALL_ADMIN, "YES");
+bizPromptBox.setSelector(new PersonPromptBox(ui, map));
+
+//
+CompanyF7 org = new CompanyF7(ui);
+org.setRootUnitID("");
+bizPromptBox.setSelector(new CompanyF7(ui));
+
+//
+bizPromptBox.setSelector(new CostCenterF7(ui));
+
+//
+bizPromptBox.setSelector(new AdminF7(ui));
+
+//
+bizPromptBox.setSelector(new PurchaseF7(ui));
+
+//
+bizPromptBox.setSelector(new StorageF7(ui));
+
+//
+bizPromptBox.setSelector(new SaleF7(ui));
+
+//
+bizPromptBox.setSelector(new ProfitCenterF7(ui));
+             //
+             bizPromptBox.setSelector(new ProfitCenterF7(ui));
+
+             //
+             bizPromptBox.setSelector(new AccountPromptBox(ui, companyInfo, new FilterInfo()));
+      }
+
+4.16
+
+public void getSystemStatue() throws EASBizException, BOSException
+      {
+             CompanyOrgUnitInfo companyInfo = null; //
+             // SystemStatusCtrolUtils
+
+             SystemStatusCtrolUtils.getCurrentPeriod(null/*
+null */, SystemEnum.ACCOUNTSPAY ABLE, companyInfo/**/);
+
+      }
+
+4.17
+
+public void getSystemInfo()
+      {
+             // SysContext
+             //
+             SysContext.getSysContext().getCurrentUserInfo();//
+             SysContext.getSysContext().getCurrentFIUnit();//
+      }
+
+4.18
+
+public void getParam() throws EASBizException, BOSException
+      {
+             CompanyOrgUnitInfo companyInfo = null; //
+             ObjectUuidPK orgPk = new ObjectUuidPK(companyInfo.getId());
+
+             // ParamManager
+
+             //
+             ParamManager.getParamValue(null/*                    null */, orgPk,
+"AR_INIT_CHECK_TYPE");
+
+      }
+
+4.19
+
+public void doMutexService()
+{
+
+      IMutexServiceControl mutex = MutexServiceControlFactory.getRemoteInstance();
+
+      UserInfo user = null; //
+
+      String billId = null; //  /                     Id
+
+      //
+      mutex.requestObjIDForUpdate(billId, user.getString("id"));
+
+      //
+      mutex.releaseObjIDForUpdate(billId);
+}
+
+Tree:TreeBase  parentid
+
+Data:DataBase BillBase                          Tree
+
+4.20 Tree- List                             1
+
+protected ITreeBase getTreeInterface() throws Exception
+{
+
+      return com.kingdee.eas.custom.TreeGroupTestTreeFactory.getRemoteInstance();
+}
+
+4.21 Tree-List
+
+      protected String getQueryFieldName()
+{
+return "treeid.id";
+}
+4.22 Tree-                                              [optional]
+
+protected int getTreeInitialLevel()
+{
+
+      return TreeBuilderFactory.DEFAULT_INITIAL_LEVEL;
+}
+
+4.23 Tree-                                              [optional]
+
+protected int getTreeExpandLevel()
+{
+
+      return TreeBuilderFactory.DEFAULT_EXPAND_LEVEL;
+}
+
+4.24 Tree-
+
+protected String getRootName()
+{
+return "TreeGroupTest";
+}
+
+4.25 Tree-                      (                       )
+
+getDefaultFilterForTree()          cu
+4.26 Tree-
+
+4.26.1
+
+//treeMain
+
+protected void initTree() throws Exception
+{
+
+TreeSelectionListener[] listeners = treeMain.getTreeSelectionListeners();
+
+TreeSelectionListener treeSelectionListener = listeners[0];
+
+treeMain.removeTreeSelectionListener(treeSelectionListener);
+
+ITreeBuilder treeBuilder
+
+   =    TreeBuilderFactory.createTreeBuilder(getLNTreeNodeCtrl(),getTreeInitialLevel()  ,
+
+getTreeExpandLevel(),getDefaultFilterForTree());
+
+if (getRootName() != null)
+{
+
+      KDTreeNode rootNode = new KDTreeNode(getRootObject());
+
+      ( (DefaultTreeModel) treeMain.getModel()).setRoot(rootNode);
+
+}
+else
+{
+
+      ( (DefaultTreeModel) treeMain.getModel()).setRoot(null);
+}
+
+//
+treeBuilder.buildTree(treeMain);
+
+//
+treeMain.addTreeSelectionListener(treeSelectionListener);
+
+}
+4.26.2
+
+public KDTreeNode getSelectedTreeNode()
+{
+
+      return (KDTreeNode) treeMain.getLastSelectedPathComponent();
+}
+
+4.26.3
+
+return (TreeBaseInfo) ((KDTreeNode)
+             treeMain.getLastSelectedPathComponent()).getUserObject();
+
+4.26.4
+
+      KDTreeNode treeNode = (KDTreeNode) treeMain
+             .getLastSelectedPathComponent();
+
+      if (treeNode != null && treeNode.getParent() != null)
+      {
+
+             TreePath parentPath = treeMain.getSelectionPath().getParentPath();
+             KDTreeNode parentNode = (KDTreeNode) treeNode.getParent();
+             parentNode.remove(treeNode);
+             treeMain.updateUI();
+             treeMain.setSelectionPath(parentPath);
+             treeBuilder.refreshTreeNode(treeMain , parentNode ,this.getDefaultFilterForTree());
+             treeMain.expandPath(parentPath);
+      }
+//  Query
+
+CacheServiceFactory.getInstance().discardQuery(this.mainQueryPK);
+
+4.26.5
+
+treeMain.setSelectionRow(0);
+
+4.26.6
+
+      KDTreeNode treeNode = (KDTreeNode) treeMain
+             .getLastSelectedPathComponent();
+
+      if (treeNode != null && treeNode.getParent() == null)
+      {
+
+             TreePath oldPath = treeMain.getSelectionPath();
+             treeBuilder.refreshTreeNode(treeMain , treeNode,this.getDefaultFilterForTree());
+             treeMain.setSelectionPath(oldPath);
+             treeMain.expandPath(oldPath);
+      }
+
+4.26.7
+
+      KDTreeNode treeNode = (KDTreeNode) treeMain.getLastSelectedPathComponent();
+      if (treeNode != null && treeNode.getParent() != null)
+      {
+
+             TreePath oldPath = treeMain.getSelectionPath();
+             TreePath parentPath = treeMain.getSelectionPath().getParentPath();
+             KDTreeNode parentNode = (KDTreeNode) treeNode.getParent();
+             treeBuilder.refreshTreeNode(treeMain , parentNode ,this.getDefaultFilterForTree());
+
+             treeMain.setSelectionPath(TreePathUtil.getNewTreePath(treeMain ,
+                                                      treeMain.getModel() , oldPath));
+
+      }
+
+4.27
+
+//                     receiver
+       ID
+
+SenderAgent senderAgent = SenderAgent.getSenderAgent();
+
+Message message;
+
+Locale[] lcla = getContextLocales(ctx);//       ctx
+
+Locale locale = null;
+
+message = MessageFactory.newMessage("kingdee.workflow");//
+
+for (int j = 0, m = lcla.length; j < m; j++) {
+
+   //
+
+   locale = lcla[j];
+
+   message.setLocaleStringHeader("title","           ", locale);//
+
+      message.setLocaleStringHeader("sender","       " , locale);//
+ID                                                         ",Locale);//
+
+      message.setLocaleStringHeader("body", "
+
+}
+
+message.setIntHeader("type", MsgType.NOTICE_VALUE);//
+message.setIntHeader("bizType", MsgBizType.WORKFLOW_V ALUE);//
+
+message.setIntHeader("sourceStatus", MsgSourceStatus.EMPTY_V ALUE);//
+
+message.setIntHeader("priority", MsgPriority.MIDDLE_V ALUE);//
+
+message.setStringHeader("databaseCenter", ctx.getAIS());//
+message.setStringHeader("solution", ctx.getSolution());//
+
+message.setStringHeader("receiver",
+'4ff9eebb-0108-1000-e000-15acc0a813c813B7DE7F;4ff9eebb-0108-1000-e000-1db0c0a813c813
+
+B7DE7F'); //                              ID                     ID  ";"
+
+senderAgent.sendMessage(message); //
+
+/**
+
+*    ctx
+
+*
+
+* @param ctx
+
+* @return
+
+*/
+
+public static Locale[] getContextLocales(Context ctx) {
+
+     Locale[] locales = null;
+
+     SolutionInfo solu = MetaDataLoaderFactory.getLocalMetaDataLoader(ctx)
+
+              .getSolution();
+
+     if (solu != null) {
+           LanguageCollection langs = solu.getLanguages();
+           if (langs != null) {
+
+              locales = new Locale[langs.size()];
+
+                  for (int i = 0; i < langs.size(); i++) {
+                         locales[i] = langs.get(i).getLocale();
+
+                  }
+           }
+     }
+
+      return locales;
+}
+
+                                      <>
+

+ 601 - 0
BOS开发/金蝶BOS子系统树指引.pdf

@@ -0,0 +1,601 @@
+      金蝶 BOS 子系统树指引
+
+文档版本  V1.0
+发布日期  2011-5-3
+金蝶软件(中国)有限公司
+
+地址      深圳市高新技术产业园南区科技南十二路2号金蝶软件园
+        Kingdee Software(China)Co.,Ltd
+邮编
+网址      518057
+客户服务电话
+客户服务传真  http://www.kingdee.com  http://dev.kingdee.com
+客户服务邮箱
+        86-755-26612299
+
+        86-755-26615016
+
+        webmaster@kingdee.com
+
+版权所有 © 金蝶软件(中国)有限公司
+本书著作权属于金蝶软件(中国)有限公司所有,在未经本公司许可的情况下,任何单位或个人不得以任何方
+式对本书的部分或全部内容擅自进行增删,改编,节录,翻译,翻印,改写。
+
+注意
+由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本
+文档中的所有陈述、信息和建议不构成任何明示或暗示的担保。
+金蝶 BOS 子系统树指引                              目录
+
+                                     目录
+
+1 子系统树概述 ............................................................................................................................................... 5
+2 子系统树数据组成 ....................................................................................................................................... 6
+3 子系统树存放的位置和相关的配置文件 ................................................................................................... 6
+4 子系统树的生成及加载 ............................................................................................................................... 9
+
+         4.1 子系统树的生成............................................................................................................................................. 9
+         4.2 子系统树的加载........................................................................................................................................... 11
+5 子系统树的特殊维护 ................................................................................................................................. 12
+         5.1 改变节点上下级........................................................................................................................................... 12
+         5.2 新增子系统树............................................................................................................................................... 12
+6 常见问题分析处理 ..................................................................................................................................... 12
+         6.1 子系统树问题的排查步骤 ........................................................................................................................... 12
+         6.2 通用方法....................................................................................................................................................... 15
+         6.3 典型子系统树问题案例............................................................................................................................... 16
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  iii
+金蝶 BOS 子系统树指引                                    1 子系统树概述
+
+1 子系统树概述
+
+                BOS 平台中存在多个业务功能相对独立的子系统,如权限、预警、单据转换、编码规则、工
+                作流等。每个子系统都会根据自身的业务,管理辖下的所有相关的业务单元,子系统树即是
+                管理、展示该业务子系统的目录结构的对象。
+
+特点
+
+                存在多个子系统树。子系统树具有数据量大, 生成过程持续时间长,占用资源多,生成后相对
+                稳定。
+
+类型
+
+                主要存在如下子系统树:参数树、BOTP 树、编码规则树、字段权限树、预警树、查询树、子
+                系统实体树、缓存树、包树、子系统树、对帐中心树。
+
+子系统整体介绍
+
+                如下图实示,系统平台在生成子系统树的时候,是根据子系统树相关的配置文件,如
+                subsystem_bos.xml、subsystem_eas.xml 等,生成各个子系统所需要的目录树文件*.mdbview。
+                在运行期,加载已经生成的各种*.mdbview 文件,提供个各个子系统使用。
+                图1-1 子系统树体系简图
+
+                                           各子系统
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司        5
+ 金蝶 BOS 子系统树指引                             2 子系统树数据组成
+
+2 子系统树数据组成
+
+表2-1 子系统树数据组成表
+
+子系统树类型                数据组成
+参数树                   由元数据包组成。
+                      参数树在参数管理、参数设置中使用。在“参数管理”中出现的是完整
+BOTP 树                的参数树,在“参数设置”中出现的子系统树,是将没有参数的节点过滤
+                      后的参数树。
+预警树                   由元数据包,实体组成。
+编码规则树                 实体必须继承于 CoreBillBase,并且没有设置扩展属性 nobotp。
+                      由元数据包,实体,功能组成。
+字段权限树                 由元数据包,实体组成。
+预警树                   实体必须设置了扩展属性,codingRuleEnabled,其值为 true;
+查询树                   由元数据包,实体组成。实体必须继承于 ObjectBase,并且设置扩展属
+子系统实体树                性 enableFieldPermission,其值为 true。
+缓存树                   由元数据包,实体,FAÇADE 组成。
+                      由元数据包,关联查询 QUERY 组成。
+包树                    由元数据包,实体组成。
+子系统树                  由元数据包,实体组成。
+                      实体必须设置了扩展属性,isConfigCache,其值为 true。
+                      由元数据包组成。
+                      由元数据包,实体,功能,数据表,界面,关联查询,业务功能组成。
+
+3 子系统树存放的位置和相关的配置文件
+
+标准产品,默认子系统树存储在元数据文件 mdbview-metas.jar 中。
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  6
+金蝶 BOS 子系统树指引                                        3 子系统树存放的位置和相关的配置文件
+
+    如果有二次开发,通过 bim 生成子系统树,发布和部署,会存储在 sp-bim-metas.jar 或
+    sp-bim-metas-update.jar 中
+
+    如果有做过子系统树的客户化定制,定制的内容会存储在
+    Server\server\profiles\server1\config\subsystem 的文件夹下
+
+    相关文件如下表所示。
+    表3-1 相关文件表
+
+文件                       位置                                 用途
+
+SubSystem_bos.xml        服务端:                               配置当前系统所有元数据目录路径。
+                                                            生成子系统树的时候,根据此配置文
+SubSystem_eas.xml        Eas\server\properties              件中的目录进行搜索遍历路径下的所
+SubSystem_industry.xml                                      有元数据。
+
+SubSystem.xml(V60 解耦之前版
+本使用)
+
+SubSystemChangeParent_bos.xml 服务端:                          调整子系统树节点的上下级
+SubSystemChangeParent_eas.xml Eas\server\properties
+SubSystemChangeParent_
+industry.xml
+SubSystemChangeParent.xml(V6
+0 解耦之前版本使用)
+
+SubSystemFilter.xml      服务端:                               新增子系统树使用
+
+                         eas\server\properties
+
+mdbview-metas.jar        服务端:                               默认标准产品的所有子系统树文件存
+
+                         Eas\server\metas\bos(服务端加 贮的包。
+
+                         载使用)                               部署二次开发,安装补丁,重新生成
+                         Eas\server\deploy\fileserver.ear\  子系统树,会更新此包内容。
+                         easWebClient\metas\bos(提供给
+
+                         客户端下载)
+
+                         客户端:
+
+                         eas\client\metas\bos
+
+文档版本 V1.0 (2011-5-3)     版权所有 © 金蝶软件(中国)有限公司                              7
+金蝶 BOS 子系统树指引                                 3 子系统树存放的位置和相关的配置文件
+
+sp-bim-metas.jar          服务端:                               二次开发所有的元数据。
+
+sp-bim-metas_updater.jar  Eas\server\metas(服务端加载使 如果在部署到服务器之前,在 bos 工
+
+                          用)                                 具中生成过子系统树,则此二次开发
+
+                          Eas\server\deploy\fileserver.ear\ 包根目录下会包含有二次开发相关的
+                          easWebClient\metas(提供给客 子系统树文件*.mdbview,那么在服务
+
+                          户端下载)                              端重新生成子系统树之后,此二次开
+
+                          客户端:                               发包中的*.mdbview 文件会被更新。
+                          eas\client\metas                   相同内容的*.mdbview 也会更新到
+                                                             mdbview-metas.jar 中。如果
+
+                                                             sp-bim-metas.jar 本身不包含
+
+                                                             *.mdbview,那么服务端重新生成子系
+
+                                                             统树,也不会更新到此包中。
+
+                          z 服务端:                             此包是作为增量部署所使用,在某些
+
+                            Eas\server\deploy\fileserver.ea  EAS 版本中会看到。
+                            r\easWebClient\metas             其内容有时为空,有时包含
+                          z 客户端:                             *.mdbview。对于包含有子系统树文件
+
+                          z eas\client\metas                 的此包来说,需要注意其中的文件是
+
+                                                             否根据重新生成而更新(通过查看其
+
+                                                             中的*.mdbview 文件的时间来判断)。
+
+文档版本 V1.0 (2011-5-3)      版权所有 © 金蝶软件(中国)有限公司                                        8
+ 金蝶 BOS 子系统树指引                                        4 子系统树的生成及加载
+
+4 子系统树的生成及加载
+
+4.1 子系统树的生成
+
+步骤 1 根据需要对相关元数据设置扩展属性
+
+          对于某些子系统树需要对元数据的扩展属性进行过滤,例如 codingrule 的子系统树,需要配置
+          codingruleenable 的扩展属性;botp 的子系统树,需要配置 nobotp 的扩展属性。(详细说明请参
+          考标准产品的子系统树说明描述。)
+
+步骤 2 将对应的元数据所在的目录加入到子系统树目录配置文件中。
+
+系统生成子系统树的过程中,会根据“子系统树目录配置文件”中配置的路径(默认包括 app、
+client 目录),遍历其下的元数据,但不会遍历其他的子目录。
+
+子系统树目录配置文件:
+
+z BOS V6.0 解耦之前版本:
+
+− 服务端环境:eas\server\properties\SubSystem.xml
+
+− 开发环境:解决方案根目录下\SubSystem.xml
+
+z BOS V6.0 解耦之后版本:
+
+− 服务端环境:
+
+eas\server\properties\SubSystem_bos.xml(二次开发使用)
+
+eas\server\properties\SubSystem_eas.xml(标准产品使用)
+
+eas\server\properties\SubSystem_industry.xml(行业产品使用)
+
+− 开发环境:在解决方案根目录下\ SubSystem_bos.xml、SubSystem_eas.xml、
+
+SubSystem_industry.xml
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司               9
+金蝶 BOS 子系统树指引                              4 子系统树的生成及加载
+
+对于标准产品 SubSystem_eas.xml、和行业产品 SubSystem_industry.xml,这个 2 个配置
+文件,一般不需要现场维护,产品出厂设置即可。
+
+对于 SubSystem_bos.xml,如果现场有二次开发的内容,特别是开发的元数据所在的路
+径是新建的,务必检查确认 SubSystem_bos.xml 文件中已经包含对应的二次开发的元
+数据所在的路径。
+
+步骤 3 是否要修改节点的上下级关系
+
+          可以通过修改 SubSystemChangeParent.xml 文件来更改默认元数据的上下级关系。满足某些子
+          系统树节点在显示的时候,调整目录树位置的需要。
+          z BOS V6.0 解耦之前版本:
+
+                − 服务端环境:eas\server\properties\SubSystemChangeParent.xml
+                − 开发环境:解决方案根目录下\SubSystemChangeParent.xml
+          z BOS V6.0 解耦之后版本:
+                − 服务端环境:
+
+                    eas\server\properties\SubSystemChangeParent_bos.xml(二次开发使用)
+                    eas\server\properties\ SubSystemChangeParent _eas.xml(标准产品使用)
+                − 开发环境:在解决方案根目录下\ SubSystemChangeParent _bos.xml、
+                    SubSystemChangeParent _eas.xml
+步骤 4 生成子系统树
+
+生成操作:
+z 在服务端主控台上,通过选择“工具-产生子系统树”菜单生成。
+
+      主要在以下情况使用:新安装补丁出现异常中断,手工执行生成(安装补丁默认会执行生
+      成子系统树步骤),部署二次开发的内容。凡涉及到服务端元数据内容更新的,都需要在
+      服务端重新生成子系统树。
+z BOS 开发环境
+      在 BOS 开发环境,通过选择菜单“BOS 建模工具-工具-生成子系统树”,或者“BOS 建
+      模工具-工具-从包更新子系统树”来生成。
+
+生成文件及路径:
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  10
+金蝶 BOS 子系统树指引                              4 子系统树的生成及加载
+
+z 服务端主控台生成操作,会生成各种业务领域的 mdbview 为扩展名的子系统树元数据文
+      件,新生成的 mdbview 文件会更新到服务端:eas\server\metas\bos\mdbview-metas.jar,
+      eas\server\deploy\fileserver.ear\easWebClient\metas\bos\mdbview-metas.jar 中;
+
+服务端如果已经部署有包含 mdbview 文件的二次开发元数据包 sp-bim-metas.jar(必须是此
+名称),那么服务端重新生成子系统树之后,该二次开发包 sp-bim-metas.jar 中的 mdbview
+文件会被更新,如该开发包 sp-bim-metas.jar 中不包含 mdbview 文件,则重新生成的
+mdbview 不会更新到此 jar 包中。
+
+z BOS 开发工具生成子系统树,会重新生成解决方案根目录下/metadata 以及 deploy_meta
+      目录下的所有 mdbview 文件。
+
+4.2 子系统树的加载
+
+                  1、Server\server\profiles\server1\config\subsystem 的文件
+
+                  2、sp-bim-metas_update.jar 中的 mdbview 文件
+
+                  3、sp-bim-metas.jar 中的 mdbview 文件
+
+                  4、mdbview-metas.jar 中的 mdbview 文件
+上图为子系统树文件的加载优先级顺序,在系统存在多份 mdbview 子系统树文件的情况下,
+按照上述优先级顺序进行加载。
+
+“Server\server\profiles\server1\config\subsystem”的文件夹下的子系统树一般项目中不会有,主
+ 要针对做过子系统树的客户化定制的项目。
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  11
+ 金蝶 BOS 子系统树指引                             5 子系统树的特殊维护
+
+5 子系统树的特殊维护
+
+5.1 改变节点上下级
+
+                对于需要显示时改变默认的元数据上的上下级关系则需要修改
+                Server\server\properties\SubSystemChangeParent.xml 文件,此文件一项配置如下
+
+                     <changeParent fullName="com.kingdee.eas.cm.bb.app.DeptIndirectFeeWork"
+                     newParent="com.kingdee.eas.cm.dp" />
+
+                其中 fullName 表示一个需要改变位置的元数据,newParent 为改变后的位置。
+
+5.2 新增子系统树
+
+                如果要新增子系统树,需要修改 Server\server\properties\SubSystemFilter.xml 文件,具体可以参
+                考该配置文件已有的相关子系统树节点。
+
+                       <!-- 例子
+                     <subSystemFilter>
+
+                         <name>com_kingdee_eas_base_botp</name>
+                         <metaDataTypes>
+
+                              <metaDataType>enty</metaDataType>
+                         </metaDataTypes>
+                         <extendedPropertys>
+
+                              <extendedProperty>
+                                    <type>enty</type>
+                                    <name>nobotp</name>
+                                     <value>false</value>
+
+                              </extendedProperty>
+                       </extendedPropertys>
+                     <entityChain>com.kingdee.eas.framework.app.CoreBillBase</entityChain> <package></package>
+                       </subSystemFilter> -->
+
+6 常见问题分析处理
+
+6.1 子系统树问题的排查步骤
+
+                子系统树问题排查步骤如下图所示。
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  12
+金蝶 BOS 子系统树指引                                                            6 常见问题分析处理
+
+                                             1、服务器重新生子系统树
+
+                                          无  2、是否有部署二次开发
+
+    6、检查服务端mdbview-metas.jar中的 无                                    有
+    mdbview文件是否重新生成(根据时间
+                                             3、Sp-bim-metas.jar是否有
+                        判断)                          mdbview文件
+
+                                                                有
+
+                                                   4、检查服务器sp-bim-
+                                               metas_updater.jar(如果有的
+                                                话)、sp-bim-metas.jar中的
+                                             mdbview文件是否重新生成(根据
+
+                                                           时间判断)
+
+                   7、检查客户端                   5、检查客户端client\metas\sp-
+    client\metas\bos\mdbview-metas.jar是否     bim-metas_updaterjar(如果有的
+
+                从服务器正确更新                        话)、client\metas\sp-bim-
+                                             metas.jar是否从服务器正确更新
+
+                                             8、解决?                       否
+                                                    是
+                                                                             9、BOS开发环境的子系统树是否正常
+                                                结束
+                                                                            10、开发环境的SubSystem_bos.xml
+                                                                                                文件
+
+                                                                            中某些二次开发的路径,是否在服
+                                                                            务器上的SubSystem_bos.xml中也存
+
+                                                                                                在?
+
+步骤  操作                                       处理
+1   略                                        略
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司                                                              13
+金蝶 BOS 子系统树指引                                    6 常见问题分析处理
+
+2  略                               略
+
+3  Sp-bim-metas.jar、               略
+
+   sp-bim-metas_updater.jar 包中是否有
+
+   mdbview,取决于部署之前,在 bos 工
+
+   具中是否有生成过子系统树
+
+4  检查服务端 sp-bim-metas_updater.jar、 如果服务端重新生成过子系统树,那么此 jar 包中
+
+   sp-bim-metas.jar,查看两个包根目录下 的 mdbview 文件时间戳应该是生成子系统树的时
+
+   的 mdbview 文件是否是最新生成子系统 间,如果时间很早,则说明生成子系统树没有正
+
+   树的时间                            确更新此包,并查看服务端生成过子系统树程中
+
+                                   是否有异常(查看控制台日志)。
+
+5  检查客户端的 sp-bim-metas_updater.jar、 不一致,则说明客户端没有正确更新,需要分析
+
+   sp-bim-metas.jar,检查其中的 mdbview 客户端为什么没有正常更新。
+
+   文件是否跟服务器上的一致                    或者换另外的客户端进行验证。
+
+6  检查服务端的 mdbview-metas.jar 中的 如果时间跟最近生成子系统树的时间不一致,则
+
+   *.mdbview 文件,查看是否最近重新生 mdbview-metas.jar 中的子系统树没有正确更新,
+
+   成子系统树的时间                        需要重新生成验证,并查看服务端生成过子系统
+
+                                   树程中是否有异常(查看控制台日志)。
+
+7  检查客户端的 mdbview-metas.jar 中的 不一致则说明客户端没有正确更新,同步骤 5 处
+
+   *.mdbview 文件,检查其中的 mdbview 理。
+
+   文件是否更服务器上的一致
+
+8  如果以上检查之后,所有是的 jar 包都 在分析服务端的配置文件之前,需要确认,BOS
+
+   是正确更新的,那么则需要分析配置文 开发环境子系统树是否正确。
+
+   件
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司                  14
+金蝶 BOS 子系统树指引                              6 常见问题分析处理
+
+9   如果项目有二次开发,需要验证是否在 如果开发环境的子系统树也不正常,则需要分析:
+
+    BOS 开发环境中相关子系统树是否正  子系统树看不到新开发的内容,则需要检查
+    常                   SubSystem_bos.xml 中是否存在新开发的元数据所
+
+                        在的包路径,如果没有,手工更新,然后重新生
+
+                        成子系统树验证。
+
+                        如果标准产品的某些子系统树受到二次开发的影
+                        响,请检查 Subsystem_bos.xml 文件中是否存在标
+                        准产品(有行业二次开发的情况下,会存在行业相
+                        关的目录)的目录路径,如果存在,手工删除,然
+                        后重新生成系统树验证。
+
+10  检查 BOS 开发环境的        检查下解决方案根目录下的 SubSystem_bos.xml
+
+    SubSystem_bos.xml 文件跟服务器的同 文件,跟服务器上的同名文件是否存在差异?
+
+    名文件,对比是否有差异         SubSystem_bos.xml 文件一般包含有二次开发的元
+
+                        数据的路径,如果某些项目存在手工部署的情况,
+
+                        那么此配置文件一般难保证二次开发会得同步更
+
+                        新到服务器,需要人工比较之后,手工修改,将
+
+                        二次开发相关的路径更新到服务器上对应的配置
+
+                        文件中。然后重新生成子系统树验证。
+
+    以上问题分析处理的核心步骤:检查服务器、客户端的包更新情况,检查子系统树配置文件
+    情况。
+
+6.2 通用方法
+
+              子系统树问题大多因为系统有过二次开发导致,针对有二次开发的子系统树问题,此提供一
+              通用方法,步骤:
+
+    步骤 1 检查 subSystem_bos.xml 文件,删除其中标准产品的路径:如里面包含有如下信息,那么就删
+              除该行:<row …./>,而其中二次开发的路径要保留。
+
+                 <row fullname="com.kingdee.eas.fi" name="fi" alias_l1="" alias_l2="财务系统" alias_l3="財務
+                 系統" isleaf="0" parent="com.kingdee.eas" />
+
+    步骤 2 删除服务器上(2 处)sp-bim-metas.jar 包中的根目录下的所有*.mdbview 文件。
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司               15
+金蝶 BOS 子系统树指引                              6 常见问题分析处理
+
+步骤 3 如果 server\deploy\fileserver.ear\easWebClient\metas 下有 sp-bim-metas_updater.jar,则将其剪切
+          到备份路径(或删除)。
+
+步骤 4 在服务端主控台重新生成子系统树。
+
+6.3 典型子系统树问题案例
+
+1)二次开发的内容在编码规则、单据转换等子系统树目录中看不到
+
+                分析处理:
+
+                这里是指二次开发的相关的内容,在所有子系统树目录中看不到,根据上面的分析步骤,如
+                果开发环境就看不见,那么则可能是开发的元数据目录在没有更新到 SubSystem_bos.xml 文件
+                中。
+
+                在 bos 开发工具中,如果是通过“建模工具”新建的组别,在该组别下新建的业务单元,发布
+                的时候,工具是会自动更新当前新建组别到 SubSystem_bos.xml 文件中的,如果是通过“设计
+                开发工具”新建的包,则直接发布该包下新建的元数据,其包路径不会自动更新到
+                SubSystem_bos.xml 文件中,因此,需要检查确认下 SubSystem_bos.xml 文件中是否存在新建
+                的二次开发的路径,然后再行生成子系统树验证
+
+2)二次开发的内容在开发环境,各个子系统树正常,部署到服务器之后,服务
+器端重新生成子系统树,但是看不见二次开发的内容
+
+                分析处理:
+
+                首先根据上述的分析步骤,检查对应的 jar 包是否正确更新,在正确更新的基础上,检查服务
+                器上的 SubSystem_bos.xml 跟 bos 开发环境下的 SubSystem_bos.xml 是否有差异,是否二次开
+                发的相关路径没有正确更新。手工修复一致后,重新生成子系统树验证。
+
+3)部署到服务器上的二次开发的内容,各个子系统树里能看见部分二次开发的
+内容,另外部分的二次开发的内容找不到
+
+分析处理:
+
+结合上述各问题的分析,应该是部分二次开发的内容是通过 bos 设计开发工具直接新建的元数
+据,且该元数据所在路径也是通过设计开发工具新建,直接在设计开发工具中发布,导致此
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  16
+金蝶 BOS 子系统树指引                              6 常见问题分析处理
+
+路径相关的元数据在相关的子系统树中看不到。需要手工修改 SubSystem_bos.xml,保证相关
+的路径在此文件中正确配置,再行重新生成子系统树验证。
+
+4)行业版产品,做了二次开发,部署到服务器,各个子系统树目录结构不正确,
+丢失子目录、丢失各个节点等现象
+
+                分析处理:
+
+                根据之前的类似的问题,在 SubSystem_bos.xml、SubSystem_eas.xml、SubSystem_industry.xml
+                三份子系统树的配置文件中,各 xml 文件中的路径一般不会有重复,某些情况下,通过 bos
+                工具修改发布标准产品的单据,或者行业的单据,会将单据相关的路径做为二次开发的路径
+                更新到 SubSystem_bos.xml 文件中,而此单据的路径本来在 SubSystem_eas.xml 或者 SubSystem_
+                industry.xml 中就已经存在,生成子系统树的时候,出现问题中描述现象。需要手工删除在
+                SubSystem_bos.xml 中,和 SubSystem_eas.xml 及 SubSystem_ industry.xml 中重复的目录,然后
+                重新生成子系统树验证。
+
+5)服务端生成子系统树异常
+
+                分析处理:
+
+                服务端生成子系统树的问题一般两种原因:
+                z 服务端的目录的读写权限导致生成子系统树异常,需要对 EAS 服务端的安装目录的权限
+
+                      重新设置,特别是 EAS 服务端目录下的 JDK 目录,需要设置可读写的权限。
+                z 某些项目上,备份服务端的元数据文件,直接保存在系统元数据的文件夹,并且备份的
+
+                      文件命名中包含有中文。
+
+                以上情况,检查处理后重新新生成并验证。
+
+6)二次开发部署之后,重新生成了子系统树,“参数管理-财务系统-存货核算”
+节点丢失
+
+分析:
+
+该问题的项目,对供应链下的某单据进行发布,bos 工具将
+
+<row fullname="com.kingdee.eas.scm" name="scm" alias_l1="scm" alias_l2="供应链管理" alias_l3="
+供應鏈管理" isleaf="0" parent="com.kingdee.eas"/>
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  17
+金蝶 BOS 子系统树指引                              6 常见问题分析处理
+
+<row fullname="com.kingdee.eas.scm.cal" name="calculate" alias_l1="calculate" alias_l2="存
+货核算" alias_l3="存貨覈算" isleaf="1" parent="com.kingdee.eas.scm"/>
+
+相关的目录追加更新到在 subSystem_box.xml 中,而“存货核算”参数由于之前版本的子系统
+树配置文件定义的时候有些特殊,导致由工具生成更新到 subSystem_box.xml 中的节点描述,
+跟标准产品的 subSystem_eas.xml 文件中的对应节点描述不一致,最终使得生成的参数节点子
+系统树丢失“存货核算”。
+
+处理:
+
+删除 subSystem_box.xml 中的有关供应链“com.kingdee.eas.scm”,以及其子目录的所有目录节
+点。然后重新生成子系树。
+
+7)由于手工部署导致的子系统树问题
+
+分析:
+
+某些项目由于各种原因,会出现二次开发手工部署元数据的问题,并且,部署到服务器的元
+数据包,命名没有按照规范统一命名为 sp-bim-metas.jar,导致服务器元数据目录下存在各式
+各样名称的二次开发的元数据包,且有些元数据包中还包含了*.mdbview 文件。
+
+服务端生成子系统树,只会更新 sp-bim-metas.jar 包和 mdbview-metas.jar 包中的*.mdbview。那
+些没有及时更新的自定义名称的二次开发元数据包中的子系统树,导致了各种各样的子系统
+树问题。
+
+处理:
+
+删除相关的自定义名称的二次开发包中的*.mdbview 文件。
+
+文档版本 V1.0 (2011-5-3)  版权所有 © 金蝶软件(中国)有限公司  18
+