---
title: "Particularités de C/AL et analyse de code | NAVtoBC.de"
description: "Comprendre C/AL : déclencheurs, FlowFields, objets, transactions et dépendances dynamiques. Analyse basée sur des exports d'objets au format TXT."
url: https://navtobc.de/fr/cal-besonderheiten
language: fr
---

# Particularités de C/AL et analyse de code

LES PARTICULARITÉS DE C/AL

## Peu de code. Beaucoup d'impact.

Dans Navision, la logique métier ne se trouve pas seulement dans les fonctions. Les propriétés des champs, les déclencheurs, les filtres et le contexte d'exécution déterminent eux aussi ce qui se passe réellement.

Qui analyse C/AL de façon automatisée doit lire ces éléments ensemble. Voici les principales particularités pour une analyse et une planification de migration solides.

BIEN SITUER C/AL

### De Navision à Business Central 14.

**C/AL signifie Client/server Application Language.** Ce langage était utilisé dans Navision et Dynamics NAV et restait disponible jusqu'à Business Central 14 (Spring 2019, On-Premises). À partir de Business Central 15, C/AL a été remplacé par AL.

NOTRE BASE D'ANALYSE

### Exports d'objets TXT.

Nous lisons les **objets NAV exportés au format TXT**, avec leur code C/AL et leurs propriétés. **Les fichiers FOB natifs ne sont pas traités directement.**

Si seuls des fichiers FOB sont disponibles, les objets sont d'abord importés dans un environnement de développement NAV adapté, puis exportés au format TXT. Il faut pour cela une version adéquate et la licence développeur requise. Renommer l'extension du fichier ne suffit pas.

UNE PETITE DIFFÉRENCE AUX GRANDES CONSÉQUENCES

### Affecter ou valider ?

Les deux lignes définissent une valeur dans le tampon d'enregistrement. `VALIDATE` exécute en plus la validation du champ, y compris `OnValidate`. Ce déclencheur peut modifier d'autres champs, déclencher de la logique métier et effectuer lui-même des modifications en base de données.

Affectation directe

```
Customer.Name := 'Beispiel';
```

Avec validation du champ

```
Customer.VALIDATE(Name, 'Beispiel');
```

### Ce qui va ensemble dans l'analyse.

Dépliez les thèmes pour découvrir les détails techniques.

****Langage & valeurs** Syntaxe Pascal, Code, options et types de données métier**

- **Syntaxe inspirée de Pascal :** `BEGIN … END`, `:=` pour les affectations, ainsi que `//` et `{ … }` pour les commentaires. Les identificateurs et mots-clés ne sont pas sensibles à la casse. Les variables sont déclarées globalement dans l'objet ou localement dans les fonctions et déclencheurs. Les paramètres `VAR` peuvent modifier la valeur chez l'appelant.
- **Code est un type de données à part entière :** il convertit le texte en majuscules et supprime les espaces de début et de fin. La longueur définie de `Code` et `Text` fait partie de l'évaluation. Les chaînes de caractères et les tableaux sont adressés à partir de la position 1.
- **Les options ont un ordre :** `OptionString` définit les membres ; leurs valeurs numériques commencent à 0. Il faut distinguer le nom, la position et la légende traduite. Une conversion vers les enums AL doit tenir compte des valeurs existantes. AL prend toujours en charge `Option` ; le passage aux enums n'est pas automatiquement obligatoire.
- **Des valeurs métier plutôt que de simples nombres :** `0D`, les dates de clôture, `WORKDATE` et les formules de date ont une signification propre. Les règles d'arrondi ainsi que les conversions dépendantes de la langue avec `FORMAT` et `EVALUATE` peuvent influer sur les résultats et les interfaces.

**Pour l'analyse :** des valeurs visuellement identiques peuvent être traitées différemment sur le plan technique. Le type de données, la longueur, la langue et le passage des paramètres font donc partie du constat.

****Objets & métadonnées** Type et ID, numéros de champs et propriétés**

- **Des objets plutôt que des fichiers sources isolés :** selon la version de NAV, on y trouve Table, Page, Report, Codeunit, Query, XMLport et MenuSuite ; les générations plus anciennes connaissent aussi Form et Dataport. C'est la combinaison **type d'objet et ID** qui est unique. La plage 50000–99999 est traditionnellement réservée aux adaptations client ; les plages partenaires et leur utilisation dépendent aussi de la licence.
- **Les propriétés portent de la logique métier :** `TableRelation`, `CalcFormula`, `SourceTableView`, `RunObject` et `RunPageLink` créent des relations, des filtres et des appels en dehors du code C/AL proprement dit. Les numéros de champs, les clés, les DataItems des Reports et les structures des XMLports font également partie du modèle.
- **Les identificateurs ne sont pas des libellés :** `CaptionML` et `OptionCaptionML` fournissent des affichages multilingues, par exemple en allemand et en anglais. Ils ne remplacent ni l'identité des objets ni celle des champs. La langue et l'encodage des caractères de l'export TXT doivent être préservés.

**Pour l'analyse :** un export d'objets complet contient plus de savoir que des fonctions copiées isolément. Les métadonnées font partie du programme.

****Déclencheurs & logique métier** VALIDATE, RunTrigger et actions consécutives cachées**

- **Déclencheurs et fonctions :** C/AL offre des fonctions globales et locales. S'y ajoutent des déclencheurs de table comme `OnInsert`, `OnModify`, `OnDelete` et `OnRename`, des déclencheurs de champ comme `OnValidate` et `OnLookup`, ainsi que des déclencheurs de Page et de Report. L'ordre et le contexte d'appel sont déterminants.
- **Un paramètre change le déroulement :** pour `INSERT`, `MODIFY` et `DELETE`, `RunTrigger` détermine si le déclencheur de table associé est exécuté. Sans indication, il vaut `FALSE`. `MODIFY(TRUE)` exécute `OnModify`, mais ne valide pas automatiquement chaque champ. Les opérations de masse doivent être examinées séparément.
- **Contrôler, transférer et valider sont trois choses distinctes :** `TESTFIELD` contrôle la valeur d'un champ. `TRANSFERFIELDS` affecte les valeurs d'après les numéros de champ et n'exécute aucun trigger `OnValidate`. Une affectation directe à un champ contourne elle aussi cette validation.
- **Contexte implicite :** `Rec`, `xRec` et `WITH` déterminent à quoi une expression fait référence. Les variables locales et globales ont des portées différentes. Les variables globales peuvent conserver un état au sein d'une instance d'objet ; les codeunits `SingleInstance` partagent leur instance au sein d'une session.

**Pour l'analyse :** le nom d'une fonction ne suffit pas à expliquer le déroulement. Il faut aussi retracer les paramètres d'activation des triggers, le contexte des variables et les actions déclenchées en aval.

****État des Records & calculs** Filtres, FlowFields, données temporaires et sociétés**

- **Un Record mémorise plus que des valeurs de champ :** filtres, groupes de filtres, clés et enregistrement courant influencent les accès. `SETRANGE`, `SETFILTER`, `FILTERGROUP`, `RESET`, `FINDSET`, `FINDFIRST` et `NEXT` doivent être lus dans leur contexte. `GET` utilise la clé primaire et ignore les filtres ordinaires ; les filtres de sécurité doivent être pris en compte séparément.
- **FlowField n'est pas FlowFilter :** un FlowField ne stocke pas durablement son résultat calculé dans la table. `CalcFormula` décrit le calcul, par exemple une somme ou une recherche (lookup). `CALCFIELDS` calcule la valeur ; selon l'intégration du champ, l'interface utilisateur s'en charge également. Un FlowFilter fournit des conditions de filtre pour ces calculs et ne calcule lui-même aucune valeur de résultat.
- **Même table, autre contexte :** les variables Record temporaires traitent les données en mémoire. `CHANGECOMPANY` change la société sur laquelle portent les accès aux données ; les triggers continuent de s'exécuter dans le contexte de la société courante. `DataPerCompany` distingue les tables propres à chaque société des tables communes.

**Pour l'analyse :** le nom de la table et la valeur du champ ne suffisent pas. Filtres, définition du calcul, état temporaire et société déterminent ce que la donnée exprime.

****Dépendances dynamiques & événements** RecordRef, FieldRef, appels et subscribers**

- **Réutilisation sans modèle de classes :** C/AL ne propose ni espaces de noms ni définitions d'interface natives. Un véritable modèle de classes avec héritage ne fait pas non plus partie du langage. Les codeunits mettent à disposition des fonctions globales ; `CODEUNIT.RUN` lance leur trigger `OnRun`. Les références peuvent être résolues par nom, par sous-type d'objet déclaré ou par numéro.
- **Les cibles peuvent n'être connues qu'à l'exécution :** `RecordRef`, `FieldRef`, `Variant` et des ID d'objet transmis dynamiquement permettent un traitement générique. Des tables de configuration peuvent aussi déterminer quel code est réellement appelé.
- **Les événements font déjà partie de C/AL :** depuis NAV 2016, publishers et subscribers peuvent créer des relations d'appel supplémentaires. L'analyse doit tenir compte de ces liaisons ; une recherche des appels de fonction directs ne les recense pas entièrement.

**Pour l'analyse :** les dépendances attestées statiquement et les relations qui ne peuvent être résolues qu'à l'aide de la configuration ou d'informations d'exécution sont présentées séparément.

****Transactions & SQL** COMMIT, gestion des erreurs, clés et verrous**

- **Les transactions sont en partie implicites :** C/AL ouvre et clôt automatiquement les transactions de base de données. `COMMIT` fixe une limite explicite. Une erreur ultérieure n'annule pas les modifications déjà validées.
- **La gestion des erreurs fait partie de la logique :** les valeurs de retour des fonctions de base de données, la valeur de retour booléenne évaluée de `CODEUNIT.RUN` et `TryFunction` modifient le déroulement des erreurs et des transactions. Les modifications de base de données effectuées dans une TryFunction ne sont pas automatiquement annulées lorsqu'une erreur est interceptée ; les écritures autorisées dépendent de la version et de la configuration du serveur.
- **C/AL agit sur SQL sans montrer de SQL :** `SETCURRENTKEY`, les filtres, `LOCKTABLE`, `FINDSET`, les clés et les agrégats SIFT influent sur les accès et le comportement de verrouillage. Une clé définie ne garantit pas un plan d'exécution SQL précis. Les schémas atypiques fournissent des pistes ; leurs performances réelles sont mesurées.

**Pour l'analyse :** la cohérence des données et les performances ne peuvent être évaluées qu'en tenant compte des limites de transaction, des chemins d'erreur et de l'exploitation concrète de la base de données.

****Historique & comparaison au standard** Format TXT, Version List, versions pays et personnalisations**

- **Un format d'export propre et documenté :** C/SIDE gère les objets dans la base de données et les exporte au format FOB ou TXT. Le TXT contient le code source et des métadonnées telles que Version List, date, heure et indicateur Modified. Ces exports peuvent être gérés avec Git ; les métadonnées techniques peuvent toutefois ajouter des différences supplémentaires aux comparaisons. Microsoft fournit lui-même des outils de comparaison et de conversion.
- **Des personnalisations peuvent se cacher dans le standard :** dans les projets NAV classiques, le code Microsoft était souvent modifié directement. La `Version List` est un indice, pas une preuve exhaustive des modifications. Le classement devient fiable grâce à une comparaison avec la version d'origine non modifiée correspondante et à la documentation de projet existante.
- **La bonne base est déterminante :** version NAV, build ou mise à jour cumulative, version pays et solutions partenaires doivent concorder. Les localisations allemande, autrichienne ou suisse peuvent contenir d'autres objets standard et d'autres règles métier.

**Pour l'analyse :** seule la bonne version de référence montre quelle logique relève du standard, de la localisation, d'un add-on ou d'une personnalisation spécifique.

****Exécution, droits & interfaces** Générations de clients, autorisations et points d'entrée externes**

- **La génération de NAV change l'environnement :** le Classic Client, le RoleTailored Client à partir de NAV 2009, les Forms et Pages ainsi que les Dataports et XMLports relèvent de stades de développement différents. L'interopérabilité .NET a été introduite dès **NAV 2009 R2**. Automation/COM, les composants .NET et l'exécution côté client ou côté serveur doivent être examinés version par version.
- **Les droits ne sont que partiellement visibles dans l'export :** la propriété d'objet `Permissions` fait partie des sources. Les ensembles d'autorisations (permission sets) attribués, les droits des utilisateurs, les filtres de sécurité et le périmètre de licence doivent être recensés en plus. Les autorisations indirectes peuvent déterminer par quel traitement les données peuvent être modifiées.
- **L'utilisation ne passe pas seulement par le code :** files d'attente des travaux, services web publiés, chemins de fichiers, composants externes et systèmes SQL, EDI ou e-commerce connectés peuvent démarrer ou piloter des traitements. `GUIALLOWED` et les fonctions dépendantes du client sont déterminants pour les traitements en arrière-plan. L'absence d'appels statiques ne prouve donc pas l'absence d'utilisation.

**Pour l'analyse :** l'export TXT est complété par la configuration que vous mettez à disposition, la connaissance des interfaces et des preuves d'utilisation appropriées. Les dépendances non résolues sont clarifiées de manière ciblée avec l'équipe informatique et les services métier.

CE QUE VOUS Y GAGNEZ

### Comprendre les règles métier. Planifier la migration sur des bases solides.

Une analyse fiable relie le code C/AL, les métadonnées des objets et l'exploitation réelle. Règles, dépendances et questions ouvertes deviennent ainsi traçables – comme base pour le standard Business Central, des modules adaptés et un développement AL ciblé.

[Demander une analyse C/AL](https://navtobc.de/fr/kontakt?thema=nav-analyse)

**Sources de référence & contexte**

Vérifié le 09/10/2026 à partir de la documentation Microsoft. Cette synthèse rassemble les particularités essentielles pour l'analyse ; le détail dépend de la version NAV, de l'état des objets et de l'environnement d'exploitation.

- [C/AL jusqu'à Business Central 14 et exports d'objets TXT](https://learn.microsoft.com/fr-fr/dynamics365/business-central/dev-itpro/developer/devenv-txt2al-tool)
- [FOB/TXT : exporter et importer des objets](https://learn.microsoft.com/fr-fr/dynamics365/business-central/dev-itpro/cside/cside-import-objects)
- [Interopérabilité .NET dans NAV 2009 R2](https://www.microsoft.com/en-us/dynamics-365/blog/no-audience/2010/10/27/net-interoperability-in-nav-2009-r2/)
- [Événements en C/AL depuis NAV 2016](https://www.microsoft.com/en-us/dynamics-365/blog/business-leader/2015/10/15/integration-events-in-microsoft-dynamics-nav-2016/)
- [Fonctions, variables et VALIDATE en C/AL](https://www.microsoft.com/en-us/dynamics-365/blog/no-audience/2012/12/03/writing-unit-tests-in-cal/)
- [FlowFields dans NAV 2018](https://learn.microsoft.com/fr-fr/previous-versions/dynamicsnav-2018-developer/FlowFields)
- [Objets TXT, métadonnées et comparaison au standard](https://learn.microsoft.com/fr-fr/dynamics365/business-central/dev-itpro/upgrade/comparing-and-merging-application-object-source-files)
- [TryFunctions et gestion des erreurs en C/AL](https://www.microsoft.com/en-us/dynamics-365/blog/business-leader/2015/10/28/nav-design-pattern-tryfunction-net-exception-handling-in-cal/)
- [SingleInstance, date de travail et effets de bord](https://www.microsoft.com/en-us/dynamics-365/blog/it-professional/2015/10/19/test-isolation-in-the-application-test-automation-suite/)
- [Comparaison des langages : les options existent aussi en AL](https://learn.microsoft.com/fr-fr/dynamics365/business-central/dev-itpro/developer/methods-auto/option/option-data-type)
- [CHANGECOMPANY et contexte des triggers (référence AL)](https://learn.microsoft.com/fr-fr/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-changecompany-method)
- [Permissions et droits indirects (référence AL)](https://learn.microsoft.com/fr-fr/dynamics365/business-central/dev-itpro/developer/properties/devenv-permissions-property)

[Comment nous combinons analyse de code et IA](https://navtobc.de/fr/methoden)
