Massenpflege Customer Thema ist als GELÖST markiert

SAP R/3 Finanzwesen: Hauptbuchhaltung; Kreditorenbuchhaltung; Debitorenbuchhaltung; Bankbuchhaltung; Anlagenbuchhaltung; ...
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Massenpflege Customer

Beitrag von Thomas R. (Expert / 705 / 43 / 30 ) » 21.03.2016 13:01
Hallo,
wir haben anhand Hinweis 577502 modifikationsfrei ein Feld an die KNB1 gehängt und die XD01-XD03 entsprechend erweitert.
Nun kommt die Forderung, dieses Feld per Massenpflege zu füllen.
Leider hat die MASS ( 740 SP 11) jetzt keinen Zugriff auf das per APPEND angehängte Feld.
Wenn ich den Hinweis richtig verstehe dann würde auch eine Implementierung des CUSTOMER_ADD_DATA_BI die Situation nicht ändern.
Im BAPI BAPI_CUSTOMER_CHANGEFROMDATA1 finde ich auch keine Möglichkeit das APPEND zu pflegen.

Wie kann ich nun eine Massenänderung realisieren?
Z.Z. sehe ich nur die Option die Methode
IF_EX_CUSTOMER_ADD_DATA_BI~FILL_FT_TABLE_USING_DATA_ROWS
zu implementieren und ein Batch-Input-Programm zu schreiben.

Erfahungen, Vorschläge oder Meinungen zu diesem Thema?

MfG
Thomas R.

Mittels der Unterstützung von black adept wurde die Massenänderung in die XD99 eingebaut.
Schritte:
Eintrag des kundeneigenen Feldes in die MASSFLDLST - somit sieht die Massenänderung das Feld als änderbar an.
Erweiterung der BKNB1 um das kundeneigene Feld
Implementierung des Enhancement-Spots CUSTOMER_ADD_DATA_BI. In der implementierenden Klasse muss eigentlich nur die Methode IF_EX_CUSTOMER_ADD_DATA_BI~MODIFY_BI_STRUCT_FROM_STD_SEG und die Methode IF_EX_CUSTOMER_ADD_DATA_BI~FILL_FT_TABLE_USING_DATA_ROWS implementiert werden.
Die Daten können in IF_EX_CUSTOMER_ADD_DATA_BI~MODIFY_BI_STRUCT_FROM_STD_SEG nicht direkt gelesen werden, deshalb werden die Daten in der impliziten Erweiterung am Anfang von FuBa MASS_DEBMAS03_CHANGE ins Memory exportiert (EXPORT SKNB1[] SELDATA[] to memory id 'ZCUSTOMER_ADDITIONIAL_DATA_XD99') und in der Methode IF_EX_CUSTOMER_ADD_DATA_BI~MODIFY_BI_STRUCT_FROM_STD_SEG wieder importiert.
Der Sprung in das Dynpro der zusätzlichen Felder erfolgt mit dem OK-Code BAO verkettet mit dem Namen der Bildschirmgruppe im Customizing. (Und dann mit dem Funktionscode aus dem Customizing auf den entsprechenden Reiter).

Folgende Benutzer bedankten sich beim Autor Thomas R. für den Beitrag:
Steffen (06.05.2020 11:21)



Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 06.04.2020 13:21
Hallo,

ich habe ein ähnliches Problem, wie „Thomas R.“ damals. In der DB-Tabelle „KNVV“ wurden Z-Felder per Append angefügt. Die Z-Felder sollen nun über die Transaktion „XD99“ verändert werden können.

An die beschriebene Vorgehensweise habe ich mich versucht zu halten. Doch leider, komme ich ab den Schritten bzgl. der Methoden-Implementierungen nicht weiter.

Könntest Du „Thomas R.“ oder evtl. jemand anders, mich diesbezüglich unterstützen, in dem Ihr diese Schritte detaillierter erläutert mit Coding –Auszügen?

Vielen Dank im Voraus für Eure Unterstützung.

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Thomas R. (Expert / 705 / 43 / 30 ) » 06.04.2020 20:44
Hallo Steffen,
sollte Dir bis dahin noch niemand geholfen haben werde ich nach meinem Urlaub (nach dem 20.4.20) versuchen Dir weiterzuhelfen.

MfG
Thomas R.

Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 07.04.2020 08:44
Hallo Thomas R.,

alles klar. Vielen Dank vorab für Deine Unterstützung.

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 21.04.2020 07:42
Hallo Thomas R.,

bisher konnte mir leider niemand weiterhelfen. Könntest Du mich diesbezüglich unterstützen?

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Thomas R. (Expert / 705 / 43 / 30 ) » 21.04.2020 07:46
Hallo Steffen,
leider muss ich zuerst noch die wichtigsten Dinge für meinen Brötchengeber erledigen. Aber ich hoffe heute Nachmittag dafür Zeit zu haben.
Viele Grüße
Thomas R.

P.S. Du hast den thread auf gelöst gesetzt - da schauen dann viele nicht mehr rein...

Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 21.04.2020 10:58
Hallo Thomas R.,

klar, kein Problem. Vielleicht findest Du in den nächsten Tagen, Zeit diesbezüglich. Das wäre super.
Der Thread war bereits auf "Gelöst" gesetzt, als ich diesen fand.

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Thomas R. (Expert / 705 / 43 / 30 ) » 21.04.2020 11:26
Hallo Steffen,
klar, den habe ich ja selbst auf gelöst gesetzt, als das Problem gelöst war 😞 .

Hier die Quellcodes meiner implementierenden Klasse ZCL_IM_CUSTOMER_MASTER_DATA_BI (Bezeichner aus Anonymisierungsgründen teilweise geändert)

Code: Alles auswählen.

Attribute
ST_FIELDNAMES_KNB1_APPEND	Static Attribute	Protected	Type	FIELDNAME_TAB	Tabelle von Feldnamen
AT_SELDATA	Instance Attribute	Protected	Type	MASS_TABDATA	Tabelle mit den Änderungsinfos (Massenpflege)
AT_SKNB1	Instance Attribute	Protected	Type	STT_SKNB1	KNB1-Daten
AV_KUNNR	Instance Attribute	Protected	Type	KUNNR	Debitorennummer

Code: Alles auswählen.

METHOD class_constructor.
* Read fieldnames of KNB1-append
  DATA:
    lo_structdescr TYPE REF TO cl_abap_structdescr.
  FIELD-SYMBOLS:
    <ls_component> LIKE LINE OF lo_structdescr->components.
*
  lo_structdescr ?= cl_abap_structdescr=>describe_by_name( 'ZST_KNB1_APPEND' ).
* No error handling: If type not exists than we have to stop processing in every case.
  LOOP AT lo_structdescr->components[] ASSIGNING <ls_component>.
    INSERT <ls_component>-name INTO TABLE st_fieldnames_knb1_append[].
  ENDLOOP.
ENDMETHOD.

Code: Alles auswählen.

METHOD if_ex_customer_add_data_bi~modify_bi_struct_from_std_seg.
*--------------------------------------------------------------------*
* The additional fields have to be filled, but there are no interface
* to the additional data. So the implizit enhancement of function
* module MASS_DEBMAS03_CHANGE at the beginning is used to export the
* data. Now we can import them here.
*--------------------------------------------------------------------*
    DATA:
      ls_e1kna1m TYPE e1kna1m,
      ls_e1knb1m TYPE e1knb1m.
*
    CASE i_segment_name.
      WHEN 'E1KNA1M'.
        ls_e1kna1m = i_segment_data.
        me->av_kunnr = ls_e1kna1m-kunnr.
      WHEN 'E1KNB1M'.
        CLEAR:
          me->at_sknb1[],
          me->at_seldata[].
        IMPORT sknb1 TO me->at_sknb1[] seldata TO me->at_seldata[] FROM MEMORY ID 'ZKNB1_APPEND_01'.
        IF sy-subrc = 0.  "Import ok -> it means we are called from XD99
          ls_e1knb1m = i_segment_data.
          me->modify_bknb1_from_xd99( EXPORTING
                                        iv_nodata        = i_nodata
                                        is_e1knb1m       = ls_e1knb1m
                                      CHANGING
                                        es_bi_struct     = e_bi_struct ).
*       ELSE.
*         NOP
        ENDIF.
*     WHEN OTHERS.
*       NOP
    ENDCASE.
  ENDMETHOD.

Code: Alles auswählen.

METHOD modify_bknb1_from_xd99.
    DATA:
      ls_knb1_additonal_data TYPE zst_knb1_append.
    FIELD-SYMBOLS:
      <lv_field_knb1>            TYPE any,
      <lv_field_additional_data> TYPE any,
      <ls_bknb1>                 TYPE bknb1,
      <ls_seldata>               LIKE LINE OF me->at_seldata,
      <lv_fieldname>             LIKE LINE OF <ls_seldata>-fieldnames,  "fields to change in XD99
      <ls_knb1>                  TYPE knb1.
*
*   The additional fields are in structure ls_knb1_additonal_data.
*   The structure is in the CI-Include of BKNA1 contained.
*   If you make an ALE-Enhancement the fields should have the same names.
    ASSIGN es_bi_struct TO <ls_bknb1> CASTING ##ENH_OK.
    IF <ls_bknb1> IS ASSIGNED.
*     get all values of the additional data from BI structure into local store (fields to change and not to change)
      MOVE-CORRESPONDING <ls_bknb1> TO ls_knb1_additonal_data.
*     read corresponding KNB1 data (new values) with the current company code and customer number
      READ TABLE me->at_sknb1[] ASSIGNING <ls_knb1> WITH KEY kunnr = av_kunnr bukrs = is_e1knb1m-bukrs(4).
      IF sy-subrc IS INITIAL.
*       fields to change in current XD99 call are in at_seldata[]
        READ TABLE me->at_seldata[] INDEX 1 ASSIGNING <ls_seldata>.
        LOOP AT <ls_seldata>-fieldnames ASSIGNING <lv_fieldname>.
*         current field to change has to be in both structures ls_knb1_additonal_data and knb1
          ASSIGN COMPONENT <lv_fieldname> OF STRUCTURE ls_knb1_additonal_data TO <lv_field_additional_data>.
          IF sy-subrc IS INITIAL.
            ASSIGN COMPONENT <lv_fieldname> OF STRUCTURE <ls_knb1> TO <lv_field_knb1>.
            IF sy-subrc IS INITIAL.
*             copy value from knb1 into local additional data
              WRITE <lv_field_knb1> TO <lv_field_additional_data> ##WRITE_MOVE.
*           ELSE.
*             NOP
            ENDIF.
*         ELSE.
*           NOP
          ENDIF.
        ENDLOOP.
*       copy all values (changed and unchanged fields) from additional data structure into bi structure (export structure)
        MOVE-CORRESPONDING ls_knb1_additonal_data TO <ls_bknb1>.
*     ELSE.
*       NOP
      ENDIF.
*   ELSE.
*     NOP
    ENDIF.
  ENDMETHOD.

Code: Alles auswählen.

METHOD if_ex_customer_add_data_bi~fill_ft_table_using_data_rows.
    DATA:
      lv_dynpro_reached TYPE abap_bool VALUE abap_false,
      ls_bknb1          TYPE bknb1.
    FIELD-SYMBOLS:
      <ls_bdcdata>     TYPE bdcdata,
      <lv_field_bknb1> TYPE any,
      <lv_fieldname>   LIKE LINE OF st_fieldnames_knb1_append[],
      <ls_data_row>    LIKE LINE OF it_data_rows[].
*
    LOOP AT it_data_rows[] ASSIGNING <ls_data_row>.
      CASE <ls_data_row>(31).
        WHEN '2BKNB1'."only BI structure for knb1 is of interesting
          ls_bknb1 = <ls_data_row> ##ENH_OK.
          LOOP AT st_fieldnames_knb1_append[] ASSIGNING <lv_fieldname>."only current change fields
            ASSIGN COMPONENT <lv_fieldname> OF STRUCTURE ls_bknb1 TO <lv_field_bknb1>.
            IF sy-subrc IS INITIAL."change field is in bknb1 included
              IF <lv_field_bknb1> NE i_nodata.
                IF lv_dynpro_reached EQ abap_false.
*                 jump to additional data
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-fnam = 'BDC_OKCODE'.
                  <ls_bdcdata>-fval = 'BAOZM'.      "BAO + Name of screen group in customizing
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-program = 'SAPMF02D'.
                  <ls_bdcdata>-dynpro  = '4000'.
                  <ls_bdcdata>-dynbegin = 'X'.
*                 jump to tab page within additional data
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-fnam = 'BDC_OKCODE'.
                  <ls_bdcdata>-fval = 'DEFINED_FUNCTION_CODE'.      "Function code of TAB Page in customizing
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-program = 'SAPMF02D'.
                  <ls_bdcdata>-dynpro  = '4000'.
                  <ls_bdcdata>-dynbegin = 'X'.
                  lv_dynpro_reached = abap_true.
*               ELSE.
*                 NOP - dynpro reached, no jump into dynpro necessary
                ENDIF.
*               set new field value
                INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                CONCATENATE 'ZST_KNB1_APPEND-' <lv_fieldname> INTO <ls_bdcdata>-fnam.
                <ls_bdcdata>-fval = <lv_field_bknb1>.
*             ELSE.
*               NOP - no change of field value necessary
              ENDIF.
*           ELSE.
*             NOP - field not part of structure bknb1
            ENDIF.
          ENDLOOP.
      ENDCASE.
    ENDLOOP.
  ENDMETHOD.
Implizite Erweiterung am Anfang des FuBa mass_debmas03_change .

Code: Alles auswählen.

FUNCTION mass_debmas03_change .
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Funktionsbaustein MASS_DEBMAS03_CHANGE, Anfang                                                                                                    A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1  Z_MASS_DEBMAS03_CHANGE_S.    "active version
EXPORT SKNB1[] SELDATA[] to memory id 'ZKNB1_APPEND_01'.
ENDENHANCEMENT.
*$*$-End:   (1)---------------------------------------------------------------------------------$*$*
Damit solltest Du deutlich weiter kommen.

MfG
Thomas R.

Folgende Benutzer bedankten sich beim Autor Thomas R. für den Beitrag:
ewx (06.05.2020 09:35)


Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 21.04.2020 13:08
Hallo Thomas R.,

vielen Dank. Ich werde mich daran nun versuchen 😊. Bei Fragen würde ich mich nochmal melden. Danke Dir nochmals.

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 05.05.2020 16:22
Hallo Thomas R.,

ich nehme an der Type "STT_SKNB1" selbst definiert? Könntest Du mir sagen, wie der Typ aufgebaut ist?

Code: Alles auswählen.

AT_SKNB1	Instance Attribute	Protected	Type	STT_SKNB1	KNB1-Daten
Vielen Dank.

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Thomas R. (Expert / 705 / 43 / 30 ) » 06.05.2020 06:18
Hallo Steffen,
ganz einfach:
types:
stt_sknb1 TYPE STANDARD TABLE OF knb1 WITH NON-UNIQUE DEFAULT KEY .

MfG
Thomas R.

Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 06.05.2020 10:27
Hallo Thomas R.,

in der Transaktion „XD99“ erhalte ich folgende Meldung:

Feld ZZCUST_ENHA_BKNVV-ZVEART_KEP. ist in Dynpro SAPMF02D 4000 nicht vorhanden

Ich nehme an Du hast auch einen kundeneigenen Button mit einem eigenen Dynpro?

Hier mein Coding von der Methode „IF_EX_CUSTOMER_ADD_DATA_BI~FILL_FT_TABLE_USING_DATA_ROWS“ (Kopie von Deinem Coding):

Code: Alles auswählen.

  METHOD if_ex_customer_add_data_bi~fill_ft_table_using_data_rows.

    DATA:
      lv_dynpro_reached TYPE abap_bool VALUE abap_false,
      ls_bknvv          TYPE bknvv.
    FIELD-SYMBOLS:
      <ls_bdcdata>     TYPE bdcdata,
      <lv_field_bknvv> TYPE any,
      <lv_fieldname>   LIKE LINE OF st_fieldnames_knvv_append[],
      <ls_data_row>    LIKE LINE OF it_data_rows[].
*
    LOOP AT it_data_rows[] ASSIGNING <ls_data_row>.
      CASE <ls_data_row>(31).
        WHEN '2BKNVV'."only BI structure for 'KNVV' is of interesting
          ls_bknvv = <ls_data_row> ##ENH_OK.
          LOOP AT st_fieldnames_knvv_append[] ASSIGNING <lv_fieldname>."only current change fields
            ASSIGN COMPONENT <lv_fieldname> OF STRUCTURE ls_bknvv TO <lv_field_bknvv>.
            IF sy-subrc IS INITIAL."change field is in bknb1 included
              IF <lv_field_bknvv> NE i_nodata.
                IF lv_dynpro_reached EQ abap_false.
*                 jump to additional data
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-fnam = 'BDC_OKCODE'.
                  <ls_bdcdata>-fval = 'BAOZB'.      "BAO + Name of screen group in customizing
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-program = 'SAPMF02D'.
                  <ls_bdcdata>-dynpro  = '4000'.
                  <ls_bdcdata>-dynbegin = 'X'.
*                 jump to tab page within additional data
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-fnam = 'BDC_OKCODE'.
                  <ls_bdcdata>-fval = 'ZB_TAB1'.      "Function code of TAB Page in customizing
                  INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                  <ls_bdcdata>-program = 'SAPMF02D'.
                  <ls_bdcdata>-dynpro  = '4000'.
                  <ls_bdcdata>-dynbegin = 'X'.
                  lv_dynpro_reached = abap_true.
*               ELSE.
*                 NOP - dynpro reached, no jump into dynpro necessary
                ENDIF.
*               set new field value
                INSERT INITIAL LINE INTO TABLE et_ft[] ASSIGNING <ls_bdcdata>.
                CONCATENATE 'ZZCUST_ENHA_BKNVV-' <lv_fieldname> INTO <ls_bdcdata>-fnam.
                <ls_bdcdata>-fval = <lv_field_bknvv>.
*             ELSE.
*               NOP - no change of field value necessary
              ENDIF.
*           ELSE.
*             NOP - field not part of structure bknb1
            ENDIF.
          ENDLOOP.
      ENDCASE.
    ENDLOOP.

  ENDMETHOD.
Hast Du evtl. eine Idee voran das liegen könnte? Vielen Dank im Voraus.

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Thomas R. (Expert / 705 / 43 / 30 ) » 06.05.2020 10:38
Hallo Steffen,
hast Du auch die BKNB1 erweitert?

MfG
Thomas R.

Re: Massenpflege Customer

Beitrag von Steffen (ForumUser / 28 / 1 / 0 ) » 06.05.2020 10:49
Hallo Thomas R.,

nein, nur die BKNVV (KNVV).

Beste Grüße
Steffen

Re: Massenpflege Customer

Beitrag von Thomas R. (Expert / 705 / 43 / 30 ) » 06.05.2020 10:55
Hallo Steffen,
klar, die willst Du ja auch.
Die Fehlermeldung sagt ja, dass der Feldname nicht stimmt.
Da musst Du etwas suchen, schau Dir im Debugger einmal an, wie Dein neues Feld an der Stelle wirklich heißt.....

Viel Erfolg!
Thomas R.