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
- Ouvrir le formulaire
- Onglet Champs
- Créer un champ de type Tableau de détails
- 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)