Wieviel ganze Jahre zwischen zwei Datumsangaben?

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
32 Beiträge • Vorherige Seite 2 von 3 (current) Nächste
32 Beiträge Vorherige Seite 2 von 3 (current) Nächste

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von ralf.wenzel (Top Expert / 3838 / 190 / 269 ) »
msfox hat geschrieben:
25.09.2024 20:55
Ja, Copy&Paste -Fehler. Hab's angepasst.
Hab gefunden wo man eine OSS-Meldung bei der SAP öffnet und auch für die Methode cl_reca_date=>get_date_diff() eine erstellt.
Sehr gut!
msfox hat geschrieben:
25.09.2024 20:55
Aber ist das wirklich ein Fehler?
Wenn ich z.B. vom 01.01. - 31.12. nehmen würde, da ist das ja 1 Jahr.
Der Fuba FIMA_DAYS_AND_MONTHS_AND_YEARS liefert das hingegen nicht.
Das wäre auch falsch, weil darin der 31.12. nicht enthalten. Du musst dir die Zeit 00:00 Uhr dazudenken, dann wird dir das klar.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

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


Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von black_adept (Top Expert / 4019 / 113 / 913 ) »
msfox hat geschrieben:
25.09.2024 20:07
OT: Bei uns ist immer noch wichtig, wie der Kunde ein Jahr definiert - hauptsächlich bei der Abrechnung von Beträgen. Taggenau 360, wenn jeder Monat mit 30 Tagen definiert und Jahresbeträge somit gleichmäßig auf Monate aufgeteilt werden sollen. Oder taggenau365.
Und in Schaltjahren Taggenau 366? Und was ist mit Schaltsekunden?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von msfox (Specialist / 342 / 55 / 69 ) »
ralf.wenzel hat geschrieben:
25.09.2024 21:08
Das wäre auch falsch, weil darin der 31.12. nicht enthalten. Du musst dir die Zeit 00:00 Uhr dazudenken, dann wird dir das klar.
Real wäre es aber nicht falsch. Wenn man sagt, vom 01.01. - 31.12., dann ist das für mich 1 Jahr.
Kommt drauf an, wie man es definiert. Wenn man zum Beispiel einfach mit mit Datumswerten rechnet, wo Beginn- = Endedatum, da ist das bei der SAP = 0, da keine Uhrzeit bekannt.
also 02.01.2023 - 02.01.2023 = 0.
Wir brauchen das aber als 1, weil dann ein Tag abgerechnet werden muss.
...und so zieht sich das bis auf 1 Jahr, wo der 31.12. eben noch mit dazu zählt oder nicht.
Und in Schaltjahren Taggenau 366? Und was ist mit Schaltsekunden?
Taggenau365 bezieht das Schaltjahr mit 366Tagen mit ein. Dann wird der Jahresbetrag eben durch 366 geteilt. Sekundengenaue Abrechnung gibt es nicht.

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von ralf.wenzel (Top Expert / 3838 / 190 / 269 ) »
msfox hat geschrieben:
26.09.2024 08:00
Real wäre es aber nicht falsch. Wenn man sagt, vom 01.01. - 31.12., dann ist das für mich 1 Jahr.
Weil du denkst "01.01. morgens bis 31.12. abends". Das kannst du aber ohne die Angabe der Uhrzeit nicht machen. 01.01.-31.12. setzt voraus, dass an beiden Tagen dieselbe Uhrzeit zum Messen genommen wird und der 31.12. ist eben noch nicht "abgelaufen", darum ist das Jahr noch nicht voll.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von msfox (Specialist / 342 / 55 / 69 ) »
Ok, danke für die Argumentation. Ich vermute ja, dass die SAP das nicht als Fehler betrachten will. Mit einem Beispiel habe ich vielleicht was Überzeugendes.

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von msfox (Specialist / 342 / 55 / 69 ) »
Erste Antwort der SAP "Kann es sein, dass hier ein Auffassungsunterschied vorliegt?...Aktuell kann ich daher keinen Fehler feststellen."
Ich habe das Argument mit der Uhrzeit geantwortet.

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von ralf.wenzel (Top Expert / 3838 / 190 / 269 ) »
Hast du jetzt dein Beispiel mit dem 1.1. und 31.12. gebracht? Ich hab doch gesagt, dass das richtig ist, dass das kein volles Jahr ist.

Der Fehler in der Klasse wurde doch hier beschrieben:
black_adept hat geschrieben:
25.09.2024 15:04
Mach das ganze bitte mal für die Datümer 2.10.2022 und 1.10.2023 und staune.
DAS ist nicht zu erklären. Weil das in jedem Falle kein volles Jahr ist.


Gruß

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von msfox (Specialist / 342 / 55 / 69 ) »
Nein, ich habe das Beispiel mit 2.10.2022 und 1.10.2023 gebracht. Die SAP meinte dazu, das sein kein Fehler. Im Grund ist es nicht ausreichend, nur den Fehler in der Methode zu betrachten. Ich soll einen konkreten Fehler in der SAP-Anwendung nennen. Die Methode wird seit 15 Jahren im Bereich der Fälligkeitsverschiebung im RE-FX eingesetzt. Ich müsste also einen Fehler im RE-FX nachweisen...
Letztlich sind das ja auch keine freigegeben Klassen von der SAP - so wie z.B. BAPI-Fuba. Die Methode wurde für eine spezielle Anwendung entwickelt und tut dort das was sie soll. Wenn man die Methode in einer anderen Anwendung mit einer anderen Erwartung einsetzt, passt das natürlich nicht.

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von black_adept (Top Expert / 4019 / 113 / 913 ) »
@Ralf: Bei der Antwort von SAP solltest du dir deine Methode einfach selber schreiben. Das ist ja kein Hexenwerk zumal du ja irgendwo geschrieben hattest, dass du nur den Spezialfall "Monatserste" betrachen musst. Irgendwie sollte das doch à la

Monatsdiff = (Jahr2 - Jahr1) * 12 + ( Monat 2 - Monat1 ) >= 12 gehen.

Und wenn du dir das Coding der SAP-Methode anschaust wirst du mit dem obigen Einzeiler auch von der Laufzeit her deutlich besser fahren.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von black_adept (Top Expert / 4019 / 113 / 913 ) »
msfox hat geschrieben:
27.09.2024 09:36
Nein, ich habe das Beispiel mit 2.10.2022 und 1.10.2023 gebracht. Die SAP meinte dazu, das sein kein Fehler. Im Grund ist es nicht ausreichend, nur den Fehler in der Methode zu betrachten. Ich soll einen konkreten Fehler in der SAP-Anwendung nennen. Die Methode wird seit 15 Jahren im Bereich der Fälligkeitsverschiebung im RE-FX eingesetzt. Ich müsste also einen Fehler im RE-FX nachweisen...
Genau diese Art Antworten gebe ich auch meinen Kunden wenn ich gerade mal keine Lust habe etwas zu debuggen oder zu korrigieren.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von DeathAndPain (Top Expert / 1859 / 234 / 403 ) »
Also um nochmal zur Ausgangsfrage dieses Threads zu kommen: Ich habe es mir weitgehend abgewöhnt, für Fragestellungen wie diese Methoden oder Funktionsbausteine der SAP zu suchen. Die Zeit, die ich brauche, um
  • die gewünschte Routine zu finden
  • mir sicher zu sein, dass ich ihre Parametrisierung verstanden habe und
  • mir sicher zu sein, dass sie tatsächlich genau das tut, was ich von ihr erwarte (also nicht so wie Ralf das gemacht hat 😜)
ist so lang, dass ich in der Zeit eine passende Routine längst selbst geschrieben habe (wobei die dann in aller Regel tatsächlich in eine DDIC-Klasse für zukünftige Verwendungen wandert).

Vor allem aber: Die Implementierungen, die die SAP für derartige Fragestellungen bietet, sind alle so inkompetent sperrig und aufgeblasen, dass es kaum zu beschreiben ist. Allein wenn es um die Fragestellung geht, zu einem bestimmten Monat (oder Datum, das in einem Monat liegt) den Monatsletzten zu bestimmen, gibt es 1000 Funktionsbausteine, wie wir alle wissen. Jedes Mal hat also ein anderer Mensch von der SAP das Rad von vorne erfunden, und eine Implementierung ist umständlicher als die andere. Das tut echt in den Augen weh, wenn man sich diese Implementierungen anschaut.

Dabei gibt es für solche Datumsfragen fast immer extrem kurze und elegante (und damit in aller Regel auch performante) Lösungen. Um es anhand von Ralfs Fragestellung zu zeigen: So sähe meine Methode dafür aus (die ich hier mal als lokale Klasse programmiert habe):

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  ZTST
*&---------------------------------------------------------------------*
REPORT ztst.

CLASS lc DEFINITION ABSTRACT FINAL.
  PUBLIC SECTION.
  CLASS-METHODS full_years_between_dates IMPORTING date1 TYPE d
                                                   date2 TYPE d
                                         RETURNING VALUE(years) TYPE i.
ENDCLASS.

CLASS lc IMPLEMENTATION.
  METHOD full_years_between_dates.
    years = date2(4) - date1(4) - COND #( WHEN date2+4 < date1+4 THEN 1 ).
  ENDMETHOD.

ENDCLASS.

PARAMETERS: date1 TYPE d, date2 TYPE d.

START-OF-SELECTION.

DATA(years) = lc=>full_years_between_dates( date1 = date1
                                            date2 = date2 ).

WRITE years.
Die tatsächliche Methode ist ein Einzeiler! Und dafür lohnt es sich jetzt, im Fundus der SAP-Routinen nach etwas zu suchen, was hoffentlich funktioniert?

Wenn ich es selber geschrieben habe, dann weiß ich, was ich gemacht habe. Und während ein Test immer sinnvoll ist, kann ich bei solch Einzeiler in aller Regel auch so schon mit recht sicherer Stimme sagen, dass das funktioniert.

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von ralf.wenzel (Top Expert / 3838 / 190 / 269 ) »
Naja, ich bin von der Einstellung beseelt, dass man ein Problem nur einmal löst. Das treibt mich dazu, eine schon vorhandene Problemlösung zu verwenden. Das ist eine Grundeinstellung.

Womit ich nicht gerechnet habe, ist, dass die SAP eine Lösung für eine Nische anbietet, ohne dass der Name das verrät.

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von DeathAndPain (Top Expert / 1859 / 234 / 403 ) »
black_adept hat geschrieben:
27.09.2024 10:23
msfox hat geschrieben:
27.09.2024 09:36
Nein, ich habe das Beispiel mit 2.10.2022 und 1.10.2023 gebracht. Die SAP meinte dazu, das sein kein Fehler. Im Grund ist es nicht ausreichend, nur den Fehler in der Methode zu betrachten. Ich soll einen konkreten Fehler in der SAP-Anwendung nennen. Die Methode wird seit 15 Jahren im Bereich der Fälligkeitsverschiebung im RE-FX eingesetzt. Ich müsste also einen Fehler im RE-FX nachweisen...
Genau diese Art Antworten gebe ich auch meinen Kunden wenn ich gerade mal keine Lust habe etwas zu debuggen oder zu korrigieren.
Und dennoch hat die SAP recht, denn diese Methode oder gar die ganze Klasse ist vermutlich nicht für die freie Verwendung in eigenen Programmen freigegeben (das sind die wenigsten), sondern eben nur Bestandteil von RE-FX. Insofern ist es nicht ausreichend, eine Klasse oder Methode zu suchen, deren Klassen- und Methodennamen eine bestimmte Funktionalität suggerieren und dann davon auszugehen und den Anspruch zu erheben, dass diese Funktionalität gegeben sein muss. Möglicherweise ist es in RE-FX ja tatsächlich so, dass in den Fällen, in denen diese Methode benutzt wird, ein solche Kombination von Datümern nicht eintreten kann.

Ein Grund mehr, sich solche Datumsfunktionalitäten selber zu programmieren. Dann weiß man, was man gemacht hat.

Ich glaube, hatte es irgendwann vor langer Zeit in einem früheren Thread schon mal geschrieben, aber hier ist eine gute Gelegenheit, die Anekdote zu wiederholen: Es gibt einen (undokumentierten) Funktionsbaustein RHXPROVIDE_PERIODS. Der gehört zwar zum HR-Modul, kann in meinen Augen aber in allen Modulen (und damit auch für euch) nützlich sein. Man übergibt dem Funktionsbaustein eine Tabelle von Zeiträumen (also Datumspaare Vondatum,Bisdatum), und der Baustein beseitigt alle Überlappungen und liefert die Tabelle dahingehend bereinigt zurück, dass sie nur noch Zeiträume enthält, in denen sich nichts ändert (in denen also keiner der ursprünglichen Zeiträume begonnen oder geendet ist). Das kann insofern nützlich sein, als man ein Objekt (Personalnummer, Material, was weiß ich) haben kann, dessen Eigenschaften zeitraumsbehaftet sind. In der einen Tabelle steht die eine Eigenschaft und in anderen die andere Eigenschaft. Jede Tabelle enthält ihr eigenes Beginn- und Endedatum. Beispielsweise könnte das Objekt im einen Zeitraum der einen Kostenstelle zugeordnet sein und im nächsten der anderen. Aber die Tabelle CSKS der Kostenstellen ist selber zeitraumsbehaftet: während das Objekt zu der Kostenstelle gehört, kann die Kostenstelle selbst (und damit ihre Bezeichnung etc.) sich ändern!

Dann kann das sehr unübersichtlich werden, wenn man für einen Zeitraum alle Eigenschaften des Objektes ausgeben möchte, weil man dann über alle Tabellen schauen müsste, wo ein Gültigkeitszeitraum endet und der nächste beginnt. Hier ist dieser Funktionsbaustein sehr nützlich, denn wenn man alle vorkommenden Zeiträume da durchgejagt hat, dann weiß man genau, zu welchen Zeitpunkten sich überhaupt was geändert haben kann. Man kann dann also z.B. alle Tabellen zum Beginndatum des Zeitraums lesen und als Wert für den gesamten Zeitraum ausgeben!

Und nun zu dem, worauf ich eigentlich hinauswollte: Ich habe den Quellcode dieses Funktionsbausteins mal analysiert und bin auf etwas gestoßen, was ich schon als Programmierfehler werte, obgleich es nicht zu falschen Ergebnissen führt. Und zwar wurde an einer entscheidenden Stelle tief in einer Verschachtelung von LOOPs ein in meinen Augen dringend angezeigter EXIT-Befehl "vergessen" mit der Konsequenz, dass der Funktionsbaustein unzählige unnötige Schleifendurchläufe macht (was sich durch die Schachtelung der LOOPs potenziert) und dadurch nach meinen Messungen fünfmal so lange läuft wie mit dem EXIT-Befehl (bei gleicher Ergebnistabelle)! Ich habe die Gelegenheit genutzt, aus dem Baustein eine DDIC-Klasse zu machen, die sich insofern komfortabler aufruft und zugleich drastisch schneller läuft. Dabei ist der Funktionsbaustein eigentlich recht pfiffig programmiert; da wurde der eine oder andere Kniff benutzt, der zu einer effizienten Laufzeit führt, was mich beeindruckt hat. Um so schader, dass die Performance dann gewissermaßen auf der Zielgeraden dieserart wieder hergeschenkt wird.

Könnte man auch der SAP melden, aber ich vermute, dass die deswegen ebenfalls nicht zucken würden.

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von DeathAndPain (Top Expert / 1859 / 234 / 403 ) »
ralf.wenzel hat geschrieben:
27.09.2024 18:34
Naja, ich bin von der Einstellung beseelt, dass man ein Problem nur einmal löst. Das treibt mich dazu, eine schon vorhandene Problemlösung zu verwenden. Das ist eine Grundeinstellung.
Du machst den Fehler davon auszugehen, dass die Problemlösungen der SAP-Entwickler was taugen. 😁 Insofern ist Dein Ansatz zwar richtig, aber der Fundus der Problemlösungen sollte Dein eigener sein. Dann weißt Du, was Du daran hast (und hast hoffentlich bessere Problemlösungscodings).

Re: Wieviel ganze Jahre zwischen zwei Datumsangaben?

Beitrag von rob_abc (ForumUser / 74 / 18 / 30 ) »
Beim selbst implementieren treten halt häufig Fehler auf, sogar bei so kleinen Entwicklungen. Manchmal auch erst später, wenn andere den Code verwenden. Die Methode liefert z.B. kein korrektes Ergebnis, wenn zuerst das grössere Datum eingegeben wird.

Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag:
ralf.wenzel


Vergleichbare Themen

3
Antw.
6682
Views
Nullwert von Datumsangaben
von m.schwertle » 05.12.2007 15:28 • Verfasst in ABAP® für Anfänger
4
Antw.
8261
Views
Differenz in Jahren zwischen 2 Datumsangaben
von sap-known » 17.06.2007 17:26 • Verfasst in ABAP® für Anfänger
1
Antw.
1294
Views
Keine Sachkonten mit LOEVM älter 2 Jahre
von hai_friedrich » 22.07.2008 15:13 • Verfasst in ABAP® für Anfänger
0
Antw.
1140
Views
Veranstaltung löscht sich beim Verschieben von Datumsangaben
von F_Lee » 10.06.2008 12:47 • Verfasst in Human Resources
2
Antw.
1952
Views
Report Painter Bericht über mehrere JAhre
von vhoffe » 30.11.2006 11:14 • Verfasst in Financials

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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.