Héritage de champs
Mécanisme de création de documents par héritage depuis un document source.
Vue d'ensemble
L'héritage de champs est un mécanisme qui permet de créer automatiquement un nouveau document (document cible) à partir d'un document existant (document source) en recopiant tout ou partie de ses champs. Cette fonctionnalité est particulièrement utile pour :
- Créer des documents liés (ex: Réclamation → Action corrective)
- Dupliquer des documents avec modifications
- Générer des documents enfants dans un workflow
- Initialiser des formulaires à partir de données existantes
Le système génère automatiquement du code C# qui effectue la correspondance entre les champs source et cible.
Principe de fonctionnement
Processus d'héritage
- Sélection des formulaires : Choix du formulaire source et du formulaire cible
- Correspondance des champs : Mapping entre les champs des deux formulaires
- Génération de code : Création automatique du code C# d'héritage
- Personnalisation : Ajout de logique métier supplémentaire si nécessaire
- Intégration : Appel du code d'héritage depuis un bouton ou une action workflow
Architecture
Document Source (Formulaire A)
↓
Code d'héritage (.ascx)
↓
Document Cible (Formulaire B)
Configuration dans Process Studio
Accès au menu Héritage de champs
- Ouvrir Process Studio
- Menu Formulaires → Héritage de champs
- L'interface de configuration s'affiche
Création d'une correspondance
Étape 1 : Sélection des formulaires
public partial class InheritanceNamePanel : XtraUserControl
{
public InheritanceNamePanel(KeyPair[] forms)
{
InitializeComponent();
lookUpEditSourceForm.Properties.DataSource = forms;
lookUpEditTargetForm.Properties.DataSource = forms.Clone();
}
}
Interface :
- Formulaire source : Formulaire à partir duquel copier les données
- Formulaire cible : Formulaire à créer avec les données héritées
Étape 2 : Correspondance des champs
Pour chaque champ à hériter :
- Sélectionner un champ source (colonne de gauche)
- Sélectionner un champ cible (colonne de droite)
- Cliquer sur le bouton pour ajouter la correspondance
- Une ligne de code est automatiquement générée
Exemple de correspondance :
Formulaire Source: Fiche_SMS
- Titre → Titre (Fiche_Action)
- Description → Descriptif (Fiche_Action)
- DateCreation → DateOuverture (Fiche_Action)
Étape 3 : Paramètres d'héritage
public class InheritanceParams
{
public string IdFormularSource { get; set; }
public string IdFormularTarget { get; set; }
public string AscxFileName
{
get { return string.Format("{0}{1}.ascx", IdFormularSource, IdFormularTarget); }
}
}
Le fichier généré sera nommé : FormSource_FormCible.ascx
Code généré
Structure du fichier ASCX
Le système génère un fichier .ascx contenant la méthode RunInheritanceFields :
<%@ Control Language="C#" ClassName="Formulaire_Source____Formulaire_Cible" %>
<script runat="server">
public void RunInheritanceFields(
Avanteam.Documents.Interface.IApsDocument docSource,
Avanteam.Documents.Interface.IApsDocument docTarget)
{
//START_CODE_INHERITANCE
// Correspondances de champs générées automatiquement
docTarget.SetValues("Titre", docSource.GetValues("Titre"));
docTarget.SetValues("Description", docSource.GetValues("Description"));
docTarget.SetValues("DateOuverture", docSource.GetValues("DateCreation"));
//END_CODE_INHERITANCE
}
</script>
Emplacement des fichiers
Les fichiers générés sont stockés dans :
Forms/InheritanceFields/
Syntaxe de copie de champs
Copie simple
// Copie directe d'un champ
docTarget.SetValues("NomChampCible", docSource.GetValues("NomChampSource"));
Copie avec transformation
// Copie avec formatage
docTarget.SetValues("Title", docSource.GetStringValue("Title", "{0} (Héritage)"));
Valeurs multiples
// Copie de champs multivalués
docTarget.SetValues("Responsables", docSource.GetValues("Responsables"));
Personnalisation du code
Ajout de logique métier
Le code généré peut être complété manuellement entre les balises :
//START_CODE_INHERITANCE
// Code généré automatiquement
docTarget.SetValues("Titre", docSource.GetValues("Titre"));
// === Code personnalisé ajouté manuellement ===
// Lien parent-enfant
docTarget.SetValues("ParentId", docSource.IdDocument);
docTarget.SetValues("ParentReference", docSource.GetValues("Reference"));
// Calculs
docTarget.SetValues("DateEcheance", DateTime.Now.AddDays(30));
//END_CODE_INHERITANCE
Lancement automatique du workflow
// Sauvegarder le document cible
((Avanteam.Documents.DocumentDocHelper)docTarget).SaveDocument();
// Démarrer le workflow
new Avanteam.Application.WorkflowClientRuntime(
new Avanteam.Application.DataSource.ApplicationDataSource
{
UserName = Avanteam.Application.Security.APSUser.GetUserFromSession().FullName,
CurrentIdDocument = docTarget.IdDocument
})
.StartProcessByName("NOM_DU_WORKFLOW");
// Rediriger vers le nouveau document
Page.Response.Redirect(
Page.ResolveUrl("~/PageLoader.ashx?Edit&IdDoc=" + docTarget.IdDocument),
true);
Copie de tableaux de détails
Avanteam.Documents.DataSource.DocumentManagerWrapper docMng =
((Avanteam.Documents.DocumentDocHelper)docSource).DocumentDataSource;
if (docMng != null)
{
// Copie des lignes d'un tableau de détails
string sqlInsertDetails = @"
INSERT INTO TableauDetails
SELECT
NEWID() as id,
@IdNewDoc as id_document,
Colonne1, Colonne2, Colonne3
FROM TableauDetails
WHERE id_document = @IdDoc";
docMng.SQL_ExecuteNonQuery(
sqlInsertDetails,
new Avanteam.Kernel.KeyPair("IdDoc", docSource.IdDocument),
new Avanteam.Kernel.KeyPair("IdNewDoc", docTarget.IdDocument));
}
Récupération de l'utilisateur connecté
Avanteam.Application.DataSource.ApplicationDataSource dataSource =
parameters["ApplicationDataSource"] as Avanteam.Application.DataSource.ApplicationDataSource;
string currentUser = dataSource.UserName;
// Affecter l'utilisateur à un champ
docTarget.SetValues("Demandeur", currentUser);
Intégration dans l'application
Création du composant bouton
Créer un composant personnalisé pour appeler l'héritage :
Fichier : CreateDocumentFromInheritance.ascx.cs
using System;
using System.Web.UI;
using Avanteam.Documents;
using Avanteam.Documents.Interface;
public partial class CreateDocumentFromInheritance : UserControl
{
protected void btnCreateAction_Click(object sender, EventArgs e)
{
// Récupérer le document source
IApsDocument docSource = GetCurrentDocument();
// Créer le document cible
IApsDocument docTarget = CreateNewDocument("NomFormulaireCible");
// Charger et exécuter le code d'héritage
var inheritanceControl = LoadControl("~/Forms/InheritanceFields/Source_Cible.ascx");
// Appeler la méthode d'héritage
var method = inheritanceControl.GetType().GetMethod("RunInheritanceFields");
method.Invoke(inheritanceControl, new object[] { docSource, docTarget });
// Rediriger vers le nouveau document
Response.Redirect("PageLoader.ashx?Edit&IdDoc=" + docTarget.IdDocument);
}
}
Fichier : CreateDocumentFromInheritance.ascx
<%@ Control Language="C#" AutoEventWireup="true"
CodeFile="CreateDocumentFromInheritance.ascx.cs"
Inherits="CreateDocumentFromInheritance" %>
<asp:Button ID="btnCreateAction" runat="server"
Text="Créer une action corrective"
OnClick="btnCreateAction_Click"
CssClass="btn btn-primary" />
Ajout dans le FormularDesigner.xml
Référencer le composant dans la configuration :
<Components>
<Component name="CreateAction"
path="~/Custom_Client/CreateDocumentFromInheritance.ascx"
description="Bouton de création par héritage" />
</Components>
Bonnes pratiques
Conception
- Analyser les besoins : Identifier les champs à copier et les transformations nécessaires
- Nommer explicitement : Utiliser des noms de fichiers clairs (ex: Reclamation_Action.ascx)
- Documenter le code : Ajouter des commentaires pour expliquer la logique métier
- Tester avant déploiement : Vérifier sur des données de test
Gestion des données
- Valider les données source : Vérifier que les champs source existent et ont des valeurs
- Gérer les valeurs nulles : Prévoir des valeurs par défaut
- Transformer si nécessaire : Adapter les formats (dates, nombres, etc.)
- Créer les liens : Référencer le document source (ParentId)
Performance
- Limiter les requêtes SQL : Regrouper les opérations
- Optimiser les copies de tableaux : Utiliser des requêtes SQL efficaces
- Ne copier que le nécessaire : Éviter de copier tous les champs
Maintenance
- Versionner le code : Conserver les versions d'héritage
- Tester après modifications : Vérifier l'impact sur les formulaires
- Gérer les incompatibilités : Prévoir la gestion des changements de structure
Références
Classes principales
InheritanceParams: Paramètres de configuration de l'héritageInheritanceNamePanel: Interface de sélection des formulairesIApsDocument: Interface du document source et cibleDocumentDocHelper: Helper pour la manipulation de documents
Fichiers et répertoires
Forms/InheritanceFields/: Fichiers d'héritage générésCustom_Client/: Composants personnalisésFormularDesigner.xml: Configuration des composants