如何循环删除记录?
How can I delete records in a loop?
我正在编写一个业务服务,它需要迭代 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();
}
解决方案将直接取决于您的 if (...) 条件:
如果是简单的条件,可以转为搜索
表达式,那么你就可以简单地进行查询和删除
找到的所有内容。
如果它是一个复杂的条件,无法作为搜索规范实现,那么您可以通过两种方式实现(两者都有其自身的缺点):
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 语句并且数据库对 [=27 有一些限制=] 查询大小(DBA 不会乐意在日志中看到此类查询)。
我更喜欢选项 b)。您可以通过在主函数中创建相同 BC 的第二个实例并通过引用 deleteRecord 函数传递它来优化它。
正在将第一条记录的值存储在 var 中,然后在循环中检查记录是否存在。我建议你去向前和向后尝试。
var 的值递增,因此,在 while 循环内放置一个元素命令,因此 var 现在将存储前一个元素。执行循环后。您可以轻松递增到下一个元素。
既然你在做 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();
}
我正在编写一个业务服务,它需要迭代 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();
}
解决方案将直接取决于您的 if (...) 条件:
如果是简单的条件,可以转为搜索 表达式,那么你就可以简单地进行查询和删除 找到的所有内容。
如果它是一个复杂的条件,无法作为搜索规范实现,那么您可以通过两种方式实现(两者都有其自身的缺点): 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 语句并且数据库对 [=27 有一些限制=] 查询大小(DBA 不会乐意在日志中看到此类查询)。
我更喜欢选项 b)。您可以通过在主函数中创建相同 BC 的第二个实例并通过引用 deleteRecord 函数传递它来优化它。
正在将第一条记录的值存储在 var 中,然后在循环中检查记录是否存在。我建议你去向前和向后尝试。 var 的值递增,因此,在 while 循环内放置一个元素命令,因此 var 现在将存储前一个元素。执行循环后。您可以轻松递增到下一个元素。
既然你在做 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();
}