红手上很多交易

时间:2014-02-25 19:49:52

标签: axapta dynamics-ax-2009

我们突然在“开放供应商交易”中有很多红手。由于缺乏数据库维护计划,我们遇到了奇怪的问题,现在系统启动并运行,但显示的红手太多了。

我在MS上看到了这个:http://support.microsoft.com/kb/894412

但这不太实际,因为它不是一个违规记录,而是很多。

有没有办法在交易SQL中发现不应该快速的标记事务?

SpecTrans VS VendTransOpen 中找到孤儿是一个好的开始吗?

谢谢!

编辑:想一想,在SpecTrans中找到孤立的记录可能无济于事,因为红手可能意味着在SpecTrans中找到了 的交易......

编辑#2:我发现this取消标记某些交易,但当我按照提议进行操作时,我找不到任何相关的期刊。这可能是个问题。

2 个答案:

答案 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()));
}