IBatchItems est une collection d’éléments IBatchItem dotée d’une méthode Move permettant de réorganiser les documents et les pages, ainsi que d’un script d’exemple pour l’assemblage de jeux de documents.
Le script exécute plusieurs scénarios consécutifs, qui aboutissent à un script permettant d’assembler des jeux à partir de listes de documents non triées :
Désassembler les jeux
Regrouper les documents par type dans l’ordre spécifié
Regrouper les documents par champ clé spécifié
Assembler les documents en jeux ayant le même champ clé
Exemple de script
using System.Collections.Generic;IBatchItems batch = Batch.AsBatchItem.ChildItems;List<string> docDefs = new List<string> {"DocSet","Doc1","Doc2"}; // Ordre d’assemblage des documents
// Nom du champ clé
// (le champ doit être indexé dans tous les documents et avoir le même nom)string keyFieldName = "SSN"; List<string> keyFields = new List<string>();
// Désassemblage des jeuxbool foundChildren = false;do{
foreach (IBatchItem itm in batch) {
if (itm.ChildItems.Count > 1) {
int shift = 0; foreach (IBatchItem subItm in itm.ChildItems) {
shift++; batch.Move(subItm, itm.Index + shift); }
} }
foreach (IBatchItem itm in batch) if (itm.ChildItems.Count > 1) foundChildren = true;
} while (foundChildren);
// Tri des documents dans l’ordre attendu dans le jeu
// (c.-à-d. le jeu lui-même, suivi de tous ses sous-documents)foreach (string docDefName in docDefs)
{ List<int> indexList = new List<int>();
foreach (IBatchItem itm in batch) if (itm.Type == TBatchItemType.BIT_Document)
if (itm.AsDocument.DefinitionName == docDefName) indexList.Add(itm.Index);
for (int i = 0; i < indexList.Count; i++) batch.Move(batch[indexList[i]-i], batch.Count);
}
// Recherche de toutes les valeurs possibles des champs clés dans le lotforeach (IBatchItem itm in batch)
{ if (itm.Type == TBatchItemType.BIT_Document)
{ string keyFieldValue = (string)itm.AsDocument.IndexedItemValue(keyFieldName); if (!keyFields.Contains(keyFieldValue)) keyFields.Add(keyFieldValue);
}
}
// Assemblage des documents ayant le même champ cléforeach (string keyFieldValue in keyFields)
{ List<int> indexList = new List<int>(); foreach (IBatchItem itm in batch)
if (itm.Type == TBatchItemType.BIT_Document) if ((string)itm.AsDocument.IndexedItemValue(keyFieldName) == keyFieldValue) indexList.Add(itm.Index);
for (int i = 0; i < indexList.Count; i++) batch.Move(batch[indexList[i]-i], batch.Count);}
// Déplacement des sous-documents dans les jeux uniquement si les champs clés correspondent// (documents de jeu d’abord, documents enfants ensuite)
int ind = 0;while (ind < batch.Count)
{ if (batch[ind].Type == TBatchItemType.BIT_Document)
// Recherche du début du jeu if (batch[ind].AsDocument.DefinitionName == docDefs[0]) // Si un document situé après le jeu n’est pas un jeu et que les champs clés correspondent, // nous l’ajoutons à ce jeu