Checklist d

Catégorie
ABAP Cloud
Publié
Auteur
Johannes

Cette checklist d’implementation aide les chefs de projet et les developpeurs a ne rien oublier d’important dans les projets ABAP Cloud. De la preparation initiale du systeme au developpement RAP jusqu’au Go-Live, toutes les etapes critiques sont couvertes.

Vue d’ensemble : Les cinq phases

┌─────────────────────────────────────────────────────────────┐
│ Phase 1: Preparation du projet │
│ ──────────────────────────────── │
│ • Paysage systeme & autorisations │
│ • Structure des packages & conventions de nommage │
│ • Configuration des outils de developpement │
└──────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Phase 2: Modele de donnees │
│ ──────────────────── │
│ • Conception des tables & elements de donnees │
│ • CDS Views & associations │
│ • Identifier les Released APIs │
└──────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Phase 3: Developpement RAP │
│ ────────────────────── │
│ • Behavior Definition & Implementation │
│ • Validations, Determinations, Actions │
│ • Authorization & Feature Control │
└──────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Phase 4: Service & UI │
│ ──────────────────── │
│ • Service Definition & Binding │
│ • Annotations UI │
│ • App Fiori Elements │
└──────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Phase 5: Assurance qualite & Go-Live │
│ ─────────────────────────────────── │
│ • Tests unitaires & ATC │
│ • Performance & Securite │
│ • Transport & Documentation │
└──────────────────────────────────────────────────────────────┘

Phase 1 : Preparation du projet

Paysage systeme & autorisations

VerificationDescriptionStatut
Version du langage ABAP Cloud activee dans le systeme
Les utilisateurs developpeurs ont S_ABPLNGVS pour les packages Cloud
Route de transport definie (DEV → QAS → PRD)
Acces ADT/BAS configure pour tous les developpeurs
Repository Git cree (si abapGit est utilise)

Creer la structure des packages

" Structure de package recommandee pour un projet ABAP Cloud
"
" $Z_PROJET (Superpackage)
" ├── Z_PROJET_MODEL
" │ ├── Tables (ZTAB_*)
" │ ├── CDS Views (ZI_*, ZC_*)
" │ └── Elements de donnees
" │
" ├── Z_PROJET_BDEF
" │ ├── Behavior Definitions
" │ └── Behavior Implementations (ZBP_*)
" │
" ├── Z_PROJET_SERVICE
" │ ├── Service Definitions
" │ └── Service Bindings
" │
" └── Z_PROJET_TEST
" └── Classes de test unitaire (ZTC_*)

Definir les conventions de nommage

Type d’objetPrefixeExemple
Table de base de donneesZTAB_ZTAB_BOOKING
Interface View (CDS)ZI_ZI_Booking
Consumption ViewZC_ZC_Booking
Behavior PoolZBP_ZBP_I_Booking
Service DefinitionZSRV_ZSRV_Booking
Service BindingZUI_ZUI_Booking_O4
Classe de test unitaireZTC_ZTC_Booking_Test

Phase 2 : Modele de donnees

Checklist de conception des tables

VerificationDescription
Cle primaire definie (CLIENT + champs cle)
Champs techniques presents (CREATED_BY, CREATED_AT, …)
Elements de donnees utilises plutot que types integres
Relations de cle etrangere documentees
Delivery Class correctement definie (A, C, L, …)

Exemple : Definition de table

@EndUserText.label : 'Reservations"
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
define table ztab_booking {
key client : abap.clnt not null;
key booking_uuid : sysuuid_x16 not null;
booking_id : ze_booking_id;
customer_id : ze_customer_id;
flight_date : abap.dats;
@Semantics.amount.currencyCode : 'ztab_booking.currency_code"
price : abap.curr(15,2);
currency_code : abap.cuky;
status : ze_booking_status;
" Champs techniques
created_by : abp_creation_user;
created_at : abp_creation_tstmpl;
last_changed_by : abp_locinst_lastchange_user;
last_changed_at : abp_locinst_lastchange_tstmpl;
}

Checklist CDS View

VerificationDescription
Root View Entity avec define root view entity
Access Control defini (@AccessControl.authorizationCheck)
Annotations semantiques (@Semantics.amount, @Semantics.quantity)
Associations vers les entites dependantes
Champs cle correctement marques

Exemple : CDS View Entity

@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Reservation"
define root view entity ZI_Booking
as select from ztab_booking
composition [0..*] of ZI_BookingItem as _Items
association [1..1] to ZI_Customer as _Customer
on $projection.CustomerId = _Customer.CustomerId
{
key booking_uuid as BookingUuid,
booking_id as BookingId,
customer_id as CustomerId,
flight_date as FlightDate,
@Semantics.amount.currencyCode: 'CurrencyCode"
price as Price,
currency_code as CurrencyCode,
status as Status,
" Champs admin
@Semantics.user.createdBy: true
created_by as CreatedBy,
@Semantics.systemDateTime.createdAt: true
created_at as CreatedAt,
@Semantics.user.lastChangedBy: true
last_changed_by as LastChangedBy,
@Semantics.systemDateTime.lastChangedAt: true
last_changed_at as LastChangedAt,
" Associations
_Items,
_Customer
}

Released APIs pour les donnees SAP

Donnees SAPReleased API (Niveau A)Ne pas utiliser (Niveau D)
MaterielI_ProductMARA, MAKT
ClientI_CustomerKNA1, KNB1
FournisseurI_SupplierLFA1, LFB1
Document de venteI_SalesOrderVBAK, VBAP
Info utilisateurCL_ABAP_CONTEXT_INFOSY-UNAME, USR02

Plus d’informations sur les Released APIs dans l’article Concept de niveau Clean Core.

Phase 3 : Developpement RAP

Checklist Behavior Definition

VerificationDescription
Type d’implementation choisi (managed ou unmanaged)
strict ( 2 ) pour la derniere version RAP
Persistent Table ou Draft Table definie
Lock Master/Dependent correctement configure
Authorization Master defini
Validations pour les champs obligatoires
Determinations pour les valeurs automatiques
Actions pour les processus metier

Exemple : Behavior Definition

managed implementation in class zbp_i_booking unique;
strict ( 2 );
define behavior for ZI_Booking alias Booking
persistent table ztab_booking
draft table ztab_book_d
lock master total etag LastChangedAt
authorization master ( instance )
etag master LastChangedAt
{
create;
update;
delete;
" Valeurs de champ automatiques
field ( readonly ) BookingUuid, CreatedBy, CreatedAt,
LastChangedBy, LastChangedAt;
field ( numbering : managed ) BookingUuid;
" Support Draft
draft action Edit;
draft action Activate optimized;
draft action Discard;
draft action Resume;
draft determine action Prepare;
" Validations
validation validateCustomer on save
{ field CustomerId; create; }
validation validateFlightDate on save
{ field FlightDate; create; update; }
" Determination pour Booking-ID
determination setBookingId on modify
{ field BookingUuid; create; }
" Actions
action ( features : instance ) confirm result [1] $self;
action ( features : instance ) cancel result [1] $self;
" Composition
association _Items { create; }
mapping for ztab_booking
{
BookingUuid = booking_uuid;
BookingId = booking_id;
CustomerId = customer_id;
FlightDate = flight_date;
Price = price;
CurrencyCode = currency_code;
Status = status;
CreatedBy = created_by;
CreatedAt = created_at;
LastChangedBy = last_changed_by;
LastChangedAt = last_changed_at;
}
}

Checklist Behavior Implementation

VerificationDescription
Chaque validation a une gestion failed et reported
Les determinations remplissent tous les champs automatiques
Les actions verifient les preconditions (IF booking-Status = ...)
Feature Control pour la disponibilite dynamique des actions
Les messages utilisent l’interface if_abap_behv_message

Exemple : Validation

METHOD validateCustomer.
" Lire toutes les reservations pertinentes
READ ENTITIES OF ZI_Booking IN LOCAL MODE
ENTITY Booking
FIELDS ( CustomerId )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_bookings).
" Verifier les donnees client
SELECT CustomerId FROM ZI_Customer
FOR ALL ENTRIES IN @lt_bookings
WHERE CustomerId = @lt_bookings-CustomerId
INTO TABLE @DATA(lt_valid_customers).
LOOP AT lt_bookings INTO DATA(ls_booking).
IF NOT line_exists( lt_valid_customers[ CustomerId = ls_booking-CustomerId ] ).
APPEND VALUE #( %tky = ls_booking-%tky ) TO failed-booking.
APPEND VALUE #( %tky = ls_booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = |Client { ls_booking-CustomerId } non trouve| )
%element-CustomerId = if_abap_behv=>mk-on
) TO reported-booking.
ENDIF.
ENDLOOP.
ENDMETHOD.

Authorization & Feature Control

METHOD get_instance_authorizations.
READ ENTITIES OF ZI_Booking IN LOCAL MODE
ENTITY Booking
FIELDS ( Status )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_bookings).
LOOP AT lt_bookings INTO DATA(ls_booking).
APPEND VALUE #(
%tky = ls_booking-%tky
%update = COND #( WHEN ls_booking-Status = 'CONFIRMED"
THEN if_abap_behv=>auth-unauthorized
ELSE if_abap_behv=>auth-allowed )
%delete = COND #( WHEN ls_booking-Status = 'CONFIRMED"
THEN if_abap_behv=>auth-unauthorized
ELSE if_abap_behv=>auth-allowed )
%action-confirm = COND #( WHEN ls_booking-Status = 'NEW"
THEN if_abap_behv=>auth-allowed
ELSE if_abap_behv=>auth-unauthorized )
%action-cancel = COND #( WHEN ls_booking-Status <> 'CANCELLED"
THEN if_abap_behv=>auth-allowed
ELSE if_abap_behv=>auth-unauthorized )
) TO result.
ENDLOOP.
ENDMETHOD.

Phase 4 : Service & UI

Checklist Service Layer

VerificationDescription
Service Definition creee avec define service
Toutes les entites necessaires exposees
Service Binding pour OData V4 (recommande)
Service Binding active et teste
Fiori Preview fonctionne dans ADT

Exemple : Service Definition

@EndUserText.label: 'Booking Service"
define service ZSRV_Booking {
expose ZC_Booking as Booking;
expose ZC_BookingItem as BookingItem;
expose ZI_Customer as Customer;
}

Checklist annotations UI

VerificationDescription
@UI.headerInfo pour l’en-tete d’entite
@UI.lineItem pour la vue liste
@UI.facet pour la structure Object Page
@UI.selectionField pour les criteres de filtre
@UI.identification pour les champs Object Page
@UI.fieldGroup pour le groupement logique

Exemple : Metadata Extension

@Metadata.layer: #CUSTOMER
annotate view ZC_Booking with
{
@UI.facet: [
{ id: 'GeneralInfo',
purpose: #STANDARD,
type: #IDENTIFICATION_REFERENCE,
label: 'General',
position: 10 },
{ id: 'Items',
purpose: #STANDARD,
type: #LINEITEM_REFERENCE,
label: 'Positions',
position: 20,
targetElement: '_Items' }
]
@UI.headerInfo: {
typeName: 'Reservation',
typeNamePlural: 'Reservations',
title: { value: 'BookingId' },
description: { value: 'CustomerId' }
}
@UI: { lineItem: [{ position: 10 }],
selectionField: [{ position: 10 }],
identification: [{ position: 10 }] }
BookingId;
@UI: { lineItem: [{ position: 20 }],
selectionField: [{ position: 20 }],
identification: [{ position: 20 }] }
CustomerId;
@UI: { lineItem: [{ position: 30 }],
identification: [{ position: 30 }] }
FlightDate;
@UI: { lineItem: [{ position: 40, criticality: 'StatusCriticality' }],
identification: [{ position: 40, criticality: 'StatusCriticality' }] }
Status;
}

Phase 5 : Assurance qualite & Go-Live

Checklist tests unitaires

VerificationDescription
Classe de test avec FOR TESTING et RISK LEVEL HARMLESS
Validations testees (cas positifs & negatifs)
Determinations testees
Actions testees avec transitions de statut
Au moins 70% de couverture de code atteinte

Exemple : Test unitaire

CLASS ztc_booking_test DEFINITION
FOR TESTING
RISK LEVEL HARMLESS
DURATION SHORT.
PRIVATE SECTION.
CLASS-DATA:
environment TYPE REF TO if_cds_test_environment.
CLASS-METHODS:
class_setup,
class_teardown.
METHODS:
setup,
test_create_booking FOR TESTING,
test_validate_customer_invalid FOR TESTING.
ENDCLASS.
CLASS ztc_booking_test IMPLEMENTATION.
METHOD class_setup.
environment = cl_cds_test_environment=>create_for_multiple_cds(
VALUE #( ( i_for_entity = 'ZI_BOOKING' )
( i_for_entity = 'ZI_CUSTOMER' ) ) ).
ENDMETHOD.
METHOD class_teardown.
environment->destroy( ).
ENDMETHOD.
METHOD setup.
environment->clear_doubles( ).
ENDMETHOD.
METHOD test_create_booking.
" Preparer les donnees de test
DATA(lt_customers) = VALUE zt_customer( ( customer_id = 'CUST001' ) ).
environment->insert_test_data( lt_customers ).
" Executer l'operation RAP
MODIFY ENTITIES OF ZI_Booking
ENTITY Booking
CREATE FIELDS ( CustomerId FlightDate Price CurrencyCode )
WITH VALUE #( ( %cid = 'CID1"
CustomerId = 'CUST001"
FlightDate = sy-datum + 30
Price = '500.00"
CurrencyCode = 'EUR' ) )
MAPPED DATA(mapped)
FAILED DATA(failed)
REPORTED DATA(reported).
" Assertions
cl_abap_unit_assert=>assert_initial( failed ).
cl_abap_unit_assert=>assert_not_initial( mapped-booking ).
ENDMETHOD.
METHOD test_validate_customer_invalid.
" Operation RAP avec client invalide
MODIFY ENTITIES OF ZI_Booking
ENTITY Booking
CREATE FIELDS ( CustomerId FlightDate )
WITH VALUE #( ( %cid = 'CID1"
CustomerId = 'INVALID"
FlightDate = sy-datum + 30 ) )
MAPPED DATA(mapped)
FAILED DATA(failed)
REPORTED DATA(reported).
" Assertion: La validation doit echouer
cl_abap_unit_assert=>assert_not_initial( failed-booking ).
ENDMETHOD.
ENDCLASS.

Verification ATC

VerificationDescription
ATC sans erreurs de priorite 1
Pas de findings Niveau D (acces directs aux tables)
Pas de findings Niveau C (objets non classifies)
Variante de verification ABAP_CLOUD_DEVELOPMENT utilisee

Checklist Go-Live

VerificationDescription
Tous les tests unitaires reussis
ATC sans findings critiques
Tests de performance effectues
Test end-to-end en QAS reussi
App Fiori testee fonctionnellement
Transport Request documente
Plan de rollback disponible
Documentation technique mise a jour
Formation utilisateurs effectuee

Reference rapide : Do’s & Don’ts

Do’s

  • Utilisez strict ( 2 ) dans les Behavior Definitions
  • Definissez @AccessControl.authorizationCheck: #CHECK
  • Utilisez le Managed Scenario avec Draft si possible
  • Implementez le Feature Control pour les Actions
  • Ecrivez des tests unitaires avant le transport
  • Utilisez les Metadata Extensions pour les annotations UI

Don’ts

  • Pas de SELECTs directs sur les tables SAP
  • Pas de SY-UNAME, utilisez CL_ABAP_CONTEXT_INFO
  • Pas de CALL FUNCTION pour les BAPIs standard
  • Pas de COMMIT WORK dans le contexte RAP
  • Pas de textes en dur, utilisez les classes de message
  • Pas de variables globales dans les Behavior Classes

Conclusion

Cette checklist couvre les aspects les plus importants d’une implementation ABAP Cloud. Utilisez-la comme guide pour votre projet et adaptez-la si necessaire a vos exigences specifiques.

Les cinq phases offrent un deroulement clair :

  1. Preparation du projet : Creer les bases
  2. Modele de donnees : Base solide avec CDS Views
  3. Developpement RAP : Implementer la logique metier
  4. Service & UI : Fournir l’application
  5. Assurance qualite : Assurer la stabilite

Pour des informations approfondies sur des sujets specifiques, voir :