Добрый день !

Столкнулся с таким фокусом:

В Firebird Embedded 2.1 (2.1.3.18185) и в Firebird 2.1 SuperServer
(2.1.2.18118), на классике не проверял, нижеприведенный код возвращает
разные результаты. Firebird Embedded во внутреннем селекте не находит
записей, которые там на самом деле есть.

For Select Doc_PKey, Doc_Day, Number, Amount, Account_A, Account_B,
MFO_A, MFO_B,
                OKPO_A, OKPO_B, Details
     From KRB_From_Bank
     Where Doc_Day = :Doc_Day And
               Pay_Type = 2 And
               Account_A = :Account
     Into :PKey, :Doc_Day, :Number, :Debet, :Account_A, :Account_B,
           :MFO_A, :MFO_B, :OKPO_A, :OKPO_B, :Details
     Do
     Begin

         if ( Not Exists
                ( Select Doc_PKey, Number, Amount, B, Details
                  From Krb_Out
                  Where Account_A = :Account_A And
                            Account_B = :Account_B And
                            MFO_A = :MFO_A And
                            MFO_B = :MFO_B And
                            OKPO_A = :OKPO_A And
                            OKPO_B = :OKPO_B And
                            Number = :Number And
                            Amount = :Debet And
                            Doc_Day = :Doc_Day And
                            Doc_Status in ( '5', '6', '7', 'A' )
                          ) ) Then
                Begin
                    Pay_Type = 2 ;
                    Credit = NULL ;
                    Suspend ;
                End

     End


Переписал этот кусок процедуры на следующее и все стало Ок :

     For Select k.Doc_PKey, k.Doc_Day, k.Number, k.Amount, k.Details
           From KRB_From_Bank k
           left join Krb_Out o on
                k.Account_a = o.Account_a
                and k.Account_b = o.Account_b
                and k.Mfo_a = o.Mfo_a
                and k.Mfo_b = o.Mfo_b
                and k.okpo_a = o.okpo_a
                and k.okpo_b = o.okpo_b
                and k.Number = o.Number
                and k.amount = o.Amount
                and k.Doc_day = o.Doc_day
                And o.Doc_Status in ( '5', '6', '7', 'A' )
           Where
                k.Doc_Day = :Doc_Day
                And k.Pay_Type = 2
                And k.Account_A = :Account
                And o.Doc_pkey is Null
           Into :PKey, :Doc_Day, :Number, :Debet, :Details
           Do
           Begin

             Pay_Type = 2 ;
             Credit = NULL ;
             Suspend ;

           End
     End

Ответить