Methode API__GET_VALUE in PMD nutzen

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

Methode API__GET_VALUE in PMD nutzen

Beitrag von sapdepp (Specialist / 210 / 35 / 2 ) »
Hallo miteinander,

ich möchte im PAI die Werte eines gefüllten Tablecontrols auslesen, weil ich diese Werte für den PMD-Druck benötige (Generator-Version 2). Das TC steht, nehmen wir an, im Register 2 des eigenen PMDs. Standardmäßig wird beim Aufruf das Register 1 dargestellt. Kann ich mit der Methode <pub__service>->API__GET_VALUE diese TC-Werte auslesen? Ich weiß aber nicht genau, welche Parameter ich z. B. bei i_alias mitgeben muss. TC-Name oder Registername klappen nicht. Ich müsste quasi das TC bis zum Ende durchloopen und die Werte in eine ITAB schreiben ...
Ein Bsp. steht hier: http://www.directupload.net/file/d/3613 ... 7i_jpg.htm

Vielen Dank
sapdepp

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


Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Hi!

API__GET_VALUE arbeitet auf Feldebene. Das heißt du musst als I_ALIAS den Namen des Feldes in der Tabelle und als I_MUSEQ die Zeilennummer angeben.
Die Standardvorgehensweise wäre mit API__MAX_OCCURRENCE die Anzahl der Zeilen der Tabelle zu ermitteln (I_ALIAS = Name der Tabelle) und dann in einer DO X TIMES Schleife alle Felder mittels API__GET_VALUE auszulesen.

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.18
Basis: 7.50

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von sapdepp (Specialist / 210 / 35 / 2 ) »
Hallo,

mittels API__MAX_OCCURRENCE bekomme ich stets Dumps ("Das Element ... existiert nicht."). Habe es versucht im Parameter i_alias mit PMD-Tabellenname Y000000D0L, dann mit Feldname der 1. Spalte KC_OP_MNO, dann mit dem Dynprofeld Y000000D0L-KC_OP_MNO, dann mit dem Tablecontrol V02_TC_KC_OP_SCMA und schließlich mit dem Subscreen SUB_SAGMRDREOP. Die Werte möchte ich auslesen, nachdem ich auf das Drucksymbol ganz oben im Menü geklickt habe. Das ist das Unterprogramm Z_PAI im PMD.
Die Tabelle Y000000D0L hat für die Dokumentennummer des betroffenen PMDs keine Einträge, obwohl welche im TC stehen (kein Update auf die Tabelle), das nur als Hinweis. Ich möchte quasi nicht von der DB lesen, sondern direkt aus dem TC bzw. Dynpro.

Lieben Dank
sapdepp

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
a-dead-trousers hat geschrieben:... API__MAX_OCCURRENCE die Anzahl der Zeilen der Tabelle zu ermitteln (I_ALIAS = Name der Tabelle)...
Damit meinte ich den Namen des Dokumentationselements bzw. dessen Aliasname.
Alle Zugriffe im PMD erfolgen darüber.
(Ersichtlich in der N2T7 zum Dokumenttyp, oben in der Detailansicht zum Element)
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: Methode API__GET_VALUE in PMD nutzen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Okay... Vielleicht besser anhand eines konkreten Beispiels:

Gegeben ist das Dokumentationselement A, bei dem es sich um eine Tabelle handelt, und die Dokumentationselemente X,Y und Z, bei denen es sich um Felder in der Tabelle handelt.

Code: Alles auswählen.

ld_lines = <pub__service>->API__MAX_OCCURRENCE( i_alias = 'A' ).
do ld_lines times.
  ld_index = sy-index.
  <pub__service>->API__GET_VALUE( exporting i_alias = 'X' i_occ = ld_index importing e_value = ld_value_x ).
  <pub__service>->API__GET_VALUE( exporting i_alias = 'Y' i_occ = ld_index importing e_value = ld_value_y ).
  <pub__service>->API__GET_VALUE( exporting i_alias = 'Z' i_occ = ld_index importing e_value = ld_value_z ).
* Die Werte aus ld_value_x, ld_value_y und ld_value_z verarbeiten.
enddo.
Das wäre das Äquivalent von einem LOOP AT einer internen Tabelle in PMDs.

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.18
Basis: 7.50

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von sapdepp (Specialist / 210 / 35 / 2 ) »
Guten Morgen,

vielen Dank, das Ganze funktioniert, wie ich erhoffte. Nur etwas bereitet noch Kopfzerbrechen. Der Nutzer landet per Voreinstellung nicht in dem Register, in dem das TC steht. Beim Druck werden die Zeilen des TC also nicht in die Variable ld_lines gelesen, sondern erst, wenn ich auf das Register mit dem TC wechsle bzw. wieder zurückwechsle.
Ich habe versucht, das durch Coding zu umgehen, indem ich das richtige Register setze, wenn es nicht aktiv ist:

Code: Alles auswählen.

  l_alias = <pub__service>->api__get_active_card( 'SAGMRDREOP' ).

  IF l_alias NE 'SAGMRDKTMA'.

    CALL METHOD <pub__service>->api__set_function
      EXPORTING
        i_function = 'PUS_SAGMRDKTMA' 
        .

  ENDIF.

  ld_lines = <pub__service>->API__MAX_OCCURRENCE( i_alias = 'KC_OP_SCMA' ).
  ...
Doch leider funktioniert das Ganze nicht. Die Variable ld_lines bleibt leer. Gibt es eine Möglichkeit, den Inhalt eines nicht aktiven Registers dennoch auszulesen und zu verarbeiten, sodass bspw. die Inhalte des TC beim Ausdruck auf dem Papier erscheinen?

Viele Grüße
sapdepp

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Sorry, aber im Moment steig ich nicht ganz durch...
Was hat die Verfügbarkeit der Daten beim Ausdruck mit dem Aufruf des Registers zu tun?
Die Daten sollten im Hintergrund entweder in der Datenbank oder eben in der Service-Klasse vorliegen.

Kann es sein, dass da evtl. beim Anlegen/Vorbelegen des PMD etwas schief läuft?
Normalerweise sollten (Kunden-)Daten im User-Exit Anfang bzw. Anlegen im PMD eingetragen werden und nicht erst beim PBO der Registerkarte.
Dann klappts auch mit dem (Wieder-)Auslesen beim Ausdruck.

hmmm... Werden die Daten vielleicht irgendwie "speziell" in das PMD übertragen? Linkbaustein? Fremddatenbaustein?

Kurz noch zur Erklärung warum das mit dem "manuellen" Aufruf des Registers nicht so funktioniert wie du dir das vorgestellt hast:
Das PMD-Framework bzw. die API__SET_FUNCTION Methode führt den neuen Funktionscode erst NACH dem User-Exit aus. d.h zu dem Zeitpunkt wo du API__MAX_OCCURRENCE aufrufst ist noch gar nichts passiert.
Richtigerweise müsstest du diese Verarbeitung erst im PBO durchführen.
ABER: Der Wechsel der Registerkarte mit API__SET_FUNCTION ist (derzeit noch) nicht möglich. Das Coding zum Registerwechsel wird VOR den User-Exits ausgeführt.

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.18
Basis: 7.50

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von sapdepp (Specialist / 210 / 35 / 2 ) »
Hallo,
Sorry, aber im Moment steig ich nicht ganz durch...
Was hat die Verfügbarkeit der Daten beim Ausdruck mit dem Aufruf des Registers zu tun?
Die Daten sollten im Hintergrund entweder in der Datenbank oder eben in der Service-Klasse vorliegen.
Das ist im Prinzip mein Hauptproblem. Die Daten sind weder in der Y-Tabelle vorhanden noch über die Service-Klasse greifbar, sofern man nicht in das Register wechselt. Das PMD hat Siemens entworfen, wir haben Siemens drauf aufmerksam gemacht, dass da was nicht stimmt, aber Siemens verweigert die Ausbesserung und möchte eine hohe Geldsumme fürs Berichtigen.
Die Daten werden nicht über Linkbausteine besorgt, wohl eher über Fremddatenbausteine eigens von Siemens.
Kann es sein, dass da evtl. beim Anlegen/Vorbelegen des PMD etwas schief läuft?
Normalerweise sollten (Kunden-)Daten im User-Exit Anfang bzw. Anlegen im PMD eingetragen werden und nicht erst beim PBO der Registerkarte.
Dann klappt's auch mit dem (Wieder-)Auslesen beim Ausdruck.
Kann durchaus sein, denn weder beim Userexit Anlegen noch Anfang sind meine TC-Daten verfügbar. Die werden wirklich erst beim PBO des Registers geladen.
Auch im Userexit Z_PRINT_START kann ich mir meine TC-Daten nicht abgreifen und muss vorher immer manuell das Register wechselt, damit ich an die Daten rankomme.

Viele Grüße
sapdepp

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Hi!

Code: Alles auswählen.

CALL METHOD o__pmd->('API__SET_FOCUS')
          EXPORTING
            p_alias = '...'
            p_occ   = 0.
Damit kannst du im User-Exit "Anfang" auf die Registerkarte mit dem jeweiligen Alias wechseln.
Das heißt das Dokument wird mit dieser Registerkarte geöffnet, dann sollten die Daten beim Ausdruck geladen worden sein.

Was damit nicht geht, ist der direkte Ausdruck aus der Dokumentenliste weil dann ja der Dialog nicht zuerst aufgeht.

Schau mal in der N2T7 nach welche Einstellungen das Dokelement zur Tabelle hat (Karteireiter "Fremddatenversorgung").
IMHO sollten die Fremddatenbausteine schon längst obsolet sein. Die machen nur Ärger. Ohne ist es zwar etwas aufwändiger umzusetzen, aber auch weitaus flexibler. Sprich die Vorbelegung kann schon zum Zeitpunkt "Anfang" erfolgen und der wird auch ohne Dialog durchlaufen.

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.18
Basis: 7.50

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von sapdepp (Specialist / 210 / 35 / 2 ) »
Hallo, ADT,

vielen Dank. Das TableControl-DokElement hat keine Fremddatenversorung, stelle ich fest.

Und wenn ich den Aufruf

Code: Alles auswählen.

CALL METHOD <pub__service>->API__SET_FOCUS
  EXPORTING
    I_ALIAS = 'SAGMRDKTMA'
    I_OCC   = 0
    .
mache im "Anfang"-Userexit Z_START, schmiert das Ganze mit CX-Error ab. Das Programm meint, das Registerkarten-Alias bzw. -Element sei nicht vorhanden, obwohl es da ist und so heißt.
Bild

Ich rufe das sog. OP-Protokoll aus der Dokumentenliste N204 auf.

Bild

Alles nicht so einfach bei uns. ;-)

LG
sapdepp

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Hi!

NICHT:

Code: Alles auswählen.

CALL METHOD <pub__service>->API__SET_FOCUS
SONDERN:

Code: Alles auswählen.

CALL METHOD o__pmd->('API__SET_FOCUS')
Dabei handelt es sich um die PMD-interne Methode ohne zusätzlich Prüfungen (die den Fehler auslösen)

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.18
Basis: 7.50

Re: Methode API__GET_VALUE in PMD nutzen

Beitrag von sapdepp (Specialist / 210 / 35 / 2 ) »
Ups, mein Fehler. Dennoch landet er – jetzt natürlich dank ADT ohne Error – auf dem ersten Register, meine Daten sind also noch nicht abgreifbar. Das PMD ist da sehr hartnäckig. ;-)

Erwähnenswert ist vielleicht auch, dass ich im Anzeigemodus ins PMD gehe, nicht im Änderungsmodus. In Letzterem wird ein Speichern verlangt, tut man das, sind die Daten, egal in welchem Register man sich befindet, abgreifbar. Sollten wir es so nicht hinbekommen, würden wir versuchen, das PMD immer im änderbaren Modus zu öffnen.

Seite 1 von 1

Vergleichbare Themen

4
Antw.
11033
Views
Wertebereich nutzen
von MarkusW » 19.12.2007 09:00 • Verfasst in ABAP® Core
4
Antw.
2159
Views
Selektionen der Log DB nutzen
von lucky65 » 26.07.2012 13:13 • Verfasst in ABAP® Core
15
Antw.
6631
Views
Assertions nutzen
von DeathAndPain » 07.06.2018 12:31 • Verfasst in ABAP® für Anfänger
1
Antw.
1748
Views
Geschützte EVENTS des ALV nutzen
von RiffRaff » 05.08.2008 10:51 • Verfasst in ABAP Objects®
2
Antw.
3305
Views
Selektionsfelder in Query nutzen
von h1as » 06.06.2013 14:00 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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.