我正在编写一个业务服务,该业务需要迭代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();
}
...
您的解决方案可以是and选项c),但是当ID列表太大时将无法使用,因为这样的查询将导致庞大的SQL语句,并且数据库对SQL查询的大小有一些限制(并且DBA不会很乐意请参阅日志中的此类查询)。
我更喜欢选项b)。您可以通过在主函数中创建相同BC的第二个实例,然后将其传递给deleteRecord函数来对其进行优化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句