Code: Alles auswählen.
CLASS lcl_dd_helper DEFINITION INHERITING FROM cl_gui_html_viewer.
PUBLIC SECTION.
CLASS-METHODS:
test IMPORTING io_viewer TYPE REF TO cl_gui_html_viewer
iv_element_id TYPE sdydo_element_name
RETURNING VALUE(rv_data) TYPE string,
handle_sapevent FOR EVENT sapevent OF cl_gui_html_viewer IMPORTING postdata.
PRIVATE SECTION.
CLASS-DATA: mt_postdata TYPE cnht_post_data_tab.
ENDCLASS.
CLASS lcl_dd_helper IMPLEMENTATION.
METHOD test.
DATA: lt_source TYPE tsfxsftag,
lv_postdata TYPE string.
APPEND ' function test() { ' TO lt_source.
* APPEND ' window.alert(window.frames[0].document.forms[0].name); ' TO lt_source.
APPEND ' window.frames[0].document.forms[0].submit( ); ' TO lt_source.
* APPEND ' window.alert("window.alert ");' TO lt_source.
APPEND ' }' TO lt_source.
APPEND ' window.test( );' TO lt_source.
io_viewer->set_script( script = lt_source[] ).
io_viewer->execute_script( ).
SET HANDLER handle_sapevent FOR io_viewer ACTIVATION 'X'.
io_viewer->dispatch( eventid = cl_gui_html_viewer=>m_id_sapevent
cargo = space
is_shellevent = space
).
SET HANDLER handle_sapevent FOR io_viewer ACTIVATION ' '.
LOOP AT mt_postdata ASSIGNING FIELD-SYMBOL(<lv_postdata>).
lv_postdata = |{ lv_postdata }{ <lv_postdata> }|.
ENDLOOP.
SPLIT lv_postdata AT '&' INTO TABLE DATA(lt_postdata).
LOOP AT lt_postdata ASSIGNING FIELD-SYMBOL(<ls_postdata_element>).
SPLIT <ls_postdata_element> AT '=' INTO DATA(lv_element) DATA(lv_cargo).
IF lv_element = iv_element_id.
rv_data = lv_cargo.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD handle_sapevent.
mt_postdata = postdata.
ENDMETHOD.
ENDCLASS.
Code: Alles auswählen.
data(lv_element_data) = lcl_dd_helper=>test( io_viewer = dd_document->html_control
iv_element_id = input_dd_element->id )
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ewx
puh. wie bekomme ich denn das input Feld in meinem DOM zu fassen?black_adept hat geschrieben: ↑28.09.2021 15:03Code: Alles auswählen.
APPEND ' window.frames[0].document.forms[0].submit( ); ' TO lt_source.
Code: Alles auswählen.
window.frames[0].document.A1T2C2F2.submit( );
Code: Alles auswählen.
data(lv_element_data) = lcl_dd_helper=>test( io_viewer = dd_document->html_control
iv_element_id = input_dd_element->id )
Sehe ich anders. Die DD-Elemente bauen etwas Dynpro-ähnliches auf ( siehe SE80, der obere Bereich wo man den Namen des Objekts eingibt). D.h., dass die Seite üblicherweise statisch schon lange aufgebaut ist und der User jetzt Eingaben machen kann. Die dargestellten Daten sind dem Programm bekannt - schließlich hat es das das DD-Dokument erstellt. Aber diese Usereingaben stehen schon bei SET_SCRIPT zur Verfügung, wenn der User auf einen (Dynpro)-Button außerhalb des DD-Formulars klickt.a-dead-trousers hat geschrieben: ↑28.09.2021 19:45Eine kleine Anmerkung noch zur Lösung von black_adept:
SET_SCRIPT_ON_ABAP_COMPLETE ist meiner Meinung nach dem SET_SCRIPT vorzuziehen, weil es etwas verzögert ausgelöst wird, sodass dem HTML-Control auf der Client-seite etwas mehr Zeit für den Aufbau der Seite bleibt. Wenn ,man so wie ich oft auch noch JQuery oder ähnliches im HTML-Teil einsetzt, ist meistens auch noch ein Timeout vor dem eigentlichen SUBMIT notwendig, damit die API auch genug Zeit hatte alles zu "initialisieren".
Der HTML-Viewer führt das Script, welches mit SET_SCRIPT gesetzt wird erst mit dem DISPATCH aus. Mein Lösungsvorschlag triggert den Dispatch "falsch" an, so dass die "normale" Eventverarbeitung des HTML-Controls es nicht schafft, die POST-Daten an die DD-Objekte weiterzureichen, die sich registriert haben um einen Abgleich der Formulardaten mit den internen DD-Attributen zu schaffen, so dass diese "fremden" Eventsubscriber leer ausgehen, wohingegen. Schade eigentlich - hatte erst gedacht das damit machen zu können und damit quasi ein Flush der DD-Objekte zu erzwingen.a-dead-trousers hat geschrieben: ↑28.09.2021 19:45dass man ja auf das Event vom HTML-Control "warten" muss. Da das den PAI/PBO Lauf "unterbricht" muss man eine Möglichkeit schaffen wie man die angestrebte Funktions(code)verarbeitung "nach" die Eventverarbeitung bekommt
Bin jetzt wieder aufewx hat geschrieben: ↑28.09.2021 16:46so geht's:Blöd nur, weil die ID's generiert werden. das heißt, sobald ein neues Eingabefeld davor kommt, funktioniert es wahrscheinlich nicht mehr... :(Code: Alles auswählen.
window.frames[0].document.A1T2C2F2.submit( );
Code: Alles auswählen.
APPEND ' window.frames[0].document.forms[0].submit( ); ' TO lt_source.