Montag, 7. November 2011

PY - Umstellung DEÜV-Schlüssel auf TS2010

Die Umstellung auf den TS2010 muss bis Dezember erfolgt sein, ansonsten werden die DEÜV-Meldungen abgewiesen. In der Minimalvariante muss lediglich der neue 5-stellige Tätigkeitsschlüssel festgelegt werden pro Personalnummer, der Rest läßt sich aus dem TS2003 bzw. IT0008 bzw. IT0016 ableiten.
SAP hat dazu den Report RPUD3SD0_TSFILL ausgeliefert. Ich verwende den nicht sondern benutze lieber die LSMW wenn die neuen 5-Steller bereits pro Personalnummer vorliegen. SAP benutzt übrigens zur Ermittlung ob Teilzeit oder nicht im Standard das Teilzeitkennzeichen in IT0007 - hier halte ich persönlich den Beschäftigungsgrad in IT0008 für besser, aber das kommt natürlich auf den konkreten Fall an.
Die LSMW ist schnell zusammengestellt, Input ist Personalnummer und neuer Tätigkeitsschlüssel, das Datum ist fix, der Rest wird abgeleitet. Das geschieht durch eine Routine auf das Feld PERNR.

Die BI-Aufzeichnung heißt COP_0020, da IT0020 zum Datum 01.11.2011 kopiert wird.
Es gibt eine globale Variable ZSKIP, mit der in einer weiteren Routine auf das Feld TTSCH geprüft wird, wenn es nicht initial ist dann wird '/' übergeben, d.h. der Wert nicht überschrieben.

* Eigene Routine
FORM UR_WERTE_FUELLEN
     USING P_IN
  CHANGING P_OUT.

  TYPES:
    ABAP_BOOL TYPE C LENGTH 1.
  DATA: ZPA0020 TYPE P0020.
  DATA: ZPA0002 LIKE PA0002.
  DATA: ZPA0016 LIKE PA0016.
  DATA: ZPA0008 LIKE PA0008.
  DATA: PA_VTFRM TYPE X_FLAG VALUE 'X'.

  DATA:
        L_BEFRISTET TYPE          ABAP_BOOL,
        L_TEILZEIT  TYPE          ABAP_BOOL,               "YCTN1532667
        L_VTFRM     TYPE          P01_D3_VTFRM.            "YCTN1532667

  DATA: G_DATUM_INDIV TYPE BEGDA VALUE '20111101'.

  CONSTANTS:
    ABAP_TRUE      TYPE ABAP_BOOL VALUE 'X',
    ABAP_FALSE     TYPE ABAP_BOOL VALUE ' ',
    ABAP_UNDEFINED TYPE ABAP_BOOL VALUE '-'.

* Daten lesen
  SELECT SINGLE * FROM PA0020 INTO
  CORRESPONDING FIELDS OF ZPA0020 WHERE PERNR = P_IN AND BEGDA
  LE G_DATUM_INDIV AND ENDDA GE G_DATUM_INDIV.
  IF SY-SUBRC NE 0.
    SKIP_RECORD.
    WRITE:/ P_IN, 'IT0020 nicht gefunden.'.
    EXIT.
  ENDIF.
  SELECT SINGLE * FROM PA0002 INTO ZPA0002 WHERE PERNR = P_IN AND BEGDA
  LE G_DATUM_INDIV AND ENDDA GE G_DATUM_INDIV.
  IF SY-SUBRC NE 0.
    SKIP_RECORD.
    WRITE:/ P_IN, 'IT0002 nicht gefunden.'.
    EXIT.
  ENDIF.
  SELECT SINGLE * FROM PA0016 INTO ZPA0016 WHERE PERNR = P_IN AND BEGDA
  LE G_DATUM_INDIV AND ENDDA GE G_DATUM_INDIV.
  IF SY-SUBRC NE 0.
    SKIP_RECORD.
    WRITE:/ P_IN, 'IT0016 nicht gefunden.'.
    EXIT.
  ENDIF.
  SELECT SINGLE * FROM PA0008 INTO ZPA0008 WHERE PERNR = P_IN AND BEGDA
  LE G_DATUM_INDIV AND ENDDA GE G_DATUM_INDIV.
  IF SY-SUBRC NE 0.
    SKIP_RECORD.
    WRITE:/ P_IN, 'IT0008 nicht gefunden.'.
    EXIT.
  ENDIF.
* Abschluss und Berufsausbildung umsetzen.
  CASE ZPA0020-AUSBG.
    WHEN 1.
      COP_0020-ABSCH = 9.
      COP_0020-ABBRF = 1.
    WHEN 2.
      COP_0020-ABSCH = 9.
      CASE ZPA0020-STBRF.
        WHEN 3.     COP_0020-ABBRF = 3.
        WHEN OTHERS. COP_0020-ABBRF = 2.
      ENDCASE.
    WHEN 3.
      COP_0020-ABSCH = 4.
      COP_0020-ABBRF = 1.
    WHEN 4.
      COP_0020-ABSCH = 4.
      CASE ZPA0020-STBRF.
        WHEN 3.      COP_0020-ABBRF = 3.
        WHEN OTHERS. COP_0020-ABBRF = 2.
      ENDCASE.
    WHEN 5.
      COP_0020-ABSCH = 4.
      COP_0020-ABBRF = 5.
    WHEN 6.
      COP_0020-ABSCH = 4.
      COP_0020-ABBRF = 5.
    WHEN 7.
      COP_0020-ABSCH = 9.
      COP_0020-ABBRF = 9.
  ENDCASE.
* keine Arbeitnehmerüberlassung
  COP_0020-ANUEB = '1'.

* bereits gefüllte Felder nicht überschreiben
  CLEAR ZSKIP.
  IF NOT ZPA0020-TTSCH IS INITIAL.
    ZSKIP = 'X'.
  ENDIF.
  IF NOT ZPA0020-ABSCH IS INITIAL.
    COP_0020-ABSCH = '/'.
  ENDIF.
  IF NOT ZPA0020-ABBRF IS INITIAL.
    COP_0020-ABBRF = '/'.
  ENDIF.
  IF NOT ZPA0020-ANUEB IS INITIAL.
    COP_0020-ANUEB = '/'.
  ENDIF.
* Vertragsform füllen
  IF ZPA0020-VTFRM IS INITIAL.
* alles ausser 01 ist befristet
    IF ZPA0016-CTTYP NE '01'.
      L_BEFRISTET = 'X'.
    ENDIF.
* wenn Beschäftigungsgrad <> 100 dann Teilzeit
    IF ZPA0008-BSGRD LT '100'.
      L_TEILZEIT = 'X'.
    ENDIF.
* möglicherweise alter Schlüssel nicht richtig
    IF L_TEILZEIT = 'X' AND NOT ( ZPA0020-STBRF = '8'
    OR ZPA0020-STBRF = '9' ).
      WRITE:/ P_IN, 'Teilzeit laut IT0008 aber Vz. laut IT0020!'.
    ENDIF.

   CASE L_TEILZEIT.                                         "YCTN1532667
      WHEN ABAP_TRUE.     " Teilzeit                                   "
        CASE L_BEFRISTET.                                              "
          WHEN ABAP_TRUE.      " befristet                             "
            L_VTFRM = 4.                                               "
          WHEN ABAP_FALSE.     " unbefristet                           "
            L_VTFRM = 2.                                               "
        ENDCASE.                                                       "
      WHEN ABAP_FALSE.    " Vollzeit                                   "
        CASE L_BEFRISTET.                                              "
          WHEN ABAP_TRUE.      " befristet                             "
            L_VTFRM = 3.                                               "
          WHEN ABAP_FALSE.     " unbefristet                           "
            L_VTFRM = 1.                                               "
        ENDCASE.                                                       "
   ENDCASE.                                                 "YCTN1532667

   IF L_VTFRM IS INITIAL.                                   "YCTN1532667
*   Vertragsform kann aus IT0008/ IT0016 nicht ermittelt werden
      CASE ZPA0020-STBRF.
        WHEN 8 OR 9. "Teilzeit
          CASE L_BEFRISTET.
            WHEN ABAP_TRUE. "befristet
              L_VTFRM = 4.
            WHEN ABAP_FALSE. "unbefristet
              L_VTFRM = 2.
            WHEN ABAP_UNDEFINED.     " nicht ermittelbar
              CLEAR L_VTFRM.
          ENDCASE.
        WHEN OTHERS. "Vollzeit
          CASE L_BEFRISTET.
            WHEN ABAP_TRUE. "befristet
              L_VTFRM = 3.
            WHEN ABAP_FALSE. "unbefristet
              L_VTFRM = 1.
            WHEN ABAP_UNDEFINED.     " nicht ermittelbar
              CLEAR L_VTFRM.
          ENDCASE.
      ENDCASE.
    ENDIF.



    IF NOT L_VTFRM IS INITIAL.
      COP_0020-VTFRM = L_VTFRM.
    ELSE.
      SKIP_RECORD.
      WRITE:/ P_IN, 'Vertragsform nicht ermittelbar.'.
    ENDIF.
  ENDIF.


  P_OUT = P_IN.



* ...

ENDFORM.                    "ur_WERTE_FUELLEN


Wenn Sie diese Routine verwenden dann nur auf eigene Gefahr!

Keine Kommentare:

Kommentar veröffentlichen