Letzter Geburtstag

Getting started ... Alles für einen gelungenen Start.
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

Letzter Geburtstag

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Hallöle,

ich habe da ein ganz profanes Problem.
Gegeben sei eine Liste (interne Tabelle) mit Namen und Geburtstagen.
Also z.B.
Hugo 21.07.
Peter 13.10
Marie 01.05.
Birgit 01.12.
usw.

Ermittelt werden soll, wer zum Stichtag xx.xx. als letzter Geburtstag hat.
Also wenn der Stichtag = 31.07., dann wäre als Ergebnis Hugo 21.07. zu erwarten.

Eine Möglichkeit wäre aus der Liste alle zu löschen, die nach dem Stichtag Geburtstag haben und dann den letzten Eintrag der Liste zu lesen.

Gibt es da noch elegantere Möglichkeiten?

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


Re: Letzter Geburtstag

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
In welcher Form sind die Geburtstage gespeichert? Als Datum (also mit Jahreszahl) oder als Monat+Tag?

Code: Alles auswählen.

SORT lt_data BY date+4 DESCENDING.
DELETE lt_data WHERE date+4 GE sy-datum+4. "Datum
* oder
SORT lt_data BY date DESCENDING.
DELETE lt_data WHERE date GE sy-datum+4. "Monat + Tag

READ TABLE lt_data INDEX 1 ASSIGNING FIELD-SYMBOL(<ls_data>).
EDIT: Wenn LT_DATA leer ist muss man den höchsten Eintrag aus der ursprünglichen Datenmenge nehmen. Dann gibt es nämlich im aktuellen Jahr noch keinen Geburtstag und der letzte aus dem letzten Jahr ist der Glückliche.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
PeterPaletti

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Letzter Geburtstag

Beitrag von Bugfrei (ForumUser / 3 / 1 / 0 ) »
Hi,

Vorab: bin eigentlich Entwickler in JavaScript, Java, C#. Und halte mich sicher nicht immer an ABAP übliche (und meiner Meinung umständliche/unnötige) Namensgebungen. Aber technisch ist die Lösung i.o. Der Code könnte von erfahrenen ABAP Entwickler sicherlich noch optimiert werden. Aber so wie er jetzt ist, ist er vielleicht auch leichter zu verstehen.

ABAP Klasse zum ermitteln des letzten "Geburtstagskindes":

Code: Alles auswählen.

  METHOD if_oo_adt_classrun~main.
    DATA: itab TYPE TABLE OF zbirthdays,
          item TYPE zbirthdays,
          today TYPE d,
          dayDiff TYPE i,
          prev TYPE zbirthdays,
          prevDiff TYPE i,
          current_year TYPE string,
          dob TYPE d.

    SELECT * FROM zbirthdays INTO TABLE itab.
    today = sy-datum.
    today = '20241015'.

    DATA: formatDate TYPE string.

    formatDate = |{ today+6(2) }.{ today+4(2) }.{ today+0(4) }|.
    out->write( formatDate ).
    out->write( | Today: { today } | ).

    current_year = sy-datum(4).

    " Lowest positive Diff-Value = nearst Date before Today in actual Year
    LOOP AT itab INTO item.
      dob = item-dob.
      dob = current_year && dob+4(4).
      dayDiff = today - dob.
      IF dayDiff >= 0.
        IF ( prevDiff IS INITIAL ) OR dayDiff < prevDiff.
          prev = item.
          prevDiff = dayDiff.
        ENDIF.
      ENDIF.
    ENDLOOP.

    IF ( prevDiff IS INITIAL ).
      " Nothing found, no one had birthday this year
      " Lowest negative diff Value = Nearest Birthdate to Dec. 31 past year
      LOOP AT itab INTO item.
        dob = item-dob.
        dob = current_year && dob+4(4).
        dayDiff = today - dob.
        IF dayDiff < 0.
          IF ( prevDiff IS INITIAL ) OR dayDiff < prevDiff.
            prev = item.
            prevDiff = dayDiff.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.

    out->write( | Geburtstag von { prev-name } am { prev-dob } | ).
  ENDMETHOD.
Ist mein Code aus ABAP Cloud.

Die Tabelle hat einen recht simplen Aufbau:

Code: Alles auswählen.

define table zbirthdays {
  key client : abap.clnt not null;
  key id     : sysuuid_x16 not null;
  name       : abap.char(100);
  dob        : abap.dats;
}
Dort habe ich folgende Daten eingefügt:

Code: Alles auswählen.

  itab = VALUE #(
    (
      dob = '19830721'
      id = cl_system_uuid=>create_uuid_x16_static( )
      name = 'Hugo'
 )
    (
      dob = '19871013'
      id = cl_system_uuid=>create_uuid_x16_static( )
      name = 'Peter'
 )
    (
      dob = '19910501'
      id = cl_system_uuid=>create_uuid_x16_static( )
      name = 'Marie'
 )
    (
      dob = '19731201'
      id = cl_system_uuid=>create_uuid_x16_static( )
      name = 'Birgit'
 )
  ).
Im Code habe ich die Variable today manuell auf ein Datum geändert um es zu testen.

Ablauf:
Das Geburtsjahr der Personen wird immer auf das aktuelle Jahr geändert.

1. LOOP

Hier suche ich ob es VOR dem heutigen Tag einen Geburtstag gibt und nehme den, mit der kleinsten Differenz (in Sekunden) zu heute.
Die Differenz von HEUTE (10.05.2024) - PERSON (09.05.2024) (= 86400 Sek.) ist also positiv.


2. LOOP

Gab es kein Geburtstag VOR dem heutigen Tag (wenn es z.B. der 01.01. ist), dann suche ich mit negativen Differenzen. HEUTE (10.05.2024) - PERSON (11.05.2024) = (-86400 Sekunden).

Auch hier ist der kleinste (-2 ist kleiner als -1) Wert das gesuchte Datum (Annäherung an den 31.12.2024; was die kleinste negative Differenz zu HEUTE ergibt).


Komplette Quellcode inkl. Version für JavaScript auf Github:
git clone https://github.com/bugfrei/LastBirthday.git

Gruß,

Carsten
Zuletzt geändert von Bugfrei am 11.07.2024 13:35, insgesamt 1-mal geändert.

Seite 1 von 1

Vergleichbare Themen

7
Antw.
11146
Views
SQL letzter Datensatz
von kostonstyle » 05.09.2008 14:17 • Verfasst in ABAP® für Anfänger
8
Antw.
8618
Views
Default ist letzter Tag (sy-datum)
von BabsiCSC » 11.08.2008 10:36 • Verfasst in ABAP® Core
2
Antw.
2825
Views
Anzeige letzter Anmeldedaten
von blausieben » 13.09.2007 14:24 • Verfasst in Basis
2
Antw.
3489
Views
Berechnung letzter Tag im Monat
von gmsdd » 15.05.2007 09:20 • Verfasst in ABAP® für Anfänger
3
Antw.
2474
Views
ABAP immer letzter Satz
von tjanosch » 08.08.2007 16:05 • Verfasst in ABAP® für Anfänger

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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 23 Stunden von Bright4.5 1 / 497
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2139
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8735