@AbapCatalog.sqlViewName: 'CBCCHANGEDOC'
@AbapCatalog.compiler.compareFilter: true
@EndUserText.label: 'CDS View für Änderungsbelege'
@ClientHandling.algorithm: #SESSION_VARIABLE
@AccessControl.authorizationCheck: #NOT_REQUIRED
//@Analytics.dataCategory: #DIMENSION
//@Analytics.dataExtraction.enabled: true
@VDM.viewType: #CONSUMPTION
@Metadata.allowExtensions: true
define view C_ChangeDocuments as select from I_ChangeDocument as _header
association [0..1] to I_LanguageText as _langu
on _langu.Language = $session.system_language
and _langu.LanguageCode = ChangeDocLanguage
association [0..1] to I_ChangeDocUser as _user
on $projection.CreatedByUser = _user.UserName
association [0..1] to I_ChangeDocChangeIndT as _changetype_text
on $projection.ChangeDocChangeType = _changetype_text.Value
and _changetype_text.Language = $session.system_language
association [0..1] to I_ChangeDocFieldNamesT as _fieldname_text
on _fieldname_text.DatabaseTable = $projection.DatabaseTable
and _fieldname_text.Value = $projection.ChangeDocDatabaseTableField
and _fieldname_text.Language = $session.system_language
association [0..1] to I_ChangeDocTableNames as _tablename_text
on $projection.DatabaseTable = _tablename_text.Value
and _tablename_text.Language = $session.system_language
{
@EndUserText.label: 'Objekt'
// @UI.selectionField: [{ position: 1 }]
@ObjectModel.filter.transformedBy: 'ABAP:CL_RSSCD_TRANSFORM'
@UI.hidden: true
key _header.ChangeDocObjectClass as ChangeDocObjectClass,
// additional field for filter on ObjectClass
@EndUserText.label: 'Objekt'
@UI.selectionField: [{ position: 1 }]
key _header.ChangeDocObjectClass as ChangeDocObjectClassDisplay,
// ObjectClass additional field for internal filtering with replaced texts
@UI.hidden: true
key _header.ChangeDocObjectClass as ChangeDocObjectClassTr,
@EndUserText.label: 'Objektwert'
@UI.hidden: true
// @UI.selectionField: [{ position: 2 }]
@ObjectModel.filter.transformedBy: 'ABAP:CL_RSSCD_TRANSFORM'
key _header.ChangeDocObject as ChangeDocObject,
// ChangeDocObject additional field for filter
@EndUserText.label: 'Objektwert'
@UI.selectionField: [{ position: 2 }]
key _header.ChangeDocObject as ChangeDocObjectDisplay,
// ChangeDocObject additional field for internal filtering with replaced texts
@UI.hidden: true
key _header.ChangeDocObject as ChangeDocObjectTr,
// ChangeDocument
@EndUserText.label: 'Änderungsbelegnummer'
@UI.identification.position: 30
key _header.ChangeDocument as ChangeDocument,
// table name internal field
@UI.textArrangement: #TEXT_ONLY
// text association is necessary to keep field _tablename_text in CDS View
// even though it is not used to display the table texts anymore
@ObjectModel.text.association: '_tablename_text'
// @EndUserText.label: 'Tabelle'
// @ObjectModel.filter.transformedBy: 'ABAP:CL_RSSCD_TRANSFORM'
@UI.hidden: true
key _ChangeDocumentItem.DatabaseTable as DatabaseTable,
// table name get texts directly from _ChangeDocumentItem
// @EndUserText.label: 'Tabelle'
// Transformation only necessary if texts get replaced in Badi and method modify_filter is used
@ObjectModel.filter.transformedBy: 'ABAP:CL_RSSCD_TRANSFORM'
key case
when _ChangeDocumentItem._TableTextDDIC.Text is not initial
then
cast( _ChangeDocumentItem._TableTextDDIC.Text as cdtabnametxt )
else
cast( _ChangeDocumentItem._TableTextView.Text as cdtabnametxt )
end as ChangeDocDatabaseTableTxt,
// table name additional field for internal filtering with replaced texts
@UI.hidden: true
key _ChangeDocumentItem.DatabaseTable as DatabaseTableTr,
// tabkey
@EndUserText.label: 'Tabellenschlüssel'
key
case
when _ChangeDocumentItem._ChangeDocLongTableKey.ChangeDocLongTableKey is not initial
then
_ChangeDocumentItem.ChangeDocTableKey
when _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTabkeyLength < 71
then
// for string fields take short key from CDPOS_STR
coalesce( _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTableKey,
_ChangeDocumentItem.ChangeDocTableKey )
else
_ChangeDocumentItem.ChangeDocTableKey
end as ChangeDocTableKey,
// tabkey additional field for internal filtering
@UI.hidden: true
key
case
when _ChangeDocumentItem._ChangeDocLongTableKey.ChangeDocLongTableKey is not initial
then
_ChangeDocumentItem.ChangeDocTableKey
when _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTabkeyLength < 71
then
// for string fields take short key from CDPOS_STR
coalesce( _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTableKey,
_ChangeDocumentItem.ChangeDocTableKey )
else
_ChangeDocumentItem.ChangeDocTableKey
end as ChangeDocTableKeyT,
// tabkey additional field for internal filtering with replaced texts
@UI.hidden: true
key
case
when _ChangeDocumentItem._ChangeDocLongTableKey.ChangeDocLongTableKey is not initial
then
_ChangeDocumentItem.ChangeDocTableKey
when _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTabkeyLength < 71
then
// for string fields take short key from CDPOS_STR
coalesce( _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTableKey,
_ChangeDocumentItem.ChangeDocTableKey )
else
_ChangeDocumentItem.ChangeDocTableKey
end as ChangeDocTableKeyTr,
// field name internal field
// @UI.lineItem.position: 10
// text association is necessary to keep field _fieldname_text in CDS View
// even though it is not used to display the field texts anymore
@UI.textArrangement: #TEXT_ONLY
@ObjectModel.text.association: '_fieldname_text'
// @ObjectModel.sort.enabled: false
// @EndUserText.label: 'Feldname'
// @ObjectModel.filter.transformedBy: 'ABAP:CL_RSSCD_TRANSFORM'
// @ObjectModel.sort.transformedBy: 'ABAP:CL_RSSCD_TRANSFORM'
@UI.hidden: true
key _ChangeDocumentItem.ChangeDocDatabaseTableField
as ChangeDocDatabaseTableField,
// field name as text
@UI.lineItem.position: 10
// Transformation only necessary if texts get replaced in Badi and method modify_filter is used
@ObjectModel.filter.transformedBy: 'ABAP:CL_RSSCD_TRANSFORM'
// Get texts directly from _ChangeDocumentItem
key case
when _ChangeDocumentItem._FieldTextReplace.Text is not initial
then
cast( _ChangeDocumentItem._FieldTextReplace.Text as cdfieldnametxt)
when _ChangeDocumentItem._FieldTextLabel.Text is not initial
then
cast( _ChangeDocumentItem._FieldTextLabel.Text as cdfieldnametxt )
when _ChangeDocumentItem._FieldTextView.Text is not initial
then
cast( _ChangeDocumentItem._FieldTextView.Text as cdfieldnametxt )
when _ChangeDocumentItem._FieldTextDDIC.Text is not initial
then
cast( _ChangeDocumentItem._FieldTextDDIC.Text as cdfieldnametxt )
when _ChangeDocumentItem.ChangeDocDatabaseTableField <> 'KEY'
then
cast( _ChangeDocumentItem.ChangeDocDatabaseTableField as cdfieldnametxt )
else
cast( ' ' as cdfieldnametxt )
end as ChangeDocDatabaseTableFieldTxt,
// field name additional field for internal filtering with replaced texts
@UI.hidden: true
key _ChangeDocumentItem.ChangeDocDatabaseTableField
as ChangeDocDatabaseTableFieldTr,
// change indicator
@EndUserText.label: 'Änderungsart'
@UI.lineItem.position: 70
@UI.textArrangement: #TEXT_ONLY
@ObjectModel.text.association: '_changetype_text'
@Consumption.valueHelpDefinition: [{entity:{name: 'I_ChangeDocChangeInd',
element: 'Value' }}]
@Consumption.filter.multipleSelections: true
key cast( _ChangeDocumentItem.ChangeDocItemChangeType as cdchngind )
as ChangeDocChangeType,
// field name additional field for internal filtering
// do not delete: needed for compatibility reasons (no longer defined as key field)
@UI.hidden: true
_ChangeDocumentItem.ChangeDocDatabaseTableField
as ChangeDocDatabaseTableFieldT,
// table name additional field for internal filtering
// do not delete: needed for compatibility reasons (no longer defined as key field)
@UI.hidden: true
_ChangeDocumentItem.DatabaseTable as DatabaseTableT,
// create by user - technical name
@UI.hidden: true
_header.CreatedByUser as CreatedByUser,
// created by user - full name
@Semantics.user.id: true
@UI.textArrangement: #TEXT_ONLY
@EndUserText.label: 'Geändert von'
@EndUserText.quickInfo: 'Geändert von'
@UI.lineItem.position: 45
// use technical user name if no text exists to enable filtering and sorting
// it will be replaced by pseudonomization in reuse service before display
case
when _user.NAME_TEXTC is not initial
then _user.NAME_TEXTC
else _header.CreatedByUser
end as NAME_TEXTC,
// Creation Date/ Time - technical name
@UI.hidden: true
_header.CreationDate as CreationDate,
@UI.hidden: true
_header.CreationTime as CreationTime,
// created on
@UI.lineItem.position: 50
cast(dats_tims_to_tstmp ( _header.CreationDate,
_header.CreationTime,
abap_system_timezone( $session.client, 'NULL' ),
$session.client,
'NULL' ) as cdcreated ) as CreatedOn,
// language in CDHDR
@UI.hidden: true
_header._ChangeDocLanguage.Language as ChangeDocLanguageKey,
@EndUserText.label: 'Sprache'
_langu.LanguageName as ChangeDocLanguage,
// transaction
@EndUserText.label: 'Transaktion'
@UI.hidden: true
_header.ChangeTransactionCode as ChangeTransactionCode,
// long tabkey
@EndUserText.label: 'Langer Tabellenschlüssel'
// @UI.hidden: true
case
when _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTabkeyLength > 70
then
// for string fields take long key from CDPOS_STR
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTableKey
else
_ChangeDocumentItem._ChangeDocLongTableKey.ChangeDocLongTableKey
end as ChangeDocTableKeyLong,
// long tabkey additional field for internal filtering with replaced texts
@UI.hidden: true
case
when _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTabkeyLength > 70
then
// for string fields take long key from CDPOS_STR
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocTableKey
else
_ChangeDocumentItem._ChangeDocLongTableKey.ChangeDocLongTableKey
end as ChangeDocTableKeyLongTr,
// new value
@UI.lineItem.position: 20
// @Consumption.filter.hidden: true
@EndUserText.label: 'Neuer Wert'
@ObjectModel.sort.enabled: false
case
when _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocShortStringNew is not initial
then
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocShortStringNew
when _ChangeDocumentItem.ChangeDocNewFieldValue is not initial or
_ChangeDocumentItem.ChangeDocNewCurrency is not initial or
_ChangeDocumentItem.ChangeDocNewUnit is not initial
then
cast( concat_with_space(_ChangeDocumentItem.ChangeDocNewFieldValue,
concat(_ChangeDocumentItem.ChangeDocNewCurrency,
_ChangeDocumentItem.ChangeDocNewUnit ), 1 )
as cdfldvaln )
else
' '
end as ChangeDocNewFieldValue,
// old value
@UI.lineItem.position: 30
// @Consumption.filter.hidden: true
@EndUserText.label: 'Alter Wert'
@ObjectModel.sort.enabled: false
case
when _ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocShortStringOld is not initial
then
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocShortStringOld
when _ChangeDocumentItem.ChangeDocPreviousFieldValue is not initial or
_ChangeDocumentItem.ChangeDocPreviousCurrency is not initial or
_ChangeDocumentItem.ChangeDocPreviousUnit is not initial
then
cast( concat_with_space(_ChangeDocumentItem.ChangeDocPreviousFieldValue,
concat(_ChangeDocumentItem.ChangeDocPreviousCurrency,
_ChangeDocumentItem.ChangeDocPreviousUnit ), 1 )
as cdfldvaln )
else
' '
end as ChangeDocPreviousFieldValue,
// object description
@UI.textArrangement: #TEXT_ONLY
@EndUserText.label: 'Objektbeschreibung'
cast('' as cdobjecttxt) as ChangeDocObjectDescription,
// string new
// @Consumption.filter.hidden: true
@EndUserText.label: 'Neuer erweiterter Wert (lang)'
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocStringNew as ChangeDocumentStringNew,
// string old
// @Consumption.filter.hidden: true
@EndUserText.label: 'Alter erweiterter Wert (lang)'
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocStringOld as ChangeDocumentStringOld,
// short string new
// @Consumption.filter.hidden: true
@EndUserText.label: 'Neuer erweiterter Wert (kurz)'
@UI.hidden: true
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocShortStringNew
as ChangeDocNewShortString,
// short string old
// @Consumption.filter.hidden: true
@EndUserText.label: 'Alter erweiterter Wert (kurz)'
@UI.hidden: true
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocShortStringOld
as ChangeDocOldShortString,
// raw string new
// @Consumption.filter.hidden: true
@EndUserText.label: 'Neuer Rohdatenwert'
@EndUserText.quickInfo: 'Neuer Rohdatenwert'
@ObjectModel.sort.enabled: false
// @UI.hidden: true
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocRawStringNew
as ChangeDocNewRawString,
// raw string old
// @Consumption.filter.hidden: true
@EndUserText.label: 'Alter Rohdatenwert'
@EndUserText.quickInfo: 'Alter Rohdatenwert'
@ObjectModel.sort.enabled: false
// @UI.hidden: true
_ChangeDocumentItem._ChangeDocumentItemExtension.ChangeDocRawStringOld
as ChangeDocOldRawString,
_ChangeDocumentItem,
_user,
_changetype_text,
_fieldname_text,
_tablename_text,
_header._ChangeDocLanguage.Language
}
/*+[internal] {
"BASEINFO":
{
"FROM":
[
"I_CHANGEDOCFIELDLABEL",
"I_CHANGEDOCFIELDNAMES",
"I_CHANGEDOCFIELDTEXT",
"I_CHANGEDOCLONGTABLEKEY",
"I_CHANGEDOCTABLENAMES",
"I_CHANGEDOCTABLETEXT",
"I_CHANGEDOCUMENT",
"I_CHANGEDOCUMENTITEM",
"I_CHANGEDOCUMENTITEMEXTENSION",
"I_CHANGEDOCUSER",
"I_CHANGEDOCVIEWTEXT",
"I_LANGUAGE",
"I_LANGUAGETEXT"
],
"ASSOCIATED":
[
"I_CHANGEDOCCHANGEINDT",
"I_CHANGEDOCFIELDNAMEST",
"I_CHANGEDOCTABLENAMES",
"I_CHANGEDOCUMENTITEM",
"I_CHANGEDOCUSER",
"I_LANGUAGETEXT"
],
"BASE":
[
"I_CHANGEDOCUMENT"
],
"ANNO_REF":
[],
"SCALAR_FUNCTION":
[],
"VERSION":0,
"ANNOREF_EVALUATION_ERROR":""
}
}*/