Lesson 4 of 6
In Progress

P04_05_L04: SAP data logic & code!

admin November 15, 2025

Add the supplier indicators to the supplier movements (after appending them)

Note: it is the settings of the supplier account group that determine whether the supplier will behave like a one-time supplier in the system (and whether the bank details can be entered at posting FB60/MIRO).

Filter supplier invoices on one-time suppliers and on the value

Code example: Identify one-time suppliers

ZV_DF_BSAIK_PAY_1TS=(
   ZV_DF_BSAIK_PAY
   .filter(
      (
          PI_POLARS.col('LFA1_XCPDK') != ''
      ) &
      (
          PI_POLARS.col('ZF_BSAIK_DMBTR_SIGNED_USD')>
          ZV_NU_1TS_THRESHOLD
      )
   )
)

Check frequency of bank account for one-time supplier

Code example: Check number of payments per bank account per month

ZV_DF_REGUH(
   ZV_DF_REGUH
   .filter(
       (
          PI_POLARS.col('REGUH_VBLNR')
          .is_in(
             ZV_DF_BSAIK_PAY_1TS['BSAIK_BELNR']
       ) &
       (
           PI_POLARS.col('REGUH_LAUFD')
           .str.slice(0,4)
           .is_in(
             ZV_DF_BSAIK_PAY_1TS['BSAIK_GJAHR']
           )
       )
   )
   .group_by(
      [
         (
           PI_POLARS.col('REGUH_LAUFD')
           .str.slice(0,4)
         ),
         PI_POLARS.col('REGUH_ZBNKN')
      ]
   )
   .agg(
      [
         PI_POLARS.col('REGUH_VBLNR')
         .n_unique()
         .alias('ZF_REGUH_ZBNKN_COUNT'),
         
         PI_POLARS.col('ZF_REGUH_RBETR_SIGNED')
         .sum()
         .alias('ZF_REGUH_RBETR_SIGNED')
      ]
   )
)

Frequency of payments to one-time supplier beneficiary accounts

Create the list of payments used above

Most important account per journal entry number

Code example: most important account on debit

    ZV_DF_BSEG_BKPF_D = (
        ZV_DF_BSEG_BKPF
        .filter(
           PI_POLARS.col('BSEG_SHKZG') == 'S'
        ) 
        .group_by([
            'BSEG_BUKRS',
            'BSEG_GJAHR',
            'BSEG_BELNR'
        ])
        .agg(
            [      
                PI_POLARS.col('BSEG_HKONT')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_BSEG_HKONT_D'),

                PI_POLARS.col('SKAT_TXT20')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKAT_TXT20_D'),

                PI_POLARS.col('SKB1_HBKID')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKB1_HBKID_D'),

                PI_POLARS.col('SKA1_XBILK')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKA1_XBILK_D'),

                PI_POLARS.col('SKA1_GVTYP')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKA1_GVTYP_D'),

                PI_POLARS.col('BSEG_KOART')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_BSEG_KOART_D'),

                PI_POLARS.col('SKB1_XGKON')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKB1_XGKON_D'),

                PI_POLARS.col('BKPF_USNAM')
                .first()
                .alias('BKPF_USNAM'),

                PI_POLARS.col('BKPF_AWTYP')
                .first()
                .alias('BKPF_AWTYP'),

                PI_POLARS.col('BKPF_TCODE')
                .first()
                .alias('BKPF_TCODE'),

                PI_POLARS.col('BKPF_BKTXT')
                .first()
                .alias('BKPF_BKTXT')

                PI_POLARS.col('BSEG_XAUTO')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_BSEG_XAUTO_D'),

             ]
        )

            

Code example: most important account on credit

    ZV_DF_BSEG_BKPF_C = (
        ZV_DF_BSEG_BKPF
        .filter(
           PI_POLARS.col('BSEG_SHKZG') == 'H'
        ) 
        .group_by([
            'BSEG_BUKRS',
            'BSEG_GJAHR',
            'BSEG_BELNR'
        ])
        .agg(
            [           
                PI_POLARS.col('BSEG_HKONT')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_BSEG_HKONT_C'),

                PI_POLARS.col('SKAT_TXT20')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKAT_TXT20_C'),

                PI_POLARS.col('SKA1_XBILK')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKA1_XBILK_C'),

                PI_POLARS.col('SKA1_GVTYP')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKA1_GVTYP_C'),

                PI_POLARS.col('BSEG_KOART')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_BSEG_KOART_C'),

                PI_POLARS.col('SKB1_XGKON')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKB1_XGKON_C'),

                PI_POLARS.col('SKB1_HBKID')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_SKB1_HBKID_C'),


                PI_POLARS.col('BSEG_XAUTO')
                .sort_by(BSEG_DMBTR, descending=True)
                .first()
                .alias('ZF_BSEG_XAUTO_C'),
             ]
        )

            

Code example: link debit and credit together

    ZV_DF_BSEG_BKPF_ACC_SCHEMES = (
        ZV_DF_BSEG_BKPF_D 
        .join(
             ZV_DF_BSEG_BKPF_C,
             on = [
                'BSEG_BUKRS',
                'BSEG_GJAHR',
                'BSEG_BELNR'
             ],             
             how='inner'
         )
     )

Code example: Select supplier payment

ZV_DF_BSEG_BKPF_ACC_SCHEMES = (
        ZV_DF_BSEG_BKPF_ACC_SCHEMES 
        .with_columns([
            PI_POLARS.when(
                (PI_POLARS.col('ZF_BSEG_KOART_D') == 'K') & 
                (PI_POLARS.col('ZF_BSEG_KOART_C') == 'S: Bank')
            ).then(PI_POLARS.lit('Supplier payment'))

Append the supplier open and closed movements

Code example: append open and closed supplier movements

    ZV_DF_BSAK_BSIK = (
      PI_POLARS.concat(
        [
            A_BSAK,
            A_BSIK
	],
        how='diagonal'
    )

Responses

Your email address will not be published. Required fields are marked *