Search code examples
abapsap-erpopensql

How to join the tables KNBK and TIBAN?


I am trying to read the table TIBAN only in the cases when the field BANKN of the KNBK table contains the string "IBAN". The problem that I am having is reading the table TIBAN. For the KNBK table I used the key kunnr to search the table, but the table TIBAN does not contain this field. The code is as follows:

 LOOP AT lt_data_bsec ASSIGNING <ls_data_bsec>.

      READ TABLE lt_data_knbk ASSIGNING FIELD-SYMBOL(<ls_data_knbk>) 
            WITH KEY kunnr = <ls_data_bsec>-kunnr BINARY SEARCH .

      IF <ls_data_knbk>-bankn_kn CS '<IBAN>'.

      >>>>> READ TABLE lt_data_tiban ASSIGNING FIELD-SYMBOL(<ls_data_tiban>).

        IF <ls_data_bsec> IS ASSIGNED 
              AND <ls_data_tiban> IS ASSIGNED
              AND ( <ls_data_bsec>-banks_bs NE <ls_data_tiban>-banks_kn
                 OR <ls_data_bsec>-bankl_bs NE <ls_data_tiban>-bankl_kn
                 OR <ls_data_bsec>-bankn_bs NE <ls_data_tiban>-bankn_kn ).

        ENDIF.

The declaration of the lt_data_knbk table is:

SELECT kunnr,
           banks AS banks_kn,
           bankl AS bankl_kn,
           bankn AS bankn_kn
      FROM knbk
      INTO TABLE @DATA(lt_data_knbk)
      FOR ALL ENTRIES IN @lt_data_bsec
      WHERE kunnr = @lt_data_bsec-kunnr
      ORDER BY PRIMARY KEY.

And the declaration of the lt_data_tiban is:

SELECT banks AS banks_tb,
           bankl AS bankl_tb,
           bankn AS bankn_tb
      FROM tiban
      INTO TABLE @DATA(lt_data_tiban).

Also the declaration of the lt_data_bsec is of the type gty_out:

BEGIN OF gty_out,
         bukrs    TYPE bukrs,
         belnr    TYPE belnr_d,
         buzei    TYPE buzei,
         budat    TYPE budat,
         kunnr    TYPE kunnr,
         banks_kn TYPE banks,
         bankl_kn TYPE bankk,
         bankn_kn TYPE bankn,
         banks_bs TYPE banks,
         bankl_bs TYPE bankk,
         bankn_bs TYPE bankn,
         banks_tb TYPE banks,
         bankl_tb TYPE bankk,
         bankn_tb TYPE bankn,
       END OF gty_out,

I am having an error in the line that I have marked in the code as it needs a key field to do the reading of the table.

May anyone know what type of field do I need to do a search of the TIBAN table, just like I did for the KNBK table?


Solution

  • I would recommend you to acquire your bank data by doing a LEFT OUTER JOIN with TIBAN.

    SELECT knbk~kunnr AS kunnr,
           knbk~banks AS banks_kn,
           knbk~bankl AS bankl_kn,
           knbk~bankn AS bankn_kn,
           knbk~bkont AS bkont_kn,
           tiban~iban AS iban
      FROM knbk
      LEFT OUTER JOIN tiban ON
           tiban~banks = knbk~banks AND
           tiban~bankl = knbk~bankl AND
           tiban~bankn = knbk~bankn AND
           tiban~bkont = knbk~bkont
      INTO TABLE @DATA(lt_data_knbk)
      FOR ALL ENTRIES IN @lt_data_bsec
      WHERE knbk~kunnr = @lt_data_bsec-kunnr
      ORDER BY knbk~banks knbk~bankl knbk~bankn knbk~bkont.
    

    The result will be a table with all entries from KNBK, plus a field IBAN which will be filled from TIBAN if a corresponding row exists and be initial when no corresponding row exists.

    Now you can just determine whether or not you have an IBAN like this:

    LOOP AT lt_data_knbk ASSIGNING FIELD-SYMBOL(<ls_data_knbk>).
       IF <ls_data_knbk>-iban IS INITIAL.
           " classic bank number + account number account
       ELSE.
           " IBAN account     
       ENDIF.
    ENDLOOP.