Seu Template de Dados de Gestão da Cadeia de Suprimentos
Seu Template de Dados de Gestão da Cadeia de Suprimentos
- Atributos recomendados para coletar
- Atividades-chave a monitorizar
- Orientação para Extração
Atributos de Gestão da Cadeia de Suprimentos
| Nome | Descrição | ||
|---|---|---|---|
| Nome da Atividade ActivityName | O nome da atividade de negócio ou evento que ocorreu em um ponto específico do processo da cadeia de suprimentos. | ||
| Descrição Este atributo descreve uma etapa ou marco específico no ciclo de vida do pedido de logística, como "Pedido de Compra Emitido" ou "Saída de Mercadoria Lançada". Estas atividades formam a sequência de eventos que constituem o processo. Analisar a sequência de atividades é a essência do Process Mining. Isso permite a descoberta do fluxo real do processo, a comparação com os procedimentos operacionais padrão e a identificação de etapas que causam atrasos ou exigem retrabalho. Por que é importante Define as etapas do processo, o que é fundamental para descobrir mapas de processos, analisar variantes e medir tempos de ciclo entre atividades. Onde obter Gerado pelo mapeamento de códigos de transação ou mudanças de status de várias tabelas SAP (ex: EKKO, LIKP, VBUK) para nomes de atividades amigáveis durante a transformação dos dados. Exemplos Pedido de Compra EmitidoEntrada de Mercadoria para Pedido LançadaEntrega de Saída CriadaComprovante de entrega confirmado | |||
| Pedido Logístico LogisticsOrder | O identificador exclusivo para um único processo de cadeia de suprimentos de ponta a ponta, desde a demanda inicial até a confirmação final da entrega. | ||
| Descrição O Pedido de Logística serve como o principal identificador de caso, conectando todas as atividades relacionadas a uma solicitação específica de demanda ou atendimento na cadeia de suprimentos. Essa abordagem permite rastrear todo o ciclo de vida da jornada de um produto, do planejamento e compras à produção e distribuição, garantindo uma visão abrangente do processo. No Process Mining, a análise por Pedido de Logística revela o caminho completo percorrido para atender a uma demanda. Isso ajuda a identificar variantes comuns, gargalos e desvios em toda a cadeia de suprimentos, em vez de olhar para processos isolados, como compras ou vendas, separadamente. Por que é importante Esta é a chave essencial para conectar todos os eventos relacionados em uma única instância de processo, permitindo a análise de ponta a ponta da cadeia de suprimentos. Onde obter Este é um identificador conceitual e pode precisar ser construído vinculando vários números de documentos, como um número de Pedido de Venda com seus números subsequentes de Pedido de Compra e Entrega. Consulte a documentação da Cadeia de Suprimentos do SAP S/4HANA ou um especialista no assunto. Exemplos LO-4500078192LO-4500078193LO-4500078194 | |||
| Tempo do Evento EventTime | O carimbo de data/hora que indica quando a atividade ocorreu, incluindo data e hora. | ||
| Descrição Este atributo fornece a data e a hora precisas para cada atividade no processo. Ele serve como a espinha dorsal cronológica do Event Log, ordenando as etapas do processo conforme aconteceram na realidade. O Horário do Evento é crucial para todas as análises baseadas em tempo. Ele é usado para calcular tempos de ciclo entre atividades, medir o lead time total de um processo, identificar tendências de desempenho ao longo do tempo e localizar quando os gargalos têm maior probabilidade de ocorrer. Por que é importante Este carimbo de data/hora é essencial para calcular todas as durações e métricas de desempenho, permitindo a análise de gargalos e lead times. Onde obter Extraído de campos de timestamp associados à criação de documentos ou mudanças de status nas tabelas principais do SAP, como CDHDR/CDPOS para documentos de alteração, ou campos de data/hora específicos como ERDAT/ERZET em tabelas de cabeçalho. Exemplos 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Sistema de Origem SourceSystem | O sistema de onde os dados se originaram. | ||
| Descrição Identifica a instância específica do sistema de origem onde os dados do evento foram gerados. Em ambientes complexos, uma empresa pode ter várias instâncias de SAP S/4HANA para diferentes regiões ou unidades de negócio. Este atributo é importante para a governança de dados e para segmentar a análise. Ele permite que os analistas comparem a performance do processo entre diferentes sistemas ou isolem dados de uma fonte única e autoritativa. Por que é importante Fornece um contexto crítico para a origem dos dados, o que é importante para a validação e para comparar processos em diferentes ambientes de sistema. Onde obter Geralmente é um valor estático adicionado durante o processo de extração para identificar a origem, por exemplo, o ID do Sistema SAP (SAPSID). Exemplos S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Última Atualização de Dados LastDataUpdate | O registro de data/hora de quando os dados foram atualizados ou extraídos pela última vez do sistema de origem. | ||
| Descrição Este atributo indica a última vez que os dados do Event Log foram atualizados. Ele fornece uma data de "atualização" para os dados analisados, garantindo que os usuários saibam o quão recentes eles são. Em qualquer análise, entender a atualidade dos dados é crucial para tomar decisões informadas. Esse carimbo de data/hora ajuda os usuários a confiar nas informações e entender a janela de tempo coberta pelos dashboards e KPIs. Por que é importante Garante transparência sobre a atualização dos dados, permitindo que os usuários saibam quão recente é a análise do processo. Onde obter Este é um campo de metadados normalmente gerado e preenchido pela ferramenta de extração de dados ou ETL ao final de uma atualização de dados bem-sucedida. Exemplos 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Centro Plant | A instalação de fabricação ou distribuição onde a atividade ocorreu. | ||
| Descrição O Centro (Plant) é uma unidade organizacional do SAP que representa um local onde as mercadorias são produzidas, armazenadas ou distribuídas. Ele fornece o contexto geográfico ou funcional para as atividades do processo. Analisar o desempenho do processo por Centro é um requisito comum. Isso permite o benchmarking e a comparação de eficiência, produtividade e conformidade entre diferentes unidades operacionais, ajudando a identificar as melhores práticas ou locais que precisam de melhorias. Por que é importante Oferece uma dimensão geográfica ou organizacional para análise, permitindo a comparação de desempenho entre diferentes unidades. Onde obter Encontrado em muitas tabelas de itens de documento, como VBAP (Vendas), EKPO (Compras) e LIPS (Remessa). O campo é geralmente chamado de WERKS. Exemplos 100021003500 | |||
| Data de entrega solicitada RequestedDeliveryDate | A data em que o fornecedor foi solicitado a entregar as mercadorias. | ||
| Descrição Esta é a data de entrega especificada no pedido de compra, representando a meta para o fornecedor. Ela serve como a base contra a qual o desempenho real da entrega é medido. Esta data é essencial para o cálculo do KPI de Taxa de Entrega no Prazo do Fornecedor. Ao comparar a data real do Recebimento de Mercadorias com esta data solicitada, a empresa pode medir objetivamente se os fornecedores estão cumprindo seus compromissos. Por que é importante Esta é a data de referência usada para calcular o KPI de "Taxa de Entrega no Prazo do Fornecedor", sendo fundamental para a gestão de desempenho de fornecedores. Onde obter Encontrado na tabela de itens do pedido de compra EKPO, com o nome de campo EINDT (Data de Entrega). Exemplos 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Nome do Cliente CustomerName | O nome do cliente para o qual o pedido está sendo atendido. | ||
| Descrição Este atributo identifica o cliente final associado a um pedido de venda e às atividades de atendimento subsequentes. Ele fornece contexto para o lado da demanda no processo da cadeia de suprimentos. No Process Mining, analisar por cliente ajuda a identificar diferentes padrões de atendimento ou níveis de desempenho para contas principais. É usado em dashboards como a Análise de Atraso no Comprovante de Entrega para ver se certos clientes atrasam as confirmações consistentemente. Por que é importante Permite segmentar a análise por cliente, revelando comportamentos específicos, gargalos ou desempenho de acordos de nível de serviço (SLA). Onde obter O número do cliente (KUNNR) é armazenado em documentos de vendas (ex: tabela VBAK). O nome é recuperado da tabela mestra central de clientes KNA1. Exemplos Retail CorpInnovate SolutionsParceiros de Manufatura | |||
| Nome do Fornecedor SupplierName | O nome do fornecedor associado às atividades de compras. | ||
| Descrição Este atributo identifica o fornecedor de quem as mercadorias ou serviços são adquiridos. Geralmente está associado a atividades como "Requisição de Compra Criada" e "Pedido de Compra Emitido". O Nome do Fornecedor é essencial para o dashboard de Desempenho de Entrega do Fornecedor. Ele permite filtrar e segmentar os dados para comparar taxas de entrega no prazo, lead times e níveis de qualidade entre diferentes fornecedores, o que é crítico para a gestão estratégica de suprimentos. Por que é importante Permite a análise de performance por fornecedor, o que é crucial para otimizar o processo de compras e avaliar a confiabilidade do fornecedor. Onde obter O número do fornecedor (LIFNR) é armazenado em documentos de compras (ex: tabelas EKKN, EBAN). O nome é recuperado da tabela mestra central de fornecedores LFA1. Exemplos Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Número do Material MaterialNumber | O identificador exclusivo do produto ou material sendo processado. | ||
| Descrição O Número do Material, muitas vezes chamado de SKU, é o código exclusivo para um produto específico no SAP. Ele vincula as atividades do processo às mercadorias físicas ou digitais que estão sendo fabricadas, compradas ou enviadas. Este atributo é vital para análises centradas no produto. Ele ajuda a identificar se certos produtos são mais propensos a problemas de qualidade, atrasos na produção ou faltas no estoque. Os dashboards podem ser filtrados por material para investigar o desempenho de linhas de produtos específicas. Por que é importante Permite análise ao nível do produto para identificar se problemas como atrasos ou falhas de qualidade estão concentrados em materiais específicos. Onde obter Encontrado em tabelas de nível de item para a maioria dos documentos, como VBAP para Ordens de Venda, EKPO para Pedidos de Compra e LIPS para Remessas. O campo é geralmente chamado de MATNR. Exemplos FG-100-ARM-2034-BSA-5500 | |||
| Resultado da Inspeção de Qualidade QualityInspectionResult | O resultado de uma inspeção de qualidade, como "Aprovado" ou "Reprovado". | ||
| Descrição Este atributo registra o resultado de uma verificação de qualidade realizada em mercadorias produzidas ou recebidas. O resultado determina se as mercadorias podem prosseguir para a próxima etapa ou se exigem retrabalho, devolução ou descarte. Este é um atributo crítico para o KPI e dashboard de Taxas de Rejeição do Controle de Qualidade. Analisar a frequência e os motivos das falhas ajuda a identificar problemas de qualidade sistêmicos com produtos, fornecedores ou linhas de produção específicos. Por que é importante Suporta diretamente o cálculo de KPIs de qualidade e ajuda a identificar fontes de baixa qualidade na cadeia de suprimentos. Onde obter Essas informações costumam ser armazenadas no módulo de Quality Management (QM). Os dados podem vir de tabelas de lotes de inspeção, como a QALS, e códigos de decisão de utilização na QAVE. Exemplos AprovadoFalhouRetrabalho NecessárioAprovado com Desvio | |||
| Usuário Executor ExecutingUser | ID do usuário da pessoa que executou a atividade. | ||
| Descrição Este atributo captura o nome de usuário ou ID do funcionário no SAP que realizou a atividade, como a criação de um pedido de compra ou o lançamento de um recebimento de mercadorias. Ele vincula as etapas do processo aos recursos humanos envolvidos. Analisar por usuário ajuda a entender a distribuição da carga de trabalho, identificar necessidades de treinamento e detectar diferenças de desempenho entre indivíduos ou equipes. Também é valioso para análise de conformidade para ver quem realizou etapas críticas do processo. Por que é importante Atribui atividades a usuários específicos, permitindo análise de carga de trabalho, comparação de performance e investigação de ações fora de conformidade. Onde obter Encontrado nos campos 'Criado por' ou 'Alterado por' em muitas tabelas SAP, como ERNAM em EKKO (Cabeçalho de Pedido), LIKP (Cabeçalho de Remessa) e VBRK (Cabeçalho de Fatura). Exemplos CBROWNJSMITHASINGH | |||
| É Retrabalho IsRework | Um indicador que sinaliza se uma atividade ou sequência de atividades representa retrabalho. | ||
| Descrição Este atributo booleano sinaliza atividades que são repetições de etapas anteriores no processo, indicando alguma forma de retrabalho ou correção. Por exemplo, se uma "Inspeção de Qualidade" for seguida por uma etapa de "Ordem de Produção Criada" e depois outra "Inspeção de Qualidade", a segunda inspeção poderia ser sinalizada como retrabalho. Identificar o retrabalho é fundamental para entender a ineficiência do processo e os custos ocultos. Esta sinalização ajuda a quantificar a frequência e o impacto dos loops de retrabalho, apoiando o cálculo do KPI de Taxa de Erros no Processamento de Pedidos e destacando áreas para melhoria. Por que é importante Ajuda a quantificar ineficiências do processo ao identificar e contar explicitamente atividades que fazem parte de um ciclo de retrabalho. Onde obter Isso normalmente é calculado dentro da ferramenta de Process Mining, identificando sequências repetidas de atividades dentro do mesmo caso. Exemplos verdadeirofalse | |||
| End Time EndTime | O carimbo de data/hora que indica quando uma atividade foi concluída, usado para calcular o tempo de processamento. | ||
| Descrição O Horário de Término marca a conclusão de uma atividade específica. Enquanto o Horário de Início (EventTime) indica quando uma atividade começa, o Horário de Término é necessário para entender quanto tempo uma atividade levou para ser executada, especialmente para aquelas que não são instantâneas. Na análise, ter os horários de início e término permite a medição precisa do tempo de processamento versus o tempo de espera. Isso ajuda a distinguir entre o tempo gasto trabalhando ativamente em uma tarefa e o tempo de espera pelo próximo passo, o que é fundamental para identificar oportunidades de eficiência. Por que é importante Permite o cálculo preciso dos tempos de processamento das atividades, ajudando a diferenciar trabalho que agrega valor de tempo de espera. Onde obter Pode ser derivado de mudanças de status no SAP. Por exemplo, o início é uma atualização para 'Em Processamento' e o fim é uma atualização para 'Concluído' em tabelas como JEST/JCDS. Para eventos instantâneos, o EndTime pode ser igual ao StartTime. Exemplos 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Entrega atrasada IsLateDelivery | Um sinalizador booleano que indica se a entrega de um fornecedor foi feita após a data de entrega solicitada. | ||
| Descrição Esta sinalização calculada fornece um indicador simples de verdadeiro ou falso se uma entrega foi feita no prazo. Ela é derivada da comparação do carimbo de data/hora da atividade "Recebimento de Mercadoria para PO Lançado" com o atributo "Data de Entrega Solicitada". Este atributo simplifica a criação de dashboards e KPIs relacionados ao desempenho do fornecedor. Ele permite filtragem e agregação rápidas para calcular a Taxa de Entrega no Prazo do Fornecedor e identificar quais parceiros, materiais ou regiões apresentam atrasos mais frequentes. Por que é importante Simplifica a análise de desempenho do fornecedor ao fornecer um resultado binário claro para cada entrega, o que é essencial para o KPI de entrega no prazo. Onde obter Este é um campo calculado. A lógica é: SE ('Recebimento de Mercadoria para PO Lançado'.EventTime > PurchaseOrder.RequestedDeliveryDate) ENTÃO Verdadeiro SENÃO Falso. Exemplos verdadeirofalse | |||
| Nome da Transportadora CarrierName | O nome da transportadora ou agente de carga que lida com a remessa. | ||
| Descrição O Nome da Transportadora identifica o prestador de serviços logísticos responsável pelo transporte de mercadorias entre locais, por exemplo, de um armazém para um cliente. Este atributo é essencial para o dashboard de Análise de Ciclo de Tempo de Transporte. Ele permite comparar tempos de trânsito, custos e confiabilidade entre diferentes transportadoras, possibilitando um melhor planejamento logístico e seleção de parceiros. Por que é importante Permite a análise de performance por provedor de transporte, essencial para otimizar custos logísticos e prazos de entrega. Onde obter O ID da transportadora (agente de carga) é armazenado em documentos de remessa, como a tabela VTTK (Cabeçalho da Remessa). O nome é recuperado de tabelas de dados mestres como a LFA1. Exemplos DHLFedExMaersk Logistics | |||
| Número do Pedido de Compra PurchaseOrderNumber | O identificador exclusivo para o documento de Pedido de Compra (PO). | ||
| Descrição O Número do Pedido de Compra é o número oficial do documento usado para encomendar materiais de um fornecedor. É um identificador chave na parte de suprimentos da cadeia. Este atributo permite mergulhos profundos no processo de compras. Ele é usado no dashboard de Ciclo de Tempo de Compras Ponta a Ponta e para calcular o KPI de Taxa de Entrega no Prazo do Fornecedor, conectando atividades de requisição, pedido, recebimento e pagamento. Por que é importante Serve como um identificador principal para detalhar o subprocesso de compras e vincular eventos de suprimento relacionados. Onde obter Encontrado na tabela de cabeçalho de Pedido de Compra EKKO e na tabela de itens EKPO. O campo chama-se EBELN. Exemplos 450007819245000781934500078194 | |||
| Número do pedido de venda SalesOrderNumber | O identificador exclusivo para o documento de Pedido de Venda (SO). | ||
| Descrição O Número do Pedido de Venda é o número oficial do documento que confirma uma venda a um cliente. É um identificador fundamental na parte de Order-to-Cash da cadeia de suprimentos. Este atributo é crucial para rastrear o atendimento de um pedido específico. Ele ajuda a vincular a solicitação inicial do cliente a todas as atividades subsequentes, como entrega e faturamento, servindo de base para a Análise de Lead Time de Atendimento de Pedidos. Por que é importante Atua como o identificador principal do subprocesso de atendimento de pedidos, vinculando a demanda do cliente à logística e à liquidação financeira. Onde obter Encontrado na tabela de cabeçalho de Ordem de Venda VBAK e na tabela de itens VBAP. O campo chama-se VBELN. Exemplos 100023451000234610002347 | |||
| Quantidade do pedido OrderQuantity | A quantidade do material no item da linha do pedido. | ||
| Descrição Este atributo especifica o número de unidades de um material solicitado em um item de linha de pedido de venda ou pedido de compra. Ele fornece uma medida de volume para cada transação. Analisar por quantidade ajuda a priorizar a análise em pedidos de alto volume, que podem ter um impacto maior no negócio. Também pode ser usado para normalizar outras métricas, como o cálculo do custo por unidade, ou para entender como o tamanho do pedido afeta os tempos de processamento. Por que é importante Fornece contexto de volume às transações, permitindo a análise de impacto e a segmentação de casos por tamanho. Onde obter Encontrado em tabelas de nível de item, como MENGE em EKPO (Pedido de Compra) ou KWMENG em VBAP (Ordem de Venda). Exemplos 100500025 | |||
| Tempo de Processamento ProcessingTime | A duração do tempo gasto a trabalhar ativamente numa atividade. | ||
| Descrição O Tempo de Processamento é a duração calculada entre o início e o fim de uma atividade. Ele representa o trabalho real ou o "tempo de toque" em uma etapa do processo, ao contrário do tempo de espera entre as etapas. Esta métrica é fundamental para identificar ineficiências. Ao isolar o tempo de processamento do tempo de espera, os analistas podem determinar se os atrasos são causados pela execução lenta das tarefas ou por longas filas e demora nas transferências entre departamentos ou sistemas. Por que é importante Ajuda a distinguir o tempo de trabalho ativo do tempo de espera ocioso, o que é crítico para identificar as verdadeiras fontes de atraso no processo. Onde obter Calculado subtraindo o StartTime da atividade do seu EndTime (EndTime - StartTime). Exemplos PT1H30MPT8HP2D | |||
Atividades de Gestão da Cadeia de Suprimentos
| Atividade | Descrição | ||
|---|---|---|---|
| Comprovante de entrega confirmado | Representa a confirmação formal do cliente ou da transportadora de que as mercadorias foram recebidas conforme especificado. Isso geralmente é registrado pela atualização da remessa de saída com as informações de POD (Comprovante de Entrega). | ||
| Por que é importante Esta atividade é o fim definitivo do processo de atendimento. É crucial para o faturamento preciso, a resolução de disputas e a medição da etapa final do ciclo de entrega. Onde obter Este é um evento explícito. A data do comprovante de entrega é registrada na tabela de cabeçalho da entrega (LIKP, campo PODAT) ou em tabelas de POD relacionadas (VLPOD). Captura Use a data do Comprovante de Entrega (LIKP-PODAT) do documento de entrega. Tipo de evento explicit | |||
| Entrada de Mercadoria para Pedido Lançada | Representa o recebimento físico de matérias-primas ou mercadorias de um fornecedor contra um pedido de compra. Este evento é registrado quando as mercadorias são recebidas no armazém ou no Centro. | ||
| Por que é importante Esta atividade conclui a parte da entrega do fornecedor no ciclo de compras. É vital para calcular as taxas de entrega no prazo do fornecedor e entender o desempenho da logística de entrada. Onde obter Este é um evento explícito capturado por meio de um lançamento de documento de material. O carimbo de data/hora do evento está na tabela de cabeçalho do documento de material (MKPF, campo BUDAT). O link para a PO está na tabela de itens (MSEG). Captura Use a data de lançamento (MKPF-BUDAT) do documento de material associado ao pedido de compra. Tipo de evento explicit | |||
| Pedido de Compra Emitido | Marca a criação formal e a emissão de um pedido de compra a um fornecedor externo. Esta atividade converte uma requisição de compra em um compromisso juridicamente vinculativo com um fornecedor. | ||
| Por que é importante Como um marco essencial, esta atividade é crucial para medir os lead times de fornecedores e ciclos de procurement. Ela fornece a base para avaliar a performance de entrega pontual (On-Time Delivery). Onde obter Este é um evento explícito registrado na criação do pedido de compra. O carimbo de data/hora da criação é armazenado na tabela de cabeçalho do pedido de compra (EKKO, campo AEDAT). Captura Use a data de criação do documento (EKKO-AEDAT) para o pedido de compra. Tipo de evento explicit | |||
| Pedido de venda criado | Esta atividade marca a criação de um novo pedido de venda, que registra formalmente a solicitação de mercadorias de um cliente. É um evento explícito gravado quando um usuário salva um novo documento de pedido de venda no sistema. | ||
| Por que é importante Este é o ponto de partida principal para o processo de Order-to-Cash. Analisar o tempo desde este evento até os demais revela o lead time total de atendimento de pedidos e identifica atrasos iniciais de processamento. Onde obter Este evento é registrado explicitamente. Ele pode ser encontrado nos documentos de modificação das tabelas de pedidos de venda (CDHDR/CDPOS) ou usando o carimbo de data/hora de criação na tabela de cabeçalho do pedido de venda (VBAK, campo ERDAT). Captura Use a data de criação (VBAK-ERDAT) e a hora (VBAK-ERZET) para o documento de pedido de venda. Tipo de evento explicit | |||
| Produtos Produzidos | Esta atividade representa a confirmação de que a fabricação das mercadorias foi concluída. Geralmente é registrada como um recebimento de mercadorias da ordem de produção, movendo o produto acabado para o estoque. | ||
| Por que é importante Isso marca o fim do ciclo de produção. O tempo entre a criação da ordem de produção e este evento representa o lead time de fabricação, uma métrica chave para a eficiência produtiva. Onde obter Isso pode ser capturado explicitamente por meio de um lançamento de documento de material (recebimento de mercadorias da ordem de produção) ou inferido a partir da confirmação final da ordem de produção (tabela AFRU) ou de uma alteração de status para "Entregue". Captura Inferir a partir da data de lançamento do documento de material de entrada de mercadoria final para a ordem de produção ou uma mudança de status. Tipo de evento inferred | |||
| Saída de mercadorias contabilizada | Esta atividade representa a saída legal e física das mercadorias do armazém. Ela reduz o estoque e lança o custo das mercadorias vendidas, marcando o envio oficial do pedido. | ||
| Por que é importante Este é um marco crítico que sinaliza o início do período "em trânsito". É o ponto definitivo onde as mercadorias saíram da posse da empresa para entrega. Onde obter Este é um evento explícito que cria um documento de material. O carimbo de data/hora é registrado no cabeçalho do documento de material (MKPF, campo BUDAT) e atualiza o status de movimentação de mercadorias no documento de entrega (LIKP, campo WBSTK). Captura Use a data de lançamento (MKPF-BUDAT) do documento de material de saída de mercadorias associado à remessa de saída. Tipo de evento explicit | |||
| Disponibilidade de Estoque Verificada | Representa a verificação sistêmica ou manual para determinar se os itens solicitados estão em estoque para atender ao pedido de venda. Esta costuma ser uma etapa automatizada durante a criação do pedido de venda, mas pode não ser registrada como um evento discreto. | ||
| Por que é importante Compreender o tempo entre um pedido e esta verificação, bem como seu resultado, ajuda a analisar como os níveis de estoque impactam os tempos de atendimento. Atrasos aqui costumam levar a atividades de compras ou produção. Onde obter Normalmente, este não é um evento explícito. Pode ser inferido a partir da criação da primeira linha de programação confirmada na tabela de itens de pedido de venda (VBEP) ou de mudanças de status dentro do item do pedido. Captura Inferir a partir da atualização do status de confirmação na linha de escalonamento da ordem de venda (tabela VBEP). Tipo de evento inferred | |||
| Embarque criado | Representa a criação de um documento de remessa, que agrupa uma ou mais entregas para o planejamento de transporte. Este documento contém detalhes sobre a transportadora, rota e modal de transporte. | ||
| Por que é importante Esta atividade marca o início do planejamento formal de transporte. Analisar o tempo entre a saída da mercadoria e a conclusão da remessa revela a eficiência do processo de transporte. Onde obter Este é um evento explícito registrado na tabela de cabeçalho da remessa (VTTK, campo ERDAT). Isso faz parte do módulo LE-TRA, que pode não ser utilizado por todas as organizações. Captura Use a data de criação (VTTK-ERDAT) do cabeçalho do documento de remessa. Tipo de evento explicit | |||
| Entrega de Saída Criada | Indica a criação de um documento de entrega, que autoriza a separação e o envio de mercadorias ao cliente. Esta atividade faz a transição do processo da gestão de pedidos para a execução logística. | ||
| Por que é importante Esta é uma etapa fundamental que inicia o processo físico de atendimento. Atrasos entre a criação do pedido e a criação da entrega podem indicar problemas de planejamento ou disponibilidade. Onde obter Este é um evento explícito. O carimbo de data/hora da criação é registrado na tabela de cabeçalho da entrega (LIKP, campo ERDAT). Captura Use a data de criação (LIKP-ERDAT) e a hora (LIKP-ERZET) do cabeçalho do documento de entrega. Tipo de evento explicit | |||
| Fatura do Cliente Criada | Esta atividade marca a criação do documento de faturamento para o cliente com base nas mercadorias ou serviços entregues. Ela inicia a parte final de liquidação financeira do processo. | ||
| Por que é importante Esta atividade é fundamental para analisar o tempo do ciclo de faturamento. Atrasos entre a confirmação da entrega e o faturamento podem impactar negativamente o fluxo de caixa. Onde obter Este é um evento explícito. O carimbo de data/hora da criação é registrado na tabela de cabeçalho do documento de faturamento (VBRK, campo ERDAT). Captura Use a data de criação (VBRK-ERDAT) do cabeçalho do documento de faturamento. Tipo de evento explicit | |||
| Inspeção de Qualidade Realizada | Representa a conclusão de uma verificação de controle de qualidade nos produtos fabricados. O resultado desta inspeção, seja aprovação ou reprovação, é registrado em uma decisão de utilização. | ||
| Por que é importante Esta atividade é crucial para monitorar a qualidade do produto e identificar problemas de produção. Altas taxas de rejeição ou tempos de inspeção longos podem ser gargalos significativos. Onde obter Este é um evento explícito capturado quando uma decisão de utilização é tomada para um lote de inspeção de qualidade. A data da decisão está na tabela QALS (campo PASTRTERM) ou na tabela QAVE. Captura Use o carimbo de data/hora de quando a decisão de utilização é registrada para o lote de inspeção (tabelas QALS/QAVE). Tipo de evento explicit | |||
| Mercadorias Descarregadas no Destino | Esta atividade indica o descarregamento físico das mercadorias no local do cliente. Este evento pode não ser rastreado explicitamente no SAP e muitas vezes precisa ser inferido a partir de dados da transportadora ou eventos subsequentes. | ||
| Por que é importante Isso marca o fim da etapa de trânsito da jornada. A duração desde a saída da mercadoria até este ponto é o tempo de transporte, que é fundamental para a otimização logística. Onde obter Este raramente é um evento explícito no ERP central. Ele pode ser inferido de mensagens EDI de transportadoras, dados do módulo de Transportation Management (TM) ou do carimbo de data/hora do documento de comprovante de entrega, se disponível. Captura Inferir a partir de atualizações de status da transportadora (ex: EDI 214) ou usar o timestamp do Comprovante de Entrega como uma estimativa próxima. Tipo de evento inferred | |||
| Ordem de Produção Criada | Indica que uma ordem de produção foi criada para fabricar os produtos acabados necessários para a ordem de venda. É o início formal do processo de manufatura interna. | ||
| Por que é importante A criação de uma ordem de produção marca o início do lead time de fabricação. Analisar isso ajuda a identificar atrasos entre o sinal de demanda e o início da produção. Onde obter Este é um evento explícito. A data de criação é registrada na tabela de cabeçalho da ordem de produção (AUFK, campo ERDAT). Captura Use a data de criação (AUFK-ERDAT) da tabela de cabeçalho da ordem. Tipo de evento explicit | |||
| Requisição de compra criada | Esta atividade indica a criação de uma solicitação interna para adquirir as mercadorias ou matérias-primas necessárias. Muitas vezes é acionada quando o estoque é insuficiente para atender a um pedido de venda ou cai abaixo de um ponto de reposição. | ||
| Por que é importante Este é o primeiro passo no ciclo de compras. Rastrear sua criação ajuda a identificar atrasos no início da aquisição e apoia a análise do processo de compras de ponta a ponta. Onde obter Este é um evento explícito. O carimbo de data/hora da criação é registrado na tabela de cabeçalho da requisição de compra (EBAN, campo BADAT). Captura Use a data de criação (EBAN-BADAT) para o documento de requisição de compra. Tipo de evento explicit | |||
| Separação Concluída | Esta atividade marca a conclusão do processo físico de coleta de itens no armazém para a remessa de saída. Em muitos sistemas, isso é confirmado quando o status de separação (picking) do documento de entrega é atualizado. | ||
| Por que é importante A separação (picking) eficiente é crítica para a vazão do armazém. Rastrear essa atividade ajuda a identificar gargalos nas operações de armazém e medir a performance do picking. Onde obter Muitas vezes, este não é um único evento discreto, mas pode ser inferido a partir de mudanças de status. É registrado quando o status de separação na tabela de itens de entrega (LIPS, campo KOSTA) é definido como 'C' (Completamente processado). Captura Inferir a partir de documentos de alteração quando o status de picking (LIPS-KOSTA) é atualizado para totalmente separado. Tipo de evento inferred | |||
Guias de Extração
Etapas
- Pré-requisitos: Certifique-se de ter um usuário com autorizações suficientes para acessar as Core Data Services (CDS) views necessárias do SAP S/4HANA. Isso geralmente exige uma role específica atribuída pela equipe de segurança SAP. Você também precisará de um cliente SQL, como DBeaver ou SAP HANA Studio, que possa se conectar ao banco de dados SAP HANA.
- Estabelecer Conexão com o Banco de Dados: Configure seu cliente SQL para conectar ao banco de dados SAP S/4HANA. Você precisará do host do servidor, porta (ex: 3xx15, onde xx é o número da instância), usuário do banco e senha.
- Preparar a Consulta SQL: Copie a query SQL completa fornecida na seção de consulta deste documento para o editor do seu cliente SQL. Esta query foi projetada para extrair todas as atividades especificadas de vários módulos de logística e vendas.
- Definir Parâmetros de Extração: Antes de executar a query, localize os espaços reservados dentro das cláusulas
WHEREde cada subquery. Substitua'YourCompanyCode'pela empresa real que você está analisando e ajuste os espaços de datas como'YYYY-MM-DD'para definir o período de extração desejado. - Executar a Query: Execute o script SQL completo. O tempo de execução variará conforme o intervalo de datas selecionado e o volume de dados. É aconselhável rodar a extração em horários de menor tráfego para minimizar a carga no sistema.
- Revisar Resultados Iniciais: Assim que a query terminar, faça uma varredura rápida na saída no seu cliente SQL. Verifique se há um número razoável de linhas, se as colunas LogisticsOrder, ActivityName e EventTime estão preenchidas e se diversos nomes de atividades aparecem.
- Exportar Dados para CSV: Exporte todo o conjunto de resultados do seu cliente SQL para um arquivo CSV. Escolha a codificação UTF-8 para evitar problemas com caracteres especiais.
- Formatar para Upload: Certifique-se de que os cabeçalhos das colunas no arquivo CSV final correspondam exatamente aos nomes de atributos exigidos para ingestão (ex:
LogisticsOrder,ActivityName,EventTime). Nenhuma transformação adicional deve ser necessária se a query SQL for usada conforme fornecida.
Configuração
- Pré-requisitos: É necessário acesso ao banco de dados SAP HANA subjacente. O usuário do banco deve ter privilégios de
SELECTem todas as CDS views referenciadas na consulta, incluindo I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment e I_BillingDocumentItem. - Filtro de Intervalo de Datas: A consulta fornecida inclui um espaço reservado para filtro de data, geralmente em um campo de data de criação (
CreationDateouDocumentDate). Para uma análise inicial, recomenda-se um período de 3 a 6 meses para garantir um conjunto de dados representativo sem sobrecarregar o sistema. - Filtros de Negócio Essenciais: É crítico filtrar os dados por unidades organizacionais específicas para garantir a relevância. A query está pré-configurada com um espaço reservado para
CompanyCode. Você também pode adicionar filtros paraSalesOrganization,DistributionChannelouPlant, dependendo do escopo da sua análise. - Considerações de Performance: Esta é uma consulta complexa que une várias CDS views volumosas. A execução pode consumir recursos significativos do sistema. Agende as extrações para horários de menor atividade. Para conjuntos de dados muito grandes, considere executar a query em lotes mensais sequenciais menores.
a Consulta de Exemplo 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; Etapas
- Pré-requisitos: Certifique-se de ter um usuário com autorizações suficientes para acessar as Core Data Services (CDS) views necessárias do SAP S/4HANA. Isso geralmente exige uma role específica atribuída pela equipe de segurança SAP. Você também precisará de um cliente SQL, como DBeaver ou SAP HANA Studio, que possa se conectar ao banco de dados SAP HANA.
- Estabelecer Conexão com o Banco de Dados: Configure seu cliente SQL para conectar ao banco de dados SAP S/4HANA. Você precisará do host do servidor, porta (ex: 3xx15, onde xx é o número da instância), usuário do banco e senha.
- Preparar a Consulta SQL: Copie a query SQL completa fornecida na seção de consulta deste documento para o editor do seu cliente SQL. Esta query foi projetada para extrair todas as atividades especificadas de vários módulos de logística e vendas.
- Definir Parâmetros de Extração: Antes de executar a query, localize os espaços reservados dentro das cláusulas
WHEREde cada subquery. Substitua'YourCompanyCode'pela empresa real que você está analisando e ajuste os espaços de datas como'YYYY-MM-DD'para definir o período de extração desejado. - Executar a Query: Execute o script SQL completo. O tempo de execução variará conforme o intervalo de datas selecionado e o volume de dados. É aconselhável rodar a extração em horários de menor tráfego para minimizar a carga no sistema.
- Revisar Resultados Iniciais: Assim que a query terminar, faça uma varredura rápida na saída no seu cliente SQL. Verifique se há um número razoável de linhas, se as colunas LogisticsOrder, ActivityName e EventTime estão preenchidas e se diversos nomes de atividades aparecem.
- Exportar Dados para CSV: Exporte todo o conjunto de resultados do seu cliente SQL para um arquivo CSV. Escolha a codificação UTF-8 para evitar problemas com caracteres especiais.
- Formatar para Upload: Certifique-se de que os cabeçalhos das colunas no arquivo CSV final correspondam exatamente aos nomes de atributos exigidos para ingestão (ex:
LogisticsOrder,ActivityName,EventTime). Nenhuma transformação adicional deve ser necessária se a query SQL for usada conforme fornecida.
Configuração
- Pré-requisitos: É necessário acesso ao banco de dados SAP HANA subjacente. O usuário do banco deve ter privilégios de
SELECTem todas as CDS views referenciadas na consulta, incluindo I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment e I_BillingDocumentItem. - Filtro de Intervalo de Datas: A consulta fornecida inclui um espaço reservado para filtro de data, geralmente em um campo de data de criação (
CreationDateouDocumentDate). Para uma análise inicial, recomenda-se um período de 3 a 6 meses para garantir um conjunto de dados representativo sem sobrecarregar o sistema. - Filtros de Negócio Essenciais: É crítico filtrar os dados por unidades organizacionais específicas para garantir a relevância. A query está pré-configurada com um espaço reservado para
CompanyCode. Você também pode adicionar filtros paraSalesOrganization,DistributionChannelouPlant, dependendo do escopo da sua análise. - Considerações de Performance: Esta é uma consulta complexa que une várias CDS views volumosas. A execução pode consumir recursos significativos do sistema. Agende as extrações para horários de menor atividade. Para conjuntos de dados muito grandes, considere executar a query em lotes mensais sequenciais menores.
a Consulta de Exemplo 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; Etapas
- Pré-requisitos: Certifique-se de ter uma chave de desenvolvedor e as autorizações necessárias no seu sistema SAP S/4HANA para criar e executar programas ABAP (acesso à transação SE38) e ler tabelas de supply chain como VBAK, LIKP, EKKO e MKPF.
- Criar Programa: Abra o Editor ABAP usando o código de transação
SE38. Insira um nome para o novo programa, por exemplo,Z_PM_SCM_EXTRACTION, e clique em 'Criar'. Forneça um título descritivo e defina o tipo de programa como 'Programa Executável'. - Inserir Código: Copie o código ABAP completo da seção 'query' abaixo e cole-o no Editor ABAP do seu novo programa.
- Definir Elementos de Texto: Navegue até Ir para > Elementos de Texto > Textos de Seleção. Ative todos os rótulos de tela de seleção propostos para garantir que a interface seja clara e intuitiva.
- Ativar Programa: Salve e ative o programa pressionando CTRL+S e depois CTRL+F3, ou usando o ícone de ativação na barra de ferramentas. Corrija quaisquer erros de sintaxe que possam surgir devido a configurações específicas do sistema.
- Executar Programa: Execute o programa pressionando F8 ou usando o botão 'Execução Direta'. Uma tela de seleção aparecerá, permitindo filtrar os dados a serem extraídos.
- Definir Parâmetros de Extração: Na tela de seleção, especifique o intervalo de datas para a Data de Criação da Ordem de Venda. É altamente recomendável filtrar também por Empresas ou Organizações de Vendas específicas para gerenciar o volume de dados. Insira o caminho completo para o arquivo de saída no servidor de aplicação SAP.
- Executar em Background: Para conjuntos de dados grandes abrangendo vários meses, é crucial executar o programa em background para evitar timeouts de transação. No menu, escolha Programa > Executar em Background e agende o job.
- Recuperar Arquivo de Dados: Assim que a execução do programa for concluída, use a transação
AL11para navegar até o diretório especificado no servidor de aplicação. Localize o arquivo gerado e baixe-o para sua máquina local usando a transaçãoCG3Y. - Preparar para Upload: Certifique-se de que o arquivo baixado esteja em formato de texto simples, como CSV com delimitadores de vírgula ou ponto e vírgula, e use codificação UTF-8. O arquivo está pronto para ser carregado na ferramenta de Process Mining.
Configuração
- Período de Seleção (S_ERDAT): Este é o filtro mais crítico. Ele define a janela de tempo para a seleção inicial das ordens de venda com base em sua data de criação (
VBAK-ERDAT). Comece com um período focado, como os últimos 3 a 6 meses, para garantir volumes de dados gerenciáveis. - Organização de Vendas (S_VKORG): Um filtro opcional para restringir a extração a organizações de vendas específicas. Útil para focar a análise em uma unidade de negócio ou região específica.
- Empresa (S_BUKRS): Um filtro opcional para limitar os dados a códigos de empresa específicos. Altamente recomendado para reduzir o escopo dos dados e melhorar a performance.
- Caminho do Arquivo de Saída (P_FILE): O caminho completo no servidor de aplicação SAP onde o arquivo final do event log será salvo. O usuário que executa o programa deve ter permissão de escrita neste diretório. Exemplo:
/usr/sap/trans/tmp/scm_event_log.csv. - Modo de Execução: O programa pode ser executado em primeiro plano para pequenas extrações de teste. Para volumes de dados significativos, o processamento em background é obrigatório para evitar timeouts e reduzir a carga no sistema em horários de pico.
- Autorizações do Sistema: O usuário que executa o relatório precisa de acesso de leitura a todas as tabelas subjacentes, incluindo VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 e LFA1.
a Consulta de Exemplo 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.