Ich hab mal ein Problem

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

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Ich hab mal ein Problem

Beitrag von zkenitra ( / / 0 / 3 ) »
Hi Kollegen,

folgendes Problem habe ich:

Es existieren eine Anzahl von generisch erstellten Tabellen, die alle den gleichen Schlüssel haben. Die Tabellen basieren auf Daten des Klassensystems: sprich, es gibt eine 1:1-Beziehung zwischen Klasse und Tabelle (der Name der Tabelle basiert u.a. auf dem internen Schlüssel der Klasse KLAH-CLINT).
Eine Tabelle steht als ADMIN-Tabelle im mit Inhalt zur Verfügung, während in den restlichen Tabellen keine Inahlte vorhanden sein müssen.
Alle Felder der jeweiligen Tabelle (bis auf einen Objektschlüssel und den Mandanten) haben ein entsprechendes Merkmal zur entsprechenden Klasse, wobei die Feldnamen (siehe CABN-ATINN) (und auch die Feldtypen) aus den Merkmalen abgeleitet sind.
(das heißt, dass die Tabellen- und Feldnamen in zwie Systemen unterschiedlich sind/sein können)

Beim Lesen dieser Tabellen sollen nun Einschränkungen benutzt werden, die auf den Merkmalen beruhen. Dazu wird eine WHERE-Bedingung aus den Merkmalsdefinitionen und der Werteauswahl aufgebaut.
Als Ziel wird eine interne Tabelle verwendet, die die Felder aller Tabellen beinhaltet.

Das Problem, was ich nun habe, ist, dass ich keinen dynamischen SELECT mit allen betroffenen Tabellen/Views in Form von JOIN-Verknüpfungen aufbauen kann. Andererseits brauche ich aber eine Information, ob eine gelesene Zeile einer dieser Tabellen durch eine Bedingung, die in einer anderen Tabelle greift, von der Selektion ausgeschlossen ist.

Eine mögliche Lösung ist, alle Daten in die Zieltabelle einzulesen und anschließend erst die Selektionsbedingungen auf die interne Tabelle anzuwenden.
Das hätte aber den unschönen Effekt, dass erst alle Daten (können mehrere tausend Sätze sein) gelesen werden und dann eventuell nur wenige Daten die Selektion passieren. Für den Anwender wäre es nicht direkt ersichtlich, warum dann die Selektion so lange dauert, zumal ich das Übertragen der Daten in die interne Tabelle per ASSIGN COMPONENT-Strukturen (jedes Feld jeder Zeile einzeln) vornehmen muss.

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


Beitrag von Gast ( / / 0 / 3 ) »
Warum funktioniert denn kein join? Welche Tabellen sind denn genau betroffen? Wenn Du das postest, kann man mal nachschauen und evtl. eine Lösung finden.

Warum nicht über Join JOIN???

Beitrag von Jürgen.H (ForumUser / 23 / 0 / 0 ) »
Mir sind innerhalb der Klassifizierng keine Tabellen bekannt, die nicht über Join verknüpft werden können.

Soltest Du die mit CU60 generierten variantentabellen meinen:

Schlage mal Deinem Kunden/ Berater vor, dass man das ganze mit gewissen Spielregeln und notfalls einer zusätzlichen Customizingtabelle organisieren kann. Dann kann man auch über die Einträge mittels Join eindeutige Tabellen lesen, in denen alle Eintragszeilen (z.B. CUVTAB_VARC) zu einem Tabelleneintrag in einer Zeile einer internen Tabelle stehen.

Notfalls poste mir Deine Email, dass Du mir dann einen Codingauszug schicken kannst.
Success

Jürgen

Beitrag von ereglam ( / / 0 / 3 ) »
die Meldung stammt ursprünglich von mir und wurde von meinem Kollegen hier freundlicherweise eingestellt.

@Jürgen.H
nein, nicht über CU60

Die oben erwähnten Tabellen/Views werden mit einer kundeneigenen Erweiterung aus einer Anzahl Klassen und deren dazugehörigen Merkmale erstellt.Zumal es unterschiedlich viele Klassen und somit Tabellen geben kann.
Abgesehen davon gibt es noch eine Versionierung, die noch zusätzlich mit in den Namen der Tabellen hineinspielt.

Der Zugriff auf besagte Tabellen/Views ist deshalb nur unter Verwendung von CREATE DATA (ein jeweiliger Tabellentyp wird bei der Generierung mit angelegt)und anschließendem ASSIGN möglich.

Erkenntnisse:
Um in einem SELECT einen JOIN verwenden zu können, müssen die Tabellen im DDIC bekannt sein und explizit benannt werden. Da die Tabellen und Felder sich aber auf die internen Schlüssel von Klassen (CLINT) und Merkmalen (ATINN) beziehen, kann das aber nicht über die Systeme hinweg garantiert werden.

Fazit:
Es ist somit nicht möglich, derartige Tabellen so von DB einzulesen, dass man auch gleichzeitig noch Einschränkungen mitgeben kann.
Die kann wahrscheinlich nur durch nachfolgende Auswertung der kombinierten Tabellen im ABAP stattfinden.

Beitrag von Gast ( / / 0 / 3 ) »
ereglam hat geschrieben:Der Zugriff auf besagte Tabellen/Views ist deshalb nur unter Verwendung von CREATE DATA (ein jeweiliger Tabellentyp wird bei der Generierung mit angelegt)und anschließendem ASSIGN möglich.

Erkenntnisse:
Um in einem SELECT einen JOIN verwenden zu können, müssen die Tabellen im DDIC bekannt sein und explizit benannt werden. Da die Tabellen und Felder sich aber auf die internen Schlüssel von Klassen (CLINT) und Merkmalen (ATINN) beziehen, kann das aber nicht über die Systeme hinweg garantiert werden.
Die Erkenntnisse stimmen so nicht ganz, denn es gibt dynamische Varianten von Select-Anweisungen, wo es ausreichend ist, daß die Tabellen zur Laufzeit bekannt sind. Das hängt allerdings vom Release-Stand ab. Damit sind dann in etwa solche Anweisungen möglich (Beispiel aus ABAP-Docu). Damit kann man dann auch dynamisch nahezu beliebige Select-Anweisungen aufbauen:

Code: Alles auswählen.

PARAMETERS: dbtab(10) TYPE c, 
            rows      TYPE i DEFAULT 100. 

DATA dref TYPE REF TO data. 

FIELD-SYMBOLS: <table> TYPE ANY TABLE, 
               <wa>    TYPE ANY, 
               <comp>  TYPE ANY. 

TRY. 
    CREATE DATA dref TYPE STANDARD TABLE OF (dbtab) 
                          WITH NON-UNIQUE DEFAULT KEY. 
    ASSIGN dref->* TO <table>. 
    SELECT * 
           FROM (dbtab) UP TO rows ROWS 
           INTO TABLE <table>. 
    LOOP AT <table> ASSIGNING <wa>. 
      DO. 
        ASSIGN COMPONENT sy-index 
               OF STRUCTURE <wa> TO <comp>. 
        IF sy-subrc = 0. 
          WRITE / <comp>. 
        ELSE. 
          EXIT. 
        ENDIF. 
      ENDDO. 
      ULINE. 
    ENDLOOP. 
  CATCH cx_sy_create_data_error. 
    WRITE 'Wrong Database!'. 
ENDTRY. 

Beitrag von Gast ( / / 0 / 3 ) »
Anbei noch ein Beispiel (ebenfalls aus ABAP-Docu) mit Join:

Code: Alles auswählen.

PARAMETERS: p_cityfr TYPE spfli-cityfrom, 
            p_cityto TYPE spfli-cityto. 

DATA: BEGIN OF wa, 
         fldate TYPE sflight-fldate, 
         carrname TYPE scarr-carrname, 
         connid   TYPE spfli-connid, 
       END OF wa. 

DATA itab LIKE SORTED TABLE OF wa 
               WITH UNIQUE KEY fldate carrname connid. 
DATA: column_syntax TYPE string, 
      dbtab_syntax TYPE string. 

column_syntax = `c~carrname p~connid f~fldate`. 

dbtab_syntax = `( ( scarr AS c ` 
  & ` INNER JOIN spfli AS p ON p~carrid  = c~carrid` 
  & ` AND p~cityfrom = p_cityfr` 
  & ` AND p~cityto   = p_cityto )` 
  & ` INNER JOIN sflight AS f ON f~carrid = p~carrid ` 
  & ` AND f~connid = p~connid )`. 

SELECT (column_syntax) 
       FROM (dbtab_syntax) 
       INTO CORRESPONDING FIELDS OF TABLE itab. 

LOOP AT itab INTO wa. 
  WRITE: / wa-fldate, wa-carrname, wa-connid. 
ENDLOOP. 

Beitrag von ereglam ( / / 0 / 3 ) »
Anonymous hat geschrieben:...
Die Erkenntnisse stimmen so nicht ganz, denn es gibt dynamische Varianten von Select-Anweisungen, wo es ausreichend ist, daß die Tabellen zur Laufzeit bekannt sind. Das hängt allerdings vom Release-Stand ab. Damit sind dann in etwa solche Anweisungen möglich (Beispiel aus ABAP-Docu). Damit kann man dann auch dynamisch nahezu beliebige Select-Anweisungen aufbauen:

Code: Alles auswählen.

PARAMETERS: dbtab(10) TYPE c, 
            rows      TYPE i DEFAULT 100. 

DATA dref TYPE REF TO data. 

FIELD-SYMBOLS: <table> TYPE ANY TABLE, 
               <wa>    TYPE ANY, 
               <comp>  TYPE ANY. 

TRY. 
    CREATE DATA dref TYPE STANDARD TABLE OF (dbtab) 
                          WITH NON-UNIQUE DEFAULT KEY. 
    ASSIGN dref->* TO <table>. 
    SELECT * 
           FROM (dbtab) UP TO rows ROWS 
           INTO TABLE <table>. 
    LOOP AT <table> ASSIGNING <wa>. 
      DO. 
        ASSIGN COMPONENT sy-index 
               OF STRUCTURE <wa> TO <comp>. 
        IF sy-subrc = 0. 
          WRITE / <comp>. 
        ELSE. 
          EXIT. 
        ENDIF. 
      ENDDO. 
      ULINE. 
    ENDLOOP. 
  CATCH cx_sy_create_data_error. 
    WRITE 'Wrong Database!'. 
ENDTRY. 
funktioniert das auch unter Verwendung von JOIN?
Eine einzelne Tabelle kann man ja richtigerweise im SELECT * FROM (dbtab) auch schon in älteren Systemen mitgeben, was ich aber bräuchte, ist eine Konstruktion in der Form:

Code: Alles auswählen.

SELECT *
       FROM (dbtab1) AS t1
[
         JOIN (dbtab2) AS t2
           ON t2~key EQ t1~key
] (n-1)-mal (dynamisch)
       INTO CORRESPONDING FIELDS OF <lt_data>
       WHERE (lt_where).

Beitrag von Gast ( / / 0 / 3 ) »
Ja, siehe das zweite Beispiel unmittelbar über Deiner letzten Antwort. Wie gesagt, hängt vom Release ab.

Beitrag von ereglam ( / / 0 / 3 ) »
für welches Release gilt dieses Beispiel? 6.x?

Beitrag von ereglam ( / / 0 / 3 ) »
hab's grad mal ausprobiert.

Funktioniert nicht in einem 4.6C :?

Beitrag von Gast ( / / 0 / 3 ) »
Funktioniert ab 6.20.

Seite 1 von 1

Vergleichbare Themen

3
Antw.
1574
Views
SQL Problem
von swonny » 22.04.2008 11:29 • Verfasst in ABAP® für Anfänger
1
Antw.
1907
Views
Problem mit ALV
von ZK » 03.09.2004 10:06 • Verfasst in Dialogprogrammierung
2
Antw.
2149
Views
RFC VB Problem
von Gast » 14.10.2004 14:47 • Verfasst in ABAP® Core
5
Antw.
3080
Views
Problem mit ALV
von zickzack0312 » 17.01.2007 22:08 • Verfasst in ABAP Objects®
3
Antw.
1936
Views
Problem mit MVC
von dexter » 12.05.2004 15:09 • Verfasst in Web-Dynpro, BSP + BHTML

Ü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

alv_grid aktualisieren
vor 2 Stunden von Egzon gelöst 4 / 80
SELECT CHAR16 in CHAR12-Feld
vor 11 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

alv_grid aktualisieren
vor 2 Stunden von Egzon gelöst 4 / 80
SELECT CHAR16 in CHAR12-Feld
vor 11 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