Seu Template de dados de Purchase to Pay - Pedido de compra
Seu Template de dados de Purchase to Pay - Pedido de compra
- Atributos recomendados para uma análise detalhada
- Principais atividades a serem monitoradas no processo
- Orientações passo a passo para a extração dos dados
Purchase to Pay - Pedido de compra: atributos
| Nome | Descrição | ||
|---|---|---|---|
| Atividade ActivityName | O nome do evento ou etapa de negócio que ocorreu no processo do Pedido de Compra. | ||
| Descrição Este atributo descreve uma ação específica ou uma alteração de status no ciclo de vida do Pedido de Compra, como 'Pedido de Compra Criado', 'Pedido de Compra Aprovado' ou 'Recebimento de Mercadorias Registrado'. A sequência dessas atividades forma o fluxo do processo. Analisar a sequência e a frequência das atividades é o núcleo do Process Mining. Isso ajuda a descobrir o processo real, compará-lo com o modelo projetado, identificar gargalos, por exemplo, longas esperas após 'Fatura Recebida', e quantificar o retrabalho, como atividades repetidas de 'Pedido de Compra Alterado'. Por que isso importa Ele define as etapas do processo, permitindo visualizar e analisar o fluxo de ponta a ponta, as variantes e os gargalos. Onde obter Normalmente, é derivado de uma combinação de tabelas e campos, como campos de status em EKKO/EKPO ou logs de documentos de alteração em CDHDR/CDPOS, para representar marcos importantes do negócio. Exemplos Pedido de Compra CriadoPedido de Compra AprovadoRecebimento de Mercadorias RegistradoFatura Recebida | |||
| Horário do Evento EventTime | O registro de data e hora que indica quando a atividade ocorreu. | ||
| Descrição Este atributo registra a data e o horário exatos de cada atividade no processo. Ele é fundamental para todas as análises baseadas em tempo no Process Mining. O Horário do Evento é usado para ordenar cronologicamente as atividades e construir o fluxo do processo. Além disso, é a base para calcular todas as métricas baseadas em duração, como tempos de ciclo entre atividades, tempos de espera e tempos de processamento, que são essenciais para analisar a performance e identificar gargalos. Por que isso importa Este registro de data e hora é essencial para ordenar corretamente os eventos e calcular todas as métricas de performance, incluindo tempos de ciclo, prazos de entrega e tempos de espera. Onde obter Campos de registro de data e hora associados a atividades específicas, como Data de Criação (EKKO-AEDAT para alterações) ou Data de Lançamento (MKPF-BUDAT para recebimentos de mercadorias). Muitas vezes, é necessário combinar dados de várias tabelas. Exemplos 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Pedido de Compra PurchaseOrderNumber | O identificador exclusivo do Pedido de Compra (PO), que serve como o principal ID do caso para acompanhar o ciclo de vida das compras. | ||
| Descrição O número do Pedido de Compra é o identificador central que conecta todas as atividades relacionadas, desde a criação inicial até o recebimento final das mercadorias e a conclusão. Ele funciona como o identificador do caso para a análise de Process Mining. Na análise, agrupar os eventos por esse número permite reconstruir a jornada de cada PO individual. Isso é essencial para calcular tempos de ciclo, analisar variantes do processo e identificar gargalos ou desvios específicos de um único pedido. Por que isso importa É a chave essencial para conectar todos os eventos de compras em um único processo de ponta a ponta, permitindo uma análise detalhada do ciclo de vida de cada Pedido de Compra. Onde obter Este atributo pode ser encontrado na tabela EKKO do SAP S/4HANA, no campo EBELN. Exemplos 450001712345000171244500017125 | |||
| Sistema de Origem SourceSystem | Identifica o sistema de origem do qual os dados foram extraídos. | ||
| Descrição Este atributo especifica o sistema de origem dos dados de eventos, por exemplo, 'SAP S/4HANA Production' ou 'SAP ECC'. Em ambientes com vários sistemas, este campo é essencial para a linhagem dos dados, a solução de problemas e a garantia de que os dados de diferentes fontes sejam interpretados corretamente. Ele ajuda a entender o contexto dos dados e pode ser usado para filtrar a análise por ambientes específicos do sistema. Por que isso importa Fornece um contexto essencial sobre a origem dos dados, fundamental para a governança, a validação e a análise de dados em ambientes com vários sistemas. Onde obter Normalmente, é um valor estático adicionado durante o processo de extração, transformação e carregamento (ETL) dos dados para identificar a origem do conjunto de dados. Exemplos S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Última Atualização dos Dados LastDataUpdate | O registro de data e hora em que os dados foram atualizados ou extraídos pela última vez do sistema de origem. | ||
| Descrição Este atributo indica o nível de atualização dos dados analisados. Ele mostra a data e o horário da extração mais recente de dados do SAP S/4HANA. Saber quando os dados foram atualizados pela última vez é essencial para que os usuários entendam a atualidade da análise. Isso ajuda a interpretar os resultados corretamente, indicando se as informações são em tempo real ou representam um retrato de um momento específico, o que afeta a relevância das ações tomadas com base na análise. Por que isso importa Informa aos usuários a atualidade dos dados, garantindo que eles entendam o contexto e a relevância dos resultados analíticos. Onde obter Este é um registro de data e hora de metadados adicionado durante o processo de extração, transformação e carregamento (ETL) dos dados. 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 das mercadorias ou dos serviços. | ||
| Descrição Este atributo especifica a data de entrega desejada acordada no Pedido de Compra. Ele serve como referência para medir a performance de entrega do fornecedor. No Process Mining, essa data é comparada com a data real de recebimento das mercadorias, o registro de data e hora de 'Recebimento de Mercadorias Registrado', para calcular o KPI 'Índice de Entrega do Fornecedor no Prazo'. Analisar os desvios dessa data ajuda a avaliar a confiabilidade do fornecedor e gerenciar riscos da cadeia de suprimentos. Por que isso importa Serve como referência para medir a performance de entrega do fornecedor no prazo, um KPI essencial para a gestão da cadeia de suprimentos e o planejamento operacional. Onde obter Pode ser encontrado na tabela de linhas de programação EKET, no campo EINDT. Exemplos 2023-06-012023-06-152023-07-01 | |||
| ID do Fornecedor VendorId | O identificador exclusivo do fornecedor que fornece as mercadorias ou os serviços. | ||
| Descrição O ID do Fornecedor é um dado mestre essencial que conecta um Pedido de Compra a um fornecedor específico. Ele é usado em todo o processo de compras para comunicação, entrega e pagamento. No Process Mining, este atributo permite segmentar a análise de performance por fornecedor. Ele é essencial para Dashboards como 'Performance do Prazo de Entrega do Fornecedor' e 'Taxa de Devolução de Mercadorias por Fornecedor', ajudando a identificar os fornecedores mais confiáveis e aqueles que podem estar causando atrasos ou problemas de qualidade. Por que isso importa Permite uma análise centrada nos fornecedores, ajudando a avaliar a performance, identificar fornecedores com resultados melhores ou piores e otimizar a cadeia de suprimentos. Onde obter Este atributo está localizado na tabela EKKO do SAP S/4HANA, no campo LIFNR. Exemplos 100023100045100088 | |||
| Requisição de compra PurchaseRequisitionNumber | O identificador da requisição de compra (PR) que iniciou o Pedido de Compra. | ||
| Descrição Este atributo conecta o Pedido de Compra à requisição de compra de origem. Nem todos os POs terão uma PR, caso sejam criados diretamente. Essa conexão é essencial para analisar o processo completo de compras de ponta a ponta, começando pela solicitação inicial. Ela dá suporte a KPIs como 'Tempo de Aprovação da Requisição de Compra' e é fundamental para identificar 'Gastos Fora das Políticas', quando POs são criados sem uma requisição anterior aprovada. Por que isso importa Conecta o PO à solicitação inicial, permitindo a análise do processo de ponta a ponta e a identificação de gastos fora das políticas e não conformes. Onde obter Este atributo está localizado na tabela EKPO do SAP S/4HANA, no nível do item do PO, no campo BANFN. Exemplos 1001005110010052 | |||
| Tipo de Documento do PO DocumentType | Uma classificação que diferencia os tipos de Pedidos de Compra, como POs padrão, POs de serviços ou pedidos de transferência de estoque. | ||
| Descrição O Tipo de Documento é um elemento importante da configuração do SAP que controla o fluxo do processo, a faixa de numeração e os campos de um Pedido de Compra. Ele permite que as empresas adaptem o processo de compras a diferentes cenários. Analisar o processo por tipo de documento é essencial para entender as variações do processo. Por exemplo, o processo de um PO padrão de mercadorias pode ser muito diferente do processo de um PO de serviços ou de uma transferência de estoque. Este atributo permite filtrar e comparar esses fluxos distintos para encontrar oportunidades específicas de melhoria. Por que isso importa Categoriza os Pedidos de Compra, permitindo comparar diferentes processos de compras e ajudando a explicar variações nos fluxos e nos tempos de ciclo. Onde obter Este atributo está localizado na tabela EKKO do SAP S/4HANA, no campo BSART. Exemplos NBFOUB | |||
| Usuário UserName | O identificador do usuário que realizou uma atividade específica. | ||
| Descrição Este atributo registra o ID do usuário SAP responsável por criar, alterar ou aprovar um documento. Ele oferece rastreabilidade das ações realizadas no sistema. Analisar por usuário ajuda a identificar necessidades de treinamento, distribuição de carga de trabalho e performance individual. Por exemplo, pode ser usado para verificar se determinados usuários estão consistentemente associados a tempos longos de aprovação ou a alterações frequentes após a aprovação, contribuindo para a gestão de recursos e iniciativas de melhoria do processo. Por que isso importa Oferece responsabilização e permite analisar a performance no nível individual ou da equipe, ajudando a identificar oportunidades de treinamento ou restrições de recursos. Onde obter Essas informações são encontradas em campos como ERNAM (Criado por) na EKKO ou no campo de usuário das tabelas de documentos de alteração (CDHDR-USERNAME). Exemplos CB9980000012JSMITHRROE | |||
| Valor Líquido Total TotalNetAmount | O valor total do Pedido de Compra, excluindo impostos e custos de frete. | ||
| Descrição Este atributo representa o valor monetário líquido do Pedido de Compra. É um valor financeiro importante que indica o tamanho da transação de compras. Esse valor é essencial para análises financeiras, como categorizar POs por valor, alto ou baixo, para verificar se seus caminhos de processo são diferentes. Ele também pode ser usado para priorizar a análise, concentrando-se em pedidos de alto valor que podem envolver maior risco financeiro ou ter um impacto maior no negócio. Por que isso importa Permite análises baseadas em valor financeiro, ajudando a segmentar Pedidos de Compra por valor e priorizar esforços de melhoria do processo em áreas de maior gasto. Onde obter Este atributo pode ser encontrado na tabela EKKO do SAP S/4HANA, no 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 específico é controlada e processada. Ela influencia etapas posteriores, como o recebimento de mercadorias e a verificação da fatura. Este atributo é importante para analisar variantes do processo com base no que está sendo comprado. Por exemplo, o processo de um item de serviço, que exige uma folha de registro de serviços, é significativamente diferente do processo de um item de estoque padrão. Analisar por categoria de item ajuda a explicar essas diferenças e permite melhorias direcionadas no processo. Por que isso importa Explica as variações do processo ao diferenciar tipos de compras, como mercadorias, serviços ou subcontratação. Onde obter Este atributo está localizado na tabela EKPO do SAP S/4HANA, campo PSTYP. Exemplos 093 | |||
| Código da empresa CompanyCode | O identificador da entidade legal ou empresa para a qual o pedido de compra é criado. | ||
| Descrição O código da empresa representa uma unidade contábil independente dentro de uma organização. Todas as transações financeiras relacionadas a um pedido de compra são lançadas em um código de empresa específico. Esse é um atributo organizacional fundamental, que permite filtrar e comparar processos de compras entre diferentes entidades legais. A análise por código da empresa pode revelar inconsistências na execução do processo, diferentes níveis de eficiência ou taxas de conformidade variadas em toda a organização. Por que isso importa Permite segmentar a análise do processo por entidade legal, facilitando a comparação de performance e conformidade entre diferentes partes da empresa. Onde obter Este atributo está localizado na tabela EKKO do SAP S/4HANA, campo BUKRS. Exemplos 101017102000 | |||
| É compra não autorizada IsMaverickSpend | Um indicador calculado que mostra se um pedido de compra foi criado sem uma requisição de compra aprovada anteriormente. | ||
| Descrição Esse indicador booleano é derivado durante o processamento dos dados. Ele recebe o valor 'true' quando um pedido de compra não tem uma requisição de compra associada ou quando sua criação ignora o Workflow padrão de aprovação. Esse atributo oferece suporte direto ao Dashboard 'Identificação de compras não autorizadas' e aos KPIs relacionados. Ele ajuda a dimensionar o comportamento de compras fora de conformidade, permitindo que as empresas direcionem ações a departamentos ou grupos de usuários específicos para reforçar políticas e controles de compras. Por que isso importa Identifica diretamente compras fora de conformidade, ajudando a dimensionar desvios do processo e a reforçar controles financeiros e políticas de compras. Onde obter Campo calculado com base na ausência de um valor em 'PurchaseRequisitionNumber' para tipos específicos de documento ou na análise da sequência de eventos. Exemplos truefalse | |||
| É retrabalho IsRework | Um indicador calculado que mostra se o pedido de compra passou por retrabalho, como uma alteração após a aprovação ou uma devolução de produtos. | ||
| Descrição Esse atributo booleano é calculado pela análise da sequência de atividades de cada pedido de compra. Ele recebe o valor 'true' quando ocorre um evento 'Purchase Order Changed' depois de um evento 'Purchase Order Approved' ou quando há um evento 'Goods Returned'. Esse indicador simplifica o cálculo do KPI 'Taxa de processamento direto'. Ele permite filtrar e visualizar facilmente todos os pedidos de compra que exigiram intervenção manual ou correção, ajudando a dimensionar o custo e a frequência do retrabalho. Por que isso importa Ajuda a dimensionar a ineficiência do processo ao sinalizar casos com retrabalho, algo essencial para calcular as taxas de processamento direto e identificar as causas-raiz dos desvios. Onde obter Campo calculado com base na sequência de atividades. A lógica verifica se um evento 'Purchase Order Changed' ocorre depois de uma aprovação ou se existe um evento 'Goods Returned'. Exemplos truefalse | |||
| Entrega pontual do fornecedor SupplierOnTimeDelivery | Um indicador calculado que mostra se o recebimento dos produtos foi lançado na data de entrega solicitada ou antes dela. | ||
| Descrição Esse atributo booleano é derivado pela comparação do timestamp da atividade 'Goods Receipt Posted' com a 'Requested Delivery Date'. Quando o recebimento ocorre na data solicitada ou antes dela, o atributo recebe o valor 'true'. Esse atributo oferece suporte direto ao KPI 'Taxa de entrega pontual do fornecedor'. Ele simplifica a análise ao permitir que os usuários filtrem facilmente entregas pontuais ou atrasadas, algo essencial para Dashboards de performance de fornecedores e scorecards de fornecedores. Por que isso importa Mede diretamente a confiabilidade do fornecedor, servindo de base para o KPI de entrega pontual e permitindo uma gestão eficaz da performance dos fornecedores. Onde obter Calculado pela comparação do timestamp da atividade 'Goods Receipt Posted' com o atributo 'RequestedDeliveryDate'. Exemplos truefalse | |||
| Grupo de compras PurchasingGroup | O grupo específico de compradores responsável por determinadas atividades de compras. | ||
| Descrição Um grupo de compras é formado por um comprador ou grupo de compradores responsáveis por atividades, materiais ou fornecedores específicos. Eles são o principal ponto de contato com os fornecedores. Esse atributo permite uma análise mais detalhada da carga de trabalho e da performance do que a organização de compras. Ele pode ser usado para identificar equipes sobrecarregadas, medir a eficiência de diferentes grupos de compradores e entender quais grupos estão mais sujeitos a desvios do processo, como compras não autorizadas. Por que isso importa Oferece uma visão detalhada da performance dos grupos de compradores, permitindo analisar carga de trabalho, eficiência e aderência ao processo no nível da equipe. Onde obter Este atributo está localizado na tabela EKKO do SAP S/4HANA, campo EKGRP. Exemplos 001002N00 | |||
| Número do material MaterialNumber | O identificador do material ou produto específico que está sendo comprado. | ||
| Descrição O número do material é um código exclusivo atribuído a cada registro mestre de material no SAP. Ele é usado em todas as transações relacionadas a esse material, incluindo compras, gestão de estoque e vendas. Analisar por número ou grupo de materiais permite uma análise por categoria de produto. Isso ajuda a identificar se os processos de compras de determinados tipos de materiais são menos eficientes, têm prazos maiores ou estão mais sujeitos a devoluções, gerando insights para a gestão de categorias. Por que isso importa Permite uma análise por categoria de produto, ajudando a identificar problemas no processo ou na performance de fornecedores relacionados a produtos ou materiais específicos. Onde obter Este atributo está localizado na tabela EKPO do SAP S/4HANA, campo MATNR. Exemplos RM100-100FG210SERV-CONSULT | |||
| Organização de compras PurchasingOrganization | A unidade organizacional responsável pela compra de materiais e serviços e pela negociação com fornecedores. | ||
| Descrição A organização de compras é uma unidade organizacional essencial da área de compras. Ela pode ser estruturada nos níveis corporativo, empresarial ou de planta e é responsável por todas as atividades de compras. Analisar o processo por organização de compras ajuda a avaliar a eficiência e a performance de diferentes equipes ou regiões de compras. Isso pode destacar diferenças na negociação com fornecedores, na conformidade do processo ou nos atrasos de aprovação entre unidades organizacionais. Por que isso importa Permite comparar a performance entre diferentes departamentos ou regiões de compras, ajudando a identificar boas práticas e oportunidades de melhoria. Onde obter Este atributo está localizado na tabela EKKO do SAP S/4HANA, campo EKORG. Exemplos 10101710US01 | |||
| Planta Plant | A unidade operacional ou local para onde os produtos são entregues ou onde os serviços são prestados. | ||
| Descrição No SAP, uma planta é um local físico onde produtos são fabricados, armazenados ou onde serviços são prestados. Ela é um elemento essencial para logística e planejamento. Segmentar a análise do processo por planta pode revelar variações regionais ou específicas de cada unidade no processo de compras. Por exemplo, pode mostrar se determinadas plantas enfrentam prazos de entrega maiores ou taxas mais altas de devolução de produtos, indicando problemas localizados de logística ou controle de qualidade. Por que isso importa Permite uma análise por localização, destacando diferenças na performance do processo entre diferentes unidades operacionais, plantas ou armazéns. Onde obter Este atributo está localizado na tabela EKPO do SAP S/4HANA, campo WERKS. Exemplos 10101710DE01 | |||
Purchase to Pay - Pedido de compra: atividades
| Atividade | Descrição | ||
|---|---|---|---|
| Fatura Recebida | Representa a entrada da fatura de um fornecedor no sistema SAP, vinculando-a ao Pedido de Compra correspondente. Este é um lançamento financeiro explícito que cria um documento contábil. | ||
| Por que isso importa Este é um marco crítico que conecta o processo de compras ao processo de contas a pagar. Ele permite analisar o tempo entre o recebimento das mercadorias e o processamento da fatura. Onde obter Um documento contábil é criado na tabela BKPF (cabeçalho), e seus itens ficam em BSEG ou no diário universal ACDOCA. O documento é vinculado ao PO 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 | Indica que o Pedido de Compra recebeu todas as aprovações internas necessárias e está autorizado para ser liberado ao fornecedor. O evento é inferido a partir de uma alteração de status na estratégia de liberação do Pedido de Compra. | ||
| Por que isso importa Este é um marco importante para medir a eficiência da aprovação e o retrabalho após a aprovação. Analisar o tempo entre a criação e a aprovação do PO destaca atrasos no processo interno. Onde obter Inferido a partir do indicador de liberação (FRGKE) na tabela EKKO. O registro de data e hora é determinado consultando o histórico de alterações (CDHDR/CDPOS) para identificar quando esse campo foi atualizado para o status de 'liberado'. Captura Inferido a partir dos logs de alterações do campo indicador de liberação (FRGKE) na tabela EKKO. Tipo de evento inferred | |||
| Pedido de Compra Concluído | Esta atividade indica que um item do Pedido de Compra é considerado encerrado do ponto de vista logístico. Isso é inferido quando os indicadores 'Entrega concluída' e 'Fatura final' estão definidos. | ||
| Por que isso importa Este é o ponto final da análise do ciclo de vida do Pedido de Compra. Medir o tempo até esse evento fornece o tempo de ciclo de ponta a ponta das operações de compras. Onde obter Inferido a partir dos indicadores de status na tabela de itens do Pedido de Compra, EKPO. O evento ocorre quando os indicadores 'Entrega concluída' (ELIKZ) e 'Fatura final' (EREKZ) estão ambos definidos como verdadeiros. Captura Inferido a partir dos logs de alterações quando os campos ELIKZ e EREKZ da EKPO estão ambos marcados 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 criado com ou sem referência a uma requisição de compra. Este é um evento explícito, capturado quando o documento de PO é salvo pela primeira vez no sistema. | ||
| Por que isso importa Esta atividade pode servir como um ponto de início alternativo para o processo, especialmente na análise de compras fora das políticas. É um evento fundamental para acompanhar o tempo total de processamento do PO. Onde obter Registrado na tabela de cabeçalho de Pedidos de Compra EKKO. A data de criação (AEDAT) e o horário do documento são armazenados diretamente nessa tabela. Captura Registro de data e hora da criação (AEDAT) na tabela EKKO do documento de Pedido de Compra. Tipo de evento explicit | |||
| Recebimento de Mercadorias Registrado | Representa o recebimento físico das mercadorias do fornecedor e o respectivo registro no sistema. Esta é uma transação explícita que atualiza o histórico do Pedido de Compra. | ||
| Por que isso importa Este é um marco importante que encerra o prazo de entrega do fornecedor e inicia o processo interno de verificação da fatura. Ele é essencial para acompanhar os índices de entrega no prazo. Onde obter Registrado como um documento de material nas tabelas MKPF (cabeçalho) e MSEG (item), e vinculado ao histórico do Pedido de Compra na tabela EKBE com um tipo de movimento específico, por exemplo, 101. Captura Data de lançamento (BUDAT) do cabeçalho do documento de material (MKPF), vinculada por meio da EKBE. Tipo de evento explicit | |||
| Requisição de Compra Aprovada | Representa a aprovação formal de uma requisição de compra por um gerente ou aprovador designado. Normalmente, isso é inferido a partir de uma alteração de status no documento da requisição, indicando que ele está pronto para ser convertido em um Pedido de Compra. | ||
| Por que isso importa Este é um marco crítico para acompanhar os tempos do ciclo de aprovação e identificar gargalos. Atrasos nessa etapa afetam diretamente a rapidez com que um Pedido de Compra pode ser criado e enviado ao fornecedor. Onde obter Inferido a partir dos campos de status de liberação na tabela EBAN, por exemplo, FRGZU - indicador de liberação. O registro de data e hora é derivado dos documentos de alteração CDHDR/CDPOS, que registram quando o status final de liberação foi definido. Captura Inferido a partir dos logs de alterações dos campos de status de liberação na tabela EBAN, usando CDHDR/CDPOS. Tipo de evento inferred | |||
| Requisição de Compra Criada | Esta atividade marca a solicitação formal de mercadorias ou serviços, iniciando o processo de compras. O evento é capturado explicitamente quando um usuário salva um novo documento de requisição de compra, por exemplo, usando a transação ME51N. | ||
| Por que isso importa Este é o principal ponto de início do ciclo de vida de muitos Pedidos de Compra. Analisar o tempo entre este evento e a criação do PO ajuda a identificar atrasos no sourcing e no processamento interno. Onde obter Registrado na tabela EBAN (Requisição de Compra). O registro de data e hora do evento de criação pode ser encontrado nas tabelas de histórico de alterações CDHDR e CDPOS do 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 | Esta atividade marca a confirmação de que um serviço especificado em um Pedido de Compra foi prestado. Ela é capturada explicitamente por meio da criação de uma folha de registro de serviços. | ||
| Por que isso importa Para compras baseadas em serviços, este é o equivalente ao recebimento de mercadorias. É essencial para acompanhar os prazos de prestação dos serviços e permitir pagamentos pontuais aos fornecedores. Onde obter Registrado por meio da criação de uma folha de registro de serviços, com dados armazenados nas tabelas ESSR (cabeçalho) e ESLL (linhas). A data de criação serve como registro de data e hora. Captura Data de criação do documento da folha de registro de serviços na tabela ESSR. Tipo de evento explicit | |||
| Fatura Paga | Marca a liquidação final da fatura do fornecedor por meio de uma execução de pagamentos ou de um pagamento manual. Esta é uma transação financeira explícita que cria um documento de compensação. | ||
| Por que isso importa Embora tecnicamente faça parte do processo de pagamentos, incluir esta atividade oferece uma visão completa do ciclo de procure-to-pay. Ela é essencial para analisar as condições de pagamento e a performance. Onde obter O pagamento é registrado como um documento de compensação em BKPF/ACDOCA. A data de compensação (AUGDT) no item da fatura na tabela BSEG ou ACDOCA indica o evento de pagamento. Captura Data de compensação (AUGDT) do documento da fatura, encontrada em BSEG ou ACDOCA. Tipo de evento explicit | |||
| Mercadorias Devolvidas | Indica que mercadorias recebidas anteriormente foram devolvidas ao fornecedor, normalmente devido a problemas de qualidade, danos ou envio incorreto. Isso é capturado como um movimento explícito de estorno de mercadorias. | ||
| Por que isso importa Esta atividade destaca retrabalho e possíveis problemas com a qualidade do fornecedor ou a precisão do pedido. Uma frequência alta de devoluções para um fornecedor ou material específico sinaliza um problema. Onde obter Registrado como um documento de material com um tipo específico de movimento de devolução, por exemplo, 122. O evento é registrado em MKPF/MSEG e vinculado ao PO na tabela de histórico EKBE. Captura Data de lançamento do documento de material com um tipo de movimento de devolução na EKBE. Tipo de evento explicit | |||
| Pedido de Compra Alterado | Esta atividade indica que uma modificação foi feita no Pedido de Compra após sua criação inicial, como uma alteração na quantidade, no preço ou na data de entrega. Ela é capturada explicitamente nos logs de alterações do sistema. | ||
| Por que isso importa Acompanhar alterações, especialmente após a aprovação, é essencial para identificar ineficiências do processo, retrabalho e possíveis problemas de conformidade. Alterações frequentes podem indicar especificações iniciais inadequadas. Onde obter Registrado nas tabelas de documentos de alteração CDHDR (cabeçalho) e CDPOS (item) para objetos de Pedido de Compra (EINKBELEG). Cada alteração cria uma entrada detalhada no log. Captura Evento registrado para alterações em campos importantes das tabelas EKKO ou EKPO, armazenadas em CDHDR/CDPOS. Tipo de evento explicit | |||
| Pedido de Compra Enviado ao Fornecedor | Representa o momento em que o Pedido de Compra é comunicado ao fornecedor, por exemplo, via EDI, e-mail ou impressão. Esse evento costuma ser capturado pelos logs de gestão de saída do sistema. | ||
| Por que isso importa Esta atividade marca o início efetivo do prazo de entrega do fornecedor. Ela é essencial para medir com precisão a performance do fornecedor a partir do momento em que ele recebe o pedido. Onde obter Capturado na tabela de controle de saída NAST, que registra as mensagens enviadas para um documento de compras. A data e o horário do tipo de saída relevante, por exemplo, EDI ou e-mail, podem ser utilizados. Captura Registro de data e hora da primeira mensagem de saída enviada com sucesso para o PO na tabela NAST. Tipo de evento inferred | |||
| Pedido de Compra Excluído | Representa o cancelamento ou a exclusão lógica de um item do Pedido de Compra ou de todo o documento. Isso é capturado quando um usuário define um indicador de exclusão no documento. | ||
| Por que isso importa Esta atividade é um ponto final alternativo do processo, indicando uma falha ou cancelamento. Analisar por que os POs são excluídos pode revelar problemas no planejamento da demanda ou na definição dos requisitos. Onde obter Capturado a partir do indicador de exclusão (LOEKZ) nas tabelas de cabeçalho (EKKO) ou de itens (EKPO) do Pedido de Compra. O registro de data e hora é derivado dos documentos de alteração (CDHDR/CDPOS). Captura Registro de data e hora dos documentos de alteração (CDHDR/CDPOS) quando o indicador de exclusão (LOEKZ) é definido. Tipo de evento explicit | |||
Guias de extração
Etapas
- Pré-requisitos e acesso: verifique se você tem um usuário com as autorizações adequadas para consultar CDS views (Core Data Services) no sistema SAP S/4HANA. O acesso pode ser feito pelo SAP HANA Studio, pelo ABAP Development Tools (ADT) para Eclipse ou por uma ferramenta de extração de dados de terceiros compatível com conexões SQL ao banco de dados SAP HANA.
- Identifique os dados de conexão do sistema: obtenha os parâmetros necessários para a conexão com seu sistema SAP S/4HANA, incluindo host, número da instância e suas credenciais de autenticação.
- Conecte-se ao banco de dados: usando seu cliente SQL preferido, estabeleça uma conexão com o banco de dados SAP S/4HANA onde estão as CDS views.
- Prepare a consulta SQL: copie a consulta SQL completa fornecida na seção de consulta deste documento para o seu editor SQL. Essa consulta foi criada para extrair todas as atividades e atributos necessários.
- Defina os parâmetros de filtragem: localize os valores de espaço reservado na consulta. Substitua _start_date e _end_date pelo período desejado para sua análise, por exemplo, '20230101' e '20231231'. Altere o filtro poh.CompanyCode para incluir os códigos de empresa específicos que você deseja analisar.
- Execute a consulta: execute a consulta SQL modificada no banco de dados S/4HANA. Dependendo do volume de dados e do período especificado, essa execução pode levar algum tempo.
- Revise os resultados preliminares: quando a consulta terminar, faça uma revisão rápida da saída no seu cliente SQL. Verifique se diferentes atividades estão presentes, se os timestamps foram preenchidos corretamente e se o case ID (PurchaseOrderNumber) é consistente.
- Exporte os dados: exporte o conjunto completo de resultados da sua ferramenta SQL para um arquivo CSV (Comma Separated Values). Verifique se o arquivo usa codificação UTF-8 para evitar problemas com caracteres.
- Prepare o upload: antes de fazer o upload para o ProcessMind, abra o arquivo CSV e confirme 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 exportação os tenha alterado.
- Faça o upload para o ProcessMind: envie o arquivo CSV finalizado para o seu projeto no ProcessMind. Durante a importação, mapeie as colunas do arquivo para os campos correspondentes de case ID, atividade e timestamp.
Configuração
- Principais CDS views usadas: a lógica de extração depende de um conjunto de CDS views padrão, semanticamente ricas. As principais views incluem:
- I_PurchaseOrderItemAPI01: para os dados principais dos itens da ordem de compra.
- I_PurchaseRequisitionItemAPI01: para os detalhes das requisições de compra.
- I_MaterialDocumentItem: para movimentos de mercadorias, como recebimentos e devoluções.
- I_ServiceEntrySheetAPI01: para eventos de confirmação de serviços.
- I_SupplierInvoiceAPI01: para informações das faturas de fornecedores.
- I_OperationalAcctgDocItem: para relacionar faturas a documentos financeiros e acompanhar pagamentos.
- I_ChangeDocument: para capturar alterações na ordem de compra.
- Filtragem por período: é fundamental aplicar um filtro de período para controlar a performance e o volume de dados. A consulta usa os espaços de reserva _start_date e _end_date na data de criação da ordem de compra (PurchaseOrderDate). Como ponto de partida, recomenda-se usar 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 para um refinamento maior.
- Pré-requisitos: o usuário que executar a consulta precisa de autorização SELECT em todas as CDS views listadas acima. Normalmente, o acesso a essas views é 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
- Confirme se o acesso SQL direto ao schema SAP HANA que contém EKKO e EKPO está disponível e obtenha as autorizações de leitura necessárias. Substitua os espaços de reserva de schema e conexão pelos valores configurados para o seu sistema.
- Defina a janela de extração usando [Start timestamp] e [End timestamp]. Para a carga inicial, recomenda-se uma janela de três a seis meses. Aplique filtros de código de empresa e tipo de documento somente quando forem exigidos pelo escopo do relatório.
- Identifique as ordens de compra em EKKO e EKPO, mantendo o número da ordem de compra, fornecedor, tipo de documento, código de empresa, data de criação, hora de criação e atributos no nível do item. Agregue os valores líquidos de EKPO para calcular TotalNetAmount no nível da ordem de compra.
- Extraia os eventos de criação e aprovação de requisições de compra de EBAN, usando o número da requisição e a referência do item disponíveis em EKPO para associar as requisições às ordens de compra. Como os indicadores e timestamps de aprovação variam conforme a configuração de liberação, configure as expressões de status e timestamp com base na estratégia de liberação ativa do SAP em [Configure based on your system].
- Extraia os eventos de criação, aprovação, alteração, exclusão e conclusão da ordem de compra. A criação usa a data e a hora de criação de EKKO. Aprovação, alteração e exclusão exigem fontes de histórico de liberação ou alteração. Configure as expressões das fontes correspondentes usando [Your table name] e [Your column name] quando o histórico relevante não estiver exposto no schema selecionado.
- Extraia os eventos de comunicação com fornecedores, recebimento de mercadorias, confirmação de serviços, devolução de mercadorias, recebimento de faturas e pagamento de faturas das fontes aplicáveis de saída, documentos de material, entrada de serviços, faturas, contabilidade e compensação. A consulta inclui espaços de reserva explícitos para objetos específicos do sistema, pois essas fontes não são representadas apenas por EKKO e EKPO.
- Normalize todos os eventos das fontes na mesma estrutura de Event Log. Cada linha deve conter PurchaseOrderNumber, ActivityName, EventTime, SourceSystem, LastDataUpdate, VendorId, UserName, TotalNetAmount, PurchaseRequisitionNumber, RequestedDeliveryDate e DocumentType. Preserve múltiplas ocorrências de uma atividade quando a fonte contiver vários eventos válidos.
- Valide os timestamps, remova apenas linhas de origem exatamente duplicadas e não infira atividades que não tenham um registro de origem. O ProcessMind lê o Event Log como ele está, portanto toda atividade exibida na visualização do processo deve estar presente como uma linha explícita.
- Exporte o resultado como um arquivo delimitado ou conjunto de resultados de banco de dados, com uma linha de cabeçalho e nomes de colunas estáveis. Use um formato de timestamp compatível com a configuração de upload do ProcessMind, mantenha PurchaseOrderNumber como texto e faça o upload do Event Log completo pela conexão de dados configurada do ProcessMind.
Configuração
- Objetos de origem: EKKO e EKPO são as fontes confirmadas do cabeçalho e dos itens das ordens de compra. Objetos adicionais para requisições, status de liberação, histórico de alterações, saída, movimentos de mercadorias, folhas de entrada de serviços, faturas, pagamentos e compensação devem ser configurados de acordo com a versão do SAP S/4HANA e o modelo de dados ativo.
- Identificador do case: use PurchaseOrderNumber como identificador do case. Os eventos no nível do item devem ser associados ao número da ordem de compra, enquanto as referências dos itens devem ser mantidas em uma coluna adicional específica da fonte, se necessário.
- Período: comece com três a seis meses. Para cargas históricas, processe janelas menores e concilie os limites sobrepostos para evitar omissões.
- Filtros: configure filtros de Company Code, Document Type, VendorId, organização de compras, grupo de compras e data do evento de acordo com o escopo necessário. Os filtros de código de empresa e tipo de documento devem usar valores válidos no sistema de destino.
- Semântica dos eventos: criação e exclusão podem ser explícitas quando os campos ou logs relevantes do documento estiverem disponíveis. Aprovação e conclusão são eventos baseados em status e exigem timestamps de status configurados. Não crie linhas apenas com base em um status atual sem um timestamp de evento justificável.
- Performance: filtre primeiro por datas dos eventos e escopo organizacional, agregue EKPO antes de fazer joins com as fontes de eventos sempre que possível e execute cargas históricas grandes em janelas de tempo. Garanta estatísticas adequadas do banco de dados e evite joins irrestritos entre fontes de itens, contabilidade e histórico de alterações.
- Timestamp de atualização: defina LastDataUpdate como o timestamp de execução da extração para todas as linhas de uma execução.
- Pré-requisitos: os pré-requisitos incluem conectividade com o SAP HANA, autorização de leitura para todos os objetos de origem configurados, acesso aos dados relevantes de compras, gestão de estoque, compras de serviços, verificação de faturas e contas a pagar, além de uma conexão do ProcessMind capaz de importar o arquivo ou conjunto de resultados selecionado.
- Configuração específica do sistema: substitua cada espaço de reserva de origem entre colchetes na consulta por uma tabela, view, coluna ou expressão aprovada do sistema SAP S/4HANA de destino. Não exponha credenciais na consulta nem na configuração da extração.
a Consulta de exemplo sql
WITH
params AS (
SELECT
CAST('[Start timestamp]' AS TIMESTAMP) AS start_ts,
CAST('[End timestamp]' AS TIMESTAMP) AS end_ts,
CAST(CURRENT_TIMESTAMP AS TIMESTAMP) AS last_data_update,
CAST('[Source system]' AS NVARCHAR(100)) AS source_system
FROM DUMMY
),
po_base AS (
SELECT
h.MANDT,
h.EBELN AS PurchaseOrderNumber,
h.LIFNR AS VendorId,
h.BSART AS DocumentType,
h.BUKRS AS CompanyCode,
CAST(h.AEDAT AS DATE) AS POChangedDate,
CAST(h.AEDAT AS TIMESTAMP) AS POChangedTimestamp,
CAST(h.ERNAM AS NVARCHAR(100)) AS POCreatedBy,
CAST(h.BEDAT AS DATE) AS PODate,
CAST(h.EBELN AS NVARCHAR(20)) AS PurchaseOrderKey,
CAST(SUM(COALESCE(i.NETWR, 0)) AS DECIMAL(23, 2)) AS TotalNetAmount,
CAST(MIN(i.BEDNR) AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
CAST(MIN(i.EINDT) AS DATE) AS RequestedDeliveryDate
FROM EKKO h
INNER JOIN EKPO i
ON i.MANDT = h.MANDT
AND i.EBELN = h.EBELN
WHERE h.AEDAT >= (SELECT start_ts FROM params)
AND h.AEDAT < (SELECT end_ts FROM params)
AND h.BUKRS IN ([Company Code filter])
AND h.BSART IN ([Document Type filter])
GROUP BY
h.MANDT,
h.EBELN,
h.LIFNR,
h.BSART,
h.BUKRS,
h.AEDAT,
h.ERNAM,
h.BEDAT
),
po_items AS (
SELECT
i.MANDT,
i.EBELN AS PurchaseOrderNumber,
i.EBELP,
i.BANFN AS PurchaseRequisitionNumber,
i.BEDNR,
i.EINDT AS RequestedDeliveryDate
FROM EKPO i
),
events AS (
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(r.[Purchase requisition creation timestamp] AS TIMESTAMP) AS EventTime,
s.source_system AS SourceSystem,
s.last_data_update AS LastDataUpdate,
p.VendorId,
CAST(r.[Purchase requisition created by] AS NVARCHAR(100)) AS UserName,
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition source table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition creation timestamp] >= s.start_ts
AND r.[Purchase requisition creation timestamp] < s.end_ts
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(r.[Purchase requisition approval timestamp] AS TIMESTAMP) AS EventTime,
s.source_system,
s.last_data_update,
p.VendorId,
CAST(r.[Purchase requisition approver] AS NVARCHAR(100)),
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)),
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition approval history table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition approval timestamp] >= s.start_ts
AND r.[Purchase requisition approval timestamp] < s.end_ts
AND r.[Approval status] = '[Approved status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Created',
CAST(p.PODate AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
p.POCreatedBy,
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
CROSS JOIN params s
WHERE p.PODate >= CAST(s.start_ts AS DATE)
AND p.PODate < CAST(s.end_ts AS DATE)
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Approved',
CAST(a.[Purchase order approval timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(a.[Approver] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order release history table or view] a
ON a.[Client] = p.MANDT
AND a.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE a.[Purchase order approval timestamp] >= s.start_ts
AND a.[Purchase order approval timestamp] < s.end_ts
AND a.[Release status] = '[Approved release status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Sent to Vendor',
CAST(o.[Output timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(o.[Output user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order output source table or view] o
ON o.[Client] = p.MANDT
AND o.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE o.[Output timestamp] >= s.start_ts
AND o.[Output timestamp] < s.end_ts
AND o.[Output status] = '[Successfully processed output status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Changed',
CAST(c.[Change timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(c.[Changed by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order change history table or view] c
ON c.[Client] = p.MANDT
AND c.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE c.[Change timestamp] >= s.start_ts
AND c.[Change timestamp] < s.end_ts
AND c.[Change indicator] = '[Changed indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Receipt Posted',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods receipt movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Services Confirmation Entered',
CAST(v.[Service entry timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(v.[Entered by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your service entry sheet source table or view] v
ON v.[Client] = p.MANDT
AND v.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE v.[Service entry timestamp] >= s.start_ts
AND v.[Service entry timestamp] < s.end_ts
AND v.[Service entry status] = '[Accepted service entry status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Returned',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods return movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Received',
CAST(i.[Invoice posting timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Invoice posting timestamp] >= s.start_ts
AND i.[Invoice posting timestamp] < s.end_ts
AND i.[Invoice status] = '[Posted invoice status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Paid',
CAST(i.[Clearing timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Cleared by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice clearing source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Clearing timestamp] >= s.start_ts
AND i.[Clearing timestamp] < s.end_ts
AND i.[Clearing status] = '[Cleared status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Completed',
CAST(x.[Completion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(x.[Completion user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order item status source table or view] x
ON x.[Client] = p.MANDT
AND x.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE x.[Completion timestamp] >= s.start_ts
AND x.[Completion timestamp] < s.end_ts
AND x.[Delivery completed indicator] = '[Set indicator value]'
AND x.[Final invoice indicator] = '[Set indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Deleted',
CAST(d.[Deletion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(d.[Deleted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order deletion history table or view] d
ON d.[Client] = p.MANDT
AND d.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE d.[Deletion timestamp] >= s.start_ts
AND d.[Deletion timestamp] < s.end_ts
AND d.[Deletion indicator] = '[Set deletion indicator value]'
)
SELECT
PurchaseOrderNumber,
ActivityName,
EventTime,
SourceSystem,
LastDataUpdate,
VendorId,
UserName,
TotalNetAmount,
PurchaseRequisitionNumber,
RequestedDeliveryDate,
DocumentType
FROM events
WHERE PurchaseOrderNumber IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY PurchaseOrderNumber, EventTime, ActivityName; Etapas
- Especificação e design: defina a estrutura final dos dados do arquivo de Event Log, incluindo todos os atributos obrigatórios e recomendados. Documente as tabelas SAP específicas, como EKKO, EKPO, EKBE, CDHDR, CDPOS e BKPF, que serão usadas como fonte de dados para cada uma das 13 atividades obrigatórias.
- Criação do programa: na SAP GUI, acesse o ABAP Editor usando o código de transação SE38 ou SE80. Crie um novo programa executável, por exemplo, Z_PM_PO_EXTRACT.
- Defina a tela de seleção: programe a tela de seleção do relatório. Ela permite que os usuários filtrem os dados que desejam extrair. Inclua parâmetros para o período de criação da ordem de compra (P_AEDAT), o código de empresa (P_BUKRS) e o 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 Event Log final, correspondente à estrutura definida na etapa de especificação.
- Implemente a lógica de seleção de dados: escreva a lógica ABAP principal para selecionar os dados de cada uma das 13 atividades. Isso envolve uma série de instruções SELECT nas tabelas SAP relevantes, com joins quando necessário. Para eventos baseados em alterações, leia as tabelas de log de alterações CDHDR e CDPOS.
- Transforme e mapeie os dados: para cada registro recuperado, mapeie os campos das tabelas SAP para as colunas correspondentes da tabela interna do Event Log final. Defina ActivityName com base no evento processado, por exemplo, 'Purchase Order Created'. Converta os campos de data e hora em um formato de timestamp consistente para EventTime.
- Consolide os dados dos eventos: depois de processar os 13 tipos de atividade, confirme se todos os dados foram reunidos em uma única tabela interna unificada. Essa tabela representa o Event Log completo das ordens de compra selecionadas.
- Implemente a saída do arquivo: adicione uma função 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 salvem o arquivo como CSV no computador local ou usar OPEN DATASET para salvá-lo no servidor de aplicação SAP para processamento em segundo plano.
- Crie um código de transação (opcional): para facilitar o acesso do time de negócio ao programa, use o código de transação SE93 para criar um código de transação personalizado, por exemplo, ZPM_PO_EXTRACT, que execute o programa ABAP.
- Agende um job em segundo plano: para grandes volumes de dados ou extrações automatizadas, use o código de transação SM36 para agendar a execução do programa 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 com eficiência. Os principais filtros incluem:
- Período: um período obrigatório para a data de criação da ordem de compra (EKKO-AEDAT). Recomenda-se começar com um período de 3 a 6 meses para controlar o volume de dados e a performance do relatório.
- Código de empresa (BUKRS): essencial para organizações com várias entidades legais, pois restringe o escopo da extração.
- Tipo de documento de compras (BSART): permite filtrar tipos específicos de ordens de compra, como ordem de compra padrão, contrato-quadro ou ordem de transferência de estoque, para concentrar a análise.
- Leitura do log de alterações: a extração de atividades como 'Purchase Order Approved' ou 'Purchase Order Changed' depende da leitura das tabelas de log de alterações SAP (CDHDR, CDPOS). Isso pode consumir muitos recursos. A lógica ABAP deve ser otimizada para selecionar apenas as classes de objeto necessárias (EINKBELEG, BANF) e as combinações de tabela/campo relevantes.
- Autorizações: o usuário ou a conta técnica que executar este relatório precisa de autorizações amplas de leitura para tabelas de 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 segundo plano: para extrações que cubram mais de alguns meses de dados ou sejam executadas em um sistema com alto volume de transações, execute sempre o programa em segundo plano para evitar timeouts do 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. Pronto para começar?
Este Template oferece uma base sólida para sua jornada de Process Mining. Comece hoje a usar seus dados do SAP S/4HANA para descobrir oportunidades de eficiência e transformar seu processo Purchase to Pay.
Otimize sua ordem de compra P2P: reduza o tempo de ciclo agora
Elimine ineficiências e reduza em 30% o tempo de ciclo da sua ordem de compra P2P.
Não é necessário cartão de crédito. Configure tudo em poucos minutos.