Code: Alles auswählen.
REPORT Z_AUFGABE1_WOSSNER_B.
TYPES: BEGIN OF ty_struct1, "Struktur erstellen
feld1 TYPE matnr,
feld2 TYPE maktx,
feld3 TYPE werks_d,
END OF ty_struct1.
DATA: zvl_best_verlauf_matnr TYPE matnr, "Definieren von Variablen (Allgemein)
zvl_best_verlauf_maktx TYPE maktx,
zvl_best_verlauf_ersda TYPE ersda,
zvl_best_verlauf_spras TYPE spras,
zvl_best_verlauf_mtart TYPE mtart,
zvl_best_verlauf_werks TYPE werks_d,
lt_result TYPE TABLE OF ty_struct1,
ls_result TYPE ty_struct1,
TOP_LINE TYPE i,
gd_maktx TYPE maktx,
gd_matnr TYPE matnr,
gd_index TYPE i.
gd_index = 1.
DATA: ok_code TYPE sy-ucomm, "Definieren von Variablen (Button Dynpro)
save_ok LIKE ok_code.
CONTROLS DYNPRO_TABLE TYPE TABLEVIEW USING SCREEN 1001.
AUTHORITY-CHECK OBJECT 'M_MATE_STA' "Materialstamm Zugrif
ID 'ACTVT' FIELD '03' "'3' = Anzeigen
ID 'STATM' DUMMY. "Pflegestatus (unwichtig)
IF sy-subrc NE 0.
MESSAGE: 'Berechtigung nicht vorhanden' TYPE 'E'. "Error Ausgabe
ELSE.
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-se1.
SELECT-OPTIONS:
material FOR zvl_best_verlauf_matnr, "Selection Screen 'Materialnummer'
beschr FOR zvl_best_verlauf_maktx NO INTERVALS NO-EXTENSION, "Selection Screen 'Artikelbezeichnung'
art FOR zvl_best_verlauf_mtart NO INTERVALS NO-EXTENSION, "Selection Screen 'Materialart'
werk FOR zvl_best_verlauf_werks NO INTERVALS NO-EXTENSION, "Selection Screen 'Werk'
language FOR zvl_best_verlauf_spras NO INTERVALS NO-EXTENSION DEFAULT 'DE', "Selection Screen 'Sprache'
date FOR zvl_best_verlauf_ersda NO INTERVALS NO-EXTENSION. "Selection Screen 'Erstelldatum'
CALL SCREEN '1001'. "Aufrufen des Dynpros
SELECTION-SCREEN END OF BLOCK BLOCK1.
ENDIF.
*IF language is INITIAL. "Copy and Paste ^^ #unnötig
* DATA language_line LIKE LINE OF language.
* language_line-low = sy-langu.
* language_line-sign = 'I'.
* language_line-option = 'EQ'.
* APPEND language_line TO language.
* ENDIF.
MODULE load_data OUTPUT. "Module (Daten aus Mara auslesen)
SELECT mara~matnr, makt~maktx
FROM mara
INNER JOIN makt ON makt~matnr = mara~matnr "Matnr in Mara und Makt vorhanden
INTO TABLE @lt_result
UP TO 100 ROWS "Begrenzen der Datenmenge
WHERE mara~matnr In @material
AND makt~maktx In @beschr
AND ersda In @date
AND mtart In @art
AND makt~spras In @language.
SELECT marc~werks
FROM marc
INTO CORRESPONDING FIELDS OF TABLE lt_result
WHERE werks IN werk.
ENDMODULE.
MODULE user_command_0100 INPUT. "Module (Dynpro Button: Return, Exit)
save_ok = ok_code.
CLEAR ok_code. "'ok_code' leeren (Sicher gehen)
CASE save_ok.
WHEN 'BUTTON_EXIT'.
LEAVE PROGRAM. "Programm beenden
WHEN 'BUTTON_RETURN'.
CALL SELECTION-SCREEN 1000. "Selection Screen aufrufen
ENDCASE.
ENDMODULE.
MODULE read_data OUTPUT.
READ TABLE lt_result INTO ls_result INDEX GD_INDEX. "Daten in Workarea übergeben
gd_matnr = ls_result-feld1. "Globalen Variablen Werte zu ordnen
gd_maktx = ls_result-feld2.
EXIT.
ENDMODULE.
MODULE change_index OUTPUT.
CASE sy-ucomm.
WHEN 'BUTTON_NEXT'.
* CHECK gd_index >= ROWS.
gd_index = gd_index + 1. "gd_index um 1 erhöhen
READ TABLE lt_result INTO ls_result INDEX GD_INDEX. "Erneutes Ausführen von Read_Data
gd_matnr = ls_result-feld1.
gd_matnr = ls_result-feld2.
When 'BUTTON_PREVIOUS'.
CHECK gd_index > 1. "Verhindern von einem gd_index von > 1
gd_index = gd_index - 1. "gd_index um 1 erniedrigen
READ TABLE lt_result INTO ls_result INDEX gd_index. "Erneutes Ausführen von Read_Data
gd_matnr = ls_result-feld1.
gd_maktx = ls_result-feld2.
ENDCASE.
ENDMODULE.
Code: Alles auswählen.
TYPES: BEGIN OF ty_struct1, "Struktur erstellen
matnr TYPE matnr,
maktx TYPE maktx,
werks TYPE werks_d,
END OF ty_struct1.
Code: Alles auswählen.
TYPES: ...
DATA: ...
CONTROLS ...
SELECTION-SCREEN BEGIN OF BLOCK ...
SELECTION-SCREEN END OF BLOCK ...
INITIALIZATION.
AUTHORITY-CHECK OBJECT 'M_MATE_STA'
ID 'ACTVT' FIELD '03'
ID 'STATM' DUMMY.
IF sy-subrc NE 0.
MESSAGE: 'Berechtigung nicht vorhanden' TYPE 'E'. "Error Ausgabe
ENDIF.
START-OF-SELECTION.
SELECT ...
GD_INDEX = 1.
CALL SCREEN ...
MODULE user_command_0100.
save_ok = ok_code.
CLEAR ok_code. "'ok_code' leeren (Sicher gehen)
CASE save_ok.
WHEN 'BUTTON_EXIT'.
LEAVE PROGRAM. "Programm beenden
WHEN 'BUTTON_RETURN'.
LEAVE SCREEN. "Aktuelles Dynpro verlassen
ENDCASE.
ENDMODULE.
MODULE read_data...
MODULE change_index...
Mach ich dankea-dead-trousers hat geschrieben:Wie ich dir auch schon in deinem vorherigen Post gesagt habe:
Nimm BITTE das CALL SELECTION-SCREEN 1000 raus. Du handelst dir damit nur Probleme ein. Korrekt ist LEAVE SCREEN.
Code: Alles auswählen.
REPORT.
PARAMETERS p_i TYPE i.
WRITE:/ sy-uzeit.
Code: Alles auswählen.
REPORT.
WRITE:/ sy-uzeit.
PARAMETERS p_i TYPE i.
Code: Alles auswählen.
REPORT.
END-OF-SELECTION.
WRITE:/ 'END-OF-SELECTION.'.
START-OF-SELECTION.
WRITE:/ 'START-OF-SELECTION.'.
END-OF-SELECTION.
WRITE:/ 'END-OF-SELECTION.'.
Sieht aktuell wie folgt aus:a-dead-trousers hat geschrieben:Deswegen ja meine Hinweis mit den Report-Ereignissen und der Aufteilung.
Normalerweise wird beim Aufruf des Reports automatisch Dynpro 1000 aufgerufen.
Durch F8 (Ausführen) wird dann die Verarbeitung von START-OF-SELECTION bzw. END-OF-SELECTION aufgerufen.
Danach erfolgt automatisch wieder der Rücksprung auf das Dynpro 1000.
Durch den CALL SCREEN 1001 wird nun ein neues Dynpro aufgerufen und wenn du dort dann CALL SELECTION-SCREEN 1000 machst wird wieder das Dynpro 1000 aufgerufen.
Das geht ca. 5 bis 10 Mal gut, dann kommt ein Kurzdump. Der Dynpro-Stack schaut dann so aus: 1000->1001->1000->1001->1000 usw.
Warum die Rückkehr mit LEAVE SCREEN bei dir nicht funktioniert ist wahrscheinlich dem Umstand geschuldet, dass du das CALL SCREEN im SELECTION-SCREEN bzw. in einem IF defniert hast.
Stell dir die SELECTION-SCREEN Anweisungen als globale Datendefinition vor. Daherum ein IF zu bauen bringt nix bzw. kann zu Fehlern führen.
Ich geb zu die Report-Ereignisse sind ein Überbleibsel aus der Steinzeit von ABAP, sind aber bei Reports (leider) nach wie vor State-Of-The-Art. Also mach dich damit etwas besser vertraut und setze sie korrekt ein.
lg ADT
Code: Alles auswählen.
AUTHORITY-CHECK OBJECT 'M_MATE_STA' "Materialstamm Zugrif
ID 'ACTVT' FIELD '03' "'3' = Anzeigen
ID 'STATM' DUMMY. "Pflegestatus (unwichtig)
IF sy-subrc NE 0.
MESSAGE: 'Berechtigung nicht vorhanden' TYPE 'E'. "Error Ausgabe
ELSE.
ENDIF.
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-se1.
SELECT-OPTIONS:
material FOR zvl_best_verlauf_matnr, "Selection Screen 'Materialnummer'
beschr FOR zvl_best_verlauf_maktx NO INTERVALS NO-EXTENSION, "Selection Screen 'Artikelbezeichnung'
art FOR zvl_best_verlauf_mtart NO INTERVALS NO-EXTENSION,
werk FOR zvl_wrk_material_werks NO INTERVALS NO-EXTENSION, "Selection Screen 'Materialart'
language FOR zvl_best_verlauf_spras NO INTERVALS NO-EXTENSION DEFAULT 'DE', "Selection Screen 'Sprache'
date FOR zvl_best_verlauf_ersda NO INTERVALS NO-EXTENSION. "Selection Screen 'Erstelldatum'
SELECTION-SCREEN END OF BLOCK BLOCK1.
CALL SCREEN '1001'. "Aufrufen des Dynpros
Code: Alles auswählen.
REPORT Z_AUFGABE1_WOSSNER_B.
TYPES: BEGIN OF ty_struct1, "Struktur erstellen
matnr TYPE matnr,
maktx TYPE maktx,
werks TYPE werks_D,
END OF ty_struct1.
DATA: zvl_best_verlauf_matnr TYPE matnr, "Definieren von Variablen (Allgemein)
zvl_best_verlauf_maktx TYPE maktx,
zvl_best_verlauf_ersda TYPE ersda,
zvl_best_verlauf_spras TYPE spras,
zvl_best_verlauf_mtart TYPE mtart,
zvl_wrk_material_werks TYPE werks_d,
lt_result TYPE TABLE OF ty_struct1,
ls_result TYPE ty_struct1,
lt_authen TYPE TABLE OF ty_struct1,
ls_authen TYPE ty_struct1,
TOP_LINE TYPE i,
GD_MAKTX TYPE maktx,
GD_MATNR TYPE matnr,
GD_INDEX TYPE i.
GD_INDEX = 1.
DATA: ok_code TYPE sy-ucomm, "Definieren von Variablen (Button Dynpro)
save_ok LIKE ok_code.
CONTROLS DYNPRO_TABLE TYPE TABLEVIEW USING SCREEN 1001.
LOOP AT lt_authen INTO ls_authen.
ENDLOOP.
AUTHORITY-CHECK OBJECT 'M_MATE_WRK' "Werk Zugriff
ID 'ACTVT' FIELD '03' "'3' = Anzeigen
ID 'WERKS' FIELD ls_authen-werks.
IF sy-subrc NE 0.
MESSAGE: 'Berechtigung nicht vorhanden' TYPE 'E'. "Error Ausgabe
ELSE.
ENDIF.
Code: Alles auswählen.
LOOP AT lt_authen INTO ls_authen.
ENDLOOP.
AUTHORITY-CHECK OBJECT 'M_MATE_WRK' "Werk Zugriff
ID 'ACTVT' FIELD '03' "'3' = Anzeigen
ID 'WERKS' FIELD ls_authen-werks.
IF sy-subrc NE 0.
MESSAGE: 'Berechtigung nicht vorhanden' TYPE 'E'. "Error Ausgabe
ELSE.
ENDIF.
Jo hab seit dem Zeitpunkt ABAP. Natürlich kann ich Kollegen fragen, jedoch ist der Kollege krank und die anderen dauerhaft in Terminen, was das Ganze nicht vereinfacht. Darum frage ich ja hier schließlich ist es ja so: Fragen kostet nichts.abuma hat geschrieben:Soweit ich das sehe beschäftigst du effektiv seit dem 10.01.2017 mit ABAP?
http://www.abapforum.com/forum/viewtopi ... 696#p80696
Wie lange hast du denn Zeit deine Aufgabe zu bearbeiten?
Kannst du solche Themen nicht auch mit Kollegen besprechen?
Soweit ich das verstehe, müsstest du alle Datensätze zu der der User keine Berechtigung hat überspringen.
Derzeit frägst du in deinem Coding allerdings den letzten Datensatz ab und machst darauf eine Berechtigungsprüfung:Den Loop verstehe ich an dieser Stelle nicht wirklich, da du wie oben bereits erwähnt die Tabelle komplett durchläufst und am Ende sozusagen nur den letzten Datensatz ausliest und die Berechtigungsprüfung daraufhin durchführst.Code: Alles auswählen.
LOOP AT lt_authen INTO ls_authen. ENDLOOP. AUTHORITY-CHECK OBJECT 'M_MATE_WRK' "Werk Zugriff ID 'ACTVT' FIELD '03' "'3' = Anzeigen ID 'WERKS' FIELD ls_authen-werks. IF sy-subrc NE 0. MESSAGE: 'Berechtigung nicht vorhanden' TYPE 'E'. "Error Ausgabe ELSE. ENDIF.
Ich hätte die ganze Thematik am Anfang meiner Ausbildung ehrlich gesagt nicht verstanden, da es einfach alles noch zu viel ist, wenn man keine Erfahrung mit ABAP bzw. auch SAP hat.
Als erstes sollte man sich die Zeit nehmen und alles was man nicht versteht nachlesen oder Kollegen hinzuziehen, die einem solche Dinge zeigen und erklären.
Fragen kostet nichts, so ist es zumindest bei mir in der Firma.
Liebe Grüße
abuma
Code: Alles auswählen.
* Datendeklaration
TYPES: BEGIN OF ty_result_str,
matnr TYPE matnr,
maktx TYPE maktx,
werks TYPE werks_d,
END OF ty_result_str.
DATA: ls_result TYPE ty_result_str,
lt_result LIKE TABLE OF ls_result.
* Selektionsmaske
SELECTION-SCREEN BEGIN OF BLOCK blocka.
SELECT-OPTIONS: so_matnr FOR ls_result-matnr,
so_maktx FOR ls_result-maktx,
so_werks FOR ls_result-werks.
SELECTION-SCREEN END OF BLOCK blocka.
* Selektion
START-OF-SELECTION.
" Auslesen von Tabelle MARA, MAKTX und WERKS
" mit SELECT - ENDSELECT
SELECT mara~matnr, makt~maktx, marc~werks
FROM mara INNER JOIN makt
ON mara~matnr = makt~matnr
INNER JOIN marc
ON mara~matnr = marc~matnr
INTO CORRESPONDING FIELDS OF @ls_result
UP TO 100 ROWS
WHERE mara~matnr IN @so_matnr
AND makt~maktx IN @so_maktx
AND marc~werks IN @so_werks.
* Berechtigungspruefung
AUTHORITY-CHECK OBJECT 'M_MATE_WRK' "Werk Zugriff
ID 'ACTVT' FIELD '03' "'3' = Anzeigen
ID 'WERKS' FIELD ls_result-werks.
IF sy-subrc = 0.
" Berechtigung fuer dieses Werk ist vorhanden -> Eintrag in Ergebnistabelle uebernehmen
APPEND ls_result TO lt_result.
ENDIF.
ENDSELECT.
END-OF-SELECTION.
* Ergebnis-Ausgabe
LOOP AT lt_result INTO ls_result.
WRITE:/ ls_result-matnr, ' | ', ls_result-maktx, ' | ', ls_result-werks.
ENDLOOP.
Wie ist das gemeint?:) Ich muss halt jeden Datensatz überprüfen ob dieser in dem Werk angelegt wurde. Vielen Dank für deine Hilfeabuma hat geschrieben: Wenn du deine Prüfung pro Werk benötigst, dann muss du die Berechtigungsprüfung innerhalb von START-OF-SELECTION und END-OF-SELECTION machen.
Vergleiche nachfolgendes Programm:
Lege mein Beispielprogramm mal in der SE38 an.Schäfer_anfänger hat geschrieben:Wie ist das gemeint?:) Ich muss halt jeden Datensatz überprüfen ob dieser in dem Werk angelegt wurde. Vielen Dank für deine Hilfeabuma hat geschrieben: Wenn du deine Prüfung pro Werk benötigst, dann muss du die Berechtigungsprüfung innerhalb von START-OF-SELECTION und END-OF-SELECTION machen.
Vergleiche nachfolgendes Programm: