如何在循环中删除记录?

时间:2016-07-26 10:55:23

标签: siebel

我正在编写一个业务服务,需要迭代BC中的所有记录,并删除其中的一些:

bc.ExecuteQuery(ForwardBackward);
var isRecord = bc.FirstRecord();
while (isRecord) {
  if (...) {
    bc.DeleteRecord();
  }
  isRecord = bc.NextRecord();
}

然而,DeleteRecord moves the cursor to the next one,所以我会跳过每个被删除的记录,这不是我想要的。是否有任何标准的 ish 方法来解决这个问题?

我想我可以制作两个循环,一个用于检查,另一个用于删除...它可以工作,但只是在记录上迭代两次感觉很傻,必须有一个比这更好的方法:

bc.ExecuteQuery(ForwardBackward);
var isRecord = bc.FirstRecord();
var list = [];
while (isRecord) {
  if (...) {
    list.push(bc.GetFieldValue("Id"));
  }
  isRecord = bc.NextRecord();
}

bc.ClearToQuery();
bc.SetSearchSpec("Id", "='" + list.join("' OR ='") + "'");  // "='1-ABCD' OR ='1-1234'"
bc.ExecuteQuery(ForwardBackward);
while (bc.FirstRecord()) {
  bc.DeleteRecord();
}

3 个答案:

答案 0 :(得分:1)

解决方案将直接取决于您的if(...)条件:

  • 如果这是一个简单的条件,可以转换为搜索 表达式,那么你只需简单地进行查询和删除即可 找到的一切。

  • 如果它是一个复杂的条件,无法实现为searchspec,那么你可以通过两种方式实现这一点(两者都有其自身的缺点): a)使用DeleteRecord和PreviousRecord的笨拙组合。 b)创建第二个方法,删除单个记录并为满足条件的每个记录调用它,类似

    function deleteRecord(sId:chars) {
      ...
      bc.SetSearchSpec("Id", sId);
      bc.ExecuteQuery(ForwardOnly);
      if (bc.FirstRecord()) {
        bc.DeleteRecord();
      }
    }
    ... 
    bc.ExecuteQuery(ForwardBackward);
    var isRecord = bc.FirstRecord();
    while (isRecord) {
      if (...) {
        deleteRecord(bc.GetFieldValue("Id"));
      }
      isRecord = bc.NextRecord();
    }
    ...
    

您的解决方案可以和选项c),但当Id列表太大时它将无法工作,因为这样的查询将导致巨大的SQL语句和数据库对SQL查询大小有一些限制(并且DBA不会很高兴在日志中看到这样的查询。)

我更喜欢选项b)。您可以通过在main函数中创建相同BC的第二个实例来优化它,并通过引用deleteRecord函数传递它。

答案 1 :(得分:1)

由于您正在执行ForwardBackward,因此您可以在删除后添加PreviousRecord来电:

bc.ExecuteQuery(ForwardBackward);
var isRecord = bc.FirstRecord();
while (isRecord) {
  if (...) {
    bc.DeleteRecord();
    bc.PreviousRecord();
  }
  isRecord = bc.NextRecord();
}

或者只是向后循环:

bc.ExecuteQuery(ForwardBackward);
var isRecord = bc.LastRecord();
while (isRecord) {
  if (...) {
    bc.DeleteRecord();
  }
  isRecord = bc.PreviousRecord();
}

答案 2 :(得分:0)

是否在var中存储第一条记录的值,然后在循环中检查记录是否存在。我建议你去前进和后退尝试。 var的值递增,因此,在while循环中放回一个元素命令,因此var现在将存储前一个元素。执行循环后。您可以轻松地增加到下一个元素。