Votre Template de Données pour la Gestion de la Chaîne d'Approvisionnement
Votre Template de Données pour la Gestion de la Chaîne d'Approvisionnement
- Attributs recommandés à collecter
- Activités clés à suivre
- Guide d'extraction
Attributs de gestion de la chaîne d'approvisionnement
| Nom | Description | ||
|---|---|---|---|
| Commande logistique LogisticsOrder | L'identifiant unique pour un processus de chaîne d'approvisionnement complet, de bout en bout, de la demande initiale à la confirmation de livraison finale. | ||
| Description La commande logistique sert d'identifiant de cas principal, reliant toutes les activités liées à une demande ou une requête d'exécution spécifique au sein de la chaîne d'approvisionnement. Cette approche permet de suivre l'ensemble du cycle de vie d'un produit, de la planification et de l'approvisionnement à la production et à la distribution, assurant une vue complète du processus. En Process Mining, l'analyse par commande logistique révèle le chemin complet suivi pour satisfaire une demande. Elle aide à identifier les variantes courantes, les goulots d'étranglement et les écarts dans l'ensemble de la chaîne d'approvisionnement, plutôt que d'examiner des processus isolés comme l'approvisionnement ou les ventes. Pourquoi c'est important C'est la clé essentielle pour connecter tous les événements liés en une seule instance de processus, permettant une analyse de bout en bout de la chaîne d'approvisionnement. Où obtenir Il s'agit d'un identifiant conceptuel qui peut nécessiter d'être construit en reliant divers numéros de document, tels qu'un numéro de commande client avec ses numéros de bon de commande et de livraison subséquents. Consultez la documentation de la chaîne d'approvisionnement SAP S/4HANA ou un expert en la matière. Exemples LO-4500078192LO-4500078193LO-4500078194 | |||
| Heure de l'événement EventTime | L'horodatage indiquant quand l'activité s'est produite, incluant la date et l'heure. | ||
| Description Cet attribut fournit la date et l'heure précises pour chaque activité du processus. Il sert de colonne vertébrale chronologique du journal d'événements, ordonnant les étapes du processus telles qu'elles se sont réellement déroulées. L'Event Time est crucial pour toutes les analyses basées sur le temps. Il est utilisé pour calculer les temps de cycle entre les activités, mesurer le délai total d'un 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 essentiel pour le calcul de toutes les durées et métriques de performance, permettant l'analyse des goulots d'étranglement des processus et des délais. Où obtenir Extrait des champs d'horodatage associés à la création de documents ou aux changements de statut dans les tables SAP principales, telles que CDHDR/CDPOS pour les documents de modification, ou des champs de date/heure spécifiques comme 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 | Le nom de l'activité commerciale ou de l'événement qui s'est produit à un point spécifique du processus de la chaîne d'approvisionnement. | ||
| Description Cet attribut décrit une étape ou un jalon spécifique au sein du cycle de vie de la commande logistique, tel que « Bon de commande émis » ou « Sortie de marchandises enregistrée ». Ces activités forment la séquence d'événements qui constituent le processus. L'analyse de la séquence d'activités est le cœur du Process Mining. Elle permet la découverte du flux de processus réel, la comparaison avec les procédures opérationnelles standard et l'identification des étapes de processus qui causent des retards ou nécessitent un retravail. 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 temps de cycle entre les activités. Où obtenir Généré en mappant les codes de transaction ou les changements de statut de diverses tables SAP (par exemple, EKKO, LIKP, VBUK) à des noms d'activités conviviaux lors de la transformation des données. Exemples Bon de commande émisRéception des marchandises pour commande d'achat enregistrée`Livraison sortante créée`Preuve de livraison confirmée | |||
| Dernière mise à jour des données LastDataUpdate | L'horodatage de la dernière actualisation ou extraction des données du système source. | ||
| Description Cet attribut indique la dernière fois que les données du journal d'événements ont été mises à jour. Il fournit une date de « fraîcheur » pour les données analysées, garantissant que les utilisateurs sont conscients de l'actualité des données. Dans toute analyse, comprendre la récence des données est crucial pour prendre des décisions éclairées. Cet horodatage aide les utilisateurs à faire confiance aux données et à comprendre la fenêtre temporelle couverte par les Dashboards et les KPI. Pourquoi c'est important Assure la transparence sur la fraîcheur des données, permettant aux utilisateurs de savoir à quel point l'analyse du processus est actuelle. Où obtenir C'est un champ de métadonnées généralement généré et renseigné par l'outil d'extraction de données ou ETL à la fin d'une actualisation réussie des données. Exemples 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Système source SourceSystem | Le système d'où proviennent les données. | ||
| Description Identifie l'instance du système source spécifique où les données d'événement ont été générées. Dans un environnement complexe, une entreprise peut avoir plusieurs instances SAP S/4HANA pour différentes régions ou unités commerciales. Cet attribut est important pour la gouvernance des données et pour la segmentation de l'analyse. Il permet aux analystes de comparer les performances des processus entre différents systèmes ou d'isoler les données d'une source unique et faisant autorité. Pourquoi c'est important Fournit un contexte critique pour l'origine des données, ce qui est important pour la validation des données et pour la comparaison des processus entre différents paysages système. Où obtenir C'est généralement une valeur statique ajoutée pendant le processus d'extraction de données pour identifier l'origine, par exemple, l'ID système SAP (SAPSID). Exemples S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| `Numéro d'article` MaterialNumber | L'identifiant unique du produit ou du matériel en cours de traitement. | ||
| Description Le numéro de matériel, souvent appelé SKU, est le code unique d'un produit spécifique dans SAP. Il relie les activités de processus aux marchandises physiques ou numériques fabriquées, achetées ou expédiées. Cet attribut est vital pour l'analyse centrée sur les produits. Il aide à déterminer si certains produits sont plus sujets aux problèmes de qualité, aux retards de production ou aux ruptures de stock. Les Dashboards peuvent être filtrés par matériel pour étudier les performances de lignes de produits spécifiques. Pourquoi c'est important Permet une analyse au niveau du produit pour identifier si les problèmes de processus comme les retards ou les défaillances de qualité sont concentrés sur des matériaux spécifiques. Où obtenir Trouvé dans les tables de niveau article pour la plupart des documents, tels que VBAP pour les commandes clients, 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 | |||
| Date de livraison demandée RequestedDeliveryDate | La date à laquelle le fournisseur a été sollicité pour livrer les marchandises. | ||
| Description C'est la date de livraison spécifiée dans le bon de commande, représentant l'objectif pour le fournisseur. Elle sert de référence par rapport à laquelle la performance de livraison réelle est mesurée. Cette date est essentielle pour calculer le KPI « Taux de livraison à temps des fournisseurs ». En comparant la date réelle de réception des marchandises à cette date demandée, une entreprise peut mesurer objectivement si les fournisseurs respectent leurs engagements. Pourquoi c'est important C'est la date de référence utilisée pour calculer le KPI « Taux de livraison à temps des fournisseurs », ce qui le rend critique pour la gestion de la performance des fournisseurs. Où obtenir Trouvé dans la table d'articles de commande d'achat EKPO, avec 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 | Le 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 ultérieures. Il fournit un contexte pour le côté demande du processus de la chaîne d'approvisionnement. En Process Mining, l'analyse par client aide à identifier différents modèles d'exécution ou niveaux de performance pour les comptes clés. Il est utilisé dans des Dashboards comme le « Proof of Delivery Lag Analysis » pour voir si certains clients retardent systématiquement les confirmations. Pourquoi c'est important Permet la segmentation de l'analyse par client, révélant les comportements spécifiques aux clients, les goulots d'étranglement ou la performance des accords de niveau de service. Où obtenir Le numéro de client (KUNNR) est stocké dans les documents de vente (ex: table VBAK). Le nom est récupéré à partir de la table de base client centrale KNA1. Exemples Retail CorpInnover des SolutionsPartenaires de fabrication | |||
| Nom du Fournisseur SupplierName | Le nom du fournisseur ou du vendeur associé aux activités d'approvisionnement. | ||
| Description Cet attribut identifie le fournisseur auprès duquel les biens ou services sont achetés. Il est généralement associé à des activités telles que « Demande d'achat créée » et « Bon de commande émis ». Le nom du fournisseur est essentiel pour le tableau de bord de performance 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é entre différents fournisseurs, ce qui est crucial pour l'approvisionnement stratégique et la gestion des relations fournisseurs. Pourquoi c'est important Permet l'analyse des performances par fournisseur, ce qui est crucial pour optimiser le processus d'approvisionnement et évaluer la fiabilité des fournisseurs. Où obtenir Le numéro de fournisseur (LIFNR) est stocké dans les documents d'achat (ex: table EKKN, EBAN). Le nom est récupéré à partir de la table de base fournisseur centrale LFA1. Exemples Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Résultat d'inspection qualité QualityInspectionResult | Le résultat d'une inspection qualité, tel que « Réussi » ou « Échoué ». | ||
| Description Cet attribut enregistre le résultat d'un contrôle qualité effectué sur les marchandises produites ou reçues. Le résultat détermine si les marchandises peuvent passer à l'étape suivante ou si elles nécessitent un retravail, un retour ou une mise au rebut. C'est un attribut critique pour le tableau de bord et le KPI des taux de rejet du contrôle qualité. L'analyse de la fréquence et des raisons des défaillances aide à identifier les problèmes de qualité systémiques avec des produits, fournisseurs ou lignes de production spécifiques. Pourquoi c'est important Soutient directement le calcul des KPI liés à la qualité et aide à identifier les sources de mauvaise qualité dans la chaîne d'approvisionnement. Où obtenir Cette information est généralement stockée dans le module Quality Management (QM). Les données peuvent provenir des tables de lots d'inspection comme QALS et des codes de décision d'utilisation dans QAVE. Exemples RéussiÉchouéReprise requiseValidé avec déviation | |||
| Usine Plant | L'installation de fabrication ou de distribution où l'activité a eu lieu. | ||
| Description L'Usine (Plant) est une unité organisationnelle SAP représentant un lieu où les marchandises sont produites, stockées ou distribuées. Elle fournit le contexte géographique ou fonctionnel pour les activités de processus. L'analyse de la performance des processus par Usine est une exigence courante. Elle permet d'établir des benchmarks et de comparer l'efficacité, le débit et la conformité entre différents sites opérationnels, aidant à identifier les meilleures pratiques ou les emplacements qui nécessitent des améliorations. Pourquoi c'est important Fournit une dimension géographique ou organisationnelle pour l'analyse, permettant la comparaison des performances entre différentes installations. Où obtenir Trouvé dans de nombreuses tables d'articles de document, telles que VBAP (Ventes), EKPO (Achats) et LIPS (Livraison). Le champ est généralement nommé WERKS. Exemples 100021003500 | |||
| Utilisateur exécutant ExecutingUser | L'ID utilisateur de la personne ayant exécuté l'activité. | ||
| Description Cet attribut capture le nom d'utilisateur ou l'ID SAP de l'employé qui a effectué l'activité donnée, comme la création d'un bon de commande ou l'enregistrement d'une entrée 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 en formation et à repérer les différences de performance entre les individus ou les équipes. Elle est également précieuse pour l'analyse de conformité afin de voir qui a exécuté les étapes critiques du processus. Pourquoi c'est important Attribue les activités à des utilisateurs spécifiques, permettant l'analyse de la charge de travail, la comparaison des performances et l'investigation des actions non conformes. Où obtenir Trouvé dans les champs 'Créé par' ou 'Modifié par' de nombreuses tables SAP, telles que ERNAM dans EKKO (En-tête PO), LIKP (En-tête livraison) et VBRK (En-tête facture). Exemples CBROWNJSMITHASINGH | |||
| Est un retravail IsRework | Un indicateur indiquant si une activité ou une séquence d'activités représente un retravail. | ||
| Description Cet attribut booléen signale les activités qui sont des répétitions d'étapes antérieures du processus, indiquant une forme de retravail ou de correction. Par exemple, si une « Inspection qualité » est suivie d'une étape « Ordre de production créé » puis d'une autre « Inspection qualité », la deuxième inspection pourrait être signalée comme retravail. L'identification du retravail est essentielle pour comprendre l'inefficacité des processus et les coûts cachés. Ce marqueur aide à quantifier la fréquence et l'impact des boucles de retravail, supportant le calcul du KPI « Order Processing Error Rate » et mettant en évidence les domaines d'amélioration des processus. Pourquoi c'est important Aide à quantifier les inefficacités de processus en identifiant et en comptant explicitement les activités qui font partie d'une boucle de reprise. Où obtenir Ceci est généralement calculé au sein de l'outil de Process Mining en identifiant les séquences d'activités répétées au sein du même cas. Exemples truefaux | |||
| Heure de fin EndTime | L'horodatage indiquant quand une activité a été achevée, utilisé pour le calcul du temps de traitement. | ||
| Description L'heure de fin marque l'achèvement d'une activité spécifique. Tandis que l'heure de début (EventTime) indique quand une activité commence, l'heure de fin est nécessaire pour comprendre combien de temps une activité a pris pour être exécutée, surtout pour les activités qui ne sont pas instantanées. En analyse, disposer à la fois d'une heure de début et de fin permet une mesure précise du temps de traitement par rapport au temps d'attente. Cela aide à distinguer le temps passé à travailler activement sur une tâche du temps passé à attendre l'étape suivante, ce qui est essentiel pour identifier les opportunités d'efficacité. Pourquoi c'est important Permet le calcul de temps de traitement précis des activités, aidant à différencier le travail à valeur ajoutée du temps d'attente. Où obtenir Peut être dérivé des changements de statut dans SAP. Par exemple, le début est une mise à jour de statut 'En cours' et la fin est une mise à jour de statut 'Terminé' à partir de 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 | |||
| Nom du transporteur CarrierName | Le nom de la société de transport ou du transitaire gérant l'expédition. | ||
| Description Le nom du transporteur identifie le prestataire de services logistiques responsable du transport des marchandises entre les lieux, par exemple, d'un entrepôt à un client. Cet attribut est essentiel pour le tableau de bord d'analyse du temps de cycle de transport. Il permet la comparaison des temps de transit, des coûts et de la fiabilité entre différents transporteurs, facilitant une meilleure planification logistique et sélection des transporteurs. Pourquoi c'est important Permet l'analyse des performances par fournisseur de transport, ce qui est essentiel pour optimiser les coûts logistiques et les délais de livraison. Où obtenir L'ID du transporteur (agent d'expédition) est stocké dans les documents d'expédition, comme la table VTTK (Entête d'expédition). Le nom est récupéré à partir des tables de données de base comme LFA1. Exemples DHLFedExMaersk Logistics | |||
| Numéro de commande d'achat PurchaseOrderNumber | L'identifiant unique du document de bon de commande (PO). | ||
| Description Le numéro de bon de commande est le numéro de document officiel utilisé pour commander des matériaux auprès d'un fournisseur. C'est un identifiant clé dans la partie approvisionnement de la chaîne d'approvisionnement. Cet attribut permet des analyses approfondies du processus d'approvisionnement. Il est utilisé dans le tableau de bord « Procurement End-to-End Cycle Time » et pour le calcul du KPI « Supplier On-Time Delivery Rate », reliant les activités de demande, de commande, de réception et de paiement. Pourquoi c'est important Sert d'identifiant clé pour l'exploration du sous-processus d'approvisionnement et la liaison des événements d'approvisionnement connexes. Où obtenir Trouvé dans la table d'en-tête de commande d'achat EKKO et la table d'article EKPO. Le champ est nommé EBELN. Exemples 450007819245000781934500078194 | |||
| Numéro de commande de vente SalesOrderNumber | L'identifiant unique du document de commande client (SO). | ||
| Description Le numéro de commande client est le numéro de document officiel confirmant une vente à un client. C'est un identifiant clé dans la partie "order-to-cash" de la chaîne d'approvisionnement. Cet attribut est crucial pour le suivi de l'exécution d'une commande client spécifique. Il aide à relier la demande client initiale à toutes les activités ultérieures comme la livraison et la facturation, supportant l'analyse des délais de traitement des commandes. Pourquoi c'est important Agit comme un identifiant clé pour le sous-processus d'exécution des commandes, reliant la demande client à la logistique et au règlement financier. Où obtenir Trouvé dans la table d'en-tête de commande client VBAK et la table d'articles VBAP. Le champ est nommé VBELN. Exemples 100023451000234610002347 | |||
| Quantité Commandée OrderQuantity | La quantité de matériel dans la ligne d'article de commande. | ||
| Description Cet attribut spécifie le nombre d'unités d'un matériel demandé dans une commande client ou une ligne d'article de bon de commande. Il fournit une mesure du volume pour chaque transaction. L'analyse par quantité aide à prioriser l'analyse sur les commandes à volume élevé, qui peuvent avoir un impact commercial plus important. Il peut également être utilisé pour normaliser d'autres métriques, comme le calcul du coût par unité, ou pour comprendre comment la taille de la commande affecte les temps de traitement. Pourquoi c'est important Fournit un contexte de volume aux transactions, permettant l'analyse d'impact et la segmentation des cas par taille. Où obtenir Trouvé dans les tables de niveau article, telles que MENGE dans EKPO (Commande d'achat) ou KWMENG dans VBAP (Commande client). Exemples 100500025 | |||
| Temps de traitement ProcessingTime | Le temps passé à travailler activement sur une activité. | ||
| Description Le temps de traitement est la durée calculée entre l'heure de début et l'heure de fin d'une activité. Il représente le travail réel ou le « temps de contact » pour une étape de processus, par opposition au temps d'attente entre les étapes. Cette métrique est fondamentale pour identifier les inefficacités. En isolant le temps de traitement du temps d'attente, les analystes peuvent déterminer si les retards sont causés par une exécution lente des tâches ou par de longues files d'attente et des retards de transfert entre les départements ou les systèmes. Pourquoi c'est important Aide à distinguer le temps de travail actif du temps d'attente inactif, ce qui est essentiel pour identifier les véritables sources des retards de processus. Où obtenir Calculé en soustrayant le StartTime de l'activité de son EndTime (EndTime - StartTime). Exemples PT1H30MPT8HP2D | |||
| Y a-t-il un retard de livraison IsLateDelivery | Un indicateur booléen signalant si une livraison fournisseur a été effectuée après la date de livraison demandée. | ||
| Description Ce marqueur calculé fournit un indicateur simple vrai ou faux indiquant si une livraison a été à temps. Il est dérivé en comparant l'horodatage de l'activité « Réception de marchandises pour BC enregistrée » avec l'attribut « Date de livraison demandée ». Cet attribut simplifie la création de Dashboards et de KPI liés à la performance des fournisseurs. Il permet un filtrage et une agrégation rapides pour calculer le taux de livraison à temps des fournisseurs et identifier quels fournisseurs, matériaux ou régions connaissent les retards les plus fréquents. Pourquoi c'est important Simplifie l'analyse de la performance des fournisseurs en fournissant un résultat binaire clair pour chaque livraison, ce qui est essentiel pour le KPI de livraison à temps. Où obtenir Ceci est un champ calculé. La logique est : IF ('Réception de marchandises pour BC enregistrée'.EventTime > Commande d'achat.Date de livraison demandée) THEN True ELSE False. Exemples truefaux | |||
Activités de gestion de la chaîne d'approvisionnement
| Activité | Description | ||
|---|---|---|---|
| Biens produits | Cette activité représente la confirmation que la fabrication des marchandises est terminée. Elle est généralement enregistrée comme une entrée de marchandises de l'ordre de production, déplaçant le produit fini dans l'inventaire. | ||
| Pourquoi c'est important Ceci marque la fin du cycle de production. Le temps entre la création de l'ordre de production et cet événement représente le délai de fabrication, une métrique clé pour l'efficacité de la production. Où obtenir Ceci peut être capturé explicitement via un enregistrement de document matériel (entrée de marchandises de l'ordre de production) ou inféré de la confirmation finale de l'ordre de production (table AFRU) ou d'un changement de statut en « Livré ». Capture Inférer de la date de comptabilisation du document matière final de réception des marchandises pour l'ordre de fabrication ou d'un changement de statut. Type d'événement inferred | |||
| Bon de commande émis | Marque la création et l'émission formelles d'une commande d'achat à un fournisseur externe pour les matériaux requis. Cette activité convertit une demande d'achat en un engagement juridiquement contraignant avec un fournisseur. | ||
| Pourquoi c'est important En tant qu'étape clé, cette activité est cruciale pour mesurer les délais de livraison des fournisseurs et les temps de cycle d'approvisionnement. Elle fournit la base pour évaluer la performance de livraison à temps des fournisseurs. Où obtenir C'est un événement explicite enregistré lors de la création du bon de commande. L'horodatage de création est stocké dans la table d'en-tête de bon de commande (EKKO, champ AEDAT). Capture Utilisez la date de création du document (EKKO-AEDAT) pour le bon de commande. Type d'événement explicit | |||
| Commande client créée | Cette activité marque la création d'une nouvelle commande client, qui formalise une demande de marchandises d'un client. C'est un événement explicite enregistré lorsqu'un utilisateur enregistre un nouveau document de commande client dans le système. | ||
| Pourquoi c'est important C'est le point de départ principal du processus « order-to-cash ». L'analyse du temps écoulé entre cet événement et d'autres révèle le délai global de traitement des commandes et identifie les retards de traitement initiaux. Où obtenir Cet événement est explicitement enregistré. Il peut être trouvé dans les documents de modification pour les tables de commandes clients (CDHDR/CDPOS) ou en utilisant l'horodatage de création dans la table d'en-tête de commande client (VBAK, champ ERDAT). Capture Utilisez la date (VBAK-ERDAT) et l'heure de création (VBAK-ERZET) pour le document de commande client. Type d'événement explicit | |||
| Preuve de livraison confirmée | Représente la confirmation formelle du client ou du transporteur que les marchandises ont été reçues telles que spécifiées. Ceci est souvent enregistré en mettant à jour la livraison sortante avec les informations de POD. | ||
| Pourquoi c'est important Cette activité est la fin définitive du processus d'exécution. Elle est cruciale pour une facturation précise, la résolution des litiges et la mesure de la dernière étape du cycle de livraison. Où obtenir C'est un événement explicite. La date de preuve de livraison est enregistrée dans la table d'en-tête de livraison (LIKP, champ PODAT) ou les tables POD associées (VLPOD). Capture Utilisez la date de preuve de livraison (LIKP-PODAT) du document de livraison. Type d'événement explicit | |||
| Réception des marchandises pour commande d'achat enregistrée | Représente la réception physique de matières premières ou de marchandises d'un fournisseur contre un bon de commande. Cet événement est enregistré lorsque les marchandises sont reçues à l'entrepôt ou à l'usine. | ||
| Pourquoi c'est important Cette activité complète la partie livraison fournisseur du cycle d'approvisionnement. Elle est essentielle pour calculer les taux de livraison à temps des fournisseurs et comprendre la performance de la logistique entrante. Où obtenir C'est un événement explicite capturé via un enregistrement de document matériel. L'horodatage de l'événement se trouve dans la table d'en-tête de document matériel (MKPF, champ BUDAT). Le lien vers le BC se trouve dans la table d'articles (MSEG). Capture Utilisez la date de publication (MKPF-BUDAT) du document matériel associé au bon de commande. 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 les stocks et enregistre le coût des marchandises vendues, marquant l'expédition officielle de la commande. | ||
| Pourquoi c'est important C'est un jalon critique qui marque le début de la période de « transit ». C'est le point définitif où les marchandises ont quitté la possession de l'entreprise pour la livraison. Où obtenir C'est un événement explicite qui crée un document matériel. L'horodatage est enregistré dans l'en-tête du document matériel (MKPF, champ BUDAT) et met à jour le statut de mouvement de marchandises dans le document de livraison (LIKP, champ WBSTK). Capture Utilisez la date de publication (MKPF-BUDAT) du document matériel de sortie de marchandises associé à la livraison sortante. Type d'événement explicit | |||
| `Livraison sortante créée` | Signifie la création d'un document de livraison, qui autorise le prélèvement 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 C'est une étape clé qui initie le processus d'exécution physique. Les retards entre la création de commande et la création de livraison peuvent indiquer des problèmes de planification ou de disponibilité. Où obtenir C'est un événement explicite. L'horodatage de création est enregistré dans la table d'en-tête de livraison (LIKP, champ ERDAT). Capture Utilisez la date (LIKP-ERDAT) et l'heure de création (LIKP-ERZET) de l'en-tête du document de livraison. Type d'événement explicit | |||
| `Prélèvement terminé` | Cette activité marque l'achèvement du processus physique de rassemblement des articles de l'entrepôt pour la livraison sortante. Dans de nombreux systèmes, cela est confirmé lorsque le statut de prélèvement du document de livraison est mis à jour. | ||
| Pourquoi c'est important Un picking efficace est essentiel à la productivité de l'entrepôt. Le suivi de cette activité aide à identifier les goulots d'étranglement dans les opérations d'entrepôt et à mesurer la performance du picking. Où obtenir Ce n'est souvent pas un événement discret unique mais peut être inféré des changements de statut. Il est enregistré lorsque le statut de prélèvement dans la table d'articles de livraison (LIPS, champ KOSTA) est défini sur « C » (Complètement traité). Capture Inférer des documents de modification lorsque le statut de picking (LIPS-KOSTA) est mis à jour à entièrement préparé. Type d'événement inferred | |||
| Demande d'achat créée | Cette activité signifie la création d'une demande interne pour l'approvisionnement des marchandises ou matières premières nécessaires. Elle est souvent déclenchée lorsque l'inventaire est insuffisant pour exécuter une commande client ou tombe en dessous d'un point de réapprovisionnement. | ||
| Pourquoi c'est important C'est la première étape du cycle d'approvisionnement. Le suivi de sa création aide à identifier les retards dans l'initiation des achats et soutient l'analyse du processus d'achat de bout en bout. Où obtenir C'est un événement explicite. L'horodatage de création est enregistré dans la table d'en-tête de demande d'achat (EBAN, champ BADAT). Capture Utilisez la date de création (EBAN-BADAT) pour le document de demande d'achat. Type d'événement explicit | |||
| Disponibilité des stocks vérifiée | Représente la vérification système ou manuelle pour déterminer si les articles demandés sont en stock afin de satisfaire 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 discret. | ||
| Pourquoi c'est important Comprendre le temps entre une commande et cette vérification, ainsi que son résultat, aide à analyser comment les niveaux de stock impactent les temps d'exécution. Les retards ici conduisent souvent à des activités d'approvisionnement ou de production. Où obtenir Ce n'est généralement pas un événement explicite. Il peut être inféré de la création de la première ligne d d'échéancier confirmée dans la table d'articles de commande client (VBEP) ou des changements de statut au sein de l'article de commande. Capture Inférer de la mise à jour du statut de confirmation sur 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 détails 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 temps entre la sortie des marchandises et l'achèvement de l'expédition révèle l'efficacité du processus de transport. Où obtenir C'est un événement explicite enregistré dans la table d'en-tête d'expédition (VTTK, champ ERDAT). Cela fait partie du module LE-TRA, qui peut ne pas être utilisé par toutes les organisations. Capture 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 pour le client en fonction des marchandises ou services livrés. Elle initie la dernière partie du processus de règlement financier. | ||
| Pourquoi c'est important Cette activité est clé pour analyser le temps du cycle de facturation. Les retards entre la confirmation de livraison et la facturation peuvent avoir un impact négatif sur la trésorerie. Où obtenir C'est un événement explicite. L'horodatage de création est enregistré dans la table d'en-tête de document de facturation (VBRK, champ ERDAT). Capture Utilisez la date de création (VBRK-ERDAT) de l'en-tête du document de facturation. Type d'événement explicit | |||
| Inspection qualité effectuée | Représente la finalisation d'un contrôle qualité sur les marchandises produites. Le résultat de cette inspection, réussi ou échoué, est enregistré dans une décision d'utilisation. | ||
| Pourquoi c'est important Cette activité est cruciale pour surveiller la qualité des produits et identifier les problèmes de production. Des taux de rejet élevés ou des temps d'inspection longs peuvent constituer des goulots d'étranglement importants. Où obtenir C'est un événement explicite capturé lorsqu'une décision d'utilisation est prise pour un lot d'inspection qualité. La date de décision se trouve dans la table QALS (champ PASTRTERM) ou la table QAVE. Capture Utilisez l'horodatage lorsque la décision d'utilisation est enregistrée pour le lot d'inspection (tables QALS/QAVE). Type d'événement explicit | |||
| Marchandises déchargées à destination | Cette activité signifie le déchargement physique des marchandises sur le site du client. Cet événement peut ne pas être explicitement suivi dans SAP et doit souvent être inféré à partir des données du transporteur ou d'événements ultérieurs. | ||
| Pourquoi c'est important Ceci marque la fin de l'étape de « transit » du parcours. La durée entre la sortie des marchandises et ce point est le temps de transport, qui est essentiel pour l'optimisation logistique. Où obtenir C'est rarement un événement explicite dans l'ERP central. Il peut être inféré des messages EDI du transporteur, des données du module Transportation Management (TM) ou de l'horodatage du document de preuve de livraison s'il est disponible. Capture Inférer des mises à jour de statut du transporteur (par exemple, EDI 214) ou utiliser l'horodatage de la preuve de livraison comme un substitut proche. Type d'événement inferred | |||
| Ordre de Production Créé | Indique qu'un ordre de fabrication a été créé pour produire les produits finis requis pour la commande client. C'est le début formel du processus de fabrication interne. | ||
| Pourquoi c'est important La création d'un ordre de production marque le début du délai de fabrication. L'analyse de ceci aide à identifier les retards entre le signal de demande et le début de la production. Où obtenir C'est un événement explicite. La date de création est enregistrée dans la table d'en-tête d'ordre de production (AUFK, champ ERDAT). Capture Utilisez la date de création (AUFK-ERDAT) de la table d'en-tête de commande. Type d'événement explicit | |||
Guides d'extraction
Étapes
- Prérequis : Assurez-vous de disposer d'un utilisateur avec des autorisations suffisantes pour accéder aux vues SAP S/4HANA Core Data Services (CDS) requises. Cela nécessite généralement un rôle spécifique attribué 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 se connecter à la base de données SAP S/4HANA. Vous aurez besoin de l'hôte du serveur de base de données, du port (par exemple, 3xx15, où xx est le 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 des requêtes 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 des différents modules logistiques et de vente.
- Définir les paramètres d'extraction : Avant d'exécuter la requête, localisez les conditions de remplacement dans les clauses
WHEREde chaque sous-requête. Vous devez remplacer'YourCompanyCode'par le code de société réel que vous analysez et ajuster les espaces réservés de plage de dates comme'YYYY-MM-DD'pour définir la période d'extraction souhaitée. - Exécuter la requête : Exécutez le script SQL complet. Le temps d'exécution variera en fonction de la plage de dates sélectionnée et du volume de données dans votre système. Il est conseillé de l'exécuter pendant les heures creuses pour minimiser la charge système.
- Examiner les résultats initiaux : Une fois la requête terminée, examinez brièvement la sortie dans votre client SQL. Vérifiez un nombre raisonnable de lignes, assurez-vous que les colonnes comme LogisticsOrder, ActivityName et EventTime sont renseignées, et confirmez que divers noms d'activités apparaissent.
- Exporter les données vers CSV : Exportez l'ensemble des résultats de votre client SQL vers un fichier CSV. Choisissez l'encodage UTF-8 pour éviter les problèmes avec les caractères spéciaux.
- Format pour le téléchargement : Assurez-vous que les en-têtes de colonne du fichier CSV final correspondent exactement aux noms d'attributs requis pour l'ingestion (par exemple,
LogisticsOrder,ActivityName,EventTime). Aucune transformation de données supplémentaire ne devrait être nécessaire si la requête SQL est utilisée telle que fournie.
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
SELECTsur toutes les vues CDS référencées dans la requête, y compris, mais sans s'y limiter, I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment et I_BillingDocumentItem. - Filtrage par plage de dates : La requête fournie inclut un espace réservé pour un filtre de plage de dates, généralement sur un champ de date de création (
CreationDateouDocumentDate). Pour une analyse initiale, une période de 3 à 6 mois est recommandée afin de garantir un ensemble de données représentatif sans entraîner une charge système excessive. - Filtres métier clés : Il est essentiel de filtrer les données par unités organisationnelles spécifiques pour assurer la pertinence. La requête est préconfigurée avec un espace réservé pour
CompanyCode. Vous pouvez également ajouter des filtres pourSalesOrganization,DistributionChannelouPlanten fonction de votre périmètre d'analyse. - Considérations de performance : Il s'agit d'une requête complexe qui joint plusieurs vues CDS volumineuses. Son exécution peut consommer des ressources système importantes. Planifiez les extractions en dehors des heures ouvrables. Pour les très grands ensembles de données, envisagez d'exécuter la requête par lots plus petits et séquentiels, par mois.
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
- Prérequis : Assurez-vous de disposer d'un utilisateur avec des autorisations suffisantes pour accéder aux vues SAP S/4HANA Core Data Services (CDS) requises. Cela nécessite généralement un rôle spécifique attribué 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 se connecter à la base de données SAP S/4HANA. Vous aurez besoin de l'hôte du serveur de base de données, du port (par exemple, 3xx15, où xx est le 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 des requêtes 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 des différents modules logistiques et de vente.
- Définir les paramètres d'extraction : Avant d'exécuter la requête, localisez les conditions de remplacement dans les clauses
WHEREde chaque sous-requête. Vous devez remplacer'YourCompanyCode'par le code de société réel que vous analysez et ajuster les espaces réservés de plage de dates comme'YYYY-MM-DD'pour définir la période d'extraction souhaitée. - Exécuter la requête : Exécutez le script SQL complet. Le temps d'exécution variera en fonction de la plage de dates sélectionnée et du volume de données dans votre système. Il est conseillé de l'exécuter pendant les heures creuses pour minimiser la charge système.
- Examiner les résultats initiaux : Une fois la requête terminée, examinez brièvement la sortie dans votre client SQL. Vérifiez un nombre raisonnable de lignes, assurez-vous que les colonnes comme LogisticsOrder, ActivityName et EventTime sont renseignées, et confirmez que divers noms d'activités apparaissent.
- Exporter les données vers CSV : Exportez l'ensemble des résultats de votre client SQL vers un fichier CSV. Choisissez l'encodage UTF-8 pour éviter les problèmes avec les caractères spéciaux.
- Format pour le téléchargement : Assurez-vous que les en-têtes de colonne du fichier CSV final correspondent exactement aux noms d'attributs requis pour l'ingestion (par exemple,
LogisticsOrder,ActivityName,EventTime). Aucune transformation de données supplémentaire ne devrait être nécessaire si la requête SQL est utilisée telle que fournie.
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
SELECTsur toutes les vues CDS référencées dans la requête, y compris, mais sans s'y limiter, I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment et I_BillingDocumentItem. - Filtrage par plage de dates : La requête fournie inclut un espace réservé pour un filtre de plage de dates, généralement sur un champ de date de création (
CreationDateouDocumentDate). Pour une analyse initiale, une période de 3 à 6 mois est recommandée afin de garantir un ensemble de données représentatif sans entraîner une charge système excessive. - Filtres métier clés : Il est essentiel de filtrer les données par unités organisationnelles spécifiques pour assurer la pertinence. La requête est préconfigurée avec un espace réservé pour
CompanyCode. Vous pouvez également ajouter des filtres pourSalesOrganization,DistributionChannelouPlanten fonction de votre périmètre d'analyse. - Considérations de performance : Il s'agit d'une requête complexe qui joint plusieurs vues CDS volumineuses. Son exécution peut consommer des ressources système importantes. Planifiez les extractions en dehors des heures ouvrables. Pour les très grands ensembles de données, envisagez d'exécuter la requête par lots plus petits et séquentiels, par mois.
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
- 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 (accès à la transaction SE38) et lire des tables de la chaîne d'approvisionnement comme VBAK, LIKP, EKKO et MKPF.
- Créer un 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, et cliquez sur 'Créer'. Fournissez un titre descriptif et définissez le type de programme sur 'Programme exécutable'. - Insérer le code : Copiez le code ABAP complet de la section 'query' ci-dessous et collez-le dans l'éditeur ABAP de votre nouveau programme.
- Définir les éléments de texte : Naviguez vers Aller à > Éléments de texte > Textes de sélection. Activez toutes les étiquettes d'écran de sélection proposées pour garantir que l'interface utilisateur est claire et conviviale.
- Activer le programme : Enregistrez et activez le programme en appuyant sur CTRL+S puis CTRL+F3, ou en utilisant l'icône d'activation dans la barre d'outils. Corrigez toute erreur de syntaxe pouvant survenir en raison de configurations spécifiques au système.
- Exécuter le programme : Exécutez le programme en appuyant sur F8 ou en utilisant le bouton 'Traitement direct'. Un écran de sélection apparaîtra, vous permettant de filtrer les données à extraire.
- Définir les paramètres d'extraction : Sur l'écran de sélection, spécifiez la plage de dates pour la date de création de la commande client. Il est fortement recommandé de filtrer également par codes de société ou organisations commerciales spécifiques pour gérer 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 ensembles de données couvrant plusieurs mois, il est crucial d'exécuter le programme en arrière-plan pour éviter les dépassements de temps de transaction. Depuis le menu, choisissez Programme > Exécuter en arrière-plan et planifiez la tâche.
- Récupérer le fichier de données : Une fois l'exécution du programme terminée, utilisez le code de transaction
AL11pour naviguer vers le répertoire sur le serveur d'applications que vous avez spécifié. Localisez le fichier généré et téléchargez-le sur votre machine locale à l'aide de la transactionCG3Y. - Préparer pour le téléchargement : Assurez-vous que le fichier téléchargé est dans un format texte brut, tel que CSV avec des délimiteurs virgule ou point-virgule, et qu'il utilise l'encodage UTF-8. Le fichier est maintenant prêt à être téléchargé vers l'outil de Process Mining.
Configuration
- Plage de dates de sélection (S_ERDAT) : Il s'agit du filtre le plus critique. Il définit la fenêtre temporelle pour la sélection initiale des commandes clients basée sur leur date de création (
VBAK-ERDAT). Commencez par une période ciblée, comme les 3 à 6 derniers mois, afin de garantir des volumes de données gérables. - Organisation commerciale (S_VKORG) : Un filtre facultatif pour limiter l'extraction à des organisations commerciales spécifiques. Ceci est utile pour concentrer l'analyse sur une unité commerciale ou une région particulière.
- Code de société (S_BUKRS) : Un filtre facultatif pour limiter les données à des codes de société spécifiques. Ceci est fortement recommandé pour réduire la portée des données et améliorer les performances.
- Chemin du fichier de sortie (P_FILE) : Le chemin complet sur le serveur d'applications SAP où le fichier journal d'événements final sera enregistré. L'utilisateur exécutant 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é en avant-plan pour de petites extractions de test. Pour tout volume de données significatif, le traitement en arrière-plan est obligatoire pour éviter les délais d'attente et réduire la charge sur le système pendant les heures de pointe.
- Autorisations système : L'utilisateur exécutant le rapport nécessite un accès en lecture à toutes les tables sous-jacentes, y compris, mais sans s'y limiter, 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.