Seu Template de dados Purchase to Pay - Purchase Order
Seu Template de dados Purchase to Pay - Purchase Order
- Atributos recomendados para coleta
- Principais atividades a acompanhar
- Orientações de extração para SAP ECC
Purchase to Pay - Pedido de compra: atributos
| Nome | Descrição | ||
|---|---|---|---|
| Atividade Activity | O nome do evento ou etapa específica do negócio que ocorreu durante o ciclo de vida do pedido de compra. | ||
| Descrição Este atributo descreve uma única etapa do processo, como Pedido de compra criado, Pedido de compra aprovado ou Entrada de mercadorias registrada. 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 é o núcleo do Process Mining. Isso ajuda a identificar gargalos, ciclos de retrabalho e desvios do processo padrão, permitindo melhorias direcionadas e esforços de padronização. Por que isso importa As atividades definem as etapas do processo. Analisar sua sequência e seu tempo revela o fluxo real do processo, os gargalos e os desvios. Onde obter Derivado de várias tabelas e logs de transações do SAP, como CDHDR/CDPOS para alterações, EKBE para GR/IR e EBAN para requisições. Geralmente requer uma lógica personalizada ou um programa de extração para ser gerado. Exemplos Pedido de compra criadoPedido de compra aprovadoEntrada de mercadorias registrada | |||
| Horário do evento EventTime | A data e o horário exatos 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 PO ou o registro de uma entrada de mercadorias. Ele fornece a ordem cronológica de todas as atividades dentro de um caso. Os registros de data e hora são fundamentais para o Process Mining, pois permitem todas as análises baseadas em tempo. Isso inclui calcular os tempos de ciclo entre atividades, identificar atrasos, analisar o throughput 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 obter Derivado de vários campos de data e hora nas tabelas do SAP, como EKKO-AEDAT, Data de alteração, CDHDR-UDATE/UTIME, registro de data e hora do log 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 | O identificador exclusivo do documento de Pedido de compra, PO, que funciona como o 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 de PO exclusivo representa uma única instância do processo de compras. No Process Mining, este atributo é essencial para reconstruir a jornada completa de cada compra. Ele permite analisar detalhadamente 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, permitindo analisar o ciclo de vida completo de cada pedido de compra. Onde obter Tabela: EKKO, Campo: EBELN Exemplos 450001762345000176244500017625 | |||
| Código da empresa CompanyCode | O identificador da entidade legal ou empresa que inicia a compra. | ||
| Descrição O Código da empresa representa uma entidade legal independente no SAP. Todas as transações são lançadas no nível do código da empresa, tornando-o uma unidade organizacional fundamental. Analisar o processo por Código da 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 em uma entidade que podem ser replicadas em outras ou localizar unidades específicas que enfrentam dificuldades no processo. Por que isso importa Representa a entidade legal, permitindo comparar a performance do processo e realizar verificações de conformidade em diferentes partes da organização. Onde obter Tabela: EKKO, Campo: BUKRS Exemplos 10002100US01 | |||
| Grupo de materiais MaterialGroup | Uma classificação usada para agrupar materiais ou serviços com características semelhantes. | ||
| Descrição O Grupo de materiais, ou categoria de compras, é usado para classificar o tipo de bens ou serviços adquiridos. Exemplos incluem Hardware de TI, Materiais de escritório ou Serviços profissionais. Este atributo é essencial para analisar 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 de análise do valor dos pedidos de compra. Por que isso importa Permite segmentar o processo por categoria de produto ou serviço, revelando comportamentos, tempos de ciclo ou fornecedores diferentes para cada tipo de gasto. Onde obter Tabela: EKPO, Campo: MATKL Exemplos 00101IT_HWCONSULT | |||
| Nome do usuário UserName | O ID do usuário que executou a atividade. | ||
| Descrição Este atributo registra o nome de usuário do SAP do funcionário que criou, alterou ou aprovou um documento. Em etapas automatizadas, pode exibir o ID de um usuário do sistema ou de lote. Analisar por usuário ajuda a identificar necessidades de treinamento, profissionais com alta performance ou possíveis problemas de conformidade. É essencial para criar Dashboards relacionados à distribuição da carga de trabalho, à conformidade da matriz de aprovação e à compreensão da performance de diferentes equipes ou indivíduos. Por que isso importa Relaciona as ações dos usuários a indivíduos específicos, permitindo analisar a performance, a carga de trabalho e a adesão aos protocolos de conformidade. Onde obter Tabela: EKKO, Campo: ERNAM, Criado por; Tabela: CDHDR, Campo: USERNAME, Alterado por. Exemplos JSMITHMBROWNBATCH_USER | |||
| Número do fornecedor VendorNumber | O identificador exclusivo do fornecedor. | ||
| Descrição Este é o código que identifica exclusivamente o fornecedor de quem os bens ou serviços estão sendo comprados. É um dado mestre essencial no processo de compras. Este atributo é fundamental para análises centradas no fornecedor. Ele permite avaliar a performance de entrega, comparar prazos entre diferentes fornecedores e analisar padrões de gastos. É a principal dimensão do Dashboard de performance de entrega do fornecedor. Por que isso importa Permite analisar a performance dos fornecedores, ajudando a identificar fornecedores confiáveis e aqueles que causam atrasos ou problemas de qualidade. Onde obter Tabela: EKKO, Campo: LIFNR Exemplos 100345V-20598700112 | |||
| Tipo de documento DocumentType | Um código que classifica diferentes tipos de pedidos de compra. | ||
| Descrição O Tipo de documento é uma configuração do SAP que controla o intervalo 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 POs padrão, POs de serviços ou pedidos de transferência de estoque. Este atributo é uma dimensão poderosa para análise, pois diferentes tipos de documento geralmente seguem processos intencionalmente distintos. Filtrar por tipo de documento permite uma comparação mais precisa, em condições equivalentes, dos tempos de ciclo e dos fluxos de processo. Por que isso importa Diferencia os vários tipos de processos de compras, como padrão, serviço e devolução, que geralmente têm caminhos e expectativas de performance distintos. Onde obter Tabela: EKKO, Campo: BSART Exemplos NBFOUB | |||
| Valor do pedido OrderAmount | O 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 pela multiplicação da quantidade pelo preço líquido. Para obter o valor total do PO, é necessário agregar os valores dos itens. Analisar o processo pelo valor do pedido é essencial para identificar transações de alto valor que podem exigir controles mais rigorosos ou fluxos de aprovação diferentes. Esse atributo alimenta o Dashboard de análise do valor dos pedidos de compra e ajuda a priorizar melhorias nos pedidos mais relevantes financeiramente. Por que isso importa Quantifica o impacto financeiro de cada compra, permitindo uma análise baseada em valor para priorizar pedidos de alto valor ou identificar oportunidades de redução de custos. Onde obter Tabela: EKPO, Campo: NETWR, Valor líquido do pedido. Exemplos 1500.00250.7512345.50 | |||
| Data de entrega solicitada RequestedDeliveryDate | A data em que a empresa solicitou ao fornecedor a entrega dos bens ou serviços. | ||
| Descrição Esta é a data de entrega prevista especificada no pedido de compra. Ela serve como referência para medir a performance real da entrega. Esta data é essencial para calcular o KPI de taxa de recebimento de mercadorias no prazo. Ao comparar a data real de recebimento com a data solicitada, as organizações conseguem medir quantitativamente a confiabilidade do fornecedor e a eficiência interna do recebimento, apoiando diretamente o Dashboard de performance de entrega do fornecedor. Por que isso importa Esta é a data-alvo da entrega, essencial para calcular KPIs de performance no prazo e avaliar a confiabilidade do fornecedor. Onde obter Tabela: EKPO, Campo: EINDT Exemplos 2023-06-102023-07-222023-08-01 | |||
| É uma alteração após a aprovação IsPostApprovalChange | Um indicador que mostra se ocorreu uma alteração no pedido de compra após a aprovação inicial. | ||
| Descrição Este atributo booleano é verdadeiro quando uma atividade 'Purchase Order Changed' é detectada após uma atividade 'Purchase Order Approved' para o mesmo pedido de compra. Ele ajuda a isolar alterações problemáticas que ocorrem no fim do processo. Este campo calculado dá suporte direto ao KPI 'Post-Approval PO Change Rate' e ao Dashboard 'Purchase Order Rework and Changes'. Ele ajuda a quantificar e destacar alterações disruptivas que podem causar atrasos e exigir uma nova aprovação, apontando problemas na especificação inicial ou no processo de definição do escopo. Por que isso importa Mede diretamente o retrabalho após a aprovação, um KPI importante para a estabilidade e a eficiência do processo. Taxas elevadas indicam problemas na definição dos requisitos nas etapas anteriores. Onde obter Este é um atributo calculado, derivado da sequência de atividades no Event Log. Exemplos truefalse | |||
| Entrega no prazo IsOnTimeDelivery | Um indicador que mostra se os materiais foram recebidos na data de entrega solicitada ou antes dela. | ||
| Descrição Este atributo booleano é verdadeiro quando o timestamp da atividade 'Goods Receipt Posted' ocorre na data de entrega solicitada ou antes dela. Ele fornece um resultado binário claro sobre a performance de entrega de cada item do pedido de compra. Este atributo é a base do KPI 'On-Time Goods Receipt Rate'. Ele simplifica a análise da performance dos fornecedores e da eficiência interna no recebimento, permitindo agregar e filtrar facilmente entregas no prazo e atrasadas. Por que isso importa Fornece uma métrica clara de sucesso ou falha na pontualidade das entregas, dando suporte direto aos KPIs e Dashboards de performance dos fornecedores. Onde obter Este é um atributo calculado pela comparação entre a data de lançamento do recebimento de materiais (EKBE-BUDAT) e a data de entrega solicitada (EKPO-EINDT). Exemplos truefalse | |||
| Grupo de compras PurchasingGroup | O comprador específico ou grupo de compradores responsável pela atividade de compras. | ||
| Descrição O Grupo de compras representa o comprador ou time de compradores responsável por determinada atividade de compras. Esse grupo é o principal ponto de contato com os fornecedores. Este atributo oferece um nível de análise mais detalhado do que a Organização de compras. Ele ajuda a entender a distribuição da carga de trabalho entre os compradores e a identificar diferenças de performance no nível individual, orientando decisões sobre alocação de recursos e iniciativas de treinamento. Por que isso importa Oferece uma visão detalhada de quem é responsável por uma compra, permitindo analisar a carga de trabalho e a performance no nível do comprador ou do time. Onde obter Tabela: EKKO, Campo: EKGRP Exemplos 001002N01 | |||
| Moeda Currency | O 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 é denominado, como USD, EUR ou GBP. Ele fornece o contexto essencial para todos os valores monetários. Para organizações globais, a moeda é essencial para uma análise financeira correta. Ela permite agregar e comparar adequadamente os valores dos pedidos, e todos os KPIs monetários devem ser interpretados no contexto da moeda utilizada. Por que isso importa Fornece o contexto necessário para todos os valores monetários, garantindo uma análise financeira precisa, especialmente em organizações multinacionais. Onde obter Tabela: EKKO, Campo: WAERS Exemplos USDEURJPY | |||
| Motivo da rejeição RejectionReason | O 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 Workflow de aprovação. Essas informações são essenciais 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, estouros de orçamento ou seleção de fornecedores em desacordo com a Conformidade. Esse insight permite que a empresa trate as causas-raiz, melhore a qualidade da criação inicial do pedido de compra e agilize o processo de aprovação. Por que isso importa Fornece um insight direto sobre os motivos das falhas nas aprovações, permitindo melhorias direcionadas para reduzir o retrabalho e encurtar os tempos do ciclo de aprovação. Onde obter Essas informações podem ser difíceis de localizar. Elas podem estar armazenadas em campos de texto longo ou depender de uma configuração personalizada do Workflow. Muitas vezes, exigem conhecimento específico da implementação. Exemplos Preço incorretoOrçamento excedidoSolicitação duplicada | |||
| Nome do fornecedor VendorName | A razão social do fornecedor. | ||
| Descrição O nome descritivo do fornecedor, mais fácil de usar do que o número do fornecedor. Normalmente, ele é obtido dos dados mestres de fornecedores. Enquanto o Número do fornecedor é usado para junções e identificação exclusiva, o Nome do fornecedor é essencial para Dashboards e relatórios voltados aos usuários. Ele torna as análises mais intuitivas e acessíveis para usuários de negócio que talvez não conheçam os códigos dos fornecedores. Por que isso importa Fornece um nome legível para o fornecedor, tornando os Dashboards e relatórios muito mais fáceis de entender para os usuários de negócio. Onde obter Tabela: LFA1, Campo: NAME1. Requer uma junção de EKKO-LIFNR com LFA1-LIFNR. Exemplos Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Organização de compras PurchasingOrganization | A unidade organizacional responsável por negociar preços e adquirir materiais ou serviços. | ||
| Descrição A Organização de compras é uma unidade organizacional essencial no SAP, responsável pelas atividades de compras. Ela pode ser centralizada para toda a empresa ou descentralizada por planta ou região. Analisar a performance do processo por Organização de compras ajuda a identificar quais equipes de compras são mais eficientes. Isso 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 suporte. Por que isso importa Identifica o time de compras responsável, permitindo comparar a performance e analisar diferentes unidades organizacionais. Onde obter Tabela: EKKO, Campo: EKORG Exemplos 1000US01DE01 | |||
| Planta Plant | O local físico ou a planta onde os bens serão entregues. | ||
| Descrição A Planta é uma unidade organizacional que representa uma instalação de produção, um armazém ou outro local onde bens ou serviços são recebidos. Analisar por Planta ajuda a entender as variações geográficas no processo de compras. Isso pode revelar diferenças nos prazos de entrega dos fornecedores para determinados locais ou destacar plantas específicas com processos de recebimento ineficientes, apoiando a análise da pontualidade do recebimento de mercadorias. Por que isso importa Especifica o local de entrega, sendo útil para analisar diferenças regionais no processo e a performance logística. Onde obter Tabela: EKPO, Campo: WERKS Exemplos 100011002000 | |||
| Requisição de compra PurchaseRequisition | O identificador da requisição de compra que precedeu o pedido de compra. | ||
| Descrição Este atributo vincula o pedido de compra à requisição de compra de origem. Nem todos os POs terão uma requisição anterior. Esse vínculo é essencial para analisar o Dashboard de conversão de requisição em pedido e o KPI de taxa de conversão de PR para PO. Ele permite medir a eficiência do processo anterior, desde a solicitação inicial até a criação de um pedido formal, e identificar POs não conformes criados sem uma requisição. Por que isso importa Vincula o PO à sua solicitação de origem, permitindo analisar o processo de conversão de PR para PO e identificar POs criados sem uma requisição anterior. Onde obter 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, que normalmente é um identificador de instância do SAP ECC, como ECC_PROD_100. Em ambientes com vários sistemas, ele ajuda a diferenciar as fontes de dados. Para governança e linhagem de dados, conhecer o sistema de origem é essencial. Isso garante a integridade dos dados e ajuda a solucionar problemas de extração ou qualidade, especialmente quando os dados são combinados de diferentes sistemas ERP ou módulos. Por que isso importa Identifica a origem dos dados, algo essencial para a governança e a validação dos dados e para gerenciar análises em vários sistemas. Onde obter Normalmente, este é um valor estático adicionado durante o processo de 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 | O registro de data e hora que indica quando os dados foram atualizados pela última vez a partir do sistema de origem. | ||
| Descrição Este atributo registra a data e o horário da extração ou atualização de dados mais recente. Ele fornece contexto sobre a atualidade dos dados analisados. Exibir essas informações nos Dashboards é essencial para que os usuários entendam se os insights se baseiam em dados quase em tempo real ou em um retrato histórico. Isso alinha as expectativas dos usuários e garante que as decisões sejam tomadas com base em dados cuja idade é conhecida. Por que isso importa Informa os usuários sobre a atualidade dos dados, garantindo que entendam se a análise reflete o estado mais recente das operações. Onde obter Este registro de data e hora é gerado e adicionado pelo processo de extração de dados ou ETL no momento da execução. Exemplos 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
Purchase to Pay - Pedido de compra: atividades
| Atividade | Descrição | ||
|---|---|---|---|
| Entrada de mercadorias registrada | Esta atividade representa o recebimento físico de bens de um fornecedor referente a um pedido de compra específico. O registro 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 essencial para acompanhar a performance de entrega do fornecedor e o início do processo de verificação da fatura. É usado para calcular as taxas de entrega no prazo e a pontualidade do recebimento de mercadorias. Onde obter Registrado quando um documento de material é criado. O registro de data e hora do evento é a data de lançamento, MKPF-BUDAT, ou a data de criação, MKPF-CPUDT, da tabela de cabeçalho do documento de material, MKPF, vinculada ao PO pela tabela de itens, MSEG. Captura Use o registro de data e hora de lançamento ou criação da tabela MKPF para documentos de material que façam referência ao PO. 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 normalmente é inferido a partir da alteração do status de liberação do PO para um estado de liberação completa ou aprovação. | ||
| Por que isso importa Esta atividade é essencial para calcular o KPI de tempo do ciclo de aprovação do PO e identificar gargalos no Workflow de aprovação. Ela é um pré-requisito para a maioria das atividades seguintes, como o envio do pedido ao fornecedor. Onde obter Inferido pelo acompanhamento dos logs de alterações, 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. Captura Identifique o registro de data e hora em que o status geral de liberação do PO, 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 derivado da configuração automática ou manual do indicador Entrega concluída no item do pedido de compra. | ||
| Por que isso importa Esta atividade funciona como um ponto final lógico da etapa de atendimento do pedido. É essencial para calcular o tempo total do ciclo do PO, desde a criação até a conclusão. Onde obter 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 PO. A marcação do último item como concluído pode indicar a conclusão de todo o PO. Captura Identifique o registro de data e hora nos documentos de alteração quando o indicador EKPO-ELIKZ for definido. Tipo de evento inferred | |||
| Pedido de compra criado | Esta atividade representa a criação de um documento formal de pedido de compra, que funciona como um contrato vinculante com um fornecedor. É um evento explícito, registrado quando um usuário cria e salva um PO, 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 PR para PO quanto o tempo total de atendimento do pedido. Onde obter 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 PO correspondente, EKKO-EBELN. Captura Use o registro de 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 é transmitido oficialmente ao fornecedor, por exemplo, via EDI, e-mail ou impressão. É um evento explícito, capturado nas tabelas de controle de mensagens quando uma mensagem de saída é processada com sucesso. | ||
| Por que isso importa Este é um marco essencial, pois inicia a contagem do prazo de entrega do fornecedor. Analisar o tempo entre esse evento e o recebimento dos bens é fundamental para avaliar a performance do fornecedor e a pontualidade da entrega. Onde obter Registrado na tabela de status de mensagens, NAST. O registro de data e hora pode ser obtido de NAST-DATVR e NAST-UHRVR quando o status de processamento, NAST-VSTAT, for 1, processado com sucesso, para o tipo de mensagem de saída relevante do PO. Captura Use o registro de data e hora do processamento na tabela NAST para a mensagem de saída do PO. 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 um usuário 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 da conversão da demanda interna em pedidos acionáveis. Onde obter 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 servem como registro de data e hora desse evento. Captura 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 de acordo com sua estratégia de liberação configurada. Esse evento é inferido quando a estratégia de liberação é acionada e o PO entra em um status de aprovação pendente. | ||
| Por que isso importa Diferenciar a criação do PO do início do processo de aprovação ajuda a medir com precisão o KPI de tempo do ciclo de aprovação. Isso evidencia qualquer demora antes do início do Workflow de aprovação. Onde obter Inferido a partir dos documentos de alteração, CDHDR/CDPOS, do pedido de compra, objeto EINKBELEG, que mostram a configuração inicial de um status de liberação ou quando o status geral de liberação, EKKO-FRGKE, é definido pela primeira vez com um valor que indica que um processo de aprovação está ativo. Captura Identifique a primeira entrada de documento de alteração que aciona a estratégia de liberação do PO. Tipo de evento inferred | |||
| Confirmação de serviços inserida | Para pedidos de compra baseados em serviços, esta atividade representa a confirmação de que os serviços foram prestados. É um evento explícito, capturado pela 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 aciona o processo financeiro de pagamento do serviço. Onde obter 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. Captura Use o registro de data e hora de criação da tabela ESSR para folhas de registro de serviços vinculadas ao PO. Tipo de evento explicit | |||
| Inspeção de qualidade realizada | Indica que os bens recebidos passaram por uma inspeção de qualidade. Esta atividade normalmente é inferida quando um lote de inspeção, criado no momento do recebimento das mercadorias, recebe uma decisão de uso 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. Os atrasos nessa etapa podem criar gargalos entre o recebimento das mercadorias e sua disponibilidade para uso. Onde obter Inferido a partir do módulo de Gestão da Qualidade. Um lote de inspeção é criado na tabela QALS após o recebimento das mercadorias, e a atividade é marcada pela criação de uma decisão de uso na tabela QAVE, que inclui um registro de data e hora. Captura Identifique o registro de data e hora da decisão de uso 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 bens recebidos anteriormente, geralmente devido a problemas de qualidade ou entregas incorretas. É um evento explícito, capturado pelo lançamento de um documento de material com um tipo de movimento específico para devolução. | ||
| Por que isso importa Esta atividade evidencia problemas na qualidade do fornecedor ou na precisão do pedido e é um indicador importante de retrabalho no processo. É essencial para calcular o KPI de taxa de variação no recebimento de mercadorias. Onde obter Registrado nas tabelas de documentos de material, MKPF/MSEG, quando um tipo de movimento de devolução, como 122 para devolução ao fornecedor, é usado. A data de lançamento, MKPF-BUDAT, serve como registro de data e hora. Captura Identifique os documentos de material com um tipo de movimento de devolução, como 122, que façam referência ao PO 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 de escopo. Esta atividade é essencial para o Dashboard de retrabalho e alterações de PO e para os KPIs relacionados. Onde obter 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 cria uma nova entrada com um registro de data e hora. Captura Extraia os eventos de alteração e os registros de data e hora 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 processamentos posteriores, como recebimentos de mercadorias ou faturamento. É um evento inferido, capturado quando o indicador de exclusão é definido no item do PO. | ||
| Por que isso importa Esta é uma atividade terminal que indica que um pedido foi cancelado. 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 obter 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. Captura Identifique o registro de data e hora nos documentos de alteração quando o indicador EKPO-LOEKZ for definido. Tipo de evento inferred | |||
| Pedido de compra rejeitado | Esta atividade ocorre quando um aprovador rejeita um pedido de compra durante o Workflow de aprovação. É um evento inferido, derivado de uma alteração de status nos dados da estratégia de liberação do PO, indicando que ocorreu uma rejeição. | ||
| Por que isso importa Acompanhar as rejeições ajuda a identificar problemas na qualidade dos dados do PO, na não conformidade com políticas ou na matriz de aprovação. Isso geralmente gera retrabalho e aumenta o tempo total do ciclo. Onde obter Inferido a partir dos documentos de alteração, CDHDR/CDPOS, do status de liberação do pedido de compra. Uma rejeição normalmente é registrada quando um código de liberação é cancelado ou quando um status específico de rejeição é definido. Captura Monitore os logs de alterações para identificar o cancelamento de um código de liberação ou uma alteração 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 um pedido de compra. Esse evento é inferido a partir das alterações nos campos de status de liberação dos dados da requisição de compra, conforme registrado pelo Workflow de estratégia de liberação do SAP. | ||
| Por que isso importa Acompanhar as aprovações é essencial para identificar gargalos na fase anterior ao pedido e garantir a conformidade com as políticas de aprovação. Os atrasos nessa etapa afetam diretamente o tempo total do ciclo de compras. Onde obter Inferido a partir dos logs de alterações da tabela de requisições de compra, EBAN, monitorando especificamente as alterações nos campos de status de liberação, como EBAN-FRGZU, ou analisando os documentos de alteração em CDHDR/CDPOS para o objeto EBAN. Captura Monitore os documentos de alteração dos campos de status de liberação da EBAN para identificar o registro de data e hora da aprovação final. Tipo de evento inferred | |||
Guias de extração
Etapas
- Criar 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'. Informe um título como 'Process Mining PO Data Extraction' e defina o tipo como 'Programa executável'.
- Definir a tela de seleção: No programa, defina os parâmetros da tela de seleção. Isso permite que os usuários filtrem os dados que desejam extrair. Os principais parâmetros incluem 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).
- Definir as estruturas de dados: Declare uma estrutura de tabela interna que corresponda ao formato final do Event Log. Essa estrutura deve incluir todos os atributos obrigatórios e recomendados: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode e DocumentType.
- Implementar a lógica de seleção de dados: Escreva a lógica ABAP principal para selecionar dados para cada uma 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, mantendo o código organizado.
- Selecionar dados de requisições de compra: Consulte a tabela EBAN para eventos 'Purchase Requisition Created', vinculando-os aos pedidos de compra por meio da tabela EKPO. Use as tabelas de log de alterações (CDHDR, CDPOS) para identificar eventos 'Purchase Requisition Approved', acompanhando alterações nos campos de status de liberação.
- Selecionar eventos principais do pedido de compra: Consulte as tabelas EKKO e EKPO para o evento 'Purchase Order Created'. Use as tabelas de log de alterações (CDHDR, CDPOS) no objeto EINKBELEG para extrair eventos 'Purchase Order Changed', 'Purchase Order Approved', 'Purchase Order Rejected', 'Purchase Order Completed' e 'Purchase Order Deleted', com base em alterações em campos específicos, como indicadores de liberação e exclusão.
- Selecionar eventos de comunicação do pedido de compra: Consulte a tabela NAST para encontrar registros em que o pedido de compra foi transmitido com sucesso, registrando a atividade 'Purchase Order Sent to Vendor'.
- Selecionar eventos de materiais e serviços: Consulte a tabela EKBE em busca de lançamentos de documentos de materiais para identificar as atividades 'Goods Receipt Posted' e 'Goods Returned' com base na categoria do tipo de movimento. Consulte ESSR e ESLL para folhas de entrada de serviços e registre 'Services Confirmation Entered'.
- Selecionar 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 uma decisão de uso foi tomada para um lote de inspeção vinculado a um pedido de compra, representando a atividade 'Quality Inspection Performed'.
- Combinar e formatar os dados: Consolide os dados de todas as seleções individuais em uma única tabela interna final. Garanta que o campo EventTime esteja formatado de maneira consistente, por exemplo, YYYY-MM-DDTHH:MI:SS.
- Implementar o download do arquivo: Adicione uma funcionalidade para baixar a tabela interna final como um arquivo. O formato recomendado é um arquivo separado por tabulações ou CSV, que pode ser gerado usando o módulo de função GUI_DOWNLOAD.
- Executar e salvar: Execute o programa usando a transação SE38 ou SA38. Preencha os critérios de seleção e execute o relatório. Quando solicitado, salve o arquivo de saída no seu computador com a extensão .csv, pronto para upload.
Configuração
- Intervalo de datas: É essencial definir um intervalo específico para a extração, normalmente com base na data de criação do pedido de compra (EKKO-AEDAT). Um período de 3 a 6 meses costuma ser um bom ponto de partida para equilibrar o volume de dados e os insights do processo.
- Código da empresa (BUKRS): Filtre por um ou mais códigos de empresa para limitar a extração às entidades jurídicas relevantes. Esse é um parâmetro importante para a performance e a relevância da análise.
- Tipo de documento de compras (BSART): Filtre por tipos de documento específicos, 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 Case ID é o número do pedido de compra (EBELN). Todos os eventos, inclusive os que ocorrem no nível do item, como recebimentos de materiais, são vinculados a esse Case ID principal.
- Considerações de performance: Para grandes volumes de dados, agende a execução do programa como um job em background (SM36) para evitar erros de timeout. Garanta que existam índices no banco de dados para os principais campos usados nas cláusulas WHERE, especialmente nas tabelas CDHDR e CDPOS.
- Pré-requisitos: O usuário que executar o relatório precisa de autorização para acessar o ambiente de desenvolvimento ABAP (SE38) e de permissão para executar o programa. Também é necessário ter acesso de leitura a todas as tabelas subjacentes, incluindo EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR e as tabelas de QM.
a 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 leitura e os dados de conexão, como nome do host, porta e nome do banco de dados, para o banco de dados subjacente do SAP ECC. Verifique se as ferramentas de cliente necessárias, como DBeaver, SQL Developer ou SSMS, estão instaladas.
- Identifique o esquema do SAP: conecte-se ao banco de dados e identifique o esquema principal do SAP onde as tabelas estão localizadas. Geralmente, ele é SAPSR3, SAPHANADB ou outro nome específico do sistema. Se esse não for o esquema padrão do seu usuário, você precisará prefixar todos os nomes de tabela da consulta com esse esquema.
- Revise a consulta SQL: abra o script SQL fornecido na ferramenta de cliente. Essa consulta abrangente foi criada para extrair 14 atividades distintas do processo Purchase-to-Pay, unindo várias tabelas do SAP.
- Personalize os parâmetros da consulta: localize a CTE PO_BASE no início do script. Modifique os valores de espaço reservado 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'. Recomenda-se filtrar pelo campo AEDAT (Changed On).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: especifique os códigos de empresa do SAP que devem ser incluídos.
- [DOC_TYPE_1], [DOC_TYPE_2]: especifique os tipos de documento de pedido de compra que devem ser incluídos.
- [Your SAP Schema]: substitua esse espaço de reserva pelo nome real do seu esquema SAP em todo o script.
- Execute a consulta: execute 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.
- Inspecione os resultados: quando a consulta for concluída, 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 do seu cliente SQL para um arquivo CSV. Use a codificação UTF-8 para evitar problemas com caracteres.
- Prepare o carregamento: verifique 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, DocumentType.
- Carregue no Process Mining: carregue o arquivo CSV final no seu aplicativo de Process Mining para análise e visualização.
Configuração
- Pré-requisitos: É necessário ter acesso direto e somente 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.
- Filtragem por intervalo de datas: É fundamental aplicar um filtro de intervalo de datas para limitar o volume de dados. Filtrar por EKKO.AEDAT (data de alteração do pedido de compra) em um período de 3 a 6 meses é um ponto de partida comum. Intervalos muito amplos podem gerar tempos de execução extremamente longos.
- Principais filtros de dados: 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 jurídicas e aos processos de negócio relevantes.
- Considerações de performance: A consulta faz a junção de várias tabelas grandes, incluindo as tabelas de histórico de alterações (CDHDR, CDPOS). Isso pode consumir muitos recursos. Recomenda-se executar a extração fora dos horários de pico ou em um banco de dados replicado e não produtivo, evitando impactos na performance do sistema.
- Registro de documentos de alteração: A precisão de atividades como 'Approved', 'Rejected', 'Completed' e 'Changed' 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, por meio da transação SCDO.
a 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: Garanta que sua ferramenta ETL de terceiros tenha 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ções, 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.
- Identificar as tabelas de origem: No job ETL ou no fluxo de dados, defina as tabelas SAP necessárias como fontes de dados. As principais tabelas incluem 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: material), MKPF (cabeçalho do documento de material), NAST (status da mensagem), ESSR (cabeçalho da folha de entrada de serviços) e QALS (lote de inspeção).
- Extrair 'Purchase Order Created': 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 código da empresa e BSART para tipo de documento. Mapeie EKKO.EBELN para PurchaseOrder, 'Purchase Order Created' para Activity e combine AEDAT e ERZET para formar EventTime. Mapeie os demais atributos obrigatórios.
- Extrair 'Goods Receipt Posted': Crie um fluxo de dados separado com origem em MSEG e faça a junção com MKPF usando MBLNR e MJAHR. Filtre os tipos de movimento relevantes, como '101'. Mapeie MSEG.EBELN para PurchaseOrder, 'Goods Receipt Posted' para Activity e use MKPF.CPUDT e MKPF.CPUTM para EventTime.
- Extrair eventos baseados em alterações, aprovações e exclusões: Crie um fluxo de dados com origem em CDHDR e CDPOS, fazendo a junção por CHANGENR. Essa única fonte pode ser usada para derivar várias atividades.
- Filtre OBJECTCLAS = 'EINKBELEG' e TABNAME = 'EKPO'.
- Para 'Purchase Order Approved', filtre alterações no campo de status de liberação, por exemplo, FNAME = 'FRGZU', em que o novo valor (VALUE_NEW) indique a aprovação final.
- Para 'Purchase Order Deleted', filtre alterações no indicador de exclusão, FNAME = 'LOEKZ', em que o novo valor seja 'L'.
- Para 'Purchase Order Changed', filtre outras alterações de campos relevantes, excluindo os campos de status específicos usados nas demais atividades.
- Para todos esses eventos, use CDHDR.UDATE e CDHDR.UTIME para EventTime.
- Extrair eventos de 'Purchase Requisition': Crie um fluxo de dados a partir de EBAN para 'Purchase Requisition Created'. Para vincular esse evento a um Case ID de PurchaseOrder, faça a junção de EBAN com EKPO usando o número da requisição (BANFN) e o item (BNFPO). Para 'Purchase Requisition Approved', use CDHDR/CDPOS com OBJECTCLAS = 'BANF'. É necessário fazer um mapeamento cuidadoso para garantir que o evento seja associado ao pedido de compra correspondente.
- Extrair 'PO Sent to Vendor': Crie um fluxo de dados com origem na tabela NAST. Filtre OBJECTKEY, que contém o número do pedido de compra, o tipo de saída relevante (KSCHL) e um status de processamento bem-sucedido (VSTAT = '1'). Use ERDAT e UHR para EventTime.
- Combinar 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 individuais criados nas etapas anteriores. Garanta que os nomes e os tipos de dados das colunas sejam consistentes em todos os fluxos, incluindo PurchaseOrder, Activity e EventTime.
- Converter tipos e formatos de dados: Garanta que a coluna EventTime seja convertida para um formato de timestamp consistente, por exemplo, YYYY-MM-DD HH:MM:SS. Converta OrderAmount para um formato decimal padrão.
- Definir o destino: Configure um destino ou 'sink' para o fluxo de dados combinado. Normalmente, trata-se de um arquivo simples, como CSV ou Parquet. Configure o delimitador, os qualificadores de texto e as opções de cabeçalho.
- Executar e validar: Execute o job ETL completo. Faça verificações no arquivo de saída para garantir que todas as 14 atividades estejam presentes, que a quantidade de linhas seja razoável e que os principais atributos estejam preenchidos corretamente.
- Agendar e exportar: Depois da validação, agende a execução periódica do job ETL, por exemplo, todas as noites, para manter os dados atualizados. O arquivo gerado estará pronto para upload na sua ferramenta de Process Mining.
Configuração
- Pré-requisitos: Uma ferramenta ETL comercial, como Informatica PowerCenter, Talend ou SAP Data Services, com o SAP Certified Connector correspondente para ECC. Um usuário de diálogo ou usuário do sistema 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 aplicativos SAP, número do sistema, mandante, usuário e senha. Recomenda-se usar Secure Network Communications (SNC).
- Filtro de intervalo de datas: É fundamental aplicar um filtro de intervalo de datas para limitar o volume de dados. Uma prática comum é filtrar EKKO.AEDAT (data de criação do pedido de compra) pelos últimos 3 a 12 meses. Esse filtro deve ser aplicado na origem para evitar a extração de um volume excessivo de dados do 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 relevantes de pedidos de compra e excluir transferências de estoque ou outros documentos internos que não façam parte do processo P2P padrão.
- Ajuste de performance: A extração das tabelas de documentos de alteração, CDHDR e CDPOS, pode ser lenta. Garanta que sejam aplicados filtros em OBJECTCLAS, OBJECTID e UDATE. Ajuste a configuração de 'Packet Size' no conector SAP para otimizar as taxas de transferência de dados. Em sistemas muito grandes, considere fazer uma carga histórica inicial seguida de cargas delta programadas.
a 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 o roteiro para otimizar seu processo Purchase to Pay - Purchase Order no SAP ECC. Comece hoje a usar seus dados para descobrir insights e aumentar a eficiência.
Otimize o Purchase Order do P2P: 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.