Aller au contenu principal

Tableaux de détails

Gestion des tableaux multi-lignes dans les formulaires.

Vue d'ensemble

Les tableaux de détails permettent de gérer des ensembles de lignes de données liées à un document principal. Chaque ligne peut contenir plusieurs colonnes avec différents types de champs.

Exemples

  • Lignes de commande (Article, Quantité, Prix)
  • Liste de participants (Nom, Email, Fonction)
  • Historique d'événements (Date, Action, Utilisateur)

Architecture

Structure en base de données

Pour un formulaire FRM_Commande avec un tableau Lignes :

-- Table principale
FRM_Commande
- id (PK)
- reference
- date_commande
- client

-- Table de détails
FRM_Commande_Lignes
- id (PK)
- id_document (FK vers FRM_Commande)
- article
- quantite
- prix_unitaire
- total

Nomenclature

Table de détails : FRM_{FormulaireName}_{TableauName}
Clé primaire : id
Clé étrangère : id_document

Création d'un tableau de détails

Dans Process Studio

  1. Ouvrir le formulaire
  2. Onglet Champs
  3. Créer un champ de type Tableau de détails
  4. Configurer les colonnes

Configuration des colonnes

Pour chaque colonne :

  • Nom : Identifiant de la colonne
  • Type : Text, Number, Date, Liste, etc.
  • Largeur : Largeur d'affichage
  • Obligatoire : Requis ou optionnel
  • Valeur par défaut : Valeur initiale

Types de colonnes

Colonnes standards

// Texte
Column: article
Type: Text
MaxLength: 255

// Nombre
Column: quantite
Type: Number
Decimals: 0

// Décimal
Column: prix_unitaire
Type: Number
Decimals: 2

// Date
Column: date_livraison
Type: Date
Format: dd/MM/yyyy

Colonnes calculées

// Calcul du total de ligne
function calculateTotal(row) {
var quantite = parseFloat(row.quantite) || 0;
var prix = parseFloat(row.prix_unitaire) || 0;
row.total = (quantite * prix).toFixed(2);
}

Colonnes avec liste de valeurs

// Liste déroulante
Column: categorie
Type: List
ListSource: Categories_Produits

Gestion des données

Ajouter une ligne

// SQL pour insérer une ligne
INSERT INTO FRM_Commande_Lignes
(id, id_document, article, quantite, prix_unitaire, total)
VALUES
(NEWID(), @idDocument, @article, @quantite, @prixUnitaire, @total)

Modifier une ligne

// SQL pour mettre à jour une ligne
UPDATE FRM_Commande_Lignes
SET
article = @article,
quantite = @quantite,
prix_unitaire = @prixUnitaire,
total = @total
WHERE id = @idLigne

Supprimer une ligne

// SQL pour supprimer une ligne
DELETE FROM FRM_Commande_Lignes
WHERE id = @idLigne

Charger les lignes

// SQL pour récupérer toutes les lignes
SELECT *
FROM FRM_Commande_Lignes
WHERE id_document = @idDocument
ORDER BY ordre, date_creation

Fonctionnalités avancées

Validation de tableau

Rendre un tableau obligatoire (au moins une ligne) :

function validateTable() {
var rowCount = detailsTable.GetRowCount();
if (rowCount === 0) {
alert("Le tableau doit contenir au moins une ligne");
return false;
}
return true;
}

Calculs de totaux

// Calcul du total du document
function calculateDocumentTotal() {
var total = 0;
var rows = detailsTable.GetAllRows();

rows.forEach(function(row) {
total += parseFloat(row.total) || 0;
});

document.SetValue("montant_total", total.toFixed(2));
}

Import depuis Excel

// Importer des lignes depuis Excel
public void ImportFromExcel(string filePath, string idDocument)
{
var excelData = ReadExcelFile(filePath);

foreach (var row in excelData)
{
SQL_ExecuteNonQuery(
"INSERT INTO FRM_Commande_Lignes ...",
new KeyPair("idDocument", idDocument),
new KeyPair("article", row.Article),
new KeyPair("quantite", row.Quantite)
);
}
}

Export vers Excel

// Exporter les lignes vers Excel
SELECT
article AS Article,
quantite AS Quantité,
prix_unitaire AS [Prix Unitaire],
total AS Total
FROM FRM_Commande_Lignes
WHERE id_document = @idDocument

Copie de tableaux

Lors d'un héritage de champs

// Copier les lignes d'un document source vers cible
string sqlCopyLines = @"
INSERT INTO FRM_Commande_Lignes
SELECT
NEWID() as id,
@IdNewDoc as id_document,
article,
quantite,
prix_unitaire,
total
FROM FRM_Commande_Lignes
WHERE id_document = @IdSourceDoc";

docMng.SQL_ExecuteNonQuery(
sqlCopyLines,
new KeyPair("IdSourceDoc", docSource.IdDocument),
new KeyPair("IdNewDoc", docTarget.IdDocument)
);

Cas d'usage

Bon de commande

Tableau : Lignes de commande
Colonnes :
- Référence article (Text)
- Désignation (Text)
- Quantité (Number)
- Prix unitaire (Number, 2 decimals)
- Total ligne (Number, 2 decimals, calculé)

Feuille de temps

Tableau : Activités
Colonnes :
- Date (Date)
- Projet (Liste)
- Description (Text)
- Heures (Number, 1 decimal)
- Facturable (Checkbox)

Liste de participants

Tableau : Participants
Colonnes :
- Nom (Ressource annuaire)
- Email (Text)
- Fonction (Liste)
- Présent (Checkbox)
- Commentaire (Text)

Bonnes pratiques

Conception

  • Limiter le nombre de colonnes : Max 10-12 colonnes visibles
  • Nommer clairement : Noms de colonnes explicites
  • Ordre logique : Colonnes dans un ordre cohérent
  • Largeurs adaptées : Selon le contenu

Performance

  • Pagination : Pour tableaux avec beaucoup de lignes
  • Index : Indexer id_document pour les jointures
  • Lazy loading : Charger les lignes à la demande
  • Limiter les calculs : Optimiser les formules JavaScript

Maintenance

  • Migration de données : Prévoir les changements de structure
  • Validation : Vérifier l'intégrité des données
  • Audit : Tracer les modifications de lignes
  • Archivage : Gérer les lignes des documents archivés

Références

Structure SQL

-- Exemple de table de détails
CREATE TABLE FRM_Formulaire_Details (
id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
id_document UNIQUEIDENTIFIER NOT NULL,
colonne1 NVARCHAR(255),
colonne2 DECIMAL(18,2),
colonne3 DATETIME,
ordre INT,
CONSTRAINT FK_Details_Document
FOREIGN KEY (id_document)
REFERENCES Documents(id)
ON DELETE CASCADE
)

CREATE INDEX IX_Details_Document ON FRM_Formulaire_Details(id_document)

Documentation associée