La plupart des goulots d'étranglement de performance des UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. proviennent du fait que les développeurs traitent les Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. comme du code procédural standard. L'insertion d'une business function CUn composant logiciel écrit en langage C exécuté par JD Edwards pour réaliser des traitements complexes. ou d'un accès table répétitif dans le Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. d'une boucle batch à fort volume transforme une exécution de quatre minutes en un calvaire de plusieurs heures pour la base de données. Pire encore, le mauvais positionnement des réinitialisations de variables à travers les événements de section crée une corruption silencieuse des données dans les variables d'accumulation, que le débogage interactif standard d'étecte rarement.
Pour corriger cela, il est nécessaire de bien comprendre comment le moteur d'exécution UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. contrôle l'exécution à travers les événements Initialize SectionÉvénement d'un rapport JD Edwards qui s'exécute une seule fois au démarrage de la section, avant la lecture des données., Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. et Level BreakÉvénement déclenché lors du changement de valeur d'un champ clé, utilisé pour les sous-totaux et ruptures.. Dans cette analyse de la logique de section des Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. JDE UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards., nous isolons l'ordre d'exécution exact à travers les sections Group, Columnar et Conditional afin que vous puissiez positionner les E/S table (Table I/OOpérations d'entrée/sortie (lecture, écriture, mise à jour) effectuées directement sur les tables de la base de données.), les opérations de vidage de cache et les appels de suppression là où le processeur batch les attend réellement.
Le cycle de vie d'exécution des Event Rules de section UBE
La disposition visuelle dans Report Design Aid (RDA)L'outil de conception visuelle de rapports et de traitements batchs dans JD Edwards. laisse croire à tort aux développeurs que les Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. s'exécutent de haut en bas, telles qu'elles sont dessinées à l'écran. En réalité, l'Universal Batch Engine traite les sections selon une hiérarchie d'événements stricte qui commence par Initialize SectionÉvénement d'un rapport JD Edwards qui s'exécute une seule fois au démarrage de la section, avant la lecture des données. avant même qu'une seule ligne de données ne soit récupérée de la base de données. Lors du traitement des détails du Grand Livre de la table F0911 via la business viewUne vue logique combinant une ou plusieurs tables physiques pour simplifier l'accès aux données dans JD Edwards. V0911A, Initialize Section s'exécute exactement une fois. C'est ici que vous définissez les surcharges de sélection SQL (selection overrides), réinitialisez les totalisateurs ou appelez des business functions comme RetrieveCompanyConstants (B0000007). Une mauvaise compréhension de la frontière entre le positionnement visuel dans RDAL'outil de conception visuelle de rapports et de traitements batchs dans JD Edwards. et la séquence d'événements à l'exécution est à l'origine de la majorité des bugs de portée de variables dans les rapports UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. personnalisés.
Une fois le curseur de la base de données ouvert, Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. s'exécute de manière itérative pour chaque enregistrement renvoyé par la requête de la section. Si une requête F0911 non résumée renvoie 250 000 lignes d'écriture, Do Section se déclenche 250 000 fois de suite. Placer des business functions CUn composant logiciel écrit en langage C exécuté par JD Edwards pour réaliser des traitements complexes. inconditionnelles, des lectures Table I/OOpérations d'entrée/sortie (lecture, écriture, mise à jour) effectuées directement sur les tables de la base de données. non indexées sur F0006 ou des manipulations de chaînes complexes à l'intérieur de cet événement spécifique garantit une dégradation sévère des performances, faisant passer l'exécution du batch de quelques minutes à plusieurs heures. Do Section doit rester strictement réservé à l'évaluation au niveau de la ligne, aux affectations de variables de rapport et à l'appel de sections conditionnelles.
Les développeurs commettent fréquemment l'erreur de réinitialiser les variables de rapport à l'intérieur de Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données., ce qui entraîne la remise à zéro des valeurs agrégées à chaque itération. Une architecture UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. propre repose sur une séparation stricte : Initialize SectionÉvénement d'un rapport JD Edwards qui s'exécute une seule fois au démarrage de la section, avant la lecture des données. définit les paramètres d'exécution, Do Section traite les lignes individuelles et les événements Level Break FooterÉvénement de bas de page déclenché à la fin d'un groupe de données pour afficher des totaux ou résumés. gèrent l'accumulation des sous-totaux. Vérifiez toujours où les variables sont réinitialisées dans la séquence d'événements avant de dépanner des données de rapport manquantes ou corrompues.

Logique du Do Section et traitement des données au niveau de la ligne
Une sélection de données pilote qui renvoie 100 000 lignes exécute l'événement Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. exactement 100 000 fois. Placer une requête Table I/OOpérations d'entrée/sortie (lecture, écriture, mise à jour) effectuées directement sur les tables de la base de données. non indexée sur F4102 ou appeler une BSFN CUn composant logiciel écrit en langage C exécuté par JD Edwards pour réaliser des traitements complexes. lourde comme B4200310 à l'intérieur de cet événement crée 100 000 accès distincts à la base de données ou allocations de mémoire, transformant instantanément un court traitement batch en une exécution de plusieurs heures qui sature les cœurs de processeur du serveur d'entreprise. Chaque ligne de code à l'intérieur de Do Section doit être évaluée pour son coût d'exécution par ligne avant le déploiement.
Le rendu à l'exécution dépend d'un timing procédural précis au sein de Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données.. Les fonctions système qui modifient la présentation du rapport, en particulier Suppress Section WriteFonction système JD Edwards permettant d'empêcher l'écriture d'une ligne ou d'une section dans le rapport final., doivent se déclencher à l'intérieur de cet événement avant que le moteur batch JDE n'écrive le tampon de ligne actuel dans le flux PDF. Si votre logique d'évaluation conditionnelle se trouve sous un appel de section imbriqué ou s'exécute après la fin des branches d'évaluation, le moteur génère tout de même l'enregistrement, laissant des lignes vides indésirables ou des mises en page tronquées dans votre rapport.
La gestion des accumulateurs à travers les limites d'exécution nécessite une isolation stricte des événements. Placer des réinitialisations de variables à l'intérieur de Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. sans vérifications conditionnelles par rapport à SV File_IO_Status ou sans indicateurs explicites de rupture de niveau efface prématurément les soldes de ligne. Étant donné que les événements Level Break FooterÉvénement de bas de page déclenché à la fin d'un groupe de données pour afficher des totaux ou résumés. s'exécutent après que Do Section a terminé son passage sur le dernier enregistrement d'un groupe, une réinitialisation aveugle de variable au bas de Do Section remet à zéro vos agrégats mathématiques juste avant que l'événement de bas de page ne les lise pour imprimer les sous-totaux et les totaux généraux.
Gestion des agrégations avec les Event Rules de Level Break
La logique d'agrégation mal positionnée dans les rapports UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. personnalisés est responsable d'une grande partie des anomalies de synthèse financière lors des mises à niveau du système. Aligner strictement les Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. avec les limites d'exécution de Level Break Header (LBH)Événement d'en-tête déclenché au début d'un nouveau groupe de données pour initialiser des variables. et Level Break Footer (LBF)Événement de bas de page déclenché à la fin d'un groupe de données pour afficher des totaux ou résumés. réduit considérablement les défauts de calcul des sous-totaux. Comprendre comment le moteur de rapport JDE pilote ces deux événements élimine les erreurs de décalage d'une unité (off-by-one) et les soldes de report fantômes à travers les ruptures de groupe.
Les événements Level Break HeaderÉvénement d'en-tête déclenché au début d'un nouveau groupe de données pour initialiser des variables. se déclenchent immédiatement avant le traitement de l'événement Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. du premier enregistrement d'un nouveau groupe. Ce timing précis fait du LBH le seul événement valide pour réinitialiser les accumulateurs de sous-totaux, tels que VA sec_MathNumeric_Amount, à zéro. Réinitialiser les variables à l'intérieur de l'événement de bas de page (footer) après l'écriture de la ligne de résumé est un défaut courant. Cela amène l'accumulateur à conserver la valeur du premier enregistrement du groupe suivant avant que la réinitialisation ne se produise, omettant ainsi cet enregistrement initial du calcul du total du groupe.
Les événements Level Break FooterÉvénement de bas de page déclenché à la fin d'un groupe de données pour afficher des totaux ou résumés. s'exécutent uniquement après que le dernier enregistrement d'un groupe de rupture a été entièrement traité par le moteur. Le LBF sert d'unique emplacement valide pour imprimer les sous-totaux de groupe, calculer les moyennes et écrire des lignes de résumé dans des tables personnalisées comme F554211. Comme le moteur diffère l'exécution du bas de page jusqu'à ce que la valeur du champ de rupture change, effectuer des calculs mathématiques à l'intérieur du LBF garantit que chaque ligne de détail récupérée dans le Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. a bien été accumulée.
L'alignement de ces événements nécessite une synchronisation stricte avec les spécifications de séquence de données (data sequence) du rapport. Si un analyste modifie la séquence de données dans Report Design AidL'outil de conception visuelle de rapports et de traitements batchs dans JD Edwards. sans réévaluer les affectations de champs de Level BreakÉvénement déclenché lors du changement de valeur d'un champ clé, utilisé pour les sous-totaux et ruptures., le moteur UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. déclenchera les événements LBH et LBF de manière imprévisible. Vérifiez toujours que votre séquence de rupture de niveau correspond à l'ordre exact des clés de traitement dans la requête de la section principale.

Sections conditionnelles et contrôle du Suppress Section Write
Marquer une section UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. comme conditionnelle la détache complètement de la boucle de pilotage automatique du moteur. Le moteur d'Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. n'exécutera jamais une section conditionnelle automatiquement, quels que soient ses attachements de business viewUne vue logique combinant une ou plusieurs tables physiques pour simplifier l'accès aux données dans JD Edwards. ou sa sélection de données. Vous devez déclencher explicitement son exécution à l'aide de la fonction système Call SectionFonction système permettant d'appeler et d'exécuter une autre section (souvent conditionnelle) du rapport. depuis les ER d'une section parente, généralement à l'intérieur du Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. ou d'un événement Level BreakÉvénement déclenché lors du changement de valeur d'un champ clé, utilisé pour les sous-totaux et ruptures..
Ce comportement devient puissant lors de la construction de rapports financiers complexes de type parent-enfant, comme un grand livre des paiements fournisseurs (AP Payment Ledger) associant les pièces ouvertes de la F0411 aux enregistrements de paiement de la F0414. En plaçant Suppress Section WriteFonction système JD Edwards permettant d'empêcher l'écriture d'une ligne ou d'une section dans le rapport final. dans l'événement Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. de la section pilote principale F0411, vous évaluez la logique avant de générer les lignes de détail. Si une pièce nécessite un lettrage de paiement détaillé, la section pilote appelle la section enfant conditionnelle pilotée par une business viewUne vue logique combinant une ou plusieurs tables physiques pour simplifier l'accès aux données dans JD Edwards. F0414, transmet le numéro de document via les interconnexions de rapport (report interconnects)Mécanisme permettant de transférer des paramètres et des données entre différentes sections ou rapports JD Edwards. et laisse la section enfant gérer la sortie. Remplacer des vues pilotes plates multi-tables par cette structure imbriquée réduit couramment les temps d'exécution des batchs de plus d'une demi-heure à moins de cinq minutes sur des dizaines de milliers d'enregistrements de pièces, en évitant l'engorgement des jointures externes (outer join) du moteur de base de données.
Soyez vigilant avec la portée des sections pour éviter les plantages catastrophiques du noyau batch (batch kernel)Le processus serveur principal de JD Edwards responsable de l'exécution des traitements batchs.. Si vous exécutez Call SectionFonction système permettant d'appeler et d'exécuter une autre section (souvent conditionnelle) du rapport. depuis l'événement Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. d'une section elle-même sans évaluer de drapeaux de terminaison explicites, ou si vous configurez des appels circulaires entre les sections parentes et enfants, vous déclencherez une récursion infinie. Le processus de l'Enterprise Server épuisera rapidement l'espace tas (heap space), enregistrera un ALLOCATION FAILURE dans le journal UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. et arrêtera instantanément le processus RUNUBELa commande ou le processus système exécutant un rapport batch (UBE) sur le serveur JD Edwards., laissant les travaux batch suspendus indéfiniment à l'état "En cours" (Processing).
Pièges de performance : Table I/O et BSFN dans les ER de section
Placer une business functionUn composant logiciel réutilisable exécuté par JD Edwards pour réaliser des traitements spécifiques. comme GetUDC à l'intérieur du Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. d'un rapport lisant des centaines de milliers d'enregistrements sur F4211 ou F0911 crée des centaines de milliers d'instructions SQL individuelles sur la table F0005. Sur un déploiement d'entreprise standard, les allers-retours base de données qui en résultent ajoutent des heures de latence réseau à un traitement batch qui devrait se terminer en quelques minutes. Le moteur middleware ne peut tout simplement pas compenser la surcharge IPC liée à l'initialisation répétée des contextes d'exécution des BSFNUn composant logiciel réutilisable exécuté par JD Edwards pour réaliser des traitements spécifiques. dans une boucle à forte cardinalité.
Déplacer les recherches de configuration statique vers des variables au niveau du rapport (Report Level variables) alimentées une seule fois lors de l'événement Initialize SectionÉvénement d'un rapport JD Edwards qui s'exécute une seule fois au démarrage de la section, avant la lecture des données. élimine complètement ces requêtes répétitives vers la base de données. Si vous évaluez des codes de catégorie fixes, des constantes système ou des décimales de précision de devise qui restent constants tout au long de l'exécution, récupérez-les avant que le pilote principal de la Business ViewUne vue logique combinant une ou plusieurs tables physiques pour simplifier l'accès aux données dans JD Edwards. ne commence à itérer. Déplacer les recherches répétitives sur la F0005 hors de la boucle de traitement des lignes vers la logique d'Initialize Section permet couramment de multiplier par 10 la vitesse d'exécution des batchs sur les volumes importants.
Un second défaut de performance et d'intégrité survient lorsque les développeurs placent des appels manuels Table I/OOpérations d'entrée/sortie (lecture, écriture, mise à jour) effectuées directement sur les tables de la base de données. Select et Fetch Next à l'intérieur de Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données. sans gérer de handles internes. Si un Select manuel interroge la table pilote principale sans variable de handle explicite, EnterpriseOne réutilise le handle d'instruction implicite attribué au curseur de la Business ViewUne vue logique combinant une ou plusieurs tables physiques pour simplifier l'accès aux données dans JD Edwards.. L'exécution suivante de Do Section tente alors un Fetch Next sur un curseur altéré, ce qui entraîne des pertes d'enregistrements, une logique de séquence perturbée ou un arrêt prématuré et silencieux du batch.
Instanciez toujours des variables de handle explicites lors de l'exécution de Table I/OOpérations d'entrée/sortie (lecture, écriture, mise à jour) effectuées directement sur les tables de la base de données. manuelles dans les Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. de section, ou transférez les jointures multi-tables complexes vers des BSFN CUn composant logiciel écrit en langage C exécuté par JD Edwards pour réaliser des traitements complexes. dédiées qui gèrent leurs propres pointeurs HUSERPointeur de contexte utilisateur interne utilisé dans les API C de JD Edwards pour gérer les sessions de base de données. et HREQUESTPointeur de requête interne utilisé dans les API C de JD Edwards pour exécuter des opérations sur la base de données.. Pour tout UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. traitant des volumes d'enregistrements élevés, l'audit du fichier jde.log à la recherche d'appels JDB_Execute répétés à l'intérieur des boucles de section permet d'isoler les goulots d'étranglement ER auto-infligés avant que quiconque ne perde du temps à tenter d'optimiser les index de la base de données.
Exemple concret de code ER : Agrégation de commandes de vente
L'agrégation de 100 000 enregistrements de détails de ventes F4211 directement au sein des Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. nécessite une séquence rigide à travers trois événements distincts pour éviter les fuites de variables entre les limites de commandes. Établissez votre business viewUne vue logique combinant une ou plusieurs tables physiques pour simplifier l'accès aux données dans JD Edwards. sur la F4211 avec une séquence principale sur la compagnie de commande (SDKCOO), le type de document (SDDCTO) et le numéro de document (SDDOCO), en définissant SDDOCO comme champ de rupture de niveau (level break). Dans le Level Break HeaderÉvénement d'en-tête déclenché au début d'un nouveau groupe de données pour initialiser des variables. pour SDDOCO, remettez explicitement à zéro les variables mathématiques personnalisées avant de traiter la première ligne du nouveau jeu de clés : VA rpt_mnOrderTotal_MATH16 = 0. L'omission de cette réinitialisation explicite dans le LBH est la cause la plus fréquente de cumul erroné des totaux d'une commande à l'autre dans les rapports personnalisés.
À l'intérieur du Do SectionÉvénement d'un rapport JD Edwards qui s'exécute de manière répétitive pour chaque enregistrement lu dans la base de données., exécutez les calculs mathématiques au niveau de la ligne sans afficher d'éléments visuels. Accumulez le montant brut à l'aide d'une logique ER simple : VA rpt_mnOrderTotal_MATH16 = [VA rpt_mnOrderTotal_MATH16] + [BC Amount - Extended Price (F4211)(AEXP)]. Appelez immédiatement la fonction système Suppress Section WriteFonction système JD Edwards permettant d'empêcher l'écriture d'une ligne ou d'une section dans le rapport final. dans le Do Section pour éliminer le rendu des lignes de détail, ce qui réduit la surcharge de génération du flux PDF de 60 % à 80 % sur les exécutions batch à fort volume. Cela déplace entièrement l'effort d'exécution vers des calculs en mémoire plutôt que vers la génération de mise en page.
La génération de la mise en page de sortie se déclenche exclusivement dans le Level Break FooterÉvénement de bas de page déclenché à la fin d'un groupe de données pour afficher des totaux ou résumés. pour SDDOCO. Associez VA rpt_mnOrderTotal_MATH16 à vos variables d'affichage de rapport, déclenchez l'écriture de la section et incrémentez votre accumulateur au niveau du rapport : VA rpt_mnGrandTotal_MATH16 = [VA rpt_mnGrandTotal_MATH16] + [VA rpt_mnOrderTotal_MATH16]. Pour les cumuls finaux, évitez d'utiliser l'événement End of Section — qui peut se déclencher avant la fin de l'exécution du dernier Level Break Footer sur les UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. multi-sections — et exécutez l'écriture de votre résumé à l'intérieur de l'événement Report Footer ou d'une section conditionnelle autonome appelée directement depuis la logique de rupture finale.
Maîtriser la séquence d'exécution des Event RulesLe langage de programmation événementiel propriétaire utilisé dans JD Edwards pour définir la logique métier. UBEUniversal Batch Engine, le moteur d'exécution de traitements par lots (batchs) de JD Edwards. — en particulier la façon dont le moteur d'exécution traite les sections imbriquées et les jointures conditionnelles — est essentiel lors de l'optimisation des traitements batch qui traitent de grands volumes d'enregistrements.