Seu Template de Dados para Record to Report - Lançamentos Contábeis
Seu Template de Dados para Record to Report - Lançamentos Contábeis
- Atributos recomendados para análise abrangente
- Principais atividades de lançamento para monitorar
- Orientação prática para extração de dados no SAP ECC
Record to Report - Atributos de Lançamento Contábil
| Nome | Descrição | ||
|---|---|---|---|
| ID do Lançamento Contábil JournalEntryId | O identificador exclusivo para um documento contábil, combinando empresa, número do documento e exercício fiscal. | ||
| Descrição O ID do Lançamento Contábil é o identificador principal (case ID) para rastrear o ciclo de vida do item. É uma chave composta, geralmente formada pela Empresa (BUKRS), Número do Documento (BELNR) e Exercício Fiscal (GJAHR). Na análise de processos, esse ID vincula todas as atividades relacionadas, como criação, pré-edição, envio, aprovação e efetivação. Ao rastreá-lo, construímos a jornada completa de cada lançamento, medindo tempos de ciclo e identificando desvios ou gargalos específicos. Por que é importante Chave essencial para rastrear um lançamento da criação até a efetivação final, permitindo análise ponta a ponta e comparação de variantes. Onde obter Atributo derivado, geralmente uma concatenação de campos da BKPF: Empresa (BUKRS), Número do Documento (BELNR) e Exercício Fiscal (GJAHR). Exemplos 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Nome da Atividade ActivityName | O nome da atividade de negócio ou evento que ocorreu em um ponto específico do processo de lançamento contábil. | ||
| Descrição O Nome da Atividade descreve uma etapa específica no ciclo de vida do lançamento, como 'Lançamento Criado', 'Lançamento Aprovado' ou 'Lançamento Efetivado'. Este atributo é geralmente derivado de várias fontes no SAP, incluindo códigos de transação (TCODE), logs de alteração (tabelas CDHDR e CDPOS) e campos de status. Analisar atividades é o cerne do Process Mining. Permite visualizar o mapa do processo, calcular tempos de transição e identificar loops de retrabalho (ex: 'Lançamento Rejeitado' seguido de 'Lançamento Corrigido'). Esses dados são fundamentais para dashboards de tempos de ciclo, taxas de retrabalho e variantes de processo. Por que é importante Define as etapas no mapa de processos, possibilitando visualizar, analisar e otimizar o workflow de lançamentos contábeis. Onde obter Derivado de várias fontes, incluindo códigos de transação na BKPF (TCODE), status do documento, logs de workflow na SWW_WI2OBJ ou documentos de modificação em CDHDR e CDPOS. Exemplos Lançamento Contábil CriadoLançamento Contábil AprovadoLançamento Contábil RejeitadoLançamento Contábil Efetivado | |||
| Tempo do Evento EventTime | O timestamp indicando quando uma atividade ou evento específico ocorreu para o lançamento contábil. | ||
| Descrição O Event Time fornece a data e hora exatas de cada atividade. Esses dados são vitais para calcular métricas de tempo, como tempos de ciclo e atrasos. A fonte varia conforme a atividade: pode ser a data/hora de criação (CPUDT/CPUTM) ou timestamps de logs (CDHDR-UDATE/UTIME). Na análise, o Event Time ordena os eventos cronologicamente para formar o mapa do processo. É essencial para KPIs como Tempo de Ciclo Médio, Tempo Médio de Aprovação e Tempo da Aprovação à Contabilização. Por que é importante Este timestamp é a base para todas as análises temporais, permitindo o cálculo de tempos de ciclo, durações e gargalos. Onde obter Originado de vários campos dependendo da atividade, principalmente timestamps de criação (CPUDT, CPUTM) da BKPF ou logs de alteração (UDATE, UTIME) da CDHDR. Exemplos 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| Sistema de Origem SourceSystem | O sistema do qual os dados do processo foram extraídos. | ||
| Descrição Identifica a origem dos dados, neste caso, a instância específica do SAP ECC. Geralmente é um valor estático adicionado durante a extração. Embora simples, é importante em ambientes com múltiplos ERPs. Garante que a linhagem dos dados esteja clara e permite filtrar a análise pelo sistema de origem. Por que é importante Fornece uma linhagem de dados clara e é essencial para rastrear a qualidade dos dados, especialmente em ambientes com múltiplos sistemas de origem. Onde obter Geralmente um valor estático na transformação de dados, identificando a instância do SAP ECC (ex: 'ECC_PROD_100'). Exemplos SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| Última Atualização de Dados LastDataUpdate | O timestamp que indica quando os dados foram extraídos ou atualizados pela última vez do sistema de origem. | ||
| Descrição Registra a data e hora da última extração de dados do SAP ECC. É um campo de metadados crítico para entender a atualidade dos dados analisados. Em qualquer análise de Process Mining, saber a última atualização é vital para que os usuários confiem nos dados. Ajuda a responder: 'Quão atualizada está esta informação?'. Por que é importante Informa os usuários sobre a atualização dos dados, garantindo que entendam o período da análise e possam confiar nos resultados. Onde obter Campo de metadados gerado pela ferramenta de extração ou ETL no momento da atualização dos dados. Exemplos 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| C digo de Transa o TransactionCode | O código de transação SAP (T-code) usado para criar ou processar o lançamento contábil. | ||
| Descrição O Código de Transação (T-Code) identifica uma função ou programa no SAP. Indica como o lançamento foi criado: manualmente (FB01, F-02), via parking (FV50) ou por interface automatizada. Este atributo é essencial para dashboards de 'Otimização de Atividades Manuais'. Analisando o T-Code, distinguimos tarefas manuais de automáticas, identificamos processos lentos e oportunidades de automação para reduzir o esforço manual e aumentar a eficiência. Por que é importante Ajuda a diferenciar processos manuais de automatizados, identificando oportunidades de automação e padronização. Onde obter Localizado na tabela de cabeçalho do documento BKPF, campo TCODE. Exemplos FB01F-02FV50FBD1 | |||
| Código da Empresa CompanyCode | A unidade organizacional que representa uma entidade legal independente para a qual as demonstrações financeiras são preparadas. | ||
| Descrição A Empresa (Company Code) é a unidade organizacional fundamental no SAP Financials. Representa uma entidade legal independente e é um campo-chave no cabeçalho do lançamento. Este atributo é essencial para segmentar a análise por entidade legal. Permite comparar o desempenho, taxas de conformidade e resultados de KPIs entre diferentes partes do negócio. Por exemplo, ajuda a identificar se atrasos na aprovação ou taxas de estorno são específicos de certas empresas. Por que é importante Permite filtrar e comparar o desempenho do processo entre diferentes entidades legais ou unidades de negócio da organização. Onde obter Localizado na tabela de cabeçalho do documento BKPF, campo BUKRS. Exemplos 10002000US01DE01 | |||
| Data de Lançamento PostingDate | A data em que a transação é registrada no razão geral, afetando o período fiscal. | ||
| Descrição A Data de Lançamento define o período fiscal do item. É um campo crítico para conformidade, pois deve estar alinhado com os cronogramas de fechamento contábil e regulações. No Process Mining, esta data monitora a conformidade. Dashboards de adesão e KPIs de taxa de conformidade usam este atributo para checar se os itens são lançados no período correto. Também serve para analisar tendências de volume ao longo do tempo. Por que é importante Fundamental para relatórios e conformidade, garantindo que os lançamentos ocorram no período contábil correto. Onde obter Localizado na tabela de cabeçalho do documento BKPF, campo BUDAT. Exemplos 2023-10-312023-11-302024-01-15 | |||
| Está Estornado IsReversed | Um indicador booleano que sinaliza se o lançamento contábil foi estornado. | ||
| Descrição Identifica lançamentos que foram estornados posteriormente. No SAP, um documento estornado é vinculado ao seu estorno, garantindo trilha de auditoria. Atributo fundamental para o dashboard de 'Análise de Estornos' e o KPI de 'Taxa de Estorno'. Permite isolar os itens estornados para investigar causas, como erros de digitação ou tratamento contábil incorreto, visando reduzir essas ocorrências. Por que é importante Apoia diretamente a análise de estornos ao sinalizar lançamentos que foram desfeitos, ajudando a identificar causas de erro e melhorar a integridade dos dados. Onde obter Derivado do campo de documento de estorno (STBLG) na tabela BKPF. Se STBLG não estiver vazio, o indicador é verdadeiro. Exemplos verdadeirofalse | |||
| Tipo de Documento DocumentType | Uma classificação para documentos contábeis que controla como eles são processados e armazenados. | ||
| Descrição O Tipo de Documento distingue transações de negócio, como lançamentos no razão (SA), faturas de fornecedor (KR) ou lançamentos de ativos (AA). Este atributo é crítico pois permite segmentar o processo pela natureza da transação. Dashboards como 'Volume de Lançamentos por Tipo' e 'Tempo de Ciclo Médio por Tipo' dependem deste campo. Ele ajuda a descobrir se certos tipos de lançamentos são mais propensos a atrasos, retrabalhos ou estornos. Por que é importante Permite segmentar a análise por tipo de transação, ajudando a identificar se os problemas são específicos de certos tipos de lançamentos. Onde obter Localizado na tabela de cabeçalho do documento BKPF, campo BLART. Exemplos SAKRREAA | |||
| Utilizador User | O ID de usuário SAP da pessoa que criou ou alterou o lançamento contábil. | ||
| Descrição Este atributo captura o usuário SAP responsável pela atividade (criação, parking, efetivação). Vem do cabeçalho do documento ou tabelas de log de alteração. Analisar o Usuário é chave para entender o desempenho individual e da equipe. Alimenta o dashboard de Produtividade do Usuário rastreando volumes e tempos. Também identifica quem está envolvido em loops de retrabalho ou estornos, permitindo treinamentos focados. Por que é importante Identifica o usuário responsável por cada atividade, permitindo analisar o desempenho, a distribuição da carga de trabalho e os padrões de retrabalho. Onde obter Normalmente extraído da tabela BKPF (campo USNAM para o criador) ou da tabela CDHDR (campo USERNAME para quem realizou a alteração). Exemplos ABROWNCJONESDSMITH | |||
| Centro de Custo CostCenter | Uma unidade organizacional em uma área de controle que representa um local onde os custos são gerados. | ||
| Descrição O Centro de Custo é um dado mestre do módulo de Controlling (CO), frequentemente atribuído ao item de linha do lançamento. Ele rastreia custos por departamento ou função. Incluir o Centro de Custo permite uma análise granular. Ajuda a determinar se certos departamentos geram mais retrabalho, têm ciclos mais longos ou fazem mais lançamentos manuais. Isso possibilita uma visão departamental da eficiência do processo. Por que é importante Permite analisar o desempenho do processo por departamento ou área funcional, ajudando a localizar ineficiências específicas. Onde obter Localizado na tabela de itens do documento BSEG, campo KOSTL. Exemplos 4100CC_FINANCE_US10010101 | |||
| Chave da Moeda CurrencyKey | O código da moeda para os valores registrados no lançamento contábil. | ||
| Descrição Especifica a moeda do lançamento (USD, EUR, BRL). Dá contexto aos valores financeiros do documento. Embora nem sempre seja a dimensão principal, é crucial para interpretar valores corretamente. Permite segmentar a análise em empresas globais para ver se o processo muda entre moedas locais e estrangeiras. Por que é importante Fornece o contexto necessário para todos os valores monetários, garantindo análises e interpretações financeiras precisas. Onde obter Localizado na tabela de cabeçalho do documento BKPF, campo WAERS. Exemplos USDEURGBPJPY | |||
| É Retrabalho IsRework | Um indicador booleano que sinaliza se um lançamento contábil passou por um ciclo de retrabalho, como ser rejeitado e depois corrigido. | ||
| Descrição Esta flag identifica casos que desviaram do caminho ideal e exigiram correção. É ativada se ocorrer uma sequência como 'Lançamento Rejeitado' seguido de 'Lançamento Corrigido'. Essencial para calcular o KPI de 'Taxa de Retrabalho' e para o dashboard de 'Taxas de Retrabalho e Rejeição'. Ajuda a quantificar a ineficiência e fornece base para investigar causas raiz, como falta de clareza nos requisitos ou documentação insuficiente. Por que é importante Sinaliza lançamentos que exigiram correção, permitindo quantificar o retrabalho e analisar causas raiz para melhorar o índice de acerto na primeira tentativa. Onde obter Atributo calculado que analisa a sequência de atividades. Um loop de retrabalho é identificado se houver uma atividade de rejeição ou correção. Exemplos verdadeirofalse | |||
| Está Estacionado IsParked | Um indicador booleano que informa se o lançamento foi salvo como um documento preliminar antes de ser efetivamente contabilizado. | ||
| Descrição Estacionar (park) um documento permite salvar um lançamento incompleto sem afetar os saldos financeiros. Ele pode ser concluído ou revisado por outro usuário antes de ser efetivado. Esta marcação identifica lançamentos que passaram pela etapa de pré-edição. Analisar este atributo ajuda a entender o uso do recurso de parking. Pode revelar se ele está sendo usado como uma etapa informal de revisão, causando atrasos. Também auxilia na análise do tempo de ciclo ponta a ponta, diferenciando lançamentos diretos daqueles que foram estacionados primeiro. Por que é importante Identifica lançamentos que utilizam o recurso de pré-edição (parking), que pode ser uma fonte de atraso ou um indicador de um processo de revisão informal. Onde obter Derivado do campo de status do documento (BSTAT) na tabela BKPF. O valor 'V' indica um documento preliminar (pré-editado). Exemplos verdadeirofalse | |||
| Motivo do Estorno ReversalReason | Um código que indica o motivo pelo qual um lançamento contábil foi estornado. | ||
| Descrição Quando um documento é estornado, o SAP permite que o usuário especifique um código de motivo. Esse código fornece informações estruturadas sobre por que o estorno foi necessário — por exemplo, data de lançamento incorreta ou erro de digitação. Este atributo é um dado fundamental para o dashboard de 'Análise de Estorno de Lançamento Contábil'. Ao analisar os motivos de estorno mais comuns, as organizações podem identificar problemas sistêmicos em seus processos ou lacunas de treinamento, tomando medidas direcionadas para evitar erros futuros e reduzir a taxa de estorno. Por que é importante Oferece insights diretos sobre o motivo dos estornos, permitindo análises de causa raiz focadas para reduzir erros futuros. Onde obter Localizado na tabela de cabeçalho do documento BKPF, campo STGRD. Exemplos 010205 | |||
| Tempo de aprovação ApprovalTime | O tempo decorrido desde que o lançamento é submetido para aprovação até ser aprovado ou rejeitado. | ||
| Descrição Esta métrica mede a duração do subprocesso de aprovação, que costuma contribuir significativamente para o tempo de ciclo total. Ela é calculada pela diferença de tempo entre a atividade 'Lançamento Contábil Enviado' e a correspondente 'Lançamento Contábil Aprovado' ou 'Lançamento Contábil Rejeitado'. O Tempo de Aprovação é a métrica principal para o dashboard de 'Performance de Aprovação de Lançamento Contábil' e para o KPI de 'Tempo Médio de Aprovação de Lançamento Contábil'. Analisar essa duração ajuda a identificar gargalos no workflow de aprovação, medir a performance dos aprovadores e justificar mudanças no processo, como o ajuste de alçadas de aprovação. Por que é importante Quantifica a duração da etapa de aprovação, ajudando a identificar e resolver atrasos no fluxo de revisão e aprovação. Onde obter Calculado subtraindo o timestamp do evento 'Lançamento Contábil Enviado' do evento de 'Aprovado' ou 'Rejeitado'. Exemplos P1DT2HPT4H15MP3D | |||
| Tempo de Ciclo CycleTime | O tempo total decorrido desde a criação da primeira atividade do lançamento até a efetivação final. | ||
| Descrição O Tempo de Ciclo é um KPI que mede a duração de ponta a ponta dos lançamentos contábeis. É calculado pela diferença entre o timestamp do evento de contabilização final e o evento de criação inicial. Essa métrica é a medida principal no dashboard de 'Tempo de Ciclo de Ponta a Ponta' e no KPI de 'Tempo de Ciclo Médio'. Ela oferece uma visão geral da eficiência e serve para monitorar o impacto das melhorias ao longo do tempo. Por que é importante Mede a eficiência ponta a ponta do processo, sendo uma métrica chave para identificar gargalos e monitorar melhorias. Onde obter Calculado subtraindo o timestamp do primeiro evento do timestamp do último evento para cada caso (JournalEntryId). Exemplos P2DT3H15MPT8H30MP5D | |||
| Valor Total do Documento TotalDocumentAmount | O valor total do lançamento contábil na moeda do documento. | ||
| Descrição Representa o valor financeiro total do lançamento. Geralmente é calculado pela soma dos valores absolutos dos itens de débito ou crédito. Analisar o processo pelo valor financeiro pode revelar padrões. Por exemplo, lançamentos de alto valor podem seguir caminhos de aprovação mais rigorosos. Permite filtrar a análise para ver se tempos de ciclo ou atrasos se correlacionam com o montante. Por que é importante Permite análise de impacto financeiro, como correlacionar tempos de processamento ou taxas de rejeição com o valor monetário dos lançamentos. Onde obter Campo calculado que agrega o valor (WRBTR ou DMBTR) de todos os itens de linha da tabela BSEG para o lançamento correspondente. Exemplos 1500.0025000.75125.50 | |||
Record to Report - Atividades de Lançamento Contábil
| Atividade | Descrição | ||
|---|---|---|---|
| Lançamento Contábil Aprovado | Marca a aprovação final do lançamento no workflow, tornando-o apto para efetivação. O evento é capturado do log de workflow quando a etapa final de 'liberação' ou 'aprovação' é concluída. | ||
| Por que é importante Marco chave que conclui a aprovação. A duração até esta atividade é um KPI de eficiência de aprovação, e o tempo desta etapa até o lançamento final mede o atraso pós-aprovação. Onde obter Inferido a partir do timestamp de conclusão da etapa final de aprovação no log do SAP Business Workflow. Esta é a última ação de aprovação antes do documento ser contabilizado ou preparado para lançamento. Captura Identificar a conclusão da etapa final de 'liberação' ou 'aprovação' nos logs de workflow. Tipo de evento inferred | |||
| Lançamento Contábil Efetivado | Atividade central onde o lançamento é registrado no razão geral, impactando as demonstrações financeiras. Capturado quando o status muda para 'efetivado' e uma data de lançamento é atribuída. | ||
| Por que é importante Marco mais importante, indicando o processamento bem-sucedido. O tempo de ciclo ponta a ponta costuma ser medido até aqui, sendo vital para o fechamento financeiro. Onde obter Identificado quando um documento na tabela BKPF possui uma data de lançamento (BKPF-BUDAT). Para documentos estacionados (parked), isso corresponde ao momento em que o status BKPF-BSTAT muda de 'V' para vazio. O timestamp do lançamento é a data de entrada BKPF-CPUDT. Captura Identificar quando o BKPF-BSTAT muda de 'V' para vazio ou, para lançamentos diretos, o evento de criação. Tipo de evento explicit | |||
| Lançamento Contábil Estacionado (Parked) | Marca a criação inicial do lançamento em estado preliminar, antes de ser contabilizado no razão geral. É capturado no SAP quando o usuário salva o documento via transação de parking, definindo o status como 'estacionado'. | ||
| Por que é importante Evento inicial crítico para processos com revisão. Analisar o tempo entre o parking (estacionar) e a efetivação ajuda a identificar atrasos nas fases de pré-lançamento e aprovação. Onde obter Evento identificado na tabela BKPF. Um documento é considerado estacionado (parked) quando criado com status BKPF-BSTAT = 'V'. O timestamp é a data e hora de criação, BKPF-CPUDT e BKPF-CPUTM. Captura Identificar a criação de documento em BKPF onde BKPF-BSTAT é 'V'. Tipo de evento explicit | |||
| Lançamento Contábil Submetido | Indica que um lançamento estacionado foi finalizado pelo criador e está pronto para revisão e aprovação. Geralmente é capturado pelo início de uma tarefa do SAP Business Workflow associada ao documento. | ||
| Por que é importante Marca a transferência do criador para o aprovador, iniciando a contagem dos KPIs de tempo de aprovação. Marco fundamental para medir a eficiência do workflow. Onde obter Inferido a partir do horário de início da instância do workflow de aprovação vinculado ao objeto do documento financeiro. Requer a análise de tabelas de log de workflow como SWW_WI2OBJ para encontrar o workflow iniciado para a empresa, número de documento e exercício fiscal específicos. Captura Identificar o evento de início de workflow para o objeto de documento estacionado. Tipo de evento inferred | |||
| Processamento de Estorno de Lançamento | Marca o estorno de um lançamento efetivado anteriormente. O estorno é um novo documento contábil que anula o lançamento original. | ||
| Por que é importante Evento crítico para medir a qualidade dos dados e precisão do processo. Uma alta taxa de estornos aponta problemas sistêmicos na entrada de dados ou aprovação, além de representar retrabalho. Onde obter Evento identificado no cabeçalho do documento original (BKPF). Quando estornado, o SAP preenche o número do documento de estorno (BKPF-STBLG) e o motivo (BKPF-STGRD). O timestamp é a data de lançamento do novo documento de estorno. Captura Identificar quando o BKPF-STBLG é preenchido no documento original; o timestamp é a data de lançamento do documento de estorno. Tipo de evento explicit | |||
| Alterações Solicitadas no Lançamento Contábil | Representa um ponto no workflow onde um aprovador revisou o lançamento e o devolveu ao criador para correção. Este evento é capturado dos logs de workflow indicando uma decisão de 'rejeição' ou 'devolução'. | ||
| Por que é importante Essencial para identificar loops de retrabalho, que são grandes fontes de ineficiência. Uma alta frequência deste evento indica problemas na qualidade do lançamento ou requisitos pouco claros. Onde obter Este evento é inferido do timestamp de uma etapa específica de decisão no log do SAP Business Workflow que corresponde a uma ação de 'rejeição' ou 'devolução para correção'. Captura Identificar o timestamp da decisão de 'rejeição' ou 'retrabalho' nos logs de workflow. Tipo de evento inferred | |||
| Documentação Anexada | Representa um usuário anexando documentos de suporte (faturas, planilhas) ao lançamento. Não é logado como evento contábil padrão, sendo inferido pela criação de anexos vinculados ao objeto do documento contábil. | ||
| Por que é importante O rastreamento desta atividade ajuda a verificar a conformidade com as políticas que exigem documentação. Atrasos no anexo de documentos podem ser a causa raiz de ciclos de aprovação prolongados. Onde obter Difícil de capturar como evento de timestamp. Pode ser inferido analisando tabelas de anexos GOS (ex: SOOD), vinculando a criação do anexo à chave do documento contábil. Captura Inferir a partir do timestamp de criação de objetos vinculados nas tabelas GOS (ex: SOOD). Tipo de evento inferred | |||
| Item de Linha do Lançamento Compensado | Representa a conciliação de um item de linha de conta do razão gerida por partidas abertas (ex: conta transitória bancária). Ocorre quando um item é correspondido com outro, sendo liquidado. | ||
| Por que é importante Para processos como a conciliação bancária, o tempo de compensação de itens é um KPI crucial. Esta atividade ajuda a analisar a eficiência da conciliação e dos procedimentos de fechamento mensal. Onde obter Evento capturado da tabela de itens BSEG. Quando um item é compensado, os campos de data de compensação (BSEG-AUGDT) e documento de compensação (BSEG-AUGBL) são preenchidos. O timestamp é a data de compensação. Captura Identificar quando a data de compensação (BSEG-AUGDT) é preenchida para um item de linha. Tipo de evento explicit | |||
| Lançamento Contábil Corrigido | Indica que o criador original modificou um lançamento estacionado após ele ter sido devolvido para alterações. É inferido detectando mudanças no documento após um evento de 'Solicitação de Alterações'. | ||
| Por que é importante O acompanhamento de correções ajuda a quantificar o esforço gasto em retrabalho. O tempo entre uma solicitação de alteração e a correção evidencia atrasos na resolução de problemas em lançamentos já enviados. Onde obter Inferido através da análise dos logs de alteração (tabelas CDHDR e CDPOS) do documento estacionado. Uma alteração registrada após um evento de rejeição no workflow indica que uma correção foi feita. O timestamp vem da tabela CDHDR. Captura Identificar entrada no log de alterações em CDHDR/CDPOS após um evento de rejeição. Tipo de evento inferred | |||
| Lançamento Contábil Criado | Representa a criação de um lançamento contábil que é efetivado diretamente, sem passar pela etapa de parking. Isso é capturado quando um documento é criado no SAP via transação de lançamento direto. | ||
| Por que é importante Serve como um ponto inicial alternativo para processos simples que não exigem workflow de aprovação. Ajuda a diferenciar lançamentos diretos de itens pré-editados mais complexos. Onde obter Este evento corresponde à criação do documento na tabela BKPF onde o status BKPF-BSTAT está em branco (efetivado). O timestamp é a data de criação, BKPF-CPUDT. Para estes documentos, os eventos 'Criado' e 'Efetivado' ocorrem simultaneamente. Captura Identificar a criação de documento em BKPF onde BKPF-BSTAT está em branco. Tipo de evento explicit | |||
| Lançamento Contábil Estacionado Excluído | Representa a exclusão de um lançamento contábil estacionado (parked) que nunca foi efetivado. Isso pode ocorrer após uma rejeição ou se o lançamento foi criado por erro. | ||
| Por que é importante Marca o encerramento sem sucesso do processo. Analisar por que documentos estacionados são excluídos pode revelar problemas como lançamentos duplicados ou erros de interpretação do processo. Onde obter Evento capturado quando o status de um documento estacionado na BKPF é alterado. O campo de status BKPF-BSTAT é atualizado para 'Z' (Documento excluído). O timestamp da alteração é encontrado nos logs de modificação (CDHDR). Captura Identificar quando o BKPF-BSTAT é atualizado para 'Z'. Tipo de evento explicit | |||
| Lançamento Contábil Rejeitado | Significa a rejeição final do lançamento, indicando que ele não será contabilizado. Geralmente é um status terminal no workflow, levando à futura exclusão do documento. | ||
| Por que é importante Monitorar as rejeições é fundamental para a gestão da qualidade. Analisar os motivos e a frequência das rejeições ajuda a melhorar o índice de acerto na primeira tentativa (first-time-right) dos lançamentos contábeis. Onde obter Resultado capturado no log do SAP Business Workflow, representando uma decisão final de 'rejeição' que encerra o processo. O documento estacionado pode ser excluído depois. Captura Identificar o status terminal de 'rejeição' no log de workflow do documento. Tipo de evento inferred | |||
| Lançamento entre Empresas Identificado | Uma atividade calculada que identifica lançamentos contábeis que afetam mais de uma empresa. Isso é definido analisando os itens de um único documento financeiro. | ||
| Por que é importante Transações entre empresas podem ter requisitos de aprovação mais complexos. Identificá-las permite analisar separadamente seus tempos de ciclo e encontrar gargalos específicos. Onde obter Calculado examinando a tabela de itens BSEG para um determinado documento (BELNR). Se os itens contiverem mais de uma empresa (BSEG-BUKRS), o lançamento é considerado entre empresas. Captura Verificar se existem múltiplos valores únicos de BSEG-BUKRS para um único BKPF-BELNR. Tipo de evento calculated | |||
| Lançamento Manual Identificado | Esta atividade identifica se o lançamento foi criado via transação manual online ou via interface automatizada/processo batch. Não é uma ação do usuário, mas um atributo calculado derivado dos dados do sistema. | ||
| Por que é importante Distinguir entre lançamentos manuais e automáticos é a chave para melhorias focadas. Processos manuais costumam ser o alvo de iniciativas de padronização e automação. Onde obter Calculado analisando campos da BKPF. T-codes como 'FB01', 'FB50' ou 'FV50' indicam entrada manual, enquanto outros códigos ou nomes de batch input (BKPF-AWKEY) sugerem automação. Captura Derivar do BKPF-TCODE ou outros indicadores do sistema de origem no cabeçalho do documento. Tipo de evento calculated | |||
Guias de Extração
Etapas
- Criar o Programa ABAP: No SAP, acesse a transação SE38 (ABAP Editor). Insira um nome para o programa, como Z_PM_JE_EXTRACTION, e clique em Criar. Escolha um título adequado e defina o tipo como 'Programa Executável'.
- Definir a Tela de Seleção: No código-fonte, defina os parâmetros de seleção. Isso permitirá aos usuários filtrar por intervalo de datas de criação, empresas e tipos de documento, limitando o volume da extração.
- Declarar Estruturas de Dados: Defina a estrutura de uma tabela interna para o Event Log final. Ela deve conter campos obrigatórios: JournalEntryId, ActivityName, EventTime, SourceSystem, LastDataUpdate e atributos sugeridos como Usuário, Empresa e Data de Contabilização.
- Implementar Lógica de Seleção: Escreva as consultas SQL ABAP para extrair dados das 14 atividades necessárias. Isso envolve tabelas principais como BKPF e BSEG, tabelas de log de modificações CDHDR e CDPOS, tabelas de workflow como SWWLOGHIST e tabelas de compensação como BSAS e BSAK.
- Extrair Documentos Preliminares e Lançados: Para eventos de 'Lançamento Contábil Preliminar', selecione na BKPF onde o status (BSTAT) for 'V'. Para 'Criado' e 'Contabilizado', selecione na BKPF onde o status estiver em branco (documento normal).
- Extrair Eventos de Modificação e Exclusão: Consulte as tabelas CDHDR e CDPOS para a classe de objeto 'BELEG'. Filtre pela chave do documento para encontrar mudanças de 'Lançamento Corrigido' ou 'Lançamento Preliminar Excluído'.
- Extrair Eventos de Workflow: Para capturar 'Enviado', 'Aprovado', 'Rejeitado' e 'Mudanças Solicitadas', consulte as tabelas de workflow. Use a SWW_WI2OBJ para vincular o documento contábil à instância de workflow e leia a SWWLOGHIST para obter decisões de usuário ou mudanças de status.
- Identificar Eventos Calculados: Para 'Lançamento Manual Identificado', verifique o código da transação (BKPF-TCODE) contra uma lista de transações manuais conhecidas. Para 'Lançamento entre Empresas Identificado', analise se há múltiplos códigos de empresa nos itens da BSEG para um mesmo documento.
- Consolidar e Transformar Dados: Conforme seleciona cada atividade, transforme-a na estrutura final do Event Log. Concatene Empresa, Número do Documento e Exercício para criar o JournalEntryId. Converta as datas e horas do SAP em um timestamp EventTime único e anexe à tabela interna.
- Implementar Exportação de Arquivo: Use comandos ABAP como OPEN DATASET, LOOP AT, TRANSFER e CLOSE DATASET para gravar a tabela consolidada em um CSV ou arquivo flat no diretório do servidor SAP (visível via AL11).
- Agendar Job de Plano de Fundo: Use a transação SM36 para criar um job. Defina uma etapa que execute seu programa ABAP e agende para horários de baixa utilização para automatizar o processo.
- Baixar e Formatar o Arquivo: Use a transação CG3Y ou peça ao administrador para baixar o arquivo gerado no servidor. Verifique se a codificação e o formato estão corretos para o upload na ferramenta de Process Mining.
Configuração
- Intervalo de Datas: É fundamental definir um período para gerenciar a performance. Use a data de criação do documento (BKPF-CPUDT) como filtro principal. Para uma análise inicial, recomendamos de 3 a 6 meses. Para testes, use um intervalo de poucos dias que comprovadamente contenha dados.
- Filtro de Empresa: Filtre sempre pela empresa (BKPF-BUKRS). Extrair dados de todas as empresas de uma vez pode consumir muitos recursos. Comece com uma ou um pequeno grupo de empresas relevantes.
- Filtro de Tipo de Documento: Use o filtro de tipo de documento (BKPF-BLART) para restringir o escopo a tipos específicos de lançamentos contábeis, como 'SA' para documentos de Razão, caso não precise analisar todos os tipos.
- IDs de Tarefas de Workflow: A lógica para extrair eventos de workflow depende de IDs de tarefas específicos usados no seu sistema para aprovação, rejeição e envio. Esses IDs devem ser configurados no código-fonte do programa com base nas definições de workflow da sua empresa.
- Considerações de Desempenho: O programa une várias tabelas grandes, especialmente a CDPOS e as tabelas de histórico de workflow. Executá-lo em horário comercial pode impactar o sistema. Sempre agende como um job de plano de fundo (background job) para horários de menor movimento. Considere criar índices secundários se o desempenho for um problema recorrente.
- Pré-requisitos: Este método exige um usuário com autorizações de desenvolvimento ABAP (transação SE38) e permissões para criar e gerenciar jobs (transação SM36). O usuário ou o job também precisa de acesso de leitura a todas as tabelas financeiras, de workflow e de sistema relevantes (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST, etc.).
a Consulta de Exemplo abap
REPORT Z_PM_JE_EXTRACTION.
*&---------------------------------------------------------------------*
*& Data Structures for Final Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
journalentryid TYPE string,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
username TYPE uname,
companycode TYPE bukrs,
documenttype TYPE blart,
postingdate TYPE budat,
transactioncode TYPE tcode,
isreversed TYPE abap_bool,
END OF ty_event_log.
DATA: lt_final_log TYPE STANDARD TABLE OF ty_event_log.
DATA: ls_event TYPE ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen Parameters
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_blart FOR bkpf-blart,
s_cpudt FOR bkpf-cpudt OBLIGATORY.
PARAMETERS: p_sysid TYPE sy-sysid DEFAULT sy-sysid.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA(lv_last_update) = cl_abap_context_info=>get_system_timestamp( ).
" 1. Journal Entry Parked
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
'Journal Entry Parked' AS activityname,
a~cpudt, a~cputm,
a~usnam AS username,
a~bukrs AS companycode,
a~blart AS documenttype,
a~bldat AS postingdate,
a~tcode AS transactioncode
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~bstat = 'V' " Parked Document
INTO TABLE @DATA(lt_parked).
IF sy-subrc = 0.
LOOP AT lt_parked ASSIGNING FIELD-SYMBOL(<fs_parked>).
ls_event-journalentryid = <fs_parked>-journalentryid.
ls_event-activityname = <fs_parked>-activityname.
CONVERT DATE <fs_parked>-cpudt TIME <fs_parked>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_parked>-username.
ls_event-companycode = <fs_parked>-companycode.
ls_event-documenttype = <fs_parked>-documenttype.
ls_event-postingdate = <fs_parked>-postingdate.
ls_event-transactioncode = <fs_parked>-transactioncode.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 2. Journal Entry Created (directly posted, not parked first)
" 9. Journal Entry Posted
" These two events happen at the same time for a direct posting.
SELECT CONCAT( bukrs, belnr, gjahr ) AS journalentryid,
cpudt, cputm, usnam, bukrs, blart, budat, tcode, stblg
FROM bkpf
WHERE bukrs IN s_bukrs
AND blart IN s_blart
AND cpudt IN s_cpudt
AND bstat = '' " Normal, posted document
INTO TABLE @DATA(lt_posted).
IF sy-subrc = 0.
LOOP AT lt_posted ASSIGNING FIELD-SYMBOL(<fs_posted>).
" Activity: Journal Entry Created
ls_event-journalentryid = <fs_posted>-journalentryid.
ls_event-activityname = 'Journal Entry Created'.
CONVERT DATE <fs_posted>-cpudt TIME <fs_posted>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_posted>-usnam.
ls_event-companycode = <fs_posted>-bukrs.
ls_event-documenttype = <fs_posted>-blart.
ls_event-postingdate = <fs_posted>-budat.
ls_event-transactioncode = <fs_posted>-tcode.
ls_event-isreversed = COND #( WHEN <fs_posted>-stblg IS NOT INITIAL THEN abap_true ELSE abap_false ).
APPEND ls_event TO lt_final_log.
" Activity: Journal Entry Posted
ls_event-activityname = 'Journal Entry Posted'.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 3. Documentation Attached (via GOS)
SELECT a~instid_a, c~cr_timestamp
FROM srgbtbrel AS a
INNER JOIN sood AS b ON a~instid_b = b~objid
INNER JOIN socf AS c ON b~filid = c~filid
WHERE a~typeid_a = 'BKPF'
AND a~bukrs IN s_bukrs
INTO TABLE @DATA(lt_attachments).
IF sy-subrc = 0.
LOOP AT lt_attachments ASSIGNING FIELD-SYMBOL(<fs_attach>).
ls_event-journalentryid = |{ <fs_attach>-instid_a(4) }{ <fs_attach>-instid_a+4(10) }{ <fs_attach>-instid_a+14(4) }|.
ls_event-activityname = 'Documentation Attached'.
ls_event-eventtime = <fs_attach>-cr_timestamp.
" Other attributes may need to be looked up from BKPF if needed.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 4, 5, 6, 7, 8: Workflow events (Submitted, Changes Requested, Corrected, Approved, Rejected)
" This is a simplified example. Real logic depends on specific workflow templates.
SELECT a~instid, b~wi_cd, b~wi_ct, b~wi_aagent, b~wi_text
FROM sww_wi2obj AS a
INNER JOIN swwloghist AS b ON a~wi_id = b~wi_id
WHERE a~typeid = 'BKPF'
AND a~catid = 'BO'
AND a~bukrs IN s_bukrs
AND b~wi_cd BETWEEN s_cpudt-low AND s_cpudt-high
INTO TABLE @DATA(lt_workflow).
IF sy-subrc = 0.
LOOP AT lt_workflow ASSIGNING FIELD-SYMBOL(<fs_wf>).
ls_event-journalentryid = |{ <fs_wf>-instid(4) }{ <fs_wf>-instid+4(10) }{ <fs_wf>-instid+14(4) }|.
ls_event-activityname = CASE <fs_wf>-wi_text. " Simplified logic based on work item text
WHEN '[Placeholder for Submit Text]' THEN 'Journal Entry Submitted'
WHEN '[Placeholder for Approve Text]' THEN 'Journal Entry Approved'
WHEN '[Placeholder for Reject Text]' THEN 'Journal Entry Rejected'
WHEN '[Placeholder for Rework Text]' THEN 'Journal Entry Changes Requested'
ELSE ''
ENDCASE.
IF ls_event-activityname IS NOT INITIAL.
CONVERT DATE <fs_wf>-wi_cd TIME <fs_wf>-wi_ct INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_wf>-wi_aagent.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
ENDIF.
" 10. Manual Entry Identified & 11. Cross-Company Posting Identified
SELECT bukrs, belnr, gjahr, tcode FROM bkpf
WHERE bukrs IN s_bukrs AND blart IN s_blart AND cpudt IN s_cpudt
INTO TABLE @DATA(lt_calc_base).
LOOP AT lt_calc_base ASSIGNING FIELD-SYMBOL(<fs_calc>).
ls_event-journalentryid = |{ <fs_calc>-bukrs }{ <fs_calc>-belnr }{ <fs_calc>-gjahr }|.
" Check for manual entry T-Codes
IF <fs_calc>-tcode = 'FB01' OR <fs_calc>-tcode = 'F-02' OR <fs_calc>-tcode = 'FB50'.
ls_event-activityname = 'Manual Entry Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
" Check for cross-company posting
SELECT SINGLE bukrs FROM bseg WHERE belnr = <fs_calc>-belnr AND gjahr = <fs_calc>-gjahr AND bukrs <> <fs_calc>-bukrs INTO @DATA(lv_cross_bukrs).
IF sy-subrc = 0.
ls_event-activityname = 'Cross-Company Posting Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 12. Journal Entry Line Item Cleared
SELECT a~bukrs, a~belnr, a~gjahr, a~augdt, a~augbl
FROM bsas AS a " G/L Cleared Items
WHERE a~bukrs IN s_bukrs
AND a~budat IN s_cpudt
INTO TABLE @DATA(lt_cleared_gl).
IF sy-subrc = 0.
LOOP AT lt_cleared_gl ASSIGNING FIELD-SYMBOL(<fs_clr>).
ls_event-journalentryid = |{ <fs_clr>-bukrs }{ <fs_clr>-belnr }{ <fs_clr>-gjahr }|.
ls_event-activityname = 'Journal Entry Line Item Cleared'.
CONVERT DATE <fs_clr>-augdt INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
" User is often not directly available for clearing events
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 13. Parked Journal Entry Deleted & 6. Journal Entry Corrected
SELECT objectid, changenr, username, udate, utime FROM cdhdr
WHERE objectclas = 'BELEG'
AND udate IN s_cpudt
INTO TABLE @DATA(lt_cdhdr).
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
SELECT SINGLE tcode FROM cdpos WHERE changenr = <fs_cdhdr>-changenr AND fname = 'BSTAT' AND value_new = 'Z' INTO @DATA(lv_deleted_tcode).
ls_event-journalentryid = |{ <fs_cdhdr>-objectid(4) }{ <fs_cdhdr>-objectid+4(10) }{ <fs_cdhdr>-objectid+14(4) }|.
CONVERT DATE <fs_cdhdr>-udate TIME <fs_cdhdr>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_cdhdr>-username.
IF sy-subrc = 0.
ls_event-activityname = 'Parked Journal Entry Deleted'.
APPEND ls_event TO lt_final_log.
ELSE.
ls_event-activityname = 'Journal Entry Corrected'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 14. Journal Entry Reversal Processed
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
a~cpudt, a~cputm, a~usnam
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~stblg IS NOT NULL " Document is a reversal
INTO TABLE @DATA(lt_reversals).
IF sy-subrc = 0.
LOOP AT lt_reversals ASSIGNING FIELD-SYMBOL(<fs_rev>).
ls_event-journalentryid = <fs_rev>-journalentryid.
ls_event-activityname = 'Journal Entry Reversal Processed'.
CONVERT DATE <fs_rev>-cpudt TIME <fs_rev>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_rev>-usnam.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" Final step: Output to file
DATA(lv_filename) = |/tmp/je_extraction_{ sy-datum }_{ sy-uzeit }.csv|.
OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'JournalEntryId,ActivityName,EventTime,SourceSystem,LastDataUpdate,User,CompanyCode,DocumentType,PostingDate,TransactionCode,IsReversed'.
TRANSFER lv_header TO lv_filename.
LOOP AT lt_final_log INTO ls_event.
DATA(lv_line) = |"{ ls_event-journalentryid }","|
|{ ls_event-activityname }","|
|{ ls_event-eventtime }","|
|{ ls_event-sourcesystem }","|
|{ ls_event-lastdataupdate }","|
|{ ls_event-username }","|
|{ ls_event-companycode }","|
|{ ls_event-documenttype }","|
|{ ls_event-postingdate }","|
|{ ls_event-transactioncode }","|
|{ ls_event-isreversed }"|.
TRANSFER lv_line TO lv_filename.
ENDLOOP.
CLOSE DATASET lv_filename.
ENDIF. Etapas
- Estabelecer Conexão com o Banco: Obtenha credenciais de apenas leitura para o banco de dados do SAP ECC. Use um cliente SQL padrão (DBeaver, SAP HANA Studio ou SQL Server Management Studio) para se conectar.
- Preparar a Query SQL: Copie a query SQL completa fornecida na seção 'query' deste documento para o seu cliente SQL.
- Definir Parâmetros de Extração: Antes de executar, configure os espaços reservados (placeholders). Substitua
'[START_DATE]'e'[END_DATE]'pelo intervalo desejado no formato 'AAAAMMDD'. Substitua'[COMPANY_CODE_1]', '[COMPANY_CODE_2]'pelas empresas SAP que deseja analisar. - Definir Sistema de Origem: No comando
SELECTprincipal, substitua'[Your SAP System ID]'pelo ID real do sistema SAP (SID) para identificação correta da fonte. - Executar a Query: Execute a query SQL configurada. O tempo de execução dependerá do intervalo de datas e do tamanho das tabelas do banco de dados.
- Revisar Resultados Iniciais: Concluída a query, examine as linhas retornadas para garantir que os dados estão corretos. Verifique se as atividades foram capturadas e se campos como
JournalEntryIdeEventTimeestão preenchidos. - Tratar Timestamps: A query concatena campos de data e hora em uma string
AAAAMMDDHHMMSS. Certifique-se de que seu sistema de destino possa processar esse formato ou ajuste a funçãoCONCATpara o padrão ISO 8601 (AAAA-MM-DDTHH:MM:SS), se suportado. - Exportar os Dados: Exporte o resultado completo do cliente SQL para um arquivo CSV. Utilize a codificação UTF-8 para evitar problemas com caracteres especiais.
- Preparar para o Upload: Antes do upload, confirme se os cabeçalhos das colunas correspondem ao esquema exigido.
JournalEntryId,ActivityNameeEventTimesão fundamentais. Adicione a colunaLastDataUpdatecom o timestamp da extração. - Validação Final: Siga os passos na seção 'validationSteps' para garantir que os dados extraídos estejam completos e precisos antes de iniciar a análise.
Configuração
- Autorizações de Banco de Dados: O usuário do banco de dados precisa de acesso de leitura às seguintes tabelas do SAP: BKPF, BSEG, CDHDR, CDPOS, T001 e V_USERNAME. Para atividades relacionadas ao workflow, também é necessário acesso às tabelas SWW_WI2OBJ e SWWLOGHIST. Esse nível de acesso geralmente é concedido apenas a equipes técnicas especializadas.
- Filtragem por Intervalo de Datas: É fundamental filtrar os dados por um intervalo de datas específico para garantir o desempenho da consulta. A query fornecida utiliza espaços reservados (placeholders) para as datas de início e fim, que são aplicadas à data de criação do documento (
BKPF.CPUDT). Recomendamos um intervalo de 3 a 6 meses para uma análise inicial. - Filtragem por Entidade: Para gerenciar o volume de dados e focar a análise, filtre sempre por Empresa (Company Code -
BKPF.BUKRS). Considere também filtrar pelo Tipo de Documento (BKPF.BLART) para incluir apenas tipos de lançamentos contábeis relevantes, como 'SA' para documentos de Razão, excluindo documentos operacionais como faturas ou pagamentos se não estiverem no escopo. - Considerações de Desempenho: Consultas diretas em tabelas core como BSEG e CDPOS podem consumir muitos recursos. Recomendamos fortemente executar essa extração fora do horário de pico para não impactar o desempenho do sistema para os usuários. Evite extrair dados de mais de um ano em uma única execução.
- IDs de Tarefas de Workflow: A query contém placeholders como
'[WF_TASK_ID_SUBMIT]'e'[WF_TASK_ID_APPROVE]'. Eles devem ser substituídos pelos IDs de tarefa reais da configuração de workflow de lançamentos contábeis do seu sistema. Esses IDs podem ser identificados com um especialista em SAP Workflow ou analisando a definição técnica do workflow na transação PFTC.
a Consulta de Exemplo sql
WITH DOC_HEADERS AS (
SELECT
BUKRS,
BELNR,
GJAHR,
BLART,
BLDAT,
BUDAT,
CPUDT,
CPUTM,
USNAM,
TCODE,
BSTAT,
STBLG,
XRECH
FROM BKPF
WHERE CPUDT BETWEEN '[START_DATE]' AND '[END_DATE]'
AND BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]')
)
-- Event 1: Journal Entry Created (Directly Posted)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = '' OR H.BSTAT = 'U'
UNION ALL
-- Event 2: Journal Entry Parked
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = 'V'
UNION ALL
-- Event 3: Journal Entry Posted (from Parked state)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT <> 'V'
AND P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW <> 'V'
UNION ALL
-- Event 4: Parked Journal Entry Deleted
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Parked Journal Entry Deleted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND C.TCODE = 'FBV0'
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW = 'Z'
UNION ALL
-- Event 5: Journal Entry Reversal Processed
SELECT
CONCAT(H.BUKRS, H.STBLG, H.GJAHR) AS "JournalEntryId", -- Linking to the original document
'Journal Entry Reversal Processed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
TRUE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.STBLG IS NOT NULL AND H.STBLG <> ''
UNION ALL
-- Event 6: Journal Entry Line Item Cleared
SELECT
CONCAT(B.BUKRS, B.BELNR, B.GJAHR) AS "JournalEntryId",
'Journal Entry Line Item Cleared' AS "ActivityName",
TO_TIMESTAMP(B.AUGDT, 'YYYYMMDD') AS "EventTime", -- Clearing date used as event time
U.NAME_TEXT AS "User",
B.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode", -- Clearing transaction is in the clearing document header, complex to retrieve here
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM BSEG B
JOIN DOC_HEADERS H ON B.BUKRS = H.BUKRS AND B.BELNR = H.BELNR AND B.GJAHR = H.GJAHR
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE B.AUGBL IS NOT NULL AND B.AUGBL <> '' AND B.AUGDT <> '00000000'
UNION ALL
-- Event 7: Journal Entry Corrected (changes to a parked document)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT = 'V' AND C.TCODE IN ('FBV2', 'FBV4') -- FBV2 is change parked doc, FBV4 is change parked doc header
UNION ALL
-- Event 8: Documentation Attached (inferred from GOS attachment creation, requires configuration)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(CONCAT(REL.RECDATE, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SRGBTBREL REL ON REL.INSTID_A = CONCAT('BUS2081', H.BUKRS, H.BELNR, H.GJAHR) -- BUS2081 is object type for BKPF
LEFT JOIN V_USERNAME U ON REL.RECUNAM = U.BNAME
WHERE REL.TYPEID_A = 'BUS2081' AND REL.RELTYPE = 'ATTA'
UNION ALL
-- Events 9-13 from Workflow (Submitted, Changes Requested, Approved, Rejected) requires specific workflow config
-- This is a generic template. The WI_RH_TASK must be adapted to your system.
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
CASE
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_SUBMIT]' THEN 'Journal Entry Submitted'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_APPROVE]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Approved'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_REJECT]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Rejected'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_CHANGES_REQ]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Changes Requested'
ELSE NULL
END AS "ActivityName",
TO_TIMESTAMP(CONCAT(LOG.EVT_DATE, LOG.EVT_TIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SWW_WI2OBJ WIOBJ ON WIOBJ.INSTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND WIOBJ.TYPEID = 'BKPF'
JOIN SWWLOGHIST LOG ON WIOBJ.WI_ID = LOG.WI_ID
LEFT JOIN V_USERNAME U ON LOG.EXEC_USER = U.BNAME
WHERE LOG.WI_RH_TASK IN ('[WF_TASK_ID_SUBMIT]', '[WF_TASK_ID_APPROVE]', '[WF_TASK_ID_REJECT]', '[WF_TASK_ID_CHANGES_REQ]')
UNION ALL
-- Event 14: Manual Entry Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Manual Entry Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.TCODE IN ('FB01', 'F-02', 'FB50', 'F-04', 'F-22', 'F-43', 'FB60', 'FB70', 'FV50', 'FV60', 'FV70')
UNION ALL
-- Event 15: Cross-Company Posting Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Cross-Company Posting Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.XRECH = 'X' Etapas
- Configurar Conexão SAP: Na sua ferramenta de ETL, configure uma nova conexão de origem para o SAP ECC. Informe os detalhes do servidor, mandante, número do sistema e use um usuário SAP com autorizações RFC.
- Definir Fontes de Dados: Adicione as tabelas SAP necessárias ao projeto. As principais são: BKPF, BSEG, VBSEGK (cabeçalho de preliminares), CDHDR e CDPOS (modificações), SWW_WI2OBJ e SWWLOGHIST (workflow), e SRGBTBREL (anexos GOS).
- Extrair Eventos Iniciais (Criado e Preliminar): Crie o primeiro fluxo. Para 'Lançamento Preliminar', use a VBSEGK. Para 'Lançamento Criado', use a BKPF, filtrando documentos que não são estornos e não foram pré-editados (via anti-join com VBSEGK).
- Extrair Eventos de Workflow: Una a BKPF à SWW_WI2OBJ usando a chave do objeto (empresa + documento + exercício) para achar o ID do workflow. Una à SWWLOGHIST para extrair eventos como 'Enviado', 'Aprovado' e 'Rejeitado' com base nos logs.
- Extrair Modificações e Exclusões: Use CDHDR e CDPOS. Para 'Lançamento Corrigido', filtre modificações em documentos preliminares (Classe 'FIPP'). Para 'Lançamento Preliminar Excluído', procure marcadores de exclusão nos logs correspondentes.
- Extrair Eventos de Anexo: Para 'Documentação Anexada', una a BKPF à SRGBTBREL onde o tipo de objeto é 'BKPF'. A data de criação do link será o Event Time.
- Extrair Compensações e Estornos: Para 'Item de Lançamento Compensado', consulte a BSEG onde o campo AUGBL estiver preenchido. Para 'Estorno Processado', consulte na BKPF os documentos que possuem valor no campo de documento estornado (STBLG).
- Derivar Eventos Calculados: Crie blocos de lógica. Para 'Lançamento Manual', filtre BKPF por transações manuais (ex: FB01, F-02). Para 'Lançamento entre Empresas', agrupe a BSEG por ID de documento e identifique onde há mais de uma empresa.
- Combinar Fluxos de Eventos: Use uma transformação UNION no ETL para mesclar todos os fluxos individuais em um único Event Log. Garanta a consistência dos nomes de colunas e tipos de dados.
- Mapear para Esquema Final: Estruture os dados finais criando
JournalEntryId,ActivityName,EventTime, Usuário e outros atributos. Adicione colunas estáticas comoSourceSysteme use o tempo de execução paraLastDataUpdate. - Configurar Carga Incremental: Implemente uma estratégia delta. Use a última data de criação ou modificação (ex: BKPF.CPUDT, CDHDR.UDATE) como marcador para extrair apenas registros novos desde a última execução.
- Exportar para Análise: Agende o job de ETL e configure a saída final para salvar o Event Log em CSV ou Parquet em um local acessível para upload na plataforma.
Configuração
- Pré-requisitos: Uma ferramenta de ETL de terceiros licenciada (ex: Theobald Xtract Universal, Informatica, Talend) com um conector SAP dedicado. Uma conta de usuário SAP com acesso RFC e autorizações para ler tabelas financeiras (ex: S_TABU_DIS para grupos de tabelas F_00, F_WF), dados de workflow e logs de modificação.
- Parâmetros de Conexão: Você precisará do IP ou hostname do Servidor de Aplicação SAP, Número do Sistema e ID do Mandante (Client ID). Utilize uma gestão de credenciais segura para o usuário e senha do SAP.
- Filtros Principais: Aplique sempre filtros por Empresa (BKPF.BUKRS) e Exercício (BKPF.GJAHR) na origem para limitar o volume de dados. Recomendamos fortemente filtrar pela Data de Criação do Documento (BKPF.CPUDT) para definir um período de extração específico, por exemplo, os últimos 6 meses.
- Seleção do Intervalo de Datas: Para a carga inicial, selecione um período representativo de 3 a 6 meses. Para cargas delta subsequentes, utilize um marcador (watermark) em um campo de timestamp como
CPUDTpara buscar apenas novos registros. - Considerações de Desempenho: Joins nas tabelas BSEG, CDPOS e tabelas de workflow podem ser lentos. Certifique-se de que sua ferramenta de ETL envie os filtros diretamente para a fonte SAP (push down). Extraia os dados em pacotes menores se a ferramenta permitir, especialmente em cargas históricas volumosas.
- Customização do Workflow: A lógica para identificar atividades de workflow como 'Aprovado' ou 'Rejeitado' depende muito dos seus templates específicos. Você precisará identificar os IDs de tarefa de workflow e chaves de decisão de usuário corretos no seu sistema para aplicar nos filtros.
a Consulta de Exemplo config
/*
This is a logical representation of the extraction configuration in a third-party ETL tool.
It is not executable SQL but defines the sources, joins, and transformations for each activity.
Placeholders like [Your SAP Source], [Date Filter], and [Company Code Filter] must be configured in the tool.
*/
-- Extraction block for 'Journal Entry Parked'
SELECT
CONCAT(v.BUKRS, v.VBELN, v.GJAHR) AS JournalEntryId,
'Journal Entry Parked' AS ActivityName,
CAST(CONCAT(v.CPUDT, v.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
v.USNAM AS User,
v.BUKRS AS CompanyCode,
v.BLART AS DocumentType,
v.BUDAT AS PostingDate,
v.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].VBSEGK v
WHERE [Date Filter on v.CPUDT] AND [Company Code Filter on v.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Created'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Created' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
LEFT JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE h.BSTAT = '' AND v.VBELN IS NULL AND h.STBLG IS NULL
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Posted' (from parked)
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Posted' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Or a more precise posting time from change logs if available
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Submitted', 'Approved', 'Rejected', 'Changes Requested'
SELECT
CONCAT(SUBSTRING(o.INSTID, 3, 4), SUBSTRING(o.INSTID, 7, 10), SUBSTRING(o.INSTID, 17, 4)) AS JournalEntryId,
CASE
WHEN wl.WI_TEXT LIKE '%Submit%' THEN 'Journal Entry Submitted'
WHEN wl.WI_TEXT LIKE '%Approve%' THEN 'Journal Entry Approved'
WHEN wl.WI_TEXT LIKE '%Reject%' THEN 'Journal Entry Rejected'
WHEN wl.WI_TEXT LIKE '%Request Changes%' THEN 'Journal Entry Changes Requested'
END AS ActivityName,
CAST(CONCAT(wl.WI_CD, wl.WI_CT) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
wl.EXEC_USER AS User,
SUBSTRING(o.INSTID, 3, 4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SWW_WI2OBJ o
JOIN [Your SAP Source].SWWLOGHIST wl ON o.WI_ID = wl.WI_ID
WHERE o.TYPEID = 'BKPF' AND o.CATID = 'BO'
AND wl.WI_TEXT IN ('[Your Submit Task Name]', '[Your Approve Task Name]', '[Your Reject Task Name]', '[Your Changes Request Task Name]')
AND [Date Filter on wl.WI_CD]
UNION ALL
-- Extraction block for 'Journal Entry Corrected'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Journal Entry Corrected' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'U'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Parked Journal Entry Deleted'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Parked Journal Entry Deleted' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'D'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Documentation Attached'
SELECT
CONCAT(SUBSTRING(r.INSTID_A, 3, 4), SUBSTRING(r.INSTID_A, 7, 10), SUBSTRING(r.INSTID_A, 17, 4)) AS JournalEntryId,
'Documentation Attached' AS ActivityName,
-- Note: A precise timestamp is often unavailable. Using document creation time as a proxy.
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SRGBTBREL r
JOIN [Your SAP Source].BKPF h ON h.BUKRS = SUBSTRING(r.INSTID_A, 3, 4) AND h.BELNR = SUBSTRING(r.INSTID_A, 7, 10) AND h.GJAHR = SUBSTRING(r.INSTID_A, 17, 4)
WHERE r.TYPEID_A = 'BKPF' AND r.RELTYPE = '[Configure based on your system]'
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Reversal Processed'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Reversal Processed' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.STBLG IS NOT NULL AND h.STBLG <> ''
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Is Reversed' flag on original document
SELECT
CONCAT(h_orig.BUKRS, h_orig.BELNR, h_orig.GJAHR) AS JournalEntryId,
'Is Reversed' AS ActivityName, -- This is an attribute update, modeled as an event
CAST(CONCAT(h_rev.CPUDT, h_rev.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h_rev.USNAM AS User,
h_orig.BUKRS AS CompanyCode,
h_orig.BLART AS DocumentType,
h_orig.BUDAT AS PostingDate,
h_orig.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h_rev
JOIN [Your SAP Source].BKPF h_orig ON h_rev.STBLG = h_orig.BELNR AND h_rev.BUKRS = h_orig.BUKRS AND h_rev.GJAHR_S = h_orig.GJAHR
WHERE h_rev.STBLG IS NOT NULL AND h_rev.STBLG <> ''
AND [Date Filter on h_rev.CPUDT] AND [Company Code Filter on h_rev.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Line Item Cleared'
SELECT
CONCAT(i.BUKRS, i.BELNR, i.GJAHR) AS JournalEntryId,
'Journal Entry Line Item Cleared' AS ActivityName,
CAST(i.AUGDT AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
NULL AS User, -- User who performed clearing is on the clearing document header
i.BUKRS AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BSEG i
WHERE i.AUGBL IS NOT NULL AND i.AUGBL <> ''
AND [Date Filter on i.AUGDT] AND [Company Code Filter on i.BUKRS]
UNION ALL
-- Extraction block for 'Manual Entry Identified'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Manual Entry Identified' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.TCODE IN ('FB01', 'F-02', 'FB50', 'FV50', '[Add other manual T-Codes]')
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Cross-Company Posting Identified'
SELECT
JournalEntryId,
'Cross-Company Posting Identified' AS ActivityName,
EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
User,
CompanyCode,
DocumentType,
PostingDate,
TransactionCode,
IsReversed
FROM (
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed,
(SELECT COUNT(DISTINCT i.BUKRS) FROM [Your SAP Source].BSEG i WHERE i.BELNR = h.BELNR AND i.BUKRS = h.BUKRS AND i.GJAHR = h.GJAHR) as CompanyCodeCount
FROM [Your SAP Source].BKPF h
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
) AS CrossCompanyCheck
WHERE CompanyCodeCount > 1