Liens documentaires
Système de liens entre documents pour créer des relations et des arborescences.
Vue d'ensemble
Les liens documentaires permettent de créer des relations entre documents dans Process Studio. Un lien est une association entre deux documents qui peut être bidirectionnelle (visible des deux côtés) ou unidirectionnelle (visible seulement du document source).
Les liens documentaires permettent de :
- Relier des documents entre eux (parent-enfant, dépendance, référence)
- Créer des arborescences de documents
- Naviguer rapidement entre documents liés
- Organiser l'information de manière hiérarchique
Architecture
Composants principaux
LinkDefinition : Définition du type de lien
public class LinkDefinition
{
public string IdDefinition { get; set; }
public string Name { get; set; }
public string IdFormular { get; set; }
public LinkDefinitionType LinkType { get; set; }
public string SourceQueryKey { get; set; }
public string SourceUrlFormat { get; set; }
public string TargetQueryDocuments { get; set; }
public string TargetUrlFormat { get; set; }
}
DocLink : Instance d'un lien entre deux documents
public class DocLink
{
public string IdLink { get; set; }
public string IdDefinition { get; set; }
public string IdDocSource { get; set; }
public string SourceKey { get; set; }
public string TargetKey { get; set; }
public string Description { get; set; }
}
Tables de base de données
LinkDefinitions: Définitions des types de liensLinkDocuments: Instances des liens entre documentsComputedQueryLinks: Vue calculée pour l'affichage optimisé
Types de liens
Liens bidirectionnels
Les liens bidirectionnels sont visibles des deux côtés :
public enum LinkDefinitionType
{
/// <summary>
/// Lien de type bidirectionnel
/// </summary>
Bidirectional = 0,
/// <summary>
/// Lien de type unidirectionnel
/// </summary>
Unidirectional = 1,
}
Comportement :
- Document A → Document B : Lien visible dans A
- Document B → Document A : Lien visible dans B (inverse)
- Suppression automatique dans les deux sens
Cas d'usage :
- Documents liés (Contrat ↔ Avenant)
- Relations symétriques (Document associé)
Liens unidirectionnels
Les liens unidirectionnels ne sont visibles que du document source :
Comportement :
- Document A → Document B : Lien visible seulement dans A
- Suppression uniquement depuis le document source
Cas d'usage :
- Référence à un document (Citation, Lien externe)
- Relations hiérarchiques (Document → Annexe)
Configuration des types de liens
Création d'un type de lien
Dans Process Studio :
- Ouvrir Liens dans le menu
- Cliquer sur Nouveau type de lien
- Configurer les propriétés
Propriétés d'un type de lien
Informations générales
- Nom : Nom du type de lien
- Formulaire : Formulaire concerné (* pour tous)
- Type : Bidirectionnel ou Unidirectionnel
Configuration source
Source Query Key : Requête pour récupérer la clé du document source
SELECT id
FROM Documents
WHERE id = @idSource
Ou par référence :
SELECT reference
FROM Documents
WHERE id = @idSource
Source URL Format : Format de l'URL pour ouvrir le document source
~/PageLoader.ashx?Open&IdDoc={0}
Configuration cible
Target Query Documents : Requête pour la sélection des documents cibles
SELECT
Documents.id AS "id",
Documents.reference AS "reference",
Documents.title AS "title",
'' AS "comments"
FROM Documents
WHERE documents.validity = 'V'
AND documents.id IN (
SELECT id_document
FROM DocumentAccessView
WHERE resource_name {0}
)
Target URL Format : Format de l'URL pour ouvrir le document cible
~/PageLoader.ashx?Open&IdDoc={0}
Exemples de types de liens
Lien par ID de document
new LinkDefinition
{
IdFormular = "*",
Name = "Document par ID",
LinkType = LinkDefinitionType.Bidirectional,
SourceQueryKey = @"SELECT id
FROM Documents
WHERE id = @idSource",
SourceUrlFormat = "~/PageLoader.ashx?Open&IdDoc={0}",
TargetQueryDocuments = @"SELECT
Documents.id AS ""id"",
Documents.reference AS ""reference"",
Documents.title AS ""title"",
'' AS ""comments""
FROM Documents
WHERE documents.validity = 'V'",
TargetUrlFormat = "~/PageLoader.ashx?Open&IdDoc={0}"
};
Lien par référence de document
new LinkDefinition
{
IdFormular = "*",
Name = "Document par Référence",
LinkType = LinkDefinitionType.Bidirectional,
SourceQueryKey = @"SELECT reference
FROM Documents
WHERE id = @idSource",
SourceUrlFormat = "~/PageLoader.ashx?Open&IdDoc={0}",
TargetQueryDocuments = @"SELECT
Documents.reference AS ""id"",
Documents.reference AS ""reference"",
Documents.title AS ""title"",
'' AS ""comments""
FROM Documents",
TargetUrlFormat = "~/PageLoader.ashx?Open&IdDoc={0}"
};
Utilisation des liens
Ajout d'un lien depuis un document
Interface Web
- Ouvrir le document
- Accéder à la section Liens documentaires
- Cliquer sur Ajouter un lien
- Sélectionner le type de lien
- Rechercher et sélectionner le document cible
- Ajouter une description (optionnel)
- Valider
Composant ASP.NET
Le composant Links.ascx affiche la grille des liens :
<aps:ApsSection runat="server" ID="SectionLink" Title="Liens documentaires">
<dx:ASPxGridView ID="GridLinks" runat="server"
ClientInstanceName="GridLinks"
AutoGenerateColumns="False"
KeyFieldName="id_link"
OnRowDeleting="GridLinks_RowDeleting"
OnRowUpdating="GridLinks_RowUpdating">
<!-- Configuration des colonnes -->
</dx:ASPxGridView>
</aps:ApsSection>
Affichage des liens
Les liens sont affichés dans une grille avec les colonnes :
- Type de lien : Nom du type de lien
- Direction : In (entrant) ou Out (sortant)
- Référence : Référence du document lié
- Titre : Titre du document lié
- Description : Description du lien
- Actions : Modifier, Supprimer
Navigation
Cliquer sur un lien ouvre le document cible :
// Navigation vers un document
window.APScore.Window.OpenDocumentById(documentId, appName, false, { focusOn: true });
Gestion programmatique
Charger les liens d'un document
var linksManager = new LinksManagerWrapper(applicationProfile);
// Charger tous les liens d'un document
DocLink[] links = linksManager.LoadLinksByIdDocument(idDocument);
// Requête pour affichage dans une grille
DSLinks.QueryLinksDataTable queryLinks = linksManager.QueryLinksByIdDocument(idDocument);
Créer un lien
var newLink = new DocLink
{
IdDefinition = "id_du_type_de_lien",
IdDocSource = "id_document_source",
SourceKey = "cle_source", // ID ou référence selon config
TargetKey = "cle_cible", // ID ou référence du doc cible
Description = "Description du lien"
};
bool success = linksManager.SaveLink(newLink);
Supprimer un lien
bool success = linksManager.DeleteLink(idLink);
Charger un lien spécifique
DocLink? link = linksManager.LoadLink(idLink);
Requêtes de liens
Requête pour liens entrants et sortants
Le système utilise une vue calculée pour optimiser l'affichage :
-- Liens sortants (OUT) par ID
SELECT
[LinkDocuments].[id_source] AS [id_lookup],
[Documents].[Id] AS [id],
[Documents].[title],
[Documents].[reference],
'out' AS [direction],
[LinkDocuments].[id_source],
[LinkDocuments].[id] AS [id_link],
[LinkDefinitions].[target_url_format] AS [url_format],
[LinkDocuments].[description]
FROM [LinkDefinitions]
JOIN [LinkDocuments] ON [LinkDefinitions].[id] = [LinkDocuments].[id_link_definition]
JOIN [Documents] ON [LinkDocuments].[target_key] = [Documents].[Id]
UNION ALL
-- Liens entrants (IN) par ID
SELECT
[TargetDocument].[Id] AS [id_lookup],
[SourceDocument].[Id],
[SourceDocument].[title],
[SourceDocument].[reference],
'in' AS [direction],
[LinkDocuments].[id_source],
[LinkDocuments].[id] AS [id_link],
[LinkDefinitions].[source_url_format] AS [url_format],
[LinkDocuments].[description]
FROM [LinkDefinitions]
JOIN [LinkDocuments] ON [LinkDefinitions].[id] = [LinkDocuments].[id_link_definition]
JOIN [Documents] SourceDocument ON [LinkDocuments].[source_key] = [SourceDocument].[Id]
JOIN [Documents] TargetDocument ON [LinkDocuments].[target_key] = [TargetDocument].[Id]
WHERE [LinkDefinitions].[link_type] = 0 -- Bidirectionnel
Implémentation en C#
public DSLinks.QueryLinksDataTable QueryLinksByIdDocument(string idDoc)
{
var dt = new DSLinks.QueryLinksDataTable();
var query = ComputedQueryLinkStore
.QueryAll()
.Where(p => p.LookupId == idDoc);
foreach (var computedQueryLink in query)
{
dt.AddQueryLinksRow(
computedQueryLink.Title,
computedQueryLink.Reference,
computedQueryLink.Direction,
computedQueryLink.LinkId,
computedQueryLink.SourceId,
computedQueryLink.Id,
string.Format(computedQueryLink.UrlFormat, computedQueryLink.Id),
computedQueryLink.Description);
}
return dt;
}
Cas d'usage
Relation parent-enfant
Créer un lien entre un document parent et ses documents enfants :
// Lors de la création d'un document enfant
var parentLink = new DocLink
{
IdDefinition = "parent_child_link",
IdDocSource = childDocId,
SourceKey = childDocId,
TargetKey = parentDocId,
Description = "Document parent"
};
linksManager.SaveLink(parentLink);
Documents associés
Relier des documents connexes (bidirectionnel) :
var associatedLink = new DocLink
{
IdDefinition = "associated_docs",
IdDocSource = doc1Id,
SourceKey = doc1Id,
TargetKey = doc2Id,
Description = "Document associé"
};
linksManager.SaveLink(associatedLink);
// Le lien inverse est automatiquement créé (bidirectionnel)
Références externes
Créer des références vers des documents (unidirectionnel) :
var referenceLink = new DocLink
{
IdDefinition = "external_reference",
IdDocSource = sourceDocId,
SourceKey = sourceDocId,
TargetKey = referencedDocId,
Description = "Référence au document"
};
linksManager.SaveLink(referenceLink);
// Le lien n'apparaît que dans le document source
Bonnes pratiques
Conception des types de liens
- Nommer clairement : Utiliser des noms explicites pour les types de liens
- Limiter le nombre de types : Éviter de multiplier les types similaires
- Documenter l'usage : Expliquer quand utiliser chaque type de lien
- Tester les requêtes : Vérifier les performances des requêtes SQL
Gestion des liens
- Valider les cibles : S'assurer que le document cible existe
- Vérifier les droits : L'utilisateur doit avoir accès aux deux documents
- Éviter les boucles : Ne pas créer de liens circulaires
- Nettoyer les liens : Supprimer les liens vers des documents supprimés
Performance
- Indexer les colonnes : Indexer source_key et target_key
- Limiter les requêtes : Utiliser la vue calculée ComputedQueryLinks
- Pagination : Pour les documents avec beaucoup de liens
- Cache : Mettre en cache les définitions de liens
Maintenance
- Audit des liens : Tracer la création/suppression de liens
- Nettoyage périodique : Supprimer les liens orphelins
- Migration : Gérer les changements de structure de documents
Intégration
Dans les formulaires
Ajouter le composant de liens dans une page de formulaire :
<Component name="DocumentLinks"
path="~/Links/Links.ascx"
description="Gestion des liens documentaires" />
Dans les vues
Afficher les liens dans une colonne de vue :
// Colonne personnalisée pour afficher le nombre de liens
string sqlColumn = @"(SELECT COUNT(*)
FROM LinkDocuments
WHERE id_source = Documents.id) AS NbLinks";
Dans les workflows
Créer automatiquement des liens lors de transitions :
// Dans une action de transition
var link = new DocLink
{
IdDefinition = "workflow_generated_link",
IdDocSource = currentDocument.Id,
SourceKey = currentDocument.Id,
TargetKey = relatedDocId,
Description = "Lien créé par le workflow"
};
new LinksManagerWrapper().SaveLink(link);
Références
Classes principales
LinkDefinition: Définition d'un type de lienDocLink: Instance d'un lien entre documentsLinksManager: Gestionnaire de liensLinksManagerWrapper: Wrapper avec gestion du profil applicatif
Interfaces
ILinksManager: Interface du gestionnaire de liens
Tables de base de données
LinkDefinitions: Types de liensLinkDocuments: Instances de liensComputedQueryLinks: Vue calculée pour l'affichage