Dynamischer Select

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

Dynamischer Select

Beitrag von m.schwertle (ForumUser / 94 / 0 / 0 ) »
Ich hab ne interne Tabelle (lt_fieldcat) mit Feldangaben drin. Daraus erstelle ich eine Struktur, daraus eine dynamische interne Tabelle.

Code: Alles auswählen.

LOOP AT lt_fieldcat INTO lwa_fieldcat.
  CLEAR ls_component.
  ls_component-name = lwa_fieldcat-fieldname.
  CONCATENATE lwa_fieldcat-tabname lwa_fieldcat-fieldname
    INTO tablefield SEPARATED BY '-'.
  ls_component-type ?= cl_abap_typedescr=>describe_by_name( tablefield ).
  INSERT ls_component INTO TABLE lt_component.
ENDLOOP.

IF lt_component IS NOT INITIAL.
  kr_strucdescr = cl_abap_sctructdescr=>create( lt_component ).
ENDIF.

lr_tabledescr = cl_abap_tabledescr=>create( p_line_type = lr_strucdescr ).

CREATE DATA lr_data_struct TYPE HANDLE lr_strucdescr.
ASSIGN lr_data_struct->* TO <fs_struct>.

CREATE DATA lr_data_table TYPE HANDLE lr_tabledescr.
ASSIGN lr_data_table->* TO <fs_table>.
Später möchte ich nun ein SQL-Select ausführen und die Daten in die interne Tabelle holen.

Code: Alles auswählen.

SELECT (fields)
FROM (table) UP TO p_max ROWS
INTO TABLE <fs_table> PACKAGE SIZE p_clust.

  LOOP AT <fs_table> INTO <fs_struct>.
    TRANSFER <fs_struct> TO filename.
    CLEAR <fs_struct>.
  ENDLOOP.
  REFRESH <fs_table>.

ENDSELECT.
Was zum Teufel ist an dem Code so falsch, dass er jedesmal abbricht mit Laufzeitfehler UC_OBJECTS_NOT_CHARLIKE. In der Zeile

Code: Alles auswählen.

TRANSFER <fs_struct> TO filename.
sieht er das Problem. Sind etwa Daten in der Tabelle, die er nicht übertragen kann?

Wär nett, wenn jemand nen Hinweis für mich hat - ick dreh hier noch (janz jemütlich) durch! ;)

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


Beitrag von TWP (Specialist / 445 / 0 / 1 ) »
Hi,

nur so ne Vermutung,

-> die Struktur enthält Felder, die er nicht convertieren kann
-> stell mal den Dataset output auf BINARY

schönes weekend

Thomas

Beitrag von m.schwertle (ForumUser / 94 / 0 / 0 ) »
Scheint ein guter Ansatz zu sein, jetzt läuft es erstmal ohne diese Ausnahme.

Wenn ich bei grossen Tabellenabfragen (wie z.B. BSEG) ein Timeout kriege, kann ich das irgendwie umgehen? Also ich arbeite schon mit SELECT ... PACKAGE SIZE n, um nicht alles auf einmal zu bearbeiten.

Aber ist doch klar, dass grosse Tabellen auch sehr lange dauern. Kann man das nicht auffangen? Sonst ist es ja nie möglich, in ABAP eine Routine zu schreiben, die so grosse Tabellen wie die BSEG runterladen kann?

Beitrag von m.schwertle (ForumUser / 94 / 0 / 0 ) »
Es scheint zu helfen/funktionieren, wenn man einen nicht zu hohen Wert für das n (bei PACKAGE SIZE n) wählt. Das klingt auch informationstechnisch logisch. Ist es das in euren Augen auch?

Beitrag von m.schwertle (ForumUser / 94 / 0 / 0 ) »
Hm also irgendwas läuft da total faul bei mir, heraus kommt sowas

Code: Alles auswählen.

Directory:  /usr/sap/trans/tmp
Name:       F04_903_20080225_1040_BSEG.txt

# # # # # # # # # # # # # # # # # #0#0#0#0#0#0#0# #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0# # # # # # # # # # # # # # # # # # # # # # # # # # # # # ############################# # # # # #
Wenngleich da sowas (oder sowas ähnliches) drin stehen sollte...

Code: Alles auswählen.

90310001600000000200700100.00.000000.00.000011DHAN20,0020,00
90310001600000000200700200.00.000000.00.000040SSAN17,2417,24
903100016000000002007003T00.00.000000.00.000040SSAN2,762,76
90310001600000001200700100.00.000000.00.000011DHAN10,0010,00
90310001600000001200700200.00.000000.00.000040SSAN8,628,62
903100016000000012007003T00.00.000000.00.000040SSAN1,381,38
90310001600000002200700100.00.000000.00.000011DHAN1.299,781.299,78
90310001600000002200700200.00.000000.00.000040SSAN1.120,501.120,50
903100016000000022007003T00.00.000000.00.000040SSAN179,28179,28
Hm, grml, grmpf...

Beitrag von natallin (ForumUser / 10 / 0 / 0 ) »
Hallo,
DAATA f(1024) type c.

SELECT (fields)
FROM (table) UP TO p_max ROWS
INTO TABLE <fs_table> PACKAGE SIZE p_clust.

LOOP AT <fs_table> INTO <fs_struct>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_table> TO <fs_struct>.
IF sy-subrc <> 0. EXIT. ENDIF.
f = <fs_struct>.
SHIFT f LEFT DELETING LEADING space. " für die Daten TYPE 'P'
ENDDO.

TRANSFER f TO filename.
CLEAR <fs_struct>.
ENDLOOP.
REFRESH <fs_table>.

ENDSELECT.


Gruß
Natallin

Beitrag von m.schwertle (ForumUser / 94 / 0 / 0 ) »
Hiho, vielen Dank für den Hinweis. Leider klappt dein Vorschlag nicht. Statt

Code: Alles auswählen.

ASSIGN COMPONENT sy-index OF STRUCTURE <fs_table> TO <fs_struct>.
müsste es so oder ähnlich lauten:

Code: Alles auswählen.

ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struct> TO <fs_comp>.
So habe ich es jetzt auch gemacht, allerdings zusätzlich mit CONCATENATE, was die ganze Sache natürlich erheblich unperformant macht...

Code: Alles auswählen.

SELECT (ob_select->n_t_where)
  FROM (ob_from->n_t_where) UP TO p_max ROWS
  INTO TABLE <fs_table> PACKAGE SIZE p_clust
  WHERE (ob_where->n_t_where).

  LOOP AT <fs_table> INTO <fs_struct>.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struct> TO <fs_comp>.
      IF sy-subrc NE 0. EXIT. ENDIF.
      fragment = <fs_comp>.
      CLEAR <fs_comp>.
      SHIFT fragment LEFT DELETING LEADING space.
      CONCATENATE line fragment INTO line SEPARATED BY separator.
      CLEAR fragment.
    ENDDO.
    SHIFT line LEFT DELETING LEADING separator.

    TRY.
        TRANSFER line TO filename.
      CATCH cx_sy_conversion_codepage.
        result = 'Eine Zeichensatzkonvertierung ist nicht möglich'.
        CLEAR count.
    ENDTRY.
    CLEAR line.
    ADD 1 TO count.
  ENDLOOP.
  REFRESH <fs_table>.

ENDSELECT.
Nichtsdestotrotz tausend Dank für Deine Mühen!

Beitrag von edwin (Specialist / 306 / 11 / 68 ) »
Hallo,

bist Du sicher, daß Du mit den ausgegebenen Daten danach noch etwas anfangen kannst ? Es wir ja alles zusammengeschoben, damit kannst Du ja auh keine Felder mehr zu Deiner Ausgangsstruktur zuordnen - wäre es da nicht besser noch ein Feldseparator mit auszugeben, z.B mit concatenate.... separated by ';' oder ähnliche Konstruktion ?

Gruss Edwin

*edit
da habe ich wohl Tomaten auf den Augen gehabt - Deinen Separator habe ich übersehen - sorry :oops:

Thema BSEG

Beitrag von wolli (ForumUser / 85 / 3 / 1 ) »
Hallo!
Das Problem hatte ich auch schon.
Da hilft, vorher die Tabellen BSIS, BSAS (Sachkonten), BSID,BSAD (Debitoren), BSIK, BSAK (Kreditoren) zu lesen, je nachdem welche Daten benötigt werden. Und anhand der hier selektierten Daten kann dann die Tabelle BSEG gelesen werden, geht weitaus schneller.
Gruß Ramona

Re: Thema BSEG

Beitrag von ralf.wenzel (Top Expert / 3961 / 204 / 281 ) »
wolli hat geschrieben:Da hilft, vorher die Tabellen BSIS, BSAS (Sachkonten), BSID,BSAD (Debitoren), BSIK, BSAK (Kreditoren) zu lesen
Wenn die Konten um die es geht entsprechend ausgesteuert sind!!!



Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Seite 1 von 1

Vergleichbare Themen

6
Antw.
991
Views
Dynamischer Platzhalter im Select
von kaim77 » 07.09.2022 17:42 • Verfasst in ABAP® Core
3
Antw.
2317
Views
Select mit dynamischer Range
von platx » 15.08.2009 10:59 • Verfasst in ABAP® für Anfänger
2
Antw.
1672
Views
Dynamischer Zugriff im Select
von GERDLA » 01.11.2005 14:38 • Verfasst in ABAP® Core
13
Antw.
9237
Views
Dynamischer Selection Screen mit dynamischer Suchhilfe
von Johnny11 » 26.03.2014 08:19 • Verfasst in ABAP® Core
2
Antw.
3581
Views
Dynamischer Methodenaufruf mit dynamischer Tabelle
von mark.thk » 12.12.2018 10:34 • 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.