Maciej O.

Maciej O. Analityk ,
Konsultant

Temat: ABAP - pomoc

Witam,

Natrafiłem na problem którego nie mogę rozwiązać mam nadzieję że ktoś mi w nim pomoże.

Poszukuje metody która pozwolila by z jednego rokordu (z formuły sekecji) stworzyć tabelę <nazwa pola> <wartość pola> dla wszystkich kolumn z tego rekordu.

Przykładowy kod:

DATA: jtab LIKE STANDARD TABLE OF VBAK,
ja LIKE LINE OF jtab.

SELECT *
INTO CORRESPONDING FIELDS OF TABLE jtab
FROM VBAK.

IF sy-subrc EQ 0.
LOOP AT jtab INTO ja.
// Pożądana funkcja
ENDLOOP.
ENDIF.

Pytanie jak napisać pętelke tak abym mogł pobrać po kolei wartość kolumny i jej nazwę tak abym mogł dodać wpis do innej tabeli w postaci <nazwa pola> <wartość pola>.

Pozdrawiam
MaciekMaciej Owczarek edytował(a) ten post dnia 23.01.10 o godzinie 20:16
Krzysztof B.

Krzysztof B. HCM Consultant / HCM
ABAP Developer

Temat: ABAP - pomoc

Hej!
Zerknij proszę do zawartości poniższego odnośnika - może być pomocna.
http://help.sap.com/abapdocu_70/en/ABAPMOVE-CORRESPOND...
Maciej O.

Maciej O. Analityk ,
Konsultant

Temat: ABAP - pomoc

Zawartość faktycznie jest pomocna ale nie rozwiązuje całkowicie mojego problemu, ponieważ powinienem stworzyć strukturę do której chce skopiować dane (po nazwach pól zgodnie z linkiem). Ja jednak potrzebuję takiego mechanizmu który dla rekordu z dowolnej tabeli (VBAK, MARA, czy jakiejkolwiek innej) stowrzy mi tabelę w której będe miał dwie kolumny odpowiednio <nazwa pola> i <wartosc pola> dla wszystkich pól z rekordu.
Krzysztof B.

Krzysztof B. HCM Consultant / HCM
ABAP Developer

Temat: ABAP - pomoc

Hej!
W sumie jest to proste, warto jednak najpierw się zastanowić w jakim formacie są Ci potrzebne potem dane z tabeli.
Musisz przepisać różne typy danych do stringa, chyba że będziesz trzymał wartości w strukturze typu:
value_string,
value_data,
value_float,
value_bool.

Ja uproszczę mocno format danych wyjściowych i przekażę wszystko jako string.

Użyję zmiennych:

struktura ls_value:
fname type field_type
fvalue type string

wskaźniki
<ld_fieldname>,<ld_variable>

Plan bym proponował następujący:
- wykonać pętlę po składnikach tabeli, przypisując nazwę kolumny do <ld_fieldname>
- przypisać element struktury ls_vbak o nazwie <ld_fieldname> do <ld_variable>
- do struktury elementów ls_value podpiąć wskaźniki
- strukturę wrzucić w jakąś tabelę

Mam nadzieję, że ta kwestia jest już dla Ciebie jasna i nie sprawi Ci problemu, chociaż osobiście, poszukałbym najpierw w systemie, czy metoda przerabiająca strukturę na tabelę już czasem nie istnieje ;)
Maciej Owczarek:
Zawartość faktycznie jest pomocna ale nie rozwiązuje całkowicie mojego problemu, ponieważ powinienem stworzyć strukturę do której chce skopiować dane (po nazwach pól zgodnie z linkiem). Ja jednak potrzebuję takiego mechanizmu który dla rekordu z dowolnej tabeli (VBAK, MARA, czy jakiejkolwiek innej) stowrzy mi tabelę w której będe miał dwie kolumny odpowiednio <nazwa pola> i <wartosc pola> dla wszystkich pól z rekordu.

konto usunięte

Temat: ABAP - pomoc

Cześć jak masz nowy system to spróbuj RTTS (RTTI i RTTC).
http://wiki.sdn.sap.com/wiki/display/ABAP/Runtime+Type...Wojciech Paweł G. edytował(a) ten post dnia 25.01.10 o godzinie 10:31

konto usunięte

Temat: ABAP - pomoc


REPORT zstct.

TYPES:
BEGIN OF val_ref,
name TYPE string,
value TYPE REF TO data,
END OF val_ref,
BEGIN OF val_string,
name TYPE string,
value TYPE string,
END OF val_string,
val_tab_s TYPE TABLE OF val_string,
val_tab_r TYPE TABLE OF val_ref.

DATA:
_val_string TYPE val_string,
_val_tab_s TYPE val_tab_s,
_val_ref TYPE val_ref,
_val_tab_r TYPE val_tab_r.

*----------------------------------------------------------------------*
* CLASS zgettab DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zgettab DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
gettab IMPORTING dbtab TYPE csequence byref TYPE boolean_flg EXPORTING val_tab TYPE ANY TABLE.
ENDCLASS. "zgettab DEFINITION

*----------------------------------------------------------------------*
* CLASS zgettab IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zgettab IMPLEMENTATION.
METHOD gettab.
DATA:
_type_desc TYPE REF TO cl_abap_typedescr,
_struct_desc TYPE REF TO cl_abap_structdescr,
_table_desc TYPE REF TO cl_abap_tabledescr,
_comp_desc TYPE abap_compdescr,
_table_ref TYPE REF TO data,
_struct_ref TYPE REF TO data,
_components TYPE cl_abap_structdescr=>component_table,
_component LIKE LINE OF _components,
_error TYPE REF TO cx_root,
_type TYPE c,
_comps TYPE i.

FIELD-SYMBOLS: <table> TYPE ANY TABLE,
<struct> TYPE ANY,
<c> TYPE ANY.

cl_abap_typedescr=>describe_by_name(
EXPORTING p_name = dbtab
RECEIVING p_descr_ref = _type_desc
EXCEPTIONS type_not_found = 4 ).

IF sy-subrc = 4.
MESSAGE 'Type not found' TYPE 'E'.
ENDIF.

TRY.
_struct_desc ?= _type_desc.
_components = _struct_desc->get_components( ).
_struct_desc = cl_abap_structdescr=>create( _components ).
_table_desc = cl_abap_tabledescr=>create( _struct_desc ).
CREATE DATA _table_ref TYPE HANDLE _table_desc.
ASSIGN _table_ref->* TO <table>.

SELECT * FROM (dbtab) INTO CORRESPONDING FIELDS OF TABLE <table>.

LOOP AT <table> ASSIGNING <struct>.
DESCRIBE FIELD <struct> TYPE _type COMPONENTS _comps.
DO _comps TIMES.
READ TABLE _struct_desc->components INTO _comp_desc INDEX sy-index.
IF byref EQ ' '.
MOVE _comp_desc-name TO _val_string-name.
ASSIGN COMPONENT sy-index OF STRUCTURE <struct> TO <c>.
MOVE <c> TO _val_string-value.
APPEND _val_string TO _val_tab_s.
CLEAR _val_string.
ENDIF.
IF byref EQ 'X'.
MOVE _comp_desc-name TO _val_ref-name.
ASSIGN COMPONENT sy-index OF STRUCTURE <struct> TO <c>.
GET REFERENCE OF <c> INTO _val_ref-value.
APPEND _val_ref TO _val_tab_r.
CLEAR _val_ref.
ENDIF.
ENDDO.
ENDLOOP.

CATCH cx_sy_move_cast_error INTO _error.
MESSAGE _error TYPE 'E'.
CATCH cx_sy_struct_creation INTO _error.
MESSAGE _error TYPE 'E'.
ENDTRY.
ENDMETHOD. "gettab

ENDCLASS. "zgettab IMPLEMENTATION

START-OF-SELECTION.
zgettab=>gettab(
EXPORTING dbtab = 'SFLIGHT'
byref = 'X'
"lub
"byref = ' '
"RECEIVING = tabela z wynikami
).

W dbtab podajesz nazwę tabeli.
Po wykonaniu dostajesz tabelę z dwoma kolumnami name i value,
wypełnioną wszystkimi danymi z tabeli bazy danych.
Dla byref ' ' wartość (value) danego pola z bazy danych będzie skonwertowana do stringa, dla 'X' będzie trzymana jako referencja, a więc typ zostanie zachowany.

Następna dyskusja:

Sap abap pomoc


«

Moderatorzy

|

GRC

»


Wyślij zaproszenie do