Erweiterung PBAS0001

SAP R/3 Personamwirtschaft: Personalmanagement, Personalzeitwirtschaft, Personalabrechnung, Veranstaltungsmanagement, Personalentwicklung, Kostenplanung...
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

Erweiterung PBAS0001

Beitrag von Kelly (ForumUser / 25 / 0 / 0 ) »
Hallo,

ich ermittle im EXIT_SAPFP50M_002 (Erweiterung PBAS0001) das Jahresgehalt für den IT8.

Wenn ich nun den Betrag ändere und das ganze sichern möchte,
dann durchläuft er den Exit und alles sieht gut aus.
Möchte ich dann den IT8 verlassen, dann kommt das PopUp 'Daten werden verlorengehen....'.

Wieso speichert er meinen neuen Wert nicht? Was muss ich beachten?
...HILFE...

Grüße,
Kelly

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von donny (Specialist / 253 / 0 / 2 ) »
Hallo Kelly,

der genannte Exit wird zur Prüfung der eingegebene Daten aufgerufen und kann auch dazu genutzt werden, Werte zu ändern. Er speichert aber selbst nichts.

Du wirst also bei der Infotyp-Pflege einfach mal den Speichern-Knopf drücken müssen. Dann wird alles gespeichert, inclusive des von dir ermittelten Wertes.

Willst du die Daten aber schon bei der ersten Anzeige der Daten neu berechnet haben, solltest du lieber den Exit EXIT_SAPFP50M_001 verwenden, der Vorschlagswerte auf den Schirm bringt. Speichern ist danach natürlich auch notwendig.

aus der SAP-Hilfe zum EXIT_SAPFP50M_002:
Der erfaßte Infotypsatz kann im Funktionsexit noch verändert werden.
Der für das Erweiterungsprojekt Verantwortliche muß sicherstellen,
daß die Feldinhalte konsistent sind! Damit die neuen Feldwerte
nochmals am Bildschirm angezeigt werden, muß der Schalter
Show_data_again gesetzt werden.
Hast du vielleicht Show_data_again gesetzt?

Oder verstehe ich da jetzt was falsch?

donny

Beitrag von Kelly (ForumUser / 25 / 0 / 0 ) »
Hallo,

show_data_again habe ich gesetzt.
Ohne erscheint der neue Wert nicht, sondern der Alte - was ja nicht richtig ist.
Hm.

Also, aktuell ist es so:
Ich gebe einen Wert ein und bestätige mit Enter - der Exit wird durchlaufen und das Ergebnis berechnet.
Drücke ich auf speichern, dann wird der Exit auch durchlaufen.
Will ich dann mit dem Button den Infotyp verlassen, dann kommt das PopUp 'Daten werden verloren gehen....' - es wurde als nichts gespeichert.

Ich versteh das net.... :cry:

Grüße, Kelly

Beitrag von donny (Specialist / 253 / 0 / 2 ) »
Hi Kelly,

ich denke es ist der "show_data_again". Dadurch wird das Speichern verhindert und der Bildschirm mit den neuen Werten wieder angezeigt. Wenn du wirklich willst, dass der berechnete Wert nochmal angezeigt wird, kannst du den Parameter setzen. Dann musst du aber darauf achten, daß beim zweiten Durchlauf (wenn der Wert schon richtig angezeigt wird) nicht nochmal der Wert berechnet und wieder "show_data_again" gesetzt wird. Dann kommst du nie aus der Maske raus!

Reicht es nicht, wenn der Wert beim Speichern einfach berechnet und gespeichert wird, ohne ihn nochmal anzuzeigen?
Besser ist doch:
- Bei Enter wird der Exit durchlaufen, der Wert berechnet und die Maske wird mit dem neuen Wert angezeigt
- Bei Sichern wird der Exit durchlaufen, der Wert berechnet, gespeichert und die Maske verlassen

Soweit klar?
donny

Beitrag von Kelly (ForumUser / 25 / 0 / 0 ) »
Hallo,

das witzige ist, dass ohne "show_data_again" ein ganz anderer Wert kommt.
Ich habe eben meine Testpersonalnummer ausgewählt und bin in den IT8 gegangen.
Dort stand bei der Lohnart 1308 der Betrag 60 Euro. Soweit sogut. Den habe ich in '50' geändert und 'enter' gedrückt.
"show_data_again" gleich = 'X'. - Nach Durchlauf standen auch die 50 Euro drin.

Dann drücke ich speichern, "show_data_again" = space.
Nach Durchlauf hatte ich plötzlich einen ganz anderen Wert drin stehen.
302,14 Euro.
Komisch.
Kannst du mir das erklären??


Ich brauche das "show_data_again", da, nachdem ich 'speichern' gedrück habe, der IT nicht verlassen wird.

Hm.


:( :?

Beitrag von donny (Specialist / 253 / 0 / 2 ) »
Na das hört sich ja alles sehr seltsam an....

Kannst du mal das Coding posten?

Gruß
donny

Beitrag von Kelly (ForumUser / 25 / 0 / 0 ) »
Na klar! 8)


Code: Alles auswählen.

  WHEN '0008'.

    CALL METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn
      EXPORTING
        prelp = innnn
      IMPORTING
        pnnnn = i0008.

*   Statistische Lohnarten (welche nicht in die Gesamtsumme P0008 einlaufen)
    SELECT lgart FROM t511 APPENDING TABLE gt_lgart_nosum
                 WHERE molga EQ '01'
                   AND begda LE sy-datum
                   AND endda GE sy-datum
                   AND adsum EQ space.

    CLEAR: inttab.
    REFRESH: inttab.

    CALL FUNCTION 'RP_FILL_WAGE_TYPE_TABLE'
      EXPORTING
        pernr                        = i0008-pernr
        begda                        = sy-datum
        endda                        = sy-datum
        infty                        = '0008'
        subty                        = space
      TABLES
        ppbwla                       = inttab
      EXCEPTIONS
        error_at_indirect_evaluation = 1.

    CLEAR i0008-ansal.

*   Nur Lohnarten, die in die Gesamtsumme einfließen
    LOOP AT inttab.
      READ TABLE gt_lgart_nosum WITH KEY = inttab-lgart.
      IF sy-subrc EQ 0.
        EXIT.
      ENDIF.

      DO 40 TIMES
         VARYING gs_loh-lga FROM i0008-lga01 NEXT i0008-lga02
         VARYING gs_loh-bet FROM i0008-bet01 NEXT i0008-bet02.

        IF gs_loh-lga = inttab-lgart.
          IF gs_loh-bet = space OR gs_loh-bet = inttab-betrg.
            ADD inttab-betrg TO i0008-ansal.
          ELSE.
            ADD gs_loh-bet TO i0008-ansal.
          ENDIF.
          EXIT.
        ENDIF.
      ENDDO.
    ENDLOOP.


*   Eintritt ermitteln
    SELECT SINGLE * FROM pa0041 INTO p0041
              WHERE pernr = i0008-pernr
              AND   begda LE sy-datum
              AND   endda GE sy-datum.

    DO 12 TIMES
       VARYING gs_dat-dar FROM p0041-dar01 NEXT p0041-dar02
       VARYING gs_dat-dat FROM p0041-dat01 NEXT p0041-dat02.
      IF gs_dat-dar = '02'.


        CLEAR: gv_days, gv_months, gv_years.

        CALL FUNCTION 'HRVE_GET_TIME_BETWEEN_DATES'
          EXPORTING
            beg_date       = gs_dat-dat
            end_date       = sy-datum
          IMPORTING
            days           = gv_days
            months         = gv_months
            years          = gv_years
          EXCEPTIONS
            invalid_period = 1
            OTHERS         = 2.

      ENDIF.
    ENDDO.


    gv_months = ( gv_years * 12 ) + gv_months.


    SELECT SINGLE * FROM pa0001 INTO p0001
              WHERE pernr = i0008-pernr
              AND   begda LE sy-datum
              AND   endda GE sy-datum.

    IF p0001-persg EQ '3'.
      faktor = '12'.
    ELSE.

      IF gv_months LE '999'.
        faktor = '13.27'.
      ENDIF.
      IF gv_months LE '35'.
        faktor = '13.17'.
      ENDIF.
      IF gv_months LE '023'.
        faktor = '13.07'.
      ENDIF.
      IF gv_months LE '011'.
        faktor = '12.97'.
      ENDIF.
      IF gv_months LE '005'.
        faktor = '12.72'.
      ENDIF.

    ENDIF.

    IF i0008-trfgr EQ 'AT'.
      faktor = '12'.
    ENDIF.


    i0008-ansal = i0008-ansal * faktor.


    CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp
      EXPORTING
        pnnnn = i0008
      IMPORTING
        prelp = innnn.


Beitrag von donny (Specialist / 253 / 0 / 2 ) »
Mal sehen, ob ich das alles richtig verstehe:

RP_FILL_WAGE_TYPE_TABLE besorgt den alten Stand des i0008 von der Datenbank.

Dann loopst du über diesen Stand, wenn aber die erste direkt bewertete Lohnart gefunden wird, verlässt du den loop mit EXIT. Ist das so gewollt? Wäre da ein CONTINUE nicht besser?

Alle so noch gefundenen statistischen Lohnarten (ANSUM = SPACE) werden dann aus dem am Bildschirm veränderten I0008 nach i0008-ansal addiert.

Das Ganze am Ende mit einem Faktor nach Betriebszugehörigkeit und Tarifgruppe multipliziert.

Soweit so gut, ich denke, die von dir genannte Lohnart 1308 ist so eine statistische Lohnart. Du solltest mal im Debugger prüfen, ob sie durch deine Logik korrekt durchgeht und was eigentlich am Ende bei

Code: Alles auswählen.

i0008-ansal = i0008-ansal * faktor
in den Feldern drinsteht.

Gruß
donny

PS: Da fällt mir noch ein, der RP_FILL_WAGE_TYPE_TABLE löscht die itab glaub ich nicht, das würde erklären warum das Ergebnis beim zweiten Versuch größer wird....

Beitrag von Kelly (ForumUser / 25 / 0 / 0 ) »
Hallo,

stimmt... Continue ist besser... :oops:

RP_FILL_WAGE_TYPE_TABLE füllt mir lediglich die Tabelle inttab.

I0008 wird mit der Methode gefüllt:

Code: Alles auswählen.

    CALL METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn
      EXPORTING
        prelp = innnn
      IMPORTING
        pnnnn = i0008. 
In der I0008 kann ich dann Werte mitgeben. Z.B. Ansal und das ganze wird mit der Methode zurückgegeben:

Code: Alles auswählen.

    CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp
      EXPORTING
        pnnnn = i0008
      IMPORTING
        prelp = innnn.
Das Komische hier ist auch, dass in I0008 alle Werte stimmen.
Irgendwo zieht sich SAP dann einen falschen Wert und überklatscht das Ganze.

Grüße, Kelly

Beitrag von donny (Specialist / 253 / 0 / 2 ) »
Beitrag gelöscht, ich muß nochmal drüber nachdenken....

Beitrag von donny (Specialist / 253 / 0 / 2 ) »
Hi Kelly,

hier noch ein paar Anmerkungen:

Code: Alles auswählen.

 IF gs_loh-lga = inttab-lgart.
   IF gs_loh-bet = space OR gs_loh-bet = inttab-betrg.
     ADD inttab-betrg TO i0008-ansal.
   ELSE.
     ADD gs_loh-bet TO i0008-ansal.
   ENDIF.
   EXIT.
 ENDIF.
was soll denn diese Abfrage? Wie kann das Betragsfeld = SPACE sein? Den Rest lese ich so: Wenn alter Stand gleich neuer Stand, addiere alten Stand, sonst neuen Stand? Da kannst du doch wohl besser einfach immer den neuen Stand addieren, oder?

Was soll eigentlich passieren, wenn jemand die Lohnart 1308 neu einfügt, oder aus dem Infotyp 0008 entfernt?

Übrigens: RP_FILL_WAGE_TYPE_TABLE gibt in PPBWLA (inttab) auch das Kennzeichen ADSUM zurück... da könntest du dir die Verarbeitung der T511 sparen. Macht das ganze übersichtlicher und schneller! Und wenn du dem FB den neuen I0008 als Parameter übergibts, liest er die Daten IMO nicht von der Datenbank, sondern bringt dir in inttab die neuen Daten zurück, dann kannst du dir auch das mühsame Durchsuchen des I0008 ersparen und brauchst nur noch mit der inttab zu arbeiten.

Ich hoffe, das waren nicht zu viele Umbauvorschläge. Aber danach ist der Ablauf viel einfacher und Fehler sollten dann auch einfacher zu finden sein.

:) donny

Beitrag von Kelly (ForumUser / 25 / 0 / 0 ) »
donny hat geschrieben:
Da kannst du doch wohl besser einfach immer den neuen Stand addieren, oder?

Was soll eigentlich passieren, wenn jemand die Lohnart 1308 neu einfügt, oder aus dem Infotyp 0008 entfernt?

Nee. Weil in der Struktur die Felder, die nicht geändert wurden, leer sind.
(Eben habe ich schon selbst an meinem Verstand gezweifelt, aber durchs debuggen habe ich wieder den Sinn erkannt.)


Wenn eine Lohnart dazukomm bzw. eine gelöscht wird, dann wird anhand dessen auch Ansal neu ermittelt.

Beitrag von Kelly (ForumUser / 25 / 0 / 0 ) »
donny hat geschrieben: Übrigens: RP_FILL_WAGE_TYPE_TABLE gibt in PPBWLA (inttab) auch das Kennzeichen ADSUM zurück... da könntest du dir die Verarbeitung der T511 sparen. Macht das ganze übersichtlicher und schneller! Und wenn du dem FB den neuen I0008 als Parameter übergibts, liest er die Daten IMO nicht von der Datenbank, sondern bringt dir in inttab die neuen Daten zurück, dann kannst du dir auch das mühsame Durchsuchen des I0008 ersparen und brauchst nur noch mit der inttab zu arbeiten.
Ist ja cool! 8)
Danke für den Tipp!

Grüße,
Kelly

Seite 1 von 1

Vergleichbare Themen

0
Antw.
1036
Views
Erweiterung PBAS0001 - Jahresgehalt im ITooo8
von Kelly » 19.09.2007 13:37 • Verfasst in Human Resources
3
Antw.
304
Views
Erweiterung
von BecomingAnAbapGuru » 10.02.2022 19:43 • Verfasst in ABAP® für Anfänger
11
Antw.
6124
Views
Erweiterung Stücklistenbrowser
von Somani » 08.10.2013 14:14 • Verfasst in ABAP® Core
4
Antw.
5639
Views
Erweiterung IDOC_OUTBOUND_DELVRY
von bapimueller » 28.08.2018 16:18 • Verfasst in Sales and Distribution
0
Antw.
1482
Views
BSP erweiterung löschen
von SaskuAc » 24.07.2018 09:35 • Verfasst in Web-Dynpro, BSP + BHTML

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.