Seu Template de Dados de Compra ao Pagamento (P2P) - Pedido de Compra
Seu Template de Dados de Compra ao Pagamento (P2P) - Pedido de Compra
- Atributos recomendados para análise detalhada
- Principais atividades para monitorar no processo
- Orientação passo a passo para extração de dados
Procure to Pay (P2P) - Atributos de Pedido de Compra
| Nome | Descrição | ||
|---|---|---|---|
| Atividade ActivityName | O nome do evento de negócio ou etapa que ocorreu no processo do pedido. | ||
| Descrição Descreve uma ação ou mudança de status, como 'Pedido Criado' ou 'Mercadoria Recebida'. A sequência dessas atividades forma o fluxo. Analisar essa sequência é o coração do Process Mining. Ajuda a descobrir o processo real, compará-lo com o modelo ideal, identificar gargalos e quantificar o retrabalho. Por que é importante Define as etapas do processo, permitindo visualizar e analisar o fluxo de ponta a ponta, analisar variantes e identificar gargalos. Onde obter Geralmente derivado de várias tabelas e campos, como status na EKKO/EKPO ou logs na CDHDR/CDPOS, para representar marcos do negócio. Exemplos Pedido de Compra criadoPedido de Compra aprovadoEntrada de mercadorias lançadaFatura Recebida | |||
| Pedido de Compra PurchaseOrderNumber | O identificador único do Pedido de Compra (PO), servindo como o ID do caso principal para rastrear o ciclo de vida. | ||
| Descrição O Número do Pedido é o identificador central que une todas as atividades. Ele atua como o ID do caso (Case ID) para a análise de Process Mining. Agrupar eventos por este número reconstrói a jornada de cada pedido. Isso é essencial para calcular tempos de ciclo, analisar variantes e identificar gargalos ou desvios em ordens específicas. Por que é importante É a chave essencial para conectar todos os eventos de suprimentos em um único processo ponta a ponta, permitindo uma análise detalhada do ciclo de vida de cada pedido. Onde obter Este atributo está na tabela EKKO do SAP S/4HANA, campo EBELN. Exemplos 450001712345000171244500017125 | |||
| Tempo do Evento EventTime | O timestamp indicando quando a atividade ocorreu. | ||
| Descrição Registra a data e hora exatas de cada atividade. É fundamental para toda análise temporal no Process Mining. O Event Time ordena as atividades para construir o fluxo. Além disso, é a base para métricas de duração, como tempos de ciclo, esperas e processamento, cruciais para achar gargalos. Por que é importante Timestamp crítico para ordenar eventos e calcular métricas de performance, como tempos de ciclo e espera. Onde obter Campos de timestamp ligados a atividades, como Data de Criação ou de Lançamento. Muitas vezes exige combinar várias tabelas. Exemplos 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Sistema de Origem SourceSystem | Identifica o sistema de origem do qual os dados foram extraídos. | ||
| Descrição Especifica o sistema de origem, como 'SAP S/4HANA Produção'. Em ambientes multi-sistema, é crucial para linhagem de dados e resolução de problemas. Ajuda a entender o contexto e permite filtrar a análise por ambientes específicos. Por que é importante Fornece contexto essencial sobre a origem dos dados, o que é crítico para governança, validação e análise em ambientes com múltiplos sistemas. Onde obter Geralmente é um valor estático adicionado no ETL para rotular a origem do conjunto de dados. Exemplos S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Ú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 Indica quão recentes são os dados analisados, mostrando a data da última extração do SAP S/4HANA. Saber isso é vital para entender a tempestividade da análise. Ajuda a interpretar se os achados refletem o tempo real ou um retrato de um momento específico, afetando a relevância das decisões tomadas. Por que é importante Informa os usuários sobre a atualidade dos dados, garantindo que compreendam o contexto e a relevância de seus achados analíticos. Onde obter Timestamp de metadados adicionado durante o processo de extração, transformação e carga (ETL). Exemplos 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Data de entrega solicitada RequestedDeliveryDate | A data em que a empresa solicitou ao fornecedor a entrega dos bens ou serviços. | ||
| Descrição Especifica a data de entrega acordada no pedido, servindo de base para medir a performance do fornecedor. No Process Mining, comparamos esta data com o recebimento real para calcular o KPI de 'Taxa de Entrega no Prazo'. Analisar desvios ajuda a avaliar a confiabilidade do fornecedor e gerir riscos. Por que é importante Serve como base para medir a pontualidade na entrega do fornecedor, um KPI crítico para supply chain e planejamento operacional. Onde obter Pode ser encontrado na tabela de divisões de remessa EKET, campo EINDT. Exemplos 2023-06-012023-06-152023-07-01 | |||
| ID do Fornecedor VendorId | O identificador único do fornecedor que provê os bens ou serviços. | ||
| Descrição O ID do Fornecedor vincula o pedido a um parceiro específico. É usado em todo o processo para comunicação, entrega e pagamento. No Process Mining, este atributo permite segmentar a análise de desempenho por fornecedor. É essencial para Dashboards como 'Performance de Lead Time' e 'Taxa de Devolução por Fornecedor', ajudando a identificar parceiros confiáveis ou que causam atrasos. Por que é importante Permite análises focadas no fornecedor, ajudando a avaliar a performance, identificar fornecedores com alto e baixo desempenho e otimizar a cadeia de suprimentos. Onde obter Este atributo está na tabela EKKO do SAP S/4HANA, campo LIFNR. Exemplos 100023100045100088 | |||
| Requisição de Compra PurchaseRequisitionNumber | O identificador da requisição de compra (RC) que deu origem ao pedido. | ||
| Descrição Vincula o pedido à sua requisição de origem. Nem todo pedido terá uma requisição se for criado direto. Este elo é essencial para analisar todo o processo desde o pedido inicial. Suporta KPIs como 'Tempo de Aprovação da Requisição' e é fundamental para identificar 'Maverick Spend'. Por que é importante Conecta o pedido à requisição inicial, permitindo a análise do processo de ponta a ponta e a identificação de Maverick Spend não conforme. Onde obter Este atributo está na tabela EKPO (nível de item) do SAP S/4HANA, campo BANFN. Exemplos 1001005110010052 | |||
| Tipo de Documento do Pedido DocumentType | Uma classificação que distingue diferentes tipos de pedidos de compra, como pedidos padrão, pedidos de serviço ou pedidos de transferência de estoque. | ||
| Descrição O Tipo de Documento no SAP controla o fluxo, o intervalo de numeração e os campos do pedido. Ele permite adaptar o processo para diferentes cenários. Analisar por tipo de documento é crucial para entender variações. Um pedido de mercadoria padrão flui de forma diferente de um pedido de serviço ou transferência de estoque. Esse atributo permite comparar esses fluxos para encontrar oportunidades específicas de melhoria. Por que é importante Categoriza os pedidos de compra, permitindo comparar diferentes processos de aquisição e ajudando a explicar variações nos fluxos e tempos de ciclo. Onde obter Este atributo está na tabela EKKO do SAP S/4HANA, campo BSART. Exemplos NBFOUB | |||
| Utilizador UserName | O identificador do usuário que realizou uma atividade específica. | ||
| Descrição Captura o ID do usuário SAP que criou, alterou ou aprovou um documento, garantindo rastreabilidade. Analisar por usuário ajuda a identificar necessidades de treinamento, distribuir carga de trabalho e avaliar o desempenho. Serve para ver se usuários específicos estão ligados a atrasos ou mudanças frequentes, guiando a gestão de recursos. Por que é importante Garante responsabilidade e permite analisar o desempenho individual ou por equipe, ajudando a identificar necessidades de treinamento ou falta de recursos. Onde obter Esta informação está em campos como ERNAM (Criado por) na EKKO ou no campo de usuário em tabelas de alteração (CDHDR-USERNAME). Exemplos CB9980000012JSMITHRROE | |||
| Valor Líquido Total TotalNetAmount | O valor total do pedido de compra, excluindo impostos e frete. | ||
| Descrição Representa o valor monetário líquido do pedido. É um dado financeiro chave que indica o tamanho da transação. Essencial para análises financeiras, como categorizar pedidos por valor (alto vs. baixo) para ver se os fluxos mudam. Também ajuda a priorizar análises em pedidos de alto valor que trazem mais risco ou impacto. Por que é importante Permite uma análise baseada em valores financeiros, ajudando a segmentar pedidos por valor e priorizar esforços de melhoria em áreas de alto gasto. Onde obter Este atributo está na tabela EKKO do SAP S/4HANA, campo NETWR. Exemplos 1500.0025000.50125.75 | |||
| Categoria do item ItemCategory | Classifica um item de linha do pedido de compra, como padrão, consignação, subcontratação ou serviço. | ||
| Descrição A Categoria do Item determina como a compra de um material ou serviço é controlada. Ela influencia etapas como recebimento de mercadorias e verificação de faturas. Este atributo é importante para analisar variantes conforme o que é comprado. O processo de um serviço (que exige folha de registro) difere muito de um item de estoque padrão. Analisar por categoria ajuda a entender essas diferenças e focar em melhorias específicas. Por que é importante Explica variações de processo ao distinguir entre diferentes tipos de aquisição, como mercadorias, serviços ou subcontratação. Onde obter Este atributo está na tabela EKPO do SAP S/4HANA, campo PSTYP. Exemplos 093 | |||
| Centro Plant | A unidade operacional ou local onde as mercadorias são entregues ou os serviços prestados. | ||
| Descrição No SAP, um Centro (Plant) é um local físico onde as mercadorias são produzidas, armazenadas ou onde os serviços são realizados. É um elemento fundamental para a logística e o planejamento. Segmentar a análise do processo por centro pode revelar variações regionais ou específicas de cada unidade no processo de compras. Por exemplo, pode mostrar se determinados centros têm prazos de entrega mais longos ou maiores taxas de devolução, indicando problemas locais de logística ou controle de qualidade. Por que é importante Permite análises baseadas em localização, destacando diferenças de desempenho de processos entre vários sites operacionais, plantas ou armazéns. Onde obter Este atributo está na tabela EKPO do SAP S/4HANA, campo WERKS. Exemplos 10101710DE01 | |||
| Código da Empresa CompanyCode | O identificador da entidade legal ou empresa para a qual o pedido foi criado. | ||
| Descrição A Empresa (Company Code) representa uma unidade contábil independente. Todas as transações financeiras de um pedido são lançadas em uma empresa específica. Este é um atributo essencial para filtrar e comparar processos entre diferentes entidades legais. A análise por empresa pode revelar inconsistências na execução, níveis distintos de eficiência ou taxas de conformidade variadas em toda a organização. Por que é importante Permite que a análise de processos seja segmentada por entidade legal, facilitando comparações de desempenho e conformidade entre diferentes partes da empresa. Onde obter Este atributo está na tabela EKKO do SAP S/4HANA, campo BUKRS. Exemplos 101017102000 | |||
| É Maverick Spend IsMaverickSpend | Um sinalizador (flag) calculado indicando se um pedido de compra foi criado sem uma requisição de compra aprovada anteriormente. | ||
| Descrição Sinalizador booleano definido como 'true' se o pedido não tiver requisição associada ou se pular o workflow de aprovação padrão. Suporta o Dashboard de 'Identificação de Maverick Spend'. Ajuda a quantificar compras não conformes, permitindo focar em departamentos ou grupos específicos para reforçar políticas. Por que é importante Identifica diretamente compras fora de conformidade, ajudando a quantificar desvios de processo e a aplicar controles financeiros e políticas de compras. Onde obter Campo calculado com base na ausência de valor em "PurchaseRequisitionNumber" para tipos de documentos específicos ou pela análise da sequência de eventos. Exemplos verdadeirofalse | |||
| É Retrabalho IsRework | Um sinalizador (flag) calculado indicando se o pedido de compra passou por retrabalho, como uma alteração após aprovação ou devolução de mercadoria. | ||
| Descrição Atributo booleano calculado pela sequência de atividades. É 'true' se houver alteração após a aprovação ou se houver devolução. Simplifica o cálculo da taxa de processamento direto (STP). Permite filtrar pedidos que exigiram intervenção manual ou correção, quantificando o custo do retrabalho. Por que é importante Ajuda a quantificar a ineficiência do processo ao sinalizar casos com retrabalho, o que é fundamental para calcular as taxas de processamento direto e identificar causas raiz de desvios. Onde obter Campo calculado com base na sequência de atividades. A lógica verifica se um evento "Pedido de Compra Alterado" ocorre após uma aprovação ou se existe um evento "Devolução de Mercadoria". Exemplos verdadeirofalse | |||
| Entrega no Prazo do Fornecedor SupplierOnTimeDelivery | Um sinalizador (flag) calculado que indica se a entrada de mercadoria foi lançada na data de entrega solicitada ou antes dela. | ||
| Descrição Derivado da comparação entre o recebimento real e a data solicitada. Se entregue no prazo ou antes, é 'true'. Suporta diretamente o KPI de 'Taxa de Entrega no Prazo'. Facilita a análise ao filtrar entregas pontuais ou atrasadas, essencial para scorecards de fornecedores. Por que é importante Mede diretamente a confiabilidade do fornecedor, servindo de base para o KPI de entrega no prazo (On-Time Delivery) e permitindo uma gestão de performance eficaz. Onde obter Calculado comparando o timestamp da atividade "Entrada de Mercadoria Lançada" com o atributo "RequestedDeliveryDate". Exemplos verdadeirofalse | |||
| Grupo de Compras PurchasingGroup | O grupo específico de compradores responsável por certas atividades de suprimentos. | ||
| Descrição Um Grupo de Compras é um comprador ou um grupo de compradores responsável por atividades de compra, materiais ou fornecedores específicos. Eles são o principal ponto de contato para os vendedores. Este atributo permite uma análise de carga de trabalho e desempenho muito mais detalhada do que a organização de compras. Pode ser usado para identificar equipes sobrecarregadas, medir a eficiência de diferentes grupos de compradores e entender quais grupos estão mais propensos a desvios de processo, como o Maverick Spend. Por que é importante Oferece uma visão detalhada do desempenho dos grupos de compradores, permitindo analisar carga de trabalho, eficiência e adesão ao processo por equipe. Onde obter Este atributo está na tabela EKKO do SAP S/4HANA, campo EKGRP. Exemplos 001002N00 | |||
| Número do Material MaterialNumber | O identificador do material ou bem específico sendo adquirido. | ||
| Descrição O Número do Material é o código único do mestre de materiais no SAP. Ele é usado em todas as transações, de compras a vendas e estoque. Analisar por material ou grupo de mercadorias permite uma análise baseada em categorias. Ajuda a identificar se certos materiais têm processos ineficientes, prazos maiores ou mais devoluções, gerando insights valiosos para a gestão de categorias. Por que é importante Permite análises baseadas em mercadorias (commodities), ajudando a identificar problemas de processo ou de performance de fornecedores relacionados a produtos ou materiais específicos. Onde obter Este atributo está na tabela EKPO do SAP S/4HANA, campo MATNR. Exemplos RM100-100FG210SERV-CONSULT | |||
| Organização de compras PurchasingOrganization | A unidade organizacional responsável por adquirir materiais e serviços e negociar com fornecedores. | ||
| Descrição A Organização de Compras é a unidade responsável por todas as atividades de aquisição. Pode ser corporativa, por empresa ou por planta. Analisar o processo por organização ajuda a avaliar a eficiência de diferentes equipes ou regiões. Pode destacar diferenças na negociação com fornecedores, conformidade ou atrasos de aprovação entre unidades. Por que é importante Permite a comparação de desempenho entre diferentes departamentos ou regiões de compras, ajudando a identificar melhores práticas e áreas de melhoria. Onde obter Este atributo está na tabela EKKO do SAP S/4HANA, campo EKORG. Exemplos 10101710US01 | |||
| Tempo de ciclo da aprovação do Pedido de Compra PoApprovalCycleTime | Duração calculada entre a criação do pedido e a sua aprovação final. | ||
| Descrição Mede o tempo entre 'Pedido Criado' e 'Pedido Aprovado'. Fornece uma medida direta da eficiência de aprovação interna. É a métrica principal para o Dashboard de 'Tempo de Ciclo de Aprovação', ajudando a identificar onde ocorrem atrasos e onde acelerar. Por que é importante Mede diretamente a eficiência do processo de aprovação interna, ajudando a identificar e resolver gargalos que atrasam as compras. Onde obter Calculado encontrando a diferença de tempo entre os eventos "Pedido de Compra Aprovado" e "Pedido de Compra Criado" para cada pedido. Exemplos P2D4H30MP0D2H15MP5D | |||
Procure to Pay (P2P) - Atividades de Pedido de Compra
| Atividade | Descrição | ||
|---|---|---|---|
| Entrada de mercadorias lançada | Representa o recebimento físico das mercadorias e a respectiva entrada no sistema. É uma transação explícita que atualiza o histórico do pedido. | ||
| Por que é importante Grande marco que encerra o lead time do fornecedor e inicia a verificação de fatura. Essencial para taxas de entrega no prazo. Onde obter Registrado como documento de material nas tabelas MKPF (cabeçalho) e MSEG (item), vinculado no histórico do pedido (EKBE) com um tipo de movimento específico (ex: 101). Captura Data de lançamento (BUDAT) do cabeçalho do documento de material (MKPF) vinculado via EKBE. Tipo de evento explicit | |||
| Fatura Recebida | Representa a entrada da fatura do fornecedor no SAP, vinculando-a ao pedido. É um lançamento financeiro explícito que gera um documento contábil. | ||
| Por que é importante Marco crítico que une compras ao contas a pagar. Permite analisar o tempo entre o recebimento e o processamento da fatura. Onde obter Um documento contábil é criado na tabela BKPF (cabeçalho) e seus itens de linha estão na BSEG ou no diário universal ACDOCA. O documento é vinculado ao pedido na tabela RSEG. Captura Data de entrada do documento (CPUDT) da tabela de cabeçalho do documento contábil BKPF. Tipo de evento explicit | |||
| Pedido de Compra aprovado | Significa que o pedido recebeu todas as aprovações internas e está autorizado para o fornecedor. O evento é inferido pela mudança de status na estratégia de liberação. | ||
| Por que é importante Marco chave para medir eficiência de aprovação e retrabalho. Analisar o tempo entre criação e aprovação revela atrasos internos. Onde obter Inferido do indicador de liberação (FRGKE) na tabela EKKO. O timestamp é determinado consultando o histórico de modificações (CDHDR/CDPOS) para quando este campo foi atualizado para o status de "liberado". Captura Inferido dos logs de modificação para o campo de indicador de liberação (FRGKE) na tabela EKKO. Tipo de evento inferred | |||
| Pedido de Compra concluído | Indica que um item do pedido está fechado na logística. É inferido quando os campos 'Entrega Concluída' e 'Fatura Final' estão marcados. | ||
| Por que é importante Serve como ponto final da análise do ciclo de vida. Medir o tempo até este evento dá o tempo de ciclo ponta a ponta das operações. Onde obter Inferido de flags de status na tabela de itens do pedido, EKPO. O evento ocorre quando o indicador de "Entrega concluída" (ELIKZ) e o indicador de "Fatura final" (EREKZ) estão ambos marcados como verdadeiros. Captura Inferido dos logs de modificação quando os campos ELIKZ e EREKZ da EKPO estão ambos sinalizados como concluídos. Tipo de evento inferred | |||
| Pedido de Compra criado | Marca a criação do documento oficial do pedido de compra, que pode ser gerado com ou sem referência a uma requisição. É um evento explícito capturado quando o pedido é salvo pela primeira vez no sistema. | ||
| Por que é importante Esta atividade pode servir como ponto de partida alternativo, especialmente para análise de Maverick Spend. É um evento fundamental para rastrear o tempo total de processamento. Onde obter Registrado na tabela de cabeçalho do pedido (EKKO). A data de criação (AEDAT) e a hora são armazenadas diretamente nesta tabela. Captura Timestamp de criação (AEDAT) na tabela EKKO para o documento de pedido de compra. Tipo de evento explicit | |||
| Requisição de compra aprovada | Representa a aprovação formal da requisição por um gerente. Geralmente é inferida por uma mudança de status, indicando que está pronta para virar pedido. | ||
| Por que é importante Marco fundamental para rastrear ciclos de aprovação e achar gargalos. Atrasos aqui afetam a rapidez com que o pedido é enviado ao fornecedor. Onde obter Inferido dos campos de status de liberação na tabela EBAN (ex: FRGZU - Indicador de liberação). O timestamp é derivado dos documentos de modificação (CDHDR/CDPOS) que registram quando o status de liberação final foi definido. Captura Inferido dos logs de modificação (CDHDR/CDPOS) para campos de status de liberação na tabela EBAN. Tipo de evento inferred | |||
| Requisição de compra criada | Marca a solicitação formal de bens ou serviços. O evento é capturado quando o usuário salva uma nova requisição (ex: via transação ME51N). | ||
| Por que é importante Ponto de partida principal de muitos ciclos de vida de pedidos. Analisar o tempo deste evento até a criação do pedido ajuda a achar atrasos internos. Onde obter Registrado na tabela EBAN (Requisição de Compra). O timestamp de criação pode ser encontrado nas tabelas de histórico CDHDR e CDPOS para o objeto EBAN. Captura Evento registrado após a criação de um documento na tabela EBAN. Tipo de evento explicit | |||
| Confirmação de serviços registrada | Marca a confirmação de que um serviço do pedido foi prestado. É capturado explicitamente pela criação da folha de registro de serviço. | ||
| Por que é importante Para compras baseadas em serviços, este é o equivalente ao recebimento de mercadorias. É crucial para rastrear cronogramas de entrega de serviços e permitir pagamentos pontuais aos fornecedores. Onde obter Registrado via folha de registro de serviço, com dados nas tabelas ESSR (cabeçalho) e ESLL (linhas). A data de criação serve como timestamp. Captura Data de criação do documento de Folha de Registro de Serviço na tabela ESSR. Tipo de evento explicit | |||
| Fatura Paga | Marca a liquidação final da fatura do fornecedor via execução de pagamento ou manual. É uma transação financeira explícita que gera um documento de compensação. | ||
| Por que é importante Embora faça parte do pagamento, incluir esta atividade dá uma visão completa do ciclo P2P. É fundamental para analisar prazos e performance. Onde obter O pagamento é registrado como documento de compensação em BKPF/ACDOCA. A data de compensação (AUGDT) no item da fatura nas tabelas BSEG ou ACDOCA indica o evento. Captura Data de Compensação (AUGDT) do documento de fatura, encontrada na BSEG ou ACDOCA. Tipo de evento explicit | |||
| Mercadorias devolvidas | Indica que mercadorias recebidas anteriormente foram devolvidas ao fornecedor, geralmente devido a problemas de qualidade, danos ou remessas incorretas. Isso é capturado como um movimento de mercadoria de estorno explícito. | ||
| Por que é importante Esta atividade evidencia retrabalho e problemas de qualidade ou precisão. Muita devolução para um fornecedor ou material específico sinaliza um problema. Onde obter Registrado como documento de material com um tipo de movimento de devolução específico (ex: 122). O evento é logado na MKPF/MSEG e vinculado ao pedido na tabela EKBE. Captura Data de lançamento do documento de material com tipo de movimento de devolução na EKBE. Tipo de evento explicit | |||
| Pedido de Compra alterado | Indica que houve modificação no pedido após a criação (quantidade, preço ou data). É capturado explicitamente nos logs de alteração do sistema. | ||
| Por que é importante Monitorar mudanças, especialmente após aprovação, é crítico para achar ineficiências e falhas de conformidade. Mudanças frequentes podem indicar especificações iniciais ruins. Onde obter Registrado nas tabelas de documentos de alteração CDHDR (cabeçalho) e CDPOS (item) para pedidos (EINKBELEG). Cada mudança gera um log detalhado. Captura Evento registrado para alterações em campos principais nas tabelas EKKO ou EKPO, gravado na CDHDR/CDPOS. Tipo de evento explicit | |||
| Pedido de Compra enviado ao fornecedor | Representa o momento em que o pedido é enviado ao fornecedor (EDI, e-mail ou impressão). Costuma ser capturado via logs de gerenciamento de saída. | ||
| Por que é importante Este é o início real do lead time do fornecedor. É crucial para medir a performance desde o momento em que ele recebe o pedido. Onde obter Capturado da tabela de controle de saída NAST, que registra mensagens enviadas para um documento de compras. Pode-se usar a data e hora do tipo de saída relevante (ex: EDI, e-mail). Captura Timestamp da primeira mensagem de saída bem-sucedida do pedido na tabela NAST. Tipo de evento inferred | |||
| Pedido de Compra excluído | Representa o cancelamento ou exclusão lógica de um item do pedido ou do documento todo. É capturado quando um usuário define um sinalizador de exclusão. | ||
| Por que é importante É um ponto final alternativo, indicando falha ou cancelamento. Analisar por que pedidos são excluídos ajuda a descobrir falhas no planejamento de demanda. Onde obter Capturado do flag de indicador de exclusão (LOEKZ) nas tabelas de cabeçalho (EKKO) ou item (EKPO) do pedido de compra. O timestamp é derivado dos documentos de modificação (CDHDR/CDPOS). Captura Timestamp dos documentos de alteração (CDHDR/CDPOS) quando o sinalizador de exclusão (LOEKZ) é definido. Tipo de evento explicit | |||
Guias de Extração
Etapas
- Pré-requisitos e Acesso: Certifique-se de que possui um usuário com as autorizações adequadas para consultar as Core Data Services (CDS) views no sistema SAP S/4HANA. O acesso pode ser feito via SAP HANA Studio, ABAP Development Tools (ADT) para Eclipse ou uma ferramenta de extração de dados de terceiros que suporte conexões SQL com o banco de dados SAP HANA.
- Identificar Detalhes de Conexão do Sistema: Obtenha os parâmetros de conexão necessários para o seu sistema SAP S/4HANA, incluindo host, número da instância e suas credenciais de autenticação.
- Conectar ao Banco de Dados: Usando seu cliente SQL preferido, estabeleça uma conexão com o banco de dados SAP S/4HANA onde residem as CDS views.
- Preparar a Consulta SQL: Copie a consulta SQL completa fornecida na seção de consulta deste documento para o seu editor SQL. Esta consulta foi projetada para extrair todas as atividades e atributos necessários.
- Definir Parâmetros de Filtragem: Localize os valores de espaço reservado na consulta. Substitua _start_date e _end_date pelo intervalo de datas desejado para sua análise (ex: '20230101' e '20231231'). Modifique o filtro poh.CompanyCode para incluir os códigos de empresa específicos que deseja analisar.
- Executar a Consulta: Execute a consulta SQL modificada no banco de dados S/4HANA. Dependendo do volume de dados e do intervalo de datas especificado, essa execução pode levar algum tempo.
- Revisar Resultados Preliminares: Assim que a consulta for concluída, faça uma revisão rápida dos resultados no seu cliente SQL. Verifique a presença de diferentes atividades, certifique-se de que os timestamps estão preenchidos corretamente e valide se o case ID (PurchaseOrderNumber) está consistente.
- Exportar os Dados: Exporte o conjunto completo de resultados da sua ferramenta SQL para um arquivo CSV (Valores Separados por Vírgula). Certifique-se de que o arquivo utilize a codificação UTF-8 para evitar problemas de caracteres.
- Preparar para o Upload: Antes de carregar para o ProcessMind, abra o arquivo CSV e verifique se os cabeçalhos das colunas correspondem exatamente aos atributos definidos nos requisitos de dados (PurchaseOrderNumber, ActivityName, EventTime, etc.). Ajuste os nomes das colunas caso sua ferramenta de extração os tenha alterado.
- Carregar para o ProcessMind: Faça o upload do arquivo CSV finalizado para o seu projeto no ProcessMind. Mapeie as colunas do seu arquivo para os campos correspondentes de case ID, atividade e timestamp durante o processo de importação.
Configuração
- Principais CDS Views Utilizadas: A lógica de extração baseia-se em um conjunto de CDS views padrão ricas em semântica. As principais visões incluem:
- I_PurchaseOrderItemAPI01: Para dados centrais de itens do pedido de compra.
- I_PurchaseRequisitionItemAPI01: Para detalhes da requisição de compra.
- I_MaterialDocumentItem: Para movimentos de mercadorias, como entradas e devoluções.
- I_ServiceEntrySheetAPI01: Para eventos de confirmação de serviço.
- I_SupplierInvoiceAPI01: Para informações de faturas de fornecedores.
- I_OperationalAcctgDocItem: Para vincular faturas a documentos financeiros para rastreamento de pagamentos.
- I_ChangeDocument: Para capturar alterações no pedido de compra.
- Filtragem por Intervalo de Datas: É fundamental aplicar um filtro de intervalo de datas para gerenciar o desempenho e o volume de dados. A consulta utiliza os espaços reservados _start_date e _end_date na data de criação do pedido de compra (PurchaseOrderDate). O intervalo inicial recomendado é de 3 a 6 meses de dados.
- Filtragem Organizacional: A consulta deve sempre ser filtrada por CompanyCode para limitar o escopo da extração às unidades de negócio relevantes. Filtros adicionais em PurchaseOrderType ou PurchasingOrganization podem ser adicionados à expressão de tabela comum PO_base principal para maior refinamento.
- Pré-requisitos: O usuário que executa a consulta precisa de autorização de SELECT em todas as CDS views listadas acima. O acesso a essas visões é geralmente concedido por meio de funções específicas de negócio ou analytics no S/4HANA. Sem as permissões adequadas, a consulta falhará.
a Consulta de Exemplo sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Etapas
- Pré-requisitos e Acesso: Certifique-se de que possui um usuário com as autorizações adequadas para consultar as Core Data Services (CDS) views no sistema SAP S/4HANA. O acesso pode ser feito via SAP HANA Studio, ABAP Development Tools (ADT) para Eclipse ou uma ferramenta de extração de dados de terceiros que suporte conexões SQL com o banco de dados SAP HANA.
- Identificar Detalhes de Conexão do Sistema: Obtenha os parâmetros de conexão necessários para o seu sistema SAP S/4HANA, incluindo host, número da instância e suas credenciais de autenticação.
- Conectar ao Banco de Dados: Usando seu cliente SQL preferido, estabeleça uma conexão com o banco de dados SAP S/4HANA onde residem as CDS views.
- Preparar a Consulta SQL: Copie a consulta SQL completa fornecida na seção de consulta deste documento para o seu editor SQL. Esta consulta foi projetada para extrair todas as atividades e atributos necessários.
- Definir Parâmetros de Filtragem: Localize os valores de espaço reservado na consulta. Substitua _start_date e _end_date pelo intervalo de datas desejado para sua análise (ex: '20230101' e '20231231'). Modifique o filtro poh.CompanyCode para incluir os códigos de empresa específicos que deseja analisar.
- Executar a Consulta: Execute a consulta SQL modificada no banco de dados S/4HANA. Dependendo do volume de dados e do intervalo de datas especificado, essa execução pode levar algum tempo.
- Revisar Resultados Preliminares: Assim que a consulta for concluída, faça uma revisão rápida dos resultados no seu cliente SQL. Verifique a presença de diferentes atividades, certifique-se de que os timestamps estão preenchidos corretamente e valide se o case ID (PurchaseOrderNumber) está consistente.
- Exportar os Dados: Exporte o conjunto completo de resultados da sua ferramenta SQL para um arquivo CSV (Valores Separados por Vírgula). Certifique-se de que o arquivo utilize a codificação UTF-8 para evitar problemas de caracteres.
- Preparar para o Upload: Antes de carregar para o ProcessMind, abra o arquivo CSV e verifique se os cabeçalhos das colunas correspondem exatamente aos atributos definidos nos requisitos de dados (PurchaseOrderNumber, ActivityName, EventTime, etc.). Ajuste os nomes das colunas caso sua ferramenta de extração os tenha alterado.
- Carregar para o ProcessMind: Faça o upload do arquivo CSV finalizado para o seu projeto no ProcessMind. Mapeie as colunas do seu arquivo para os campos correspondentes de case ID, atividade e timestamp durante o processo de importação.
Configuração
- Principais CDS Views Utilizadas: A lógica de extração baseia-se em um conjunto de CDS views padrão ricas em semântica. As principais visões incluem:
- I_PurchaseOrderItemAPI01: Para dados centrais de itens do pedido de compra.
- I_PurchaseRequisitionItemAPI01: Para detalhes da requisição de compra.
- I_MaterialDocumentItem: Para movimentos de mercadorias, como entradas e devoluções.
- I_ServiceEntrySheetAPI01: Para eventos de confirmação de serviço.
- I_SupplierInvoiceAPI01: Para informações de faturas de fornecedores.
- I_OperationalAcctgDocItem: Para vincular faturas a documentos financeiros para rastreamento de pagamentos.
- I_ChangeDocument: Para capturar alterações no pedido de compra.
- Filtragem por Intervalo de Datas: É fundamental aplicar um filtro de intervalo de datas para gerenciar o desempenho e o volume de dados. A consulta utiliza os espaços reservados _start_date e _end_date na data de criação do pedido de compra (PurchaseOrderDate). O intervalo inicial recomendado é de 3 a 6 meses de dados.
- Filtragem Organizacional: A consulta deve sempre ser filtrada por CompanyCode para limitar o escopo da extração às unidades de negócio relevantes. Filtros adicionais em PurchaseOrderType ou PurchasingOrganization podem ser adicionados à expressão de tabela comum PO_base principal para maior refinamento.
- Pré-requisitos: O usuário que executa a consulta precisa de autorização de SELECT em todas as CDS views listadas acima. O acesso a essas visões é geralmente concedido por meio de funções específicas de negócio ou analytics no S/4HANA. Sem as permissões adequadas, a consulta falhará.
a Consulta de Exemplo sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Etapas
- Especificação e Design: Defina a estrutura de dados final para o arquivo de log de eventos, incluindo todos os atributos obrigatórios e recomendados. Documente as tabelas SAP específicas (ex: EKKO, EKPO, EKBE, CDHDR, CDPOS, BKPF) que serão usadas como origem para cada uma das 13 atividades exigidas.
- Criação do Programa: No SAP GUI, acesse o Editor ABAP usando a transação SE38 ou SE80. Crie um novo programa executável, por exemplo, Z_PM_PO_EXTRACT.
- Definir Tela de Seleção: Codifique a tela de seleção do relatório. Isso permite que os usuários filtrem os dados que desejam extrair. Inclua parâmetros para o intervalo de datas de criação do pedido de compra (P_AEDAT), código da empresa (P_BUKRS) e tipo de documento de compras (P_BSART).
- Declarações de Dados: Defina as tabelas internas e as estruturas de dados necessárias para o programa. Isso inclui uma tabela interna para o log de eventos final que corresponda à estrutura definida na etapa de especificação.
- Implementar Lógica de Seleção de Dados: Escreva a lógica ABAP central para selecionar os dados de cada uma das 13 atividades. Isso envolve uma série de instruções SELECT nas tabelas SAP relevantes, unidas onde necessário. Para eventos baseados em alterações, faça a leitura das tabelas de log de modificações CDHDR e CDPOS.
- Transformar e Mapear Dados: Para cada registro recuperado, mapeie os campos da tabela SAP para as colunas correspondentes na sua tabela interna de log de eventos final. Defina o ActivityName com base no evento processado (ex: 'Pedido de Compra Criado'). Converta os campos de data e hora em um formato de timestamp consistente para EventTime.
- Consolidar Dados de Eventos: Após processar todos os 13 tipos de atividades, certifique-se de que todos os dados estejam coletados em uma única tabela interna unificada. Esta tabela agora representa o log de eventos completo para os pedidos de compra selecionados.
- Implementar Saída de Arquivo: Adicione a funcionalidade para gravar a tabela interna final em um arquivo. A abordagem recomendada é usar o método cl_gui_frontend_services=>gui_download para permitir que os usuários salvam o arquivo como CSV em suas máquinas locais, ou use OPEN DATASET para salvá-lo no servidor de aplicação SAP para processamento em background.
- Criar Código de Transação (Opcional): Para tornar o programa facilmente acessível aos usuários de negócio, use a transação SE93 para criar um código de transação personalizado (ex: ZPM_PO_EXTRACT) que execute seu programa ABAP.
- Agendar Job em Background: Para grandes volumes de dados ou extrações automatizadas, use a transação SM36 para agendar o programa para rodar como um job em segundo plano. O arquivo de saída será gravado no caminho do servidor de aplicação especificado na lógica do programa.
Configuração
- Critérios de Seleção: O programa deve incluir parâmetros de seleção para filtrar os dados de forma eficaz. Os principais filtros incluem:
- Intervalo de Datas: Um intervalo de datas obrigatório para a data de criação do Pedido de Compra (EKKO-AEDAT). Recomenda-se começar com um período de 3 a 6 meses para gerenciar o volume de dados e o desempenho do relatório.
- Empresa (BUKRS): Essencial para organizações com múltiplas entidades legais para restringir o escopo da extração.
- Tipo de Documento de Compras (BSART): Permite filtrar tipos específicos de Pedidos de Compra (PO), como Pedido Padrão, Pedido em Aberto ou Pedido de Transferência de Estoque, para focar a análise.
- Leitura do Log de Modificações: A extração de atividades como "Pedido de Compra Aprovado" ou "Pedido de Compra Alterado" depende da leitura das tabelas de log de modificações do SAP (CDHDR, CDPOS). Isso pode exigir muitos recursos. A lógica ABAP deve ser otimizada para selecionar apenas as classes de objetos necessárias (EINKBELEG, BANF) e as combinações de tabela/campo.
- Autorizações: O usuário ou conta técnica que executa este relatório requer amplas autorizações de leitura para tabelas em vários módulos SAP, incluindo Materials Management (MM), Financial Accounting (FI) e tabelas de todo o sistema. Isso inclui tabelas como EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR e CDPOS.
- Execução em Background: Para extrações que cobrem mais do que alguns meses de dados ou que rodam em sistemas com alto volume de transações, sempre execute o programa em segundo plano para evitar erros de tempo de resposta (timeouts) no processo de diálogo.
a Consulta de Exemplo abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log.