我们突然在“开放供应商交易”中有很多红手。由于缺乏数据库维护计划,我们遇到了奇怪的问题,现在系统启动并运行,但显示的红手太多了。
我在MS上看到了这个:http://support.microsoft.com/kb/894412
但这不太实际,因为它不是一个违规记录,而是很多。
有没有办法在交易SQL中发现不应该快速的标记事务?
在 SpecTrans VS VendTransOpen 中找到孤儿是一个好的开始吗?
谢谢!
编辑:想一想,在SpecTrans中找到孤立的记录可能无济于事,因为红手可能意味着在SpecTrans中找到了 的交易......
编辑#2:我发现this取消标记某些交易,但当我按照提议进行操作时,我找不到任何相关的期刊。这可能是个问题。答案 0 :(得分:1)
备份桌子之后,这就是我最终做的事情:
delete from SPECTRANS where SPECTRANS.RECID in
(
select st.RECID from VENDTRANS vt
inner join VENDTRANSOPEN vto on vto.REFRECID = vt.RECID
inner join SPECTRANS st on st.REFRECID = vto.RECID
where st.SPECTABLEID=470 and st.DATAAREAID in ('company1', 'company2')
)
答案 1 :(得分:0)
“红手”的原因有时可能是SpecTrans
记录,指向不再存在的LedgerJournalTrans
条记录。
删除它们的工作(仅限当前公司):
static void RedHandDirtyVendRemove(Args _args)
{
SpecTrans st;
VendTrans vt;
VendTransOpen vto;
LedgerJournalTrans ljt;
while select count(RecId) from st
group SpecTableId
where st.RefTableId == tableNum(VendTransOpen) &&
st.SpecCompany == curext() &&
st.RefCompany == curext()
exists join vto
where vto.RecId == st.RefRecId
{
info(strFmt('%1: %2', st.RecId, tableId2name(st.SpecTableId)));
}
while select st
where st.RefTableId == tableNum(VendTransOpen) &&
st.SpecTableId == tableNum(LedgerJournalTrans) &&
st.SpecCompany == curext() &&
st.RefCompany == curext()
join vto
where vto.RecId == st.RefRecId
join vt
where vt.RecId == vto.RefRecId
notExists join ljt
where ljt.RecId == st.SpecRecId
{
info(strFmt('%1: %2 %3', st.RecId, vt.Voucher, vt.AccountNum));
}
delete_from st
where st.RefTableId == tableNum(VendTransOpen) &&
st.SpecTableId == tableNum(LedgerJournalTrans) &&
st.SpecCompany == curext() &&
st.RefCompany == curext()
exists join vto
where vto.RecId == st.RefRecId
exists join vt
where vt.RecId == vto.RefRecId
notExists join ljt
where ljt.RecId == st.SpecRecId;
info(strFmt('%1', st.RowCount()));
}