В классе 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