Customer Vendor Integratie als voorwaarde voor S/4HANA (Deel 2)

In deel 1 van het “Customer Vendor Integratie” blog is het concept van customer vendor integratie (kortweg CVI) beschreven en zijn een aantal aandachtspunten benoemd. In dit gedeelte wordt het implementatieproces verder uitgelegd.

 

Zoals in het eerste blog is uitgelegd, is de migratie van customers, vendors, contactpersonen en medewerkers een verplichte stap als onderdeel van de migratie van SAP ECC naar S/4 HANA. De inrichting van de CVI om deze migratie uit te kunnen voeren is dus verplichte stof. Maar als we met de CVI aan de slag gaan, wat moet er dan eigenlijk gedaan worden? Welke acties moeten worden uitgevoerd?

 

De CVI implementatie kan worden ingedeeld in 2 grote stappen; de voorbereiding en de feitelijke synchronisatie. Tijdens de voorbereiding worden alle acties uitgevoerd die ervoor zorgen dat de synchronisatie van de customers en/of vendors naar business partners kan worden uitgevoerd. Het belangrijkste hierin is het inspelen van OSS notes en het inrichten van de customizing zodat de relevante stamgegevens gesynchroniseerd kunnen worden.

 

In de synchronisatie stap wordt voor iedere customer en/of vendor een business partner aangemaakt in het systeem. Na de synchronisatie zal dit proces automatisch worden vervolgd. Zowel bij het creëren als bij het wijzigen van een customer en/of vendor zal een business partner worden aangepast. Ook andersom, bij het wijzigen van een business partner zal de CVI ervoor zorgen dat een customer en/of vendor wordt aangepast.

 

customer vendor integratie deel 2

 

De voorbereiding van de CVI implementatie bestaat uit een aantal hoofdtaken.

 

Inrichting van de CVI

Customizing Activiteiten

Het wijzigen van de customizing instellingen is natuurlijk de belangrijkste activiteit in de CVI implementatie. CVI vereist uitgebreide customizing wijzigingen, maar alvorens aan de slag te gaan, moet er wel nagedacht worden over het proces. Wat worden de nummerreeksen van de business partner? Welke objecten willen we synchroniseren? Welke rollen van de business partners moeten leiden tot het aanmaken van een customer?  Welke contact person partner functies willen we meenemen? Wat zij de gevolgen voor de replicatie naar SAP CRM? Enzovoort.

 

De inrichting van de CVI is te vinden in de IMG onder de Cross-Component Applications;

 

customer vendor integratie deel 2 a

 

De benodigde stappen in de customizing zijn zeer goed beschreven in het SAP S/4HANA Cookbook  Customer/Vendor Integration.

 

Conversie prechecks

Middels OSS notes stelt SAP een aantal rapporten beschikbaar die gebruikt kunnen worden tijdens de CVI implementatie. Deze rapporten kunnen worden gebruikt om te checken of alle customizing instellingen goed uitgevoerd zijn. De belangrijkste daarvan worden hieronder besproken.

 

Het PRECHECK_UPGRADATION_REPORT programma wordt beschikbaar gesteld in de OSS note 2216176 (2216176 – Precheck report for Business Partner) en kan worden gebruikt om ontbrekende mapping entries tussen CVI data en business partner data te bepalen.

 

precheck upgradation report 1precheck upgradation report 2

 

De status van de verschillende checks geeft aan of de CVI instellingen correct zijn. Door te klikken op de foutmelding in de status kolom wordt er meer informatie gegeven over de fout en van daaruit is het mogelijk om meteen de juiste customizing entry te starten. Zo hoeft er ook niet gezocht te worden naar de customizing (IMG) pad.

 

CVI implementatie vereist uitgebreide wijzigingen in de customizing instellingen tussen business partner object aan de ene kant en customer/vendor object aan de andere kant. Fouten in de synchronisatie treden vaak op als gevolg van ontbrekende of foute customizing instellingen.

 

Het CVI_FS_CHECK_CUSTOMIZING programma (te verkrijgen in OSS note 1623677: BP_CVI: Check report for checking CVI customizing) is beschikbaar om deze fouten op te sporen. Dit rapport checkt algemene debiteuren (customer) en crediteuren (vendor) instellingen. Het resultaat van dit rapport geeft aan of de customizing instellingen correct zijn.

 

cvi customizing check report 1

 

general settings

 

Als de synchronisatie uitgevoerd is, wordt de link tussen customer en business partner gelegd in de tabel “CVI_CUST_LINK” .  Voor de link tussen vendor object en business partner is er de tabel “CVI_VEND_LINK” beschikbaar.  Meerdere programma’s zijn beschikbaar om na de synchronisatie inconsistenties in de verschillende “LINK” tabellen op te sporen. “CVI_CUST_LINK” bevat de link tussen de GUID van de business partner en customer nummer. Door fouten in deze tabel zal de wijziging in de business partner niet resulteren in het aanpassen van de customer en andersom. Met behulp van het ZCUSTOMER_LINK_CHECK_REPORT programma kunnen deze fouten worden opgespoord en hersteld. Voor de vendor –en contactpersoon data zijn ZVENDOR_LINK_CHECK_REPORT en ZCUSTCONTACT_LINK_CHECK_REPORT beschikbaar. Deze programma's zijn te vinden in OSS note 974504 (Inconsistencies in link tables of master data sync).

 

Maatwerk check en integratie

Dikwijls zijn er maatwerk (custom) velden aanwezig in de customer/vendor master records. Synchronisatie van deze velden zal natuurlijk niet lukken zonder dat deze velden ook beschikbaar zijn in het business partner master record. In de OSS note 2214213 (SAP S/4HANA, on premise edition 1511: Restriction note) is een document opgenomen met de velden die beschikbaar zijn in de business partner. Deze velden zijn dan ook opgenomen in de CVI. Voor de integratie van maatwerk velden is er een SAP Cookbook beschikbaar (Cookbook for enhancing the SAP Business Partner with additional customer/vendor fields) waarin uitgelegd wordt hoe deze velden op te nemen zijn in de business partner master records. Dit document is te vinden in de OSS note 2309153 (BP_CVI: Guideline Version 1.14 for customer enhancements in CVI in S/4HANA releases)

 

Voor het uitbreiden van de CVI, maatwerk velden vanuit customer en/of vendor naar de business partner en vice versa is enhancement spot CVI_CUSTOM_MAPPER beschikbaar.

De meest gebruikte methoden hier zijn:

  •         IF_EX_CVI_CUSTOM_MAPPER~MAP_BP_TO_CUSTOMER
  •         IF_EX_CVI_CUSTOM_MAPPER~MAP_BP_TO_VENDOR
  •         IF_EX_CVI_CUSTOM_MAPPER~MAP_CUSTOMER_TO_BP
  •         IF_EX_CVI_CUSTOM_MAPPER~MAP_VENDOR_TO_BP

 

Specifiek voor de migratie van customer naar business partner is de methode IF_EX_CVI_CUSTOM_MAPPER~MAP_CUSTOMER_TO_BP zeer goed bruikbaar om eigen velden te mappen, maar daarnaast kun je hier heel goed standaardwaarden in laten vullen die nog niet beschikbaar zijn in de customer master. Denk bijvoorbeeld aan de “authorization group” die je zou willen vullen o.b.v. de account group van de customer master.

 

Afhankelijkheden met SAP CRM

Het is belangrijk om afhankelijkheden met aangrenzende systemen goed in kaart te brengen. Heel vaak is er ook een SAP CRM systeem gekoppeld aan het SAP ERP systeem. Replicatie tussen SAP CRM business partner en ERP customer wordt tot stand gebracht op basis van SAP CRM business partner GUID (Global unique Identifier) en customer nummer. SAP CRM maakt dus al gebruik van de business partner en als de replicatie gehandhaafd moet blijven, moeten deze CRM business partner GUIDs worden gebruikt tijdens het genereren van de business partner in ERP. Anders worden in de CVI sysnchonsatiestap, bij het aanmaken van de business partner, ook de nieuwe business partner GUIDs aangemaakt. Hierdoor zal de link tussen CRM business partner en ERP business partner niet worden gelegd waardoor ook de replicatie naar CRM niet goed zal gaan.

 

Om dit te voorkomen is er een Badi implementatie nodig om ervoor te zorgen dat GUIDS van de CRM business partners worden gebruikt tijdens de creatie van de ECC zakenpartners. Mocht deze stap overgeslagen worden, komen ECC business partners en de CRM business partners niet overeen en de replicatie naar SAP CRM zal resulteren in het aanmaken van nieuwe business partners. Hierdoor ontstaan er dubbele business partners in CRM.

Hoe hiermee om te gaan is beschreven in OSS note 2285062 (Business partners data exchange SAP CRM and S/4 HANA).

 

Archiveren van de klant / leverancier data met archiveringsteken

Het belang van het archiveren is beschreven in deel1 van dit blog.

 

Activeren van de business functies

Nieuwe business functies moeten worden geactiveerd als er vendor contactpersonen gesynchroniseerd moeten worden. In het SAP S/4HANA Cookbook  Customer/Vendor Integration zijn SAP notes opgenomen die hiervoor gebruikt moeten worden.

 

Synchronisatie

Als de voorbereiding goed uitgevoerd is kan de synchronisatie van de objecten starten. Synchronisatie wordt uitgevoerd met behulp van de synchronisatie cockpit. Deze kan worden gestart middels transactiecode “MDS_LOAD_COCKPIT”. Deze cockpit kan ook worden gestart vanuit de IMG:

 

display img

 

Hierin kunnen we eerst het synchronisatieproces kiezen:

  • Business Partner naar Customer
  • Business Partner naar Vendor
  • Customer naar Business Partner
  • Vendor naar Business Partner

 

Het is ook mogelijk om verschillende filters aan te brengen, zodat de synchronisatie wordt uitgevoerd per account group of customer ID. Bij de synchronisatie van customer naar business partner bijvoorbeeld, worden altijd customers inclusief contactpersonen gesynchroniseerd. Bij de business partner naar customer, kunnen ook verschillende opties in de scope gekozen worden, namelijk alleen business partners, alleen business partner relaties of business partners inclusief relaties. Heel belangrijk voor de synchronisatie stap is ook om de verschillende queues van te voren te registreren in de transactie SMQR.

 

Dit betreft de volgende queues:

  •         MDS_BUPA_CUST,
  •         MDS_BUPA_VEND,
  •         MDS_CUST_BUPA
  •         MDS_CUST_VEND

 

synchronization cockpit 1

 

Nadat alle opties zijn ingevuld, kan worden overgegaan tot het uitvoeren van de synchronisatie.

In het “monitor” tabblad van de cockpit is er gelijk te zien hoe de synchronisatie stap verlopen is en of er fouten opgetreden zijn.

 

synchronization cockpit 2

 

Bij de eventuele fouten, kan er vanuit de monitor “postprocessing desktop” worden gestart door middel van de knop: “Call PPO” . Postprocessing Desktop is ook op te starten met behulp van transactie “MDS_PPO2”.  Postprocessing desktop geeft belangrijke aanwijzingen waar eventuele fouten zijn opgetreden. Daaruit kunnen nog een aantal aanvullende data correcties volgen en kan de synchronisatie opnieuw worden gestart.

 

De logs die worden gegenereerd kunnen niet zomaar worden verwerkt. Verwerkingslogs kunnen de foute status aangeven en blijven ook fout zonder correctie. Zeker als een customer of vendor conversie wordt gestart en er geen BP wordt aangekoppeld, dan kan er in de log een business partner nummer staan dat helemaal niet bestaat. Als je de PPO order dan handmatig op verwerkt zet en later teruggaat naar deze order, dan kun je in de details niet naar de juiste business partner toe navigeren. Het is om die reden heel belangrijk om de fouten op te lossen, alvorens de status van de order  op “verwerkt” te zetten.

 

postprocessing desktop 1

 

postprocessing desktop 2

 

Standaard is er ook de transactie “MDS_LINKS”, met een programma waarmee je de gekoppelde business partner voor een customer of vendor en vice versa kan vinden.

 

program CVI mapping

 

Transactie is leuk, maar niet  heel erg effectief vanwege het feit dat er alleen één customer en/of business partner ID ingegeven kan worden. Met minimale inspanning zijn programma's te maken waarmee meerdere business partners te selecteren zijn op basis van customer nummer maar ook bijvoorbeeld op basis van account group die net als standaard SAP programma’s kunnen helpen bij het oplossen van de synchronisatiefouten.

 

Hieronder zijn voorbeelden (en voorbeeldcode) te vinden van een programma waar een overzicht kan worden gegenereerd van de business partners die wel/niet gekoppeld zijn aan een customer en/of vendor.

 

zcvi get bp 2

zcvi get bp 1

ZCVI_GET_BP_FOR_VEND

REPORT zcvi_get_bp_for_vend.

* Tables
TABLES: lfa1, but000.

* Types
TYPES: BEGIN OF ty_output,
vendor TYPE lifnr,
name1 TYPE name1_gp,
name2 TYPE name2_gp,
account_grp TYPE KTOKK,
partner TYPE bu_partner,
bukrs TYPE bukrs,
END OF ty_output.

TYPES: BEGIN OF ty_results,
vendor TYPE lifnr,
name1 TYPE name1_gp,
name2 TYPE name2_gp,
account_grp TYPE ktokk,
partner_guid TYPE bu_partner_guid,
partner TYPE bu_partner,
bukrs TYPE bukrs,
END OF ty_results.

TYPES: BEGIN OF ty_comco,
vendor TYPE lifnr,
bukrs TYPE bukrs,
END OF ty_comco.

TYPES: BEGIN OF ty_bp,
partner_guid TYPE bu_partner_guid,
partner TYPE partner,
END OF ty_bp.

* References
DATA: lr_alv TYPE REF TO cl_salv_table.

* Internal tables
DATA: lt_output TYPE TABLE OF ty_output.
DATA: lt_results TYPE TABLE OF ty_results.
DATA: lt_comco TYPE TABLE OF ty_comco.
DATA: lt_bp TYPE TABLE OF ty_bp.

* Workarea
DATA: ls_output TYPE ty_output.
DATA: ls_results TYPE ty_results.
DATA: ls_comco TYPE ty_comco.
DATA: ls_bp TYPE ty_bp.

* Variables
DATA: lt_fieldcatalogue TYPE slis_t_fieldcat_alv,
ls_layout TYPE slis_layout_alv,
lv_repid LIKE sy-repid,
lv_save TYPE c VALUE 'X',
lv_variant TYPE disvariant,
lv_exit TYPE c,
lv_rssubinfo TYPE rssubinfo,
lv_lines TYPE i,
lv_lines_no_bp TYPE i,
lv_lines_with_bp TYPE i.
DATA: ls_fieldcatalogue TYPE slis_fieldcat_alv,
lt_sortinfo TYPE slis_t_sortinfo_alv,
lwa_sortinfo TYPE slis_sortinfo_alv.

* Selection screen
SELECTION-SCREEN BEGIN OF BLOCK sel WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: so_lifnr FOR lfa1-lifnr.
SELECT-OPTIONS: so_ktokk FOR lfa1-ktokk.
PARAMETERS: pa_check TYPE boolean DEFAULT 'X' AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK sel.

START-OF-SELECTION.

CLEAR: ls_output.
CLEAR: ls_results.
CLEAR: ls_comco.
CLEAR: ls_bp.

*Select data
SELECT lfa1~lifnr
lfa1~name1
lfa1~name2
lfa1~ktokk
cvi_vend_link~partner_guid
INTO TABLE lt_results
FROM lfa1
LEFT OUTER JOIN cvi_vend_link
ON lfa1~lifnr EQ cvi_vend_link~vendor
WHERE lfa1~lifnr IN so_lifnr
AND lfa1~ktokk IN so_ktokk.

IF sy-subrc EQ 0.

SORT lt_results BY vendor.

SELECT lifnr bukrs
FROM lfb1
INTO TABLE lt_comco.
IF sy-subrc EQ 0.
SORT lt_comco BY vendor.
ENDIF.

SELECT partner_guid partner
FROM but000
INTO TABLE lt_bp
WHERE partner_guid NE space.
IF sy-subrc EQ 0.
SORT lt_bp BY partner_guid.
ENDIF.

LOOP AT lt_results INTO ls_results.

READ TABLE lt_comco INTO ls_comco
WITH KEY vendor = ls_results-vendor.
IF sy-subrc EQ 0.
ls_results-bukrs = ls_comco-bukrs.
ELSE.
CLEAR: ls_results-bukrs.
ENDIF.

IF ls_results-partner_guid NE space.
READ TABLE lt_bp INTO ls_bp
WITH KEY partner_guid = ls_results-partner_guid.
IF sy-subrc EQ 0.
ls_results-partner = ls_bp-partner.
ELSE.
CLEAR: ls_results-partner.
ENDIF.
ENDIF.

MODIFY lt_results FROM ls_results.

ENDLOOP.

LOOP AT lt_results INTO ls_results.

CLEAR: ls_output.

MOVE-CORRESPONDING ls_results TO ls_output.

IF ls_results-partner IS INITIAL.
lv_lines_no_bp = lv_lines_no_bp + 1.
ELSE.
lv_lines_with_bp = lv_lines_with_bp + 1.
ENDIF.

IF pa_check EQ abap_true.
IF ls_results-partner IS INITIAL.
APPEND ls_output TO lt_output.
ENDIF.
ELSE.
APPEND ls_output TO lt_output.
ENDIF.

ENDLOOP.

DESCRIBE TABLE lt_output LINES lv_lines.

ENDIF.

* build up table for output
PERFORM build_table USING lt_fieldcatalogue.

* Result list in ALV
lv_repid = sy-repid.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = lv_repid
i_callback_top_of_page = 'TOP-OF-PAGE' "see FORM
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = lt_fieldcatalogue
* it_sort = lt_sortinfo
* i_screen_start_column = 14
* i_screen_start_line = 18
* i_screen_end_column = 120
* i_save = lv_save
* i_screen_end_line = lv_lines
TABLES
t_outtab = lt_output
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

FORM top-of-page.
*ALV Header declarations
DATA: t_header TYPE slis_t_listheader,
wa_header TYPE slis_listheader,
t_line LIKE wa_header-info,
ld_lines TYPE i,
ld_linesc(10) TYPE c.
* Title
wa_header-typ = 'H'.
IF pa_check EQ abap_false.
wa_header-info = sy-title.
ELSE.
CONCATENATE sy-title '- Only Customers Without BP' INTO wa_header-info SEPARATED BY SPACE.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
* Date
wa_header-typ = 'S'.
wa_header-key = 'Date: '.
CONCATENATE sy-datum+6(2) '.'
sy-datum+4(2) '.'
sy-datum(4) INTO wa_header-info. "todays date
APPEND wa_header TO t_header.
CLEAR: wa_header.
* Total no. of lines
wa_header-typ = 'S'.
wa_header-key = 'No. of entries: '.
wa_header-info = lv_lines.
APPEND wa_header TO t_header.
CLEAR: wa_header.
* No. of lines without BP
wa_header-typ = 'S'.
wa_header-key = 'Entries without BP: '.
wa_header-info = lv_lines_no_bp.
APPEND wa_header TO t_header.
CLEAR: wa_header.
* No. of lines with BP
IF pa_check EQ abap_false.
wa_header-typ = 'S'.
wa_header-key = 'Entries with BP: '.
wa_header-info = lv_lines_with_bp.
APPEND wa_header TO t_header.
CLEAR: wa_header.
ENDIF.

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = t_header.

ENDFORM. "top-of-page

FORM user_command USING ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form BUILD_TABLE
*&---------------------------------------------------------------------*
FORM build_table USING pt_fieldcatalogue TYPE slis_t_fieldcat_alv.

* Build table
ls_fieldcatalogue-fieldname = 'VENDOR'.
ls_fieldcatalogue-seltext_m = 'Vendor'.
ls_fieldcatalogue-col_pos = 0.
ls_fieldcatalogue-outputlen = 20.
ls_fieldcatalogue-do_sum = 'X'.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'NAME1'.
ls_fieldcatalogue-seltext_m = 'Name 1'.
ls_fieldcatalogue-col_pos = 1.
ls_fieldcatalogue-outputlen = 40.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'NAME2'.
ls_fieldcatalogue-seltext_m = 'Name 2'.
ls_fieldcatalogue-col_pos = 2.
ls_fieldcatalogue-outputlen = 40.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'ACCOUNT_GRP'.
ls_fieldcatalogue-seltext_m = 'Account Group'.
ls_fieldcatalogue-col_pos = 3.
ls_fieldcatalogue-outputlen = 10.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'PARTNER'.
ls_fieldcatalogue-seltext_m = 'Business Partner'.
ls_fieldcatalogue-col_pos = 4.
ls_fieldcatalogue-outputlen = 15.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'BUKRS'.
ls_fieldcatalogue-seltext_m = 'Company Code'.
ls_fieldcatalogue-col_pos = 5.
ls_fieldcatalogue-outputlen = 10.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ENDFORM.

 

ZCVI_GET_BP_FOR_CUST

REPORT zcvi_get_bp_for_cust.

* Tables
TABLES: kna1, but000.

* Types
TYPES: BEGIN OF ty_output,
customer TYPE kunnr,
name1 TYPE name1_gp,
name2 TYPE name2_gp,
account_grp TYPE ktokd,
partner TYPE bu_partner,
bukrs TYPE bukrs,
END OF ty_output.

TYPES: BEGIN OF ty_results,
customer TYPE kunnr,
name1 TYPE name1_gp,
name2 TYPE name2_gp,
account_grp TYPE ktokd,
partner_guid TYPE bu_partner_guid,
partner TYPE bu_partner,
bukrs TYPE bukrs,
END OF ty_results.

TYPES: BEGIN OF ty_comco,
customer TYPE kunnr,
bukrs TYPE bukrs,
END OF ty_comco.

TYPES: BEGIN OF ty_bp,
partner_guid TYPE bu_partner_guid,
partner TYPE partner,
END OF ty_bp.

* References
DATA: lr_alv TYPE REF TO cl_salv_table.

* Internal tables
DATA: lt_output TYPE TABLE OF ty_output.
DATA: lt_results TYPE TABLE OF ty_results.
DATA: lt_comco TYPE TABLE OF ty_comco.
DATA: lt_bp TYPE TABLE OF ty_bp.

* Workarea
DATA: ls_output TYPE ty_output.
DATA: ls_results TYPE ty_results.
DATA: ls_comco TYPE ty_comco.
DATA: ls_bp TYPE ty_bp.

* Variables
DATA: lt_fieldcatalogue TYPE slis_t_fieldcat_alv,
ls_layout TYPE slis_layout_alv,
lv_repid LIKE sy-repid,
lv_save TYPE c VALUE 'X',
lv_variant TYPE disvariant,
lv_exit TYPE c,
lv_rssubinfo TYPE rssubinfo,
lv_lines TYPE i,
lv_lines_no_bp TYPE i,
lv_lines_with_bp TYPE i.
DATA: ls_fieldcatalogue TYPE slis_fieldcat_alv,
lt_sortinfo TYPE slis_t_sortinfo_alv,
lwa_sortinfo TYPE slis_sortinfo_alv.

* Selection screen
SELECTION-SCREEN BEGIN OF BLOCK sel WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: so_kunnr FOR kna1-kunnr.
SELECT-OPTIONS: so_ktokd FOR kna1-ktokd.
PARAMETERS: pa_check TYPE boolean DEFAULT 'X' AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK sel.

START-OF-SELECTION.

CLEAR: ls_output.
CLEAR: ls_results.
CLEAR: ls_comco.
CLEAR: ls_bp.

*Select data
SELECT kna1~kunnr
kna1~name1
kna1~name2
kna1~ktokd
cvi_cust_link~partner_guid
INTO TABLE lt_results
FROM kna1
LEFT OUTER JOIN cvi_cust_link
ON kna1~kunnr EQ cvi_cust_link~customer
WHERE kna1~kunnr IN so_kunnr
AND kna1~ktokd IN so_ktokd.

IF sy-subrc EQ 0.

SORT lt_results BY customer.

SELECT kunnr bukrs
FROM knb1
INTO TABLE lt_comco.
IF sy-subrc EQ 0.
SORT lt_comco BY customer.
ENDIF.

SELECT partner_guid partner
FROM but000
INTO TABLE lt_bp
WHERE partner_guid NE space.
IF sy-subrc EQ 0.
SORT lt_bp BY partner_guid.
ENDIF.

LOOP AT lt_results INTO ls_results.

READ TABLE lt_comco INTO ls_comco
WITH KEY customer = ls_results-customer.
IF sy-subrc EQ 0.
ls_results-bukrs = ls_comco-bukrs.
ELSE.
CLEAR: ls_results-bukrs.
ENDIF.

IF ls_results-partner_guid NE space.
READ TABLE lt_bp INTO ls_bp
WITH KEY partner_guid = ls_results-partner_guid.
IF sy-subrc EQ 0.
ls_results-partner = ls_bp-partner.
ELSE.
CLEAR: ls_results-partner.
ENDIF.
ENDIF.

MODIFY lt_results FROM ls_results.

ENDLOOP.

LOOP AT lt_results INTO ls_results.

CLEAR: ls_output.

MOVE-CORRESPONDING ls_results TO ls_output.

IF ls_results-partner IS INITIAL.
lv_lines_no_bp = lv_lines_no_bp + 1.
ELSE.
lv_lines_with_bp = lv_lines_with_bp + 1.
ENDIF.

IF pa_check EQ abap_true.
IF ls_results-partner IS INITIAL.
APPEND ls_output TO lt_output.
ENDIF.
ELSE.
APPEND ls_output TO lt_output.
ENDIF.

ENDLOOP.

DESCRIBE TABLE lt_output LINES lv_lines.

ENDIF.

* build up table for output
PERFORM build_table USING lt_fieldcatalogue.

* Result list in ALV
lv_repid = sy-repid.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = lv_repid
i_callback_top_of_page = 'TOP-OF-PAGE' "see FORM
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = lt_fieldcatalogue
* it_sort = lt_sortinfo
* i_screen_start_column = 14
* i_screen_start_line = 18
* i_screen_end_column = 120
* i_save = lv_save
* i_screen_end_line = lv_lines
TABLES
t_outtab = lt_output
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

FORM top-of-page.
*ALV Header declarations
DATA: t_header TYPE slis_t_listheader,
wa_header TYPE slis_listheader,
t_line LIKE wa_header-info,
ld_lines TYPE i,
ld_linesc(10) TYPE c.
* Title
wa_header-typ = 'H'.
IF pa_check EQ abap_false.
wa_header-info = sy-title.
ELSE.
CONCATENATE sy-title '- Only Customers Without BP' INTO wa_header-info SEPARATED BY SPACE.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
* Date
wa_header-typ = 'S'.
wa_header-key = 'Date: '.
CONCATENATE sy-datum+6(2) '.'
sy-datum+4(2) '.'
sy-datum(4) INTO wa_header-info. "todays date
APPEND wa_header TO t_header.
CLEAR: wa_header.
* Total no. of lines
wa_header-typ = 'S'.
wa_header-key = 'No. of entries: '.
wa_header-info = lv_lines.
APPEND wa_header TO t_header.
CLEAR: wa_header.
* No. of lines without BP
wa_header-typ = 'S'.
wa_header-key = 'Entries without BP: '.
wa_header-info = lv_lines_no_bp.
APPEND wa_header TO t_header.
CLEAR: wa_header.
* No. of lines with BP
IF pa_check EQ abap_false.
wa_header-typ = 'S'.
wa_header-key = 'Entries with BP: '.
wa_header-info = lv_lines_with_bp.
APPEND wa_header TO t_header.
CLEAR: wa_header.
ENDIF.

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = t_header.

ENDFORM. "top-of-page

FORM user_command USING ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form BUILD_TABLE
*&---------------------------------------------------------------------*
FORM build_table USING pt_fieldcatalogue TYPE slis_t_fieldcat_alv.

* Build table
ls_fieldcatalogue-fieldname = 'CUSTOMER'.
ls_fieldcatalogue-seltext_m = 'Customer'.
ls_fieldcatalogue-col_pos = 0.
ls_fieldcatalogue-outputlen = 20.
ls_fieldcatalogue-do_sum = 'X'.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'NAME1'.
ls_fieldcatalogue-seltext_m = 'Name 1'.
ls_fieldcatalogue-col_pos = 1.
ls_fieldcatalogue-outputlen = 40.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'NAME2'.
ls_fieldcatalogue-seltext_m = 'Name 2'.
ls_fieldcatalogue-col_pos = 2.
ls_fieldcatalogue-outputlen = 40.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'ACCOUNT_GRP'.
ls_fieldcatalogue-seltext_m = 'Account Group'.
ls_fieldcatalogue-col_pos = 3.
ls_fieldcatalogue-outputlen = 10.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'PARTNER'.
ls_fieldcatalogue-seltext_m = 'Business Partner'.
ls_fieldcatalogue-col_pos = 4.
ls_fieldcatalogue-outputlen = 15.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ls_fieldcatalogue-fieldname = 'BUKRS'.
ls_fieldcatalogue-seltext_m = 'Company Code'.
ls_fieldcatalogue-col_pos = 5.
ls_fieldcatalogue-outputlen = 10.
APPEND ls_fieldcatalogue TO pt_fieldcatalogue.
CLEAR ls_fieldcatalogue.

ENDFORM.

Top