Показать сообщение отдельно
Старый 14.07.2008, 21:03   #1  
sgt.Pepper is offline
sgt.Pepper
Участник
Аватар для sgt.Pepper
 
43 / 15 (1) ++
Регистрация: 05.10.2007
Адрес: Германия
Поведение notexists
В классе LedgerJournalCheckPost/checkJournal есть такое место где проверяется, существует ли уже транзакция с таким номером ваучера и берется самая поздняя дата
X++:
        checkTransDate = (select maxof(TransDate) from ledgerTrans
                            where ledgerTrans.Voucher like num).TransDate;
Только не учитывается здесь, а была ли собственно эта транзакция отменена или нет.
Чтобы подкорректировать ситуацию, я добавил код
X++:
        select firstonly TransDate, RecId from ledgerTrans
               order by TransDate desc
               notexists join transactionReversalTrans
               where ledgerTrans.Voucher like num &&
                     transactionReversalTrans.RefTableId == tablenum(LedgerTrans) &&
                     transactionReversalTrans.RefRecId   == ledgerTrans.RecId &&
                     transactionReversalTrans.reversed   == NoYes::Yes;
Этот select возвращает запись с совершенно другим номером ваучера.
В трейсере вижу
X++:
declare @p1 int
set @p1=1073742163
declare @p2 int
set @p2=180171631
declare @p5 int
set @p5=16
declare @p6 int
set @p6=1
declare @p7 int
set @p7=1
exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 nvarchar(8),@P2 nvarchar(8),@P3 nvarchar(42),
@P4 int,@P5 int',N'SELECT TOP 1 A.TRANSDATE,A.RECID FROM LEDGERTRANS A WHERE (A.DATAAREAID=@P1)
 AND NOT EXISTS (SELECT TOP 1 ''x'' FROM TRANSACTIONREVERSALTRANS B WHERE ((B.DATAAREAID=@P2)
 AND ((((A.VOUCHER LIKE @P3 ESCAPE ''\'' ) AND (B.REFTABLEID=@P4)) AND (B.REFRECID=A.RECID))
 AND (B.REVERSED=@P5)))) ORDER BY A.DATAAREAID DESC,A.TRANSDATE DESC',
 @p5 output,@p6 output,@p7 output,N'itz',N'itz',N'A08-0547',225,1
select @p1, @p2, @p5, @p6, @p7
В результате написал через цикл
X++:
        while select TransDate, RecId, Voucher from ledgerTrans
               order by TransDate desc
               where ledgerTrans.Voucher like num
        {
            if(!ledgerTrans.reversed())
            {
                checkTransDate = ledgerTrans.TransDate;
                break;
            }
        }
Код работает, но хотелось бы знать, почему notexists так себя ведет?

Kernel 4.0.2163.0 SP2
Localization: Eastern Europe