Votre template de données pour la gestion de la chaîne logistique
Votre template de données pour la gestion de la chaîne logistique
- Attributs recommandés à collecter
- Activités clés à suivre
- Guide d'extraction
Attributs de la gestion de la chaîne d’approvisionnement
| Nom | Description | ||
|---|---|---|---|
| Commande logistique LogisticsOrder | Identifiant unique d’un processus de chaîne logistique complet, de bout en bout, depuis la demande initiale jusqu’à la confirmation finale de la livraison. | ||
| Description La commande logistique sert d’identifiant principal du cas. Elle relie toutes les activités associées à une demande ou à une requête d’exécution donnée au sein de la chaîne logistique. Cette approche permet de suivre l’ensemble du cycle de vie du parcours d’un produit, de la planification et de l’approvisionnement à la production et à la distribution, afin d’obtenir une vue complète du processus. Dans le Process Mining, l’analyse par commande logistique révèle le parcours complet suivi pour répondre à une demande. Elle aide à identifier 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 c’est important Il s’agit de la clé essentielle pour relier tous les événements associés à une même instance de processus et permettre l’analyse de bout en bout de la chaîne logistique. Où les obtenir Il s’agit d’un identifiant conceptuel qui peut devoir être construit 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 expert métier. Exemples LO-4500078192LO-4500078193LO-4500078194 | |||
| Heure de l’événement EventTime | Horodatage indiquant le moment où l’activité a eu lieu, avec la date et l’heure. | ||
| Description Cet attribut fournit la date et l’heure précises de chaque activité du processus. Il constitue la structure chronologique du journal d’événements, en ordonnant les étapes selon leur déroulement réel. L’heure de l’événement est essentielle à toutes les analyses temporelles. Elle sert à calculer les délais de cycle entre les activités, à mesurer le délai total du processus, à identifier les tendances de performance au fil du temps et à déterminer quand les goulots d’étranglement sont les plus susceptibles de se produire. Pourquoi c’est important Cet horodatage est indispensable au calcul de toutes les durées et mesures de performance. Il permet d’analyser les goulots d’étranglement et les délais des processus. Où les obtenir 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 de 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 chaîne logistique. | ||
| Description Cet attribut décrit une étape ou un jalon précis du cycle de vie de la commande logistique, comme « Commande d’achat émise » ou « Sortie de marchandises enregistrée ». Ces activités forment la séquence d’événements qui constitue 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 d’identifier les étapes qui provoquent des retards ou nécessitent une reprise. Pourquoi c’est important Il définit les étapes du processus, ce qui est fondamental pour découvrir les cartes de processus, analyser les variantes et mesurer les délais de cycle entre les activités. Où les obtenir Généré en associant les codes de transaction ou les changements de statut de différentes tables SAP, par exemple EKKO, LIKP et VBUK, à des noms d’activité compréhensibles lors de la transformation des données. 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 indiquant le dernier rafraîchissement ou la dernière 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 fournit une date de « fraîcheur » des données analysées et permet aux utilisateurs de connaître leur actualité. Dans toute analyse, il est essentiel de connaître la récence des données pour prendre des décisions éclairées. Cet horodatage aide les utilisateurs à faire confiance aux données et à comprendre la période couverte par les Dashboards et les KPI. Pourquoi c’est important Garantit la transparence sur l’actualité des données et permet aux utilisateurs de savoir dans quelle mesure l’analyse du processus est à jour. Où les obtenir Il s’agit d’un champ de métadonnées généralement généré et renseigné par l’outil d’extraction des données ou l’outil ETL à la fin d’un rafraîchissement réussi. Exemples 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Système source SourceSystem | Système à l’origine des données. | ||
| Description Identifie l’instance précise 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 disposer de 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 aux analystes de comparer les performances des processus entre différents systèmes ou d’isoler les données provenant d’une source unique faisant autorité. Pourquoi c’est important Fournit un contexte essentiel sur l’origine des données, ce qui est important pour leur validation et pour comparer les processus dans différents environnements systèmes. Où les obtenir Il s’agit généralement d’une valeur statique ajoutée lors de l’extraction des données afin d’en identifier l’origine, par exemple l’identifiant du 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 représente l’objectif fixé au fournisseur. Elle sert de référence pour mesurer les performances réelles de livraison. Cette date est essentielle au calcul du KPI du taux de livraison fournisseur à temps. En comparant la date réelle de réception des marchandises à cette date demandée, l’entreprise peut mesurer objectivement le respect des engagements des fournisseurs. Pourquoi c’est important Il s’agit de la date de référence utilisée pour calculer le KPI « Taux de livraison fournisseur à temps », ce qui la rend essentielle à la gestion des performances fournisseurs. Où les obtenir Présente dans la table des postes de commandes 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 | |||
| Division Plant | Site de fabrication ou de distribution où l’activité a eu lieu. | ||
| Description La division est une unité organisationnelle SAP représentant un site où les marchandises sont produites, stockées ou distribuées. Elle fournit le contexte géographique ou fonctionnel des activités du processus. L’analyse des performances par division est une exigence courante. Elle permet de comparer l’efficacité, le débit et la conformité entre différents sites opérationnels, afin d’identifier les bonnes pratiques ou les sites nécessitant des améliorations. Pourquoi c’est important Fournit une dimension géographique ou organisationnelle à l’analyse et permet de comparer les performances entre différents sites. Où les obtenir Présent dans de nombreuses tables de postes de documents, comme VBAP pour les ventes, EKPO pour les achats et LIPS pour les livraisons. Le champ est généralement nommé WERKS. Exemples 100021003500 | |||
| Nom du client CustomerName | Nom du client pour lequel la commande est exécutée. | ||
| Description Cet attribut identifie le client final associé à une commande client et aux activités d’exécution qui lui succèdent. Il fournit le contexte de la demande dans le processus de chaîne logistique. Dans le Process Mining, l’analyse par client aide à identifier différents schémas d’exécution ou niveaux de performance pour les comptes importants. Elle est utilisée dans des Dashboards tels que l’analyse du délai de preuve de livraison, afin de déterminer si certains clients retardent régulièrement leurs confirmations. Pourquoi c’est important Permet de segmenter l’analyse par client et de révéler les comportements propres à certains clients, les goulots d’étranglement ou le niveau de respect des accords de niveau de service. Où les obtenir Le numéro du client, KUNNR, est enregistré dans les documents de vente, par exemple dans la table VBAK. Le 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 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 de performance des livraisons fournisseurs. Il permet de filtrer et de segmenter les données afin de comparer les taux de livraison à temps, les délais et les niveaux de qualité entre différents fournisseurs, ce qui est important pour les achats stratégiques et la gestion des relations fournisseurs. Pourquoi c’est important Permet d’analyser les performances par fournisseur, ce qui est essentiel pour optimiser le processus d’approvisionnement et évaluer la fiabilité des fournisseurs. Où les obtenir Le numéro du fournisseur, LIFNR, est enregistré dans les documents d’achat, par exemple dans les tables EKKN et EBAN. Le 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 d’un produit donné 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 centrée sur les produits. Il aide à déterminer si certains produits sont davantage sujets aux problèmes de qualité, aux retards de production ou aux ruptures de stock. Les Dashboards peuvent être filtrés par article pour examiner les performances de gammes de produits précises. Pourquoi c’est important Permet une analyse au niveau du produit afin de déterminer si des problèmes de processus, tels que des retards ou des défauts de qualité, se concentrent sur certains articles. Où les obtenir 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 est généralement nommé MATNR. Exemples FG-100-ARM-2034-BSA-5500 | |||
| Résultat de l’inspection qualité QualityInspectionResult | Résultat d’une inspection qualité, par exemple « Conforme » ou « Non conforme ». | ||
| Description Cet attribut enregistre le résultat d’un contrôle qualité effectué sur des marchandises fabriquées ou reçues. Le résultat détermine si les marchandises peuvent passer à l’étape suivante ou si elles nécessitent une reprise, un retour ou une mise au rebut. Il s’agit d’un attribut 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 à identifier les problèmes de qualité systémiques liés à certains produits, fournisseurs ou lignes de production. Pourquoi c’est important Contribue directement au calcul des KPI liés à la qualité et aide à localiser les sources de mauvaise qualité dans la chaîne logistique. Où les obtenir Ces informations sont généralement stockées dans le module Quality Management (QM). Les données peuvent provenir de tables de lots d’inspection telles que QALS et de codes de décision d’utilisation dans QAVE. Exemples ConformeNon conformeRetouche requiseConforme avec dérogation | |||
| Utilisateur exécutant ExecutingUser | Identifiant de l’utilisateur ayant exécuté l’activité. | ||
| Description Cet attribut enregistre le nom ou l’identifiant de l’utilisateur SAP qui a effectué l’activité concernée, par exemple la création d’une commande d’achat ou l’enregistrement d’une réception de marchandises. Il relie les étapes du processus aux ressources humaines impliquées. L’analyse par utilisateur aide à comprendre la répartition de la charge de travail, à identifier les besoins de formation et à repérer les écarts de performance entre les personnes ou les équipes. Elle est également utile pour les analyses de conformité, afin de savoir qui a effectué les étapes importantes du processus. Pourquoi c’est important Associe les activités à des utilisateurs précis et permet ainsi d’analyser la charge de travail, de comparer les performances et d’examiner les actions non conformes. Où les obtenir 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 le moment où une activité a été achevée, utilisé pour calculer le temps de traitement. | ||
| Description L’heure de fin marque l’achèvement d’une activité donnée. Alors que l’heure de début, EventTime, indique le commencement d’une activité, l’heure de fin est nécessaire pour comprendre le temps requis pour son exécution, notamment lorsqu’il ne s’agit pas d’un événement instantané. En analyse, disposer d’une heure de début et d’une heure de fin permet de mesurer précisément le temps de traitement par rapport au temps d’attente. Cela aide à distinguer le temps consacré au travail effectif sur une tâche du temps passé à attendre l’étape suivante, ce qui est essentiel pour identifier les possibilités d’amélioration de l’efficacité. Pourquoi c’est important Permet de calculer avec précision les temps de traitement des activités et de distinguer le travail créateur de valeur du temps d’attente. Où les obtenir Peut être déduite des changements de statut dans SAP. Par exemple, le début correspond à la mise à jour du statut « In Progress » et la fin à celle du statut « Completed » dans des tables telles que 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 une livraison fournisseur a été effectuée après la date de livraison demandée. | ||
| Description Cet indicateur calculé fournit une réponse simple, vraie ou fausse, pour déterminer 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 enregistrée » à l’attribut « Date de livraison demandée ». Cet attribut simplifie la création de Dashboards et de KPI liés aux performances fournisseurs. Il permet de filtrer et d’agréger rapidement les données afin de calculer le taux de livraison fournisseur à temps et d’identifier les fournisseurs, articles ou régions qui connaissent le plus de retards. Pourquoi c’est important Simplifie l’analyse des performances fournisseurs en fournissant un résultat binaire clair pour chaque livraison, indispensable au KPI de livraison à temps. Où les obtenir 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 responsable du transport des marchandises entre différents sites, par exemple d’un entrepôt vers un client. Cet attribut est essentiel au Dashboard d’analyse du délai du cycle de transport. Il permet de comparer les temps de transit, les coûts et la fiabilité de différents transporteurs, afin d’améliorer la planification logistique et le choix des prestataires. Pourquoi c’est important Permet d’analyser les performances par prestataire de transport, ce qui est essentiel pour optimiser les coûts logistiques et les délais de livraison. Où les obtenir L’identifiant du transporteur, ou agent d’expédition, est enregistré dans les documents d’expédition, par exemple dans la table VTTK, en-tête d’expédition. Le nom est récupéré dans des tables de données de référence telles que 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 confirmant une vente au client. Il constitue un identifiant clé de la partie « de la commande à l’encaissement » de la chaîne logistique. Cet attribut est essentiel pour suivre l’exécution d’une commande client donnée. Il relie la demande initiale du client aux activités ultérieures, telles que la livraison et la facturation, et contribue à l’analyse du délai d’exécution des commandes. Pourquoi c’est important Sert d’identifiant clé du sous-processus d’exécution des commandes et relie la demande client aux règlements logistiques et financiers. Où les obtenir Présent dans la table d’en-tête des commandes client VBAK et dans la table des postes VBAP. Le champ est nommé 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. Il constitue un identifiant clé de 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 délai de cycle de l’approvisionnement de bout en bout et pour calculer le KPI du taux de livraison fournisseur à temps, en reliant les activités de demande, de commande, de réception et de paiement. Pourquoi c’est important Sert d’identifiant clé pour examiner le sous-processus d’approvisionnement en détail et relier les événements d’approvisionnement associés. Où les obtenir Présent dans la table d’en-tête des commandes d’achat EKKO et dans la table des postes EKPO. Le champ est nommé EBELN. Exemples 450007819245000781934500078194 | |||
| Quantité commandée OrderQuantity | Quantité d’articles dans le poste de la 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 fournit une mesure du volume de chaque transaction. L’analyse par quantité aide à prioriser l’examen des commandes à fort volume, qui peuvent avoir un impact métier plus important. Elle peut également servir à normaliser d’autres indicateurs, par exemple pour calculer le coût unitaire, ou à comprendre l’effet de la taille des commandes sur les temps de traitement. Pourquoi c’est important Fournit le contexte de volume des transactions et permet d’analyser leur impact ainsi que de segmenter les cas selon leur taille. Où les obtenir Présente dans les tables de postes, par exemple sous MENGE dans EKPO, commande d’achat, ou sous KWMENG dans VBAP, commande client. Exemples 100500025 | |||
| Reprise nécessaire 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é « Inspection qualité » est suivie d’une étape « Ordre de production créé », puis d’une nouvelle « Inspection qualité », cette seconde inspection peut être signalée comme une reprise. L’identification des reprises est essentielle pour comprendre les inefficacités du processus et les coûts cachés. Cet indicateur aide à quantifier la fréquence et l’impact des boucles de reprise, contribue au calcul du KPI du taux d’erreur de traitement des commandes et met en évidence les domaines à améliorer. Pourquoi c’est important Aide à quantifier les inefficacités du processus en identifiant et en comptant explicitement les activités qui font partie d’une boucle de reprise. Où les obtenir Ce champ est généralement calculé dans l’outil de Process Mining en identifiant les séquences répétées d’activités 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 enregistre officiellement la demande de marchandises d'un client. Il s'agit d'un événement explicite enregistré lorsqu'un utilisateur sauvegarde un nouveau document de commande client dans le système. | ||
| Pourquoi c’est important Il s'agit du point de départ principal du processus de la commande à l'encaissement. L'analyse du délai entre cet événement et les suivants permet de mesurer le délai global d'exécution de la commande et d'identifier les premiers retards de traitement. Où les obtenir Cet événement est enregistré explicitement. Il peut être identifié dans les documents de modification des tables de commandes clients (CDHDR/CDPOS) ou à partir de l'horodatage de création de la table d'en-tête des commandes clients (VBAK, champ ERDAT). Collecte 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 adressée à un fournisseur externe pour les matières nécessaires. Elle transforme une demande d'achat en engagement juridiquement contraignant avec un fournisseur. | ||
| Pourquoi c’est important En tant que jalon essentiel, cette activité est importante pour mesurer les délais fournisseurs et les cycles d'approvisionnement. Elle fournit la référence nécessaire à l'évaluation du respect des délais de livraison par les fournisseurs. Où les obtenir Il s'agit d'un événement explicite 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). Collecte Utilisez la date de création du document (EKKO-AEDAT) pour la commande d'achat. Type d’événement explicit | |||
| Entrée de marchandises pour commande d'achat enregistrée | Représente la réception physique de matières premières ou de marchandises provenant d'un fournisseur dans le cadre d'une commande d'achat. Cet événement est enregistré lorsque les marchandises sont reçues dans l'entrepôt ou l'usine. | ||
| Pourquoi c’est important Cette activité clôt la partie consacrée à la livraison fournisseur dans le cycle d'approvisionnement. Elle est indispensable pour calculer les taux de livraison à temps des fournisseurs et comprendre les performances de la logistique entrante. Où les obtenir Il s'agit d'un événement explicite enregistré par la comptabilisation d'un document article. L'horodatage de l'événement figure dans la table d'en-tête du document article (MKPF, champ BUDAT). Le lien avec la commande d'achat se trouve dans la table des postes (MSEG). Collecte 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 que la fabrication des marchandises est terminée. Elle est généralement enregistrée comme une entrée de marchandises issue de l'ordre de fabrication, qui transfère le produit fini dans les stocks. | ||
| Pourquoi c’est important Elle 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 fabrication, un indicateur clé de l'efficacité de la production. Où les obtenir Cet événement peut être enregistré explicitement par la comptabilisation d'un document article, correspondant à l'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é ». Collecte Déduisez cet événement de la date de comptabilisation du document article correspondant à l'entrée de marchandises finale de l'ordre de fabrication ou d'un changement de statut. Type d’événement inferred | |||
| Preuve de livraison confirmée | Représente la confirmation officielle du client ou du transporteur indiquant que les marchandises ont été reçues conformément aux spécifications. Cette confirmation est souvent enregistrée en mettant à jour la livraison sortante avec les informations de preuve de livraison. | ||
| Pourquoi c’est important Cette activité marque la fin définitive du processus d’exécution. Elle est essentielle pour établir une facturation exacte, résoudre les litiges et mesurer la dernière étape du cycle de livraison. Où les obtenir Il s’agit d’un événement explicite. La date de preuve de livraison est enregistrée dans la table d’en-tête des livraisons, LIKP, champ PODAT, ou dans les tables POD associées, VLPOD. Collecte Utilisez la date de preuve de livraison, LIKP-PODAT, du document de livraison. Type d’événement explicit | |||
| Sortie de marchandises enregistrée | Cette activité représente le départ légal et physique des marchandises de l’entrepôt. Elle réduit le stock et enregistre le coût des marchandises vendues, marquant ainsi l’expédition officielle de la commande. | ||
| Pourquoi c’est important Il s’agit d’une étape importante qui marque le début de la période « en transit ». C’est le moment définitif où les marchandises ont quitté la possession de l’entreprise pour être livrées. Où les obtenir Il s’agit d’un événement explicite qui 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. Collecte 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é | Représente l’achèvement d’un contrôle qualité sur des produits fabriqués. Le résultat de cette inspection, conforme ou non conforme, est enregistré dans une décision d’utilisation. | ||
| Pourquoi c’est important Cette activité est essentielle pour surveiller la qualité des produits et détecter les problèmes de production. Un taux élevé de rejets ou des temps d’inspection longs peuvent constituer des goulots d’étranglement importants. Où les obtenir Il s’agit d’un événement explicite enregistré lorsqu’une décision d’utilisation est prise pour un lot d’inspection qualité. La date de décision figure dans la table QALS, champ PASTRTERM, ou dans la table QAVE. Collecte Utilisez l’horodatage auquel la décision d’utilisation est enregistrée pour le lot d’inspection, dans les 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 sont insuffisants pour exécuter une commande client ou passent sous un seuil de réapprovisionnement. | ||
| Pourquoi c’est important Il s'agit de la première étape du cycle d'approvisionnement. Le suivi de sa création aide à identifier les retards au lancement des achats et à analyser le processus d'achat de bout en bout. Où les obtenir 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). Collecte Utilisez la date de création (EBAN-BADAT) du document de demande d'achat. Type d’événement explicit | |||
| Disponibilité des stocks vérifiée | Représente la vérification, effectuée par le système ou manuellement, visant à déterminer si les articles demandés sont disponibles en stock pour exécuter la commande client. Il s'agit souvent d'une étape automatisée lors de la création de la commande client, mais elle peut ne pas être enregistrée comme un événement distinct. | ||
| Pourquoi c’est important Comprendre le délai entre la commande et cette vérification, ainsi que son résultat, aide à analyser l'effet des niveaux de stock sur les délais d'exécution. Les retards à cette étape entraînent souvent des activités d'approvisionnement ou de production. Où les obtenir Il ne s'agit généralement pas d'un événement explicite. Il peut être déduit 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 de commande. Collecte 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 | Représente la création d’un document d’expédition qui regroupe une ou plusieurs livraisons pour la planification du transport. Ce document contient des informations sur le transporteur, l’itinéraire et le mode de transport. | ||
| Pourquoi c’est important Cette activité marque le début de la planification formelle du transport. L’analyse du délai entre la sortie de marchandises et l’achèvement de l’expédition permet d’évaluer l’efficacité du processus de transport. Où les obtenir Il s’agit d’un événement explicite enregistré dans la table d’en-tête des expéditions, VTTK, champ ERDAT. Il fait partie du module LE-TRA, qui n’est pas nécessairement utilisé par toutes les organisations. Collecte Utilisez la date de création, VTTK-ERDAT, figurant dans 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 destiné au client, sur la base des marchandises ou services livrés. Elle lance la dernière étape du règlement financier du processus. | ||
| Pourquoi c’est important Cette activité est essentielle pour analyser le délai du cycle de facturation. Les retards entre la confirmation de livraison et la facturation peuvent avoir un effet négatif sur la trésorerie. Où les obtenir Il s’agit d’un événement explicite. L’horodatage de création est enregistré dans la table d’en-tête des documents de facturation, VBRK, champ ERDAT. Collecte Utilisez la date de création, VBRK-ERDAT, figurant dans l’en-tête du document de facturation. Type d’événement explicit | |||
| Livraison sortante créée | Indique la création d’un document de livraison qui autorise la préparation et l’expédition des marchandises au client. Cette activité fait passer le processus de la gestion des commandes à l’exécution logistique. | ||
| Pourquoi c’est important Il s’agit d’une étape clé qui lance le processus d’exécution physique. Les délais entre la création de la commande et celle de la livraison peuvent révéler des problèmes de planification ou de disponibilité. Où les obtenir 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. Collecte Utilisez la date de création, LIKP-ERDAT, et l’heure, LIKP-ERZET, figurant dans l’en-tête du document de livraison. Type d’événement explicit | |||
| Marchandises déchargées à destination | Cette activité indique le déchargement physique des marchandises sur le site du 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 c’est important Elle marque la fin du trajet en transit. La durée entre la sortie de marchandises et ce point correspond au temps de transport, un élément essentiel pour l’optimisation logistique. Où les obtenir Il s’agit rarement d’un événement explicite dans l’ERP central. Il peut être déduit de messages EDI du transporteur, de données du module Transportation Management (TM) ou de l’horodatage du document de preuve de livraison, s’il est disponible. Collecte 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 fiable. Type d’événement inferred | |||
| Ordre de fabrication créé | Indique qu'un ordre de fabrication a été créé pour produire les produits finis nécessaires à la commande client. Il s'agit du début officiel du processus de fabrication interne. | ||
| Pourquoi c’est important La création d'un ordre de fabrication marque le début du délai de fabrication. Son analyse aide à identifier les retards entre le signal de demande et le démarrage de la production. Où les obtenir 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). Collecte Utilisez la date de création (AUFK-ERDAT) de la table d'en-tête de l'ordre. Type d’événement explicit | |||
| Préparation terminée | Cette activité marque l’achèvement de la préparation physique des articles dans l’entrepôt pour la livraison sortante. Dans de nombreux systèmes, elle est confirmée lorsque le statut de préparation du document de livraison est mis à jour. | ||
| Pourquoi c’est important Une préparation efficace est essentielle au débit de l’entrepôt. Le suivi de cette activité aide à identifier les goulots d’étranglement des opérations et à mesurer les performances de préparation. Où les obtenir Il ne s’agit souvent pas d’un événement unique et distinct, mais d’un événement qui peut être déduit des changements de statut. Il est enregistré lorsque le statut de préparation dans la table des postes de livraison, LIPS, champ KOSTA, est défini sur « C » (traitement complet). Collecte Déduisez cet événement des documents de modification lorsque le statut de préparation, LIPS-KOSTA, est mis à jour pour indiquer que la préparation est terminée. Type d’événement inferred | |||
Guides d'extraction
Étapes
- Prérequis : assurez-vous de disposer d'un utilisateur ayant les autorisations suffisantes pour accéder aux vues SAP S/4HANA Core Data Services (CDS) requises. Cela nécessite généralement l'attribution d'un rôle spécifique par votre équipe de sécurité SAP. 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 de base de données, 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 dans l'éditeur de votre client SQL. Cette requête est conçue pour extraire toutes les activités spécifié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 servant d'espaces réservés dans les clauses WHERE de chaque sous-requête. Remplacez « YourCompanyCode » par le code société réellement analysé et adaptez les espaces réservés de la période, tels que « YYYY-MM-DD », afin de définir la période d'extraction souhaitée.
- Exécuter la requête : lancez l'intégralité du script SQL. La durée d'exécution varie selon la période sélectionnée et le volume de données de votre système. Il est recommandé d'effectuer cette opération 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, examinez rapidement le résultat 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és apparaissent.
- Exporter les données au format CSV : exportez l'ensemble du résultat depuis votre client SQL vers un fichier CSV. Choisissez l'encodage UTF-8 afin d'éviter les problèmes liés aux caractères spéciaux.
- Préparer le chargement : vérifiez que les en-têtes de colonnes du fichier CSV final correspondent exactement aux noms d'attributs requis pour l'ingestion, par exemple LogisticsOrder, ActivityName et EventTime. Aucune transformation supplémentaire ne devrait être nécessaire si la requête SQL est utilisée telle quelle.
Configuration
- Prérequis : l'accès à la base de données SAP HANA sous-jacente est requis. L'utilisateur de la base de données doit disposer des privilèges SELECT sur 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 de la période : la requête fournie contient un espace réservé pour le filtre de période, généralement appliqué à un champ de date de création, CreationDate ou DocumentDate. 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 provoquer une charge excessive du système.
- Filtres métier clés : il est essentiel de filtrer les données selon des unités organisationnelles précises afin de garantir leur pertinence. La requête est préconfigurée avec un espace réservé pour CompanyCode. Vous pouvez également ajouter des filtres pour SalesOrganization, DistributionChannel ou Plant selon le périmètre de votre analyse.
- Performances : cette requête complexe joint plusieurs vues CDS volumineuses. Son exécution peut mobiliser une part importante des ressources du système. Planifiez les extractions en dehors des heures ouvrées. Pour les très grands volumes, envisagez d'exécuter la requête par lots mensuels plus petits et successifs.
a 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
- Confirmez que l'accès direct en lecture au schéma SAP HANA contenant les données pertinentes de logistique, de vente, d'approvisionnement, de stock, de production, de qualité, de livraison, d'expédition, de preuve de livraison et de facturation est disponible. Demandez le nom du schéma, les informations de connexion et les autorisations à l'équipe SAP Basis ou à l'équipe chargée de la plateforme de données. N'écrivez pas dans le système source.
- Confirmez le modèle de données S/4HANA exact du système cible. EKKO et EKPO sont utilisés pour les commandes d'achat, LIKP et LIPS pour les livraisons sortantes. Les objets supplémentaires doivent être configurés pour les commandes clients, les demandes d'achat, les documents article, les ordres de fabrication, les résultats de contrôle qualité, les expéditions, les preuves de livraison et les documents de facturation. Remplacez chaque espace réservé entre crochets désignant un objet ou une colonne par les objets vérifiés dans le dictionnaire de données du système.
- Définissez la règle de corrélation LogisticsOrder. La règle à privilégier repose sur une relation vérifiée dans le flux documentaire, de la commande client aux livraisons, documents article, documents de production ou d'approvisionnement et documents de facturation associés. Si aucune relation directe n'est disponible, configurez une table de corrélation documentée ou une correspondance propre à l'entreprise. Ne corrélez pas les cas à partir du seul numéro d'article ou de la seule date.
- Définissez la période d'extraction à l'aide de [Start date parameter] et [End date parameter]. Appliquez cette période de manière cohérente aux horodatages des événements, tout en conservant les documents créés avant la période lorsqu'ils sont nécessaires pour expliquer des événements survenus pendant celle-ci.
- Configurez le code société, l'organisation commerciale, l'usine, l'organisation d'achats, le type de document et les autres filtres métier dans la section prévue à cet effet. N'utilisez les filtres qu'après avoir confirmé leurs valeurs dans le système cible.
- 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 d'exécuter 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 les documents, les horodatages, les identifiants utilisateurs, les valeurs des fournisseurs et des clients, les valeurs des articles et des usines ainsi que les résultats qualité. Analysez les doublons causés par les jointures au niveau des articles et appliquez la règle de granularité des événements configurée, par exemple un événement par document ou un événement par article de document.
- Exportez le résultat au format CSV UTF-8 ou dans un autre format tabulaire pris en charge par ProcessMind. Conservez exactement les noms de colonnes de sortie 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 mappez LogisticsOrder comme identifiant de cas, ActivityName comme activité et EventTime comme horodatage de l'événement. Confirmez 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 comportement de l'extraction incrémentielle.
Configuration
- Période : commencez par 3 à 6 mois de données. Utilisez une période plus courte pour les premiers tests et ne l'étendez qu'après avoir validé les performances et les relations entre les 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 supposez pas qu'une table ERP classique est disponible sous le même nom dans tous les déploiements S/4HANA.
- Périmètre documentaire : configurez [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] et [Document Type filter] selon le périmètre du processus.
- Corrélation : configurez [Your document flow or correlation object] afin que chaque événement soit associé à un LogisticsOrder. Toute corrélation manquante ou ambiguë doit être signalée et non attribuée silencieusement.
- Granularité des événements : choisissez un événement par document, par article de document ou par changement de statut pertinent pour l'activité. Appliquez la même règle à toutes les branches et supprimez uniquement les lignes techniquement dupliquées.
- Priorité des horodatages : utilisez, pour chaque activité, 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é 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 l'horodatage d'actualisation de la source.
- Performances : appliquez rapidement les filtres de période et d'organisation, ne sélectionnez que les colonnes requises, évitez les jointures non restreintes au niveau des articles, 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 requis comprend les autorisations de lecture sur les objets du schéma SAP HANA concernés ainsi que le droit d'exécuter des requêtes SQL. La validation métier nécessite l'accès aux données de vente, d'approvisionnement, de stock, de production, de qualité, d'exécution logistique, de transport et de facturation concernées.
- Périmètre fonctionnel : vérifiez que le système déployé couvre les processus métier correspondant aux 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 clients, fournisseurs, articles, financières et utilisateurs. Masquez ou restreignez les champs sensibles lorsque cela est nécessaire.
a 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 : assurez-vous de disposer 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, notamment l'accès à la transaction SE38, ainsi que pour lire les tables de la chaîne logistique 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 exemple Z_PM_SCM_EXTRACTION, puis cliquez sur « Créer ». Indiquez un titre explicite et définissez le type de programme sur « Programme exécutable ».
- Insérer le code : copiez l'intégralité du code ABAP fourni dans la section « query » 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 garantir une interface claire et facile à utiliser.
- Activer le programme : enregistrez et activez le programme en appuyant sur CTRL+S, puis sur CTRL+F3, ou en utilisant l'icône d'activation de la barre d'outils. Corrigez les erreurs de syntaxe qui pourraient résulter de configurations propres à votre système.
- Exécuter le programme : lancez le programme en appuyant sur F8 ou en utilisant le bouton « Direct Processing ». 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 des commandes clients. Il est vivement recommandé d'appliquer également un filtre sur certains codes société ou organisations commerciales 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 volumes couvrant plusieurs mois, il est essentiel d'exécuter le programme en arrière-plan afin d'éviter les délais d'expiration des transactions. Dans le menu, choisissez Program > Execute in Background et planifiez le job.
- Récupérer le fichier de données : une fois l'exécution du programme terminée, utilisez le code de transaction AL11 pour accéder au répertoire du serveur d'applications indiqué. Repérez le fichier généré et téléchargez-le sur votre ordinateur local à l'aide de la transaction CG3Y.
- Préparer le chargement : vérifiez que le fichier téléchargé est au format texte brut, par exemple un fichier CSV utilisant une virgule ou un point-virgule comme séparateur, et qu'il est encodé en UTF-8. Le fichier est alors prêt à être importé dans l'outil de Process Mining.
Configuration
- Plage de dates 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 clients à partir de leur date de création (VBAK-ERDAT). Commencez par une période ciblée, par exemple les 3 à 6 derniers mois, afin de conserver un volume de données maîtrisable.
- Organisation commerciale (S_VKORG) : filtre facultatif permettant de limiter l'extraction à certaines organisations commerciales. Il est utile pour concentrer 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 fichier Event Log 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.
a 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 ?
Utilisez ce template pour préparer vos données et commencer dès aujourd'hui à améliorer les performances de votre chaîne logistique. Nous vous accompagnons à chaque étape.
Optimisez dès maintenant votre gestion de la chaîne logistique
Bénéficiez d'une visibilité de bout en bout et améliorez la précision de vos prévisions jusqu'à 90 % en quelques jours.
Essai gratuit de 14 jours, sans carte bancaire.