Votre modèle de données pour la gestion de la chaîne d’approvisionnement
Votre modèle de données pour la gestion de la chaîne d’approvisionnement
- Attributs recommandés à recueillir
- Activités clés à suivre
- Conseils pour l’extraction
Attributs de gestion de la chaîne d’approvisionnement
| Nom | Description | ||
|---|---|---|---|
| Commande logistique LogisticsOrder | Identifiant unique d’un processus de chaîne logistique complet, de la demande initiale à la confirmation finale de livraison. | ||
| Description La commande logistique sert d’identifiant principal de cas et relie toutes les activités associées à une demande ou à une demande d’exécution précise dans la chaîne logistique. Cette approche permet de suivre tout le parcours d’un produit, de la planification et de l’approvisionnement à la production et à la distribution, pour obtenir une vue d’ensemble du processus. Dans le cadre du Process Mining, l’analyse par commande logistique révèle le parcours complet suivi pour répondre à une demande. Elle permet de repérer les variantes courantes, les goulots d’étranglement et les écarts dans l’ensemble de la chaîne logistique, plutôt que d’examiner séparément des processus cloisonnés comme l’approvisionnement ou les ventes. Pourquoi est-ce important ? Cet identifiant essentiel relie tous les événements associés en une seule instance de processus et permet d’analyser la chaîne logistique de bout en bout. Où trouver ces données Il s’agit d’un identifiant conceptuel qu’il peut être nécessaire de construire en reliant plusieurs numéros de document, par exemple le numéro d’une commande client à ceux de la commande d’achat et de la livraison qui lui succèdent. Consultez la documentation SAP S/4HANA Supply Chain ou un spécialiste du domaine. Exemples LO-4500078192LO-4500078193LO-4500078194 | |||
| Heure de l’événement EventTime | Horodatage indiquant la date et l’heure auxquelles l’activité a eu lieu. | ||
| Description Cet attribut indique la date et l’heure précises de chaque activité du processus. Il constitue le fil chronologique du journal d’événements et ordonne les étapes selon leur déroulement réel. L’heure de l’événement est indispensable à toute analyse temporelle. Elle sert à calculer les temps de cycle entre les activités, à mesurer le délai total du processus, à repérer les tendances de performance au fil du temps et à déterminer quand des goulots d’étranglement sont susceptibles de se produire. Pourquoi est-ce important ? Cet horodatage est indispensable au calcul des durées et des indicateurs de performance. Il permet d’analyser les goulots d’étranglement et les délais des processus. Où trouver ces données Extrait des champs d’horodatage associés à la création de documents ou aux changements de statut dans les tables SAP centrales, comme CDHDR/CDPOS pour les documents de modification, ou des champs de date et d’heure spécifiques tels que ERDAT/ERZET dans les tables d’en-tête. Exemples 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Nom de l’activité ActivityName | Nom de l’activité métier ou de l’événement survenu à un moment précis du processus de la chaîne logistique. | ||
| Description Cet attribut décrit une étape ou un jalon précis du cycle de vie de la commande logistique, par exemple « Commande d’achat émise » ou « Sortie de marchandises comptabilisée ». Ces activités constituent la séquence d’événements qui forme le processus. L’analyse de la séquence des activités est au cœur du Process Mining. Elle permet de découvrir le flux réel du processus, de le comparer aux procédures opérationnelles standard et de repérer les étapes qui entraînent des retards ou des reprises. Pourquoi est-ce important ? Il définit les étapes du processus, ce qui est essentiel pour découvrir les cartes de processus, analyser les variantes et mesurer les temps de cycle entre les activités. Où trouver ces données Généré lors de la transformation des données, en associant les codes de transaction ou les changements de statut de différentes tables SAP (par exemple, EKKO, LIKP, VBUK) à des noms d’activité compréhensibles. Exemples Commande d’achat émiseEntrée de marchandises pour commande d’achat enregistréeLivraison sortante crééePreuve de livraison confirmée | |||
| Dernière mise à jour des données LastDataUpdate | Horodatage de la dernière actualisation ou extraction des données depuis le système source. | ||
| Description Cet attribut indique la dernière mise à jour des données du journal d’événements. Il renseigne sur leur fraîcheur et permet aux utilisateurs de savoir si elles sont récentes. Pour prendre des décisions éclairées, il est important de connaître l’ancienneté des données utilisées dans une analyse. Cet horodatage aide les utilisateurs à se fier aux données et à comprendre la période couverte par les Dashboards et les KPI. Pourquoi est-ce important ? Il indique clairement la fraîcheur des données et permet aux utilisateurs de savoir à quelle date remonte l’analyse du processus. Où trouver ces données Ce champ de métadonnées est généralement généré et renseigné par l’outil d’extraction des données ou d’ETL à la fin d’une actualisation réussie. Exemples 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Système source SourceSystem | Système d’origine des données. | ||
| Description Identifie l’instance du système source dans laquelle les données d’événement ont été générées. Dans un environnement complexe, une entreprise peut utiliser plusieurs instances SAP S/4HANA pour différentes régions ou unités opérationnelles. Cet attribut est important pour la gouvernance des données et la segmentation des analyses. Il permet de comparer les performances des processus entre différents systèmes ou d’isoler les données d’une source unique faisant autorité. Pourquoi est-ce important ? Il précise l’origine des données, un élément important pour leur validation et pour comparer les processus entre différents environnements système. Où trouver ces données Il s’agit généralement d’une valeur statique ajoutée lors de l’extraction des données pour en identifier l’origine, par exemple l’identifiant système SAP (SAPSID). Exemples S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Date de livraison demandée RequestedDeliveryDate | Date à laquelle le fournisseur devait livrer les marchandises. | ||
| Description Il s’agit de la date de livraison indiquée dans la commande d’achat, qui constitue l’échéance fixée au fournisseur. Elle sert de référence pour mesurer les délais de livraison réels. Cette date est indispensable au calcul du KPI du taux de livraison à temps des fournisseurs. En comparant la date réelle de réception des marchandises à la date demandée, l’entreprise peut mesurer objectivement le respect des engagements des fournisseurs. Pourquoi est-ce important ? Cette date de référence sert à calculer le KPI du « taux de livraison à temps des fournisseurs » et joue un rôle important dans le suivi des performances des fournisseurs. Où trouver ces données Présent dans la table des postes de commande d’achat EKPO, sous le nom de champ EINDT (date de livraison). Exemples 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Nom du client CustomerName | Nom du client dont la commande est en cours d’exécution. | ||
| Description Cet attribut identifie le client final associé à une commande client et aux activités d’exécution qui suivent. Il apporte un éclairage sur la demande dans le processus de la chaîne logistique. Dans le cadre du Process Mining, l’analyse par client permet de repérer les différences de traitement ou de performance entre les comptes importants. Elle est utilisée dans des Dashboards comme l’analyse du délai de confirmation de la preuve de livraison pour vérifier si certains clients tardent régulièrement à confirmer la réception. Pourquoi est-ce important ? Permet de segmenter l’analyse par client et de repérer les comportements propres à chacun, les goulots d’étranglement ou le respect des accords de niveau de service. Où trouver ces données Le numéro du client (KUNNR) est enregistré dans les documents de vente (par exemple, dans la table VBAK). Son nom est récupéré dans la table centrale des clients KNA1. Exemples Retail CorpInnovate SolutionsManufacturing Partners | |||
| Nom du fournisseur SupplierName | Nom du fournisseur associé aux activités d’approvisionnement. | ||
| Description Cet attribut identifie le fournisseur auprès duquel les marchandises ou les services sont achetés. Il est généralement associé à des activités telles que « Demande d’achat créée » et « Commande d’achat émise ». Le nom du fournisseur est essentiel au Dashboard d’analyse des performances de livraison des fournisseurs. Il permet de filtrer et de segmenter les données pour comparer les taux de livraison à temps, les délais et les niveaux de qualité des différents fournisseurs. Ces comparaisons sont importantes pour les achats stratégiques et la gestion des relations fournisseurs. Pourquoi est-ce important ? Permet d’analyser les performances par fournisseur, ce qui aide à optimiser le processus d’approvisionnement et à évaluer la fiabilité des fournisseurs. Où trouver ces données Le numéro du fournisseur (LIFNR) est enregistré dans les documents d’achat (par exemple, dans les tables EKKN et EBAN). Son nom est récupéré dans la table centrale des fournisseurs LFA1. Exemples Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Numéro d’article MaterialNumber | Identifiant unique du produit ou de l’article traité. | ||
| Description Le numéro d’article, souvent appelé SKU, est le code unique qui désigne un produit dans SAP. Il relie les activités du processus aux marchandises physiques ou numériques fabriquées, achetées ou expédiées. Cet attribut est essentiel à l’analyse par produit. Il aide à repérer les produits davantage exposés aux problèmes de qualité, aux retards de production ou aux ruptures de stock. Vous pouvez filtrer les Dashboards par article pour examiner les performances de gammes de produits précises. Pourquoi est-ce important ? Permet d’analyser les processus par produit et de repérer si des problèmes, comme les retards ou les défauts de qualité, concernent certains articles en particulier. Où trouver ces données Présent dans les tables de postes de la plupart des documents, comme VBAP pour les commandes client, EKPO pour les commandes d’achat et LIPS pour les livraisons. Le champ s’appelle généralement MATNR. Exemples FG-100-ARM-2034-BSA-5500 | |||
| Résultat du contrôle qualité QualityInspectionResult | Résultat d’un contrôle qualité, par exemple « Réussi » ou « Échoué ». | ||
| Description Cet attribut enregistre le résultat d’un contrôle qualité effectué sur des marchandises produites ou reçues. Il détermine si les marchandises peuvent passer à l’étape suivante ou si elles doivent être reprises, retournées ou mises au rebut. Cet attribut est essentiel au Dashboard et au KPI des taux de rejet du contrôle qualité. L’analyse de la fréquence et des causes des échecs aide à repérer les problèmes de qualité récurrents liés à certains produits, fournisseurs ou lignes de production. Pourquoi est-ce important ? Contribue directement au calcul des KPI liés à la qualité et aide à repérer les sources de mauvaise qualité dans la chaîne logistique. Où trouver ces données Ces informations sont généralement stockées dans le module Quality Management (QM). Elles peuvent provenir des tables de lots de contrôle, comme QALS, et des codes de décision d’utilisation dans QAVE. Exemples RéussiÉchouéReprise nécessaireRéussi avec dérogation | |||
| Site Plant | Site de production ou de distribution où l’activité a eu lieu. | ||
| Description Le site est une unité organisationnelle SAP qui désigne un lieu où les marchandises sont produites, stockées ou distribuées. Il apporte un contexte géographique ou fonctionnel aux activités du processus. L’analyse des performances par site est courante. Elle permet de comparer l’efficacité, le débit et la conformité entre différents sites opérationnels, afin de repérer les bonnes pratiques ou les sites à améliorer. Pourquoi est-ce important ? Fournit une dimension géographique ou organisationnelle pour l’analyse et permet de comparer les performances de différents sites. Où trouver ces données Présent dans de nombreuses tables de postes de document, comme VBAP (ventes), EKPO (achats) et LIPS (livraisons). Le champ s’appelle généralement WERKS. Exemples 100021003500 | |||
| Utilisateur ayant exécuté l’activité ExecutingUser | Identifiant de l’utilisateur qui a exécuté l’activité. | ||
| Description Cet attribut indique le nom ou l’identifiant SAP de l’employé qui a effectué l’activité, par exemple la création d’une commande d’achat ou la comptabilisation d’une réception de marchandises. Il relie les étapes du processus aux personnes qui les ont réalisées. L’analyse par utilisateur aide à comprendre la répartition de la charge de travail, à repérer les besoins de formation et à comparer les performances des personnes ou des équipes. Elle est également utile pour l’analyse de la conformité, car elle permet de savoir qui a effectué les étapes importantes du processus. Pourquoi est-ce important ? Associe les activités à des utilisateurs précis et permet d’analyser la charge de travail, de comparer les performances et d’examiner les actions non conformes. Où trouver ces données Présent dans les champs « Créé par » ou « Modifié par » de nombreuses tables SAP, comme ERNAM dans EKKO (en-tête de commande d’achat), LIKP (en-tête de livraison) et VBRK (en-tête de facture). Exemples CBROWNJSMITHASINGH | |||
| Heure de fin EndTime | Horodatage indiquant la fin d’une activité, utilisé pour calculer sa durée de traitement. | ||
| Description L’heure de fin marque l’achèvement d’une activité précise. L’heure de début (EventTime) indique quand l’activité commence, tandis que l’heure de fin permet de savoir combien de temps elle a duré, notamment lorsqu’elle n’est pas instantanée. Disposer des heures de début et de fin permet de mesurer précisément la durée de traitement et le temps d’attente. Vous pouvez ainsi distinguer le temps consacré à une tâche du temps passé à attendre l’étape suivante, ce qui aide à repérer les possibilités d’amélioration de l’efficacité. Pourquoi est-ce important ? Permet de calculer précisément la durée de traitement des activités et de distinguer le travail qui crée de la valeur du temps d’attente. Où trouver ces données Cette heure peut être déduite des changements de statut dans SAP. Par exemple, le début correspond à la mise à jour du statut « En cours » et la fin à celle du statut « Terminé » dans des tables comme JEST/JCDS. Pour les événements instantanés, EndTime peut être égal à StartTime. Exemples 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Livraison en retard IsLateDelivery | Indicateur booléen précisant si le fournisseur a livré après la date demandée. | ||
| Description Cet indicateur calculé indique simplement si une livraison a été effectuée à temps. Il est obtenu en comparant l’horodatage de l’activité « Réception de marchandises pour commande d’achat comptabilisée » à l’attribut « Date de livraison demandée ». Cet attribut simplifie la création de Dashboards et de KPI sur les performances des fournisseurs. Il permet de filtrer et d’agréger rapidement les données pour calculer le taux de livraison à temps des fournisseurs et repérer ceux, ainsi que les articles ou les régions, qui connaissent le plus de retards. Pourquoi est-ce important ? Simplifie l’analyse des performances des fournisseurs en indiquant clairement, pour chaque livraison, si elle a été effectuée à temps. Cette information est essentielle au KPI de livraison à temps. Où trouver ces données Il s’agit d’un champ calculé. La logique est la suivante : IF ('Goods Receipt For PO Posted'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Exemples truefalse | |||
| Nom du transporteur CarrierName | Nom de l’entreprise de transport ou du commissionnaire de transport chargé de l’expédition. | ||
| Description Le nom du transporteur identifie le prestataire logistique chargé de transporter les marchandises d’un lieu à un autre, par exemple d’un entrepôt à un client. Cet attribut est essentiel au Dashboard d’analyse du temps de cycle de transport. Il permet de comparer les délais de transit, les coûts et la fiabilité des transporteurs afin d’améliorer la planification logistique et le choix des prestataires. Pourquoi est-ce important ? Permet d’analyser les performances par prestataire de transport, un élément important pour optimiser les coûts logistiques et les délais de livraison. Où trouver ces données L’identifiant du transporteur (agent de transport) est enregistré dans les documents d’expédition, par exemple dans la table VTTK (en-tête d’expédition). Son nom est récupéré dans des tables de données de référence comme LFA1. Exemples DHLFedExMaersk Logistics | |||
| Numéro de commande client SalesOrderNumber | Identifiant unique du document de commande client (SO). | ||
| Description Le numéro de commande client est le numéro officiel du document qui confirme une vente à un client. C’est un identifiant clé pour la partie commande-encaissement de la chaîne logistique. Cet attribut est essentiel pour suivre l’exécution d’une commande client précise. Il relie la demande initiale du client aux activités qui suivent, comme la livraison et la facturation, et facilite l’analyse du délai d’exécution des commandes. Pourquoi est-ce important ? Sert d’identifiant clé pour le sous-processus d’exécution des commandes et relie la demande du client aux opérations logistiques et au règlement financier. Où trouver ces données Présent dans la table d’en-tête des commandes client VBAK et dans la table des postes VBAP. Le champ s’appelle VBELN. Exemples 100023451000234610002347 | |||
| Numéro de commande d’achat PurchaseOrderNumber | Identifiant unique du document de commande d’achat (PO). | ||
| Description Le numéro de commande d’achat est le numéro officiel du document utilisé pour commander des articles auprès d’un fournisseur. C’est un identifiant clé pour la partie approvisionnement de la chaîne logistique. Cet attribut permet d’examiner en détail le processus d’approvisionnement. Il est utilisé dans le Dashboard du temps de cycle de bout en bout de l’approvisionnement et pour calculer le KPI du taux de livraison à temps des fournisseurs. Il relie les activités de demande, de commande, de réception et de paiement. Pourquoi est-ce important ? Sert d’identifiant clé pour examiner le sous-processus d’approvisionnement en détail et relier les événements associés. Où trouver ces données Présent dans la table d’en-tête des commandes d’achat EKKO et dans la table des postes EKPO. Le champ s’appelle EBELN. Exemples 450007819245000781934500078194 | |||
| Quantité commandée OrderQuantity | Quantité d’articles figurant dans le poste de commande. | ||
| Description Cet attribut indique le nombre d’unités d’un article demandé dans un poste de commande client ou de commande d’achat. Il mesure le volume de chaque transaction. L’analyse par quantité permet de donner la priorité aux commandes portant sur de gros volumes, qui peuvent avoir une incidence plus importante sur l’activité. Elle peut aussi servir à normaliser d’autres indicateurs, par exemple pour calculer le coût unitaire ou comprendre l’effet de la taille des commandes sur les délais de traitement. Pourquoi est-ce important ? Donne une indication du volume des transactions et permet d’en mesurer l’incidence et de segmenter les cas selon leur taille. Où trouver ces données Présent dans les tables de postes, par exemple sous le champ MENGE dans EKPO (commande d’achat) ou KWMENG dans VBAP (commande client). Exemples 100500025 | |||
| Reprise IsRework | Indicateur précisant si une activité ou une séquence d’activités correspond à une reprise. | ||
| Description Cet attribut booléen signale les activités qui répètent des étapes antérieures du processus et indiquent une reprise ou une correction. Par exemple, si une activité « Contrôle qualité » est suivie d’une étape « Ordre de fabrication créé », puis d’un autre « Contrôle qualité », le second contrôle peut être signalé comme une reprise. Repérer les reprises est essentiel pour comprendre les inefficacités du processus et les coûts cachés. Cet indicateur aide à mesurer leur fréquence et leur incidence, à calculer le KPI du taux d’erreur de traitement des commandes et à repérer les possibilités d’amélioration du processus. Pourquoi est-ce important ? Aide à mesurer les inefficacités du processus en repérant et en comptant explicitement les activités qui font partie d’une boucle de reprise. Où trouver ces données Cet indicateur est généralement calculé dans l’outil de Process Mining en repérant les séquences d’activités répétées au sein d’un même cas. Exemples truefalse | |||
Activités de gestion de la chaîne d’approvisionnement
| Activité | Description | ||
|---|---|---|---|
| Commande client créée | Cette activité correspond à la création d’une nouvelle commande client, qui formalise la demande de marchandises du client. Il s’agit d’un événement explicite enregistré lorsqu’un utilisateur enregistre un nouveau document de commande client dans le système. | ||
| Pourquoi est-ce important ? C’est le point de départ principal du processus de la commande à l’encaissement. Le délai entre cet événement et les suivants permet de mesurer le délai global de traitement de la commande et de repérer les premiers retards. Où trouver ces données Cet événement est enregistré explicitement. Vous le trouverez dans les documents de modification des tables de commandes clients (CDHDR/CDPOS) ou en utilisant l’horodatage de création de la table d’en-tête des commandes clients (VBAK, champ ERDAT). Données à recueillir Utilisez la date de création (VBAK-ERDAT) et l’heure (VBAK-ERZET) du document de commande client. Type d’événement explicit | |||
| Commande d’achat émise | Cette activité correspond à la création et à l’émission officielles d’une commande d’achat auprès d’un fournisseur externe pour obtenir les matières nécessaires. Elle transforme une demande d’achat en engagement contractuel auprès du fournisseur. | ||
| Pourquoi est-ce important ? Cette étape clé permet de mesurer les délais de livraison des fournisseurs et la durée des cycles d’approvisionnement. Elle sert de référence pour évaluer la performance des livraisons dans les délais. Où trouver ces données Cet événement explicite est enregistré lors de la création de la commande d’achat. L’horodatage de création est stocké dans la table d’en-tête des commandes d’achat (EKKO, champ AEDAT). Données à recueillir Utilisez la date de création du document (EKKO-AEDAT) de la commande d’achat. Type d’événement explicit | |||
| Entrée de marchandises pour commande d’achat enregistrée | Cet événement correspond à la réception physique des matières premières ou des marchandises commandées auprès d’un fournisseur. Il est enregistré lorsque les marchandises arrivent à l’entrepôt ou sur le site de production. | ||
| Pourquoi est-ce important ? Cette activité clôt la partie livraison fournisseur du cycle d’approvisionnement. Elle est essentielle pour calculer le taux de livraisons dans les délais des fournisseurs et évaluer la performance de la logistique entrante. Où trouver ces données Cet événement explicite est enregistré lors de la comptabilisation d’un document article. Son horodatage figure dans la table d’en-tête des documents articles (MKPF, champ BUDAT). Le lien avec la commande d’achat se trouve dans la table des postes (MSEG). Données à recueillir Utilisez la date de comptabilisation (MKPF-BUDAT) du document article associé à la commande d’achat. Type d’événement explicit | |||
| Marchandises produites | Cette activité confirme la fin de la fabrication des marchandises. Elle est généralement enregistrée comme une entrée de marchandises issue de l’ordre de fabrication, qui ajoute le produit fini au stock. | ||
| Pourquoi est-ce important ? Cette activité marque la fin du cycle de production. Le délai entre la création de l’ordre de fabrication et cet événement correspond au délai de production, un indicateur clé de l’efficacité de la production. Où trouver ces données Cet événement peut être enregistré explicitement lors de la comptabilisation d’un document article (entrée de marchandises issue de l’ordre de fabrication) ou déduit de la confirmation finale de l’ordre de fabrication (table AFRU) ou d’un changement de statut vers « Livré ». Données à recueillir Déduisez cet événement de la date de comptabilisation du document article correspondant à l’entrée finale de marchandises de l’ordre de fabrication, ou d’un changement de statut. Type d’événement inferred | |||
| Preuve de livraison confirmée | Cette activité correspond à la confirmation officielle du client ou du transporteur que les marchandises ont été reçues conformément aux spécifications. Elle est souvent enregistrée en ajoutant les informations de preuve de livraison à la livraison sortante. | ||
| Pourquoi est-ce important ? Cette activité marque la fin du processus d’exécution de la commande. Elle est essentielle pour établir une facturation exacte, résoudre les litiges et mesurer la dernière étape du cycle de livraison. Où trouver ces données Cet événement explicite enregistre la date de preuve de livraison dans la table d’en-tête des livraisons (LIKP, champ PODAT) ou dans les tables POD associées (VLPOD). Données à recueillir Utilisez la date de preuve de livraison (LIKP-PODAT) du document de livraison. Type d’événement explicit | |||
| Sortie de marchandises comptabilisée | Cette activité correspond au départ juridique et physique des marchandises de l’entrepôt. Elle diminue le stock et comptabilise le coût des marchandises vendues, marquant ainsi l’expédition officielle de la commande. | ||
| Pourquoi est-ce important ? Cette étape importante marque le début du transport. Elle correspond au moment précis où les marchandises quittent l’entreprise pour être livrées. Où trouver ces données Cet événement explicite crée un document article. L’horodatage est enregistré dans l’en-tête du document article (MKPF, champ BUDAT) et met à jour le statut du mouvement de marchandises dans le document de livraison (LIKP, champ WBSTK). Données à recueillir Utilisez la date de comptabilisation (MKPF-BUDAT) du document article de sortie de marchandises associé à la livraison sortante. Type d’événement explicit | |||
| Contrôle qualité effectué | Cette activité correspond à la fin du contrôle qualité des marchandises produites. Le résultat de l’inspection, conforme ou non conforme, est enregistré dans une décision d’utilisation. | ||
| Pourquoi est-ce important ? Cette activité est essentielle au suivi de la qualité des produits et au repérage des problèmes de production. Un taux de rejet élevé ou des inspections longues peuvent constituer des goulots d’étranglement importants. Où trouver ces données Cet événement explicite est enregistré lorsqu’une décision d’utilisation est prise pour un lot de contrôle qualité. La date de décision figure dans la table QALS (champ PASTRTERM) ou dans la table QAVE. Données à recueillir Utilisez l’horodatage de l’enregistrement de la décision d’utilisation pour le lot de contrôle (tables QALS/QAVE). Type d’événement explicit | |||
| Demande d’achat créée | Cette activité correspond à la création d’une demande interne visant à acheter les marchandises ou matières premières nécessaires. Elle est souvent déclenchée lorsque les stocks ne suffisent pas à honorer une commande client ou passent sous le seuil de réapprovisionnement. | ||
| Pourquoi est-ce important ? C’est la première étape du cycle d’approvisionnement. Le suivi de sa création permet de repérer les retards au lancement des achats et d’analyser l’ensemble du processus d’approvisionnement. Où trouver ces données Il s’agit d’un événement explicite. L’horodatage de création est enregistré dans la table d’en-tête des demandes d’achat (EBAN, champ BADAT). Données à recueillir Utilisez la date de création (EBAN-BADAT) du document de demande d’achat. Type d’événement explicit | |||
| Disponibilité du stock vérifiée | Cette activité correspond à la vérification, manuelle ou effectuée par le système, de la disponibilité des articles demandés pour honorer la commande client. Elle est souvent automatisée lors de la création de la commande, mais peut ne pas être enregistrée comme un événement distinct. | ||
| Pourquoi est-ce important ? Le délai entre la commande et cette vérification, ainsi que son résultat, permettent d’évaluer l’incidence des niveaux de stock sur les délais de traitement. Un retard à cette étape entraîne souvent des activités d’approvisionnement ou de production. Où trouver ces données Il ne s’agit généralement pas d’un événement explicite. Vous pouvez le déduire de la création de la première ligne d’échéance confirmée dans la table des postes de commande client (VBEP) ou des changements de statut du poste. Données à recueillir Déduisez cet événement de la mise à jour du statut de confirmation de la ligne d’échéance de la commande client (table VBEP). Type d’événement inferred | |||
| Expédition créée | Cette activité correspond à la création d’un document d’expédition, qui regroupe une ou plusieurs livraisons pour planifier le transport. Ce document contient des informations sur le transporteur, l’itinéraire et le mode de transport. | ||
| Pourquoi est-ce important ? Cette activité marque le début de la planification formelle du transport. L’analyse du délai entre la sortie de marchandises et la fin de l’expédition permet d’évaluer l’efficacité du processus de transport. Où trouver ces données Cet événement explicite est enregistré dans la table d’en-tête des expéditions (VTTK, champ ERDAT). Il relève du module LE-TRA, qui n’est pas utilisé par toutes les organisations. Données à recueillir Utilisez la date de création (VTTK-ERDAT) de l’en-tête du document d’expédition. Type d’événement explicit | |||
| Facture client créée | Cette activité marque la création du document de facturation du client pour les marchandises ou les services livrés. Elle lance la dernière étape du règlement financier du processus. | ||
| Pourquoi est-ce important ? Cette activité est importante pour analyser le temps de cycle de facturation. Les retards entre la confirmation de livraison et la facturation peuvent nuire à la trésorerie. Où trouver ces données Cet événement explicite enregistre l’horodatage de création dans la table d’en-tête du document de facturation (VBRK, champ ERDAT). Données à recueillir Utilisez la date de création (VBRK-ERDAT) de l’en-tête du document de facturation. Type d’événement explicit | |||
| Livraison sortante créée | Cette activité correspond à la création d’un document de livraison qui autorise le prélèvement et l’expédition des marchandises au client. Elle marque le passage de la gestion des commandes à l’exécution logistique. | ||
| Pourquoi est-ce important ? Cette étape clé lance le processus de livraison physique. Un délai entre la création de la commande et celle de la livraison peut révéler des problèmes de planification ou de disponibilité. Où trouver ces données Il s’agit d’un événement explicite. L’horodatage de création est enregistré dans la table d’en-tête des livraisons (LIKP, champ ERDAT). Données à recueillir Utilisez la date (LIKP-ERDAT) et l’heure (LIKP-ERZET) de création figurant dans l’en-tête du document de livraison. Type d’événement explicit | |||
| Marchandises déchargées à destination | Cette activité correspond au déchargement physique des marchandises chez le client. Cet événement n’est pas toujours suivi explicitement dans SAP et doit souvent être déduit des données du transporteur ou d’événements ultérieurs. | ||
| Pourquoi est-ce important ? Cette étape marque la fin du trajet de transport. Le délai entre la sortie de marchandises et cette étape correspond au temps de transport, un indicateur important pour optimiser la logistique. Où trouver ces données Cet événement est rarement enregistré explicitement dans le système ERP central. Il peut être déduit des messages EDI du transporteur, des données du module Transportation Management (TM) ou, si elle est disponible, de l’horodatage du document de preuve de livraison. Données à recueillir Déduisez cet événement des mises à jour de statut du transporteur (par exemple, EDI 214) ou utilisez l’horodatage de la preuve de livraison comme approximation. Type d’événement inferred | |||
| Ordre de fabrication créé | Cette activité indique la création d’un ordre de fabrication pour produire les produits finis nécessaires à la commande client. Elle marque le début officiel de la production interne. | ||
| Pourquoi est-ce important ? La création d’un ordre de fabrication marque le début du délai de production. Son analyse permet de repérer les retards entre le signal de la demande et le lancement de la production. Où trouver ces données Il s’agit d’un événement explicite. La date de création est enregistrée dans la table d’en-tête des ordres de fabrication (AUFK, champ ERDAT). Données à recueillir Utilisez la date de création (AUFK-ERDAT) de la table d’en-tête de l’ordre. Type d’événement explicit | |||
| Prélèvement terminé | Cette activité marque la fin du prélèvement physique des articles dans l’entrepôt pour la livraison sortante. Dans de nombreux systèmes, elle est confirmée par la mise à jour du statut de prélèvement du document de livraison. | ||
| Pourquoi est-ce important ? Un prélèvement efficace est essentiel au débit de l’entrepôt. Le suivi de cette activité permet de repérer les goulots d’étranglement dans les opérations d’entrepôt et de mesurer la performance du prélèvement. Où trouver ces données Il ne s’agit souvent pas d’un événement isolé, mais d’un événement que l’on peut déduire des changements de statut. Il est enregistré lorsque le statut de prélèvement dans la table des postes de livraison (LIPS, champ KOSTA) passe à « C » (traitement complet). Données à recueillir Déduisez cet événement des documents de modification lorsque le statut de prélèvement (LIPS-KOSTA) indique que le prélèvement est terminé. Type d’événement inferred | |||
Guides d’extraction
Étapes
- Prérequis : Vérifiez que vous disposez d’un utilisateur ayant les autorisations nécessaires pour accéder aux vues SAP S/4HANA Core Data Services (CDS) requises. L’équipe de sécurité SAP doit généralement lui attribuer un rôle spécifique. Vous aurez également besoin d’un client SQL, tel que DBeaver ou SAP HANA Studio, capable de se connecter à la base de données SAP HANA.
- Établir la connexion à la base de données : Configurez votre client SQL pour vous connecter à la base de données SAP S/4HANA. Vous aurez besoin du nom d’hôte du serveur, du port (par exemple, 3xx15, où xx correspond au numéro d’instance), d’un nom d’utilisateur de base de données et d’un mot de passe.
- Préparer la requête SQL : Copiez la requête SQL complète fournie dans la section correspondante de ce document et collez-la dans l’éditeur de votre client SQL. Elle est conçue pour extraire toutes les activités indiquées à partir de différents modules logistiques et commerciaux.
- Définir les paramètres d’extraction : Avant d’exécuter la requête, repérez les conditions de remplacement dans les clauses
WHEREde chaque sous-requête. Remplacez'YourCompanyCode'par le code réel de l’entreprise analysée et renseignez les dates, par exemple'YYYY-MM-DD', pour définir la période d’extraction souhaitée. - Exécuter la requête : Lancez le script SQL complet. La durée d’exécution dépendra de la période sélectionnée et du volume de données dans votre système. Il est conseillé de lancer l’extraction en dehors des heures de pointe afin de limiter la charge du système.
- Vérifier les premiers résultats : Une fois la requête terminée, parcourez rapidement les résultats dans votre client SQL. Vérifiez que le nombre de lignes est cohérent, que les colonnes telles que LogisticsOrder, ActivityName et EventTime sont renseignées et que plusieurs noms d’activité apparaissent.
- Exporter les données au format CSV : Exportez l’ensemble des résultats de votre client SQL dans un fichier CSV. Choisissez l’encodage UTF-8 pour éviter les problèmes liés aux caractères spéciaux.
- Préparer le fichier à l’importation : Vérifiez que les en-têtes de colonnes du fichier CSV final correspondent exactement aux noms d’attributs requis pour l’importation, par exemple
LogisticsOrder,ActivityNameetEventTime. Si vous utilisez la requête SQL telle quelle, aucune autre transformation des données ne devrait être nécessaire.
Configuration
- Prérequis : Vous devez pouvoir accéder à la base de données SAP HANA sous-jacente. L’utilisateur de la base doit disposer des privilèges
SELECTsur toutes les vues CDS référencées dans la requête, notamment I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment et I_BillingDocumentItem. - Filtrage par période : La requête fournie contient un emplacement réservé au filtre de période, généralement appliqué à un champ de date de création (
CreationDateouDocumentDate). Pour une première analyse, une période de 3 à 6 mois est recommandée afin d’obtenir un jeu de données représentatif sans imposer une charge excessive au système. - Filtres métier clés : Il est essentiel de filtrer les données par unité organisationnelle afin d’obtenir des résultats pertinents. La requête comporte un emplacement réservé pour
CompanyCode. Selon le périmètre de votre analyse, vous pouvez également ajouter des filtres pourSalesOrganization,DistributionChannelouPlant. - Performances : Cette requête complexe associe plusieurs vues CDS volumineuses et peut mobiliser des ressources système importantes. Planifiez les extractions en dehors des heures ouvrées. Pour les très grands jeux de données, envisagez de lancer la requête par lots mensuels successifs.
Exemple de requête sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; Étapes
- Vérifiez que vous disposez d’un accès direct en lecture au schéma SAP HANA contenant les données pertinentes de logistique, de ventes, d’approvisionnement, de stock, de production, de qualité, de livraison, d’expédition, de preuve de livraison et de facturation. Demandez le nom du schéma, les informations de connexion et les autorisations à l’équipe SAP Basis ou à l’équipe de la plateforme de données. N’écrivez pas dans le système source.
- Vérifiez le modèle de données S/4HANA exact du système cible. EKKO et EKPO servent aux commandes d’achat, LIKP et LIPS aux livraisons sortantes. D’autres objets doivent être configurés pour les commandes client, les demandes d’achat, les documents article, les ordres de fabrication, les résultats des contrôles qualité, les expéditions, les preuves de livraison et la facturation. Remplacez chaque espace réservé entre crochets dans la requête par des objets vérifiés dans le dictionnaire de données du système.
- Définissez la règle de corrélation LogisticsOrder. Il est préférable d’utiliser une relation vérifiée dans le flux documentaire entre la commande client et les livraisons, documents article, documents de production ou d’approvisionnement et documents de facturation qui en découlent. Si aucune relation directe n’est disponible, configurez une table de corrélation documentée ou une association propre à l’entreprise. Ne corrélez pas les cas en vous fondant uniquement sur le numéro d’article ou la date.
- Définissez la période d’extraction à l’aide de [Start date parameter] et [End date parameter]. Appliquez la même période aux horodatages des événements, tout en conservant les documents créés avant cette période lorsqu’ils sont nécessaires pour expliquer des événements qui s’y produisent.
- Configurez le code société, l’organisation commerciale, l’établissement, l’organisation d’achat, le type de document et les autres filtres métier dans la section prévue à cet effet. Vérifiez les valeurs dans le système cible avant d’appliquer les filtres.
- Remplacez les références de tables et de colonnes entre crochets dans chaque branche d’activité par des noms vérifiés. Chaque branche doit renvoyer les mêmes colonnes avec des types de données compatibles. La requête crée explicitement une ligne pour chacune des 15 activités requises, car ProcessMind ne déduit pas les événements manquants.
- Exécutez la requête dans SAP HANA Database Explorer, SAP HANA cockpit SQL Console ou le client SQL approuvé. Testez chaque branche d’activité séparément avant de lancer la requête complète avec UNION ALL. Examinez les plans d’exécution et limitez le test initial à une courte période.
- Validez les relations entre documents, les horodatages, les identifiants utilisateur, les valeurs des fournisseurs et des clients, les articles et les établissements, ainsi que les résultats qualité. Examinez les doublons dus aux jointures au niveau des postes et appliquez la règle définie pour le niveau de détail des événements, par exemple un événement par document ou par poste de document.
- Exportez les résultats au format CSV UTF-8 ou dans un autre format tabulaire pris en charge par ProcessMind. Conservez exactement les noms de colonnes suivants : LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate et QualityInspectionResult. Vérifiez que EventTime est un horodatage et que LastDataUpdate est renseigné de manière cohérente.
- Importez le fichier dans ProcessMind et associez LogisticsOrder à l’identifiant du cas, ActivityName à l’activité et EventTime à l’horodatage de l’événement. Vérifiez que les 15 libellés d’activité sont traités comme des événements explicites, puis planifiez une actualisation contrôlée après avoir validé le fonctionnement de l’extraction incrémentielle.
Configuration
- Période : Commencez par 3 à 6 mois de données. Pour les premiers tests, choisissez une période plus courte et ne l’allongez qu’après avoir vérifié les performances et les relations entre documents.
- Schéma source : Définissez [SAP HANA schema name] sur le schéma contenant les tables ou vues S/4HANA vérifiées. Ne partez pas du principe qu’une table ERP classique est disponible sous le même nom dans tous les déploiements S/4HANA.
- Périmètre des documents : Configurez [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] et [Document Type filter] en fonction du périmètre du processus.
- Corrélation : Configurez [Your document flow or correlation object] afin d’associer chaque événement à un LogisticsOrder. Signalez toute corrélation manquante ou ambiguë au lieu de lui attribuer une valeur sans vérification.
- Niveau de détail des événements : Choisissez un événement par document, par poste de document ou par changement de statut pertinent pour l’activité. Appliquez la même règle à toutes les branches et supprimez uniquement les doublons techniques.
- Priorité des horodatages : Pour chaque activité, utilisez l’horodatage vérifié de comptabilisation, de création, de confirmation, de changement de statut, de contrôle, de livraison, de déchargement, de preuve de livraison ou de facturation. Ne remplacez pas l’heure de l’événement métier par l’heure d’extraction.
- Libellé de la source : Définissez [Source system label] sur une valeur stable, telle que l’identifiant approuvé du système SAP S/4HANA.
- Horodatage d’actualisation : Définissez [Last data update expression] sur l’horodatage d’extraction approuvé ou sur celui de l’actualisation de la source.
- Performances : Appliquez tôt les filtres de période et d’organisation, sélectionnez uniquement les colonnes nécessaires, évitez les jointures sans restriction au niveau des postes, examinez le plan d’exécution et envisagez une vue d’extraction persistante ou une table intermédiaire pour les chargements récurrents.
- Autorisations : L’accès en lecture aux objets concernés du schéma SAP HANA et l’autorisation d’exécuter des requêtes SQL sont nécessaires. La validation métier requiert également l’accès aux données pertinentes de ventes, d’approvisionnement, de stock, de production, de qualité, d’exécution logistique, de transport et de facturation.
- Périmètre fonctionnel : Vérifiez que le système déployé couvre les processus métier représentés par les activités demandées. Les données d’expédition, de déchargement, de preuve de livraison, de qualité, de production et de facturation peuvent être stockées dans des applications ou extensions distinctes.
- Sécurité : Appliquez les règles de votre organisation concernant les données des clients, des fournisseurs, des articles, les données financières et les données utilisateur. Masquez ou limitez l’accès aux champs sensibles lorsque cela est nécessaire.
Exemple de requête sql
WITH
parameters AS (
SELECT
CAST('[Start date parameter]' AS TIMESTAMP) AS start_ts,
CAST('[End date parameter]' AS TIMESTAMP) AS end_ts,
CAST('[Last data update expression]' AS TIMESTAMP) AS last_data_update,
CAST('[Source system label]' AS NVARCHAR(100)) AS source_system,
CAST('[Company Code filter]' AS NVARCHAR(20)) AS company_code_filter,
CAST('[Sales Organization filter]' AS NVARCHAR(20)) AS sales_org_filter,
CAST('[Plant filter]' AS NVARCHAR(20)) AS plant_filter,
CAST('[Purchasing Organization filter]' AS NVARCHAR(20)) AS purchasing_org_filter,
CAST('[Document Type filter]' AS NVARCHAR(20)) AS document_type_filter
FROM DUMMY
),
base_events AS (
SELECT
CAST('[Sales order correlation column]' AS NVARCHAR(100)) AS LogisticsOrder,
CAST('Sales Order Created' AS NVARCHAR(100)) AS ActivityName,
CAST('[Sales order creation timestamp]' AS TIMESTAMP) AS EventTime,
CAST('[Executing user column]' AS NVARCHAR(100)) AS ExecutingUser,
CAST('[Supplier name column]' AS NVARCHAR(255)) AS SupplierName,
CAST('[Customer name column]' AS NVARCHAR(255)) AS CustomerName,
CAST('[Material number column]' AS NVARCHAR(100)) AS MaterialNumber,
CAST('[Plant column]' AS NVARCHAR(100)) AS Plant,
CAST('[Requested delivery date column]' AS DATE) AS RequestedDeliveryDate,
CAST('[Quality inspection result column]' AS NVARCHAR(100)) AS QualityInspectionResult
FROM [Your sales order source object]
CROSS JOIN parameters p
WHERE CAST('[Sales order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Sales order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Sales order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Sales order sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
AND CAST('[Sales order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Inventory check correlation column]' AS NVARCHAR(100)),
CAST('Inventory Availability Checked' AS NVARCHAR(100)),
CAST('[Inventory check timestamp]' AS TIMESTAMP),
CAST('[Inventory check user column]' AS NVARCHAR(100)),
CAST('[Inventory supplier name column]' AS NVARCHAR(255)),
CAST('[Inventory customer name column]' AS NVARCHAR(255)),
CAST('[Inventory material number column]' AS NVARCHAR(100)),
CAST('[Inventory plant column]' AS NVARCHAR(100)),
CAST('[Inventory requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your inventory availability source object]
CROSS JOIN parameters p
WHERE CAST('[Inventory check timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Inventory check timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Inventory company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Inventory sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
UNION ALL
SELECT
CAST('[Purchase requisition correlation column]' AS NVARCHAR(100)),
CAST('Purchase Requisition Created' AS NVARCHAR(100)),
CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP),
CAST('[Purchase requisition user column]' AS NVARCHAR(100)),
CAST('[Purchase requisition supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition customer name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition material number column]' AS NVARCHAR(100)),
CAST('[Purchase requisition plant column]' AS NVARCHAR(100)),
CAST('[Purchase requisition requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your purchase requisition source object]
CROSS JOIN parameters p
WHERE CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase requisition plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Purchase order correlation column]' AS NVARCHAR(100)),
CAST('Purchase Order Issued' AS NVARCHAR(100)),
CAST('[Purchase order issue timestamp]' AS TIMESTAMP),
CAST('[Purchase order user column]' AS NVARCHAR(100)),
CAST('[Purchase order supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase order customer name column]' AS NVARCHAR(255)),
CAST('[Purchase order material number column]' AS NVARCHAR(100)),
CAST('[Purchase order plant column]' AS NVARCHAR(100)),
CAST('[Purchase order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM EKKO po_header
INNER JOIN EKPO po_item
ON po_header.[Purchase order number column] = po_item.[Purchase order number column]
CROSS JOIN parameters p
WHERE CAST('[Purchase order issue timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase order issue timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Purchase order purchasing organization column]' AS NVARCHAR(20)) = p.purchasing_org_filter
AND CAST('[Purchase order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Goods receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Receipt For PO Posted' AS NVARCHAR(100)),
CAST('[Goods receipt posting timestamp]' AS TIMESTAMP),
CAST('[Goods receipt user column]' AS NVARCHAR(100)),
CAST('[Goods receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Goods receipt customer name column]' AS NVARCHAR(255)),
CAST('[Goods receipt material number column]' AS NVARCHAR(100)),
CAST('[Goods receipt plant column]' AS NVARCHAR(100)),
CAST('[Goods receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your material document header source object] material_header
INNER JOIN [Your material document item source object] material_item
ON material_header.[Material document number column] = material_item.[Material document number column]
AND material_header.[Material document year column] = material_item.[Material document year column]
CROSS JOIN parameters p
WHERE CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods receipt movement type column]' AS NVARCHAR(20)) = '[Goods receipt movement type value]'
UNION ALL
SELECT
CAST('[Production order correlation column]' AS NVARCHAR(100)),
CAST('Production Order Created' AS NVARCHAR(100)),
CAST('[Production order creation timestamp]' AS TIMESTAMP),
CAST('[Production order user column]' AS NVARCHAR(100)),
CAST('[Production order supplier name column]' AS NVARCHAR(255)),
CAST('[Production order customer name column]' AS NVARCHAR(255)),
CAST('[Production order material number column]' AS NVARCHAR(100)),
CAST('[Production order plant column]' AS NVARCHAR(100)),
CAST('[Production order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production order source object]
CROSS JOIN parameters p
WHERE CAST('[Production order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production order plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Production receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Produced' AS NVARCHAR(100)),
CAST('[Production receipt timestamp]' AS TIMESTAMP),
CAST('[Production receipt user column]' AS NVARCHAR(100)),
CAST('[Production receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Production receipt customer name column]' AS NVARCHAR(255)),
CAST('[Production receipt material number column]' AS NVARCHAR(100)),
CAST('[Production receipt plant column]' AS NVARCHAR(100)),
CAST('[Production receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production receipt source object]
CROSS JOIN parameters p
WHERE CAST('[Production receipt timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production receipt timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Quality inspection correlation column]' AS NVARCHAR(100)),
CAST('Quality Inspection Performed' AS NVARCHAR(100)),
CAST('[Quality inspection completion timestamp]' AS TIMESTAMP),
CAST('[Quality inspection user column]' AS NVARCHAR(100)),
CAST('[Quality supplier name column]' AS NVARCHAR(255)),
CAST('[Quality customer name column]' AS NVARCHAR(255)),
CAST('[Quality material number column]' AS NVARCHAR(100)),
CAST('[Quality plant column]' AS NVARCHAR(100)),
CAST('[Quality requested delivery date column]' AS DATE),
CAST('[Quality inspection result column]' AS NVARCHAR(100))
FROM [Your quality inspection source object]
CROSS JOIN parameters p
WHERE CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Quality plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Outbound delivery correlation column]' AS NVARCHAR(100)),
CAST('Outbound Delivery Created' AS NVARCHAR(100)),
CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP),
CAST('[Outbound delivery user column]' AS NVARCHAR(100)),
CAST('[Outbound delivery supplier name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery customer name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery material number column]' AS NVARCHAR(100)),
CAST('[Outbound delivery plant column]' AS NVARCHAR(100)),
CAST('[Outbound delivery requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM LIKP delivery_header
INNER JOIN LIPS delivery_item
ON delivery_header.[Delivery number column] = delivery_item.[Delivery number column]
CROSS JOIN parameters p
WHERE CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Outbound delivery plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Picking correlation column]' AS NVARCHAR(100)),
CAST('Picking Completed' AS NVARCHAR(100)),
CAST('[Picking completion timestamp]' AS TIMESTAMP),
CAST('[Picking user column]' AS NVARCHAR(100)),
CAST('[Picking supplier name column]' AS NVARCHAR(255)),
CAST('[Picking customer name column]' AS NVARCHAR(255)),
CAST('[Picking material number column]' AS NVARCHAR(100)),
CAST('[Picking plant column]' AS NVARCHAR(100)),
CAST('[Picking requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your picking status source object]
CROSS JOIN parameters p
WHERE CAST('[Picking completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Picking completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Picking plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Picking completion status column]' AS NVARCHAR(50)) = '[Picking completed status value]'
UNION ALL
SELECT
CAST('[Goods issue correlation column]' AS NVARCHAR(100)),
CAST('Goods Issue Posted' AS NVARCHAR(100)),
CAST('[Goods issue posting timestamp]' AS TIMESTAMP),
CAST('[Goods issue user column]' AS NVARCHAR(100)),
CAST('[Goods issue supplier name column]' AS NVARCHAR(255)),
CAST('[Goods issue customer name column]' AS NVARCHAR(255)),
CAST('[Goods issue material number column]' AS NVARCHAR(100)),
CAST('[Goods issue plant column]' AS NVARCHAR(100)),
CAST('[Goods issue requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your goods issue source object]
CROSS JOIN parameters p
WHERE CAST('[Goods issue posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods issue posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods issue plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods issue movement type column]' AS NVARCHAR(20)) = '[Goods issue movement type value]'
UNION ALL
SELECT
CAST('[Shipment correlation column]' AS NVARCHAR(100)),
CAST('Shipment Created' AS NVARCHAR(100)),
CAST('[Shipment creation timestamp]' AS TIMESTAMP),
CAST('[Shipment user column]' AS NVARCHAR(100)),
CAST('[Shipment supplier name column]' AS NVARCHAR(255)),
CAST('[Shipment customer name column]' AS NVARCHAR(255)),
CAST('[Shipment material number column]' AS NVARCHAR(100)),
CAST('[Shipment plant column]' AS NVARCHAR(100)),
CAST('[Shipment requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your shipment source object]
CROSS JOIN parameters p
WHERE CAST('[Shipment creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Shipment creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Shipment plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Unloading correlation column]' AS NVARCHAR(100)),
CAST('Goods Unloaded at Destination' AS NVARCHAR(100)),
CAST('[Unloading timestamp]' AS TIMESTAMP),
CAST('[Unloading user column]' AS NVARCHAR(100)),
CAST('[Unloading supplier name column]' AS NVARCHAR(255)),
CAST('[Unloading customer name column]' AS NVARCHAR(255)),
CAST('[Unloading material number column]' AS NVARCHAR(100)),
CAST('[Unloading plant column]' AS NVARCHAR(100)),
CAST('[Unloading requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your unloading or carrier event source object]
CROSS JOIN parameters p
WHERE CAST('[Unloading timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Unloading timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[POD correlation column]' AS NVARCHAR(100)),
CAST('Proof Of Delivery Confirmed' AS NVARCHAR(100)),
CAST('[POD confirmation timestamp]' AS TIMESTAMP),
CAST('[POD user column]' AS NVARCHAR(100)),
CAST('[POD supplier name column]' AS NVARCHAR(255)),
CAST('[POD customer name column]' AS NVARCHAR(255)),
CAST('[POD material number column]' AS NVARCHAR(100)),
CAST('[POD plant column]' AS NVARCHAR(100)),
CAST('[POD requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your proof of delivery source object]
CROSS JOIN parameters p
WHERE CAST('[POD confirmation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[POD confirmation timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[Billing correlation column]' AS NVARCHAR(100)),
CAST('Customer Invoice Created' AS NVARCHAR(100)),
CAST('[Billing creation timestamp]' AS TIMESTAMP),
CAST('[Billing user column]' AS NVARCHAR(100)),
CAST('[Billing supplier name column]' AS NVARCHAR(255)),
CAST('[Billing customer name column]' AS NVARCHAR(255)),
CAST('[Billing material number column]' AS NVARCHAR(100)),
CAST('[Billing plant column]' AS NVARCHAR(100)),
CAST('[Billing requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your billing document source object]
CROSS JOIN parameters p
WHERE CAST('[Billing creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Billing creation timestamp]' AS TIMESTAMP) < p.end_ts
)
SELECT
LogisticsOrder,
ActivityName,
EventTime,
parameters.source_system AS SourceSystem,
parameters.last_data_update AS LastDataUpdate,
ExecutingUser,
SupplierName,
CustomerName,
MaterialNumber,
Plant,
RequestedDeliveryDate,
QualityInspectionResult
FROM base_events
CROSS JOIN parameters
WHERE LogisticsOrder IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY LogisticsOrder, EventTime, ActivityName; Étapes
- Prérequis : Vérifiez que vous disposez d’une clé de développeur et des autorisations nécessaires dans votre système SAP S/4HANA pour créer et exécuter des programmes ABAP (accès à la transaction SE38) et lire les tables de la chaîne d’approvisionnement, telles que VBAK, LIKP, EKKO et MKPF.
- Créer le programme : Ouvrez l’éditeur ABAP à l’aide du code de transaction
SE38. Saisissez un nom pour le nouveau programme, par exempleZ_PM_SCM_EXTRACTION, puis cliquez sur « Créer ». Donnez-lui un titre explicite et sélectionnez le type « Programme exécutable ». - Insérer le code : Copiez le code ABAP complet de la section « requête » ci-dessous et collez-le dans l’éditeur ABAP de votre nouveau programme.
- Définir les éléments de texte : Accédez à Go To > Text Elements > Selection Texts. Activez tous les libellés proposés pour l’écran de sélection afin de rendre l’interface claire et facile à utiliser.
- Activer le programme : Enregistrez et activez le programme en appuyant sur CTRL+S, puis sur CTRL+F3, ou en cliquant sur l’icône d’activation de la barre d’outils. Corrigez les éventuelles erreurs de syntaxe liées à la configuration de votre système.
- Exécuter le programme : Appuyez sur F8 ou utilisez le bouton « Traitement direct » pour lancer le programme. Un écran de sélection s’affiche et vous permet de filtrer les données à extraire.
- Définir les paramètres d’extraction : Sur l’écran de sélection, indiquez la période correspondant à la date de création de la commande client. Il est vivement recommandé de filtrer également par code société ou organisation commerciale afin de maîtriser le volume de données. Saisissez le chemin complet du fichier de sortie sur le serveur d’applications SAP.
- Exécuter en arrière-plan : Pour les grands jeux de données couvrant plusieurs mois, exécutez impérativement le programme en arrière-plan afin d’éviter les délais d’expiration de la transaction. Dans le menu, choisissez Program > Execute in Background et planifiez le traitement.
- Récupérer le fichier de données : Une fois l’exécution terminée, utilisez le code de transaction
AL11pour accéder au répertoire indiqué sur le serveur d’applications. Repérez le fichier généré et téléchargez-le sur votre poste à l’aide de la transactionCG3Y. - Préparer le fichier à l’importation : Vérifiez que le fichier téléchargé est au format texte brut, par exemple CSV avec des séparateurs virgule ou point-virgule, et qu’il utilise l’encodage UTF-8. Il est alors prêt à être importé dans l’outil de Process Mining.
Configuration
- Période de sélection (S_ERDAT) : Il s’agit du filtre le plus important. Il définit la période de sélection initiale des commandes client selon leur date de création (
VBAK-ERDAT). Commencez par une période ciblée, par exemple les 3 à 6 derniers mois, afin de maîtriser le volume de données. - Organisation commerciale (S_VKORG) : Filtre facultatif permettant de limiter l’extraction à certaines organisations commerciales. Il est utile pour centrer l’analyse sur une unité opérationnelle ou une région donnée.
- Code société (S_BUKRS) : Filtre facultatif permettant de limiter les données à certains codes société. Il est vivement recommandé pour réduire le périmètre des données et améliorer les performances.
- Chemin du fichier de sortie (P_FILE) : Chemin complet sur le serveur d’applications SAP où sera enregistré le journal d’événements final. L’utilisateur qui exécute le programme doit disposer d’un accès en écriture à ce répertoire. Exemple :
/usr/sap/trans/tmp/scm_event_log.csv. - Mode d’exécution : Le programme peut être exécuté au premier plan pour de petites extractions de test. Pour tout volume de données important, le traitement en arrière-plan est obligatoire afin d’éviter les délais d’expiration et de réduire la charge du système pendant les heures de pointe.
- Autorisations système : L’utilisateur qui exécute le rapport doit disposer d’un accès en lecture à toutes les tables sous-jacentes, notamment VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 et LFA1.
Exemple de requête abap
REPORT Z_PM_SCM_EXTRACTION.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE DEFAULT '/usr/sap/trans/tmp/scm_event_log.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_bukrs FOR vbak-bukrs.
*&---------------------------------------------------------------------*
*& Data Type Definitions
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
LogisticsOrder TYPE vbeln_va,
ActivityName TYPE string,
EventTime TYPE string,
SourceSystem TYPE sysysid,
LastDataUpdate TYPE string,
ExecutingUser TYPE ernam,
SupplierName TYPE name1_gp,
CustomerName TYPE name1_gp,
MaterialNumber TYPE matnr,
Plant TYPE werks_d,
RequestedDeliveryDate TYPE vdatu,
QualityInspectionResult TYPE string,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log,
lv_sysid TYPE sysysid,
lv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
lv_sysid = sy-sysid.
CONCATENATE sy-datum sy-uzeit INTO lv_last_update.
" Select base data: Sales Orders
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~kunnr, h~bukrs, h~vdatu, i~posnr, i~matnr, i~werks
INTO TABLE @DATA(lt_so)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~vkorg IN @s_vkorg
AND h~bukrs IN @s_bukrs.
IF lt_so IS INITIAL.
MESSAGE 'No sales orders found for the given criteria.' TYPE 'I'.
RETURN.
ENDIF.
" Select related documents using Document Flow (VBFA)
SELECT *
INTO TABLE @DATA(lt_vbfa)
FROM vbfa
FOR ALL ENTRIES IN @lt_so
WHERE vbelv = @lt_so-vbeln
AND posnv = @lt_so-posnr.
" Collect all unique document numbers
DATA: lt_vbeln_pr TYPE RANGE OF banfn,
lt_vbeln_po TYPE RANGE OF ebeln,
lt_vbeln_dn TYPE RANGE OF vbeln_vl,
lt_vbeln_gi TYPE RANGE OF mblnr,
lt_vbeln_auf TYPE RANGE OF aufnr,
lt_vbeln_inv TYPE RANGE OF vbeln_vf,
lt_vbeln_shp TYPE RANGE OF tknum.
LOOP AT lt_vbfa INTO DATA(ls_vbfa).
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " Purchase Requisition
APPEND ls_vbfa-vbeln TO lt_vbeln_pr.
WHEN 'K'. " Purchase Order
APPEND ls_vbfa-vbeln TO lt_vbeln_po.
WHEN 'J'. " Delivery
APPEND ls_vbfa-vbeln TO lt_vbeln_dn.
WHEN 'R'. " Goods Movement (GI)
APPEND ls_vbfa-vbeln TO lt_vbeln_gi.
WHEN 'L'. " Production Order
APPEND ls_vbfa-vbeln TO lt_vbeln_auf.
WHEN 'M'. " Invoice
APPEND ls_vbfa-vbeln TO lt_vbeln_inv.
WHEN '8'. " Shipment
APPEND ls_vbfa-vbeln TO lt_vbeln_shp.
ENDCASE.
ENDLOOP.
SORT lt_vbeln_pr. DELETE ADJACENT DUPLICATES FROM lt_vbeln_pr.
SORT lt_vbeln_po. DELETE ADJACENT DUPLICATES FROM lt_vbeln_po.
SORT lt_vbeln_dn. DELETE ADJACENT DUPLICATES FROM lt_vbeln_dn.
SORT lt_vbeln_gi. DELETE ADJACENT DUPLICATES FROM lt_vbeln_gi.
SORT lt_vbeln_auf. DELETE ADJACENT DUPLICATES FROM lt_vbeln_auf.
SORT lt_vbeln_inv. DELETE ADJACENT DUPLICATES FROM lt_vbeln_inv.
SORT lt_vbeln_shp. DELETE ADJACENT DUPLICATES FROM lt_vbeln_shp.
" Select detailed data for each document type
SELECT banfn, badat, ernam FROM eban INTO TABLE @DATA(lt_eban) FOR ALL ENTRIES IN @lt_so WHERE bnfpo = @lt_so-posnr AND banfn IN @lt_vbeln_pr.
SELECT ebeln, aedat, ernam, lifnr FROM ekko INTO TABLE @DATA(lt_ekko) WHERE ebeln IN @lt_vbeln_po.
SELECT vbeln, erdat, erzet, ernam, kodat, wadat_ist, podat FROM likp INTO TABLE @DATA(lt_likp) WHERE vbeln IN @lt_vbeln_dn.
SELECT mblnr, mjahr, budat, usnam FROM mkpf INTO TABLE @DATA(lt_mkpf) WHERE mblnr IN @lt_vbeln_gi.
SELECT mblnr, mjahr, zeile, bwart, lfbnr, ebeln, aufnr FROM mseg INTO TABLE @DATA(lt_mseg) FOR ALL ENTRIES IN @lt_mkpf WHERE mblnr = @lt_mkpf-mblnr AND mjahr = @lt_mkpf-mjahr.
SELECT aufnr, erdat, ernam FROM aufk INTO TABLE @DATA(lt_aufk) WHERE aufnr IN @lt_vbeln_auf.
SELECT prueflos, vdatum, vcode FROM qave INTO TABLE @DATA(lt_qave) FOR ALL ENTRIES IN @lt_so WHERE aufnr IN @lt_vbeln_auf.
SELECT vbeln, erdat, erzet, ernam FROM vbrk INTO TABLE @DATA(lt_vbrk) WHERE vbeln IN @lt_vbeln_inv.
SELECT tknum, erdat, erzet FROM vttk INTO TABLE @DATA(lt_vttk) WHERE tknum IN @lt_vbeln_shp.
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(lt_kna1) FOR ALL ENTRIES IN @lt_so WHERE kunnr = @lt_so-kunnr.
SELECT lifnr, name1 FROM lfa1 INTO TABLE @DATA(lt_lfa1) FOR ALL ENTRIES IN @lt_ekko WHERE lifnr = @lt_ekko-lifnr.
" Assemble Event Log
LOOP AT lt_so INTO DATA(ls_so).
CLEAR ls_event_log.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = ls_so-kunnr BINARY SEARCH.
ls_event_log-LogisticsOrder = ls_so-vbeln.
ls_event_log-SourceSystem = lv_sysid.
ls_event_log-LastDataUpdate = lv_last_update.
ls_event_log-CustomerName = ls_kna1-name1.
ls_event_log-MaterialNumber = ls_so-matnr.
ls_event_log-Plant = ls_so-werks.
ls_event_log-RequestedDeliveryDate = ls_so-vdatu.
" 1. Sales Order Created
ls_event_log-ActivityName = 'Sales Order Created'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" 2. Inventory Availability Checked (proxy event)
ls_event_log-ActivityName = 'Inventory Availability Checked'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime. " Using SO creation time as a proxy
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" Find related documents for this SO item
LOOP AT lt_vbfa INTO ls_vbfa WHERE vbelv = ls_so-vbeln AND posnv = ls_so-posnr.
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " 3. Purchase Requisition Created
READ TABLE lt_eban INTO DATA(ls_eban) WITH KEY banfn = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Purchase Requisition Created'.
CONCATENATE ls_eban-badat '000000' INTO ls_event_log-EventTime. " PR has no time field
ls_event_log-ExecutingUser = ls_eban-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'K'. " 4. Purchase Order Issued
READ TABLE lt_ekko INTO DATA(ls_ekko) WITH KEY ebeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = ls_ekko-lifnr BINARY SEARCH.
ls_event_log-ActivityName = 'Purchase Order Issued'.
CONCATENATE ls_ekko-aedat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_ekko-ernam.
ls_event_log-SupplierName = ls_lfa1-name1.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'L'. " 6. Production Order Created
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Production Order Created'.
CONCATENATE ls_aufk-erdat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_aufk-ernam.
APPEND ls_event_log TO lt_event_log.
" 8. Quality Inspection Performed
READ TABLE lt_qave INTO DATA(ls_qave) WITH KEY prueflos = ls_vbfa-vbeln. " Approximation linking lot to order
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Quality Inspection Performed'.
CONCATENATE ls_qave-vdatum '000000' INTO ls_event_log-EventTime.
ls_event_log-QualityInspectionResult = ls_qave-vcode.
APPEND ls_event_log TO lt_event_log.
CLEAR ls_event_log-QualityInspectionResult.
ENDIF.
ENDIF.
WHEN 'J'. " 9. Outbound Delivery Created
READ TABLE lt_likp INTO DATA(ls_likp) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Outbound Delivery Created'.
CONCATENATE ls_likp-erdat ls_likp-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_likp-ernam.
APPEND ls_event_log TO lt_event_log.
" 10. Picking Completed
IF ls_likp-kodat IS NOT INITIAL.
ls_event_log-ActivityName = 'Picking Completed'.
CONCATENATE ls_likp-kodat '120000' INTO ls_event_log-EventTime. " Using Picking Date as proxy
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 14. Proof Of Delivery Confirmed
IF ls_likp-podat IS NOT INITIAL.
ls_event_log-ActivityName = 'Proof Of Delivery Confirmed'.
CONCATENATE ls_likp-podat '000000' INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDIF.
WHEN 'M'. " 15. Customer Invoice Created
READ TABLE lt_vbrk INTO DATA(ls_vbrk) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Customer Invoice Created'.
CONCATENATE ls_vbrk-erdat ls_vbrk-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_vbrk-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN '8'. " 12. Shipment Created
READ TABLE lt_vttk INTO DATA(ls_vttk) WITH KEY tknum = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Shipment Created'.
CONCATENATE ls_vttk-erdat ls_vttk-erzet INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Find material movements (MSEG) not directly in VBFA
" 5. Goods Receipt For PO Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_po) WHERE ebeln IN (SELECT ebeln FROM ekpo WHERE banfn IN (SELECT banfn FROM eban WHERE vbeln = ls_so-vbeln) ) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_po) WITH KEY mblnr = ls_mseg_po-mblnr mjahr = ls_mseg_po-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Receipt For PO Posted'.
CONCATENATE ls_mkpf_po-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_po-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 7. Goods Produced
LOOP AT lt_mseg INTO DATA(ls_mseg_pp) WHERE aufnr IN (SELECT aufnr FROM afpo WHERE kdauf = ls_so-vbeln) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_pp) WITH KEY mblnr = ls_mseg_pp-mblnr mjahr = ls_mseg_pp-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Produced'.
CONCATENATE ls_mkpf_pp-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_pp-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 11. Goods Issue Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_gi) WHERE lfbnr IN (SELECT vbeln FROM lips WHERE vgbel = ls_so-vbeln) AND bwart = '601'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_gi) WITH KEY mblnr = ls_mseg_gi-mblnr mjahr = ls_mseg_gi-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Issue Posted'.
CONCATENATE ls_mkpf_gi-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_gi-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDLOOP.
" Remove duplicate events for the same case
SORT lt_event_log BY LogisticsOrder ActivityName EventTime.
DELETE ADJACENT DUPLICATES FROM lt_event_log COMPARING LogisticsOrder ActivityName EventTime.
" Write data to file
DATA: lt_output TYPE TABLE OF string.
APPEND 'LogisticsOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ExecutingUser,SupplierName,CustomerName,MaterialNumber,Plant,RequestedDeliveryDate,QualityInspectionResult' TO lt_output.
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |
{ ls_event_log-LogisticsOrder },
{ ls_event_log-ActivityName },
{ ls_event_log-EventTime },
{ ls_event_log-SourceSystem },
{ ls_event_log-LastDataUpdate },
{ ls_event_log-ExecutingUser },
{ ls_event_log-SupplierName },
{ ls_event_log-CustomerName },
{ ls_event_log-MaterialNumber },
{ ls_event_log-Plant },
{ ls_event_log-RequestedDeliveryDate },
{ ls_event_log-QualityInspectionResult }|
.
REPLACE ALL OCCURRENCES OF ',' IN lv_line WITH ' '.
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_line WITH '' LEADING.
CONDENSE lv_line.
APPEND lv_line TO lt_output.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE 'Error downloading file.' TYPE 'E'.
ELSE.
MESSAGE |File downloaded successfully to { p_file }| TYPE 'S'.
ENDIF. Prêt à commencer ?
Appuyez-vous sur ce modèle pour préparer vos données et commencer dès aujourd’hui à améliorer les performances de votre chaîne d’approvisionnement. Nous sommes là pour vous accompagner à chaque étape.
Optimisez dès maintenant la gestion de votre chaîne d’approvisionnement
Obtenez une visibilité de bout en bout et améliorez la précision des prévisions jusqu’à 90 % en quelques jours.
Essai gratuit de 14 jours, sans carte bancaire.