如何删除循环中的记录



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

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

但是,DeleteRecord会将光标移到下一个,所以我会为每个被删除的记录跳过一个记录,这不是我想要的。有什么标准的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();
}

解决方案将直接取决于您的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)。您可以通过在主函数中创建同一BC的第二个实例来优化它,并通过引用deleteRecord函数来传递它。

由于您正在执行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();
}

Are将第一条记录的值存储在var中,然后在循环中检查是否存在记录。我建议你向前和向后尝试。var的值是递增的,因此,在while循环中放置一个向后移动的元素命令,因此var现在将存储上一个元素。在执行循环之后。您可以很容易地递增到下一个元素。

相关内容

  • 没有找到相关文章

最新更新