Skip to main content

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 liens
  • LinkDocuments : Instances des liens entre documents
  • ComputedQueryLinks : 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 :

  1. Ouvrir Liens dans le menu
  2. Cliquer sur Nouveau type de lien
  3. 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

  1. Ouvrir le document
  2. Accéder à la section Liens documentaires
  3. Cliquer sur Ajouter un lien
  4. Sélectionner le type de lien
  5. Rechercher et sélectionner le document cible
  6. Ajouter une description (optionnel)
  7. 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

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 lien
  • DocLink : Instance d'un lien entre documents
  • LinksManager : Gestionnaire de liens
  • LinksManagerWrapper : Wrapper avec gestion du profil applicatif

Interfaces

  • ILinksManager : Interface du gestionnaire de liens

Tables de base de données

  • LinkDefinitions : Types de liens
  • LinkDocuments : Instances de liens
  • ComputedQueryLinks : Vue calculée pour l'affichage

Documentation associée