Votre modèle de données de gestion des transports
Votre modèle de données de gestion des transports
- Attributs recommandés à collecter
- Activités clés à suivre
- Guide d'extraction pour SAP Transportation Management
Attributs de gestion des transports
| Nom | Description | ||
|---|---|---|---|
| Expédition ShipmentId | L'identifiant unique pour un seul mouvement de marchandises, qui sert de cas central pour l'analyse. | ||
| Description L'ID d'expédition est la clé primaire qui regroupe toutes les activités et événements de transport connexes. Il représente un processus de transport unique, de bout en bout, de la demande initiale à la preuve de livraison finale et au paiement. En Process Mining, cet attribut est essentiel pour construire la vue du cas, permettant aux analystes de suivre le parcours complet de chaque expédition. Il permet l'analyse des variantes de processus, des temps de cycle et des résultats associés aux expéditions individuelles, offrant une vue complète des performances de transport. Pourquoi c'est important C'est l'identifiant de cas fondamental, reliant tous les événements et points de données à une commande de transport spécifique, ce qui est crucial pour l'analyse de processus de bout en bout. Où obtenir Cet identifiant est le numéro de la Commande de transport (Freight Order) ou de la Réservation de fret (Freight Booking) dans SAP TM. On le trouve dans des tables comme /SCMTMS/D_TORROT et /SCMTMS/D_TRQROT. Exemples 610000432161000056786100009876 | |||
| Heure de l'événement EventTime | L'horodatage indiquant quand une activité ou un événement spécifique s'est produit. | ||
| Description L'heure de l'événement fournit la date et l'heure précises de chaque activité dans le processus de transport. Ces données temporelles sont fondamentales pour calculer les temps de cycle, les durées et les temps d'attente entre les différentes étapes du processus. Dans l'analyse, cet attribut est utilisé pour séquencer correctement les événements, construire un journal chronologique et effectuer toutes les analyses de performance basées sur le temps. Il est essentiel pour identifier les retards, mesurer l'efficacité des processus et évaluer les performances par rapport aux plannings ou aux accords de niveau de service. Pourquoi c'est important L'horodatage est essentiel pour ordonner les événements chronologiquement et calculer toutes les métriques de performance, telles que les temps de cycle et la livraison à temps. Où obtenir Provenant des tables de gestionnaires d'événements dans SAP TM, telles que /SAPTRX/EH_EVMSG, qui stockent les horodatages des événements signalés. Exemples 2023-04-15T10:00:00Z2023-04-16T14:30:00Z2023-04-20T09:15:00Z | |||
| Nom de l'activité ActivityName | Le nom d'un événement métier ou d'une étape spécifique survenus au sein du processus de transport. | ||
| Description Le nom de l'activité décrit une tâche ou un jalon unique dans le cycle de vie de l'expédition, tel que "Expédition planifiée", "Marchandises enlevées" ou "Marchandises livrées". Ces activités constituent les nœuds de la carte de processus découverte. L'analyse de la séquence et de la fréquence des activités aide à identifier le flux de processus standard, les déviations, les goulots d'étranglement et les boucles de retravail. C'est la pierre angulaire de la découverte de processus et de la vérification de conformité dans la gestion des transports. Pourquoi c'est important Cet attribut définit les étapes du processus de transport, permettant la visualisation et l'analyse du flux d'expédition de bout en bout. Où obtenir Cela est généralement dérivé des codes d'événement ou des changements de statut enregistrés dans le gestionnaire d'événements de suivi d'exécution de SAP TM. Il peut provenir de tables qui enregistrent les changements de statut d'objets métier ou des messages d'événements spécifiques. Exemples Expédition planifiéeTransporteur assignéMarchandises enlevéesMarchandises livréesPreuve de livraison reçue | |||
| Coût Total du Fret TotalFreightCost | Le coût total calculé ou facturé pour l'expédition. | ||
| Description Le coût total du fret représente l'impact financier d'une expédition. Il peut s'agir du coût calculé par le système de gestion des transports ou du montant final de la facture du transporteur après règlement. Cet attribut permet d'intégrer la dimension financière à l'analyse des processus. Les analystes peuvent identifier les variantes de processus les plus coûteuses, calculer le coût des retards ou des réacheminements, et comparer la rentabilité de différents transporteurs ou modes de transport. Il est fondamental pour les dashboards axés sur les dépenses de transport et l'analyse du coût de service. Pourquoi c'est important Ajoute une dimension financière au processus, permettant l'analyse des dépenses de transport, du coût par expédition et de l'impact financier des inefficacités du processus. Où obtenir Provenant du document de règlement de fret (Freight Settlement Document) dans SAP TM après que le calcul des frais a été effectué. On le trouve dans des tables comme /SCMTMS/D_SFIRHD. Exemples 250.751200.005430.50 | |||
| Date de livraison demandée RequestedDeliveryDate | La date et l'heure de livraison demandées par le client ou stipulées dans la commande client. | ||
| Description La date de livraison demandée est la date limite cible pour l'activité "Marchandises livrées". Elle sert de référence principale pour mesurer la performance de livraison à temps. Cette date est cruciale pour le calcul du KPI "Taux de livraison à temps". En comparant l'horodatage de livraison réel à cette date demandée, les organisations peuvent déterminer si elles ont respecté leur accord de niveau de service. L'analyse des déviations aide à identifier les causes systémiques des retards, telles que les problèmes de performance du transporteur, les retards de planification ou les retenues douanières. Pourquoi c'est important Ceci est la Où obtenir Cette date est généralement transférée de la commande client ou de la commande de transfert de stock précédente depuis SAP ERP. Elle est stockée dans les champs de date/heure de l'Unité de fret (Freight Unit) ou de la Commande de transport (Freight Order). Exemples 2023-05-20T17:00:00Z2023-06-01T12:00:00Z2023-06-15T23:59:59Z | |||
| Heure de fin EndTime | L'horodatage indiquant la date et l'heure de réalisation d'une activité spécifique. | ||
| Description Alors que StartTime indique le début d'un événement, EndTime marque sa conclusion. Ceci est particulièrement utile pour les activités qui ont une durée, comme le 'Dédouanement' ou le 'Chargement des marchandises'. La différence entre EndTime et StartTime représente le temps de traitement de cette activité. Dans l'analyse de Process Mining, disposer à la fois d'une heure de début et de fin permet une analyse plus granulaire des durées d'activité, permettant de séparer le temps de traitement du temps d'attente. Cela aide à identifier précisément où se situent les inefficacités, que ce soit au sein de l'exécution d'une tâche ou dans les transferts entre les tâches. Pourquoi c'est important Permet le calcul précis des temps de traitement des activités, distinguant le temps de travail actif du temps d'attente entre les événements. Où obtenir Comme StartTime, cette information provient des tables de gestionnaires d'événements. Elle peut correspondre à un événement "terminé" distinct pour une activité donnée. Exemples 2023-04-15T11:30:00Z2023-04-16T15:00:00Z2023-04-20T09:45:00Z | |||
| Livraison à temps IsOnTimeDelivery | Un indicateur booléen indiquant si les marchandises ont été livrées à la date de livraison demandée ou avant. | ||
| Description Il s'agit d'un attribut calculé qui compare l'horodatage de l'activité "Marchandises livrées" avec la "Date de livraison demandée". Il est vrai si la livraison a été effectuée à temps ou en avance, et faux si elle a été en retard. Cet attribut simplifie l'analyse des performances en créant un résultat binaire clair pour chaque expédition. Il constitue la base du tableau de bord de performance de livraison à temps et du KPI correspondant. Il permet aux analystes de filtrer facilement les expéditions en retard et d'effectuer une analyse des causes profondes pour comprendre les facteurs de mauvaise performance. Pourquoi c'est important Mesure directement le respect des engagements de livraison, simplifiant le calcul et la visualisation du KPI essentiel de livraison à temps. Où obtenir Cet attribut n'est pas stocké dans SAP TM. Il doit être calculé lors de la transformation des données en comparant l'horodatage de l'événement de livraison réel à la date de livraison demandée. Exemples truefaux | |||
| Mode de transport ModeOfTransport | La méthode de transport utilisée pour l'expédition, telle que la route, le rail, l'air ou la mer. | ||
| Description Cet attribut spécifie le mode de transport. Les différents modes ont des structures de coûts, des temps de transit et des complexités de processus distincts. Par exemple, une expédition de fret aérien international aura des activités différentes, comme le dédouanement, par rapport à une expédition par camion domestique. L'analyse des processus par mode de transport permet des initiatives d'amélioration adaptées. Elle est également critique pour l'analyse des coûts, en particulier pour identifier l'utilisation du fret premium (par exemple, aérien express) par rapport aux modes standard, plus économiques. Cette segmentation est essentielle pour comprendre et contrôler les dépenses de transport. Pourquoi c'est important Permet l'analyse des variations de coût, de temps et de processus basées sur le mode de transport, ce qui est crucial pour l'optimisation des coûts et l'identification de l'utilisation du fret premium. Où obtenir Il s'agit d'un champ clé sur la Commande de transport (Freight Order) ou la Réservation de fret (Freight Booking), souvent étiqueté comme Mode de transport ou MOT. Exemples 01 (Route)02 (Ferroviaire)04 (Aérien)05 (Maritime) | |||
| Nom du transporteur CarrierName | Le nom du transporteur ou du prestataire de services logistiques assigné à l'expédition. | ||
| Description Le nom du transporteur identifie l'entreprise responsable du déplacement physique des marchandises. C'est une dimension essentielle pour l'analyse des performances, car différents transporteurs peuvent avoir des niveaux de service, des coûts et une fiabilité variables. En Process Mining, cet attribut est utilisé pour segmenter et comparer les performances des différents transporteurs. Il permet la création de tableaux de bord des transporteurs, le suivi des taux de livraison à temps par transporteur, la comparaison des coûts et l'identification des transporteurs les plus fréquemment associés à des retards ou des litiges. Cet insight est vital pour la gestion stratégique des transporteurs et l'approvisionnement. Pourquoi c'est important Permet la comparaison des performances entre différents transporteurs, ce qui est essentiel pour optimiser la sélection des transporteurs, les coûts et les niveaux de service. Où obtenir Cette information est stockée sur le document de Commande de transport (Freight Order) ou de Réservation de fret (Freight Booking). Elle est liée via la fonction partenaire commercial pour le transporteur. Exemples DHL ExpressFedEx FretMaersk LineUnion Pacific Railroad | |||
| Date d'enlèvement prévue ScheduledPickupDate | La date et l'heure prévues pour que le transporteur enlève les marchandises au point d'expédition. | ||
| Description La date d'enlèvement prévue est l'heure convenue pour le début du transport physique. C'est un jalon clé dans la phase d'exécution de l'expédition. Cet attribut est essentiel pour suivre la ponctualité de la première étape du trajet. En comparant l'heure d'enlèvement prévue avec l'horodatage réel de l'événement "Marchandises enlevées", les entreprises peuvent calculer les retards d'enlèvement. Cela aide à évaluer la performance et la fiabilité à la fois du lieu d'expédition et du transporteur. Pourquoi c'est important Sert de référence pour mesurer la ponctualité de l'enlèvement, aidant à identifier les retards dès le début du parcours physique de l'expédition. Où obtenir C'est une date/heure planifiée stockée sur la séquence d'arrêt de la Commande de transport (Freight Order) dans SAP TM. Exemples 2023-05-18T09:00:00Z2023-05-30T14:00:00Z2023-06-12T10:30:00Z | |||
| Dernière mise à jour des données LastDataUpdate | L'horodatage de la plus récente extraction ou actualisation des données pour le jeu de données de Process Mining. | ||
| Description Cet attribut indique la fraîcheur des données analysées. Il reflète la date et l'heure de la dernière extraction des données des systèmes sources, comme SAP TM, vers l'outil de Process Mining. Il s'agit d'un élément de métadonnée critique pour tout tableau de bord ou analyse, car il fournit un contexte sur l'actualité des insights. Il aide les utilisateurs à comprendre s'ils examinent des informations en temps réel ou un instantané d'une période précédente, ce qui est essentiel pour prendre des décisions opportunes et éclairées. Pourquoi c'est important Fournit un contexte crucial sur l'actualité des données, garantissant que les utilisateurs sont conscients de la fraîcheur de l'analyse. Où obtenir Cela est généralement généré et stocké par l'outil ETL (Extract, Transform, Load) ou le pipeline de données pendant le processus d'ingestion des données. Exemples 2023-10-27T08:00:00Z2023-10-26T08:00:00Z | |||
| Est litigieux IsDisputed | Un indicateur booléen indiquant si la facture de fret pour l'expédition a donné lieu à un litige. | ||
| Description Ce drapeau calculé identifie les expéditions qui ont un litige de règlement de fret associé. Il est "vrai" si un litige a été créé, et "faux" autrement. Il peut être dérivé de la présence d'une activité "Litige de fret créé" ou d d'un "Motif de litige" non vide. Cet attribut simplifie l'analyse du processus de règlement de fret. Il permet un calcul facile du KPI du taux d'écart de facturation de fret et aide à filtrer toutes les expéditions contestées. Les analystes peuvent ensuite enquêter sur les caractéristiques communes de ces expéditions, telles que les transporteurs, les itinéraires ou les types de frais, pour trouver la cause première des erreurs de facturation. Pourquoi c'est important Simplifie l'identification des règlements de fret problématiques, permettant un calcul rapide du taux de litige et une analyse des causes profondes des erreurs de facturation. Où obtenir Cet attribut n'est pas stocké dans SAP TM. Il doit être calculé en fonction de l'existence d'un cas de litige lié au document de règlement de fret (Freight Settlement Document). Exemples truefaux | |||
| Motif du litige DisputeReason | Le motif fourni lorsqu'une facture de fret est contestée. | ||
| Description Lorsqu'une facture de transporteur ne correspond pas au coût prévu calculé dans SAP TM, un litige est créé. Cet attribut enregistre la raison de cette divergence, comme 'Taux incorrect', 'Facture en double' ou 'Frais accessoires non approuvés'. L'analyse des raisons de litige est essentielle pour le dashboard des erreurs de facturation de fret et des taux de litige. Elle aide à identifier les causes profondes des inexactitudes de facturation, qu'elles proviennent de problèmes de données de base, d'erreurs de transporteur ou de défaillances opérationnelles. Cette analyse permet à l'organisation de prendre des mesures ciblées pour réduire les litiges, ce qui accélère le cycle de paiement et réduit les frais administratifs. Pourquoi c'est important Fournit la cause profonde des erreurs de facturation de fret, permettant des actions ciblées pour réduire les litiges de facturation et améliorer le processus de règlement. Où obtenir Cette information est capturée dans le dossier de gestion des litiges associé à un document de règlement de fret (Freight Settlement Document). Exemples Inadéquation des tarifsPoids incorrectFrais de Surestaries Non ApprouvésFacture en double | |||
| Nom d'utilisateur UserName | L'ID utilisateur ou le nom de la personne ayant exécuté une activité. | ||
| Description Cet attribut identifie l'employé ou l'utilisateur responsable de l'exécution d'une activité manuelle, telle que "Expédition planifiée" ou "Facture vérifiée". Il relie les étapes du processus aux individus ou aux équipes qui les ont exécutées. L'analyse des activités par utilisateur aide à comprendre la répartition de la charge de travail, à identifier les besoins en formation et à reconnaître les meilleurs performeurs. Elle est également cruciale à des fins de conformité et d'audit, fournissant un enregistrement clair de qui a fait quoi et quand. Cela peut révéler des variations dans la manière dont différents utilisateurs exécutent la même tâche. Pourquoi c'est important Attribue les étapes de processus manuelles à des utilisateurs spécifiques, permettant l'analyse de la charge de travail, des performances individuelles et des opportunités de formation. Où obtenir Généralement trouvé dans le journal des modifications ou les tables d'en-tête de document pour les documents de transport, tels que les champs 'Créé par' ou 'Modifié par' (par exemple, ERNAM, AENAM). Exemples CB998030SMITHJPLANIFICATEUR_UE | |||
| Pays d'origine OriginCountry | Le pays d'origine de l'expédition. | ||
| Description Cet attribut identifie le pays de départ du trajet de transport. Il est dérivé de l'adresse du lieu d'enlèvement initial. L'analyse du processus par pays d'origine aide à identifier les différences régionales en termes de performance, de coût et de complexité. Elle peut mettre en évidence les pays avec des délais de dédouanement plus longs, des coûts de transporteur plus élevés ou des retards plus fréquents. Cette segmentation géographique est essentielle pour gérer une chaîne d'approvisionnement mondiale et adapter les stratégies logistiques à des régions spécifiques. Pourquoi c'est important Permet une analyse géographique des performances d'expédition, aidant à identifier les goulots d'étranglement régionaux, les facteurs de coût ou les variations de processus. Où obtenir Cela fait partie des informations d'adresse pour le lieu source du premier arrêt dans la Commande de transport (Freight Order). Exemples DEUSCNMX | |||
| Pays de destination DestinationCountry | Le pays de destination de l'expédition. | ||
| Description Cet attribut identifie le pays de destination finale de l'expédition, dérivé de l'adresse du dernier lieu de livraison. Similaire au pays d'origine, l'analyse par pays de destination est cruciale pour comprendre les défis logistiques régionaux. Elle peut révéler des modèles, tels que les destinations les plus sujettes aux retards de livraison ou ayant des coûts de livraison du dernier kilomètre plus élevés. Cet insight est précieux pour l'optimisation du réseau, la fixation d'attentes de livraison réalistes et la gestion de la conformité au commerce international. Pourquoi c'est important Permet l'analyse des performances de processus par destination, mettant en évidence les problèmes liés à des régions de livraison spécifiques, des autorités douanières ou des transporteurs du dernier kilomètre. Où obtenir Cela fait partie des informations d'adresse pour le lieu de destination du dernier arrêt dans la Commande de transport (Freight Order). Exemples FRCAGBJP | |||
| Raison du retard DelayReason | Un code ou un texte expliquant la raison d'un retard d'expédition. | ||
| Description L'attribut Motif du retard saisit la cause d'une déviation par rapport au calendrier prévu, telle que "Mauvais temps", "Retenue douanière" ou "Retard du transporteur". Cette information est souvent signalée manuellement ou via un message d'événement du transporteur. Il s'agit d'un attribut puissant pour l'analyse des causes profondes. Il permet aux analystes d'aller au-delà du simple fait de savoir qu'une expédition était en retard pour comprendre pourquoi. En catégorisant et en quantifiant les motifs de retard, les organisations peuvent identifier les problèmes récurrents et concentrer leurs efforts d'amélioration sur les domaines les plus impactants, comme l'amélioration de la communication avec les transporteurs ou l'optimisation des itinéraires pour éviter la congestion. Pourquoi c'est important Explique le 'pourquoi' des retards d'expédition, permettant une analyse des causes profondes puissante pour réduire les exceptions et améliorer la performance à temps. Où obtenir Cela peut être capturé comme un code d'événement et une raison dans le cadre de gestion des événements de SAP TM lorsqu'un événement "Arrivée/Départ retardé" est signalé. Exemples WEATHER_DELAYCUSTOMS_INSPECTIONCONGESTION_PORTUAIREDÉFAILLANCE_MÉCANIQUE | |||
| Statut de l'expédition ShipmentStatus | Le statut général actuel de l'expédition au moment de l'extraction des données. | ||
| Description Le statut d'expédition donne un aperçu de l'état d'avancement de l'expédition dans son cycle de vie, par exemple "En planification", "En exécution", "Livré" ou "Annulé". Il représente le dernier état connu du cas. Cet attribut est utile pour filtrer et analyser les expéditions en fonction de leur résultat. Par exemple, un analyste peut se concentrer uniquement sur les expéditions terminées pour mesurer le temps de cycle de bout en bout ou analyser uniquement les expéditions annulées pour comprendre les causes profondes des annulations. Il fournit un contexte important pour l'interprétation du flux de processus. Pourquoi c'est important Fournit un résultat de haut niveau pour chaque expédition, permettant un filtrage et une analyse basés sur la complétion, l'annulation ou l'état de transit de l'expédition. Où obtenir C'est le champ de statut global dans l'en-tête du document Commande de transport (Freight Order) ou Réservation de fret (Freight Booking) dans SAP TM. Exemples En planificationPrêt pour le transportEn exécutionExécutéAnnulé | |||
| Système source SourceSystem | Le système d'où proviennent les données d'événement. | ||
| Description Cet attribut identifie le système source qui a généré les données, par exemple, SAP TM, SAP ERP ou un portail de transporteur externe. Il fournit le contexte sur l'origine des données et aide à comprendre les points d'intégration des données. Dans un paysage complexe, connaître le système source est crucial pour la validation des données, la résolution des problèmes d'intégration et la compréhension de la manière dont les différents systèmes contribuent au processus global. Par exemple, il peut différencier un événement signalé par un système interne de celui signalé par un fournisseur de services logistiques tiers. Pourquoi c'est important Identifie l'origine des données, ce qui est crucial pour la gouvernance des données, le dépannage et la compréhension de l'orchestration des processus à travers plusieurs systèmes. Où obtenir Cette information est souvent stockée dans le journal système ou peut être dérivée en fonction de l'interface ou de l'utilisateur qui a créé la saisie de données. Exemples SAP_TM_P01SAP_ERP_E01CARRIER_PORTAL_XYZ | |||
| Temps de cycle d'expédition ShipmentCycleTime | La durée totale de l'expédition, de la demande initiale à la preuve de livraison finale. | ||
| Description C'est une métrique calculée représentant le temps de cycle de bout en bout pour une expédition. Elle est généralement calculée comme la différence entre l'horodatage de "Preuve de livraison reçue" et "Demande de transport reçue". Le temps de cycle d'expédition est un KPI principal pour mesurer l'efficacité globale du processus de transport. Il offre une vue d'ensemble des performances et, lorsqu'il est analysé dans le temps ou selon différentes dimensions comme le transporteur ou l'itinéraire, il peut révéler des tendances et des goulots d'étranglement majeurs. Il est essentiel pour le tableau de bord du temps de cycle d'expédition de bout en bout. Pourquoi c'est important Mesure la durée totale de bout en bout du processus de transport, fournissant un indicateur clé de la vélocité et de l'efficacité globale du processus. Où obtenir C'est une métrique calculée, dérivée en soustrayant l'heure de début du premier événement de l'heure de fin du dernier événement pour chaque cas. Exemples 5 jours 4 heures12 jours 8 heures22 heures 30 minutes | |||
Activités de gestion des transports
| Activité | Description | ||
|---|---|---|---|
| Demande de transport reçue | Cette activité marque l'initiation du processus de transport, représentant la création d'une exigence de transport. Dans SAP TM, cela est généralement capturé par la création d'un Ordre d'acheminement (Forwarding Order - FWO) ou d'une Exigence de transport basée sur une commande (Order-based Transportation Requirement - OTR). | ||
| Pourquoi c'est important C'est l'événement de démarrage principal du processus d'expédition de bout en bout. L'analyse du temps écoulé entre cette activité et l'achèvement de la planification est cruciale pour mesurer l'efficacité de la planification. Où obtenir Cet événement est enregistré lors de la création d'un Ordre d'acheminement (document de type FWO) ou d'autres documents d'exigence de transport. L'horodatage de création dans la table d'en-tête, telle que /SCMTMS/D_TORROT, sert d'heure d'événement. Capture Capturez la date et l'heure de création du document d'Ordre d'Acheminement ou d'Exigence de Transport. Type d'événement explicit | |||
| Expédition annulée | Cette activité représente l'annulation d'une expédition après qu'elle a été demandée ou planifiée. Elle sert de point d'arrivée terminal pour les processus qui ne procèdent pas à l'exécution. | ||
| Pourquoi c'est important Le suivi des annulations permet d'identifier les raisons des échecs de processus, telles que les changements de demande client ou les erreurs de planification. Des taux d'annulation élevés peuvent indiquer des problèmes sous-jacents dans la gestion des commandes ou la planification. Où obtenir Cela est déduit d'un changement de statut du cycle de vie de l'Ordre d'acheminement (Forwarding Order) ou de la Commande de transport (Freight Order) à "Annulé". L'horodatage de ce changement de statut marque l'événement. Capture Capturez l'horodatage lorsque le statut du cycle de vie du document est défini sur 'Annulé'. Type d'événement inferred | |||
| Expédition planifiée | Cette activité signifie que les exigences de transport ont été consolidées dans un plan d'expédition concret. Elle est enregistrée lorsqu'une Commande de transport (Freight Order, pour la route/rail) ou une Réservation de fret (Freight Booking, pour la mer/air) est créée et sauvegardée, contenant l'itinéraire et les ressources planifiés. | ||
| Pourquoi c'est important L'achèvement de cette étape est essentiel pour l'initiation de l'exécution logistique. Le temps de cycle pour cette activité à partir de la demande est un KPI clé pour mesurer l'efficacité de la planification. Où obtenir Cet événement correspond à la création d'un document de Commande de transport (Freight Order) ou de Réservation de fret (Freight Booking). Il peut également être déduit d'un changement de statut sur le document, comme le statut de planification passant à "Planifié". Les tables pertinentes sont généralement /SCMTMS/D_TORROT pour les données d'en-tête. Capture Utilisez l'horodatage de création du document de commande de transport ou de réservation de fret. Type d'événement explicit | |||
| Marchandises enlevées | Cette activité marque le début du transport physique des marchandises. Elle est enregistrée lorsque le transporteur signale que les marchandises ont été chargées et ont quitté le lieu d'expédition. | ||
| Pourquoi c'est important Il s'agit d'un jalon d'exécution clé qui marque le début de la phase de transit. Il est essentiel pour le suivi de la performance à temps et pour fournir une visibilité précise des expéditions. Où obtenir Cet événement est généralement enregistré dans SAP Event Management, qui est intégré à SAP TM, comme un événement de "Départ" ou "Fin de chargement". Il met à jour le statut d'exécution de la Commande de transport (Freight Order). Il peut également être enregistré directement dans la Commande de transport. Capture Utilisez l'horodatage de l'événement d'exécution 'Départ' signalé pour le lieu d'origine de la commande de transport. Type d'événement explicit | |||
| Marchandises livrées | Cette activité représente l'arrivée de l'expédition à destination finale et l'achèvement du transport physique. Elle est enregistrée lorsque le transporteur signale que les marchandises ont été déchargées au lieu du destinataire. | ||
| Pourquoi c'est important C'est le jalon le plus important pour mesurer la performance de livraison à temps et la satisfaction client. Il sert également généralement de déclencheur pour les processus de facturation et de règlement. Où obtenir Cela est enregistré comme un événement d'exécution "Arrivée à destination" ou "Fin de déchargement" dans SAP TM, mettant à jour le statut d'exécution de la Commande de transport (Freight Order). Les données sont souvent reçues du transporteur. Capture Utilisez l'horodatage de l'événement d'exécution 'Arrivée à destination' signalé pour le dernier arrêt de la commande de transport. Type d'événement explicit | |||
| Paiement traité | Cette activité finale confirme que le transporteur a été payé pour les services de transport. Cet événement se produit généralement dans le système ERP connecté après réception de la facture vérifiée de SAP TM. | ||
| Pourquoi c'est important Cela marque la véritable fin du cycle de vie du transport de bout en bout. C'est essentiel pour mesurer la durée globale du processus et les KPI de paiement à temps. Où obtenir Cette information réside dans le système ERP (par exemple, S/4HANA Finance). Elle peut être liée au document de règlement de fret (Freight Settlement Document) via le numéro de facture. Une mise à jour de statut peut être renvoyée à SAP TM, ou les données doivent être extraites des tables ERP comme BKPF et BSEG. Capture Obtenez la date de compensation du paiement du système ERP, en la liant à l'expédition via la référence de facture. Type d'événement explicit | |||
| Preuve de livraison reçue | Cette activité se produit lorsque le document de preuve de livraison (POD) signé est reçu du transporteur et enregistré dans le système. Cela confirme l'acceptation des marchandises par le destinataire. | ||
| Pourquoi c'est important La réception du POD est une condition préalable essentielle pour la facturation du client et le règlement des frais de fret avec le transporteur. Les retards à ce niveau impactent directement le cycle de conversion de trésorerie. Où obtenir Cela est généralement déduit d'un changement de statut sur la Commande de transport (Freight Order), tel que le statut POD étant défini sur "Reçu". Le changement dans ce champ de statut fournit l'horodatage de l'activité. Capture Capturez l'horodatage lorsque le statut de Preuve de Livraison sur la Commande de Transport est mis à jour à 'Reçue'. Type d'événement inferred | |||
| Règlement de fret créé | Cette activité marque la création du document de règlement de fret (FSD), qui calcule les coûts de transport à payer au transporteur. C'est le document principal utilisé pour les écritures de régularisation et la vérification des factures. | ||
| Pourquoi c'est important Cela marque le début de la phase de règlement financier du processus de transport. L'analyse du temps écoulé entre la livraison et la création du règlement aide à identifier les goulots d'étranglement dans le traitement financier. Où obtenir Il s'agit d'un événement explicite capturé par la création d'un document de règlement de fret (Freight Settlement Document). L'horodatage de création est disponible dans la table d'en-tête de ce document, /SCMTMS/D_SFIRHD. Capture Utilisez la date et l'heure de création du document de règlement de fret. Type d'événement explicit | |||
| Transporteur assigné | Cette activité indique qu'un prestataire de services de transport spécifique, ou transporteur, a été sélectionné et assigné à l'expédition. Cela peut se produire par attribution manuelle, planification automatisée ou processus d'appel d'offres. | ||
| Pourquoi c'est important L'attribution d'un transporteur est une étape cruciale avant qu'une expédition puisse être confirmée et exécutée. Le suivi de cette étape aide à analyser les processus de sélection des transporteurs et à garantir une réservation en temps voulu. Où obtenir Cela est enregistré lorsque le champ transporteur (partie ayant le rôle de 'Carrier') est renseigné dans la Commande de transport (Freight Order) ou la Réservation de fret (Freight Booking). Pour un appel d'offres, c'est au moment où une demande de cotation de fret est attribuée. Capture Identifie l'horodatage lorsque la fonction partenaire transporteur est renseignée ou confirmée pour la première fois dans la Commande de transport (Freight Order). Type d'événement inferred | |||
| Déclaration en douane déposée | Pour les expéditions internationales, cette activité représente la soumission de la documentation douanière requise aux autorités. C'est un prérequis pour obtenir l'autorisation d'exporter ou d'importer des marchandises. | ||
| Pourquoi c'est important Le dépôt des déclarations douanières en temps voulu est crucial pour éviter les retards aux frontières. Cette activité permet de suivre l'efficacité du processus de dédouanement. Où obtenir Cet événement peut être capturé comme un événement d'exécution spécifique signalé par un courtier en douane ou à partir d'un changement de statut dans un système de gestion douanière intégré, comme SAP GTS. La Commande de transport (Freight Order) est mise à jour en conséquence. Capture Capturez l'horodatage de l'événement d'exécution 'Déclaration en douane déposée' ou d'un changement de statut correspondant. Type d'événement explicit | |||
| Dédouané | Cette activité indique que l'expédition a été approuvée par les autorités douanières et est autorisée à poursuivre son chemin. Cet événement est un jalon majeur pour la logistique internationale, car il élimine un goulot d'étranglement potentiel significatif. | ||
| Pourquoi c'est important Le dédouanement est souvent une source de retards majeurs dans les chaînes d'approvisionnement mondiales. Suivre la durée et le taux de réussite de cette activité est essentiel pour améliorer les temps de transit internationaux. Où obtenir Cela est enregistré comme un événement d'exécution "Dédouanement", généralement signalé par un courtier en douane ou un fournisseur de visibilité externe et mis à jour dans le suivi d'exécution de la Commande de transport (Freight Order). Capture Utilisez l'horodatage de l'événement d'exécution 'Dédouanement' signalé associé à la commande de transport. Type d'événement explicit | |||
| Expédition confirmée par le transporteur | Cet événement représente l'accord du transporteur pour exécuter le transport tel que planifié. La confirmation est généralement reçue via un message EDI, une mise à jour du portail transporteur ou une saisie manuelle, ce qui met à jour le statut de la Commande de transport (Freight Order). | ||
| Pourquoi c'est important La confirmation du transporteur engage sur le plan d'expédition, réduisant l'incertitude. Des retards dans la réception de cette confirmation peuvent mettre en péril l'ensemble du calendrier d'expédition. Où obtenir Cela est déduit d'un changement dans le champ de statut de confirmation de la Commande de transport (Freight Order) ou de la Réservation de fret (Freight Booking). Une valeur de statut spécifique, comme "Confirmé", sera définie dans la gestion des statuts du document. Capture Suivre les modifications des champs de statut de confirmation au sein du document de commande de transport. Type d'événement inferred | |||
| Expédition réacheminée | Cette activité signifie un changement imprévu d'itinéraire ou de calendrier d'expédition après sa confirmation. Cela peut être dû à des perturbations, des demandes des clients ou des problèmes logistiques. | ||
| Pourquoi c'est important Les réacheminements entraînent souvent des coûts et des retards accrus. L'identification de la fréquence et des raisons des réacheminements aide à améliorer la précision de la planification et la stabilité opérationnelle. Où obtenir Cet événement est déduit en détectant des changements significatifs aux étapes, lieux ou dates d'une Commande de transport (Freight Order) après le début de son exécution. Les documents de modification (tables CDHDR et CDPOS) peuvent être analysés à cette fin. Capture Détecter les changements apportés aux champs de routage clés dans le document de Commande de Transport après l'événement 'Expédition confirmée par le transporteur'. Type d'événement inferred | |||
| Facture vérifiée | Cette activité signifie que la facture du transporteur a été correctement rapprochée du document de règlement de fret et est approuvée pour paiement. C'est la dernière étape avant l'initiation du processus de paiement dans le système ERP. | ||
| Pourquoi c'est important Cette activité complète le processus d'audit et de vérification des coûts de fret. Les retards à ce stade peuvent entraîner des paiements tardifs aux transporteurs, ce qui peut nuire aux relations. Où obtenir Cela est déduit d'un changement de statut sur le document de règlement de fret (Freight Settlement Document), tel que "Prêt pour les écritures de régularisation" ou "Transféré pour comptabilisation", indiquant qu'il a été envoyé au système ERP pour paiement. Capture Suivre l'horodatage lorsque le statut du cycle de vie du FSD change pour indiquer qu'il est prêt pour le paiement ou qu'il a été enregistré. Type d'événement inferred | |||
| Litige de fret créé | Cet événement indique qu'un écart a été constaté entre la facture du transporteur et les coûts calculés dans le document de règlement de fret (Freight Settlement Document). Cela déclenche un workflow de résolution de litige. | ||
| Pourquoi c'est important Les litiges retardent les paiements des transporteurs et exigent un effort administratif pour être résolus. Le suivi de cette activité aide à identifier les causes profondes des inexactitudes de facturation, telles que des tarifs incorrects ou des frais accessoires. Où obtenir Cela peut être déduit d'un changement de statut sur le document de règlement de fret (Freight Settlement Document), où un statut "Litige" est défini. Cela peut également impliquer la création d'un document de cas de litige distinct. Capture Capturez l'horodatage lorsque le statut de litige est défini sur le Document de Règlement de Fret. Type d'événement inferred | |||
Guides d'extraction
Étapes
- Identifier et activer les API des vues CDS : Connectez-vous à votre système SAP S/4HANA. Utilisez la transaction
/IWFND/MAINT_SERVICEpour vérifier que les services OData nécessaires aux vues CDS principales sont actifs. Les services clés à vérifier incluent ceux liés à I_TransportationOrder, C_TranspOrdExecutionEvent, I_ForwardingOrder et I_FreightSettlementDocument. S'ils ne sont pas actifs, collaborez avec votre administrateur SAP pour les ajouter et les activer depuis le système backend. - Établir la connectivité API : Obtenez l'URL racine des services OData auprès de votre administrateur SAP. Configurez une application cliente, telle qu'un script Python utilisant la bibliothèque
requests, un outil ETL commercial ou un outil comme Postman, pour vous connecter à l'API. Vous devrez configurer l'authentification, généralement en utilisant l'authentification de base (nom d'utilisateur et mot de passe) ou OAuth 2.0 pour une connexion plus sécurisée. - Définir la portée de l'extraction : Déterminez la portée de votre extraction de données. Définissez une plage de dates spécifique, par exemple, les 6 derniers mois. Identifiez les unités organisationnelles pertinentes sur lesquelles filtrer, telles que
Company Code, ou des types de documents spécifiques comme le type de Commande de transport, pour garantir que les données sont pertinentes pour le processus que vous analysez. - Construire la requête d'expédition de base : Commencez par interroger la vue CDS I_TransportationOrder. Cette vue sert d'objet central pour les expéditions, également connues sous le nom de Commandes de transport ou Réservations de transport. Utilisez le paramètre OData
$selectpour choisir les colonnes dont vous avez besoin, y compris les attributs recommandés commeCarrierName,ModeOfTransportetRequestedDeliveryDate. Appliquez un$filterpour limiter les données par date et d'autres paramètres de portée. - Interroger les événements d'exécution et de transport : Utilisez la vue CDS C_TranspOrdExecutionEvent pour extraire les événements logistiques clés. Filtrez cette vue pour des valeurs spécifiques de
EventCodequi correspondent à des activités telles que « Marchandises enlevées » (DEPARTURE) et « Marchandises livrées » (ARRIVAL_AT_DESTINATION). Joignez ces données à vos données d'expédition de base en utilisant l'UUID de TransportationOrder. - Interroger les objets commerciaux connexes : Pour capturer l'ensemble du processus, vous devez interroger d'autres vues CDS connexes. Interrogez I_ForwardingOrder pour l'activité « Demande de transport reçue » et I_FreightSettlementDocument pour les activités financières comme « Règlement de fret créé », « Litige de fret créé » et « Facture vérifiée ».
- Extraire les activités basées sur le statut : De nombreuses activités ne sont pas des événements discrets mais plutôt des changements de statut sur le document primaire. Pour des activités comme « Transporteur assigné », « Expédition confirmée par le transporteur » et « Expédition annulée », vous interrogerez la vue I_TransportationOrder et utiliserez le
LastChangeDateTimeassocié au champ de statut pertinent comme heure de l'événement. Cela nécessite une cartographie minutieuse des codes de statut aux activités commerciales. - Unir et transformer les données : Consolidez les données extraites de toutes les sources dans une structure de journal d'événements unique. Pour chaque activité extraite, créez une ligne contenant les colonnes requises :
ShipmentId,ActivityNameetEventTime. Assurez-vous que tous les attributs recommandés de la requête d'expédition de base sont présents sur chaque ligne pour cette expédition. Cette étape est conceptuellement équivalente à une opération SQLUNION ALL. - Gérer les événements complexes et externes : Pour des activités comme « Dédouané » ou « Paiement traité », les données peuvent résider dans des champs spécifiques ou même dans des systèmes externes. La logique de requête fournie utilise des champs standard comme proxy. Vous devrez peut-être ajuster la requête pour la joindre à des vues CDS spécifiques aux douanes ou la corréler avec une extraction ERP distincte pour les données de paiement basées sur le numéro de Document de Règlement de Fret.
- Formater pour ProcessMind : Enregistrez le jeu de données consolidé final sous forme de fichier CSV. Assurez-vous que les en-têtes de colonne correspondent aux exigences de téléchargement, par exemple, en mappant votre colonne
ShipmentIdau champCaseIddans les paramètres de l'outil. Vérifiez que les horodatages sont dans un format cohérent, de préférence UTC (AAAA-MM-JJTHH:MM:SSZ).
Configuration
- Vues CDS principales : L'extraction s'appuie principalement sur I_TransportationOrder (pour les commandes de transport), C_TranspOrdExecutionEvent (pour les événements d'exécution), I_ForwardingOrder (pour les demandes de transport) et I_FreightSettlementDocument (pour le règlement).
- Filtrage par plage de dates : Il est essentiel d'appliquer un filtre de date pour gérer le volume de données. Utilisez le champ
CreationDateTimesur I_TransportationOrder ou le champActualBusinessDateTimesur C_TranspOrdExecutionEvent. Une plage de 3 à 6 mois est recommandée pour une analyse initiale. - Filtrage par type de document : Pour affiner l'analyse, filtrez sur des types de documents spécifiques à l'aide du champ
TransportationOrderType. Cela permet de distinguer différents scénarios logistiques, tels que les expéditions sortantes standard des transferts de stock. - Filtres organisationnels : Le cas échéant, filtrez par
PurchasingOrganizationou d'autres champs de niveau organisationnel pour limiter les données à une unité commerciale ou une région spécifique. - Pagination de l'API : Pour les grands jeux de données, utilisez les paramètres OData
$topet$skippour récupérer les données par pages plus petites. Cela évite les délais d'attente de l'API et réduit la consommation de mémoire côté client. Une taille de page de 1000 à 5000 lignes est souvent efficace. - Prérequis : L'utilisateur ou le compte de service effectuant l'extraction nécessite des autorisations pour les services OData sous-jacents (objet d'autorisation S_SERVICE) et les données commerciales au sein des vues CDS. Les services correspondants doivent être activés dans la passerelle SAP (
/IWFND/MAINT_SERVICE).
a Exemple de requête sql
WITH Shipments AS (
SELECT
TransportationOrder AS ShipmentId,
CarrierName,
TranspOrdExecutionBlockRsnCode,
TransportationMode AS ModeOfTransport,
ShippingType AS ShipmentType,
CreationDateTime AS ShipmentCreationTime,
LastChangeDateTime,
LifeCycleStatus,
ConfirmationStatus,
OverallExecutionStatus,
DeliveryOverallStatus,
PlannedDepDateTimeReqByCust AS RequestedDeliveryDate,
TotalChargesAmountInTransacCrcy AS TotalFreightCost
FROM I_TransportationOrder
WHERE
CreationDateTime >= '[START_DATE]' AND CreationDateTime <= '[END_DATE]'
-- AND TransportationOrderType IN ('[Your_Type_1]', '[Your_Type_2]')
)
SELECT
fwo.PurchasingDocument AS ShipmentId,
'Transportation Request Received' AS ActivityName,
fwo.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM I_ForwardingOrder AS fwo
LEFT JOIN Shipments s ON fwo.PurchasingDocument = s.ShipmentId
WHERE fwo.CreationDateTime >= '[START_DATE]' AND fwo.CreationDateTime <= '[END_DATE]'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Planned' AS ActivityName,
s.ShipmentCreationTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
UNION ALL
SELECT
s.ShipmentId,
'Carrier Assigned' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CarrierName IS NOT NULL
UNION ALL
SELECT
s.ShipmentId,
'Shipment Confirmed By Carrier' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.ConfirmationStatus = 'C' -- 'Confirmed'
UNION ALL
SELECT
s.ShipmentId,
'Goods Picked Up' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'DEPARTURE'
UNION ALL
SELECT
s.ShipmentId,
'Customs Declaration Filed' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsRelevance IS NOT NULL -- This is a proxy, system config dependent
UNION ALL
SELECT
s.ShipmentId,
'Customs Cleared' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsOverallStatus = '4' -- 'Customs Cleared'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Rerouted' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.TranspOrdExecutionBlockRsnCode = '[Your Rerouting Reason Code]'
UNION ALL
SELECT
s.ShipmentId,
'Goods Delivered' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'ARRIVAL_AT_DESTINATION'
UNION ALL
SELECT
s.ShipmentId,
'Proof Of Delivery Received' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.DeliveryOverallStatus = 'C' -- 'POD Received'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Settlement Created' AS ActivityName,
fsd.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Dispute Created' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.DisputeStatus = '1' -- 'In Dispute'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Invoice Verified' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.OverallLifeCycleStatus = '06' -- 'Posted for Accruals'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Cancelled' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.LifeCycleStatus = 'X' -- 'Cancelled'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Payment Processed' AS ActivityName,
fsd.LastChangeDateTime AS EventTime, -- Approximation, actual payment is in ERP
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.InvoiceProcessingStatus = 'C' -- 'Completely Invoiced' Étapes
- Identifier et activer les API des vues CDS : Connectez-vous à votre système SAP S/4HANA. Utilisez la transaction
/IWFND/MAINT_SERVICEpour vérifier que les services OData nécessaires aux vues CDS principales sont actifs. Les services clés à vérifier incluent ceux liés à I_TransportationOrder, C_TranspOrdExecutionEvent, I_ForwardingOrder et I_FreightSettlementDocument. S'ils ne sont pas actifs, collaborez avec votre administrateur SAP pour les ajouter et les activer depuis le système backend. - Établir la connectivité API : Obtenez l'URL racine des services OData auprès de votre administrateur SAP. Configurez une application cliente, telle qu'un script Python utilisant la bibliothèque
requests, un outil ETL commercial ou un outil comme Postman, pour vous connecter à l'API. Vous devrez configurer l'authentification, généralement en utilisant l'authentification de base (nom d'utilisateur et mot de passe) ou OAuth 2.0 pour une connexion plus sécurisée. - Définir la portée de l'extraction : Déterminez la portée de votre extraction de données. Définissez une plage de dates spécifique, par exemple, les 6 derniers mois. Identifiez les unités organisationnelles pertinentes sur lesquelles filtrer, telles que
Company Code, ou des types de documents spécifiques comme le type de Commande de transport, pour garantir que les données sont pertinentes pour le processus que vous analysez. - Construire la requête d'expédition de base : Commencez par interroger la vue CDS I_TransportationOrder. Cette vue sert d'objet central pour les expéditions, également connues sous le nom de Commandes de transport ou Réservations de transport. Utilisez le paramètre OData
$selectpour choisir les colonnes dont vous avez besoin, y compris les attributs recommandés commeCarrierName,ModeOfTransportetRequestedDeliveryDate. Appliquez un$filterpour limiter les données par date et d'autres paramètres de portée. - Interroger les événements d'exécution et de transport : Utilisez la vue CDS C_TranspOrdExecutionEvent pour extraire les événements logistiques clés. Filtrez cette vue pour des valeurs spécifiques de
EventCodequi correspondent à des activités telles que « Marchandises enlevées » (DEPARTURE) et « Marchandises livrées » (ARRIVAL_AT_DESTINATION). Joignez ces données à vos données d'expédition de base en utilisant l'UUID de TransportationOrder. - Interroger les objets commerciaux connexes : Pour capturer l'ensemble du processus, vous devez interroger d'autres vues CDS connexes. Interrogez I_ForwardingOrder pour l'activité « Demande de transport reçue » et I_FreightSettlementDocument pour les activités financières comme « Règlement de fret créé », « Litige de fret créé » et « Facture vérifiée ».
- Extraire les activités basées sur le statut : De nombreuses activités ne sont pas des événements discrets mais plutôt des changements de statut sur le document primaire. Pour des activités comme « Transporteur assigné », « Expédition confirmée par le transporteur » et « Expédition annulée », vous interrogerez la vue I_TransportationOrder et utiliserez le
LastChangeDateTimeassocié au champ de statut pertinent comme heure de l'événement. Cela nécessite une cartographie minutieuse des codes de statut aux activités commerciales. - Unir et transformer les données : Consolidez les données extraites de toutes les sources dans une structure de journal d'événements unique. Pour chaque activité extraite, créez une ligne contenant les colonnes requises :
ShipmentId,ActivityNameetEventTime. Assurez-vous que tous les attributs recommandés de la requête d'expédition de base sont présents sur chaque ligne pour cette expédition. Cette étape est conceptuellement équivalente à une opération SQLUNION ALL. - Gérer les événements complexes et externes : Pour des activités comme « Dédouané » ou « Paiement traité », les données peuvent résider dans des champs spécifiques ou même dans des systèmes externes. La logique de requête fournie utilise des champs standard comme proxy. Vous devrez peut-être ajuster la requête pour la joindre à des vues CDS spécifiques aux douanes ou la corréler avec une extraction ERP distincte pour les données de paiement basées sur le numéro de Document de Règlement de Fret.
- Formater pour ProcessMind : Enregistrez le jeu de données consolidé final sous forme de fichier CSV. Assurez-vous que les en-têtes de colonne correspondent aux exigences de téléchargement, par exemple, en mappant votre colonne
ShipmentIdau champCaseIddans les paramètres de l'outil. Vérifiez que les horodatages sont dans un format cohérent, de préférence UTC (AAAA-MM-JJTHH:MM:SSZ).
Configuration
- Vues CDS principales : L'extraction s'appuie principalement sur I_TransportationOrder (pour les commandes de transport), C_TranspOrdExecutionEvent (pour les événements d'exécution), I_ForwardingOrder (pour les demandes de transport) et I_FreightSettlementDocument (pour le règlement).
- Filtrage par plage de dates : Il est essentiel d'appliquer un filtre de date pour gérer le volume de données. Utilisez le champ
CreationDateTimesur I_TransportationOrder ou le champActualBusinessDateTimesur C_TranspOrdExecutionEvent. Une plage de 3 à 6 mois est recommandée pour une analyse initiale. - Filtrage par type de document : Pour affiner l'analyse, filtrez sur des types de documents spécifiques à l'aide du champ
TransportationOrderType. Cela permet de distinguer différents scénarios logistiques, tels que les expéditions sortantes standard des transferts de stock. - Filtres organisationnels : Le cas échéant, filtrez par
PurchasingOrganizationou d'autres champs de niveau organisationnel pour limiter les données à une unité commerciale ou une région spécifique. - Pagination de l'API : Pour les grands jeux de données, utilisez les paramètres OData
$topet$skippour récupérer les données par pages plus petites. Cela évite les délais d'attente de l'API et réduit la consommation de mémoire côté client. Une taille de page de 1000 à 5000 lignes est souvent efficace. - Prérequis : L'utilisateur ou le compte de service effectuant l'extraction nécessite des autorisations pour les services OData sous-jacents (objet d'autorisation S_SERVICE) et les données commerciales au sein des vues CDS. Les services correspondants doivent être activés dans la passerelle SAP (
/IWFND/MAINT_SERVICE).
a Exemple de requête sql
WITH Shipments AS (
SELECT
TransportationOrder AS ShipmentId,
CarrierName,
TranspOrdExecutionBlockRsnCode,
TransportationMode AS ModeOfTransport,
ShippingType AS ShipmentType,
CreationDateTime AS ShipmentCreationTime,
LastChangeDateTime,
LifeCycleStatus,
ConfirmationStatus,
OverallExecutionStatus,
DeliveryOverallStatus,
PlannedDepDateTimeReqByCust AS RequestedDeliveryDate,
TotalChargesAmountInTransacCrcy AS TotalFreightCost
FROM I_TransportationOrder
WHERE
CreationDateTime >= '[START_DATE]' AND CreationDateTime <= '[END_DATE]'
-- AND TransportationOrderType IN ('[Your_Type_1]', '[Your_Type_2]')
)
SELECT
fwo.PurchasingDocument AS ShipmentId,
'Transportation Request Received' AS ActivityName,
fwo.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM I_ForwardingOrder AS fwo
LEFT JOIN Shipments s ON fwo.PurchasingDocument = s.ShipmentId
WHERE fwo.CreationDateTime >= '[START_DATE]' AND fwo.CreationDateTime <= '[END_DATE]'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Planned' AS ActivityName,
s.ShipmentCreationTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
UNION ALL
SELECT
s.ShipmentId,
'Carrier Assigned' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CarrierName IS NOT NULL
UNION ALL
SELECT
s.ShipmentId,
'Shipment Confirmed By Carrier' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.ConfirmationStatus = 'C' -- 'Confirmed'
UNION ALL
SELECT
s.ShipmentId,
'Goods Picked Up' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'DEPARTURE'
UNION ALL
SELECT
s.ShipmentId,
'Customs Declaration Filed' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsRelevance IS NOT NULL -- This is a proxy, system config dependent
UNION ALL
SELECT
s.ShipmentId,
'Customs Cleared' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsOverallStatus = '4' -- 'Customs Cleared'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Rerouted' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.TranspOrdExecutionBlockRsnCode = '[Your Rerouting Reason Code]'
UNION ALL
SELECT
s.ShipmentId,
'Goods Delivered' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'ARRIVAL_AT_DESTINATION'
UNION ALL
SELECT
s.ShipmentId,
'Proof Of Delivery Received' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.DeliveryOverallStatus = 'C' -- 'POD Received'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Settlement Created' AS ActivityName,
fsd.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Dispute Created' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.DisputeStatus = '1' -- 'In Dispute'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Invoice Verified' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.OverallLifeCycleStatus = '06' -- 'Posted for Accruals'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Cancelled' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.LifeCycleStatus = 'X' -- 'Cancelled'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Payment Processed' AS ActivityName,
fsd.LastChangeDateTime AS EventTime, -- Approximation, actual payment is in ERP
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.InvoiceProcessingStatus = 'C' -- 'Completely Invoiced' Étapes
- Définir les exigences en matière de données : Commencez par confirmer la logique exacte pour chacune des 15 activités requises et tous les attributs. Cela implique de mapper chaque activité à des changements de statut spécifiques, des événements de création ou des liens documentaires au sein de votre système SAP TM. Par exemple, déterminez le statut d'exécution exact qui signifie « Marchandises enlevées ».
- Accéder à l'environnement de développement ABAP : Connectez-vous à la SAP GUI et accédez à l'éditeur ABAP à l'aide du code de transaction
SE38. Saisissez un nom pour votre nouveau programme, par exempleZTM_PROCESS_EXTRACT, et cliquez sur « Créer ». Donnez un titre et définissez le type de programme sur « Programme exécutable ». - Créer l'écran de sélection : Dans le programme, définissez l'écran de sélection que les utilisateurs verront. Cela devrait inclure des paramètres de filtrage des données, tels qu'une plage de dates pour la date de création de la commande de transport (
SO_CREDT), et des options de sélection pour les types de documents (SO_TYPE) ou les transporteurs (SO_CARR). - Définir la structure de sortie : Définissez une structure de table interne qui correspond au format du journal d'événements requis. Cette structure doit inclure des champs pour
ShipmentId,ActivityName,EventTime,EndTime,CarrierName,RequestedDeliveryDate,ModeOfTransport,TotalFreightCostetIsOnTimeDelivery. - Mettre en œuvre la logique de sélection des données : Écrivez la logique ABAP principale pour sélectionner les données de chacune des 15 activités. Cela implique généralement d'interroger plusieurs tables SAP TM. Commencez par sélectionner les documents d'expédition primaires, tels que les Commandes de transport, dans la plage de dates spécifiée.
- Extraire les événements de planification et d'exécution : Pour chaque document d'expédition sélectionné (par exemple, une Commande de transport), interrogez les tables et objets commerciaux liés pour trouver les horodatages des différents événements. Utilisez la table
/SCMTMS/D_TORROTpour la création de la Commande de transport (« Expédition planifiée »), l'attribution du transporteur (« Transporteur assigné ») et les changements de statut d'exécution qui correspondent à « Marchandises enlevées » et « Marchandises livrées ». La création de l'Ordre d'acheminement précédent (/SCMTMS/D_TRQROT) peut signifier « Demande de transport reçue ». - Extraire la confirmation du transporteur et le réacheminement : Interrogez les tables de statut ou les documents de modification (CDHDR/CDPOS) associés à la Commande de transport pour identifier quand le statut
CONFIRMATIONa été défini, ce qui capture « Expédition confirmée par le transporteur ». De même, recherchez les changements significatifs dans les informations de routage pour capturer « Expédition réacheminée ». - Extraire les événements douaniers : Si vous utilisez SAP Global Trade Services (GTS) ou un module similaire, les événements douaniers (« Déclaration en douane déposée », « Dédouané ») sont souvent suivis via des documents liés. La logique doit lire le flux de documents (
/SCMTMS/D_TORDOC) de la Commande de transport pour trouver ces documents liés et leurs heures de création ou de modification de statut. - Extraire les événements de règlement et de litige : Interrogez la table d'en-tête du Document de Règlement de Fret (
/SCMTMS/D_SFIRHD) et ses éléments et statuts liés pour capturer les événements « Règlement de fret créé », « Litige de fret créé » et « Facture vérifiée ». Reliez-les à l'originalShipmentId. - Consolider les données : Pour chaque événement trouvé, créez un nouvel enregistrement dans votre table interne finale. Remplissez le champ
ActivityNameavec l'activité correspondante, le champEventTimeavec l'horodatage de l'événement et le champShipmentIdavec l'ID de la Commande de transport ou de la Réservation de transport. Remplissez les autres attributs à partir des documents source. - Formater et exporter le fichier : Une fois la table interne finale entièrement remplie, formatez les données dans un fichier plat. Utilisez les commandes
OPEN DATASET,LOOP AT... TRANSFER...etCLOSE DATASETpour écrire le contenu de la table interne dans un fichier CSV ou TXT sur le serveur d'applications SAP (accessible via la transaction AL11). - Planifier et récupérer : Le programme ABAP peut être planifié pour s'exécuter en tâche de fond (transaction SM36) afin d'extraire automatiquement les données. Le fichier généré peut ensuite être téléchargé du serveur d'applications vers une machine locale à l'aide de la transaction
CG3Ypour être téléversé dans ProcessMind.
Configuration
- Plage de dates : L'écran de sélection doit inclure une plage de dates obligatoire pour la date de création du document de transport principal (par exemple, Commande de transport). Pour une analyse initiale, une plage de 3 à 6 mois est recommandée pour garantir un jeu de données représentatif sans entraîner un temps d'exécution excessif.
- Filtre par type de document : Fournissez un filtre pour le type de document de transport (par exemple, Commande de transport, Réservation de transport). Ceci est crucial pour concentrer l'analyse sur des processus spécifiques comme le fret routier par rapport au fret maritime.
- Filtre par transporteur : Permettez aux utilisateurs de filtrer par transporteurs spécifiques. Cela aide à analyser la performance des partenaires logistiques individuels.
- Filtres organisationnels : Incluez des filtres pour les unités organisationnelles pertinentes, telles que
PurchasingOrganizationouCompany Code, afin de limiter l'extraction à des domaines d'activité spécifiques. - Optimisation des performances : Pour les grands jeux de données, assurez-vous que le code ABAP utilise des champs de base de données indexés dans les clauses
WHERE, évite les boucles imbriquées si possible, et ne sélectionne que les champs nécessaires de la base de données pour minimiser la consommation de mémoire. - Prérequis : L'utilisateur exécutant le rapport a besoin d'une autorisation pour exécuter des programmes ABAP. Le développeur nécessite l'autorisation
S_DEVELOP. Le programme lui-même nécessite des autorisations pour l'accès au système de fichiers sur le serveur d'applications (objetS_DATASET) et l'accès aux tables de base de données TM et aux objets BOPF pertinents.
a Exemple de requête abap
REPORT ztm_process_extract.
*&---------------------------------------------------------------------*
*& Data Structures
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_s_event_log,
shipmentid TYPE /scmtms/tor_id,
activityname TYPE string,
eventtime TYPE timestamp,
endtime TYPE timestamp,
carriername TYPE string,
requesteddeliverydate TYPE timestamp,
modeoftransport TYPE /scmtms/mot,
totalfreightcost TYPE /scmtms/chargeable_weight,
isontimedelivery TYPE abap_bool,
END OF ty_s_event_log.
DATA: lt_event_log TYPE TABLE OF ty_s_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: so_credt FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: so_torid FOR /scmtms/d_torrot-tor_id.
SELECT-OPTIONS: so_carr FOR /scmtms/d_torrot-lsp_id.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA: ls_event_log TYPE ty_s_event_log.
" Select base data: Freight Orders (Shipments)
SELECT tor_id, tor_cat, lsp_id, mot_code, cretd_tst, btd_tstmp_end
FROM /scmtms/d_torrot
INTO TABLE @DATA(lt_tor_root)
WHERE CAST( cretd_tst AS DATS ) IN @so_credt
AND tor_id IN @so_torid
AND lsp_id IN @so_carr.
IF lt_tor_root IS INITIAL.
MESSAGE 'No data found for the given selection.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
" Loop through each shipment to build the event log
LOOP AT lt_tor_root INTO DATA(ls_tor_root).
" 1. Transportation Request Received (Approximation from FWO creation)
SELECT SINGLE created_at_utc FROM /scmtms/d_trqrot
WHERE db_key IN ( SELECT trq_root_key FROM /scmtms/d_tordoc
WHERE parent_key = @ls_tor_root-db_key AND bo_node_cat = 'TRQ_ROOT' )
INTO @DATA(lv_trq_created_ts).
IF sy-subrc = 0.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Transportation Request Received'.
ls_event_log-eventtime = lv_trq_created_ts.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 2. Shipment Planned
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Planned'.
ls_event_log-eventtime = ls_tor_root-cretd_tst.
APPEND ls_event_log TO lt_event_log.
" 3. Carrier Assigned
IF ls_tor_root-lsp_id IS NOT INITIAL.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Carrier Assigned'.
ls_event_log-eventtime = ls_tor_root-cretd_tst. " Approximated with creation time
APPEND ls_event_log TO lt_event_log.
ENDIF.
" Get statuses from /SCMTMS/D_TORSTA
SELECT status, tstmp FROM /scmtms/d_torsta
INTO TABLE @DATA(lt_statuses)
WHERE parent_key = @ls_tor_root-db_key.
" 4. Shipment Confirmed By Carrier
READ TABLE lt_statuses WITH KEY status = 'CONFIRMED' INTO DATA(ls_conf_status).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Confirmed By Carrier'.
ls_event_log-eventtime = ls_conf_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 5. Goods Picked Up
READ TABLE lt_statuses WITH KEY status = 'LOADING_END' INTO DATA(ls_pickup_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Goods Picked Up'.
ls_event_log-eventtime = ls_pickup_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 6. Customs Declaration Filed (Placeholder logic)
" 7. Customs Cleared (Placeholder logic)
" 8. Shipment Rerouted (Placeholder logic, needs change documents)
" 9. Goods Delivered
READ TABLE lt_statuses WITH KEY status = 'UNLOADING_END' INTO DATA(ls_delivery_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Goods Delivered'.
ls_event_log-eventtime = ls_delivery_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 10. Proof Of Delivery Received
READ TABLE lt_statuses WITH KEY status = 'POD_RECEIVED' INTO DATA(ls_pod_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Proof Of Delivery Received'.
ls_event_log-eventtime = ls_pod_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 11. Freight Settlement Created
SELECT SINGLE created_at_utc FROM /scmtms/d_sfirhd
WHERE db_key IN ( SELECT sfir_root_key FROM /scmtms/d_tordoc
WHERE parent_key = @ls_tor_root-db_key AND bo_node_cat = 'SFIR_ROOT' )
INTO @DATA(lv_fsd_created_ts).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Freight Settlement Created'.
ls_event_log-eventtime = lv_fsd_created_ts.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 12. Freight Dispute Created (Needs logic based on dispute status in SFIR)
" 13. Invoice Verified (Needs logic based on invoice status in SFIR)
" 14. Shipment Cancelled
READ TABLE lt_statuses WITH KEY status = 'CANCELLED' INTO DATA(ls_cancel_status).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Cancelled'.
ls_event_log-eventtime = ls_cancel_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 15. Payment Processed (Data is typically in the ERP system, not TM)
ENDLOOP.
" Final step: Write lt_event_log to a file on the application server
DATA(lv_filepath) = '/usr/sap/trans/[YourInstance]/[YourFileName].csv'.
OPEN DATASET lv_filepath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'ShipmentId,ActivityName,EventTime'.
TRANSFER lv_header TO lv_filepath.
" Write data
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |{ ls_event_log-shipmentid },{ ls_event_log-activityname },{ ls_event_log-eventtime }|.
TRANSFER lv_line TO lv_filepath.
ENDLOOP.
CLOSE DATASET lv_filepath.
ELSE.
MESSAGE 'Error opening file on application server.' TYPE 'E'.
ENDIF.
ENDFOR.