El último tutorial mostró cómo crear un objeto comercial de mantenimiento muy simple utilizando una sola tabla de base de datos. Como muestra la aplicación, la interfaz de usuario todavía estaba vacía y no se mostraban columnas de tabla ni campos de entrada.
Este tutorial es para explicar cómo extender el BO con notas de UI. La adición de anotaciones en la interfaz de usuario definirá la interfaz de usuario.
Aprenderá a definir las notas para la pantalla de detalles. Esta pantalla se utiliza para crear nuevos objetos y mostrar todos los detalles de los registros básicos. Además, aprenderá a definir las columnas en la lista de resultados de búsqueda. Después de completar ambas secciones, debe tener una aplicación actual para mantener la tabla de la base de datos.
Sugerencia: las anotaciones de la interfaz de usuario generalmente se almacenan en un objeto de extensión de metadatos, pero se pueden retener directamente en la vista de proyección de CDS.
Se puede encontrar más información sobre la definición de anotaciones CDS para interfaces controladas por metadatos. aquí
Paso 1: crea una página de detalles
Haga clic con el botón derecho en la carpeta de definición de datos en el explorador de su proyecto, seleccione Nuevo > Nueva extensión de metadatos.
Cree una nueva extensión de metadatos:
- Nombre:
ZCAL_C_HOLIDAY_XXX
- Descripción: Extensión de interfaz de días festivos
Hacer clic Siguiente>.
- Nombre:
Hacer clic Siguiente>.
Escoger Ver anotación y haga clic en Finalizar.
Ingresar
#CORE
por@Metadata.layer
,ZCAL_C_HOLIDAY_XXX
para anotar una vista e insertar todos los elementos conCTRL
+ Espacio.Cree la jerarquía de características y anote los campos en la lista de elementos:
@Metadata.layer: #CORE annotate view ZCAL_C_HOLIDAY_XXX with { @UI.facet: [ { id: 'PublicHoliday', purpose: #STANDARD, label: 'Public Holiday', type: #IDENTIFICATION_REFERENCE, position: 1 }] @UI: { identification: [ { position: 1 } ], lineItem: [ { position: 1 } ] } HolidayId; @UI: { identification: [ { position: 2 } ], lineItem: [ { position: 2 } ] } MonthOfHoliday; @UI: { identification: [ { position: 3 } ], lineItem: [ { position: 3 } ] } DayOfHoliday; @UI.hidden: true last_changed_at; @UI.hidden: true local_last_changed_at; }
Guardar y activar. Reinicie su aplicación, ahora puede ver una lista de entradas de configuración. Así abierto
HolidayRoot
en su conexión de servicio.Hacer clic Crear.
Crea una nueva entrada:
Hacer clic Crear.
Complete los otros campos y haga clic en Salvar.
Hecho
Inicie sesión para responder la pregunta
Paso 2: agregue notas adicionales de la interfaz de usuario
Abra la extensión de metadatos
ZCAL_C_HOLIDAY_XXX
Para editar.Para habilitar una columna
HolidayId
como un campo de búsqueda, agregue la nota@Search.searchable: true
con el objeto de extensión de metadatos y@Search.defaultSearchElement: true
al parqueHolidayId
.@Search.searchable: true
@Search.defaultSearchElement: true HolidayId;
Agregue información de encabezado para mostrar el título de página correcto
El resultado de la lista se puede ordenar usando la notapresentationVariant
en el encabezado.presentationVariant: [{ sortOrder: [{ by: 'HolidayId', direction: #ASC }] }] }
Tu código debería verse así:
@Metadata.layer: #CORE @Search.searchable: true @UI: { headerInfo: { typeName: 'Public Holiday', typeNamePlural: 'Public Holidays', title: { type: #STANDARD, label: 'Public Holiday', value: 'HolidayId' } }, presentationVariant: [{ sortOrder: [{ by: 'HolidayId', direction: #ASC }] }] } annotate view ZCAL_C_HOLIDAY_XXX with { @UI.facet: [ { id: 'PublicHoliday', purpose: #STANDARD, label: 'Public Holiday', type: #IDENTIFICATION_REFERENCE, position: 1 }] @UI: { identification: [ { position: 1 } ], lineItem: [ { position: 1 } ] } @Search.defaultSearchElement: true HolidayId; @UI: { identification: [ { position: 2 } ], lineItem: [ { position: 2 } ] } MonthOfHoliday; @UI: { identification: [ { position: 3 } ], lineItem: [ { position: 3 } ] } DayOfHoliday; @UI.hidden: true last_changed_at; @UI.hidden: true local_last_changed_at; }
Guardar y activar.
Reinicie su aplicación para ver los cambios en la interfaz de usuario. Si está siendo abandonado en la vista previa, asegúrese de que todas las cosas estén activadas.
Comprueba tu resultado.
Hecho
Inicie sesión para responder la pregunta
Paso 3: cree comentarios de CDS para la tabla de texto
En el explorador de proyectos, haga clic con el botón derecho en Definiciones de datos y seleccione Nuevo > Definición de datos.
Cree una nueva definición de datos:
- Nombre:
ZCAL_I_HOLIDAYTXT_XXX
- Descripción: Ver CDS para texto de vacaciones
Hacer clic Siguiente>.
- Nombre:
Escoger Definir entidad de visualización con asociación principal como plantilla y haga clic en Finalizar.
Ahora defina la conexión al nodo raíz. Ingrese su vista raíz de CDS como un nombre de fuente de datos de destino. Nombra la asociación
_Public_Holiday
y el campo centralHolidayId
como característica de asociación. Categorice la vista del CDS como vista de texto.@AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'Public Holiday Text' @ObjectModel.dataCategory: #TEXT define view entity ZCAL_I_HOLIDAYTXT_XXX as select from zcal_holitxt_xxx association to parent ZCAL_I_HOLIDAY_XXX as _Public_Holiday on $projection.HolidayId = _Public_Holiday.HolidayId { @Semantics.language: true key spras as Language, key holiday_id as HolidayId, @Semantics.text: true fcal_description as HolidayDescription, _Public_Holiday }
Guardar y activar.
Abrir vista de CDS
ZCAL_I_HOLIDAY_XXX
acuerdoCTRL
y haga clic izquierdo en el nombre. Agregue la composición a la vista de texto:@AccessControl.authorizationCheck: #CHECK @EndUserText.label: '<span class="sapedia-acronym" data-template="sapediaAdCDS" aria-expanded="false">CDS</span> View for public holidays' define root view entity ZCAL_I_HOLIDAY_XXX as select from zcal_holiday_xxx composition [0..*] of ZCAL_I_HOLIDAYTXT_XXX as _HolidayTxt { key holiday_id as HolidayId, @Semantics.calendar.month: true month_of_holiday as MonthOfHoliday, @Semantics.calendar.dayOfMonth: true day_of_holiday as DayOfHoliday, @Semantics.systemDateTime.lastChangedAt: true last_changed_at, @Semantics.systemDateTime.localInstanceLastChangedAt: true local_last_changed_at, _HolidayTxt }
Guardar y activar.
Haga clic derecho en la definición de datos
ZCAL_I_HOLIDAYTXT_XXX
y seleccione Nueva definición de datos.Cree una nueva vista de proyección:
- Nombre:
ZCAL_C_HOLIDAYTXT_XXX
- Descripción: Ver proyección para texto de vacaciones
Hacer clic Siguiente>.
- Nombre:
Hacer clic Siguiente>.
Escoger Definir vista de proyección como plantilla y haga clic en Finalizar.
Agregar la nota
: redirected to parent ZCAL_C_HOLIDAY_XXX
para la sociedad_Public_Holiday
. Agregar la nota@Metadata.allowExtensions: true
.@EndUserText.label: 'Projection view for public holiday text' @AccessControl.authorizationCheck: #CHECK @Metadata.allowExtensions: true define view entity ZCAL_C_HOLIDAYTXT_XXX as projection on ZCAL_I_HOLIDAYTXT_XXX { key Language, key HolidayId, HolidayDescription, _Public_Holiday : redirected to parent ZCAL_C_HOLIDAY_XXX }
Guardar y activar.
Abra la vista CDS
ZCAL_C_HOLIDAY_XXX
. Agregar la asociación_HolidayTxt : redirected to composition child ZCAL_C_HOLIDAYTXT_XXX
@EndUserText.label: 'Projection view for public holidays' @AccessControl.authorizationCheck: #CHECK @Metadata.allowExtensions: true define root view entity ZCAL_C_HOLIDAY_XXX provider contract transactional_query as projection on ZCAL_I_HOLIDAY_XXX { key HolidayId, MonthOfHoliday, DayOfHoliday, last_changed_at, local_last_changed_at, _HolidayTxt : redirected to composition child ZCAL_C_HOLIDAYTXT_XXX }
Guardar y activar.
Hecho
Inicie sesión para responder la pregunta
Paso 4: cree una definición de comportamiento para la tabla de texto
Consejo: Tenga en cuenta que la API Configure Business Configurations solo admite un nivel de subnodos, es decir, la raíz de su entidad puede tener una asociación con un tamaño arbitrario de entidades, pero esas subentidades no pueden tener asociaciones con subentidades adicionales.
Definición de comportamiento abierto
ZCAL_I_HOLIDAY_XXX
. Agregue la definición de comportamiento a la vista de proyección de texto. Debido a que el nodo de texto es un subnodo de la entidad raíz, debe definirlo como dependiente de bloqueo. Habilite el nodo para actualizaciones y eliminaciones. La creación no se puede realizar aquí porque está definida por la composición de la que proviene el subnodo. Establecer camposHolidayId
yLanguage
comoreadonly:update
para leerlo solo para actualizaciones. También asocie el nodo de texto en el nodo raíz.managed implementation in class zbp_cal_i_holiday_xxx unique; with draft; define behavior for ZCAL_I_HOLIDAY_xxx alias HolidayRoot lock master total etag last_changed_at persistent table zcal_holiday_xxx draft table zcal_d_holi_xxx { create; update; delete; field ( readonly : update ) HolidayId; association _HolidayTxt { create; with draft; } mapping for zcal_holiday_xxx corresponding { HolidayId = holiday_id; MonthOfHoliday = month_of_holiday; DayOfHoliday = day_of_holiday; } } define behavior for ZCAL_I_HOLIDAYTXT_XXX alias HolidayText persistent table zcal_holitxt_xxx draft table zcal_d_holit_xxx lock dependent by _Public_Holiday { update; delete; field ( readonly : update ) HolidayId; field ( readonly : update ) Language; association _Public_Holiday { with draft; } mapping for zcal_holitxt_xxx corresponding { Language = spras; HolidayId = holiday_id; HolidayDescription = fcal_description; } }
Enciende el cursor
zcal_d_holit_xxx
y usa la ayuda rápida (CTRL + 1) para crear la tabla de borrador.Cree una nueva tabla de borrador:
- Nombre:
ZCAL_D_HOLIT_XXX
- Descripción: Borrador de tabla para la entidad.
ZCAL_I_HOLIDAYTXT_XXX
Hacer clic Siguiente>.
- Nombre:
Hacer clic Finalizar.
Guarde y active la tabla de borradores
ZCAL_D_HOLIT_XXX
.Guarde y active la definición de comportamiento
ZCAL_I_HOLIDAY_XXX
.Abra la definición de comportamiento.
ZCAL_C_HOLIDAY_XXX
. Incluir la siguiente proyección de transporte y la asociación en la proyección de transporte existente.projection; use draft; define behavior for ZCAL_C_HOLIDAY_XXX alias HolidayRoot { use create; use update; use delete; use association _HolidayTxt { create; with draft; } } define behavior for ZCAL_C_HOLIDAYTXT_XXX alias HolidayText { use update; use delete; use association _Public_Holiday { with draft; } }
Guardar y activar.
Definición de servicio abierto
ZCAL_UI_HOLIDAY_XXX
y añadirexpose ZCAL_C_HOLIDAYTXT_XXX as HolidayText;
.@EndUserText.label: 'Service Definition for Public Holiday' define service ZCAL_UI_HOLIDAY_XXX { expose ZCAL_C_HOLIDAY_XXX as HolidayRoot; expose ZCAL_C_HOLIDAYTXT_XXX as HolidayText; }
Guardar y activar.
Hecho
Inicie sesión para responder la pregunta
Paso 5: agregue anotaciones de IU a la tabla de texto
Abra la extensión de metadatos
ZCAL_C_HOLIDAY_XXX
, agregue un nuevo elemento de función. Tipo de uso#LINEITEM_REFERENCE
.@Metadata.layer: #CORE @Search.searchable: true @UI: { headerInfo: { typeName: 'Public Holiday', typeNamePlural: 'Public Holidays', title: { type: #STANDARD, label: 'Public Holiday', value: 'HolidayId' } }, presentationVariant: [{ sortOrder: [{ by: 'HolidayId', direction: #ASC }] }] } annotate view ZCAL_C_HOLIDAY_XXX with { @UI.facet: [ { id: 'PublicHoliday', purpose: #STANDARD, label: 'Public Holiday', type: #IDENTIFICATION_REFERENCE, position: 1 }, { id: 'Description', label: 'Description', type: #LINEITEM_REFERENCE, position: 2, targetElement: '_HolidayTxt' } ] @UI: { identification: [ { position: 1 } ], lineItem: [ { position: 1 } ] } @Search.defaultSearchElement: true HolidayId; @UI: { identification: [ { position: 2 } ], lineItem: [ { position: 2 } ] } MonthOfHoliday; @UI: { identification: [ { position: 3 } ], lineItem: [ { position: 3 } ] } DayOfHoliday; @UI.hidden: true last_changed_at; @UI.hidden: true local_last_changed_at; }
Guardar y activar.
Clic derecho en Extensiones de metadatos, Seleccione Nuevo > Extensión de metadatos.
Cree una nueva extensión de metadatos:
- Nombre:
ZCAL_C_HOLIDAYTXT_XXX
- Descripción: extensión de metadatos de texto libre
Hacer clic Siguiente>.
- Nombre:
Hacer clic Finalizar.
Edite su extensión de metadatos:
@Metadata.layer: #CORE @UI: { headerInfo: { typeName: 'Description', typeNamePlural: 'Descriptions', title: { type: #STANDARD, value: 'Language' } } , presentationVariant: [{ sortOrder: [{ by: 'Language', direction: #ASC }] }] } annotate view ZCAL_C_HOLIDAYTXT_XXX with { @UI.facet: [ { id: 'HolidayText', purpose: #STANDARD, type: #IDENTIFICATION_REFERENCE, label: 'Description', position: 1 } ] @UI: { identification: [ { position: 1 } ], lineItem: [ { position: 1 } ] } Language; @UI.hidden: true HolidayId; @UI: { identification: [ { position: 2 } ], lineItem: [ { position: 2, label: 'Description' } ] } HolidayDescription; }
Guardar y activar.
Reinicie su aplicación y abra los detalles para salir. Ahora puede ver una nueva descripción de función que muestra todos los textos traducidos disponibles.
Donde no haya textos traducidos, cree uno con el botón crear después de hacer clic en el botón editar.
Editar vista de CDS
ZCAL_I_HOLIDAYTXT_XXX
. Agregue asociación a la vista de texto de idioma.@AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'Public Holiday Text' @ObjectModel.dataCategory: #TEXT define view entity ZCAL_I_HOLIDAYTXT_XXX as select from zcal_holitxt_xxx association to parent ZCAL_I_HOLIDAY_XXX as _Public_Holiday on $projection.HolidayId = _Public_Holiday.HolidayId association [0..*] to I_LanguageText as _LanguageText on $projection.Language = _LanguageText.LanguageCode { @Semantics.language: true key spras as Language, key holiday_id as HolidayId, @Semantics.text: true fcal_description as HolidayDescription, _Public_Holiday, _LanguageText }
Guardar y activar.
Vista de proyección abierta
ZCAL_C_HOLIDAYTXT_XXX
.Agregar la nota
@Consumption.valueHelpDefinition: [ {entity: {name: 'I_Language', element: 'Language' }} ]
al campo del idioma y la nota@ObjectModel.text.element:['LanguageDescription']
. Agregar un nuevo campoLanguageDescription
utilizando lalocalized
sintaxis:@EndUserText.label: 'Projection view for public holiday texts' @AccessControl.authorizationCheck: #CHECK @Metadata.allowExtensions: true define view entity ZCAL_C_HOLIDAYTXT_XXX as projection on ZCAL_I_HOLIDAYTXT_XXX { @Consumption.valueHelpDefinition: [ {entity: {name: 'I_Language', element: 'Language' }} ] @ObjectModel.text.element:['LanguageDescription'] key Language, key HolidayId, HolidayDescription, _LanguageText.LanguageName as LanguageDescription : localized, _Public_Holiday : redirected to parent ZCAL_C_HOLIDAY_XXX }
Guardar y activar. Al reiniciar su aplicación, se muestra la descripción de la clave de idioma y la ayuda de entrada está disponible para la clave de idioma al crear un nuevo informe.
Hecho
Inicie sesión para responder la pregunta
Paso 6: vincule la descripción predeterminada a la entidad raíz
La lista de entradas de configuración existentes debe mostrar la descripción en el idioma de inicio de sesión, si se mantiene. Además, al crear una nueva entrada de configuración, se debe crear automáticamente un informe en el idioma de registro y se puede editar directamente.
Vista de proyección abierta
ZCAL_C_HOLIDAY_XXX
y agrega el campoHolidayDescription
de la composición a la vista Texto usando ellocalized syntax
@EndUserText.label: 'Projection view for public holidays' @AccessControl.authorizationCheck: #CHECK @Metadata.allowExtensions: true define root view entity ZCAL_C_HOLIDAY_XXX provider contract transactional_query as projection on ZCAL_I_HOLIDAY_XXX { key HolidayId, MonthOfHoliday, DayOfHoliday, _HolidayTxt.HolidayDescription as HolidayDescription : localized, last_changed_at, local_last_changed_at, _HolidayTxt : redirected to composition child ZCAL_C_HOLIDAYTXT_XXX }
Guardar y activar.
Agregue el nuevo campo a la función en la extensión de metadatos
ZCAL_C_HOLIDAY_XXX
. El campo debe estar oculto en una página de objeto porque es comestible en la función de descripción.@Metadata.layer: #CORE @Search.searchable: true @UI: { headerInfo: { typeName: 'Public Holiday', typeNamePlural: 'Public Holidays', title: { type: #STANDARD, label: 'Public Holiday', value: 'HolidayId' } }, presentationVariant: [{ sortOrder: [{ by: 'HolidayId', direction: #ASC }] }] } annotate view ZCAL_C_HOLIDAY_XXX with { @UI.facet: [ { id: 'PublicHoliday', purpose: #STANDARD, label: 'Public Holiday', type: #IDENTIFICATION_REFERENCE, position: 1 }, { id: 'Description', label: 'Description', type: #LINEITEM_REFERENCE, position: 2, targetElement: '_HolidayTxt' } ] @UI: { identification: [ { position: 1 } ], lineItem: [ { position: 1 } ] } @Search.defaultSearchElement: true HolidayId; @UI: { identification: [ { position: 2, hidden: true } ], lineItem: [ { position: 2 } ] } HolidayDescription; @UI: { identification: [ { position: 3 } ], lineItem: [ { position: 3 } ] } MonthOfHoliday; @UI: { identification: [ { position: 4 } ], lineItem: [ { position: 4 } ] } DayOfHoliday; @UI.hidden: true last_changed_at; @UI.hidden: true local_last_changed_at; }
Guardar y activar.
Si inicia su aplicación ahora, tendrá una nueva columna para la descripción. Si no guardó ninguna descripción en el idioma de inicio de sesión, el campo estará vacío incluso si contiene texto para otro idioma.
Edita la proyección de transporte
ZCAL_C_HOLIDAY_XXX
. Pon elaugment
anotar para crear y actualizar una acción deHolidayRoot
.use create(augment); use update(augment);
Agregar la nota
implementation in class zbp_cal_c_holiday_xxx unique;
aprojection
. Agregarfield ( modify ) HolidayDescription;
para la entidad raíz.projection implementation in class zbp_cal_c_holiday_XXX unique; use draft; define behavior for ZCAL_C_HOLIDAY_XXX alias HolidayRoot { use create(augment); use update(augment); use delete; use association _HolidayTxt { create; with draft; } field ( modify ) HolidayDescription; } define behavior for ZCAL_C_HOLIDAYTXT_XXX alias HolidayText { use update; use delete; use association _Public_Holiday { with draft; } }
Guardar y activar.
El cursor en el nombre de la clase, por favor
ZBP_CAL_C_HOLIDAY_XXX
y presioneCTRl+1
utilice la solución rápida para crear la clase de implementación de comportamiento.Sustituye tu código por lo siguiente.
CLASS lhc_holidayroot DEFINITION INHERITING FROM cl_abap_behavior_handler. PRIVATE SECTION. METHODS augment_create FOR MODIFY IMPORTING entities FOR CREATE holidayroot. METHODS augment_update FOR MODIFY IMPORTING entities FOR UPDATE holidayroot. ENDCLASS. CLASS lhc_holidayroot IMPLEMENTATION. METHOD augment_create. DATA: text_cba TYPE TABLE FOR CREATE zcal_i_holiday_xxx_holidaytxt, myrelates TYPE abp_behv_relating_tab. LOOP AT entities INTO DATA(entity). APPEND sy-tabix TO myrelates. APPEND VALUE #( %cid_ref = entity-%cid %key-holidayid = entity-%key-holidayid %is_draft = entity-%is_draft %target = VALUE #( ( %cid = |CREATETEXTCID{ sy-tabix }| %is_draft = entity-%is_draft language = sy-langu holidayid = entity-holidayid holidaydescription = entity-holidaydescription %control = VALUE #( holidayid = if_abap_behv=>mk-on language = if_abap_behv=>mk-on holidaydescription = entity-%control-holidaydescription ) ) ) ) TO text_cba. ENDLOOP. MODIFY AUGMENTING ENTITIES OF zcal_i_holiday_xxx ENTITY holidayroot CREATE BY _holidaytxt FROM text_cba RELATING TO entities BY myrelates. ENDMETHOD. METHOD augment_update. DATA: text_update TYPE TABLE FOR UPDATE zcal_i_holidaytxt_xxx, text_cba TYPE TABLE FOR CREATE zcal_i_holiday_xxx_holidaytxt. DATA: myrelates_update TYPE abp_behv_relating_tab, myrelates_cba TYPE abp_behv_relating_tab. READ ENTITIES OF zcal_i_holiday_xxx ENTITY holidayroot BY _holidaytxt FROM VALUE #( FOR holiday_entity IN entities ( %tky = holiday_entity-%tky ) ) LINK DATA(link). LOOP AT entities INTO DATA(entity) WHERE %control-holidaydescription = if_abap_behv=>mk-on. DATA(tabix) = sy-tabix. "If a Description with sy-langu already exists, perform an update. Else perform a create-by-association. IF line_exists( link[ KEY entity source-holidayid = entity-%key-holidayid target-holidayid = entity-%key-holidayid target-language = sy-langu ] ). APPEND tabix TO myrelates_update. APPEND VALUE #( %key-holidayid = entity-%key-holidayid %key-language = sy-langu %is_draft = entity-%is_draft holidaydescription = entity-holidaydescription %control = VALUE #( holidaydescription = entity-%control-holidaydescription ) ) TO text_update. ELSE. APPEND tabix TO myrelates_cba. APPEND VALUE #( %tky = entity-%tky %target = VALUE #( ( %cid = |UPDATETEXTCID{ tabix }| holidayid = entity-holidayid language = sy-langu %is_draft = entity-%is_draft holidaydescription = entity-holidaydescription %control = VALUE #( holidayid = if_abap_behv=>mk-on language = if_abap_behv=>mk-on holidaydescription = entity-%control-holidaydescription ) ) ) ) TO text_cba. ENDIF. ENDLOOP. MODIFY AUGMENTING ENTITIES OF zcal_i_holiday_xxx ENTITY holidaytext UPDATE FROM text_update RELATING TO entities BY myrelates_update ENTITY holidayroot CREATE BY _holidaytxt FROM text_cba RELATING TO entities BY myrelates_cba. ENDMETHOD. ENDCLASS.
Guardar y activar.
Si crea una nueva entrada ahora, puede definir directamente la descripción en el idioma de inicio de sesión.
Hecho
Inicie sesión para responder la pregunta