起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4633|回复: 1

树形主从表级联删除问题

[复制链接]
发表于 2013-8-20 13:36:03 | 显示全部楼层 |阅读模式
本帖最后由 liangyongfei 于 2013-8-23 14:28 编辑

多级主从表可以设置级联删除,在建表时主表子关联的字段后边有个“高级”,设置级联删除,如图:
8L}LU_ES$X@Y}9TPEX_@X[J.jpg
当一个从表的上级主表为普通级联关系时,删除上级主表时系统会自动删除这个表对应的数据。

当一个从表的上级主表为树形级联关系时,删除上级的主表时不会把这个从表在数据库的数据删除并且会发生异常,如果您的需求要求设置一个从表的上级主表为树形,只能自己在java中写代码删除子表,同时要去掉系统的级联删除设置,如图:
G6HU7O_)JUIU~77)OSXA{BC.jpg
java代码要写在第一级的主表的saveAction的执行前事件中
HIFA%]AEYBCU(L4RZ53K1GA.jpg
例如主表为树形:级联删从表:
  1. public static void mainActivityBeforeSaveMY_YJBAction() {

  2.                 //找到需要删除的数据
  3.                 Table table = (Table) ContextHelper.getActionContext().getParameter("table");
  4.                 //获得所有被删除的行

  5.                 Iterator<Row> rows = table.iterator(com.justep.system.data.ModifyState.DELETE);
  6.                 Row row;
  7. //判断是否删除数据?
  8.                 if (rows.hasNext()) {
  9. //从表删除数据的ksql语句
  10.                         String deleteKsql = "DELETE FROM MY_CB p WHERE p.fF in(";
  11. //因为树形删除只会返回选中节点的ID,它的子是根据父的ID删除的,所以要想删除子的从表,必须先查到子的ID,然后再删除从表,
  12.                        
  13. //定义在ksql 条件in中的字段字符串
  14.                        StringBuffer ksqlIn = new StringBuffer();
  15. //定义删除的ID
  16.                        String strID = "";
  17.                         while (rows.hasNext()) {
  18.                                 row = rows.next();
  19. //根据从表的父ID进行过滤
  20.                               
  21.                                 strID =  "'"+row.getValue("MY_S").toString()+"',";
  22.                                //加入StringBuffer
  23.                                 ksqlIn.append(strID);
  24.                              //查得子ID并加入过滤条件中
  25.                                 ksqlIn.append(getIDs(strID.substring(0, strID.length() - 1)));
  26.                         }
  27. //去掉最后的逗号,转化为字符串
  28.                           deleteKsql += ksqlIn.substring(0, ksqlIn.length() - 1) + ")";

  29. //执行KSQl
  30.                         KSQL.executeUpdate(deleteKsql, null, "/myDemo/shuZC/data", null);

  31.                 }
  32.        }


  33. //递归查得子ID并返回
  34. private static StringBuffer getIDs(String fID){
  35.         //定义返回值
  36.                 StringBuffer ids = new StringBuffer();
  37.                 //查到的子ID
  38.                 String id = "";
  39.                  try {
  40.                          String ksql = "SELECT e FROM MY_S e where e.fF=" + fID+"";
  41.                          com.justep.system.data.Table table = KSQL.select(ksql, null, "/myDemo/shuZC/data", null);
  42.                          Iterator<Row> rows = table.iterator();
  43.                          Row row;
  44.                          while(rows.hasNext()){
  45.                          
  46.                                  row = rows.next();
  47.                                  id = "'"+row.getValue("e").toString()+"',";
  48.                                  
  49.                                  ids.append(id);
  50.                                  ids.append(getIDs(id.substring(0, id.length()-1)));
  51.                          }
  52.                          return ids;
  53.                  }catch(Exception e){
  54.                          throw new RuntimeException (e.getMessage());
  55.                  }
  56.         }
  57. }
复制代码
qq:1912779713
WeX5教程--WeX5下载

1

主题

113

帖子

209

积分

内部用户

积分
209
QQ
发表于 2014-3-19 16:26:23 | 显示全部楼层
good
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-4-24 08:23 , Processed in 0.112115 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表