Tabellen nach Wert durchsuchen Thema ist als GELÖST markiert

Alle Fragen rund um Basisthemen
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

Tabellen nach Wert durchsuchen

Beitrag von Jüüürgen ( / / 0 / 3 ) »
Hallo gibt es eine Standardfunktio (Transaktion, Report etc.) mit der man alle Tabellen nach einem Bestimmten Wert durchsuchen kann?

Vorgeschichte:
Ein Benutzer (Programmierer/Customizert etc.) soll gelöscht werden.
Es ist nicht klar, was diese Person alles "unschön, z.B. hardcodiert angestellt" hat.
Z.B. steht in macnhen XML-Nachrichten der Benutzer drin etc.

Es gibt ja einen Report im Retail (im SRM gibt es diesen standardmäßig nicht): RPR_ABAP_SOURCE_SCAN.
Diesen habe ich als Z-Report im SRM abgekupfert....
Damit kann ich die ABAP-Sourcen durchscannen - super

Gibt es einen ähnlichen Report auch für Tabellen.

Z.B. ist der Benutzer noch in RFC-Destinations eingetragen, aber wo bzw. wofür wurde er noch hart vergewaltigt...

Wer hat Ideen.

Falls es dies nicht standardmäßig gibt.
Vielleicht hat jemand schon solch ein Programm geschrieben. Wäre super, wenn er es im Forum posten könnte.

Danke für jegliche Hilfe.

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


Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Verschoben aus "Tipps & Tricks" nach "Basis", da das Topic keine T&T enthält.
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Jürgen,


hier's 'n Ansatz:

Code: Alles auswählen.

REPORT zforum64 .
DATA wa(100).
DATA: BEGIN OF itab OCCURS 0,
        tabname TYPE dd03l-tabname,
        fieldname TYPE dd03l-fieldname,
      END OF itab.
DATA : BEGIN OF wtab  OCCURS 0,
       name(50),
       END OF wtab.
SELECT-OPTIONS tabn FOR itab-tabname.
PARAMETERS field LIKE dd03l-fieldname DEFAULT 'XUBNAME'.
PARAMETERS val(50) DEFAULT sy-uname.

SELECT tabname fieldname  FROM  dd03m INTO TABLE itab
       WHERE  tabname IN tabn
         AND  rollname  = field
         AND  DDLANGUAGE = sy-langu.

CONCATENATE text-001 val text-001 INTO val.
CONCATENATE field '=' val '.' INTO wtab-name SEPARATED BY space.

sort itab.
LOOP AT itab.

  SELECT COUNT( * ) FROM  dd02l INTO sy-dbcnt
         WHERE  tabname   = itab-tabname
         AND    tabclass  = 'TRANSP'.

  CHECK sy-dbcnt > 0.

  SELECT COUNT( * ) FROM (itab-tabname) INTO sy-dbcnt
               WHERE (wtab).

  IF sy-dbcnt > 0.
    WRITE: / itab-tabname.
  ENDIF.

ENDLOOP.

Andreas

Tabellen nach Wert durchsuchen

Beitrag von Jüüürgen ( / / 0 / 3 ) »
Ich habe folgenden Code.

Wie bekomme ich die einezlnen Zeilen der Tabelle dann durchgelesen.

Als Ergebnis möchte ich eine Tabelle mit folgenden Informationen:
- Tabellenname
- Tabellenfeld
- evtl. Anzahl Vorkommen

ich habe bisher folgenden Code komme aber jetzt nicht mehr weiter

Code: Alles auswählen.

EPORT  z_scan_table                         .

DATA: BEGIN OF itab OCCURS 0,
        tabname   TYPE dd02l-tabname,
        fieldname TYPE dd03l-fieldname,
        anz       TYPE i,
      END OF itab.
DATA: BEGIN OF itab_verz OCCURS 0,
        tabname   TYPE dd02l-tabname,
      END OF itab_verz.

SELECT-OPTIONS s_tabn FOR itab-tabname.
PARAMETERS p_val(50) OBLIGATORY.

START-OF-SELECTION.

  SELECT tabname FROM dd02l INTO TABLE itab_verz WHERE tabname IN s_tabn.

  LOOP AT itab_verz.

    PERFORM scan_table.

  ENDLOOP.

*&------------------------------------------------
*&      Form  scan_table
*&------------------------------------------------
FORM scan_table.

  DATA: mytable TYPE REF TO data.
  CREATE DATA: mytable TYPE TABLE OF (itab_verz-tabname).
  FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE.
  ASSIGN:      mytable->* TO <fs_tab>.

  SELECT * FROM (itab_verz-tabname) INTO TABLE <fs_tab>.

  FIELD-SYMBOLS: <fs_wa> TYPE ANY.
  DATA:          mywa TYPE REF TO data.
  CREATE DATA:   mywa type line of (itab_verz-tabname).
*  ASSIGN mywa->* TO <fs_wa>.

  LOOP AT <fs_tab> INTO mywa.

  ENDLOOP.



Beitrag von ewx (Top Expert / 4918 / 332 / 655 ) »
Befehle:
* SEARCH
* IF <wa> CP '*text*'. "Contains Pattern

Du brauchst dir noch nicht mal die Mühe zu machen, die Tabelle Dynamisch zu generieren. Du brauchst lediglich einen ausreichend großen Datenbereich für die INTO-Klausel (2000 Byte dürften für die meisten Tabellen reichen)

Code: Alles auswählen.

DATA: 
  BEGIN OF tab OCCURS 0,
    wa(2000),
  END OF tab.
  SELECT * FROM (dbtab) INTO TABLE tab.
/edit: Sorry, vergiss es, das Tabellenfeld bekommst du so natürlich nicht raus. :lol:
Aber mit ASSIGN COMPONENT und o.g. Befehlen.

Gruß, Enno

Tabellen nach Wert durchsuchen

Beitrag von Jüüürgen ( / / 0 / 3 ) »
Ich habe mal wieder zu kompliziert gedacht.

Das untenstehende Programm bringt eigentlich schon ein Ergebnis.

Ich hätte allerdings eine select-options anstatt des parameters.
Wie mache ich das dann?

Ein Problem bei dieser Version ist, daß beim Vergleich einfach bei kürzeren Feldern in der Tabelle als beim Eingabewert nur in der Feldlänge der Tabelle verglichen wird (also nicht wie eingegeben).

Wie kann ich das umgehen?

Ich (und vielleicht auch andere Forumleser) wäre für Hilfe sehr dankbar :wink:

Gruß
Jüüürgen

Code: Alles auswählen.


REPORT  z_scan_table                         .

DATA: BEGIN OF itab OCCURS 0,
        tabname   TYPE dd02l-tabname,
        fieldname TYPE dd03l-fieldname,
        anz       TYPE i,
      END OF itab.
DATA: BEGIN OF itab_verz OCCURS 0,
        tabname   TYPE dd02l-tabname,
      END OF itab_verz.
**********************************************
SELECT-OPTIONS: s_tabn FOR itab-tabname.
PARAMETERS:     p_val(50) TYPE c.
***********************************************
START-OF-SELECTION.
  DESCRIBE FIELD p_val LENGTH gv_len IN CHARACTER MODE.
  SELECT tabname FROM dd02l INTO TABLE itab_verz WHERE tabname IN s_tabn
                                                 and tabclass = 'TRANSP'.
  LOOP AT itab_verz.
    PERFORM scan_table.
  ENDLOOP.
*&---------------------------------------------*&      Form  scan_table
*&---------------------------------------------
FORM scan_table.

  TYPE-POOLS: slis.
  DATA: ct_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = itab_verz-tabname
    CHANGING
      ct_fieldcat      = ct_fieldcat[].
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  itab-tabname = itab_verz-tabname.
  LOOP AT ct_fieldcat.
    DATA: lv_cond TYPE string.
    CLEAR lv_cond.
    CONCATENATE ct_fieldcat-fieldname
               '='
               ''''
           INTO lv_cond
           SEPARATED BY space.
    CONCATENATE lv_cond
                p_val
                ''''
           INTO lv_cond.

    SELECT COUNT( * ) FROM (itab_verz-tabname) INTO itab-anz
            WHERE (lv_cond).
    IF sy-subrc = 0.
      itab-fieldname = ct_fieldcat-fieldname.
      APPEND itab.
      WRITE: / itab-tabname, itab-fieldname, itab-anz.
    ENDIF.
  ENDLOOP.

ENDFORM.                    "scan_table

select / zu kurze Felder / numerische Felder

Beitrag von Jüüürgen ( / / 0 / 3 ) »
Hallo,

Code: Alles auswählen.


SELECT COUNT( * ) FROM (itab_verz-tabname) INTO itab-anz WHERE (lv_cond).

in der Where Bedinung steht z.B.
FELDX = 'TEST'.
Wenn nun das Feld in der Tabelle nur 1 Stellig ist, dann wird nur auf "T" vergliechen. Wie kann ich es verhindern, daß die Tabellenzeile nicht gefunden wird, wenn das Suchargument länger als das Feld in der Tabelle ist.

Bei numerischen Feldern schmiert mir der ABAP ab mit CONVT_NO_NUMBER.

Wie kann ich den Fehler abfangen.
Habe das mit CATCH oder TRY noch nie gemacht.

Vielen Dank für Tips

Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Hallo Jürgen,

hier ein Muster:

Code: Alles auswählen.

PARAMETERS : wert(10) DEFAULT 111.
*
DATA zwert(10) TYPE i.

CATCH SYSTEM-EXCEPTIONS convt_no_number = 1.
  PACK wert TO zwert.
ENDCATCH.

WRITE: / 'Eingabe:', wert.
ULINE.
IF sy-subrc = 1.
  WRITE: / 'falsch', wert under wert.
ELSE.
  WRITE : / 'richtig', zwert.
ENDIF.
lg Andreas

Re: select / zu kurze Felder / numerische Felder

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Jüüürgen hat geschrieben:Hallo,

Code: Alles auswählen.


SELECT COUNT( * ) FROM (itab_verz-tabname) INTO itab-anz WHERE (lv_cond).

in der Where Bedinung steht z.B.
FELDX = 'TEST'.
Wenn nun das Feld in der Tabelle nur 1 Stellig ist, dann wird nur auf "T" vergliechen. Wie kann ich es verhindern, daß die Tabellenzeile nicht gefunden wird, wenn das Suchargument länger als das Feld in der Tabelle ist.
Weiß jemand, ob das irgendwo dokumentiert ist?
Wenn nicht, mach doch einfach eine SAP-Fehlermeldung auf.

Ich finde es auch merkwürdig, wenn ich in einem Programm ein SELECT mit WHERE sprsl = 'DE' finde, und die DB Einträge liefert, obwohl das DB-Feld einstellig ist.
(Für 'DE' und 'EN' passt ja die Kürzung auf eine Stelle noch. Es gibt aber genügend Sprachen, für die dabei Unsinn herauskomt.)
Bei numerischen Feldern schmiert mir der ABAP ab mit CONVT_NO_NUMBER.
Wenn man nach Texten sucht, nimmt man in die WHERE-Klausel am besten gleich nur die Felder mit passendem Typ auf.

Seite 1 von 1

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.

Vergleichbare Themen

2 Tabellen vergleichen, bei Treffer, einen Wert weg schreibe
von Beginner » 10.10.2006 12:29
Jobketten in SAP BW durchsuchen
von vman » 05.08.2014 08:54
Varianten durchsuchen?
von ginotico » 22.07.2008 15:40
code von Transaktion durchsuchen
von .marc. » 19.03.2011 16:02
Programm durchsuchen in Eclipse
von DeathAndPain » 22.07.2022 00:28