Alle Deklarationen in FORM Routinen ermitteln

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
34 Beiträge • Seite 1 von 3 (current) Nächste
34 Beiträge Seite 1 von 3 (current) Nächste

Alle Deklarationen in FORM Routinen ermitteln

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Moin.
Ich suche einen Baustein ,Klasse oder Coding, welche die LOKAL deklarierten Variablen und ihre Typen ermittelt.
Globale Definitionen ermitteln löse ich mit dem Baustein GET_GLOBAL_SYMBOLS.
(DESCRIBE FIELD INTO wäre eine Option.)
Im Grunde brauche ich so etwas für lokale Definitionen.

Hintergrund: Wir haben den ATC (Another tool to Torture Coders) aktiviert und Ende des Jahres, wird Dieser bei uns auch Transporte verhindern, so die Datendeklartionen nicht den Entwicklungsrichtlinien entsprechen.
(Als hätte man das nicht auch in den Pretty Printer integrieren können.)
Ein guter Grund Gegenmassnahmen einzuleiten und zwar in Form eines Reports der Lösungscodings vorschlägt.
Ich habe das soweit zusammen, so das ich mich derzeit mit den "Lokalen Meckereien" rumschlage.
gruß Jens
Jens stellt fest/ hat geschrieben:Ist Euch schon mal augefallen, das Regeln immer von Menschen gemacht werden, die Diese nicht zu befolgen haben ? ( findet meine Tochter übrigens auch .... ???? )
Zuletzt geändert von Tron am 07.10.2019 13:45, insgesamt 6-mal geändert.
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

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


Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von ewx (Top Expert / 4846 / 311 / 642 ) »
In diesem Beitrag werden FORM-Routinen ermittelt. Da müsste man auch einigermaßen einfach die lokalen Variablendefinitionen auslesen können.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Tron


Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von jocoder (Specialist / 343 / 3 / 102 ) »

Code: Alles auswählen.

SCAN ABAP-SOURCE itab WITH DECLARATIONS
könnte eine möglich Lösung darstellen.

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag:
Tron


Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Moin Jens,

verwendet der ATC denn nicht den CodeInspector um die Namenskonventionen zu prüfen? Lasst doch "einfach" den SCI über die fraglichen Programme laufen. Wenn ich mich recht entsinne gibt der SCI einen Hinweis wie die böse Varible heißt und welches Namensprüfobjekt ( GLODAT, LOCDAT, .... ) verwendet wurde.
Was brauchst du denn noch mehr als das was dir SAP im Standard bietet?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Moin Stefan.
Beispiel für das Ergebnis des ATC
000.png
Ich erfahre so nicht, welchen Typ die Variable hat und kann so nicht den Prefix zum Variablennamen vorschlagen.
z.B. JOB_OUTPUT_INFO ist TYPE ssfcrescl / eine Struktur .
Somit müßte JOB_OUTPUT_INFO zu LS_JOB_OUTPUT_INFO werden.

gruß Jens
Beispiel für ein Ergebnisvorschlag die geänderten Zeilen sind mit @TC:
markiert.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  ZATC_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
* method if_Satc_Result_Access_Svc~select_All_In_Ext_Field_List.
*
*    data:
*      l_Desc  type ref to cl_Abap_Structdescr,
*      l_Comp  type abap_Componentdescr.
*
*    field-symbols <l_Comp> type any.
*
*    l_Desc ?= cl_Abap_Typedescr=>describe_By_Data( c_Ext_Field_List ).
*
*    loop at l_Desc->get_Components( ) into l_Comp.
*      assign component l_Comp-name of structure c_Ext_Field_List to <l_Comp>.
*      <l_Comp> = 'X'.
*    endloop.
*
*  endmethod.


REPORT zatc_test.

DATA:
  gv_fm_name      TYPE rs38l_fnam, "@TC corr:L_FM_NAME
  gv_formname     TYPE fpname VALUE 'ZSD_MARK_PDF', "@TC corr:L_FORMNAME
  gs_docparams    TYPE sfpdocparams, "@TC corr:FP_DOCPARAMS
  gs_formoutput   TYPE fpformoutput, "@TC corr:FP_FORMOUTPUT
  gs_outputparams TYPE sfpoutputparams. "@TC corr:FP_OUTPUTPARAMS



CONSTANTS gc_xcon(1) VALUE 'X'."@TC corr:XCON(1)

DATA git_txtable TYPE TABLE OF vbak."@TC corr:TXTABLE
DATA git_sxstru TYPE vbak."@TC corr:SXSTRU

DATA zgit_txtable TYPE TABLE OF vbak WITH HEADER LINE."@TC corr:TXTABLE


DATA gv_opt TYPE vbak-vbeln."@TC corr:R_OPT

FIELD-SYMBOLS <gfs_p> TYPE vbak-vbeln."@TC corr:<P>

RANGES git_trang FOR gv_opt."@TC corr:TRANG"@TC corr:R_OPT


PARAMETERS p_vbeln TYPE likp-vbeln DEFAULT '65809588'.

SELECT-OPTIONS so_s_opt FOR gv_opt."@TC corr:R_OPT"@TC corr:S_OPT


START-OF-SELECTION.
  PERFORM f_get_function_module."@TC corr:GET_FUNCTION_MODULE

*&---------------------------------------------------------------------*
*&      Form  F_GET_FUNCTION_MODULE"@TC corr:GET_FUNCTION_MODULE
*&---------------------------------------------------------------------
FORM f_get_function_module ."@TC corr:GET_FUNCTION_MODULE

  gs_outputparams-nodialog = 'X'."@TC corr:FP_OUTPUTPARAMS
  gs_outputparams-preview = 'X'."@TC corr:FP_OUTPUTPARAMS
  gs_outputparams-dest = 'LOCL'."@TC corr:FP_OUTPUTPARAMS

  gs_outputparams-pdfchangesrestricted = 'F'."@TC corr:FP_OUTPUTPARAMS
*  fp_outputparams-copies = '4'.

  CALL FUNCTION 'FP_JOB_OPEN'
    CHANGING
      ie_outputparams = gs_outputparams "@TC corr:FP_OUTPUTPARAMS
    EXCEPTIONS
      cancel          = 1
      usage_error     = 2
      system_error    = 3
      internal_error  = 4
      OTHERS          = 5.

  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN OTHERS.
    ENDCASE.                           " CASE sy-subrc
  ENDIF.

  CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
    EXPORTING
      i_name     = gv_formname "@TC corr:L_FORMNAME
    IMPORTING
      e_funcname = gv_fm_name. "@TC corr:L_FM_NAME


  DATA:
    document_output_info TYPE ssfcrespd,
    job_output_info      TYPE ssfcrescl,
    job_output_options   TYPE ssfcresop.



  CALL FUNCTION gv_fm_name "@TC corr:L_FM_NAME
    EXPORTING
*     /1BCDWB/DOCPARAMS        =
      i_vbeln        = p_vbeln
* IMPORTING
*     /1BCDWB/FORMOUTPUT       =
    EXCEPTIONS
      usage_error    = 1
      system_error   = 2
      internal_error = 3
      OTHERS         = 4.


  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN OTHERS.
    ENDCASE.                           " CASE sy-subrc
  ENDIF.                               " IF sy-subrc <> 0

  CALL FUNCTION 'FP_JOB_CLOSE'
*   IMPORTING
*     E_RESULT             = result
    EXCEPTIONS
      usage_error    = 1
      system_error   = 2
      internal_error = 3
      OTHERS         = 4.
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN OTHERS.
    ENDCASE.                           " CASE sy-subrc
  ENDIF.                               " IF sy-subrc <> 0.

ENDFORM.                    " F_GET_FUNCTION_MODULE"@TC corr:GET_FUNCTION_MODULE
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Moin Jens,

Du willst ja scheinbar so was wie eine automatische HN-Alternative zur Korrektur anbieten zu wollen.

Außer der allgemeinen Info ( Lokal oder global ), die dir der SCI oder ATC rauswirft kenne ich nichts, womit du in einer Source noch so eine Typeidentifizierung à la CL_ABAP_TYPEDESCR hinbekommst. M.W. kommt dem am ehesten der Syntaxcheck nahe, der in gewissen Fällen warnt, dass Zuweisungen nicht kompatibel seien. D.h, dass dieser schon weiß was intern wirklich verwendet wird. Allerdings glaube!! ich, dass dies im Kernel abläuft und diese Informationen nicht nach draußen getragen werden.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Tron, vielleicht solltest Du in Deiner Firma mal Ralfs Signatur verbreiten oder die Information weitergeben, dass hier auf die von der SAP empfohlenen Programmierrichtlinien verwiesen wird, in denen hier explizit empfohlen wird, das, was euer ATC da fordert, genau nicht zu machen!

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Tron


Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
@D&P: Bitte keine Diskussion in diesem Thread über den Sinn oder Unsinn der HN.
Jens Brötchengeber hat sich für die HN entschieden und jetzt soll da halt was umgesetzt werden. Die Grundsatzdiskussion kann gerne geführt werden - aber dann doch bitte in einem eigenen Thread.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
ewxTron

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von ewx (Top Expert / 4846 / 311 / 642 ) »
Tron hat geschrieben:
01.10.2019 13:26
Ich erfahre so nicht, welchen Typ die Variable hat und kann so nicht den Prefix zum Variablennamen vorschlagen.
Die Prüfung CL_CI_TEST_ABAP_NAMING prüft leider nur, ob z.B. Daten lokal oder global sind und in die entsprechende typunabhängige Vorgabe passen.
Ansich müsste man die Prüfung anpassen und z.B. definieren:
1. Stelle Variablenname G gilt für globale Daten und L für lokale.
2.+3. Stelle: T für Tabelle, S für Struktur usw.

Das würde die Verwendung für den Programmierer deutlich verbessern. Ich habe auch Kunden, bei denen die HN pedantisch geprüft wird. Ich erfahre aber immer nur: "Unerlaubter Name", aber nicht, welche Notation denn richtig wäre. Gerade bei "merkwürdigen Entscheidungen" wie "FIV_" für Funktionsparameter oder "UF_" für USING-Parameter, ist es schwer, den korrekten Prefix parat zu halten. Von daher kann ich deine Anforderung gut verstehen.

Ich würde tatsächlich versuchen, die Prüfklasse "aufzubohren".

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von ewx (Top Expert / 4846 / 311 / 642 ) »
Bin gerade über die Prüfung "Erweiterte Namenskonventionen" gestossen (CL_CI_TEST_ABAP_NAMING_NEW)... Habt ihr die im Einsatz?
ci.png
Leider wird hier auch nur die Meldung "Unerlaubter Name" ausgegeben... :/

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Tron


Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Moin,
und Danke für Euer Interesse an Diesem leidigen Thema.
Also für die den ATC Check verwende ich die ATC API aus dem Test Report RSATC_API_USAGE_EXAMPLE . Im direkten Vergleich zum manuellen Auslösen der Prüfung ermittelt die API exakt das gleiche Ergebnis.
CL_CI_TEST_ABAP_NAMING_NEW kann ich ja einmal gesondert aufrufen, um zusätzliche Werte zu den Deklarationen zu bekommen, bin gespannt.

gruß Jens

Code: Alles auswählen.

" Locally start ATC for list of objects with standard check variant and retrieve all findings
FORM local_run_with_objects USING i_keys TYPE if_satc_object_set=>ty_object_keys
                            CHANGING i_msg TYPE string.

  DATA:
    l_factory            TYPE REF TO cl_satc_api_factory,
    "l_keys               TYPE if_satc_object_set=>ty_object_keys,
    l_object_set         TYPE REF TO if_satc_object_set,
    l_configuration      TYPE REF TO if_satc_run_configuration,
    l_controller         TYPE REF TO if_satc_run_controller,
    l_result_access      TYPE REF TO if_satc_result_access,
    l_findings           TYPE scit_rest,
    s_findings           TYPE LINE OF scit_rest,
    l_findings_extension TYPE satc_ci_findings_extension,
    "l_msg                TYPE string,
    l_cx                 TYPE REF TO cx_root,
    s_data               TYPE ty_data ##NEEDED.
  .

  CREATE OBJECT l_factory.

*  l_keys = VALUE #( ( obj_type = 'PROG' obj_name = 'Z_SD_SOS2' )
*                    ( obj_type = 'FUGR' obj_name = 'ZGOSUTILS2' ) ).

  TRY.
      l_object_set = cl_satc_object_set_factory=>create_for_object_keys( i_keys ).
    CATCH cx_satc_empty_object_set INTO l_cx.
      MESSAGE l_cx TYPE 'E'. " Object set contains no checkable objects
  ENDTRY.

  l_configuration = l_factory->create_run_configuration(
    i_object_set  = l_object_set
    i_description = 'MY_RUN' ).

  l_controller = l_factory->create_run_controller( l_configuration ).

  TRY.
      l_controller->run( IMPORTING e_result_access = l_result_access ).
    CATCH cx_satc_failure INTO l_cx.
      MESSAGE l_cx TYPE 'E'. " ATC check run failed (no authorization, etc.)
  ENDTRY.

  TRY.
      l_result_access->get_findings(
        IMPORTING
          e_findings           = l_findings
          e_findings_extension = l_findings_extension ).
    CATCH cx_satc_failure INTO l_cx.
      MESSAGE l_cx TYPE 'E'. " Result access failed (no authorization, etc.)
  ENDTRY.

  DATA s_ext TYPE satc_ci_finding_extension.
  DATA i TYPE i.
  DATA s_line TYPE string.
  DATA s_text1 TYPE string.

  LOOP AT l_findings INTO s_findings.
    i = sy-tabix.

    MOVE-CORRESPONDING s_findings TO  s_data.
    READ TABLE l_findings_extension INTO s_ext INDEX i.
    MOVE-CORRESPONDING s_ext TO s_data.

    CLEAR s_text1.
    LOOP AT s_ext-description_lines INTO s_line.
      CONCATENATE s_text1 s_line INTO s_text1 SEPARATED BY '+'.
    ENDLOOP.

    i = strlen( s_text1 ).
    IF i > 0.
      IF i > 128.
        s_data-text1 = s_text1+1(128).
        s_data-text2 = s_text1+129.

      ELSE.
        s_data-text1 = s_text1+1.

      ENDIF.
    ENDIF.


    APPEND s_data TO it_data.


  ENDLOOP.

  i_msg = 'Number of Findings / Extensions: &1 / &2'(002).
  REPLACE ALL OCCURRENCES OF '&1' IN i_msg WITH |{ lines( l_findings ) }|.
  REPLACE ALL OCCURRENCES OF '&2' IN i_msg WITH |{ lines( l_findings_extension ) }|.

  CONCATENATE text-001 i_msg INTO i_msg SEPARATED BY ' '.

ENDFORM.
Habe noch Text1 und Text2 angehängt für die Detailerklärung.
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von ewx (Top Expert / 4846 / 311 / 642 ) »
achso. Du willst also die Prüfung mit deinem Check direkt aufrufen und dann die Fundstellen analysieren...?

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Stimmt ...
CL_CI_TEST_ABAP_NAMING wird hierbei verwendet, das sagt er mir in der Ausgabe der Analyse. Siehe Screenshot.

gruß Jens
(mist... auf gelöst geclickt)
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von ewx (Top Expert / 4846 / 311 / 642 ) »
Welche Prüfungen verwendet werden, definierst du ja in der Prüfvariante.
Ich fände es sinnvoller, die Prüfung selber aufzubohren um dem Anwender die entsprechende Rückmeldung zu geben. Ich möchte als Entwickler ja auch nicht die CI Prüfung im Objekt machen (Menü: Programm - Prüfen - Code Inspector) um dann für Details noch mal ein separates Prüfprogramm aufrufen zu müssen...

Re: Alle Deklarationen in FORM Routinen ermitteln

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Moin Jens,

Ennos Hinweis auf die Klasse ergibt (indirekt) die Lösung in deren Coding:

Da du schreibst, dass du nur aus Versehen auf "gelöst" geklickt hast hier ein Ansatz für dich. Sehr speziell - aber ich schätze, dass das für dich als Anfang reicht:

Code: Alles auswählen.

REPORT.


END-OF-SELECTION.
  PERFORM analyzer.
FORM test .
  DATA: x TYPE mara.
  TYPES: ty LIKE x-matnr.
  DATA: x2 LIKE x.
  DATA: x3 LIKE x2.
  DATA: x4 LIKE x3.
  DATA: y LIKE x.
  DATA: y3 LIKE y-mtart.
  data: lt_tab type STANDARD TABLE OF mara.
  data: begin of deep,
         t_deep like lt_tab,
        end of deep.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  ANALYZER
*&---------------------------------------------------------------------*
FORM analyzer .
  DATA(compiler) = cl_abap_compiler=>create( p_name = sy-repid ).
  compiler->get_complete_refs( IMPORTING
                                 p_refs = DATA(lt_refs) ).


  DATA: lo_data_comp_data TYPE REF TO cl_abap_comp_data,
        lo_data_type      TYPE REF TO cl_abap_comp_type.


  LOOP AT lt_refs ASSIGNING FIELD-SYMBOL(<ls_ref>) WHERE ref-full_name CS '\FO:TEST\'.

    DATA(lo_symbol) = compiler->get_symbol_entry( <ls_ref>-ref-full_name ).
    DATA(lv_classname)  = cl_abap_classdescr=>get_class_name( lo_symbol ).
    CASE lv_classname.
      WHEN '\CLASS=CL_ABAP_COMP_DATA'.
        FORMAT COLOR OFF.
        lo_data_comp_data ?= lo_symbol.
        WRITE :/     <ls_ref>-ref-full_name,
              AT 40  lv_classname,
              AT 80 lo_data_comp_data->type->full_name,
              AT 160 lo_data_comp_data->type->atyp.
      WHEN OTHERS.
        FORMAT COLOR 7.
        WRITE :/     <ls_ref>-ref-full_name,
              AT 40  lv_classname.
    ENDCASE.


  ENDLOOP.

ENDFORM.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

2
Antw.
1542
Views
Aufrufer (FORM) ermitteln
von RiffRaff » 13.06.2005 15:53 • Verfasst in ABAP® Core
0
Antw.
1592
Views
BW Routinen Bezeichung - Tabelle
von CryptForce » 15.05.2017 09:38 • Verfasst in Sonstige Module
17
Antw.
5054
Views
Grundsatzfrage: Deklarationen
von ralf.wenzel » 12.12.2013 21:51 • Verfasst in ABAP® Core
4
Antw.
2524
Views
Textsymbole in Deklarationen
von SteJu » 02.06.2008 09:02 • Verfasst in ABAP® für Anfänger
68
Antw.
16695
Views
Deklarationen: Tabellarisch oder nicht?
von ralf.wenzel » 28.03.2017 10:34 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 5 Stunden von DeathAndPain gelöst 22 / 2799
Daten an Tabelle binden
vor 10 Stunden von Lukas Sanders 2 / 875
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 430

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

Dialog-Container mit Toolbar/Status
vor 5 Stunden von DeathAndPain gelöst 22 / 2799
Daten an Tabelle binden
vor 10 Stunden von Lukas Sanders 2 / 875
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 430

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2467
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9050