Füllen einer tiefen Struktur per Select oder im CDS

Getting started ... Alles für einen gelungenen Start.
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Füllen einer tiefen Struktur per Select oder im CDS

Beitrag von zornbruder (ForumUser / 3 / 0 / 1 ) »
Hallo zusammen,

ich habe ein Problem, bei dem ich nicht weiterkomme - ich will aber auch nicht so einfach aufgeben.

ich habe folgende Struktur mit zugehöriger ITAB

Code: Alles auswählen.

TYPES: BEGIN OF GY_WA,
               kunnr type kunnr,
               name1 type name1,
               references type standard table of kunnr,
           END OF GY_WA,
           GY_ITAB TYPE STANDARD TABLE OF GY_WA WITH EMPTY KEY.

DATA: gs_wa type gy_wa,
          gt_itab type gy_itab.

Ich möchte diese Tabelle, mit den Referenzen für den Kunden (in der Regel v1-partner) in einem Select füllen.
Quasi irgendwie so:

Code: Alles auswählen.


select kna1~kunnr, kna1~name1, knvp~kunnr as line of references 
from kna1
inner join knvp on knvp~kunn2 = kna1~kunnr
                            knvp~parvw = 'V1'
into corresponding fields of table @gt_itab.

(In echt ist das etwas ausprogrammierter, aber um mein Problem darzustellen reicht das, hoffe ich... )


Hat jemand eine Ahnung, wie man das hinbekommen könnte? Oder ist eine nested Table zu füllen per select unmöglich in Open SQL?


Vielen DAnk im Voraus.
LG
Christoph

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


Re: Füllen einer tiefen Struktur per Select oder im CDS

Beitrag von black_adept (Top Expert / 3947 / 105 / 886 ) »
Moin Christoph,

ein SELECT gibt als "result" immer eine Menge von Feldern zurück, aber keine tiefen Strukturen. Somit ist das was du wünscht so direkt nicht möglich.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Füllen einer tiefen Struktur per Select oder im CDS

Beitrag von DeathAndPain (Top Expert / 1799 / 214 / 396 ) »
Bedeutet im Klartext, dass Du das mit Deiner Untertabelle zwar schon machen kannst, aber nicht in einem einzigen SELECT. Die richtige Vorgehensweise ist, dass Du zunächst die Tabelle ohne Untertabelle füllst und dann einen LOOP darüber machst und die references nachschiebst.

Folgendermaßen wird es funktionieren:

Code: Alles auswählen.

TYPES: BEGIN OF GY_WA,
               KUNNR TYPE KUNNR,
               NAME1 TYPE NAME1,
               REFERENCES TYPE STANDARD TABLE OF KUNNR WITH EMPTY KEY,
           END OF GY_WA,
           GY_ITAB TYPE STANDARD TABLE OF GY_WA WITH EMPTY KEY.

DATA: GS_WA TYPE GY_WA,
      GT_ITAB TYPE GY_ITAB.

SELECT KUNNR NAME1 FROM KNA1
INTO CORRESPONDING FIELDS OF TABLE GT_ITAB.

LOOP AT GT_ITAB INTO GS_WA.
  SELECT KUNNR INTO TABLE GS_WA-REFERENCES FROM KNVP
   WHERE KUNN2 = GS_WA-KUNNR
     AND PARVW = 'V1'.
  MODIFY GT_ITAB FROM GS_WA.
ENDLOOP.
Leider hast Du nicht gesagt, welchen Releasestand Du hast. Ab 7.40 kann man das noch etwas schöner schreiben.

Ungünstig ist aber auf jeden Fall der Name "references" der Untertabelle, weil "references" auch ein ABAP-Schlüsselwort ist. ABAP lässt sowas zwar zu, schön ist es aber nicht. Ich würde einen anderen Namen nehmen.

Re: Füllen einer tiefen Struktur per Select oder im CDS

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Oder man denkt über einen Join nach, wenn die Daten eh zusammenhängen. Wenn man möchte, kann man die Daten dann anschließend auseinanderpflücken und in die gewünschte tiefe Tabelle einfügen.

Re: Füllen einer tiefen Struktur per Select oder im CDS

Beitrag von zornbruder (ForumUser / 3 / 0 / 1 ) »
Ich arbeite mit einem CDS der den ganzen Join übernimmt. Bei dem gesamten Konstrukt handelt es sich um 9 zusammenhängenden Tabellen und etliche Felder.
Außerdem benötige ich auch noch weitere Referenzen (dementsprechend heißt die tabelle nicht referenced sondern ref_v1_tt, ref_we_tt, ref_*_tt etc. ).

Die besagten habe ich mir jetzt über eine Assoziation im CDS zur Verfügung gestellt und greife in einem SELECT. ENDSELECT. Konstrukt darauf zu, mal schauen, was die Laufzeit dazu so sagt...




Releasestand: 7.5


***
nickname8 hat geschrieben:Oder man denkt über einen Join nach, wenn die Daten eh zusammenhängen. Wenn man möchte, kann man die Daten dann anschließend auseinanderpflücken und in die gewünschte tiefe Tabelle einfügen.
Und dann per Loop at group zusammenfügen?
Wäre auch eine Idee, dann hätte man auf jeden Fall die Daten in einem Rutsch geholt.

Re: Füllen einer tiefen Struktur per Select oder im CDS

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
zornbruder hat geschrieben:Ich arbeite mit einem CDS der den ganzen Join übernimmt. Bei dem gesamten Konstrukt handelt es sich um 9 zusammenhängenden Tabellen und etliche Felder.
Außerdem benötige ich auch noch weitere Referenzen (dementsprechend heißt die tabelle nicht referenced sondern ref_v1_tt, ref_we_tt, ref_*_tt etc. ).

Die besagten habe ich mir jetzt über eine Assoziation im CDS zur Verfügung gestellt und greife in einem SELECT. ENDSELECT. Konstrukt darauf zu, mal schauen, was die Laufzeit dazu so sagt...
Klingt interessant. Kannst Du dazu nochmal den Code posten?

Grüße,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

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

Re: Füllen einer tiefen Struktur per Select oder im CDS

Beitrag von zornbruder (ForumUser / 3 / 0 / 1 ) »
Der "Haupt"-CDS:

Code: Alles auswählen.

define view z_customer_data as select from knvp as origin

left outer join knvk on knvk.kunnr = origin.kunn2
                            and knvk.pafkt = 'Z01'

inner join kna1 on kna1.kunnr = origin.kunn2

left outer join z_customer_adressdata as knvkAddr on knvkAddr.addrnumber  = knvk.adrnd  "entweder sind abweichende Daten vorhanden
left outer join z_customer_adressdata as kna1Addr on kna1Addr.addrnumber  = kna1.adrnr  "oder man nimmt die ursprungsdaten

association [0..*] to z_b2b_reference as _ref_we on _ref_we.parvw = 'WE' 
                                                   and _ref_we.ag = origin.kunnr
                                     
association [0..*] to z_reference as _ref_re on _ref_re.parvw = 'RE' 
                                                   and _ref_re.ag = origin.kunnr
                                                   
association [0..*] to z_reference as _ref_v1_partner on _ref_v1_partner.parvw = 'V1' 
                                                    and _ref_v1_partner.kunnr = origin.kunnr
                                                    
association [0..*] to z_reference as _ref_v1_parent on _ref_v1_parent.parvw = 'V1' 
                                                           and _ref_v1_parent.ag = origin.kunnr
  
 {
       key origin.kunnr,
       key case when origin.parvw = 'WE' then LTRIM(origin.kunn2, '0') else '' end as kunwe,
       key case when origin.parvw = 'RE' then LTRIM(origin.kunn2, '0') else '' end as kunre,
       
       coalesce( knvk.anred, kna1.anred) as anred, 
       coalesce( knvk.name1, kna1.name1) as name1, 
       kna1.name2,
 
       coalesce( knvk.adrnd, kna1.adrnr ) as adrnr,
       coalesce( knvk.telf1,            kna1.telf1)             as telf1,
       coalesce( knvkAddr.mob_number,   kna1Addr.mob_number )   as mob_number,
       coalesce( knvkAddr.telfx,        kna1Addr.telfx )        as telfx,
       coalesce( knvkAddr.smtp_addr,    kna1Addr.smtp_addr )    as smtp_addr,
       coalesce( knvkAddr.comm_type,    kna1Addr.comm_type )    as comm_type,
       coalesce( knvkAddr.street,       kna1Addr.street )       as street,
       coalesce( knvkAddr.house_num1,   kna1Addr.house_num1 )   as house_num1,
       coalesce( knvkAddr.city1,        kna1Addr.city1 )        as city1, 
       coalesce( knvkAddr.post_code1,   kna1Addr.post_code1 )   as post_code1,
       coalesce( knvkAddr.region,       kna1Addr.region )       as region,
       coalesce( knvkAddr.country,      kna1Addr.country )      as country,
       coalesce( knvkAddr.langu,        kna1Addr.langu )        as langu,
       
       kna1.loevm,
       
       _ref_we, _ref_re, _ref_v1_partner, _ref_v1_parent                                               
} 

where ( origin.parvw = 'WE' or origin.parvw = 'RE' or origin.parvw = 'AG'  ) 
"Sub"-CDS 1:

Code: Alles auswählen.

define view z_reference as select from knvp
inner join cabn on atnam = 'ISB2B'
inner join ausp on ausp.atinn = cabn.atinn
               and ausp.atwrt = 'X' {
    
    key knvp.kunnr as ag,
    key knvp.kunn2 as kunnr,
    knvp.parvw,
    ausp.atinn,
    ausp.atwrt
    
} where knvp.kunn2 <> knvp.kunnr
"Sub"-CDS 2:

Code: Alles auswählen.

define view z_customer_adressdata as select from adrc 

left outer join adr6 on adr6.addrnumber = adrc.addrnumber
                    and adr6.persnumber = ''
                    and adr6.home_flag  = 'X'

left outer join adr2 on adr2.addrnumber = adrc.addrnumber
               and adr2.r3_user = '3'
               and adr2.persnumber = ''

left outer join adr12 on adr12.addrnumber = adrc.addrnumber
                and adr12.uri_type = 'HPG'
                and adr12.flgdefault = 'X'
                and adr12.persnumber = ''

left outer join adr3 on adr3.addrnumber = adrc.addrnumber
                and adr3.flgdefault = 'X'
                and adr3.persnumber = ''
                
inner join t002 on t002.spras = adrc.langu {
    
      adrc.addrnumber,
      adrc.street, 
      adrc.city1, 
      adrc.post_code1, 
      adrc.country, 
      adrc.region,
      adrc.house_num1, 
      t002.laiso as langu,
      adr2.tel_number as mob_number,
      adr3.faxnr_long as telfx,
      adr6.smtp_addr,
      adr12.uri_srch as comm_type    
    
}
ABAP-Select:

Code: Alles auswählen.

SELECT DISTINCT   kunnr, kunwe, kunre, anred,name1,
                        name2, region, telf1, loevm, street,
                        city1,post_code1, country, house_num1,
                        langu, mob_number, telfx, smtp_addr, comm_type

      FROM z_customer_data

        WHERE ( kunnr IN @lt_b2b_rr
           OR kunnr IN @lt_v1_rr ) 
          AND country IN @so_land1

      ORDER BY kunnr, street, house_num1, city1,
               post_code1, country, telf1, telfx

      INTO CORRESPONDING FIELDS OF @gs_kunden.

        IF gs_kunden-kunre IS INITIAL AND gs_kunden-kunwe IS INITIAL.

          SELECT DISTINCT ltrim( \_ref_re-kunnr, '0' ) AS kunnr ##ASSOC_TO_N_OK[_REF_RE]
            FROM z_customer_data
            WHERE kunnr = @gs_kunden-kunnr
          INTO CORRESPONDING FIELDS OF TABLE @gs_kunden-ref_re.

          SELECT DISTINCT ltrim( \_ref_we-kunnr, '0' ) AS kunnr ##ASSOC_TO_N_OK[_REF_WE]
            FROM z_customer_data
            WHERE kunnr = @gs_kunden-kunnr
          INTO CORRESPONDING FIELDS OF TABLE @gs_kunden-ref_we.

          SELECT DISTINCT ltrim( \_ref_v1_partner-ag, '0' ) AS kunnr ##ASSOC_TO_N_OK[_REF_v1_PARTNER]
            FROM z_customer_data
            WHERE kunnr = @gs_kunden-kunnr
          INTO CORRESPONDING FIELDS OF TABLE @gs_kunden-v1_partner.

          SELECT DISTINCT ltrim( \_ref_v1_parent-kunnr, '0' ) AS kunnr ##ASSOC_TO_N_OK[_REF_v1_PARENT]
            FROM z_customer_data
            WHERE kunnr = @gs_kunden-kunnr
          INTO CORRESPONDING FIELDS OF TABLE @gs_kunden-v1_parent.

        ENDIF.

        APPEND gs_kunden TO gt_kunden.
        FREE gs_kunden.

      ENDSELECT.

Folgende Benutzer bedankten sich beim Autor zornbruder für den Beitrag:
Haubi


Seite 1 von 1

Vergleichbare Themen

2
Antw.
6701
Views
Wie kann ich Feld einer tiefen Struktur füllen???
von c oco » 24.02.2011 16:29 • Verfasst in ABAP® für Anfänger
3
Antw.
2685
Views
Struktur richtig füllen
von bohne » 04.01.2007 16:50 • Verfasst in ABAP® für Anfänger
3
Antw.
4296
Views
Dynamisch Struktur und Tabelle generieren und füllen
von Kresiquadratur » 16.07.2007 14:32 • Verfasst in ABAP® für Anfänger
5
Antw.
3617
Views
Select-Option füllen auf Grundlage anderes Feld
von mazu » 18.10.2018 16:29 • Verfasst in ABAP® Core
4
Antw.
2790
Views
Typendeklaration von tiefen Strukturen
von debianfan » 24.05.2017 16:12 • Verfasst in ABAP Objects®

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.