HR Arbeitszeiterfassung Thema ist als GELÖST markiert

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
15 Beiträge Seite 1 von 1
15 Beiträge Seite 1 von 1

HR Arbeitszeiterfassung

Beitrag von JohnLocklay (Specialist / 170 / 28 / 2 ) » 2. Okt 2017 09:58

Guten Morgen.

Ich suche schon ne weile aber werde nicht fündig. Kennt jemand ne SAP
Tabelle wo man Arbeitszeiten zu einer PERNR auslesen kann?
Suche eigentlich so das ganze Schema. Arbeitszeit, Urlaubstage, Krankheitsstand usw.

Danke für euer Feedback

Grüße
Code once - Think twice


Re: HR Arbeitszeiterfassung

Beitrag von wreichelt (Expert / 751 / 18 / 132 ) » 2. Okt 2017 10:59

Hallo,

die Arbeitszeiten stehen in der TB: TEVEN bzw PT.
Die Zeitereignisse lassen sich mit RP-imp-c2-b2 (Macro aus der der TB: RMAC) lesen.
Der Aufruf ist aber ein wenig kompliziert.

Gruß
Wolfgang

Re: HR Arbeitszeiterfassung

Beitrag von DeathAndPain (Top Expert / 1237 / 137 / 283 ) » 4. Okt 2017 12:58

Je nach Art der Umsetzung lassen sich solche Daten (insbesondere Urlaub, Krankheit usw.) auch im Infotyp 2001, also in der Tabelle PA2001, finden.

Re: HR Arbeitszeiterfassung

Beitrag von SaskuAc (Specialist / 314 / 35 / 43 ) » 6. Okt 2017 12:29

Hi,

Arbeitszeiten ist ein wenig grob gefasst.
Zeitereignisse ( z. B. Stempelzeiten ) werden in der Teven gespeichert oder im Infotyp 2011.
Die sollzeit, die ein Mitarbeiter arbeitet dann widerum im Infotyp 0007.

Schau einfach mal in die Transaktion PA20, dort sind alle Mitarbeiterdaten und dementsprechende Infotypen.

Infotypen liest du aus, indem du die logische Datenbank PNP oder PNPCE einstellst, und am Anfang des Reports den Befehl "Infotypes: 0001, 0002, ... " <-- hier müssen die benötigten Infotypen hin

und dann nach "Get pernr" werden die Infotypen automatisch befüllt wie man sie braucht.
falls man dann noch nach der gültigkeit eines bestimmten datums oder dergleichen sucht nutz das SAP-Makro rp-provide-from-last

Code: Alles auswählen.

rp-provide-from-last p0000 space pnpbegda pnpendda " p0000 ist die interne Tabelle für den Infotyp 0000 space der subtyp pnpbegda und pnpendda das selektierte Datum 

Re: HR Arbeitszeiterfassung

Beitrag von ratsnus (Specialist / 352 / 2 / 53 ) » 6. Okt 2017 13:26

servus auch,

jeden HR Infotypen kann man mit HR_READ_INFOTYPE
Setmpelzeiten TEVEN HR_EVENT_READ
An und Abwesenheiten BAPI_EMPATTABS_GETLIST
Feiertagskalender HOLIDAY_GET
Tagesname RH_GET_DATE_DAYNAME
Datums differenzen FIMA_DAYS_AND_MONTHS_AND_YEARS
ende Monate ermitteln FIMA_END_OF_MONTH_DETERMINE

die haben mir geholfen im HR Umfeld.
<:: XING-Gruppe Tricktresor::>

Re: HR Arbeitszeiterfassung

Beitrag von JohnLocklay (Specialist / 170 / 28 / 2 ) » 6. Okt 2017 16:48

Vielen Dank für die vielen Antworten.

Ich werde diese vielen Vorschläge alle mal testen und später hier nochmal Posten
wenn ich valide Ergebnisse bekommen habe!

Thx.

John
Code once - Think twice

Re: HR Arbeitszeiterfassung

Beitrag von ArjenR (ForumUser / 9 / 7 / 0 ) » 10. Jan 2020 10:04

Ich hab ein ähnliches Anliegen. Ich schreibe an einem Report, der mir die Abwesenheiten der MA ausgibt. Die Infos hole ich mir aus dem Infotypen 2001.

Die Ausgabe soll monatlich sein, es funktioniert auch ganz gut, problematisch wird es nur, wenn beispielsweise ein Urlaub erst im nächsten Monat endet, da mir die kompletten Abwesenheitstage in dem Monat wo die Abwesenheit startet ausgegeben wird. Der nächste Monat wird dabei komplett ignoriert. Ich hab ein Beginn-Datum und ein Ende-Datum für den jeweiligen Monat.

Beispiel: MA hat Urlaub vom 15.01.2020 - 15.02.2020

Ausgabe: Januar 22 Urlaubstage Februar 0 Urlaubstage.

Hat vielleicht jemand einen Ansatz wie ich das in ABAP umsetzen kann? Vielen Dank und ein schönes Wochenende gewünscht.

Re: HR Arbeitszeiterfassung

Beitrag von DeathAndPain (Top Expert / 1237 / 137 / 283 ) » 10. Jan 2020 11:47

Serh hilfreich wäre es gewesen, wenn Du Deinen (nicht funktionierenden) Code zum besten gegeben hättest (bitte stets vollständig mit allen Felddeklarationen), damit wir sehen können, was Du da machst und woran es hapert.

Ansonsten ist das eine Frage dessen, was Du brauchst. Willst Du die Kalendertage, die innerhalb des Urlaubs liegen, oder nur diejenigen Tage, die tatsächlich vom Urlaubskontingent abzutragen sind, also die Arbeitstage des Mitarbeiters?

An dieser Frage orientiert sich das gesamte Programmdesign, so dass das zuerst beantwortet werden muss. Aber wenn wir Dein derzeitiges Programm sähen, könnten wir vielleicht schon was dazu sagen.

Re: HR Arbeitszeiterfassung

Beitrag von ArjenR (ForumUser / 9 / 7 / 0 ) » 10. Jan 2020 15:05

DeathAndPain hat geschrieben:
10. Jan 2020 11:47
Serh hilfreich wäre es gewesen, wenn Du Deinen (nicht funktionierenden) Code zum besten gegeben hättest (bitte stets vollständig mit allen Felddeklarationen), damit wir sehen können, was Du da machst und woran es hapert.

Ansonsten ist das eine Frage dessen, was Du brauchst. Willst Du die Kalendertage, die innerhalb des Urlaubs liegen, oder nur diejenigen Tage, die tatsächlich vom Urlaubskontingent abzutragen sind, also die Arbeitstage des Mitarbeiters?

An dieser Frage orientiert sich das gesamte Programmdesign, so dass das zuerst beantwortet werden muss. Aber wenn wir Dein derzeitiges Programm sähen, könnten wir vielleicht schon was dazu sagen.
Ich möchte die Tatsächlichen Urlaubstage (welche abgetragen werden) ausgegeben haben. Der Infotyp 2001 zeigt mir die Tage ja auch super an, das Problem ist nur wenn ich eine Abfrage für Januar durchführe, gibt er mir die kompletten 22 Urlaubstage aus und für Februar 0 Tage. Ziel ist das die Ausgabe im Januar 12 Tage und im Februar 10 Tage sind. Hier mal der Code nur auf Januar & Februar bezogen.

Code: Alles auswählen.

infotypes: 2001.
data: begin of itab occurs 100,
tage_jan like p2001-tage,
tage_feb like p2001-tage,
...
end of itab.
start-of-selection.
get pernr.
provide * from p2001 between '20200101' and '20200131'.
move-corresponding p2001 to itab.
itab-tage_jan = p2001-tage.
collect itab.
clear itab.
endprovide.
provide * from p2001 between '20200102' and '20200228'.
move-corresponding p2001 to itab.
itab-tage_feb = p2001-tage.
collect itab.
clear itab.
endprovide.
end-of-selection.
loop at itab.
write:/ itab-tage_jan, itab-tage_feb.
endloop.

Re: HR Arbeitszeiterfassung

Beitrag von DeathAndPain (Top Expert / 1237 / 137 / 283 ) » 10. Jan 2020 19:09

Um Himmels willen, mit welchem Release arbeitest Du? 3.0?

Dein Programmierstil ist so antik, dass schon seit 10 Jahren keiner mehr so programmieren sollte. Logische Datenbanken, PROVIDE usw. sind mega-out. Auch der OCCURS-Zusatz bei DATA gilt seit sicherlich 10 Jahren als veraltet.

Der COLLECT summiert über den Schlüssel Deiner internen Tabelle auf. Deine interne Tabelle hat aber überhaupt keinen Schlüssel, sondern nur Integerwerte. Mir ist auch nicht klar, wozu Du überhaupt eine interne Tabelle und nicht einfach nur eine Feldleiste (Struktur) brauchst, denn Du willst ja nur einen Wert pro Monat und hast für jeden Monat eine Spalte. Obendrein gibt es das Feld TAGE im Infotyp 2001 überhaupt nicht (Du meinst wahrscheinlich ABRTG). Das ist alles sehr obskur.

Warum machste nicht einfach Folgendes:

Code: Alles auswählen.

REPORT ZTEST6.

DATA: BEGIN OF ERGEBNIS,
ABRTG_JAN LIKE P2001-ABRTG,
ABRTG_FEB LIKE P2001-ABRTG,
END OF ERGEBNIS.

PARAMETERS: PERNR TYPE PERSNO,
            JAHR(4) TYPE C DEFAULT '2020'.

START-OF-SELECTION.

SELECT SUM( ABRTG ) INTO ERGEBNIS-ABRTG_JAN FROM PA2001
 WHERE PERNR = PERNR
   AND SPRPS = SPACE
   AND ENDDA >= '20200101'
   AND BEGDA <= '20200131'.

SELECT SUM( ABRTG ) INTO ERGEBNIS-ABRTG_FEB FROM PA2001
 WHERE PERNR = PERNR
   AND SPRPS = SPACE
   AND ENDDA >= '20200201'
   AND BEGDA <= '20200229'.
Noch performanter wäre es, nur einen SELECT aller Abwesenheiten über das gesamte Jahr zu machen und dann mit Operationen auf der internen Tabelle die einzelnen Monate herauszuziehen. Aber schon so biste nicht nur lesbarer, sondern auch deutlich schneller als über die veraltete Logische Datenbank.

Re: HR Arbeitszeiterfassung

Beitrag von ArjenR (ForumUser / 9 / 7 / 0 ) » 11. Jan 2020 04:09

Hallo,

na im Endeffekt möchte ich ja alle möglichen Abwesenheiten aller MA ausgegeben haben, dass mit Urlaub war nur ein Beispiel um zu verdeutlichen was ich überhaupt erreichen möchte. Mit dem Feld Tage hast Du natürlich recht, hab den Code nicht kopiert und wusste die genaue Bezeichnung nicht mehr aus dem Kopf.

PS: ich bin erst seit sehr kurzer Zeit in der SAP Welt unterwegs, lese relativ viel im Internet und Büchern nach ;-). Ich danke Dir auf jeden Fall für Deine Antwort.

Re: HR Arbeitszeiterfassung

Beitrag von ArjenR (ForumUser / 9 / 7 / 0 ) » 13. Jan 2020 13:25

DeathAndPain hat geschrieben:
10. Jan 2020 19:09

Warum machste nicht einfach Folgendes:

Code: Alles auswählen.

REPORT ZTEST6.

DATA: BEGIN OF ERGEBNIS,
ABRTG_JAN LIKE P2001-ABRTG,
ABRTG_FEB LIKE P2001-ABRTG,
END OF ERGEBNIS.

PARAMETERS: PERNR TYPE PERSNO,
            JAHR(4) TYPE C DEFAULT '2020'.

START-OF-SELECTION.

SELECT SUM( ABRTG ) INTO ERGEBNIS-ABRTG_JAN FROM PA2001
 WHERE PERNR = PERNR
   AND SPRPS = SPACE
   AND ENDDA >= '20200101'
   AND BEGDA <= '20200131'.

SELECT SUM( ABRTG ) INTO ERGEBNIS-ABRTG_FEB FROM PA2001
 WHERE PERNR = PERNR
   AND SPRPS = SPACE
   AND ENDDA >= '20200201'
   AND BEGDA <= '20200229'.
Hallo,

auch bei deiner Lösung habe ich immer noch das Problem, dass die Ausgabe der Abwesenheit nicht Korrekt ist. Urlaub MA 15.01.2020 - 15.02.2020 --> Ausgabe Abwesenheit jeweils 22 Tage im Januar und im Februar.

Re: HR Arbeitszeiterfassung

Beitrag von Legxis (Specialist / 152 / 78 / 27 ) » 15. Jan 2020 11:45

Macht ja auch Sinn. Eine Abwesenheit kann auch über zwei oder mehr Monate andauern, aber dies wird nur als EIN Datensatz angelegt. ABRTG (Abrechnungstage) sind alle anzurechnenden Abwesenheitstage, EGAL IN WELCHEM MONAT.

Beispiel:
Abwesenheit vom 27.04.2020 - 08.05.2020. Im 5-Tage-Woche Prinzip sind das 10 Wochentage. Der erste Mai ist ein Feiertag, also macht das 9 Abrechnungstage.

Jetzt hast du deinen April-Selekt:

Code: Alles auswählen.

WHERE BEGDA <= '20200430'
  AND ENDDA >= '20200401'
Der findet den Datensatz und liest von dort 9 Abrechnungstage.

Dann hast du deinen Mai-Selekt:

Code: Alles auswählen.

WHERE BEGDA <= '20200531'
  AND ENDDA >= '20200501'
Der findet denselben Datensatz und liest 9 Abrechnungstage.

Du müsstest eigentlich selber herausfinden, wie viele der Tage in welchem Monat sind.

Folgende Benutzer bedankten sich beim Autor Legxis für den Beitrag:
ArjenR (17. Jan 2020 10:03)

( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )

Re: HR Arbeitszeiterfassung

Beitrag von ArjenR (ForumUser / 9 / 7 / 0 ) » 15. Jan 2020 12:31

Legxis hat geschrieben:
15. Jan 2020 11:45
Macht ja auch Sinn. Eine Abwesenheit kann auch über zwei oder mehr Monate andauern, aber dies wird nur als EIN Datensatz angelegt. ABRTG (Abrechnungstage) sind alle anzurechnenden Abwesenheitstage, EGAL IN WELCHEM MONAT.
Ja genau soweit kann ich das jetzt auch nachvollziehen. Leider hab ich immer noch keine Lösung für die monatliche Ausgabe.

Re: HR Arbeitszeiterfassung

Beitrag von DeathAndPain (Top Expert / 1237 / 137 / 283 ) » 16. Jan 2020 08:49

Wenn Du das ordentlich machen möchtest, musst Du ergänzend den Arbeitszeitplan des Mitarbeiters heranziehen, der sich aus dem im Infotyp 7 eingetragenen Arbeitszeitmodell ergibt (kann ja sein, dass er auch samstags oder sogar sonntags arbeiten muss oder in einem Land mit anderen Feiertagen arbeitet oder was auch immer). Lies erst die Abwesenheit mit dem SELECT; dann hast Du BEGDA und ENDDA der ganzen Abwesenheit wie von Lexgsi beschrieben. Dann musst Du für jeden Monat den auf den Monat entfallenden Teil davon bestimmen. Um bei Lexgis' Beispiel zu bleiben, hättest Du im April den Zeitraum 27.04.-30.04. und im Mai den Zeitraum 01.05.-08.05.

Nun rufst Du den Funktionsbaustein HR_PERSONAL_WORK_SCHEDULE auf, beispielsweise für April:

Code: Alles auswählen.

DATA: PERWS TYPE STANDARD TABLE OF PTPSP. " Arbeitszeitkalender

CALL FUNCTION 'HR_PERSONAL_WORK_SCHEDULE'
  EXPORTING
    PERNR         = PERNR
    BEGDA         = '20200427'
    ENDDA         = '20200430'
    WORKING_HOURS = SPACE
  TABLES
    PERWS         = PERWS.
Dann hast Du in der internen Tabelle PERWS alle Tage zwischen dem 27.04. und dem 30.04.2020 stehen, und zwar für jeden einzelnen Tag mit der Information, ob er für den Mitarbeiter PERNR ein Arbeitstag oder ein arbeitsfreier Tag (oder Feiertag) gewesen ist. Dann musst Du nur noch alle Arbeitstage zusammenzählen und hast das Ergebnis.

Den kompletten Code dafür werde ich hier jetzt aber nicht niederschreiben. Dein Programm musst Du schon selber schreiben. 😉 Aber der Knackpunkt ist der, dass Du jeden einzelnen Tag der Abwesenheit in einer Schleife durchgehen und betrachten musst.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
Legxis (16. Jan 2020 16:17) • ArjenR (17. Jan 2020 10:03)


Seite 1 von 1

Aktuelle Forenbeiträge

Speicherkapazität für Datentyp
vor 4 Stunden von L0w-RiDer 6 / 106
Private Attribut Aufrufen
vor 5 Stunden von black_adept 8 / 130
Beim Buchen-Button eine Fehlermeldung einbauen (MIGO)
vor 6 Stunden von M@atze! 40 / 708
ASCII/BIN Art aus JPEG
vor 9 Stunden von edwin 9 / 188

Unbeantwortete Forenbeiträge

Auspacken von Handling Units im Transport
vor 2 Tagen von Bastian.Reitz 1 / 36
Funktionsbaustein MD_PEGGING_NODIALOG
vor 6 Tagen von christof 1 / 39
IDOC ist nicht angekommen
vor einer Woche von cuncon 1 / 64
Auftrag Vorgängerbeziehung entfernen
vor einer Woche von ichse18577 1 / 44