Brauche HIlfe beim Coding :( Anfänger.... Thema ist als GELÖST markiert

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
26 Beiträge • Seite 1 von 2 (current) Nächste
26 Beiträge Seite 1 von 2 (current) Nächste

Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 03.09.2012 15:50
Hallo
Und zwar ich bin ziemlicher neuling was Abap Objects angeht…. Ich soll für ein Tutorial folgende UML Abbilden. Man muss dazu sagen ich beshcäftige mich seit ca. 2 Wochen mit Abap. Zuvor habe ich die Grundzüge von Java ind er Schule gelernt.

--> ACHTUNG FRAGE GEKLÄRT ! Neue Frage am ENDE des Threads !

Meine CLASS Deffinition sieht wie folgt aus: Ein paar der Klassen habe ich noch ausgelassen, die kommen später im Tutorial…. Mir geht es jetzt erst mal um die Grundfunktion.

Folgende Codes sind aus einer Include:

Code: Alles auswählen.

CLASS lcl_employee DEFINITION.
  PUBLIC SECTION.

    METHODS:
     constructor IMPORTING value(set_n_o_employees) TYPE i,
     set_name IMPORTING  set_name TYPE string,
     set_firstname IMPORTING set_firstname TYPE string,
     set_adresse IMPORTING set_adresse TYPE string,
     set_dob IMPORTING set_dob TYPE d,
     get_name RETURNING value(get_name) TYPE string,
     get_firstname RETURNING value(get_firstname) TYPE string,
     get_adresse RETURNING value(get_adresse) TYPE string,
     get_dob RETURNING value(get_dob) TYPE d,
     get_base_salary RETURNING value(get_base_salary) TYPE i,
     "get_salary RETURNING VALUE(get_base_salary TYPE i,
     print.
    "get_fullname RETURNING VALUE(re_fullname) TYPE string.

    DATA:
    name TYPE string,
    firstname TYPE string,
    adresse TYPE string,
    dob TYPE d,
    base_salary TYPE i.

    TYPES:
    BEGIN OF str_company,
      name TYPE string,
      firstname TYPE string,
      adresse TYPE string,
      dob TYPE d,
      base_salary TYPE i,
     END OF str_company.

    DATA itab_company TYPE STANDARD TABLE OF str_company.
    DATA: company TYPE str_company.

    CLASS-DATA n_o_employees TYPE i VALUE 0.
  PRIVATE SECTION.

    METHODS: init_base_salary IMPORTING im_base_salary TYPE i.

ENDCLASS.                    "lcl_employee DEFINITION
So dann habe ich die Implementation geschrieben: Die get und set sind mir klar.
SO jetzt will ich innerhalb der print methode die Daten in eine Interne Tabelle aus meinen Parameter ( code folgt unten) auslesen und schreiben.

Code: Alles auswählen.

 
CLASS  lcl_employee IMPLEMENTATION.

  METHOD set_name.
    name = set_name.
  ENDMETHOD.                    "set_name

  METHOD set_firstname.
    firstname = set_firstname.
  ENDMETHOD.                    "set_firstname

  METHOD set_adresse.
    adresse = set_adresse.
  ENDMETHOD.                    "set_adresse

  METHOD set_dob.
    dob = set_dob.
  ENDMETHOD.                    "set_dob

  METHOD get_adresse.
    get_adresse = adresse.
  ENDMETHOD.                    "get_adresse

  METHOD get_name.
    get_name = name.
  ENDMETHOD.                    "get_name

  METHOD get_firstname.
    get_firstname = firstname.
  ENDMETHOD.                    "get_firstname

  METHOD get_dob.
    get_dob = dob.
  ENDMETHOD.                    "get_dob

  METHOD get_base_salary.
    get_base_salary = base_salary.
  ENDMETHOD.                    "get_base_salary

*  METHOD get_fullname.
*    gg_name = name.
*    gg_firstname = firstname.
*  ENDMETHOD.                    "get_fullname

  METHOD constructor.
    IF sy-subrc NE 0.
      LEAVE PROGRAM.
    ELSE.
      set_n_o_employees = n_o_employees + 1.
    ENDIF.
  ENDMETHOD.                    "Constructor

  METHOD print.
    TYPES:
    BEGIN OF str_company,
      name TYPE string,
      firstname TYPE string,
      adresse TYPE string,
      dob TYPE d,
      base_salary TYPE i,
     END OF str_company.

    DATA itab_company TYPE STANDARD TABLE OF str_company.
    DATA: company TYPE str_company.

*  LOOP AT itab_company INTO company.
*    APPEND company TO itab_company.
*    ENDLOOP.


    LOOP AT itab_company INTO company.
      WRITE: company-name,
             company-firstname,
             company-adresse,
             company-dob,
             company-base_salary.
    ENDLOOP.


  ENDMETHOD.      "print

  METHOD init_base_salary.
    IF base_salary > 0.
      WRITE base_salary.
    ELSE.
      base_salary = '0'.
    ENDIF.
  ENDMETHOD.                    "init_base_salary

ENDCLASS.                    "lcl_employee IMPLEMENTATION

Code des Hauptprogramms:

Code: Alles auswählen.


REPORT  z_1000_company.

INCLUDE z_1000_company_classes.

PARAMETERS:
    p_name(50) TYPE c,
    p_fname(50) TYPE c,
    p_adr(50) TYPE c,
    p_dob TYPE d,
    p_bsal TYPE i.

START-OF-SELECTION.

  DATA r_employee TYPE REF TO lcl_employee.
  DATA n_o_employees TYPE REF TO lcl_employee.
*
  CREATE OBJECT r_employee EXPORTING set_n_o_employees = '0'.

  r_employee->firstname = p_fname.
  r_employee->adresse = p_adr.
  r_employee->dob = p_dob.
  r_employee->base_salary = p_bsal.

  CALL METHOD:
*              r_employee->set_name,
*              r_employee->set_adresse,
*              r_employee->set_firstname,
               r_employee->get_name,
               r_employee->get_firstname,
               r_employee->get_dob,
*               r_employee->set_dob,
               r_employee->get_adresse,
               r_employee->print.
Zuletzt geändert von Trulchen am 12.03.2013 09:36, insgesamt 3-mal geändert.


Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von a-dead-trousers (Top Expert / 3504 / 113 / 910 ) » 03.09.2012 16:57
Trulchen hat geschrieben:SO jetzt will ich innerhalb der print methode die Daten in eine Interne Tabelle aus meinen Parameter ( code folgt unten) auslesen und schreiben.
ähm... Könntest du das bitte näher spezifizieren.
Willst du:
A) Die Daten aus dem EMPLOYEE in eine (interne) Tabelle für eine spätere Weiterverarbeitung übertragen?
B) Die Daten direkt am Bildschirm ausgeben?

Das wären nämlich meines erachtens zwei unterschiedliche Methoden.
A) Methode EXPORT: Wäre sinnvoll wenn du mehrere EMPLOYEEs hast und du willst alle Daten in eine anderes Format exportieren um z.B. die DB zu befüllen.
B) Methode PRINT: Wäre sinnvoll wenn du für die Ausgabe eine Zeile auf dem Bildschirm für alle EMPLOYEEs gleich aussehen lassen willst

Wenn du in deinen Progrmm mehrere EMPLOYEEs verwalten möchtest kannst du übrigens mit

Code: Alles auswählen.

data: lt_emploee type standard table of ref to lcl_emploee with NON-unique default key.
eine interne Tabelle definieren die bel. viele Instanzen der EMPLOYEE-Klasse aufnehmen kann.

lg ADT
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.07
Basis: 7.40

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 04.09.2012 07:46
Also ich will vorwiegend erstmal die Daten auf den Bildschirm schreiben
das sie ungefähr so auf den Schirm kommen:

Ich habe eben nur die Aufgabenstellung aus dem Tutorial beachtet und da steht:
Damit die Attribute verwendet werden können, müssen aufgrund der Sichtbarkeitsvorgabe entsprechende Methoden geschaffen werden. Implementieren Sie daher als nächstes alle get- und set-Instanzmethoden Die Methode print soll mithilfe der WRITE-Anweisung eine einfache Ausgabe von vollem Namen, Adresse, Gehalt und Alter realisieren.. Erstellen Sie als nächstes eine interne Tabelle mit Referenzen auf Mitarbeiter (it_employees), und fügen Sie den erstellten Mitarbeiter in diese Tabelle ein.
Name: xxxx Vorname: aaaaaa Adresse: yyyyyy Gehalt: sssssss
...
Name: xxxx Vorname: aaaaaa Adresse: yyyyyy Gehalt: sssssss
...

Also brauch ich wohl beides oder?
Es einmal in eine interne Tabelle schreiben und es dann auslesen und auf den BIldschirm schreiben?

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von a-dead-trousers (Top Expert / 3504 / 113 / 910 ) » 04.09.2012 08:36
nö.

So wie ich die Angabe lese, brauchst du nur die PRINT Methode mit den WRITE-Befehlen und ohne interne Tabelle.
Erstellen Sie als nächstes eine interne Tabelle mit Referenzen auf Mitarbeiter (it_employees), und fügen Sie den erstellten Mitarbeiter in diese Tabelle ein.
Wie das geht hab ich bereits in meinen ersten Post angeführt. Hinzufügen funktioniet dann ganz normal mit APPEND.

lg ADT
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.07
Basis: 7.40

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 04.09.2012 08:56
Danke !

Und das muss ich alles in der Methode print schreiben?
Oder in die Class Definition?
BIn ein bisschen überfordert ist doch mein erstes Projekt mit Abap Objects und in ABAP auch noch nicht 100% sicher weil ich mich erst seit 2 Wochen damit beschäftige.
Aber der Chef sagt ( Praktikum) ich soll mir Abab Objects anschauen und das Tutorial durch machen.....

Print Methode ( im Include)

Code: Alles auswählen.

 
 METHOD print.
    TYPES:
    BEGIN OF company,
      name TYPE string,
      firstname TYPE string,
      adresse TYPE string,
      dob TYPE d,
      base_salary TYPE i,
     END OF company.

    Data: lt_employee type standard table of ref to lcl_employee with NON-unique default key.
    DATA company TYPE REF TO lcl_employee.


    LOOP AT lt_employee INTO company.
    APPEND company to lt_employee.
    WRITE: name,
           firstname,
           adresse,
           dob,
           base_salary.
    ENDLOOP.

  ENDMETHOD.      "print

Wenn ich jetzt das Hauptprogramm starte kommen die Parameter und die kann ich auch alle befüllen. Nur Ausführen funktioniert nicht :(
Alles andere habe ich unverändert .... ( siehe erste Post)
Hauptprogramm:

Code: Alles auswählen.

 
REPORT  z_1000_company.

INCLUDE z_1000_company_classes.

PARAMETERS:
    p_name(50) TYPE c,
    p_fname(50) TYPE c,
    p_adr(50) TYPE c,
    p_dob TYPE d,
    p_bsal TYPE i.

START-OF-SELECTION.

  DATA r_employee TYPE REF TO lcl_employee.
  DATA n_o_employees TYPE REF TO lcl_employee.
*
  CREATE OBJECT r_employee EXPORTING set_n_o_employees = '0'.

  r_employee->firstname = p_fname.
  r_employee->adresse = p_adr.
  r_employee->dob = p_dob.
  r_employee->base_salary = p_bsal.

  CALL METHOD:
              r_employee->get_name,
              r_employee->get_firstname,
               r_employee->get_dob,
               r_employee->get_adresse,
               r_employee->print. 

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von a-dead-trousers (Top Expert / 3504 / 113 / 910 ) » 04.09.2012 09:28
Lass die Tabelle weg:

Code: Alles auswählen.

METHOD print.
    WRITE: me->name,
           me->firstname,
           me->adresse,
           me->dob,
           me->base_salary.
ENDMETHOD.
N_O_EMPLOYEES ist glaub ich eine Klassenvariable, die die Anzahl der Instanzierten Objekte zählen soll.
Die brauchst du nicht an den Konstruktor zu übergeben, sondern musst sie dann einfach im Konstruktor jedes Mal um 1 erhöhen.

Außerdem hast du die Attribute der Klasse als PUBLIC definiert obwohl du dafür eigene SET/GET Methoden geschrieben hast. Entweder du machst die Attribute PRIVATE oder du lässt die SET/GET Methoden weg. Beides zusammen ist eher sinnlos und auch nicht wirklich konsistent.
Wenn du auf PRIVATE umschwenkst was ja den Sinn hinter SET/GET ausmacht, musst du in deinem Konstruktor noch weitere Parameter einbauen die für Befüllung der Attribute zuständig sind.

lg ADT
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.07
Basis: 7.40

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 04.09.2012 11:54
So habe jetzt die Attribute private gesetzt , die Attribute an meinen Konstruktor übergenen:

Code: Alles auswählen.

PUBLIC SECTION.

    METHODS:
    constructor IMPORTING set_n_o_employees TYPE i
                          set_name TYPE c
                          set_firstname TYPE c
                          set_adresse TYPE c
                          set_dob TYPE d,
     set_name IMPORTING  set_name TYPE c,
     set_firstname IMPORTING set_firstname TYPE c,
     set_adresse IMPORTING set_adresse TYPE c,
     set_dob IMPORTING set_dob TYPE d,
     set_base_salary IMPORTING set_base_salary TYPE i,
     get_name RETURNING value(get_name) TYPE string,
     get_firstname RETURNING value(get_firstname) TYPE string,
     get_adresse RETURNING value(get_adresse) TYPE string,
     get_dob RETURNING value(get_dob) TYPE d,
     get_base_salary RETURNING value(get_base_salary) TYPE i,
     "get_salary RETURNING VALUE(get_base_salary TYPE i,
     print.
    "get_fullname RETURNING VALUE(re_fullname) TYPE string.

PRIVATE SECTION.
    DATA:
    name TYPE c,
    firstname TYPE c,
    adresse TYPE c,
    dob TYPE d,
    base_salary TYPE i.

    CLASS-DATA n_o_employees TYPE i VALUE 0.


    METHODS: init_base_salary IMPORTING im_base_salary TYPE i.
 
und die Tabelle gelöscht

Code: Alles auswählen.

 METHOD print.

    WRITE: me->name,
           me->firstname,
           me->adresse,
           me->dob,
           me->base_salary.

  ENDMETHOD.      "print
Jetzt wie muss ich es dann im Hauptprogramm schreiben? DIe CREATE OBJECT ist falsch das weiß ich waren auch nur Tests von mir... aber ich bekomm es nicht hin das er mir die Werte "printed" .....
Ohne das EXPORTING meckert er das die obligatorischen Parameter nicht Versorgt sind.

Code: Alles auswählen.

INCLUDE z_1000_company_classes.
DATA:
    name TYPE string.

PARAMETERS:
    p_name TYPE c,
    p_fname TYPE c,
    p_adr TYPE c,
    p_dob  TYPE d,
    p_bsal TYPE i.

START-OF-SELECTION.

  DATA r_employee TYPE REF TO lcl_employee.
  DATA n_o_employees TYPE REF TO lcl_employee.
*
  CREATE OBJECT r_employee EXPORTING  set_name = ''.
                                     set_firstname = ''
                                     set_adresse = ''
                                     set_dob = '12.34.56'.

*
  CALL METHOD:
  r_employee->get_name RECEIVING get_name = p_fname,
  r_employee->get_firstname RECEIVING get_firstname = p_fname,
  r_employee->get_dob RECEIVING get_dob = p_dob,
  r_employee->get_adresse RECEIVING get_adresse = p_adr ,
  r_employee->get_base_salary RECEIVING get_base_salary = p_bsal,
  r_employee->print.

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von a-dead-trousers (Top Expert / 3504 / 113 / 910 ) » 05.09.2012 07:44
hi!

Den Parameter "set_n_o_employees" in der Constructor-Definition weglassen.
In der Constructor-Implementierung reicht es den Wert des Attributes "n_o_employees" immer um 1 zu erhöhen.
Damit soll ja nur die Anzahl der endgültigen Instanzen gezählt werden, was ja durch die vollständige Abarbeitung des Constructors gewährleistet ist.
Bei einer solchen Art der Instanzverwaltung würde sich auch ein Destructor (meist FREE bezeichnet) anbieten, der die Zählvariable wieder um 1 veringert und alle Attribute die zur Instanz gehören löscht. Aber ACHTUNG: Dieser Destructor wird NICHT automatisch mit z.B. dem Befehl CLEAR aufgerufen, sondern muss explizit mit CALL METHOD aufgerufen werden.

Ich würde außerdem bei den Methodenparametern die Kürzel "set_" und "get_" weglassen.
Es gibt mehre Ansätze wie man Attribute/Parameter in ABAP benennt.
Wir verwenden folgendes Schema dafür (Auszug)

Code: Alles auswählen.

<Art><Typ>_<Name>
IT_DATA "Importing-Parameter der tabellarisch ist.
ET_TEXT "Exporting-Parameter der tabellarisch ist.
CD_COUNT "Changing-Parameter der ein Datenelement ist.
IR_EMPLOYEE "Importing-Parameter der eine Daten- oder Objektreferenz ist.
GD_NAME "Globale Variable oder Attribut eines Datenelements.
LT_STRING "Lokale Variable die Tabellarisch ist.
Am besten du fragst bei euch in der Firma wie es dort gehandhabt wird.

lg ADT
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.07
Basis: 7.40

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 05.09.2012 08:49
Danke für deine HIlfE :)

habe auch mittlerweile meine Daten "geprintet!"

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 05.09.2012 08:50
Vielen Danke :)

Habe es gestern auch nach vielen Hin und Her hinbekommen das die print() Funktioniert ;)
Muss mich jetzt gleich mal an die Interne Tabelle wagen :(

Habe jetzt im ABAP ANfänger Bereich noch nen Thread erstellt mit dem Datum/ Alter !
Falls du da Antwort weißt ;)

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 05.09.2012 10:25
.... Beitrag findet ihr im Anfänger forum....

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 12.09.2012 10:02
So neue Frage !

Und zwar ich habe eine Klasse employees!
Jetzt soll ich eine neue Klasse erstellen:
Die Abteilungsklasse soll einen Namen und eine Tabelle mit Referenzen auf ihre Mitarbeiter beinhalten. Erstellen Sie auch für diese Klasse den entsprechenden Definitions- und Implementierungsteil in ihrem Include. Definieren Sie dann zunächst ein Attribut name für den Namen der Abteilung sowie entsprechende get- und set-Methoden (analog zur Mitarbeiterklasse). --> Hier ist die Frage muss ich ALLE get und set übernehmen also auch von lcl_employees ?

Definieren Sie dann ein privates Attribut it_employees, das Referenzen auf die Mitarbeiter aufnehmen soll. Fügen Sie eine Methode add_employee hinzu, die als Parameter die Referenz auf einen Mitarbeiter übergeben bekommt und diesen in die Tabelle it_employees einfügt.

Meine Versuch der natürlich nicht funktioniert:

Code: Alles auswählen.

CLASS lcl_department DEFINITION.
  PUBLIC SECTION.
    METHODS:
       constructor IMPORTING it_abteilungsname TYPE c,
       set_abteilungsname IMPORTING  im_abteilungsname TYPE c,
       get_abteilungsname RETURNING value(rv_abteilungsname) TYPE string,
       add_employee IMPORTING im_employees TYPE c,
       print.


  PRIVATE SECTION.
    DATA:
          abteilungsname TYPE c,
          it_employees TYPE REF TO lcl_employee.
ENDCLASS.

Wie muss die Methode add_employee programmiert werden?

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von JHM (Top Expert / 1139 / 1 / 179 ) » 12.09.2012 10:37
Trulchen hat geschrieben:Definieren Sie dann zunächst ein Attribut name für den Namen der Abteilung sowie entsprechende get- und set-Methoden (analog zur Mitarbeiterklasse). --> Hier ist die Frage muss ich ALLE get und set übernehmen also auch von lcl_employees ?
Eigentlich ist die Aufgabenstellung doch klar und von dir auch richtig umgesetzt. Du kannst nur je eine GET/SET-Methode anlegen, da du auch nur ein privates Klassenmerkmal (Abteilungsname) hast.
Trulchen hat geschrieben:Wie muss die Methode add_employee programmiert werden?

Code: Alles auswählen.

CLASS lcl_department DEFINITION.
  PUBLIC SECTION.
    METHODS:
       constructor IMPORTING iv_abteilungsname TYPE c,
       set_abteilungsname IMPORTING  iv_abteilungsname TYPE c,
       get_abteilungsname RETURNING value(rv_abteilungsname) TYPE string
       add_employee IMPORTING ir_employees TYPE REF TO lcl_employee.

  PRIVATE SECTION.
    DATA:
          mv_abteilungsname TYPE c,
          mt_employees TYPE REF TO lcl_employee.

*In der Methodeimplementation:
  ADD ir_employees TO mt_employees.
BTW: Ein sauberes Namensschema erhöht die lesbarkeit. Als Beispiel (immer den Großbuchstaben verwenden):
1. Stelle: Sichtbarkeit/Verwendung -> classMember, Lokale, Global, Importing, Exporting, Changing, Returning....
2. Typ: interene Tabelle, Varibale, objektReferenz, Struktur, ....
Gruß Hendrik

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 12.09.2012 11:28
Danke für die Hilfe !

Also ich habe folgende Namensgebung vorgegeben:
cl_ = local class (Lokale Klasse, später lernen Sie auch globale Klassen kennen)
im_ / ex_ / ch_ / re_ = Import- / Export- / Changing- / Receiving-Parameter
r_ = Referenz
get_ = Getter (Methode zum Lesen von Attributen)
set_ = Setter (Methode zum Schreiben von Attributen)
wa_ = workarea (Tabellenarbeitsbereich)
it_ = interne Tabelle
pa_ = Parameter
so_ = select option (Selektionskriterium)

Re: Brauche HIlfe beim Coding :( Anfänger....

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) » 13.09.2012 15:38
Kann mir mal jemand das Down Cast erklären?
Bin etwas überfordert : (


Fallbeschreibung:
Derzeit existieren 4 Klassen lcl_employee, lcl_department, lcl_office_employee, lcl_field_staff.
Für den Überblick komplettes Coding meiner Include:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*&  Include           Z_1000_COMPANY_2_CLASSES
*&---------------------------------------------------------------------*

CLASS lcl_employee DEFINITION.
  PUBLIC SECTION.

    METHODS:
    constructor IMPORTING it_name TYPE c
                          it_firstname TYPE c
                          it_adresse TYPE c
                          it_dob TYPE d
                          it_salary TYPE i,
     set_name IMPORTING  it_name TYPE c,
     set_firstname IMPORTING it_firstname TYPE c,
     set_adresse IMPORTING it_adresse TYPE c,
     set_dob IMPORTING it_dob TYPE d,
     get_fullname RETURNING value(rv_fullname) TYPE string,
     get_name RETURNING value(rv_name) TYPE string,
     get_firstname RETURNING value(rv_firstname) TYPE string,
     get_adresse RETURNING value(rv_adresse) TYPE string,
     get_dob RETURNING value(rv_dob) TYPE d,
     get_base_salary RETURNING value(rv_base_salary) TYPE i,
     get_salary  RETURNING value(rv_salary) TYPE i ,
     init_base_salary RETURNING value(im_base_salary) TYPE i,
     get_n_o_employees RETURNING value(rv_n_o_employees) TYPE i,
     print.


  PRIVATE SECTION.
    DATA:
    name(10) TYPE c,
    firstname(10) TYPE c,
    adresse(30) TYPE c,
    dob TYPE d,
    base_salary TYPE i,
    fullname(20) TYPE c,
    salary TYPE i,
    heute TYPE sy-datum,
    diff TYPE i.
    CLASS-DATA n_o_employees TYPE i VALUE 0.




ENDCLASS.                    "lcl_employee DEFINITION
CLASS  lcl_employee IMPLEMENTATION.

  METHOD set_name.
    name = it_name.
  ENDMETHOD.                    "set_name

  METHOD set_firstname.
    firstname = it_firstname.
  ENDMETHOD.                    "set_firstname

  METHOD set_adresse.
    adresse = it_adresse.
  ENDMETHOD.                    "set_adresse

  METHOD set_dob.
    dob = it_dob.
  ENDMETHOD.                    "set_dob


  METHOD get_adresse.
    rv_adresse = adresse.
  ENDMETHOD.                    "get_adresse

  METHOD get_name.
    rv_name = name.
  ENDMETHOD.                    "get_name

  METHOD get_firstname.
    rv_firstname = firstname.
  ENDMETHOD.                    "get_firstname

  METHOD get_dob.
    rv_dob = dob.
  ENDMETHOD.                    "get_dob

  METHOD get_base_salary.
    rv_base_salary = base_salary.
  ENDMETHOD.                    "get_base_salary

  METHOD get_salary.

    diff = sy-datum - dob.

    IF diff > 14600.
      salary = base_salary + ( base_salary * '0.05' ).
    ELSEIF diff > 18250.
      salary = base_salary + ( base_salary * '0.10' ).
    ELSE.
      salary = base_salary.
    ENDIF.
    rv_salary = salary.

  ENDMETHOD.                    "get_salary
  METHOD get_fullname.
    DATA sep(3) TYPE c VALUE '   '.
    CONCATENATE name firstname INTO fullname SEPARATED BY sep.
    rv_fullname = fullname.

  ENDMETHOD.                    "get_fullname

  METHOD constructor.
    name = it_name.
    firstname = it_firstname.
    adresse  = it_adresse.
    dob = it_dob.
    base_salary = it_salary.
    n_o_employees = n_o_employees + 1.
  ENDMETHOD.                    "Constructor

  METHOD print.
    DATA:
    ld_fullname TYPE char50, "CHAR damit die Breite in der Ausgabe immer gleich ist
    ld_salary TYPE i.

    ld_fullname = me->get_fullname( ).
    ld_salary = me->get_salary( ).

    WRITE: /  'Name:', ld_fullname,  'Adresse:', adresse, 'Geburtstdatum:', dob , 'Gehalt:', ld_salary.

  ENDMETHOD.                    "print


  METHOD init_base_salary.

    IF salary < 0.
      base_salary = 0.
    ELSE.
      salary = salary.
    ENDIF.

  ENDMETHOD.                    "init_base_salary

  METHOD get_n_o_employees.
    rv_n_o_employees = n_o_employees.
    WRITE: 'Es wurden', n_o_employees, 'Objekte erzeugt'.
  ENDMETHOD.                    "get_n_o_employees

ENDCLASS.                    "lcl_employee IMPLEMENTATION


CLASS lcl_office_employee DEFINITION INHERITING FROM lcl_employee.
PUBLIC SECTION.
METHODS:
constructor IMPORTING it_name TYPE c
                          it_firstname TYPE c
                          it_adresse TYPE c
                          it_dob TYPE d
                          it_salary TYPE i
                          im_office TYPE c,
set_office IMPORTING im_office TYPE c,
get_office RETURNING VALUE(rv_office) TYPE string,
print REDEFINITION.
PRIVATE SECTION.
DATA:
      office(20) TYPE c.
ENDCLASS.

CLASS lcl_office_employee IMPLEMENTATION.
METHOD constructor.
 SUPER->CONSTRUCTOR( it_name = it_name
    it_firstname = it_firstname
     it_adresse = it_adresse
    it_dob = it_dob
    it_salary = it_salary ).

office = im_office.
 ENDMETHOD.

   METHOD set_office.
   office = office.
  ENDMETHOD.                    "set_dob

  METHOD get_office.
    rv_office = office.
  ENDMETHOD.

   METHOD print.
     super->print( ).
    WRITE: 'Abteilung:', office.
  ENDMETHOD.

ENDCLASS.
CLASS lcl_field_staff DEFINITION INHERITING FROM lcl_employee.
 PUBLIC SECTION.
 METHODS:
 constructor IMPORTING  it_name TYPE c
                          it_firstname TYPE c
                          it_adresse TYPE c
                          it_dob TYPE d
                          it_salary TYPE i
                          im_percentage TYPE i
                          im_sales TYPE i,
print REDEFINITION,
set_percentage IMPORTING im_percentage TYPE i,
get_percentage RETURNING VALUE(rv_percentage) TYPE string,
set_sales IMPORTING im_sales TYPE i,
get_sales RETURNING VALUE(rv_sales) TYPE string.

 PRIVATE SECTION.
 DATA:
       percentage TYPE i,
       sales TYPE P.

ENDCLASS.

CLASS lcl_field_staff IMPLEMENTATION.
 METHOD constructor.
 SUPER->CONSTRUCTOR( it_name = it_name
     it_firstname = it_firstname
     it_adresse = it_adresse
     it_dob = it_dob
     it_salary = it_salary  ).
percentage = im_percentage.
sales = im_sales.
ENDMETHOD.

  METHOD set_percentage.
   percentage = im_percentage.
  ENDMETHOD.                    "set_dob

  METHOD get_percentage.
    rv_percentage = percentage.
  ENDMETHOD.

   METHOD set_sales.
   sales = im_sales.
  ENDMETHOD.                    "set_dob

  METHOD get_sales.
    rv_sales = sales.
  ENDMETHOD.            "


  METHOD print.
    super->print( ).
.

   WRITE: 'Verkäufe', sales , 'Provision', percentage.
  ENDMETHOD.
ENDCLASS.

CLASS lcl_department DEFINITION.
  PUBLIC SECTION.
    METHODS:
       constructor IMPORTING iv_abteilungsname TYPE c,
       set_abteilungsname IMPORTING  iv_abteilungsname TYPE c,
       get_abteilungsname RETURNING value(rv_abteilungsname) TYPE string,
       add_employee IMPORTING ir_employees TYPE REF TO lcl_employee,
       print.
  PRIVATE SECTION.
    DATA:
          mv_abteilungsname(20) TYPE c,
          mt_employees TYPE REF TO lcl_employee.

ENDCLASS.                    "lcl_department DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_department IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_department IMPLEMENTATION.
  METHOD set_abteilungsname.

    mv_abteilungsname = iv_abteilungsname.
  ENDMETHOD.                    "set_Abteilungsname

  METHOD get_abteilungsname.
    rv_abteilungsname = mv_abteilungsname.
  ENDMETHOD.                    "get_Abtelungsname

  METHOD add_employee.
    "ADD ir_employees TO mt_employees.
  ENDMETHOD.                    "add_employee

  METHOD constructor.
    mv_abteilungsname = iv_abteilungsname.
  ENDMETHOD.                    "constructor

  METHOD print.
    WRITE: / 'Mitarbeiter der Abteilung', mv_abteilungsname,
           / .
  ENDMETHOD.                    "print



ENDCLASS.                    "lcl_department IMPLEMENTATION

Ich soll jetzt: In der Abteilungsklasse eine Methode get_avg_percentage erstellen welche den durchschnittlichen Provisionssatz aller Außendienstmitarbeiter der Abteilung zurückliefern.
Für diese Berechnung benötigen Sie einen Down-Cast auf die Außendienstmitarbeiter-Klasse, da in der Abteilungsklasse nur über Referenzen der Klasse lcl_employee auf die Mitarbeiterobjekte zugegriffen wird, so jedoch die benötigte get-Methoden zum Zugriff auf die Provision nicht erreicht werden kann.
Ich bin da jetzt etwas verwirrt, etwender kapiere ich die ganze Aufgebenstellung nicht oder ich weiß nicht....
Ich habe mittlerweile Rausgefunden ich brauch eine Try/ Catch Die Try / Catch kenn ich bereits aus Java, und weiß wofür sie nützt .... aber für den Rest bin ich überfragt ....
Mein Versuch:

Code: Alles auswählen.

CLASS lcl_department IMPLEMENTATION.

  METHOD get_avg_percentage.
    DATA: r_employee TYPE REF TO lcl_employee,
          r_außen_employee TYPE REF TO lcl_department.
 TRY.
   r_außen_employee ?= r_aemployee.

  CATCH ????????.... 
    LEAVE PROGRAM.

  ENDTRY.


Vergleichbare Themen

Ich Brauche Ihre Hilfe
von CSZ_Berater » 18.09.2017 10:38
Brauche Hilfe für Datenbankabfrage mit InnerJoin
von thomasxy » 01.02.2008 08:09
Hilfe-Gehaltvorstellung-Anfänger
von Gehaltvorstellung » 05.09.2012 13:45
SAP Anfänger sucht Hilfe
von tim82 » 30.11.2004 00:21
Brauche Hilfe zu Update nach Join in ITAB
von laola » 23.07.2008 16:42