Dynamisch - ASSIGN COMPONENT

Getting started ... Alles für einen gelungenen Start.
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

Dynamisch - ASSIGN COMPONENT

Beitrag von 1337 (ForumUser / 99 / 33 / 0 ) »
Hallo,

ich stehe hier vor einem Fall, in dem ich mit ASSIGN COMPONENT Dynamisch arbeiten muss.

Etwas derartiges habe ich bisher noch nicht gemacht.
Zuletzt geändert von 1337 am 09.12.2013 09:01, insgesamt 1-mal geändert.

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


Re: Dynamisch - ASSIGN COMPONENT

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
Ich glaub, dass es so wie du das gemacht hast, nicht funktionieren wird!

Du kannst die Verwendung von /PM0/ABEASBTPERS nicht weglassen, da diese Sruktur (mit Sicherheit) in der Schnittstelle von LR_SUBJCT->/PM0/IF_3F_BOE~GET_ATTRIBUTES verwendet wird.

Daher brauchst du immer zumindet eine Variable von diesem Strukturtyp um über GET_ATTRIBUTES die benötigten Daten zu erhalten.
Auch wenn du mit CREATE DATA irgendetwas anderes instanzierst, wirst du im Anschluss beim Aufruf von GET_ATTRIBUTES eine Exception (INVALID_PARAMETER_TYPE oÄ) bekommen.

lg ADT

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

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: Dynamisch - ASSIGN COMPONENT

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Liebe(r) 1337,

ich fürchte fast, dass dieses Forum - zumindest momentan - deine Probleme nicht lösen kann.

Einerseits kämpfst du mit ABAP an sich - andererseits mit dem Modul Policenverwaltung in dem du scheinbar irgendetwas programmieren sollst
1337 hat geschrieben:
Unit605 hat geschrieben: Mit Deinen Broeckchen, die Du uns hier so nach und nach beschreibst, kann (fast) kein Mensch hier im Forum etwas anfangen.
Es tut mir leid, aber wie soll ich etwas exakt beschreiben, was ich selbst nicht verstehe? - verstehst du?
Ich versuche euch schon alle Informationen zu geben die ich habe.
und schlussendlich auch die Anforderungen an sich scheinen sich dir schon generell zu entziehen.

Du hast aber einen großen Vorteil wenn ich mir deinen Status anschaue: "Student". Als solche(r) darf man fragen - und zwar nicht nur in Foren wo das anonym geht sondern auch dort wo man dir die Programmieranweisungen zugeworfen hat. Erfahrung definiert sich nun mal nicht ausschließlich daraus, dass man schnell einen Code hinzaubern kann - sondern dazu gehört auch, dass man sich traut fehlendes Wissen einzugestehen und nachzufragen. Oder hinzunehmen dass eine Aufgabe den eigenen Horizont im Moment noch übersteigt.
Setze dich doch mal mit den Leuten zusammen, die dir die Aufgabe gegeben haben. Die sollten zumindest schon mal in der Lage sein den letzten Punkt genauer zu erklären damit du erstmal verstehst warum du etwas machst und was genau das Ziel ist. Danach suchst du dir vor Ort ein paar Kollegen, die schon länger im Geschäft und insbes. in den Modulen unterwegs sind und fragst nach Hilfestellungen.
Wenn das dann alles geklärt ist könntest du auch noch die F1-Hilfe benutzen und/oder deine Schulungsunterlagen/Scripte zu ABAP wälzen um auch im 1. Punkt voranzukommen.

Wenn das alles dann gemacht ist bin ich sicher, dass deine Frage schon viel "besser" sein werden und wir nicht mehr raten müssen was du vorhast. Denn momentan hindert dich dein eigenes Unverständnis der Aufgabe deine Fragen hinreichend zu formulieren.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
1337

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dynamisch - ASSIGN COMPONENT

Beitrag von 1337 (ForumUser / 99 / 33 / 0 ) »
Ich bin mir ziemlich sicher, dass es funktioniert - weil ich noch garnichts geändert habe.
Zuletzt geändert von 1337 am 09.12.2013 09:01, insgesamt 1-mal geändert.

Re: Dynamisch - ASSIGN COMPONENT

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
1337 hat geschrieben:
a-dead-trousers hat geschrieben:Ich glaub, dass es so wie du das gemacht hast, nicht funktionieren wird!
Ich bin mir ziemlich sicher, dass es funktioniert - weil ich noch garnichts geändert habe.
Okay, ja kann schon sein.
Aber sobald du irgendwas daran auf "/pm0/abdasubjct" änderst, wird die Schnittstelle nicht mehr funktionieren.

Schau dir mal meine Antwort bei
http://www.abapforum.com/forum/viewtopi ... 884#p68884
an.

Ich glaub das sollte ungefähr das umschreiben was du suchst.

Du fragst (wie bisher) die Schnittstelle mit "/pm0/abeasbtpers" ab.
Dann wandelst du mit der (neuen) Methode alles auf "/pm0/abdasubjct" um.
Im weiteren Verlauf arbeitest du dann nur noch mit "/pm0/abdasubjct".

ABER: Im Verwendungsnachweis wird nach wie vor die "/pm0/abeasbtpers" aufscheinen, weil du die eben wegen der Schnitstelle nicht weglassen kannst.

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

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: Dynamisch - ASSIGN COMPONENT

Beitrag von 1337 (ForumUser / 99 / 33 / 0 ) »
So langsam kommen wir dem ganzen glaube ich schon ziemlich nahe :)
Zuletzt geändert von 1337 am 09.12.2013 09:02, insgesamt 1-mal geändert.

Re: Dynamisch - ASSIGN COMPONENT

Beitrag von Somani (ForumUser / 81 / 12 / 20 ) »
Hallo

Ich hab sowas mal wie folgt gemacht

Code: Alles auswählen.

data:       lo_struc      type ref to cl_abap_structdescr,
            lo_table      type ref to cl_abap_tabledescr,
            lo_data       type ref to data.

field-symbols: <lt_list> type standard table,
               <lt_data> type any table.

* 'ls_config-strucname' beinhaltet den Strukturname aus dem DDIC der hier genutzt werden soll.
lo_struc ?= cl_abap_structdescr=>describe_by_name( ls_config-strucname ).
lo_table = cl_abap_tabledescr=>create( lo_struc ).

create data lo_data type handle lo_table.
assign lo_data->* to <lt_list>.
Vieleicht hilft dir das ja weiter.

Folgende Benutzer bedankten sich beim Autor Somani für den Beitrag:
1337


Re: Dynamisch - ASSIGN COMPONENT

Beitrag von 1337 (ForumUser / 99 / 33 / 0 ) »
Leider nicht so wirklich.

Das ganze unterscheidet sich schon daran, dass du ein einfaches ASSIGN benutzt und ich wohl ASSIGN COMPONENT benötige.

Wobei mir unklar ist was die compnent sein soll. Die F1 Hilfe hat mich da nicht wirklich weiter gebracht.

Trotzdem danke :)

Re: Dynamisch - ASSIGN COMPONENT

Beitrag von Somani (ForumUser / 81 / 12 / 20 ) »
Das component ist das einzelne Feld aus einer Struktur.

Wenn du den Feldnamen kennst, dann

Code: Alles auswählen.

assign component 'FIELDNAME' of structure <struc> to <fs>. " Dabei kann <struc> dynamisch sein - macht aber imo wenig Sinn, denn dann wüsstest du den Feldnamen ja nicht. / <fs> ist vom type any.
alternativ kann da auch nur ein index sein

Code: Alles auswählen.

assign component 1 of structure <struc> to <fs>.  "1 wäre dann einfach das erste Feld - da kannst dann z.B. mit ner schlaufe arbeiten bis du alle Felder durch hast - oder natürlich die lo_data-> nutzen (alternativ auch das ddic auslesen)
So komplett dynamisch arbeiten ist meiner Erfahrung nach vor allem dann angebracht, wenn man ein generisches Programm hat das die Daten von unterschiedlichsten Quellen in den unterschiedlichsten Strukturen bekommt. Wenn die Inhalte und Strukturen immer gleich sind, dann lieber mit direkter Typenzuordnung arbeiten - das ist dann auch performanter (type any ist weniger schnell wie type t001w z.B.).

Ich hab bei mir die Product Engine (glaube, dass /pm0/ das ist) leider nicht drauf, daher kann ich die Bausteine nicht anschauen - aber wichtig ist natürlich was bereits gesagt wurde; Du kannst nicht lokal eine Struktur erweitern die dann für die Bausteine gebraucht wird. Veränderst du ls_subj im laufe des Codes (nach der zuweisung ls_subj = <ls_sub>).

Code: Alles auswählen.

assign component '/PM0/ABDASUBJECT_OID' of structure ls_subj to <fs>. " und dann <fs> dem iv_oid zuweisen.
Was hat iv_oid denn für einen Typ? Wahrscheinlich jetzt den selben Typen wie das Feld /pm0/abdasbjct_oid aus der ls_subj - da das eh nicht anders sein darf, kannst dann das <fs> direkt dem Datentyp zuweisen und nicht any (performance - in dem kleinen Beispiel zwar nicht messbar^^).

Freundliche Grüsse

Folgende Benutzer bedankten sich beim Autor Somani für den Beitrag:
1337


Re: Dynamisch - ASSIGN COMPONENT

Beitrag von 1337 (ForumUser / 99 / 33 / 0 ) »
Wow.
Ich glaube ich habe es (besser) verstanden.
Zuletzt geändert von 1337 am 09.12.2013 09:03, insgesamt 1-mal geändert.

Re: Dynamisch - ASSIGN COMPONENT

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
1337 hat geschrieben:Wozu dient <fs_infrd_type> = ls_infrd-pm_id bzw.
Wenn man ein Datenelement (zur Designtime) nicht kennt kann man mit Feld-Symbolen vom Typ ANY trotzdem darauf zugreifen.
In diesem Fall eben auf das Feld INFLRIDPM_ID der Struktur <FS_STRUC> von der man den (detailierten) Aufbau nicht kennt, aber weiß, dass es zumindest dieses eine Feld geben muss.
1337 hat geschrieben:wieso übergebe ich den Inhalt des Feldsymbols ausgerechnet an pm-id?
Du denkst verkehrt.
Dem Feldsymbol <FS_INFRD_TYPE> wird der Wert von PM-ID zugewiesen. Somit landet der Wert im Feld INFLRIDPM_ID der Stuktur <FS_STRUC>.
(Eine Zuweisung mit = erfolgt immer von rechts nach links)

lg ADT

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

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: Dynamisch - ASSIGN COMPONENT

Beitrag von 1337 (ForumUser / 99 / 33 / 0 ) »
Super - danke :)
Zuletzt geändert von 1337 am 09.12.2013 09:03, insgesamt 1-mal geändert.

Re: Dynamisch - ASSIGN COMPONENT

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
1337 hat geschrieben:Woher soll ich wissen welche Struktur ich habe bzw. welches Feld ich füllen möchte? - bezogen auf meine eigentliche Klasse die ich ändern möchte
Tja, da kann ich dir nicht wirklich weiterhelfen. Das muss eigentlich im Änderungsauftrag festgehalten sein.
Du kannst aber, wie ich schon erwähnt hab, zur Laufzeit mittels RTTI herausfinden, um welche Struktur es sich bei <FS_STRUC> handelt und welche Felder sie besitzt.
1337 hat geschrieben:Das hat aber nichts damit zu tun, dass irgendwelche (neuen) Felder zur Laufzeit erstellt und gefüllt werden oder?
Naja, kommt darauf an mit welchem Feld/Struktur das Feldsymbol verknüpft ist.
(Stell dir ein Feldsymbol einfach als eine Art Zeiger wie in C vor.)

lg ADT

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

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: Dynamisch - ASSIGN COMPONENT

Beitrag von 1337 (ForumUser / 99 / 33 / 0 ) »
Ich kenne nur Java :P

Danke trotzdem schonmal, du hast mir sehr geholfen :)
Zuletzt geändert von 1337 am 09.12.2013 09:03, insgesamt 1-mal geändert.

Re: Dynamisch - ASSIGN COMPONENT

Beitrag von Somani (ForumUser / 81 / 12 / 20 ) »
1337 hat geschrieben:Ich kenne nur Java :P
Dann halt eine etwas bessere Referenz :)

Das Field-Symbol ist kein eigenes "Gefäss".

Wenn du also die ls_mara-matnr zu <matnr> assignest, dann tun sich alle Änderungen die du an <matnr> tätigst SOFORT und UNVERZÜGLICH in ls_mara-matnr wiederspiegeln.
Fieldsymbole sind vor allem dann sehr interessant wenn du z.B. eine Zeile aus einer Tabelle liest oder beim Loopen daten veränderst, dann brauchst du anschliessend keine Modify-geschichte zu tätigen.

Man muss sich immer überlegen ob man das will oder ob dann nicht doch lieber ne Struktur (à la 'like line of') nicht doch geeigneter wäre - z.B. für Rollback-Szenarien (einfach dann des modify net machen).

(http://en.wikipedia.org/wiki/Pointer_%28computing%29)

Vergleichbare Themen

10
Antw.
4004
Views
Fehler bei Dynamische Assign Component
von Anita57 » 19.08.2013 11:54 • Verfasst in ABAP® für Anfänger
1
Antw.
1179
Views
Fehler bei Dynamische Assign Component
von Anita57 » 19.08.2013 11:54 • Verfasst in ABAP® für Anfänger
1
Antw.
2335
Views
Field-symbols Assign-Component
von vincent_36 » 01.12.2005 18:28 • Verfasst in ABAP® Core
1
Antw.
1049
Views
Problem bei ASSIGN COMPONENT mit dynamischer Typisierung
von Luca2501 » 17.09.2020 11:09 • Verfasst in ABAP® Core
2
Antw.
3079
Views
Dynamisch erzeugte ITAB, ASSIGN, wie kriege ich die Struktur
von enneos » 12.07.2007 16:10 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Fiori App aus dem Launchpad aufrufen
vor einer Stunde von Bright4.5 2 / 8
alv_grid aktualisieren
vor 3 Stunden von Egzon gelöst 4 / 80
SELECT CHAR16 in CHAR12-Feld
vor 12 Stunden von Shortcut IT 3 / 42

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.

Aktuelle Forenbeiträge

Fiori App aus dem Launchpad aufrufen
vor einer Stunde von Bright4.5 2 / 8
alv_grid aktualisieren
vor 3 Stunden von Egzon gelöst 4 / 80
SELECT CHAR16 in CHAR12-Feld
vor 12 Stunden von Shortcut IT 3 / 42

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 170