[CDS-Views] Übersicht zu nützlichen CDS-Views

ObjekteCDS-ViewKurzbezeichnungBemerkung
AdresseI_AddressAddressADCP, ADRC
AdresseI_Address_2Address of an Organization or a PersonADRP, ADCP, ADRC
ÄnderungsbelegeI_InvgCsMChangeLogICM Change LogCDHDR, CDPOS
AuftragI_OrderOrder HeaderAUFK, AFKO
AuftragI_OrderItemOrder ItemAFPO
AuftragI_SalesOrderSales OrderVBKD, VEDA, VBAK
AuftragI_SalesOrderItemSales Order ItemVBAP, VBAK, VBKD, VEDA
AuftragI_SalesDocumentSales DocumentVBKD, VEDA, VBAK
AuftragI_SalesDocumentItemSales Document ItemVBAP, VBAK, VBKD, VEDA
AuftragI_SalesOrderCubeSales Order – CubeVBAP, VBKD, VEDA, VBAK, FPLT, VBEP
BenutzerI_UserUserUSR21
BestellanforderungA_PurchaseRequisitionItemItemEBAN
BestellanforderungI_PurchaserequisitionitemPurchase Requisition ItemEBAN
BestellanforderungA_PurReqnAcctAssgmtAccount AssignmentEBAN, EBKN
BestellanforderungI_PurchaseReqnItemPurchase Requisition ItemsEBAN
BestellanforderungI_PurchaserequisitionPurchase Requisition HeaderEBAN
BestellungA_PurchaseOrderPurchase OrderEKKO
BestellungI_PurchaseOrderEnhancedPurchase Order enhancedEKKO, EKPO, EKET, EKBE
BestellungA_PurchaseOrderItemItemEKKO, EKPO
BestellungI_PurchaseorderItemEnhancedPurchase Order Item enhancedEKKO, EKPO, EKET, EKBE
BestellungI_PurchaseOrderItemAPI01Purchase Order ItemEKKO, EKPO
BestellungC_PurchaseOrderItemMoniMonitor Purchase Order ItemsEKKO, EKPO, EKET, EKES, EKBE
BestellungA_PurOrdAccountAssignmentAccount AssignmentEKKO, EKPO, EKKN
BestellungI_PurOrdAccountAssignmentPurchase Order Account AssignmentEKKO, EKPO, EKKN
BestellungC_PurchaseorderitemacctmntrPurchase Order Items by Account AssignmentEKKO, EKPO, EKKN, EKET, EKBE, AFKO
BestellungI_PurchasingDocumentItemPurchasing Document ItemEKKO, EKPO
BestellungC_PoItemMoniCalcFieldCalculation field for Monitor POEKKO, EKPO, EKBE
BestellungR_POItemNextDeliveryCalcPO Item Next Delivery CalculationEKKO, EKPO, EKET
BestellungA_PurchaseOrderScheduleLineSchedule LinesEKKO, EKPO, EKET
BestellungI_PurchaseOrderScheduleLinePurchase Order Schedule LineEKKO, EKPO, EKET
BestellungI_PurgDocScheduleLinePurchasing Document Schedule LineEKET
BestellungI_PurchaseOrderHistoryBasicPurchase Order HistoryEKKO, EKPO, EKBE
BestellungI_PurchaseOrderHistoryPurchase Order HistoryEKKO, EKPO, EKBE
BestellungI_POSubcontractingCompAPI01Subcontracting Component in PurOrdEKKO, RESB
BestellungI_PurOrdPricingElementPurchase Order Pricing ElementEKKO, PRCD_ELEMENTS
BestellungI_SupplierPurchasingOrgSupplier Purchasing OrganizationLFA1, LFM1
BewertungskreisI_ValuationAreaValuation AreaT001K
BuchhaltungsbelegI_JournalEntryJournal EntryBKPF
BuchhaltungsbelegI_JournalEntryItemJournal Entry ItemACDOCA, FINSC_LEDGER_REP
BuchungskreisI_CompanyCodeCompany CodeT001
ControllingI_ControllingCommitmentCommitment for ControllingCOOI
ControllingI_ControllingCommitmentLineItmCommitment Line Item ControllingCOOI, CSKS
DictionaryRsodp_Abap_Cds_View2stobABAP CDS: Name of SQL View and Structure ObjectDDLDEPENDENCY
DictionaryVfs_Object_SearchSearchTTREE, BADI_SPOT, TDEVC, TADIR, DD021, SEDT_PROGRAM, SEDT_FUNC, SEDT_WDYN, V_DDLDEP, WDY_COMPONENT
Dictionaryris_quick_search_viewQuick Search: Ctrl.+Shift.+ATTREE, BADI_SPOT, TDEVC, TADIR, DD021, SEDT_PROGRAM, SEDT_FUNC, SEDT_WDYN, V_DDLDEP, WDY_COMPONENT
Dokumenteninfosatzshsm_drad_drawValue help for search help CV01ODRAD, DRAW
DokumenteninfosatzP_DocumentInfoRecordAttachmentDocument Info Record AttachmentDMS_DOC2LOIO, DMS_PHIO2FILE, DMS_PH_CHKO_CD1, DMS_DOC_FILES, DMS_PHF_CD1, DMS_PH_CD1
DokumenteninfosatzA_DocumentInfoRecordAttchAttachments for Document Info RecordDRAT, TDWS, TDWST, DOST, DRAW
DokumenteninfosatzP_DocInfoRecdOriginalOriginals Of Document Info RecordsDMS_DOC2LOIO, DMS_PHIO2FILE, DMS_PH_CHKO_CD1, DMS_DOC_FILES, DMS_PHF_CD1, DMS_PH_CD1
EinkäufergruppeI_PurchasingGroupPurchasing GroupT024
EinkaufsinfosatzM_V_inforecordInforecordEINA, EINE
EinkaufsinfosatzI_PurchasingInfoRecordApi01Purchasing Info RecordEINA
EinkaufsinfosatzI_PurgInfoRecdOrgPlntDataApi01Org Plant Data for Purch Info RecordEINE
FioriCDS_SUI_TM_MM_CATCDS View for Catalogs
FioriCDS_SUI_TM_MM_APPCDS View for App Descriptor Items
GeschäftspartnerI_BusinessPartnerBusiness PartnerBUT000
GeschäftspartnerI_CustomerCustomerKNA1
GeschäftspartnerI_SupplierSupplierLFA1
Kalender, DatumI_CalendarDateDateSCAL_TT_DATE
Klassen, MerkmaleI_ClfnCharcBasicClassification Characteristic BasicCABN
Klassen, MerkmaleI_CharacteristicCharacteristicCABN
Klassen, MerkmaleI_RelstartcharCharacteristic Basic ViewCABN, CABNT
Klassen, MerkmaleI_ClassHeaderClass HeaderKLAH
Klassen, MerkmaleI_ClfnClassClassification ClassKLAH
Klassen, MerkmaleI_RelstratclassManage Class Basic ViewKLAH, SWOR
KontraktI_PurchaseContractPurchase ContractEKKO
KontraktA_PurchaseContractItemItemEKKO, EKPO
KontraktI_PurchaseContractItemPurchase Contract ItemEKKO, EKPO
KontraktI_PurContrAccountAssgmtPurchase Contract Account AssignmentEKKO, EKPO, EKKN
KontraktI_PurContrValidityStatusPurchase Contract Validity StatusEKKO, EKPO, EKAB
KontraktI_PurCtrAddressAddress For Contract ItemEKKO, EKPO, ADCP, ADRC
KostenrechnungskreisI_ControllingAreaControlling AreaTKA01, T000
LagerortI_StorageLocationStorage LocationT001L
LeistungserfassungI_ServiceEntrySheetService Entry SheetEKKO, EKPO, EKET
LeistungserfassungI_ServiceEntrySheetItemService Entry Sheet ItemEKKO, EKPO, EKET, MARA
LieferbelegI_DeliveryDocumentDelivery DocumentLIKP
LieferbelegI_DeliveryDocumentItemDelivery Document ItemLIKP, LIPS
MaterialI_SlowOrNonMovingMatlCubeSlow or Non-Moving MaterialsMATDOC, MARA, MAKT, CKMLCR, VBKD, VEDA, VBAK
MaterialA_ProductPlantPlant DataMARA, MARC
MaterialI_ProductPlantProduct PlantMARA, MARC
MaterialI_MaterialMaterialMARA
MaterialI_ProductProductMARA
MaterialI_MaterialInclStorLocationMaterial including Storage LocationMARA, MARC, MARD
MaterialI_MaterialStockMaterial Stock CalculationMATDOC
MaterialI_MaterialValuationPricesMaterial Valuation PricesCKMLCR, CKMLHD, PRPS, CKMLPR
MaterialI_ProductValuationTP_2Product Valuation - TP
MaterialI_ProdValnLedgerAccountTP_2Product Valuation Ledger Account - TP
MaterialI_ProdValuationAccountingTP_2Product Valuation Accounting - TP
MaterialI_ProductPlantTP_2Product Plant - TP
MaterialI_MaterialGroupTextMaterial Group TextT023, T023T
MaterialI_ProductUnitsOfMeasureUnits of Measure of ProductMARA, MARM
MaterialbelegeI_MaterialDocumentHeader_2Material Document HeaderMATDOC
MaterialbelegeI_MaterialDocumentItem_2Material Document ItemMATDOC
MengeneinheitenI_UnitOfMeasureUnit of MeasureT006, T006A
Profit CenterSHSM_PROFITCENTER_VHProfit Center Value HelpCEPC, CEPCT
ProjektI_ProjectProject Definition DetailsPROJ
PSP-ElementI_MM_WBSElementValueHelpPurchasing WBS Element Value HelpPROJ, PRPS
PSP-ElementI_WBSElementWBS Element DetailsPRTE, PROJ, PRPS
ReservierungI_ReservationDocumentHeaderReservation Document HeaderRKPF
ReservierungI_ReservationDocumentItemReservation Document ItemRKPF, RESB
SAPscriptI_TextObjectText ObjectSTHX, STXL
VertriebI_SalesDocumentSales DocumentVBKD, VEDA, VBAK
WährungI_CurrencyCurrencyTCURC, TCURX
WerkI_PlantPlantT001W
Werk, Buchungskreis, KostenrechnungskreisP_Kkag_Werk_Bukrs_KokrsPlant - Company Code - Co AereaT001K, T001W, TKA02
Werk, EinkaufsorganisationC_MM_PlantValueHelpPlant Value HelpT001W, T024E
WorkflowC_WorkflowtaskDEPRECATED: Work item with text infoSWWWIHEAD, SWPSTEPLOG, SWWWITEXT
WorkflowI_WorkflowTaskWorkflow work itemsSWWWIHEAD, SWPSTEPLOG, SWWWICOMMENT

Pakete

ODATA_MM_COMMONS_VH (Eingabehilfe-Consumption-Views für MM)

Links

erp-up.de

  • ABAP Cloud: Die wichtigsten CDS Views

SAP API für CDS-Views

  • SAP-Standard CDS Views suchen

SAP Virtuelles Datenmodell und CDS-Views

  • Dokumentation von CDS-Views über verschiedene Geschäftsbereiche

paspas.io

  • Datenquellen (CDS-Views, Tabellen) finden

[ABAP] Pivot-Darstellung von Feldwerten eines CDS-Views / SELECT-Statements (CASE, SUM, STRING_AGG, substring_regexpr, RegEx, PCRE, UNION, COLLECT)

Variante 1 (CDS-View mit CASE, SUM, GROUP BY)

* Daten werden hier mit CDS-View R_ProdValuationLedgerAccountTP (Product Valuation Ledger Account - TP) gelesen
* Suche der Periodischen Verrechnungspreise im Material Ledger über
* CDS-View r_prodvaluationledgeraccounttp (Product Valuation Ledger Account - TP).
* Das CDS-View liefert zeilenweise zu jedem Währungstyp einen Preis, die jeweils leeren Zeilen für die Preise
* (price_10, price_30, price_31) werden mit dem Wert '0.0' vorbelegt.
* Durch die Summenbildung pro Gruppe werden die Datensätze zu einer Zeile mit den zug. Preisen in Spalten zusammengefasst.
* Die Typkonvertierung abap.curr <-> abap.dec ist notwendig, da die Funktion sum( ) nur mit abap.dec arbeitet.
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Testview für PIVOT'
@Metadata.ignorePropagatedAnnotations: true
@ObjectModel.usageType:{
    serviceQuality: #X,
    sizeCategory: #S,
    dataClass: #MIXED
}
define view entity Z_CDS_PIVOT
  as select from R_ProdValuationLedgerAccountTP
{
  key Product,
  key ValuationArea,
  key ValuationType,
  @EndUserText.label: 'Ledger'
  key Ledger,
      Currency,
  // Summe der Spalte MovingAveragePrice für Währungstyp 10
  @EndUserText.label: 'Preis WT 10'
  @Semantics.amount.currencyCode: 'Currency'
      cast(sum(case when CurrencyRole = '10' then cast(MovingAveragePrice as abap.dec( 16, 2 )) else 0.0 end) as abap.curr( 16, 2 )) as price_10,
  // Summe der Spalte MovingAveragePrice für Währungstyp 30
  @EndUserText.label: 'Preis WT 30'
  @Semantics.amount.currencyCode: 'Currency'
      cast(sum(case when CurrencyRole = '30' then cast(MovingAveragePrice as abap.dec( 16, 2 )) else 0.0 end) as abap.curr( 16, 2 )) as price_30,
  // Summe der Spalte MovingAveragePrice für Währungstyp 31
  @EndUserText.label: 'Preis WT 31'
  @Semantics.amount.currencyCode: 'Currency'
      cast(sum(case when CurrencyRole = '31' then cast(MovingAveragePrice as abap.dec( 16, 2 )) else 0.0 end) as abap.curr( 16, 2 )) as price_31
}
// Gruppierung, damit die Summenbildung oben pro Gruppe (Produkt / Währungstyp) erfolgt
group by Product,
         ValuationArea,
         ValuationType,
         Ledger,
         Currency,
         MovingAveragePrice

Variante 2 (SELECT, SUM, CASE, GROUP BY)

* Im Beispiel werden durch Anweisungen in einem SELECT-Statement mehrere Zeilen einer Rückgabemenge zu einer Zeile zusammengefasst (gruppiert).
* Kern der Funktion zur Umwandlung der Zeilenwerte in Spaltenwerte sind die Funktionen:
*  SUM( )
*  CASE
*  GROUP BY

PARAMETERS: p_matnr TYPE r_prodvaluationledgeraccounttp-product DEFAULT '1122334455'.
PARAMETERS: p_bwkey TYPE r_prodvaluationledgeraccounttp-valuationarea DEFAULT '0001'.
PARAMETERS: p_bwtar TYPE r_prodvaluationledgeraccounttp-valuationtype DEFAULT ''.
PARAMETERS: p_ledger TYPE r_prodvaluationledgeraccounttp-ledger DEFAULT '0L'.

START-OF-SELECTION.
* Suche der Periodischen Verrechnungspreise im Material Ledger über
* CDS-View r_prodvaluationledgeraccounttp (Product Valuation Ledger Account - TP).
* Das SELECT liefert zeilenweise zu jedem Währungstyp einen Preis, die jeweils leeren Zeilen für die Preise
* (price_10, price_30, price_31) werden mit dem Wert dec`0.00` vorbelegt.
* Durch die Summenbildung pro Gruppe werden die Datensätze zu einer Zeile mit den zug. Preisen in Spalten zusammengefasst.
  SELECT FROM r_prodvaluationledgeraccounttp AS l
    FIELDS
      l~product,
      l~valuationarea,
      l~valuationtype,
      l~ledger,
      l~currency,
* Summe der Spalte MovingAveragePrice für Währungstyp 10
      SUM( CASE WHEN currencyrole = '10' THEN movingaverageprice ELSE dec`0.00` END ) AS price_10,
* Summe der Spalte MovingAveragePrice für Währungstyp 30
      SUM( CASE WHEN currencyrole = '30' THEN movingaverageprice ELSE dec`0.00` END ) AS price_30,
* Summe der Spalte MovingAveragePrice für Währungstyp 31
      SUM( CASE WHEN currencyrole = '31' THEN movingaverageprice ELSE dec`0.00` END ) AS price_31
    WHERE l~product       EQ @p_matnr
      AND l~valuationarea EQ @p_bwkey
      AND l~valuationtype EQ @p_bwtar
      AND l~ledger        EQ @p_ledger
* Gruppierung, damit die Summenbildung oben pro Gruppe (Produkt / Währungstyp) erfolgt
    GROUP BY l~product,
             l~valuationarea,
             l~valuationtype,
             l~ledger,
             l~currency,
             l~movingaverageprice
    ORDER BY l~product
    INTO TABLE @DATA(it_product).

  IF sy-subrc = 0.
* Daten im Inline-Browser im SAP-Fenster anzeigen
    cl_abap_browser=>show_html( EXPORTING title       = 'Pivot'
                                          html_string = cl_demo_output=>new( )->write_data( it_product )->get( )
                                          container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
    WRITE: space.
  ENDIF.

Variante 3 (SELECT, STRING_AGG, substring_regexpr, GROUP BY)

* Im Beispiel werden durch Anweisungen in einem SELECT-Statement mehrere Zeilen einer Rückgabemenge zu einer Zeile zusammengefasst (gruppiert).
* Kern der Funktion zur Umwandlung der Zeilenwerte in Spaltenwerte sind die Funktionen:
*  STRING_AGG( )
*  substring_regexpr( ) mit PCRE-RegEx
*  GROUP BY
 
* als Konstanten für die PCRE-RegEx sind nur elementare Datentypen (keine Strings) erlaubt (hier: CHAR)
* die Längen der Zeichenketten müssen exakt stimmen,
* sonst funktioniert das Pattern-Matching bei der RegEx nicht
* zum Testen der PCRE-RegEx siehe auch: https://regex101.com/
CONSTANTS: co_part1 TYPE char11 VALUE '^(\d+\.\d+)'.
CONSTANTS: co_part2 TYPE char21 VALUE '^\d+\.\d+\|\K\d+\.\d+'.
CONSTANTS: co_part3 TYPE char31 VALUE '^\d+\.\d+\|\d+\.\d+\|\K\d+\.\d+'.
 
PARAMETERS: p_matnr TYPE i_prodvalnledgeraccounttp_2-product DEFAULT '1122334455'.
PARAMETERS: p_bwkey TYPE i_prodvalnledgeraccounttp_2-valuationarea DEFAULT '0001'.
PARAMETERS: p_bwtar TYPE i_prodvalnledgeraccounttp_2-valuationtype DEFAULT ''.
PARAMETERS: p_ledger TYPE i_prodvalnledgeraccounttp_2-ledger DEFAULT '0L'.
 
START-OF-SELECTION.
* Suche der Periodischen Verrechnungspreise im Material Ledger über
* CDS-View I_PRODVALNLEDGERACCOUNTTP_2 (Product Valuation Ledger Account - TP)
* das SELECT liefert zeilenweise zu jedem Währungstyp einen Preis
* über STRING_AGG werden die Preise zu einer Gruppe mit Trennzeichen zusammengefasst
* mit substring_regexpr kann über eine RegEx dann ein Teil (erster, mittlerer oder letzter) dieser Gruppe extrahiert werden
  SELECT FROM i_prodvalnledgeraccounttp_2 AS pa
    FIELDS
      pa~product,
      pa~valuationarea,
      pa~ledger,
      pa~productpriceunitquantity,
      pa~currency,
      pa~standardprice,
      pa~companycode,
      pa~baseunit,
* Beispiel: periodische Verrechnungspreise als Gruppe zu einem String mit Trennzeichen "," zusammenfassen
      STRING_AGG( CAST( pa~movingaverageprice AS CHAR ), ', ' ) AS avg_price_all,
* Beispiel: periodische Verrechnungspreise als Gruppe zu einem String mit Trennzeichen "|" zusammenfassen
*           und über eine PCRE-RegEx den ersten Wert bis zum Trennzeichen "|" in eine Spalte avg_price1 schreiben
      substring_regexpr( pcre = @co_part1, value = STRING_AGG( CAST( pa~movingaverageprice AS CHAR ), '|' ) ) AS avg_price1,
* Beispiel: periodische Verrechnungspreise als Gruppe zu einem String mit Trennzeichen "|" zusammenfassen
*           und über eine PCRE-RegEx den mittleren Wert von "|" bis "|" in eine Spalte avg_price2 schreiben
      substring_regexpr( pcre = @co_part2, value = STRING_AGG( CAST( pa~movingaverageprice AS CHAR ), '|' ) ) AS avg_price2,
* Beispiel: periodische Verrechnungspreise als Gruppe zu einem String mit Trennzeichen "|" zusammenfassen
*           und über eine PCRE-RegEx den letzen Wert ab "|" in eine Spalte avg_price3 schreiben
      substring_regexpr( pcre = @co_part3, value = STRING_AGG( CAST( pa~movingaverageprice AS CHAR ), '|' ) ) AS avg_price3
    WHERE pa~product       EQ @p_matnr
      AND pa~valuationarea EQ @p_bwkey
      AND pa~valuationtype EQ @p_bwtar
      AND pa~ledger        EQ @p_ledger
    GROUP BY pa~product,
             pa~valuationarea,
             pa~ledger,
             pa~productpriceunitquantity,
             pa~currency,
             pa~standardprice,
             pa~companycode,
             pa~baseunit
    ORDER BY pa~product
    INTO TABLE @DATA(it_product).
 
  IF sy-subrc = 0.
    TRY.
* SALV-Table
        DATA: o_salv TYPE REF TO cl_salv_table.
 
        cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                                CHANGING  t_table      = it_product ).
 
* Grundeinstellungen
        o_salv->get_functions( )->set_all( abap_true ).
        o_salv->get_columns( )->set_optimize( abap_true ).
        o_salv->get_display_settings( )->set_list_header( 'Pivot' ).
        o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
        o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).
 
* Spaltenüberschriften: technischer Name und Beschreibungstexte, Short Text und Medium Text leer lassen für Autosize
        LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
          DATA(o_col) = <c>-r_column.
          o_col->set_short_text( || ).
          o_col->set_medium_text( || ).
          IF o_col->get_long_text( ) IS INITIAL.
            o_col->set_long_text( |{ o_col->get_columnname( ) }| ).
          ELSE.
            o_col->set_long_text( |{ o_col->get_long_text( ) }| ).
          ENDIF.
        ENDLOOP.
 
        o_salv->display( ).
      CATCH cx_root INTO DATA(e_txt).
        WRITE: / e_txt->get_text( ).
    ENDTRY.
  ENDIF.

Variante 4 (SELECT, UNION, COLLECT)

TYPES: BEGIN OF ty_s_product,
         product TYPE i_prodvalnledgeraccounttp_2-product,
* Platzhalter für die Periodischen Verrechnungspreise je Währungstyp
         p1      TYPE i_prodvalnledgeraccounttp_2-movingaverageprice,
         p2      TYPE i_prodvalnledgeraccounttp_2-movingaverageprice,
         p3      TYPE i_prodvalnledgeraccounttp_2-movingaverageprice,
       END OF ty_s_product.

TYPES: ty_it_product TYPE STANDARD TABLE OF ty_s_product WITH DEFAULT KEY.

PARAMETERS: p_matnr TYPE i_prodvalnledgeraccounttp_2-product DEFAULT '1122334455'.
PARAMETERS: p_bwkey TYPE i_prodvalnledgeraccounttp_2-valuationarea DEFAULT '0001'.
PARAMETERS: p_bwtar TYPE i_prodvalnledgeraccounttp_2-valuationtype DEFAULT ''.
PARAMETERS: p_ledger TYPE i_prodvalnledgeraccounttp_2-ledger DEFAULT '0L'.

START-OF-SELECTION.

  DATA: it_product_union TYPE ty_it_product.

* Suche der Periodischen Verrechnungspreise pro Währungstyp im Material Ledger über
* CDS-View I_PRODVALNLEDGERACCOUNTTP_2 (Product Valuation Ledger Account - TP)
* Die Datensätze pro Währungstyp werden hier über ein UNION-Statement zu einer Ausgabemenge
* zusammengeführt. Dabei werden die jeweils leeren Preise für p1, p2, p3 mit dec`0.00` vorbelegt,
* damit später bei COLLECT die Werte korrekt in einer Zeile verdichtet werden.

* erstes SELECT für Währungstyp '10'
  SELECT FROM i_prodvalnledgeraccounttp_2 AS pa
    FIELDS
        pa~product,
        pa~movingaverageprice AS p1,
        dec`0.00` AS p2,
        dec`0.00` AS p3
    WHERE pa~product       EQ @p_matnr
      AND pa~valuationarea EQ @p_bwkey
      AND pa~valuationtype EQ @p_bwtar
      AND pa~ledger        EQ @p_ledger
      AND pa~currencyrole  EQ '10'
  UNION
* zweites SELECT für Währungstyp '30'
  SELECT FROM i_prodvalnledgeraccounttp_2 AS pa
    FIELDS
        pa~product,
        dec`0.00` AS p1,
        pa~movingaverageprice AS p2,
        dec`0.00` AS p3
    WHERE pa~product       EQ @p_matnr
      AND pa~valuationarea EQ @p_bwkey
      AND pa~valuationtype EQ @p_bwtar
      AND pa~ledger        EQ @p_ledger
      AND pa~currencyrole  EQ '30'
  UNION
* drittes SELECT für Währungstyp '31'
  SELECT FROM i_prodvalnledgeraccounttp_2 AS pa
    FIELDS
        pa~product,
        dec`0.00` AS p1,
        dec`0.00` AS p2,
        pa~movingaverageprice AS p3
    WHERE pa~product       EQ @p_matnr
      AND pa~valuationarea EQ @p_bwkey
      AND pa~valuationtype EQ @p_bwtar
      AND pa~ledger        EQ @p_ledger
      AND pa~currencyrole  EQ '31'
  INTO CORRESPONDING FIELDS OF TABLE @it_product_union.

  IF sy-subrc = 0.
* Daten-Aufbereitung
    DATA: it_product_pivot TYPE HASHED TABLE OF ty_s_product WITH UNIQUE KEY product.

    LOOP AT it_product_union ASSIGNING FIELD-SYMBOL(<p>).
* COLLECT verdichtet gleiche Datensätze zu einem Datensatz, verwendet intern HASHED TABLES
* Zu beachten ist dabei, dass beim Verdichten die Zahlenwerte (int, fltp, dec usw.)
* der einzelnen Zeilen summiert werden!
      COLLECT <p> INTO it_product_pivot.
    ENDLOOP.

* Daten im Inline-Browser im SAP-Fenster anzeigen
    cl_abap_browser=>show_html( EXPORTING title       = 'Pivot'
                                          html_string = cl_demo_output=>new( )->write_data( it_product_union )->write_data( it_product_pivot )->get( )
                                          container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
    WRITE: space.

  ENDIF.

Links

[ABAP] Zu einem Datum spezielle Kalenderwerte ausgeben

* liest Tabelle SCAL_TT_DATE (Date table containing dates from 01011900 to 31129999) mit folgenden Werten:
* Kalenderjahr
* Kalenderquartal
* Kalendermonat
* Kalenderwoche
* Kalendertag
* Jahr Monat
* Jahr Quartal
* Jahr Woche
* Wochentag
* Datum für ersten Tag
* Erster Tag d. Monats
* Letzter Tag Monat
* Kalendertag des J.
* Tag des Jahres
SELECT SINGLE FROM i_calendardate AS i
  FIELDS *
  WHERE i~calendardate EQ @sy-datum
  INTO @DATA(lv_cal).

IF sy-subrc = 0.
  cl_abap_browser=>show_html( EXPORTING
                                title        = 'aktuelle Kalenderdaten'
                                html_string  = cl_demo_output=>new( )->write_data( lv_cal )->get( )
                                container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

[ABAP] SALV: Selektierte Zeilen (selected rows) eines SALV-Gitters auswerten

* Beispiel für die Auswertung von selektierten Zeilen eines SALV-Grids,
* nachdem ein Button in der Toolbar geklickt wurde
CLASS lcl_salv DEFINITION FINAL.

  PUBLIC SECTION.

* Variablen
    CLASS-DATA: it_data TYPE ty_it_mytable.
    CLASS-DATA: o_salv TYPE REF TO cl_salv_table.
	
* Eventhandler-Methode für Button-Klicks in der Toolbar des SALV-Grids
    CLASS-METHODS: on_toolbar_click FOR EVENT added_function OF cl_salv_events_table
      IMPORTING
        e_salv_function
        sender.
ENDCLASS.

CLASS lcl_salv IMPLEMENTATION.

  METHOD on_toolbar_click.
	TRY.
		IF o_salv IS BOUND.

		  CASE e_salv_function.

			WHEN 'BTN_CHECK'.

* selektierte Zeilen des SALV-Grids holen
			  DATA(it_sel_rows) = o_salv->get_selections( )->get_selected_rows( ).
			  IF lines( it_sel_rows ) > 0.
* Daten aus der internen Tabelle holen
				DATA(it_items) = VALUE ty_it_mytable( FOR <s> IN it_sel_rows ( it_data[ <s> ] ) ).

				...


			  ENDIF.

		  ENDCASE.

		ENDIF.

	  CATCH cx_root INTO DATA(e_txt).
		MESSAGE e_txt->get_text( ) TYPE 'I'.
	ENDTRY.

  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

    TRY.
        cl_salv_table=>factory( EXPORTING r_container  = cl_gui_container=>default_screen
                                IMPORTING r_salv_table = lcl_salv=>o_salv
                                CHANGING  t_table      = lcl_salv=>it_data ).
        ...

* eigenen Button in die Toolbar hinzufügen		
        lcl_salv=>o_salv->get_functions( )->add_function( name = 'BTN_CHECK'
                                                          icon = |{ icon_icon_list }|
                                                          text = 'Check'
                                                          tooltip = 'Check'
                                                          position = if_salv_c_function_position=>right_of_salv_functions ).

* Klick-Handler für Toolbar-Buttons													  
        SET HANDLER lcl_salv=>on_toolbar_click FOR lcl_salv=>o_salv->get_event( ).

        ...
		
        lcl_salv=>o_salv->display( ).

* Listausgabe erzwingen für Erzeugung von cl_gui_container=>default_screen
        WRITE: space.

      CATCH cx_root INTO DATA(e_txt).
        WRITE: / e_txt->get_text( ).
    ENDTRY.

[ABAP] SALV: Button-Separator in der SALV-Toolbar einfügen

START-OF-SELECTION.
    TRY.
        DATA: o_salv TYPE REF TO cl_salv_table.

        cl_salv_table=>factory( EXPORTING r_container  = cl_gui_container=>default_screen
                                IMPORTING r_salv_table = o_salv
                                CHANGING  t_table      = it_... ).

        ...
								
* Standardmäßig ist beim SALV-Grid nicht vorgesehen, dass ein sog. Button-Separator zur optischen Trennung
* der Bedienbuttons in der SALV-Toolbar eingefügt werden kann. Im Beispiel wird daher ein Standard-Button eingefügt, der
* disabled dargestellt wird (ausgegraut):
        DATA(o_separator) = o_salv->get_functions( )->add_function( name = 'BTN_SEPARATOR|'
                                                                    text = '|'
                                                                    tooltip = ''
                                                                    position = if_salv_c_function_position=>right_of_salv_functions ).
        o_separator->set_enable( abap_false ).

        ...

        o_salv->display( ).

* Listausgabe erzwingen für Erzeugung von cl_gui_container=>default_screen
        WRITE: space.

    CATCH cx_root INTO DATA(e_txt).
        WRITE: / e_txt->get_text( ).
    ENDTRY.

[ABAP] CDS-Views: Alle Spaltenbezeichner eines CDS-Views ausgeben

* Beispiel: alle Annotationen des CDS-Views 'C_PURCHASEORDERITEMMONI' lesen
cl_dd_ddl_annotation_service=>get_annos( EXPORTING entityname    = 'C_PURCHASEORDERITEMMONI'
                                         IMPORTING element_annos = DATA(it_element_annos) ).

* alle Annotationen in der Liste löschen, außer 'EnduserText.Label'
DELETE it_element_annos WHERE annoname NE 'ENDUSERTEXT.LABEL'.

LOOP AT it_element_annos ASSIGNING FIELD-SYMBOL(<a>).
  WRITE: / <a>-elementname, <a>-value.
ENDLOOP.

[ABAP] User-Logondaten lesen

DATA: lv_uslogond TYPE uslogond.

* Benutzer: Lesen Logondaten aus Puffer
CALL FUNCTION 'SUSR_USER_LOGONDATA_GET'
  EXPORTING
    user_name           = sy-uname
  IMPORTING
    user_logondata      = lv_uslogond
  EXCEPTIONS
    user_name_not_exist = 1
    OTHERS              = 2.

IF sy-subrc = 0.
  cl_demo_output=>write_data( lv_uslogond ).

* HTML-Code vom Demo-Output holen
  DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
  cl_abap_browser=>show_html( EXPORTING title       = 'User-Loon-Daten'
                                        html_string = lv_html
                                        container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

[ABAP] SALV: Druckausgabe eines SALV-Gitters in SAP-Spool (SP01)

Druckausgabe per ABAP-Code anschieben

SELECT * INTO TABLE @DATA(it_ispfli) FROM spfli UP TO 50 ROWS.

IF sy-subrc = 0.
  TRY.
      DATA: o_salv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                              CHANGING  t_table      = it_ispfli ).

      DATA: lv_print_params TYPE pri_params.

* Druckparameter holen
      CALL FUNCTION 'GET_PRINT_PARAMETERS'
        EXPORTING
          no_dialog              = abap_true
        IMPORTING
          out_parameters         = lv_print_params
        EXCEPTIONS
          archive_info_not_found = 1
          invalid_print_params   = 2
          invalid_archive_params = 3
          OTHERS                 = 4.

      IF sy-subrc = 0.
* nur Drucken in Spool, keine Anzeige des ALV-Grids

* Name eines Geräts
        lv_print_params-pdest = 'LOCL'.
* Beschreibungstext
        lv_print_params-prtxt = |{ sy-datum } { sy-uzeit }|.

* Druckparameter setzen
        DATA(o_print) = o_salv->get_print( ).
        DATA(lv_print_ctrl) = o_print->get_print_control( ).
        lv_print_ctrl-pri_params = lv_print_params.

        o_print->set_print_control( lv_print_ctrl ).
        o_print->set_print_only( abap_true ).

* SALV-Grid anzeigen
        o_salv->display( ).
      ENDIF.

    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.
ENDIF.

Druckausgabe im Batchmodus

SELECT * INTO TABLE @DATA(it_ispfli) FROM spfli UP TO 50 ROWS.

IF sy-subrc = 0.
* Wenn Batchmodus aktiv, dann nur SALV-Objekt erzeugen und per display( ) ausgeben.
* Das SALV-Grid erzeugt automatisch eine Listausgabe der Tabelle in die Spool.
  IF sy-batch = abap_true.
    TRY.
        DATA: o_salv TYPE REF TO cl_salv_table.

        cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                                CHANGING  t_table      = it_ispfli ).

* Tabelle im Spool ausgeben
        o_salv->display( ).

      CATCH cx_root INTO DATA(e_txt).
        WRITE: / e_txt->get_text( ).
    ENDTRY.
  ENDIF.
ENDIF.