Seu Template de dados de compras e pagamentos: pedido de compra
Seu Template de dados de compras e pagamentos: pedido de compra
- Atributos recomendados para coleta
- Principais atividades a acompanhar
- Orientações para extração no SAP ECC
Atributos de compras e pagamentos: pedido de compra
| Nome | Descrição | ||
|---|---|---|---|
| Atividade Activity | Nome do evento ou da etapa de negócio específica que ocorreu no ciclo de vida do pedido de compra. | ||
| Descrição Este atributo descreve uma etapa do processo, como "Pedido de compra criado", "Pedido de compra aprovado" ou "Entrada de mercadorias lançada". A sequência dessas atividades forma o fluxo do processo de cada pedido de compra. Analisar a sequência, a frequência e a duração entre as atividades é a base de Process Mining. Isso ajuda a identificar gargalos, ciclos de retrabalho e desvios do processo padrão, permitindo melhorias direcionadas e iniciativas de padronização. Por que isso importa As atividades definem as etapas do processo. Analisar sua sequência e duração revela o fluxo real do processo, os gargalos e os desvios. Onde encontrar Derivado de várias tabelas e registros de transações do SAP, como CDHDR/CDPOS para alterações, EKBE para entrada de mercadorias e recebimento de faturas (GR/IR) e EBAN para requisições. Muitas vezes, é necessário usar uma lógica personalizada ou um programa de extração para gerar esses dados. Exemplos Pedido de compra criadoPedido de compra aprovadoEntrada de mercadorias lançada | |||
| Data e hora do evento EventTime | A data e a hora exatas em que a atividade ocorreu. | ||
| Descrição Este registro de data e hora marca o momento exato em que um evento ocorreu, como a aprovação de um pedido de compra ou o lançamento de uma entrada de mercadorias. Ele define a ordem cronológica de todas as atividades de um caso. As datas e horas são fundamentais para Process Mining, pois permitem todas as análises baseadas em tempo. Isso inclui calcular os tempos de ciclo entre atividades, identificar atrasos, analisar o fluxo do processo e medir a performance em relação aos acordos de nível de serviço (SLAs). Por que isso importa Este registro de data e hora é essencial para calcular todas as métricas baseadas em duração, como tempos de ciclo e gargalos, e para ordenar os eventos cronologicamente. Onde encontrar Derivado de vários campos de data e hora nas tabelas do SAP, como EKKO-AEDAT (data de alteração), CDHDR-UDATE/UTIME (data e hora do registro de alterações) ou EKBE-BUDAT (data de lançamento). Exemplos 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Pedido de compra PurchaseOrder | Identificador exclusivo do documento de pedido de compra (PO), usado como caso principal para acompanhar o processo de compras. | ||
| Descrição O número do pedido de compra é o identificador central que conecta todas as atividades, desde sua criação até o recebimento final das mercadorias e a conclusão. Cada número exclusivo de pedido representa uma instância do processo de compras. Em Process Mining, este atributo é essencial para reconstruir a jornada completa de cada compra. Ele permite analisar em detalhes os tempos de ciclo, as variações do processo e as verificações de conformidade de cada pedido, formando a base de todo o modelo de processo. Por que isso importa Este é o identificador principal que conecta todos os eventos relacionados e permite analisar o ciclo de vida completo de cada pedido de compra. Onde encontrar Tabela: EKKO, campo: EBELN Exemplos 450001762345000176244500017625 | |||
| Empresa CompanyCode | Identificador da entidade legal ou empresa que inicia a compra. | ||
| Descrição A empresa representa uma entidade legal independente no SAP. Todas as transações são lançadas no nível da empresa, que é uma unidade organizacional fundamental. Analisar o processo por empresa permite comparar a eficiência e a conformidade das compras entre diferentes unidades de negócio ou países. Isso ajuda a identificar boas práticas que podem ser replicadas em outras unidades e a localizar aquelas que enfrentam dificuldades no processo. Por que isso importa Representa a entidade legal e permite comparar a performance do processo e verificar a conformidade entre diferentes áreas da organização. Onde encontrar Tabela: EKKO, campo: BUKRS Exemplos 10002100US01 | |||
| Grupo de materiais MaterialGroup | Classificação usada para agrupar materiais ou serviços com características semelhantes. | ||
| Descrição O grupo de materiais, ou categoria de compras, classifica o tipo de bens ou serviços adquiridos. Alguns exemplos são "Hardware de TI", "Materiais de escritório" e "Serviços profissionais". Este atributo é essencial para analisar os gastos e entender os padrões de compras. Ele permite filtrar o processo para analisar como diferentes categorias são tratadas, quem as aprova e quais fornecedores as atendem. É uma dimensão importante do Dashboard "Análise do valor dos pedidos de compra". Por que isso importa Permite segmentar o processo por categoria de produto ou serviço, revelando diferenças de comportamento, tempo de ciclo e fornecedores para cada tipo de gasto. Onde encontrar Tabela: EKPO, campo: MATKL Exemplos 00101IT_HWCONSULT | |||
| Nome de usuário UserName | O ID da pessoa que executou a atividade. | ||
| Descrição Este atributo registra o nome de usuário do SAP da pessoa que criou, alterou ou aprovou um documento. Em etapas automatizadas, pode mostrar o ID de um usuário de sistema ou de processamento em lote. Analisar os dados por usuário ajuda a identificar necessidades de treinamento, pessoas com alto desempenho ou possíveis problemas de conformidade. É essencial para criar Dashboards sobre a distribuição da carga de trabalho, a conformidade com a matriz de aprovação e a performance de diferentes equipes ou pessoas. Por que isso importa Vincula as ações dos usuários a pessoas específicas, permitindo analisar a performance, a carga de trabalho e o cumprimento dos protocolos de conformidade. Onde encontrar Tabela: EKKO, campo: ERNAM (Criado por); tabela: CDHDR, campo: USERNAME (Alterado por). Exemplos JSMITHMBROWNBATCH_USER | |||
| Número do fornecedor VendorNumber | Identificador exclusivo do fornecedor. | ||
| Descrição Este é o código que identifica exclusivamente o fornecedor de quem os bens ou serviços são comprados. É um dado mestre essencial no processo de compras. Este atributo é essencial para análises por fornecedor. Ele permite avaliar a performance de entrega dos fornecedores, comparar prazos de entrega entre diferentes fornecedores e analisar padrões de gastos. É a principal dimensão do Dashboard "Performance de entrega dos fornecedores". Por que isso importa Permite analisar a performance dos fornecedores e identificar aqueles que são confiáveis e os que causam atrasos ou problemas de qualidade. Onde encontrar Tabela: EKKO, campo: LIFNR Exemplos 100345V-20598700112 | |||
| Tipo de documento DocumentType | Código que classifica os diferentes tipos de pedidos de compra. | ||
| Descrição O tipo de documento é uma configuração do SAP que controla a faixa de numeração, a seleção de campos e o fluxo geral do processo de um pedido de compra. Por exemplo, pode haver tipos diferentes para pedidos padrão, pedidos de serviços ou pedidos de transferência de estoque. Este atributo é uma dimensão importante para a análise, pois diferentes tipos de documento costumam seguir processos distintos de propósito. Filtrar por tipo de documento permite comparar com mais precisão tempos de ciclo e fluxos de processo equivalentes. Por que isso importa Diferencia os tipos de processos de compras (por exemplo, padrão, serviço ou devolução), que costumam ter fluxos e expectativas de performance distintos. Onde encontrar Tabela: EKKO, campo: BSART Exemplos NBFOUB | |||
| Valor do pedido OrderAmount | Valor monetário total do item do pedido de compra. | ||
| Descrição Este atributo representa o valor total de um item específico do pedido de compra, calculado multiplicando a quantidade pelo preço líquido. Para obter o valor total do pedido, é preciso somar os valores dos itens. Analisar o processo por valor do pedido é essencial para identificar transações de alto valor que podem exigir controles mais rigorosos ou outros fluxos de aprovação. Esse atributo alimenta o Dashboard "Análise do valor dos pedidos de compra" e ajuda a priorizar melhorias nos pedidos de maior impacto financeiro. Por que isso importa Quantifica o impacto financeiro de cada compra, permitindo priorizar pedidos de alto valor ou identificar oportunidades de redução de custos. Onde encontrar Tabela: EKPO, campo: NETWR (valor líquido do pedido). Exemplos 1500.00250.7512345.50 | |||
| Alteração após aprovação IsPostApprovalChange | Indicador que mostra se houve alteração no pedido de compra após a aprovação inicial. | ||
| Descrição Este atributo booleano é verdadeiro quando a atividade 'Pedido de compra alterado' ocorre após a atividade 'Pedido de compra aprovado' para o mesmo pedido. Ele ajuda a identificar alterações problemáticas feitas em etapas avançadas do processo. Este campo calculado dá suporte direto ao KPI 'Taxa de alterações em pedidos de compra após aprovação' e ao Dashboard 'Retrabalho e alterações em pedidos de compra'. Ele ajuda a quantificar e destacar mudanças que podem causar atrasos e exigir uma nova aprovação, apontando problemas na definição inicial dos requisitos ou do escopo. Por que isso importa Mede diretamente o retrabalho após a aprovação, um KPI importante para avaliar a estabilidade e a eficiência do processo. Taxas elevadas indicam problemas na definição inicial dos requisitos. Onde encontrar Este é um atributo calculado com base na sequência de atividades do Event Log. Exemplos truefalse | |||
| Data de entrega solicitada RequestedDeliveryDate | Data em que a empresa solicitou ao fornecedor a entrega dos bens ou serviços. | ||
| Descrição Esta é a data de entrega prevista no pedido de compra. Ela serve como referência para medir a performance real da entrega. Esta data é essencial para calcular o KPI de índice de recebimento de mercadorias no prazo. Ao comparar a data real de recebimento com a data solicitada, as organizações podem medir quantitativamente a confiabilidade dos fornecedores e a eficiência interna no recebimento, informações que alimentam diretamente o Dashboard "Performance de entrega dos fornecedores". Por que isso importa Esta é a data prevista para a entrega, essencial para calcular KPIs de pontualidade e avaliar a confiabilidade dos fornecedores. Onde encontrar Tabela: EKPO, campo: EINDT Exemplos 2023-06-102023-07-222023-08-01 | |||
| Entrega no prazo IsOnTimeDelivery | Indicador que mostra se as mercadorias foram recebidas até a data de entrega solicitada. | ||
| Descrição Este atributo booleano é verdadeiro quando a data e hora de registro da atividade 'Entrada de mercadorias registrada' é igual ou anterior à 'Data de entrega solicitada'. Ele apresenta um resultado claro, sim ou não, para a performance de entrega de cada item do pedido de compra. Este atributo é a base do KPI 'Taxa de recebimento de mercadorias no prazo'. Ele simplifica a análise da performance dos fornecedores e da eficiência interna no recebimento, permitindo agrupar e filtrar facilmente as entregas feitas no prazo e as atrasadas. Por que isso importa Oferece uma métrica clara de sucesso ou falha na pontualidade das entregas, dando suporte direto aos KPIs e aos Dashboards de performance dos fornecedores. Onde encontrar Este é um atributo calculado pela comparação entre a data de registro do recebimento de mercadorias (EKBE-BUDAT) e a data de entrega solicitada (EKPO-EINDT). Exemplos truefalse | |||
| Grupo de compras PurchasingGroup | Comprador ou grupo de compradores responsável pela atividade de compras. | ||
| Descrição O grupo de compras representa a pessoa ou equipe de compradores responsável por determinada atividade de compras. Esse grupo é o principal contato dos fornecedores. Este atributo permite uma análise mais detalhada do que a organização de compras. Ele ajuda a entender como a carga de trabalho é distribuída entre os compradores e a identificar diferenças de performance nesse nível, orientando a alocação de recursos e as iniciativas de treinamento. Por que isso importa Oferece uma visão detalhada de quem é responsável por cada compra, permitindo analisar a carga de trabalho e a performance por comprador ou equipe. Onde encontrar Tabela: EKKO, campo: EKGRP Exemplos 001002N01 | |||
| Moeda Currency | Código da moeda do valor do pedido de compra. | ||
| Descrição Este atributo especifica a moeda em que o valor do pedido de compra está expresso, como USD, EUR ou GBP. Ele fornece o contexto necessário para interpretar valores monetários. Para organizações globais, a moeda é essencial para uma análise financeira correta. Ela permite somar e comparar adequadamente os valores dos pedidos. Todos os KPIs monetários devem ser interpretados considerando a moeda correspondente. Por que isso importa Fornece o contexto necessário para interpretar valores monetários e garantir análises financeiras precisas, especialmente em organizações multinacionais. Onde encontrar Tabela: EKKO, campo: WAERS Exemplos USDEURJPY | |||
| Motivo da rejeição RejectionReason | Código ou texto que explica por que uma requisição ou um pedido de compra foi rejeitado. | ||
| Descrição Este atributo registra o motivo específico informado quando um pedido de compra é rejeitado durante o fluxo de trabalho de aprovação. Essa informação é essencial para entender as causas raiz do retrabalho e dos atrasos. A análise dos motivos de rejeição ajuda a identificar problemas recorrentes, como preços incorretos, estouro do orçamento ou seleção de fornecedores fora das normas de conformidade. Esse insight permite que a empresa trate as causas raiz, melhore a qualidade dos pedidos de compra desde a criação e agilize o processo de aprovação. Por que isso importa Mostra diretamente por que as aprovações falham, permitindo implementar melhorias direcionadas para reduzir o retrabalho e encurtar o tempo de ciclo das aprovações. Onde encontrar Pode ser difícil localizar essa informação. Ela pode estar armazenada em campos de texto longo ou depender de uma configuração personalizada do fluxo de trabalho. Em geral, é necessário conhecer detalhes específicos da implementação. Exemplos Preço incorretoOrçamento excedidoSolicitação duplicada | |||
| Nome do fornecedor VendorName | Nome legal do fornecedor. | ||
| Descrição Nome descritivo do fornecedor, mais fácil de entender do que o número do fornecedor. Normalmente, esse dado vem do cadastro mestre de fornecedores. O número do fornecedor é usado para vinculações e identificação exclusiva, enquanto o nome é essencial para Dashboards e relatórios voltados às pessoas usuárias. Ele torna as análises mais intuitivas e acessíveis para quem não conhece os códigos dos fornecedores. Por que isso importa Apresenta o nome do fornecedor por extenso, facilitando a compreensão de Dashboards e relatórios. Onde encontrar Tabela: LFA1, campo: NAME1. É necessário vincular EKKO-LIFNR a LFA1-LIFNR. Exemplos Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Organização de compras PurchasingOrganization | Unidade organizacional responsável por negociar preços e comprar materiais ou serviços. | ||
| Descrição A organização de compras é uma unidade organizacional importante no SAP, responsável pelas atividades de compras. Ela pode ser centralizada para toda a empresa ou descentralizada por fábrica ou região. Analisar a performance do processo por organização de compras ajuda a identificar quais equipes de compras são mais eficientes. Também permite comparar métricas como tempo de ciclo, taxas de retrabalho e custos entre diferentes unidades organizacionais, destacando boas práticas e áreas que precisam de apoio. Por que isso importa Identifica a equipe de compras responsável e permite comparar a performance e analisar diferentes unidades organizacionais. Onde encontrar Tabela: EKKO, campo: EKORG Exemplos 1000US01DE01 | |||
| Requisição de compra PurchaseRequisition | Identificador da requisição de compra que antecedeu o pedido de compra. | ||
| Descrição Este atributo vincula o pedido de compra à requisição que o originou. Nem todos os pedidos têm uma requisição anterior. Esse vínculo é essencial para analisar o Dashboard "Conversão de requisição em pedido" e o KPI de taxa de conversão de requisições em pedidos. Ele permite medir a eficiência do processo anterior, da solicitação inicial à criação do pedido formal, e identificar pedidos criados sem requisição, em desacordo com as políticas. Por que isso importa Vincula o pedido de compra à solicitação de origem, permitindo analisar a conversão de requisições em pedidos e identificar pedidos criados sem uma requisição anterior. Onde encontrar Tabela: EKPO, campo: BANFN Exemplos 1001589010015891 | |||
| Sistema de origem SourceSystem | O sistema do qual os dados foram extraídos. | ||
| Descrição Este atributo identifica a origem dos dados, normalmente um identificador de instância do SAP ECC (por exemplo, "ECC_PROD_100"). Em ambientes com vários sistemas, ele ajuda a diferenciar as fontes de dados. Para a governança e a linhagem dos dados, conhecer o sistema de origem é essencial. Isso ajuda a garantir a integridade dos dados e a solucionar problemas de extração ou qualidade, especialmente quando os dados são combinados de diferentes sistemas ou módulos de ERP. Por que isso importa Identifica a origem dos dados, essencial para a governança, a validação e a gestão de análises em vários sistemas. Onde encontrar Normalmente, é um valor estático adicionado durante a extração de dados para identificar o sistema de origem do conjunto de dados. Exemplos SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Última atualização dos dados LastDataUpdate | Data e hora que indicam quando os dados foram atualizados pela última vez a partir do sistema de origem. | ||
| Descrição Este atributo registra a data e a hora da extração ou atualização mais recente dos dados. Ele informa o quão atualizados estão os dados analisados. Exibir essas informações nos Dashboards é essencial para que as pessoas entendam se os insights se baseiam em dados quase em tempo real ou em um retrato histórico. Isso alinha as expectativas e ajuda a garantir que as decisões sejam tomadas com base em dados cuja atualidade é conhecida. Por que isso importa Informa às pessoas se os dados estão atualizados, ajudando a entender se a análise reflete o estado mais recente das operações. Onde encontrar Este registro de data e hora é gerado e adicionado pelo processo de extração de dados ou ETL durante sua execução. Exemplos 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Unidade fabril Plant | Local físico ou unidade fabril onde as mercadorias devem ser entregues. | ||
| Descrição A unidade fabril é uma unidade organizacional que representa uma instalação de produção, um armazém ou outro local onde mercadorias ou serviços são recebidos. A análise por unidade fabril ajuda a entender as diferenças geográficas no processo de compras. Ela pode revelar variações nos prazos de entrega dos fornecedores para determinados locais ou destacar unidades com processos de recebimento ineficientes, apoiando a análise da pontualidade no recebimento de mercadorias. Por que isso importa Indica o local de entrega, útil para analisar diferenças regionais no processo e a performance logística. Onde encontrar Tabela: EKPO, campo: WERKS Exemplos 100011002000 | |||
Atividades de compras e pagamentos: pedido de compra
| Atividade | Descrição | ||
|---|---|---|---|
| Entrada de mercadorias lançada | Esta atividade indica o recebimento físico de bens de um fornecedor para um pedido de compra específico. O lançamento da entrada de mercadorias é uma ação explícita (por exemplo, pela transação MIGO) que cria um documento de material e atualiza o estoque. | ||
| Por que isso importa Este é um marco importante para acompanhar a performance de entrega dos fornecedores e o início do processo de verificação da fatura. É usado para calcular os índices de entrega no prazo e de pontualidade no recebimento de mercadorias. Onde encontrar Registrado quando um documento de material é criado. A data e hora do evento correspondem à data de lançamento (MKPF-BUDAT) ou à data de criação (MKPF-CPUDT) da tabela de cabeçalho do documento de material (MKPF), vinculada ao pedido pela tabela de itens (MSEG). Coleta Use a data e hora de lançamento ou criação da tabela MKPF para documentos de material que façam referência ao pedido de compra. Tipo de evento explicit | |||
| Pedido de compra aprovado | Representa a aprovação final do pedido de compra, autorizando seu envio ao fornecedor. Esse marco importante costuma ser inferido quando o status de liberação do pedido muda para "totalmente liberado" ou "aprovado". | ||
| Por que isso importa Esta atividade é essencial para calcular o KPI de tempo de ciclo de aprovação do pedido de compra e identificar gargalos no Workflow de aprovação. Ela é necessária para a maioria das atividades seguintes, como o envio do pedido ao fornecedor. Onde encontrar Inferido pelo acompanhamento dos registros de alteração (CDHDR/CDPOS) da tabela de cabeçalho do pedido de compra (EKKO), para identificar quando o código de liberação final é aplicado ou quando o indicador de status geral de liberação (EKKO-FRGKE) é definido como "liberado". Coleta Identifique a data e hora em que o status geral de liberação do pedido (EKKO-FRGKE) muda para o estado final de aprovação. Tipo de evento inferred | |||
| Pedido de compra concluído | Indica que um item do pedido de compra é considerado totalmente entregue. É um evento inferido, normalmente identificado quando o indicador "Entrega concluída" é definido automática ou manualmente no item do pedido. | ||
| Por que isso importa Esta atividade funciona como ponto final lógico da etapa de atendimento do pedido. É essencial para calcular o tempo de ciclo total do pedido de compra, da criação à conclusão. Onde encontrar Inferido a partir dos documentos de alteração (CDHDR/CDPOS), que registram quando o indicador "Entrega concluída" (EKPO-ELIKZ) é definido como "X" para um item do pedido. A conclusão do último item pode indicar que o pedido inteiro foi concluído. Coleta Identifique nos documentos de alteração a data e hora em que o indicador EKPO-ELIKZ é definido. Tipo de evento inferred | |||
| Pedido de compra criado | Esta atividade indica a criação de um documento formal de pedido de compra, que constitui um contrato vinculante com um fornecedor. É um evento explícito, registrado quando alguém cria e salva um pedido de compra (por exemplo, pela transação ME21N), gerando entradas nas tabelas EKKO e EKPO. | ||
| Por que isso importa Marca o início oficial do ciclo de vida do pedido de compra. É um marco importante para medir tanto o tempo de conversão de requisição em pedido quanto o tempo total de atendimento do pedido. Onde encontrar Capturado a partir da data de criação (EKKO-AEDAT) na tabela de cabeçalho do pedido de compra (EKKO), para o número de pedido correspondente (EKKO-EBELN). Coleta Use a data e hora de criação da tabela EKKO para cada novo pedido de compra. Tipo de evento explicit | |||
| Pedido de compra enviado ao fornecedor | Esta atividade marca o momento em que o pedido de compra aprovado é enviado oficialmente ao fornecedor, por exemplo, por EDI, e-mail ou impressão. É um evento explícito, registrado nas tabelas de controle de mensagens quando uma mensagem de saída é processada com sucesso. | ||
| Por que isso importa Este é um marco importante, pois inicia a contagem do prazo de entrega do fornecedor. Analisar o tempo entre esse evento e o recebimento dos bens é essencial para avaliar a performance do fornecedor e a pontualidade da entrega. Onde encontrar Registrado na tabela de status de mensagens (NAST). A data e hora podem ser obtidas em NAST-DATVR e NAST-UHRVR quando o status de processamento (NAST-VSTAT) é "1" (processado com sucesso) para o tipo de mensagem de saída correspondente ao pedido. Coleta Use a data e hora de processamento da tabela NAST para a mensagem de saída do pedido de compra. Tipo de evento explicit | |||
| Requisição de compra criada | Esta atividade marca a criação de uma solicitação formal de bens ou serviços. É um evento explícito, registrado quando alguém salva um novo documento de requisição de compra (usando transações como ME51N), o que gera um registro exclusivo na tabela EBAN. | ||
| Por que isso importa Este é o principal ponto de partida do processo de compras. Analisar o tempo entre esse evento e a criação do pedido de compra ajuda a medir a eficiência na conversão da demanda interna em pedidos acionáveis. Onde encontrar Registrado quando uma entrada é criada na tabela de cabeçalho da requisição de compra (EBAN). A data de criação (EBAN-BADAT) e o horário são usados para registrar a data e hora do evento. Coleta Identifique novas entradas na tabela EBAN com base na data de criação. Tipo de evento explicit | |||
| Aprovação do pedido de compra solicitada | Indica que um pedido de compra criado ou alterado foi enviado para aprovação conforme a estratégia de liberação configurada. Esse evento é inferido quando a estratégia de liberação é acionada e o pedido entra em status de aprovação pendente. | ||
| Por que isso importa Diferenciar a criação do pedido de compra do início do processo de aprovação ajuda a medir com precisão o KPI de tempo de ciclo de aprovação. Isso evidencia qualquer demora antes do início do Workflow de aprovação. Onde encontrar Inferido a partir dos documentos de alteração (CDHDR/CDPOS) do pedido de compra (objeto EINKBELEG), que mostram a definição inicial de um status de liberação, ou quando o status geral de liberação (EKKO-FRGKE) recebe pela primeira vez um valor que indica que há um processo de aprovação em andamento. Coleta Identifique a primeira entrada nos documentos de alteração que aciona a estratégia de liberação do pedido de compra. Tipo de evento inferred | |||
| Confirmação de serviços registrada | Para pedidos de compra de serviços, esta atividade representa a confirmação de que os serviços foram prestados. É um evento explícito, registrado com a criação de uma folha de registro de serviços (por exemplo, pela transação ML81N). | ||
| Por que isso importa Este é o equivalente ao recebimento de mercadorias para serviços e é essencial para acompanhar o atendimento dos pedidos de serviço. Ele dá início ao processo financeiro de pagamento dos serviços. Onde encontrar Capturado a partir da data de criação (ESSR-ERDAT) na tabela de cabeçalho da folha de registro de serviços (ESSR). O vínculo com o pedido de compra está na tabela ESLL. Coleta Use a data e hora de criação da tabela ESSR para folhas de registro de serviços vinculadas ao pedido de compra. Tipo de evento explicit | |||
| Inspeção de qualidade realizada | Indica que os bens recebidos passaram por uma inspeção de qualidade. Normalmente, esta atividade é inferida quando um lote de inspeção, criado no momento do recebimento das mercadorias, recebe uma decisão de utilização no módulo de Gestão da Qualidade. | ||
| Por que isso importa Em setores nos quais a qualidade é essencial, esta atividade ajuda a analisar a duração e os resultados do processo de inspeção. Atrasos nessa etapa podem criar gargalos entre o recebimento das mercadorias e sua disponibilidade para uso. Onde encontrar Inferido a partir do módulo de Gestão da Qualidade. Um lote de inspeção é criado na tabela QALS quando as mercadorias são recebidas, e a atividade é marcada pela criação de uma decisão de utilização na tabela QAVE, que inclui a data e hora. Coleta Identifique a data e hora da decisão de utilização na tabela QAVE para o lote de inspeção vinculado ao documento de material. Tipo de evento inferred | |||
| Mercadorias devolvidas | Representa a devolução ao fornecedor de mercadorias recebidas anteriormente, muitas vezes por problemas de qualidade ou envio incorreto. É um evento explícito, registrado pelo lançamento de um documento de material com um tipo de movimento específico para devoluções. | ||
| Por que isso importa Esta atividade evidencia problemas de qualidade do fornecedor ou de precisão do pedido e é um indicador importante de retrabalho no processo. É essencial para calcular o KPI de taxa de divergência no recebimento de mercadorias. Onde encontrar Registrado nas tabelas de documentos de material (MKPF/MSEG) quando é usado um tipo de movimento de devolução (por exemplo, "122" para devolução ao fornecedor). A data de lançamento (MKPF-BUDAT) é usada para registrar a data e hora. Coleta Identifique documentos de material com um tipo de movimento de devolução (por exemplo, 122) que façam referência ao pedido de compra original. Tipo de evento explicit | |||
| Pedido de compra alterado | Representa qualquer alteração feita em um pedido de compra após sua criação inicial, como mudanças na quantidade, no preço ou nas datas de entrega. Essas alterações são registradas explicitamente no sistema de documentos de alteração do SAP. | ||
| Por que isso importa Alterações frequentes, especialmente após a aprovação, indicam ineficiências no processo, planejamento inicial inadequado ou aumento do escopo. Esta atividade é essencial para o Dashboard de retrabalho e alterações de pedidos de compra e seus KPIs relacionados. Onde encontrar Registrado explicitamente nas tabelas de cabeçalho (CDHDR) e de itens (CDPOS) dos documentos de alteração do objeto Pedido de compra (EINKBELEG). Cada alteração gera uma nova entrada com data e hora. Coleta Extraia os eventos de alteração e as datas e horas das tabelas CDHDR e CDPOS vinculadas ao número do pedido de compra. Tipo de evento explicit | |||
| Pedido de compra excluído | Representa o cancelamento ou a exclusão lógica de um item do pedido de compra, impedindo etapas posteriores, como o recebimento de mercadorias ou o faturamento. É um evento inferido, registrado quando o indicador de exclusão é definido no item do pedido. | ||
| Por que isso importa Esta é uma atividade terminal que indica o cancelamento de um pedido. Analisar por que e quando os pedidos são excluídos pode revelar problemas no planejamento da demanda ou na seleção de fornecedores. Onde encontrar Inferido a partir dos documentos de alteração (CDHDR/CDPOS), que mostram o indicador de exclusão (EKPO-LOEKZ) definido como "L" para um item do pedido de compra. Coleta Identifique nos documentos de alteração a data e hora em que o indicador EKPO-LOEKZ é definido. Tipo de evento inferred | |||
| Pedido de compra rejeitado | Esta atividade ocorre quando uma pessoa responsável pela aprovação rejeita um pedido de compra durante o Workflow de aprovação. É um evento inferido, identificado por uma alteração no status da estratégia de liberação do pedido que indica uma rejeição. | ||
| Por que isso importa Acompanhar as rejeições ajuda a identificar problemas na qualidade dos dados do pedido, descumprimento de políticas ou falhas na matriz de aprovação. Muitas vezes, isso gera retrabalho e aumenta o tempo de ciclo geral. Onde encontrar Inferido a partir dos documentos de alteração (CDHDR/CDPOS) do status de liberação do pedido de compra. Normalmente, uma rejeição é registrada quando um código de liberação é cancelado ou um status específico de rejeição é definido. Coleta Monitore os registros de alteração para identificar o cancelamento de um código de liberação ou uma mudança de status que indique rejeição. Tipo de evento inferred | |||
| Requisição de compra aprovada | Representa a aprovação formal de uma requisição de compra, autorizando sua conversão em pedido de compra. Esse evento é inferido a partir de alterações nos campos de status de liberação dos dados da requisição, conforme o Workflow da estratégia de liberação do SAP. | ||
| Por que isso importa Acompanhar as aprovações é essencial para identificar gargalos na etapa anterior ao pedido e garantir a conformidade com as políticas de aprovação. Atrasos nessa etapa afetam diretamente o tempo de ciclo geral de compras. Onde encontrar Inferido a partir dos registros de alterações da tabela de requisições de compra (EBAN), monitorando especificamente as mudanças nos campos de status de liberação (por exemplo, EBAN-FRGZU) ou analisando os documentos de alteração em CDHDR/CDPOS para o objeto EBAN. Coleta Monitore os documentos de alteração dos campos de status de liberação da EBAN para identificar a data e hora da aprovação final. Tipo de evento inferred | |||
Guias de extração
Etapas
- Crie o programa ABAP: Abra o Editor ABAP usando o código de transação SE38. Informe um nome para o novo programa, por exemplo, Z_PM_PO_EXTRACT, e clique em 'Criar'. Dê um título, como 'Extração de dados de pedidos de compra para Process Mining', e defina o tipo como 'Programa executável'.
- Defina a tela de seleção: No programa, defina os parâmetros da tela de seleção. Assim, os usuários podem filtrar os dados que querem extrair. Entre os principais parâmetros estão o intervalo de datas de criação do pedido de compra, o código da empresa (BUKRS) e o tipo de documento de compras (BSART).
- Defina as estruturas de dados: Declare uma estrutura de tabela interna que corresponda ao formato final do Event Log. Ela deve incluir todos os atributos obrigatórios e recomendados: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode e DocumentType.
- Implemente a lógica de seleção de dados: Escreva a lógica ABAP principal para selecionar os dados das 14 atividades obrigatórias. Isso envolve consultar várias tabelas SAP, como EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS e NAST. Use uma sub-rotina separada (PERFORM) para cada atividade e mantenha o código organizado.
- Selecione os dados das requisições de compra: Consulte a tabela EBAN para localizar os eventos 'Requisição de compra criada' e vincule-os aos pedidos de compra pela tabela EKPO. Use as tabelas de log de alterações (CDHDR, CDPOS) para identificar os eventos 'Requisição de compra aprovada', acompanhando as alterações nos campos de status de liberação.
- Selecione os eventos principais dos pedidos de compra: Consulte as tabelas EKKO e EKPO para o evento 'Pedido de compra criado'. Use as tabelas de log de alterações (CDHDR, CDPOS) no objeto EINKBELEG para extrair os eventos 'Pedido de compra alterado', 'Pedido de compra aprovado', 'Pedido de compra rejeitado', 'Pedido de compra concluído' e 'Pedido de compra excluído', com base nas alterações em campos específicos, como indicadores de liberação e sinalizadores de exclusão.
- Selecione os eventos de comunicação dos pedidos de compra: Consulte a tabela NAST para localizar os registros em que o pedido de compra foi transmitido com sucesso e registrar a atividade 'Pedido de compra enviado ao fornecedor'.
- Selecione os eventos de mercadorias e serviços: Consulte a tabela EKBE para localizar lançamentos de documentos de material e identificar as atividades 'Entrada de mercadorias registrada' e 'Mercadorias devolvidas', com base na categoria do tipo de movimento. Consulte as tabelas ESSR e ESLL para localizar folhas de registro de serviços e registrar a atividade 'Confirmação de serviços registrada'.
- Selecione os eventos de gestão da qualidade: Se o módulo de Gestão da Qualidade estiver em uso, consulte as tabelas QALS e QAVE para identificar quando foi tomada uma decisão de utilização para um lote de inspeção vinculado a um pedido de compra. Isso representa a atividade 'Inspeção de qualidade realizada'.
- Combine e formate os dados: Consolide os dados de todas as seleções individuais em uma única tabela interna final. Garanta que o campo EventTime use um formato consistente, por exemplo, YYYY-MM-DDTHH:MI:SS.
- Implemente o download do arquivo: Adicione a funcionalidade para baixar a tabela interna final como arquivo. O formato recomendado é um arquivo separado por tabulações ou CSV, que pode ser gerado com o módulo de função GUI_DOWNLOAD.
- Execute e salve: Execute o programa pela transação SE38 ou SA38. Preencha os critérios de seleção e rode o relatório. Quando solicitado, salve o arquivo de saída no computador com a extensão .csv, pronto para ser carregado.
Configuração
- Intervalo de datas: É essencial definir um período específico para a extração, geralmente com base na data de criação do pedido de compra (EKKO-AEDAT). Um intervalo de 3 a 6 meses costuma ser um bom ponto de partida para equilibrar o volume de dados e os insights sobre o processo.
- Código da empresa (BUKRS): Filtre por um ou mais códigos de empresa para limitar a extração às entidades legais relevantes. Esse parâmetro é importante para a performance e a relevância da análise.
- Tipo de documento de compras (BSART): Filtre por tipos específicos de documento, por exemplo, 'NB' para pedido de compra padrão, para concentrar a análise nos processos padrão e excluir tipos especiais de compras, se necessário.
- Granularidade dos dados: A extração foi projetada para o nível do item do pedido de compra. O ID do caso é o número do pedido de compra (EBELN). Todos os eventos, inclusive os que ocorrem no nível do item, como recebimentos de mercadorias, são vinculados a esse ID do caso principal.
- Considerações de performance: Para conjuntos de dados grandes, programe a execução em segundo plano (SM36) para evitar erros de tempo limite. Verifique se há índices de banco de dados nos campos principais usados nas cláusulas WHERE, especialmente nas tabelas CDHDR e CDPOS.
- Pré-requisitos: O usuário que executa o relatório precisa ter autorização para acessar o ambiente de desenvolvimento ABAP (SE38) e permissão para executar o programa. Também precisa de acesso de leitura a todas as tabelas subjacentes, incluindo EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR e as tabelas de QM.
Consulta de exemplo abap
REPORT Z_PM_PO_EXTRACT.
TABLES: ekko, ekpo, eban.
*&---------------------------------------------------------------------*
*& Data Structures for Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
purchaseorder TYPE ebeln,
activity TYPE string,
eventtime TYPE timestamp,
username TYPE ernam,
vendornumber TYPE lifnr,
orderamount TYPE netwr_ak,
materialgroup TYPE matkl,
companycode TYPE bukrs,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_aedat FOR ekko-aedat OBLIGATORY, " PO Creation Date
s_bukrs FOR ekko-bukrs, " Company Code
s_bsart FOR ekko-bsart, " PO Document Type
s_ebeln FOR ekko-ebeln. " PO Number
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_po_headers.
IF gt_event_log IS NOT INITIAL.
PERFORM get_pr_created.
PERFORM get_pr_approved.
PERFORM get_po_created.
PERFORM get_po_release_events. " Approved, Rejected, Approval Requested
PERFORM get_po_sent_to_vendor.
PERFORM get_po_changed.
PERFORM get_goods_receipt_posted.
PERFORM get_services_confirmed.
PERFORM get_quality_inspection.
PERFORM get_goods_returned.
PERFORM get_po_completed.
PERFORM get_po_deleted.
PERFORM download_to_csv.
ELSE.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'I'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_PO_HEADERS (Base data)
*&---------------------------------------------------------------------*
FORM get_po_headers.
SELECT h~ebeln, h~lifnr, h~bukrs, h~bsart, p~netwr, p~matkl
FROM ekko AS h
INNER JOIN ekpo AS p ON h~ebeln = p~ebeln
INTO TABLE @DATA(lt_po_base)
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
AND h~ebeln IN @s_ebeln.
SORT lt_po_base BY ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_CREATED
*&---------------------------------------------------------------------*
FORM get_pr_created.
DATA: lt_pr_events TYPE TABLE OF ty_event_log.
SELECT p~ebeln AS purchaseorder,
'Purchase Requisition Created' AS activity,
b~erdat AS event_date,
'000000' AS event_time,
b~ernam AS username,
h~lifnr AS vendornumber,
p~netwr AS orderamount,
p~matkl AS materialgroup,
h~bukrs AS companycode,
h~bsart AS documenttype
FROM ekpo AS p
JOIN eban AS b ON p~banfn = b~banfn AND p~bnfpo = b~bnfpo
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~ebeln IN @s_ebeln
AND p~banfn IS NOT NULL AND p~banfn <> ''
AND h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created ASSIGNING FIELD-SYMBOL(<fs_pr>).
DATA(ls_event) = CORRESPONDING ty_event_log(<fs_pr>).
CONCATENATE <fs_pr>-event_date <fs_pr>-event_time INTO DATA(lv_ts).
CONVERT DATE <fs_pr>-event_date TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_APPROVED
*&---------------------------------------------------------------------*
FORM get_pr_approved.
DATA: lt_pr_list TYPE TABLE OF eban-banfn.
SELECT DISTINCT p~banfn FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND p~banfn IS NOT NULL AND p~banfn <> ''
INTO TABLE @lt_pr_list.
IF lt_pr_list IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
FOR ALL ENTRIES IN @lt_pr_list
WHERE h~objectclas = 'BANF'
AND h~objectid = @lt_pr_list-table_line
AND p~tabname = 'EBAN'
AND p~fname = 'FRGZU'
INTO TABLE @DATA(lt_cd_pr).
LOOP AT lt_cd_pr ASSIGNING FIELD-SYMBOL(<fs_cd>) WHERE <fs_cd>-value_new = 'X'.
SELECT SINGLE p~ebeln, p~netwr, p~matkl, h~lifnr, h~bukrs, h~bsart
FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~banfn = @<fs_cd>-objectid(10)
INTO @DATA(ls_po_info).
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = ls_po_info-ebeln
activity = 'Purchase Requisition Approved'
username = <fs_cd>-username
vendornumber = ls_po_info-lifnr
orderamount = ls_po_info-netwr
materialgroup = ls_po_info-matkl
companycode = ls_po_info-bukrs
documenttype = ls_po_info-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CREATED
*&---------------------------------------------------------------------*
FORM get_po_created.
LOOP AT lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>).
SELECT SINGLE aedat, ernam FROM ekko INTO @DATA(ls_ekko)
WHERE ebeln = @<fs_po>-ebeln.
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Created'
username = ls_ekko-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE ls_ekko-aedat TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_RELEASE_EVENTS
*&---------------------------------------------------------------------*
FORM get_po_release_events.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
WHERE h~objectclas = 'EINKBELEG'
AND h~objectid IN lt_ebeln
AND p~tabname = 'EKKO'
AND p~fname = 'FRGKE'
INTO TABLE @DATA(lt_cd_po).
LOOP AT lt_cd_po ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
CASE <fs_cd>-value_new.
WHEN '2' OR 'R'. " Final Release
ls_event-activity = 'Purchase Order Approved'.
WHEN '1'. " Blocked
ls_event-activity = 'Purchase Order Rejected'.
WHEN OTHERS. " Any other change implies a pending state
ls_event-activity = 'Purchase Order Approval Requested'.
ENDCASE.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_SENT_TO_VENDOR
*&---------------------------------------------------------------------*
FORM get_po_sent_to_vendor.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT objky, erdat, eruhr, ernam
FROM nast
WHERE kapol = 'EF' AND objky IN lt_ebeln AND vstat = '1'
INTO TABLE @DATA(lt_nast).
LOOP AT lt_nast ASSIGNING FIELD-SYMBOL(<fs_nast>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_nast>-objky.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Sent to Vendor'
username = <fs_nast>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_nast>-erdat TIME <fs_nast>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CHANGED
*&---------------------------------------------------------------------*
FORM get_po_changed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT DISTINCT objectid, username, udate, utime
FROM cdhdr
WHERE objectclas = 'EINKBELEG' AND objectid IN lt_ebeln AND tcode <> 'ME21N' AND tcode <> 'ME22'
INTO TABLE @DATA(lt_cdhdr_chg).
LOOP AT lt_cdhdr_chg ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Changed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RECEIPT_POSTED
*&---------------------------------------------------------------------*
FORM get_goods_receipt_posted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam, k~bewtp
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bewtp = 'E' AND k~shkzg = 'S'
INTO TABLE @DATA(lt_gr).
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<fs_gr>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_gr>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Receipt Posted'
username = <fs_gr>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_gr>-cpudt TIME <fs_gr>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_SERVICES_CONFIRMED
*&---------------------------------------------------------------------*
FORM get_services_confirmed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT l~ebeln, h~erdat, h~eruhr, h~ernam
FROM essr AS h JOIN esll AS l ON h~lblni = l~lblni
WHERE l~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_ses).
LOOP AT lt_ses ASSIGNING FIELD-SYMBOL(<fs_ses>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ses>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Services Confirmation Entered'
username = <fs_ses>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ses>-erdat TIME <fs_ses>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_QUALITY_INSPECTION
*&---------------------------------------------------------------------*
FORM get_quality_inspection.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT q~ebeln, v~vdatum, v~vzeit, v~vname
FROM qals AS q JOIN qave AS v ON q~prueflos = v~prueflos
WHERE q~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_qm).
LOOP AT lt_qm ASSIGNING FIELD-SYMBOL(<fs_qm>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_qm>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Quality Inspection Performed'
username = <fs_qm>-vname
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_qm>-vdatum TIME <fs_qm>-vzeit INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RETURNED
*&---------------------------------------------------------------------*
FORM get_goods_returned.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bwart = '122'
INTO TABLE @DATA(lt_ret).
LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ret>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Returned'
username = <fs_ret>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ret>-cpudt TIME <fs_ret>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_COMPLETED
*&---------------------------------------------------------------------*
FORM get_po_completed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'ELIKZ' AND p~value_new = 'X'
INTO TABLE @DATA(lt_cd_comp).
LOOP AT lt_cd_comp ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Completed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_DELETED
*&---------------------------------------------------------------------*
FORM get_po_deleted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'LOEKZ' AND p~value_new = 'L'
INTO TABLE @DATA(lt_cd_del).
LOOP AT lt_cd_del ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Deleted'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_CSV
*&---------------------------------------------------------------------*
FORM download_to_csv.
DATA: lv_filename TYPE string.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'PurchaseOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'EventTime' TO lt_fieldnames.
APPEND 'UserName' TO lt_fieldnames.
APPEND 'VendorNumber' TO lt_fieldnames.
APPEND 'OrderAmount' TO lt_fieldnames.
APPEND 'MaterialGroup' TO lt_fieldnames.
APPEND 'CompanyCode' TO lt_fieldnames.
APPEND 'DocumentType' TO lt_fieldnames.
DATA(lv_header) = REDUCE string( INIT h = '' FOR f IN lt_fieldnames NEXT h = h && f && cl_abap_char_utilities=>horizontal_tab ).
REPLACE LAST OCCURRENCE OF cl_abap_char_utilities=>horizontal_tab IN lv_header WITH cl_abap_char_utilities=>cr_lf.
DATA(lv_file_content) = lv_header.
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
DATA lv_line TYPE string.
DATA lv_eventtime_str TYPE string.
lv_eventtime_str = |{ <fs_log>-eventtime TIMESTAMP = ISO }|.
lv_line = <fs_log>-purchaseorder && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-activity && cl_abap_char_utilities=>horizontal_tab &&
lv_eventtime_str && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-username && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-vendornumber && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-orderamount && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-materialgroup && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-companycode && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-documenttype && cl_abap_char_utilities=>cr_lf.
CONCATENATE lv_file_content lv_line INTO lv_file_content.
ENDLOOP.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lv_file_content. Etapas
- Estabeleça a conexão com o banco de dados: Obtenha credenciais somente de leitura e os dados de conexão (nome do host, porta e nome do banco de dados) do banco de dados subjacente do SAP ECC. Instale as ferramentas necessárias, como DBeaver, SQL Developer ou SSMS.
- Identifique o esquema SAP: Conecte-se ao banco de dados e identifique o esquema SAP principal onde as tabelas estão armazenadas. Geralmente, ele se chama SAPSR3, SAPHANADB ou outro nome específico do sistema. Se esse não for o esquema padrão do seu usuário, será necessário prefixar os nomes de todas as tabelas da consulta com o nome do esquema.
- Revise a consulta SQL: Abra o script SQL fornecido na ferramenta cliente. Essa consulta abrangente foi criada para extrair 14 atividades distintas do processo de compras e pagamentos, combinando várias tabelas SAP.
- Personalize os parâmetros da consulta: Localize a expressão de tabela comum (CTE) PO_BASE no início do script. Altere os valores de exemplo para definir o escopo da extração:
- [START_DATE] e [END_DATE]: Defina o intervalo de datas da análise, por exemplo, '20230101' e '20230630'. Recomendamos filtrar pelo campo AEDAT (data da alteração).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Informe os códigos de empresa SAP que devem ser incluídos.
- [DOC_TYPE_1], [DOC_TYPE_2]: Informe os tipos de documento de pedido de compra que devem ser incluídos.
- [Your SAP Schema]: Substitua este valor de exemplo pelo nome real do esquema SAP em todo o script.
- Execute a consulta: Rode o script SQL personalizado no banco de dados SAP. O tempo de execução varia conforme o intervalo de datas, o volume de dados e a performance do banco de dados.
- Confira os resultados: Quando a consulta terminar, faça uma revisão rápida da saída. Verifique se o número de linhas é razoável e se colunas importantes, como PurchaseOrder, Activity e EventTime, foram preenchidas conforme esperado.
- Exporte os dados para CSV: Exporte todo o conjunto de resultados da ferramenta SQL para um arquivo CSV. Use a codificação UTF-8 para evitar problemas com caracteres.
- Prepare o arquivo para carregamento: Confira se os cabeçalhos das colunas no arquivo CSV correspondem exatamente aos nomes de atributos obrigatórios: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode e DocumentType.
- Carregue os dados na ferramenta de Process Mining: Carregue o arquivo CSV final no aplicativo de Process Mining para análise e visualização.
Configuração
- Pré-requisitos: É necessário ter acesso direto e somente de leitura ao banco de dados subjacente do SAP ECC. Os usuários precisam de autorização suficiente para consultar tabelas como EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS e NAST.
- Filtro por intervalo de datas: É essencial aplicar um filtro de datas para limitar o volume de dados. Filtrar EKKO.AEDAT (data de alteração do pedido de compra) para um período de 3 a 6 meses é um ponto de partida comum. Intervalos maiores podem aumentar muito o tempo de execução da consulta.
- Filtros de dados principais: Para manter a análise focada, filtre sempre por EKKO.BUKRS (código da empresa) e EKKO.BSART (tipo de documento). Isso restringe o escopo às entidades legais e aos processos de negócio relevantes.
- Considerações de performance: A consulta combina várias tabelas grandes, incluindo as tabelas de histórico de alterações (CDHDR, CDPOS), o que pode consumir muitos recursos. Recomendamos executar a extração fora dos horários de pico ou em um banco de dados replicado, que não seja de produção, para evitar impactos na performance do sistema.
- Registro de documentos de alteração: A precisão de atividades como 'Aprovado', 'Rejeitado', 'Concluído' e 'Alterado' depende de o registro de documentos de alteração estar ativo para os campos relevantes no SAP. Confirme com o administrador SAP se esse registro está habilitado pela transação SCDO.
Consulta de exemplo sql
WITH PO_BASE AS (
SELECT
H.EBELN, -- Purchase Order Number
I.EBELP, -- Purchase Order Item
H.LIFNR, -- Vendor Number
H.BUKRS, -- Company Code
H.BSART, -- Document Type
I.NETWR, -- Order Amount (Item Level)
I.MATKL, -- Material Group
I.BANFN, -- Purchase Requisition Number
I.BNFPO -- Purchase Requisition Item
FROM [Your SAP Schema].EKKO AS H
JOIN [Your SAP Schema].EKPO AS I ON H.EBELN = I.EBELN
WHERE H.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- Filter on PO Change Date, e.g., '20230101' and '20231231'
AND H.BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]') -- Specify Company Codes
AND H.BSART IN ('[DOC_TYPE_1]', '[DOC_TYPE_2]') -- Specify PO Document Types
)
-- 1. Purchase Requisition Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Created' AS "Activity",
TO_TIMESTAMP(CONCAT(pr.ERDAT, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime", -- Time is not available in EBAN
pr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EBAN pr ON po.BANFN = pr.BANFN AND po.BNFPO = pr.BNFPO
WHERE po.BANFN IS NOT NULL AND po.BANFN <> ''
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Approved' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'BANF' AND ch.OBJECTID = po.BANFN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EBAN' AND cp.FNAME = 'FRGZU' AND cp.VALUE_NEW = 'X' -- Release indicator set to 'released'
UNION ALL
-- 3. Purchase Order Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Created' AS "Activity",
TO_TIMESTAMP(CONCAT(ekko.ERDAT, ' ', ekko.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
ekko.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (from Change Docs)
SELECT
po.EBELN AS "PurchaseOrder",
CASE
WHEN cp.VALUE_NEW > cp.VALUE_OLD THEN 'Purchase Order Approval Requested'
WHEN cp.VALUE_NEW = ekko.FRGKE AND ekko.FRGKE = 'R' THEN 'Purchase Order Approved'
ELSE 'Purchase Order Rejected' -- Simplified logic, may need adjustment
END AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKKO' AND cp.FNAME = 'FRGZU' -- Release status
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Sent to Vendor' AS "Activity",
TO_TIMESTAMP(CONCAT(na.ERDAT, ' ', na.ERUHR), 'YYYYMMDD HH24MISS') AS "EventTime",
na.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].NAST na ON na.OBJKY = po.EBELN AND na.KSCHL = '[Your PO Output Type]' -- e.g., 'NEU'
WHERE na.VSTAT = '1' -- Successfully processed
UNION ALL
-- 8. Purchase Order Changed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Changed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
WHERE ch.TCODE IN ('ME22', 'ME22N') -- Filter for change transactions
UNION ALL
-- 9. Goods Receipt Posted
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Receipt Posted' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Receipt
AND ekbe.SHKZG = 'S' -- Debit/Credit Indicator: Goods Receipt
UNION ALL
-- 10. Services Confirmation Entered
SELECT
po.EBELN AS "PurchaseOrder",
'Services Confirmation Entered' AS "Activity",
TO_TIMESTAMP(CONCAT(essr.ERDAT, ' ', essr.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
essr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].ESSR essr ON ekbe.LBLNI = essr.LBLNI
WHERE ekbe.BEWTP = 'L' -- Service Entry Sheet
UNION ALL
-- 11. Quality Inspection Performed
SELECT
po.EBELN AS "PurchaseOrder",
'Quality Inspection Performed' AS "Activity",
TO_TIMESTAMP(CONCAT(qave.VDATUM, ' ', qave.VZEIT), 'YYYYMMDD HH24MISS') AS "EventTime",
qave.VNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].QALS qals ON qals.MBLNR = ekbe.BELNR AND qals.MJAHR = ekbe.GJAHR
JOIN [Your SAP Schema].QAVE qave ON qals.PRUEFLOS = qave.PRUEFLOS
WHERE ekbe.BEWTP = 'E' -- Linked to a Goods Receipt
UNION ALL
-- 12. Goods Returned
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Returned' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Movement
AND ekbe.SHKZG = 'H' -- Debit/Credit Indicator: Return
AND ekbe.BWART = '122' -- Movement type for return to vendor
UNION ALL
-- 13. Purchase Order Completed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Completed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'ELIKZ' AND cp.VALUE_NEW = 'X' -- Delivery completed indicator
UNION ALL
-- 14. Purchase Order Deleted
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Deleted' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'LOEKZ' AND cp.VALUE_NEW = 'L'; -- Deletion indicator Etapas
- Pré-requisitos e conexão: Verifique se sua ferramenta ETL tem o conector certificado pela SAP instalado e licenciado. No console de administração da ferramenta ETL, configure uma nova conexão com seu sistema SAP ECC. Você precisará do host do servidor de aplicação, do número do sistema, do ID do cliente e de um usuário SAP dedicado com as autorizações adequadas para RFC e leitura de tabelas.
- Identifique as tabelas de origem: No trabalho ETL ou no fluxo de dados, defina as tabelas SAP necessárias como fontes de dados. As principais são EKKO (cabeçalho do pedido de compra), EKPO (item do pedido de compra), EBAN (requisição de compra), CDHDR (cabeçalho do documento de alteração), CDPOS (item do documento de alteração), MSEG (segmento do documento de material), MKPF (cabeçalho do documento de material), NAST (status da mensagem), ESSR (cabeçalho da folha de registro de serviços) e QALS (lote de inspeção).
- Extraia 'Pedido de compra criado': Crie um fluxo de dados com origem na tabela EKKO. Filtre os registros pelo intervalo de datas desejado, por exemplo, usando AEDAT, e pelo escopo organizacional, por exemplo, BUKRS para o código da empresa e BSART para o tipo de documento. Mapeie EKKO.EBELN para PurchaseOrder, 'Pedido de compra criado' para Activity e combine AEDAT e ERZET para formar EventTime. Mapeie também os outros atributos obrigatórios.
- Extraia 'Entrada de mercadorias registrada': Crie um fluxo de dados separado com origem em MSEG e combinação com MKPF pelos campos MBLNR e MJAHR. Filtre pelos tipos de movimento relevantes, como '101'. Mapeie MSEG.EBELN para PurchaseOrder, 'Entrada de mercadorias registrada' para Activity e use MKPF.CPUDT e MKPF.CPUTM para formar EventTime.
- Extraia eventos com base em alterações (aprovações, alterações e exclusões): Crie um fluxo de dados com origem em CDHDR e CDPOS, combinadas pelo campo CHANGENR. Essa fonte única pode ser usada para derivar várias atividades.
- Filtre OBJECTCLAS = 'EINKBELEG' e TABNAME = 'EKPO'.
- Para 'Pedido de compra aprovado', filtre as alterações no campo de status de liberação, por exemplo, FNAME = 'FRGZU', em que o novo valor (VALUE_NEW) indica a aprovação final.
- Para 'Pedido de compra excluído', filtre as alterações no indicador de exclusão (FNAME = 'LOEKZ') em que o novo valor é 'L'.
- Para 'Pedido de compra alterado', filtre outras alterações relevantes, excluindo os campos de status específicos usados para as demais atividades.
- Para todos esses eventos, use CDHDR.UDATE e CDHDR.UTIME para formar EventTime.
- Extraia eventos das requisições de compra: Crie um fluxo de dados a partir de EBAN para o evento 'Requisição de compra criada'. Para vincular o evento a um caso de pedido de compra, combine EBAN com EKPO usando o número da requisição (BANFN) e o item (BNFPO). Para o evento 'Requisição de compra aprovada', use CDHDR/CDPOS com OBJECTCLAS = 'BANF'. Faça o mapeamento com cuidado para associar o evento ao pedido de compra correspondente.
- Extraia 'Pedido de compra enviado ao fornecedor': Crie um fluxo de dados com origem na tabela NAST. Filtre por OBJECTKEY, que contém o número do pedido de compra, pelo tipo de saída relevante (KSCHL) e pelo status de processamento bem-sucedido (VSTAT = '1'). Use ERDAT e UHR para formar EventTime.
- Combine os fluxos de atividades: Use uma transformação 'Union' ou 'Merge' na ferramenta ETL para combinar as saídas de todos os fluxos de dados criados nas etapas anteriores. Garanta que os nomes e os tipos de dados das colunas sejam consistentes em todos os fluxos (PurchaseOrder, Activity, EventTime etc.).
- Conversão de tipos e formatos de dados: Garanta que a coluna EventTime use um formato de data e hora consistente, por exemplo, YYYY-MM-DD HH:MM:SS. Converta OrderAmount para um formato decimal padrão.
- Defina o destino dos dados: Configure um destino, ou 'sink', para o fluxo de dados combinado. Normalmente, ele é um arquivo simples, como CSV ou Parquet. Configure o delimitador, os qualificadores de texto e as opções de cabeçalho.
- Execute e valide: Rode o trabalho ETL completo. Valide o arquivo de saída para confirmar que as 14 atividades estão presentes, que a quantidade de linhas é razoável e que os atributos principais foram preenchidos corretamente.
- Programe e exporte: Depois da validação, programe a execução periódica do trabalho ETL, por exemplo, todas as noites, para manter os dados atualizados. O arquivo gerado estará pronto para ser carregado na ferramenta de Process Mining.
Configuração
- Pré-requisitos: Uma ferramenta comercial de ETL (por exemplo, Informatica PowerCenter, Talend ou SAP Data Services) com o conector certificado pela SAP correspondente para ECC. Um usuário de diálogo ou de sistema da SAP com autorizações para S_RFC e S_TABU_DIS nas tabelas necessárias.
- Conexão SAP: O conector deve ser configurado com o servidor de aplicação SAP, o número do sistema, o mandante, o usuário e a senha. Recomendamos o uso de Secure Network Communications (SNC).
- Filtro por período: É fundamental aplicar um filtro por período para limitar o volume de dados. Uma prática comum é filtrar EKKO.AEDAT (data de criação do pedido de compra) para os últimos 3 a 12 meses. Aplique esse filtro na origem para evitar extrair dados em excesso da SAP.
- Filtros de escopo organizacional: Sempre filtre por EKKO.BUKRS (código da empresa) e considere filtrar por EKPO.WERKS (centro) ou EKKO.EKORG (organização de compras) para restringir a análise a uma unidade de negócio específica.
- Filtro por tipo de documento: Use EKKO.BSART para incluir apenas os tipos de pedido de compra relevantes e excluir transferências de estoque ou outros documentos internos que não fazem parte do processo padrão de compras ao pagamento (P2P).
- Ajuste de performance: A extração de tabelas de documentos de alteração (CDHDR, CDPOS) pode ser lenta. Verifique se os filtros em OBJECTCLAS, OBJECTID e UDATE estão aplicados. Ajuste a configuração 'Packet Size' no conector SAP para otimizar a taxa de transferência de dados. Em sistemas muito grandes, considere fazer uma carga histórica inicial e, depois, cargas incrementais programadas.
Consulta de exemplo sql
/*
This is a logical representation of the transformations performed within the ETL tool.
The tool's graphical interface will be used to configure these separate data flows, which are then combined with a UNION transformation.
Placeholders like [Your ETL Tool Functions] and [Filter Values] must be configured in the tool.
*/
-- 1. Purchase Requisition Created
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Created' AS Activity,
[Your ETL Tool Functions].DateTime(eban.ERDAT, eban.ERZET) AS EventTime,
eban.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM EBAN AS eban
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 2. Purchase Requisition Approved (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Approved' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EBAN AS eban ON cdhdr.OBJECTID = eban.BANFN
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'BANF' AND cdpos.TABNAME = 'EBAN' AND cdpos.FNAME = 'FRGZU' AND cdpos.VALUE_NEW = '[Final Release Indicator for PR]'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 3. Purchase Order Created
SELECT
EBELN AS PurchaseOrder,
'Purchase Order Created' AS Activity,
[Your ETL Tool Functions].DateTime(AEDAT, ERZET) AS EventTime,
ERNAM AS UserName,
LIFNR AS VendorNumber,
NULL AS OrderAmount, -- Amount is at item level
NULL AS MaterialGroup, -- Attribute is at item level
BUKRS AS CompanyCode,
BSART AS DocumentType
FROM EKKO
WHERE AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
CASE
WHEN cdpos.VALUE_NEW = '[Final Release Code]' THEN 'Purchase Order Approved'
WHEN cdpos.VALUE_NEW = '[Rejection Release Code]' THEN 'Purchase Order Rejected'
ELSE 'Purchase Order Approval Requested'
END AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKKO' AND cdpos.FNAME = 'FRGKE'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Sent to Vendor' AS Activity,
[Your ETL Tool Functions].DateTime(nast.ERDAT, nast.UHR) AS EventTime,
nast.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM NAST AS nast
INNER JOIN EKKO AS ekko ON nast.OBJKY = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE nast.KAPPL = 'EF' AND nast.VSTAT = '1' AND nast.KSCHL IN ([Your PO Output Types])
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 8. Purchase Order Changed (inferred from change documents, simplified example)
SELECT DISTINCT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Changed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.FNAME NOT IN ('FRGKE', 'FRGZU', 'LOEKZ', 'ELIKZ')
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 9. Goods Receipt Posted
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Receipt Posted' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '101' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 10. Services Confirmation Entered
SELECT
essr.EBELN AS PurchaseOrder,
'Services Confirmation Entered' AS Activity,
[Your ETL Tool Functions].DateTime(essr.ERDAT, essr.ERZET) AS EventTime,
essr.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM ESSR AS essr
INNER JOIN EKKO AS ekko ON essr.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON essr.EBELN = ekpo.EBELN AND essr.EBELP = ekpo.EBELP
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 11. Quality Inspection Performed
SELECT
qals.EBELN AS PurchaseOrder,
'Quality Inspection Performed' AS Activity,
[Your ETL Tool Functions].DateTime(qals.PASTRTERM, '000000') AS EventTime, -- Time is often not available
qals.PRUEFER AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM QALS AS qals
INNER JOIN EKKO AS ekko ON qals.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON qals.EBELN = ekpo.EBELN AND qals.EBELP = ekpo.EBELP
WHERE qals.VCODE <> '' -- A usage decision code exists
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 12. Goods Returned
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Returned' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '122' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 13. Purchase Order Completed (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Completed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'ELIKZ' AND cdpos.VALUE_NEW = 'X'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 14. Purchase Order Deleted (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Deleted' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'LOEKZ' AND cdpos.VALUE_NEW = 'L'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]); Pronto para começar?
Com este Template, você tem um roteiro para otimizar o processo de compras e pagamentos, do pedido de compra, no SAP ECC. Comece hoje a usar seus dados para encontrar insights e aumentar a eficiência.
Otimize os pedidos de compra no processo de compras e pagamentos: comece hoje seu teste grátis
Elimine gargalos e reduza o tempo de ciclo em 30% ou mais.
Não é necessário cartão de crédito. Comece em poucos minutos.