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 coletar
- Atividades-chave a monitorizar
- Guia prático de extração
Atributos de Lançamento Contábil (R2R)
| Nome | Descrição | ||
|---|---|---|---|
| Atividade ActivityName | O nome da atividade de negócio ocorrida em um ponto específico do processo de lançamento. | ||
| Descrição A Atividade representa um passo ou evento específico no ciclo de vida de um lançamento, como 'Lançamento Criado', 'Lançamento Enviado para Revisão' ou 'Lançamento Efetivado'. Essas atividades costumam vir de logs de alteração, atualizações de status ou códigos de transação do sistema. Analisar as atividades permite visualizar o fluxo real, identificar caminhos comuns e descobrir desvios do procedimento padrão. É fundamental para calcular métricas como frequência de atividades, tempos de espera entre etapas e taxas de conformidade. Por que é importante Define as etapas do processo, permitindo a visualização de mapas de processos e a análise de padrões de workflow. Onde obter Derivado de várias fontes, incluindo campos de status em tabelas de cabeçalho/item (ex: BKPF-BSTAT), logs de documentos de modificação (CDHDR/CDPOS) e logs de workflow. Exemplos Lançamento Contábil CriadoLançamento Contábil em Espera (Parked)Lançamento Enviado para RevisãoLançamento Contábil AprovadoLançamento Contábil Efetivado | |||
| ID do Lançamento Contábil JournalEntryId | O identificador único de um lançamento contábil, que serve como ID do caso para o processo. | ||
| Descrição O ID do Lançamento Contábil é o número único atribuído a cada documento contábil ao ser criado no SAP S/4HANA. Ele é essencial para rastrear todo o ciclo de vida, desde a criação inicial ou espera (parking), passando pelos workflows de aprovação, até a efetivação final e possíveis estornos ou compensações. No process mining, este ID vincula todas as atividades relacionadas em um único caso. Ao agrupar eventos sob um ID comum, analistas podem reconstruir o fluxo de ponta a ponta, medir ciclos e identificar gargalos em cada transação financeira. É o atributo base para construir toda a visão do processo. Por que é importante Este identificador conecta todas as etapas relacionadas, permitindo analisar a jornada completa de cada lançamento. Onde obter Chave composta, formada pela união de Empresa (BKPF-BUKRS), Número do Documento (BKPF-BELNR) e Exercício (BKPF-GJAHR). Exemplos 1000-1000000001-20231710-1900000055-20242000-2100003412-2023 | |||
| Tempo do Evento EventTime | O timestamp que indica quando ocorreu uma atividade específica para o lançamento. | ||
| Descrição O Horário do Evento (Event Time) é a data e hora precisas em que uma atividade de negócio foi executada e registrada no sistema. Cada atividade em um caso possui seu próprio carimbo de data/hora, criando uma sequência cronológica de eventos. Este atributo é fundamental para todas as análises de processo baseadas em tempo. Ele é usado para calcular tempos de ciclo, durações entre atividades, tempos de espera e para entender a distribuição temporal do trabalho. Registros de data/hora precisos são essenciais para construir um modelo de processo confiável e calcular indicadores-chave de desempenho, como o Tempo do Ciclo de Aprovação. Por que é importante Fornece a ordem cronológica dos eventos, essencial para calcular todas as métricas baseadas em duração e entender a linha do tempo do processo. Onde obter Obtido de logs de alteração (CDHDR-UDATE, CDHDR-UTIME), logs de workflow ou timestamps de criação em tabelas como BKPF (CPUDT, CPUTM). Exemplos 2023-10-26T10:05:00Z2023-11-15T14:30:15Z2024-01-20T09:00:45Z | |||
| Código da Empresa CompanyCode | O identificador único da empresa ou entidade legal onde o lançamento foi realizado. | ||
| Descrição A Empresa (Company Code) é a unidade organizacional básica no SAP Financials, representando uma entidade legal independente para a qual são gerados demonstrativos financeiros. Todo lançamento contábil é atribuído a uma empresa específica. Este atributo é crítico para segmentar e comparar a performance do processo entre diferentes áreas da organização. Analistas podem usá-lo para filtrar a visão de uma entidade legal específica, comparar taxas de rejeição entre empresas ou identificar variações regionais no processo. Por que é importante Permite filtrar e comparar o processo de lançamento contábil em diferentes entidades legais ou unidades de negócio dentro da organização. Onde obter Tabela BKPF do SAP S/4HANA, campo BUKRS (Empresa). Exemplos 10001710US01 | |||
| Criado pelo Usuário CreatedByUser | O ID do usuário que criou o lançamento contábil. | ||
| Descrição Este atributo armazena o ID único do usuário que iniciou o lançamento, criando o documento inicial. Pode ser um contador, um usuário de negócio ou um ID de sistema em casos automáticos. Analisar pelo criador ajuda a identificar padrões de usuários ou equipes. Pode revelar necessidades de treinamento caso certos usuários tenham taxas de rejeição mais altas ou destacar os de melhor performance. É essencial para o dashboard de 'Atividade e Produtividade do Usuário'. Por que é importante Atribui atividades do processo a usuários específicos, permitindo análise de desempenho, equilíbrio de carga de trabalho e identificação de oportunidades de treinamento. Onde obter Tabela BKPF do SAP S/4HANA, campo USNAM (Nome do Usuário). Exemplos ABROWNCJONESBATCH_USER | |||
| Data de Lançamento PostingDate | A data em que o lançamento é registrado no Razão, impactando o período financeiro. | ||
| Descrição A Data de Lançamento (Posting Date) define o período fiscal em que a transação aparecerá nos demonstrativos. É uma data crítica e pode ser diferente da data em que o documento foi criado no sistema. No process mining, essa data é usada para análises de coorte, como comparar fechamentos mensais ou tendências de performance em diferentes períodos. Também serve para medir atrasos entre a criação do lançamento e sua efetivação financeira real. Por que é importante Crucial para o contexto financeiro, permite analisar o desempenho do processo dentro de períodos contábeis específicos, como o fechamento mensal ou anual. Onde obter Tabela BKPF do SAP S/4HANA, campo BUDAT (Data de Lançamento no Documento). Exemplos 2023-10-312023-11-012024-02-29 | |||
| Tipo de Lançamento Contábil JournalEntryType | Classifica o lançamento contábil com base em sua finalidade comercial, como um lançamento de ativo, fatura de fornecedor ou entrada no Razão. | ||
| Descrição O Tipo de Lançamento (ou Tipo de Documento no SAP) categoriza os documentos contábeis. Ele controla aspectos como o intervalo de numeração e quais tipos de conta podem ser usados. Analisar por tipo de lançamento é crucial para entender comportamentos específicos. Por exemplo, a aprovação de uma provisão simples (tipo SA) pode ser muito mais rápida que a de uma aquisição complexa de ativos (tipo AA). Esta dimensão é chave para o dashboard de 'Conformidade por Tipo de Lançamento'. Por que é importante Categoriza os lançamentos por contexto de negócio, permitindo a análise de variações de processo e desempenho para diferentes tipos de transações financeiras. Onde obter Tabela BKPF do SAP S/4HANA, campo BLART (Tipo de Documento). Exemplos SAKRAA | |||
| Valor em Moeda Local AmountInLocalCurrency | O valor total do lançamento contábil expresso na moeda local da empresa. | ||
| Descrição Este atributo representa o montante financeiro do lançamento. Geralmente é a soma dos valores absolutos de todos os débitos ou créditos do documento, convertida para a moeda local. Analisar por valor permite segmentar o processo pelo impacto financeiro. Lançamentos de alto valor podem exigir aprovações mais rigorosas. Isso ajuda a priorizar melhorias nas transações que representam o maior risco financeiro. Por que é importante Fornece o valor financeiro do lançamento, permitindo analisar como o comportamento do processo varia conforme o montante envolvido. Onde obter Calculado somando os valores da tabela de itens de linha BSEG (campo DMBTR) para um determinado lançamento contábil (BELNR) e convertendo para um valor positivo. Exemplos 1500.75125000.0050.20 | |||
| C digo de Transa o TransactionCode | O código de transação SAP usado para criar ou alterar o lançamento contábil. | ||
| Descrição O Código de Transação (T-Code) é o atalho que identifica uma função no SAP. Para lançamentos, diferentes T-Codes indicam como eles foram criados — ex: FB01 para lançamentos manuais no Razão, FV50 para pré-edição (parking) ou códigos automáticos para lançamentos do sistema. Este atributo indica se uma atividade foi manual ou automática. É essencial para calcular o KPI de Taxa de Lançamento Manual e identificar oportunidades de automação. Por que é importante Indica como um lançamento foi processado (ex: manual vs. automático), o que é fundamental para a análise de automação e para entender as variações do processo. Onde obter Tabela BKPF do SAP S/4HANA, campo TCODE (Código de Transação). Exemplos FB01FV50F-02 | |||
| É Lançamento Manual IsManualPosting | Um sinalizador booleano que indica se o lançamento contábil foi postado manualmente por um usuário. | ||
| Descrição Este atributo identifica lançamentos efetivados por intervenção manual, em vez de jobs automáticos ou interfaces. Geralmente é derivado do Código de Transação usado. Esta tag é usada para calcular a Taxa de Lançamento Manual e ajuda a acompanhar o progresso da automação no Record to Report. Ao filtrar lançamentos manuais, os analistas podem identificar cenários que ainda exigem toque humano e avaliar o potencial de automatizá-los. Por que é importante Diferencia entre lançamentos realizados por humanos e pelo sistema, o que é fundamental para medir níveis de automação e identificar oportunidades de melhoria. Onde obter Atributo calculado com base no TransactionCode. Uma lista prévia de códigos manuais (ex: 'FB01', 'F-02') define a flag como 'true'. Exemplos verdadeirofalse | |||
| É Retrabalho IsRework | Um sinalizador booleano indicando se o lançamento contábil passou por retrabalho, como ser corrigido após uma rejeição. | ||
| Descrição Este atributo calculado sinaliza lançamentos que se desviaram do caminho ideal ('happy path'). Geralmente é ativado se atividades como 'Lançamento Rejeitado' ou 'Lançamento Corrigido' ocorrerem. Essa tag simplifica a análise de eficiência, permitindo calcular rapidamente o KPI de Taxa de Retrabalho e comparar tempos e custos entre casos com e sem retrabalho. Identificar os motivos do retrabalho é um dos principais objetivos da melhoria de processos. Por que é importante Sinaliza casos que exigiram correção ou ciclos extras, permitindo a fácil quantificação e análise da causa raiz de ineficiências no processo. Onde obter Atributo calculado com base na sequência de atividades. É marcado como 'true' se houver algo como 'Lançamento Rejeitado' no caso. Exemplos verdadeirofalse | |||
| End Time EndTime | O timestamp que indica quando a atividade foi concluída. | ||
| Descrição O Horário de Término (End Time) marca a conclusão de uma atividade. Em muitos logs, o início e o fim são idênticos, representando um evento instantâneo. Mas para atividades com duração mensurável, como a revisão ativa de um documento, esse atributo captura esse intervalo. Ter um horário de término distinto permite calcular com precisão o tempo de processamento vs. tempo de espera. Ajuda a diferenciar quando uma tarefa estava sendo executada de quando estava parada em uma fila. Por que é importante Permite o cálculo de tempos precisos de processamento das atividades, separando o tempo de trabalho ativo do tempo de espera ocioso. Onde obter Geralmente igual ao StartTime em eventos atômicos. Para atividades com duração, pode vir de logs de workflow ou ser calculado com base em eventos seguintes. Exemplos 2023-10-26T10:05:00Z2023-11-15T14:45:20Z2024-01-20T09:10:30Z | |||
| Exercício FiscalYear | O exercício fiscal ao qual o lançamento contábil pertence. | ||
| Descrição O Exercício (Fiscal Year) faz parte da chave única de um lançamento, junto com a empresa e o número do documento. Representa o ano financeiro ao qual o documento se refere. Na análise, o exercício é usado para identificar tendências de longo prazo e garantir a unicidade do identificador do caso. Comparar métricas entre diferentes exercícios pode revelar melhorias ou quedas na performance ao longo do tempo. Por que é importante Componente essencial para a identificação única de documentos, permitindo análises comparativas de performance ano a ano. Onde obter Tabela BKPF do SAP S/4HANA, campo GJAHR (Exercício). Exemplos 202320242022 | |||
| Motivo do Estorno ReversalReason | Um código que indica o motivo pelo qual um lançamento contábil postado foi estornado. | ||
| Descrição Quando um lançamento efetivado está incorreto, ele deve ser estornado com um novo documento. O Código de Motivo de Estorno explica por que isso ocorreu (ex: data ou valor incorretos). Analisar esses motivos ajuda a identificar as causas raiz de erros no Record to Report. A alta frequência de um motivo específico pode sinalizar problemas sistêmicos, falta de treinamento ou falhas de controle que precisam ser resolvidas para garantir a qualidade logo no primeiro lançamento. Por que é importante Ajuda a diagnosticar a causa raiz dos erros que levam a estornos, fornecendo os insights necessários para reduzir o retrabalho e melhorar a qualidade do processo. Onde obter Tabela BKPF do SAP S/4HANA, campo STGRD (Motivo de Estorno). Exemplos 010205 | |||
| Sistema de Origem SourceSystem | Identifica o sistema de origem de onde os dados do lançamento contábil foram extraídos. | ||
| Descrição Este atributo especifica o sistema onde os dados do lançamento se originaram. Para empresas com várias instâncias de ERP ou sistemas legados, isso ajuda a diferenciar as fontes. Na análise, serve para comparar a performance entre sistemas ou filtrar dados de uma origem específica. É importante para a governança de dados e para garantir que o contexto seja compreendido. Por que é importante Fornece contexto sobre a origem dos dados, o que é crucial em ambientes de múltiplos sistemas para análises e comparações precisas. Onde obter Valor estático adicionado na extração, identificando a instância do SAP S/4HANA (ex: SID ou nome do sistema lógico). Exemplos S4H_PROD_100ECC_FIN_200S4C_US_EAST | |||
| Status do Documento DocumentStatus | O status atual do lançamento, como Parked (em espera), Efetivado ou Compensado. | ||
| Descrição O Status do Documento indica o estado do lançamento em seu ciclo de vida. Por exemplo, um documento 'parked' (em espera) está salvo mas não efetivado no Razão, enquanto um 'efetivado' está finalizado. Analisar o status ajuda a entender o fluxo de trabalho e identificar gargalos. Um volume alto de documentos parados em status 'parked' ou 'pendente de aprovação' por muito tempo sinaliza ineficiências. Também é uma fonte chave para derivar atividades do processo. Por que é importante Oferece um retrato de onde o lançamento está em seu ciclo de vida, ajudando a identificar filas e gargalos. Onde obter Tabela BKPF do SAP S/4HANA, campo BSTAT (Status do Documento). Exemplos VAB | |||
| Tempo de Ciclo de Aprovação ApprovalCycleTime | O tempo decorrido desde o envio do lançamento para aprovação até ele ser aprovado ou rejeitado. | ||
| Descrição Esta métrica foca na duração da etapa de aprovação. Mede o tempo entre o 'Lançamento Enviado para Revisão' e a subsequente aprovação ou rejeição. Este KPI é crítico para localizar gargalos no workflow. Tempos altos de aprovação atrasam todo o processo. Analisar essa métrica por aprovador, empresa ou tipo de lançamento revela onde os ajustes são mais necessários. Por que é importante Isola a duração da etapa de aprovação, ajudando a identificar e resolver gargalos no fluxo de revisão e aprovação. Onde obter Calculado encontrando a diferença de tempo entre o evento 'Lançamento Enviado para Revisão' e o evento 'Lançamento Aprovado' ou 'Lançamento Rejeitado'. Exemplos 1 dia e 2 horas4 horas e 25 minutos5 dias e 0 horas | |||
| Tempo de ciclo total TotalCycleTime | A duração total desde a criação da primeira atividade até a conclusão da última atividade de um lançamento. | ||
| Descrição Esta métrica mede a duração total do lançamento contábil em cada caso. É a diferença entre o timestamp da última atividade observada e o da primeira. O Cycle Time Total é o KPI principal para medir a eficiência geral. Oferece uma visão macro da performance e é usado para acompanhar tendências. Analisar as causas de ciclos longos é o ponto de partida comum para qualquer iniciativa de melhoria. Por que é importante Mede a duração total do processo de ponta a ponta, servindo como um KPI essencial para a velocidade e eficiência operacional. Onde obter Calculado subtraindo o EventTime mínimo do EventTime máximo para cada JournalEntryId exclusivo. Exemplos 2 dias 4 horas e 30 minutos8 horas e 15 minutos15 dias e 2 horas | |||
| Última Atualização de Dados LastDataUpdate | Timestamp indicando a última vez que os dados deste registro foram atualizados a partir do sistema de origem. | ||
| Descrição Este atributo registra a data e hora da extração ou atualização de dados mais recente do sistema de origem. Ele garante transparência sobre a atualidade da análise. Saber o horário da última atualização é fundamental para entender o contexto da análise. Ajuda os usuários a interpretarem dashboards e KPIs corretamente, sabendo se estão vendo dados em tempo real ou um retrato de um período anterior. Por que é importante Indica a atualização dos dados, garantindo que os usuários saibam quão recente é a análise. Onde obter Atributo de metadados, gerado e carimbado em cada registro durante o pipeline de ingestão de dados. Exemplos 2024-03-10T02:00:00Z2024-03-11T02:00:00Z12/03/2024 02:00:00 (UTC) | |||
| Usuário Aprovador ApproverUser | O ID do usuário que aprovou ou rejeitou o lançamento contábil. | ||
| Descrição Este atributo identifica o usuário responsável pela revisão e decisão do lançamento. Em workflows de múltiplos níveis, pode haver vários aprovadores para um único documento. Essa informação é essencial para detalhar o processo de aprovação. Ajuda a medir a carga de trabalho de cada aprovador, calcular tempos individuais e localizar gargalos na cadeia de aprovação, alimentando o dashboard de 'Atividade e Produtividade do Usuário'. Por que é importante Identifica o indivíduo responsável pela aprovação, permitindo a análise de cargas de trabalho, desempenho e gargalos de aprovação. Onde obter Obtido de logs de workflow (ex: SWW_WI2OBJ, SWWLOG) ou tabelas de alteração (CDHDR/CDPOS), rastreando quem executou a etapa de aprovação. Exemplos DMILLERFWHITEKCHEN | |||
Atividades de Lançamento Contábil (R2R)
| Atividade | Descrição | ||
|---|---|---|---|
| Estorno de Lançamento Processado | Um lançamento contábil postado anteriormente é estornado por meio da criação de um novo documento com lançamentos inversos. Essa ação é realizada para corrigir erros em documentos lançados e é uma transação explícita e auditável. | ||
| Por que é importante Estornos indicam que ocorreu um erro em um documento já efetivado. Uma taxa alta de estornos sugere problemas no processo de aprovação ou na qualidade da digitação; monitorar isso ajuda a melhorar a precisão logo na primeira tentativa. Onde obter O estorno é um evento explícito. O cabeçalho do novo documento de estorno (BKPF) contém uma referência ao original no campo 'Nº doc. estornado' (STBLG). A data de lançamento do novo documento é o horário do evento. Captura Identifique documentos onde o BKPF-STBLG esteja preenchido. O carimbo de data/hora do evento é a data de lançamento do documento de estorno. Tipo de evento explicit | |||
| Lançamento Contábil Aprovado | O lançamento contábil recebe a aprovação final de um gestor autorizado, confirmando sua validade. Esta atividade é a última etapa antes de o documento ser efetivado no Razão. | ||
| Por que é importante Um marco crítico que encerra o ciclo de aprovação. O tempo para chegar aqui é um dos maiores componentes da duração total e reflete a eficiência dos aprovadores. Onde obter Evento inferido pelo log de workflow na etapa final ou por mudança de status. O ID do aprovador e o timestamp vêm dos dados de workflow ou logs de alteração. Captura Identifique o carimbo de data/hora da etapa final de aprovação nos logs de workflow ou a alteração do status para 'Aprovado' nos documentos de modificação. Tipo de evento inferred | |||
| Lançamento Contábil Compensado | Um item em aberto dentro de um lançamento contábil é compensado por outra postagem, como um pagamento que compensa uma fatura. Esta atividade marca a conciliação de itens de linha específicos, encerrando-os efetivamente. | ||
| Por que é importante Esta atividade representa o passo final de reconciliação para muitos lançamentos, especialmente em contas de partidas abertas. Analisar o tempo da efetivação até a compensação mede a eficiência da reconciliação. Onde obter Evento inferido pela tabela de itens (BSEG ou visão ACDOCA). Quando um item é compensado, os campos de Data de Compensação (AUGDT) e Doc. de Compensação (AUGBL) são preenchidos. Captura Use a data de compensação (BSEG-AUGDT) do item de linha como timestamp do evento. Tipo de evento inferred | |||
| Lançamento Contábil Criado | Esta atividade marca a criação inicial do documento no sistema. O registro é criado na tabela de cabeçalho (BKPF), mas ainda não foi efetivado no Razão. É o ponto de partida do ciclo de vida. | ||
| Por que é importante O principal evento inicial do processo. Analisar o tempo daqui até a efetivação é crucial para medir o ciclo total e identificar atrasos na entrada de dados. Onde obter Este evento pode ser capturado na tabela BKPF do SAP usando os campos de data (CPUDT) e hora (CPUTM) de criação para um determinado número de documento (BELNR). Captura Use BKPF-CPUDT e BKPF-CPUTM para o timestamp do evento. Tipo de evento explicit | |||
| Lançamento Contábil Efetivado | O lançamento é registrado oficialmente no Razão, impactando os demonstrativos financeiros da empresa. É o momento em que o documento se torna um registro financeiro permanente. | ||
| Por que é importante O principal marco de sucesso, encerrando o ciclo central. Analisar o volume de lançamentos efetivados e o tempo para atingir esta etapa são métricas fundamentais. Onde obter Evento explícito marcado pela Data de Lançamento (BUDAT) na tabela BKPF. Um documento efetivado tem o status (BSTAT) em branco, diferindo dos 'Parked' ('V') ou retidos ('D'). Captura Use a Data de Lançamento (BKPF-BUDAT) e Data de Entrada (BKPF-CPUDT). BSTAT em branco indica documento efetivado. Tipo de evento explicit | |||
| Lançamento Enviado para Revisão | O criador do lançamento envia formalmente o documento para o workflow de revisão e aprovação. Esta atividade representa a passagem da entrada de dados para o processo de controle formal, iniciando o ciclo de aprovação. | ||
| Por que é importante Marca o início do ciclo de aprovação. Medir daqui até a decisão final isola gargalos específicos das etapas de revisão e aprovação. Onde obter Geralmente capturado de logs de workflow (tabelas SWW_WIHEAD, SWWLOG) vinculados ao objeto. Também pode vir de mudanças em campos de status personalizados no cabeçalho (BKPF). Captura Timestamp da criação do item de workflow ou mudança do status para 'Enviado' ou 'Em Revisão'. Tipo de evento inferred | |||
| Documentação de Suporte Anexada | Um usuário anexa um ou mais documentos de suporte, como faturas ou planilhas, ao lançamento contábil. Isso é feito geralmente para fornecer evidências e contexto para a transação financeira durante o processo de revisão e auditoria. | ||
| Por que é importante Garantir que a documentação seja anexada antes da revisão é fundamental para a conformidade e a eficiência da aprovação. Esta atividade ajuda a medir a adesão às políticas de documentação e seu impacto nos tempos do ciclo de aprovação. Onde obter Inferido pelo timestamp de criação de anexos via GOS. A tabela SRGBTBREL vincula o objeto de negócio (ex: documento BKPF) ao anexo. Captura Consulte as tabelas de anexo GOS (ex: SRGBTBREL) para links com o objeto BKPF e use o timestamp de criação do anexo. Tipo de evento inferred | |||
| Lançamento Contábil Alterado Após Postagem | Um usuário modifica um conjunto limitado de campos em um lançamento contábil após ele já ter sido postado no Razão. Embora a maioria dos dados financeiros seja imutável após o lançamento, alguns campos como texto ou atribuições podem ser alterados. | ||
| Por que é importante Esta atividade é um alerta crítico de conformidade. Alterações após a efetivação podem indicar tentativas de manipular registros e devem ser monitoradas para evitar fraudes. Onde obter Pode ser identificado com segurança pelas tabelas de log de alteração (CDHDR e CDPOS). Um registro em CDHDR com data posterior à efetivação indica uma mudança pós-lançamento. Captura Localize registros na CDHDR onde o carimbo de data/hora da alteração (UDATE/UTIME) seja posterior à data de lançamento do documento (BKPF-BUDAT). Tipo de evento inferred | |||
| Lançamento Contábil Corrigido | O usuário modifica um lançamento após ele ser rejeitado ou devolvido para ajustes. Isso representa o esforço de retrabalho para corrigir problemas antes do reenvio. | ||
| Por que é importante Esta atividade quantifica os loops de retrabalho. Analisar a frequência e duração das correções ajuda a localizar ineficiências e aponta necessidades de treinamento ou clareza processual. Onde obter Pode ser inferido rastreando a data de 'Última alteração' (AEDAT) na tabela BKPF para documentos que estavam com status 'Rejeitado'. Logs de alteração detalham exatamente o que foi mudado. Captura Use o timestamp dos cabeçalhos de alteração (CDHDR-UDATE) para mudanças feitas após uma rejeição. Tipo de evento inferred | |||
| Lançamento Contábil em Espera (Parked) | Um usuário salva um lançamento contábil incompleto sem postá-lo, permitindo a conclusão ou revisão posterior. Esta é uma ação explícita que cria um registro de cabeçalho de documento com status de 'pré-editado' (parked), mantendo-o em um estado não lançado. | ||
| Por que é importante O status 'Parked' (em espera) é uma etapa comum antes do envio. Monitorar essa duração ajuda a identificar atrasos na finalização e preparação dos dados antes do início formal da revisão. Onde obter Na tabela BKPF, um documento pré-editado (parked) é identificado pelo campo de status do documento (BSTAT) com o valor 'V'. O carimbo de data/hora do evento é a data de criação (CPUDT). Captura Filtre documentos onde BKPF-BSTAT = 'V' no momento da criação. Tipo de evento explicit | |||
| Lançamento Contábil Rejeitado | Um revisor ou aprovador recusa o lançamento contábil, impedindo sua postagem. O documento geralmente é devolvido ao criador para correção, iniciando um ciclo de retrabalho. | ||
| Por que é importante Monitorar rejeições é a chave para entender a qualidade do processo. Taxas altas indicam problemas na precisão dos dados, falta de clareza nas políticas ou documentação insuficiente. Onde obter Este evento é inferido por mudanças de status no log de workflow ou em campos personalizados. Logs de alteração (CDHDR/CDPOS) no campo de status fornecem o timestamp. Captura Identifique a alteração do campo de status para 'Rejeitado' via documentos de modificação (CDHDR/CDPOS) ou logs de workflow. Tipo de evento inferred | |||
| Lançamento Manual Identificado | O lançamento foi efetivado usando um código de transação manual, em vez de uma interface automatizada ou job em lote. Isso funciona como uma classificação da atividade, não um evento temporal. | ||
| Por que é importante Identificar lançamentos manuais é crucial para iniciativas de automação. Uma alta taxa de lançamentos manuais sugere oportunidades para simplificar processos integrando subsistemas ou usando programas de lançamento automatizados. Onde obter Calculado analisando o campo de transação (TCODE) na tabela BKPF. Uma lista de T-Codes manuais conhecidos (ex: FB01, F-02, FB50) classifica o lançamento. Captura Classifica o evento com base no BKPF-TCODE em relação a uma lista predefinida de códigos de transação manuais no momento do lançamento. Tipo de evento calculated | |||
Guias de Extração
Etapas
- Pré-requisitos e Acesso: Certifique-se de que possui um usuário com as autorizações necessárias para consultar o banco de dados subjacente do SAP S/4HANA ou executar relatórios ABAP. Você precisará de acesso de leitura às views CDS I_JournalEntry, I_JournalEntryItem e às tabelas CDHDR, CDPOS, SRGBREL, SOOD, SWW_WI2OBJ e SWWLOGHIST. O acesso geralmente é concedido por meio de um cliente de banco de dados como SAP HANA Studio, DBeaver ou usando o SAP ABAP Development Tools (ADT) para Eclipse.
- Identificar Configurações Específicas do Sistema: Antes de executar a consulta, você deve identificar os códigos de tarefa específicos usados no seu workflow de aprovação de lançamentos contábeis. Consulte seu administrador de workflow SAP para encontrar os IDs de tarefa (ex: TS12345678) que correspondem aos eventos de envio, rejeição e aprovação. Eles são necessários para os espaços reservados (placeholders) na consulta final.
- Preparar a Query SQL: Copie a consulta SQL completa fornecida na seção
querypara o seu cliente SQL ou ferramenta de desenvolvimento de preferência. - Definir Parâmetros da Query: Localize os placeholders dentro da consulta e substitua-os pelos seus valores específicos. Isso inclui definir os parâmetros
[YourCompanyCode],[StartDate]e[EndDate]. Você também deve substituir os IDs de tarefas de workflow ([Workflow Submitted Task ID],[Workflow Rejected Task ID],[Workflow Approved Task ID]) pelos valores identificados na etapa anterior. - Executar a Query de Extração: Execute a consulta SQL modificada no banco de dados SAP S/4HANA. Dependendo do intervalo de datas e do volume de dados, a consulta pode levar um tempo considerável. Recomendamos executá-la fora do horário de pico.
- Revisar os Resultados Iniciais: Assim que a consulta terminar, examine as primeiras linhas da saída para garantir que todas as colunas, como JournalEntryId, ActivityName e EventTime, estejam preenchidas conforme esperado. O conjunto de resultados deve conter uma linha para cada evento de negócio distinto no ciclo de vida do lançamento.
- Exportar Dados para CSV: Exportre todo o conjunto de resultados da sua ferramenta SQL para um único arquivo CSV. Certifique-se de que o arquivo use a codificação UTF-8 para evitar problemas com caracteres especiais.
- Preparar para o Upload: Antes de fazer o upload para uma ferramenta de Process Mining, confirme se o arquivo CSV possui os cabeçalhos necessários. Os dados já estão estruturados como um log de eventos, portanto, não deve ser necessária nenhuma transformação ou pivoteamento adicional.
Configuração
- Views de Core Data Services (CDS): A extração utiliza prioritariamente a
I_JournalEntrypara dados de cabeçalho e aI_JournalEntryItempara detalhes de itens de linha e valores. Essas views oferecem uma interface simplificada e rica em semântica para o diário universal (ACDOCA). - Tabelas de Suporte: Para capturar uma visão completa do processo, a consulta também faz o join de várias tabelas padrão do SAP:
CDHDReCDPOSpara rastrear alterações nos documentos.SRGBRELeSOODpara identificar quando anexos são vinculados via Generic Object Services (GOS).SWW_WI2OBJeSWWLOGHISTpara extrair eventos-chave do fluxo de aprovação.
- Filtragem por Intervalo de Datas: É fundamental filtrar os dados por um intervalo de datas específico para gerenciar a performance. Utilize o campo
I_JournalEntry.CreationDateTimena cláusulaWHERE. Recomendamos um intervalo de 3 a 6 meses para uma análise inicial. - Filtragem Organizacional: Filtre sempre por
CompanyCodepara limitar a extração às entidades legais relevantes. Consultar todos os códigos de empresa simultaneamente em um sistema de grande porte pode resultar em tempos de execução excessivamente longos. - IDs de Tarefas de Workflow: A consulta contém espaços reservados (placeholders) para IDs de tarefas de workflow (ex:
[Workflow Approved Task ID]). Eles são exclusivos para cada instalação SAP e devem ser configurados corretamente para que as atividades do workflow sejam extraídas. Sem isso, nenhum evento de envio, aprovação ou rejeição será capturado. - Pré-requisitos: O usuário executor precisa de amplas autorizações de leitura para tabelas financeiras, de sistema e de workflow. Essas permissões não são padrão e devem ser atribuídas especificamente.
a Consulta de Exemplo sql
WITH JournalEntryAmountCTE AS (
SELECT
CompanyCode,
AccountingDocument,
FiscalYear,
SUM(AmountInCompanyCodeCurrency) AS AmountInLocalCurrency
FROM I_JournalEntryItem
GROUP BY CompanyCode, AccountingDocument, FiscalYear
),
JournalEntryBaseCTE AS (
SELECT
JE.CompanyCode,
JE.AccountingDocument,
JE.FiscalYear,
JE.CreatedByUser,
JE.CreationDateTime,
JE.PostingDateTime,
JE.PostingDate,
JE.AccountingDocumentType,
JE.DocumentIsParked,
JE.ReversedJournalEntry,
JE.TransactionCode,
JEA.AmountInLocalCurrency
FROM I_JournalEntry AS JE
LEFT JOIN JournalEntryAmountCTE AS JEA
ON JE.CompanyCode = JEA.CompanyCode
AND JE.AccountingDocument = JEA.AccountingDocument
AND JE.FiscalYear = JEA.FiscalYear
WHERE JE.CompanyCode IN ('[YourCompanyCode]')
AND JE.CreationDateTime BETWEEN '[StartDate]' AND '[EndDate]'
)
-- 1. Journal Entry Created
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
UNION ALL
-- 2. Journal Entry Parked
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 3. Supporting Documentation Attached
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Supporting Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(SOOD.CREDAT || ' ' || SOOD.CRETIM, 'YYYYMMDD HH24MISS') AS "EventTime",
SOOD.OWNER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SRGBREL ON SRGBREL.INSTID_A = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND SRGBREL.TYPEID_A = 'BKPF'
AND SRGBREL.CATID_A = 'BO'
JOIN SOOD ON SOOD.OBJTP = SRGBREL.TYPEID_B
AND SOOD.OBJYR = SRGBREL.INSTID_B(3)
AND SOOD.OBJNO = SRGBREL.INSTID_B(5)
UNION ALL
-- 4. Journal Submitted For Review
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Submitted For Review' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Submitted Task ID]'
UNION ALL
-- 5. Journal Entry Rejected
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Rejected' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Rejected Task ID]'
UNION ALL
-- 6. Journal Entry Corrected (changed while parked)
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 7. Journal Entry Approved
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Approved' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Approved Task ID]'
UNION ALL
-- 8. Manual Posting Identified
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Manual Posting Identified' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL AND BJE.TransactionCode IN ('FB01', 'F-02', 'FB50', 'FV50', 'FBB1', 'FBV1')
UNION ALL
-- 9. Journal Entry Posted
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL
UNION ALL
-- 10. Journal Entry Changed After Posting
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Changed After Posting' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.PostingDateTime IS NOT NULL AND TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') > BJE.PostingDateTime
UNION ALL
-- 11. Journal Entry Cleared
SELECT
JEI.AccountingDocument AS "JournalEntryId",
'Journal Entry Cleared' AS "ActivityName",
MIN(JEI.ClearingDateTime) AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser", -- Note: Clearing user is not directly available here
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM I_JournalEntryItem AS JEI
JOIN JournalEntryBaseCTE AS BJE ON JEI.AccountingDocument = BJE.AccountingDocument
AND JEI.CompanyCode = BJE.CompanyCode
AND JEI.FiscalYear = BJE.FiscalYear
WHERE JEI.ClearingDateTime IS NOT NULL
GROUP BY JEI.AccountingDocument, BJE.CreatedByUser, BJE.CompanyCode, BJE.AccountingDocumentType, BJE.PostingDate, BJE.AmountInLocalCurrency
UNION ALL
-- 12. Journal Entry Reversal Processed
SELECT
OriginalDoc.AccountingDocument AS "JournalEntryId",
'Journal Entry Reversal Processed' AS "ActivityName",
ReversalDoc.PostingDateTime AS "EventTime",
ReversalDoc.CreatedByUser AS "CreatedByUser",
OriginalDoc.CompanyCode AS "CompanyCode",
OriginalDoc.AccountingDocumentType AS "JournalEntryType",
OriginalDoc.PostingDate AS "PostingDate",
OriginalDoc.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS ReversalDoc
JOIN JournalEntryBaseCTE AS OriginalDoc
ON ReversalDoc.ReversedJournalEntry = OriginalDoc.AccountingDocument
AND ReversalDoc.CompanyCode = OriginalDoc.CompanyCode
AND ReversalDoc.ReversalFiscalYear = OriginalDoc.FiscalYear
WHERE ReversalDoc.ReversedJournalEntry IS NOT NULL; Etapas
- Pré-requisitos e Acesso: Certifique-se de que possui um usuário com as autorizações necessárias para consultar o banco de dados subjacente do SAP S/4HANA ou executar relatórios ABAP. Você precisará de acesso de leitura às views CDS I_JournalEntry, I_JournalEntryItem e às tabelas CDHDR, CDPOS, SRGBREL, SOOD, SWW_WI2OBJ e SWWLOGHIST. O acesso geralmente é concedido por meio de um cliente de banco de dados como SAP HANA Studio, DBeaver ou usando o SAP ABAP Development Tools (ADT) para Eclipse.
- Identificar Configurações Específicas do Sistema: Antes de executar a consulta, você deve identificar os códigos de tarefa específicos usados no seu workflow de aprovação de lançamentos contábeis. Consulte seu administrador de workflow SAP para encontrar os IDs de tarefa (ex: TS12345678) que correspondem aos eventos de envio, rejeição e aprovação. Eles são necessários para os espaços reservados (placeholders) na consulta final.
- Preparar a Query SQL: Copie a consulta SQL completa fornecida na seção
querypara o seu cliente SQL ou ferramenta de desenvolvimento de preferência. - Definir Parâmetros da Query: Localize os placeholders dentro da consulta e substitua-os pelos seus valores específicos. Isso inclui definir os parâmetros
[YourCompanyCode],[StartDate]e[EndDate]. Você também deve substituir os IDs de tarefas de workflow ([Workflow Submitted Task ID],[Workflow Rejected Task ID],[Workflow Approved Task ID]) pelos valores identificados na etapa anterior. - Executar a Query de Extração: Execute a consulta SQL modificada no banco de dados SAP S/4HANA. Dependendo do intervalo de datas e do volume de dados, a consulta pode levar um tempo considerável. Recomendamos executá-la fora do horário de pico.
- Revisar os Resultados Iniciais: Assim que a consulta terminar, examine as primeiras linhas da saída para garantir que todas as colunas, como JournalEntryId, ActivityName e EventTime, estejam preenchidas conforme esperado. O conjunto de resultados deve conter uma linha para cada evento de negócio distinto no ciclo de vida do lançamento.
- Exportar Dados para CSV: Exportre todo o conjunto de resultados da sua ferramenta SQL para um único arquivo CSV. Certifique-se de que o arquivo use a codificação UTF-8 para evitar problemas com caracteres especiais.
- Preparar para o Upload: Antes de fazer o upload para uma ferramenta de Process Mining, confirme se o arquivo CSV possui os cabeçalhos necessários. Os dados já estão estruturados como um log de eventos, portanto, não deve ser necessária nenhuma transformação ou pivoteamento adicional.
Configuração
- Views de Core Data Services (CDS): A extração utiliza prioritariamente a
I_JournalEntrypara dados de cabeçalho e aI_JournalEntryItempara detalhes de itens de linha e valores. Essas views oferecem uma interface simplificada e rica em semântica para o diário universal (ACDOCA). - Tabelas de Suporte: Para capturar uma visão completa do processo, a consulta também faz o join de várias tabelas padrão do SAP:
CDHDReCDPOSpara rastrear alterações nos documentos.SRGBRELeSOODpara identificar quando anexos são vinculados via Generic Object Services (GOS).SWW_WI2OBJeSWWLOGHISTpara extrair eventos-chave do fluxo de aprovação.
- Filtragem por Intervalo de Datas: É fundamental filtrar os dados por um intervalo de datas específico para gerenciar a performance. Utilize o campo
I_JournalEntry.CreationDateTimena cláusulaWHERE. Recomendamos um intervalo de 3 a 6 meses para uma análise inicial. - Filtragem Organizacional: Filtre sempre por
CompanyCodepara limitar a extração às entidades legais relevantes. Consultar todos os códigos de empresa simultaneamente em um sistema de grande porte pode resultar em tempos de execução excessivamente longos. - IDs de Tarefas de Workflow: A consulta contém espaços reservados (placeholders) para IDs de tarefas de workflow (ex:
[Workflow Approved Task ID]). Eles são exclusivos para cada instalação SAP e devem ser configurados corretamente para que as atividades do workflow sejam extraídas. Sem isso, nenhum evento de envio, aprovação ou rejeição será capturado. - Pré-requisitos: O usuário executor precisa de amplas autorizações de leitura para tabelas financeiras, de sistema e de workflow. Essas permissões não são padrão e devem ser atribuídas especificamente.
a Consulta de Exemplo sql
WITH JournalEntryAmountCTE AS (
SELECT
CompanyCode,
AccountingDocument,
FiscalYear,
SUM(AmountInCompanyCodeCurrency) AS AmountInLocalCurrency
FROM I_JournalEntryItem
GROUP BY CompanyCode, AccountingDocument, FiscalYear
),
JournalEntryBaseCTE AS (
SELECT
JE.CompanyCode,
JE.AccountingDocument,
JE.FiscalYear,
JE.CreatedByUser,
JE.CreationDateTime,
JE.PostingDateTime,
JE.PostingDate,
JE.AccountingDocumentType,
JE.DocumentIsParked,
JE.ReversedJournalEntry,
JE.TransactionCode,
JEA.AmountInLocalCurrency
FROM I_JournalEntry AS JE
LEFT JOIN JournalEntryAmountCTE AS JEA
ON JE.CompanyCode = JEA.CompanyCode
AND JE.AccountingDocument = JEA.AccountingDocument
AND JE.FiscalYear = JEA.FiscalYear
WHERE JE.CompanyCode IN ('[YourCompanyCode]')
AND JE.CreationDateTime BETWEEN '[StartDate]' AND '[EndDate]'
)
-- 1. Journal Entry Created
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
UNION ALL
-- 2. Journal Entry Parked
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 3. Supporting Documentation Attached
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Supporting Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(SOOD.CREDAT || ' ' || SOOD.CRETIM, 'YYYYMMDD HH24MISS') AS "EventTime",
SOOD.OWNER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SRGBREL ON SRGBREL.INSTID_A = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND SRGBREL.TYPEID_A = 'BKPF'
AND SRGBREL.CATID_A = 'BO'
JOIN SOOD ON SOOD.OBJTP = SRGBREL.TYPEID_B
AND SOOD.OBJYR = SRGBREL.INSTID_B(3)
AND SOOD.OBJNO = SRGBREL.INSTID_B(5)
UNION ALL
-- 4. Journal Submitted For Review
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Submitted For Review' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Submitted Task ID]'
UNION ALL
-- 5. Journal Entry Rejected
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Rejected' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Rejected Task ID]'
UNION ALL
-- 6. Journal Entry Corrected (changed while parked)
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 7. Journal Entry Approved
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Approved' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Approved Task ID]'
UNION ALL
-- 8. Manual Posting Identified
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Manual Posting Identified' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL AND BJE.TransactionCode IN ('FB01', 'F-02', 'FB50', 'FV50', 'FBB1', 'FBV1')
UNION ALL
-- 9. Journal Entry Posted
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL
UNION ALL
-- 10. Journal Entry Changed After Posting
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Changed After Posting' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.PostingDateTime IS NOT NULL AND TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') > BJE.PostingDateTime
UNION ALL
-- 11. Journal Entry Cleared
SELECT
JEI.AccountingDocument AS "JournalEntryId",
'Journal Entry Cleared' AS "ActivityName",
MIN(JEI.ClearingDateTime) AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser", -- Note: Clearing user is not directly available here
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM I_JournalEntryItem AS JEI
JOIN JournalEntryBaseCTE AS BJE ON JEI.AccountingDocument = BJE.AccountingDocument
AND JEI.CompanyCode = BJE.CompanyCode
AND JEI.FiscalYear = BJE.FiscalYear
WHERE JEI.ClearingDateTime IS NOT NULL
GROUP BY JEI.AccountingDocument, BJE.CreatedByUser, BJE.CompanyCode, BJE.AccountingDocumentType, BJE.PostingDate, BJE.AmountInLocalCurrency
UNION ALL
-- 12. Journal Entry Reversal Processed
SELECT
OriginalDoc.AccountingDocument AS "JournalEntryId",
'Journal Entry Reversal Processed' AS "ActivityName",
ReversalDoc.PostingDateTime AS "EventTime",
ReversalDoc.CreatedByUser AS "CreatedByUser",
OriginalDoc.CompanyCode AS "CompanyCode",
OriginalDoc.AccountingDocumentType AS "JournalEntryType",
OriginalDoc.PostingDate AS "PostingDate",
OriginalDoc.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS ReversalDoc
JOIN JournalEntryBaseCTE AS OriginalDoc
ON ReversalDoc.ReversedJournalEntry = OriginalDoc.AccountingDocument
AND ReversalDoc.CompanyCode = OriginalDoc.CompanyCode
AND ReversalDoc.ReversalFiscalYear = OriginalDoc.FiscalYear
WHERE ReversalDoc.ReversedJournalEntry IS NOT NULL; Etapas
- Criar o Programa ABAP: Acesse o Editor ABAP através do código de transação
SE38. Insira um nome para o novo programa, por exemplo,Z_PM_JE_EXTRACT, e clique em 'Criar'. Informe um título adequado, defina o 'Tipo' como 'Programa Executável' e salve-o como um objeto local ou dentro de um pacote. - Definir a Tela de Seleção: No programa, defina parâmetros e select-options que permitam aos usuários filtrar os dados. Isso deve incluir um intervalo de datas para a data de criação do lançamento (
P_CPUDT_FR,P_CPUDT_TO), um select-option para o Código da Empresa (SO_BUKRS) e um caminho de arquivo para a saída no servidor de aplicação (P_FPATH). - Declarar Estruturas de Dados: Defina uma estrutura de tabela interna que corresponda ao formato de log de eventos exigido. Essa estrutura conterá a saída final. Além disso, declare tabelas internas e work areas para as tabelas SAP que você irá selecionar, como BKPF, ACDOCA, CDHDR, CDPOS e as diversas tabelas de workflow.
- Implementar a Lógica de Seleção de Dados: Escreva a lógica central em ABAP para recuperar os dados de cada uma das 12 atividades necessárias. Crie sub-rotinas (FORMs) separadas para cada atividade para manter o código organizado. Por exemplo, crie um FORM para
get_created_events,get_parked_events,get_workflow_events, etc. - Selecionar Eventos de 'Criação' e 'Lançamento': Leia a tabela BKPF com base nos critérios da tela de seleção do usuário. Uma entrada na BKPF significa criação. Um documento com status
BSTAT = ' 'é considerado lançado. Use o carimbo de data/hora de criação (CPUDT,CPUTM) como o horário do evento. - Selecionar Eventos de 'Pré-edição' (Parked): Leia a tabela VBKPF, que armazena os cabeçalhos de documentos pré-editados. O carimbo de data/hora de criação nesta tabela representa o evento de pré-edição.
- Selecionar Eventos de 'Workflow' (Enviado, Aprovado, Rejeitado): Consulte as tabelas de workflow como SWW_WI2OBJ (para vincular um objeto de lançamento contábil a uma instância de workflow) e SWWLOGHIST ou SWWIHEAD (para obter os detalhes e o tempo de etapas específicas). Você precisará identificar os IDs de tarefas de workflow específicos para envio, aprovação e rejeição no seu sistema.
- Selecionar Eventos de 'Alteração' e 'Correção': Consulte as tabelas de documentos de modificação CDHDR (cabeçalho) e CDPOS (item) para
OBJECTCLAS = 'BELEG'. Para 'Alterado após Lançamento', filtre as modificações onde o carimbo de data/hora da alteração é posterior à data de lançamento do documento. Para 'Corrigido', filtre as alterações em documentos pré-editados ou rejeitados. - Selecionar Eventos de 'Estorno' e 'Compensação': Identifique estornos localizando documentos onde o campo
STBLG(Nº documento estorno) na BKPF está preenchido. O horário do evento de estorno é o horário de criação do documento de estorno. Identifique os eventos de compensação selecionando a última data de compensação (AUGDT) da tabela ACDOCA para os itens de linha de um determinado lançamento. - Combinar e Classificar os Dados: À medida que os dados de cada atividade são selecionados, adicione os resultados na tabela interna mestre final. Após a conclusão de todas as seleções, classifique a tabela mestre por
JournalEntryIdeEventTimepara garantir a ordem cronológica de cada caso. - Gerar o Arquivo de Saída: Utilize as instruções
OPEN DATASET,LOOP AT... TRANSFEReCLOSE DATASETpara gravar o conteúdo da tabela interna final classificada no caminho de arquivo especificado no servidor de aplicação SAP. O arquivo deve estar no formato CSV com uma linha de cabeçalho. - Agendar a Execução: Para extrações regulares, utilize o código de transação
SM36para criar um job de segundo plano que execute o programaZ_PM_JE_EXTRACTem um cronograma definido, por exemplo, semanal ou mensalmente. Isso automatiza o processo de exportação de dados.
Configuração
- Intervalo de Datas: A tela de seleção deve ter um intervalo de datas obrigatório para a data de criação do lançamento contábil (
CPUDT). Recomendamos extrair os dados em blocos gerenciáveis, como 3 a 6 meses por vez, para garantir o bom desempenho do sistema. - Código da Empresa (
BUKRS): Este é um filtro crucial para limitar a extração às entidades legais específicas relevantes para a análise de Process Mining. Não recomendamos extrair dados de todos os códigos de empresa de uma só vez. - Tipo de Documento (
BLART): Você pode adicionar este filtro opcional para focar em tipos específicos de lançamentos, como 'SA' para lançamentos em conta do Razão ou 'KR' para faturas de fornecedores. Isso ajuda a reduzir o volume de dados e aumenta a relevância do conjunto de dados. - Caminho do Arquivo: O programa requer um caminho de arquivo lógico no servidor de aplicação SAP onde o arquivo de saída será gravado. Verifique se o caminho é válido e se o usuário do sistema SAP possui as autorizações de gravação necessárias para esse diretório. Utilize a transação
AL11para gerenciar e visualizar os diretórios do servidor. - IDs de Tarefas de Workflow: A lógica para extrair eventos de workflow (Enviado, Aprovado, Rejeitado) deve ser configurada com os IDs de tarefas específicos usados no fluxo de aprovação de lançamentos contábeis da sua organização. Geralmente, esses IDs são customizados e devem ser identificados por um consultor ou desenvolvedor de workflow.
- Pré-requisitos: O usuário ou conta de sistema que executa o programa precisa de autorizações de desenvolvedor para criar e executar programas ABAP (
S_DEVELOP) e acesso de leitura abrangente a tabelas financeiras (BKPF, ACDOCA), tabelas de log de modificações (CDHDR, CDPOS) e tabelas de workflow (SWW*).
a Consulta de Exemplo abap
REPORT Z_PM_JE_EXTRACT.
*&---------------------------------------------------------------------*
*&-- Data Structures for Event Log --*
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
journalentryid TYPE string,
activityname TYPE string,
eventtime TYPE string,
createdbyuser TYPE uname,
companycode TYPE bukrs,
journalentrytype TYPE blart,
postingdate TYPE budat,
amountinlocalcurrency TYPE wrbtr,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*&-- Selection Screen Definition --*
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_erdat_fr TYPE dats OBLIGATORY DEFAULT sy-datum-30,
p_erdat_to TYPE dats OBLIGATORY DEFAULT sy-datum.
SELECT-OPTIONS: so_bukrs FOR bkpf-bukrs OBLIGATORY.
PARAMETERS: p_fpath TYPE string OBLIGATORY DEFAULT '/usr/sap/trans/tmp/je_event_log.csv'.
SELECTION-SCREEN END OF BLOCK b1.
*&---------------------------------------------------------------------*
*&-- Internal Tables --*
*&---------------------------------------------------------------------*
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*&-- Main Processing Block --*
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_created_posted_events.
PERFORM get_parked_events.
PERFORM get_attachment_events.
PERFORM get_workflow_events.
PERFORM get_change_events.
PERFORM get_cleared_events.
PERFORM get_reversal_events.
SORT gt_event_log BY journalentryid eventtime.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*&-- Subroutines for Extracting Individual Activities --*
*&---------------------------------------------------------------------*
FORM get_created_posted_events.
DATA: lt_bkpf TYPE TABLE OF bkpf,
ls_event_log TYPE ty_event_log,
lv_timestamp TYPE string.
SELECT * FROM bkpf INTO TABLE lt_bkpf
WHERE bukrs IN so_bukrs
AND cpudt BETWEEN p_erdat_fr AND p_erdat_to.
LOOP AT lt_bkpf ASSIGNING FIELD-SYMBOL(<fs_bkpf>).
CLEAR ls_event_log.
CONCATENATE <fs_bkpf>-bukrs <fs_bkpf>-belnr <fs_bkpf>-gjahr INTO ls_event_log-journalentryid.
ls_event_log-companycode = <fs_bkpf>-bukrs.
ls_event_log-journalentrytype = <fs_bkpf>-blart.
ls_event_log-postingdate = <fs_bkpf>-budat.
ls_event_log-createdbyuser = <fs_bkpf>-usnam.
" Timestamp format YYYY-MM-DDTHH:MI:SS
CONCATENATE <fs_bkpf>-cpudt(4) '-' <fs_bkpf>-cpudt+4(2) '-' <fs_bkpf>-cpudt+6(2) 'T' <fs_bkpf>-cputm(2) ':' <fs_bkpf>-cputm+2(2) ':' <fs_bkpf>-cputm+4(2) INTO lv_timestamp.
ls_event_log-eventtime = lv_timestamp.
" Activity: Journal Entry Created
ls_event_log-activityname = 'Journal Entry Created'.
SELECT SUM( hsl ) INTO ls_event_log-amountinlocalcurrency FROM acdoca WHERE belnr = <fs_bkpf>-belnr AND gjahr = <fs_bkpf>-gjahr AND bukrs = <fs_bkpf>-bukrs.
APPEND ls_event_log TO gt_event_log.
" Activity: Journal Entry Posted (if not parked)
IF <fs_bkpf>-bstat = ' '.
ls_event_log-activityname = 'Journal Entry Posted'.
APPEND ls_event_log TO gt_event_log.
" Activity: Manual Posting Identified (based on T-Code)
CASE <fs_bkpf>-tcode.
WHEN 'FB01' OR 'F-02' OR 'FB50' OR 'F-22' OR 'F-43'.
ls_event_log-activityname = 'Manual Posting Identified'.
APPEND ls_event_log TO gt_event_log.
ENDCASE.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_parked_events.
DATA: ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM vbkpf
WHERE bukrs IN so_bukrs
AND cpudt BETWEEN p_erdat_fr AND p_erdat_to.
CLEAR ls_event_log.
CONCATENATE vbkpf-bukrs vbkpf-belnr vbkpf-gjahr INTO ls_event_log-journalentryid.
CONCATENATE vbkpf-cpudt(4) '-' vbkpf-cpudt+4(2) '-' vbkpf-cpudt+6(2) 'T' vbkpf-cputm(2) ':' vbkpf-cputm+2(2) ':' vbkpf-cputm+4(2) INTO lv_timestamp.
ls_event_log-activityname = 'Journal Entry Parked'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = vbkpf-usnam.
ls_event_log-companycode = vbkpf-bukrs.
ls_event_log-journalentrytype = vbkpf-blart.
ls_event_log-postingdate = vbkpf-budat.
APPEND ls_event_log TO gt_event_log.
ENDSELECT.
ENDFORM.
FORM get_attachment_events.
DATA: lt_bdocs TYPE TABLE OF srgbtbrel, ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM srgbtbrel INTO TABLE lt_bdocs
WHERE typeid_a = 'BUS2081' " Object type for Accounting Document
AND catid_a = 'BO'.
LOOP AT lt_bdocs ASSIGNING FIELD-SYMBOL(<fs_bdocs>).
CHECK <fs_bdocs>-instid_a(4) IN so_bukrs.
DATA(lv_bukrs) = <fs_bdocs>-instid_a(4).
DATA(lv_belnr) = <fs_bdocs>-instid_a+4(10).
DATA(lv_gjahr) = <fs_bdocs>-instid_a+14(4).
SELECT SINGLE cpudt, cputm, usnam, blart, budat FROM bkpf
INTO (DATA(lv_cpudt), DATA(lv_cputm), DATA(lv_usnam), DATA(lv_blart), DATA(lv_budat))
WHERE bukrs = lv_bukrs AND belnr = lv_belnr AND gjahr = lv_gjahr.
IF sy-subrc = 0 AND lv_cpudt BETWEEN p_erdat_fr AND p_erdat_to.
CLEAR ls_event_log.
CONCATENATE lv_bukrs lv_belnr lv_gjahr INTO ls_event_log-journalentryid.
" Note: Using document creation time as a proxy for attachment time.
CONCATENATE lv_cpudt(4) '-' lv_cpudt+4(2) '-' lv_cpudt+6(2) 'T' lv_cputm(2) ':' lv_cputm+2(2) ':' lv_cputm+4(2) INTO lv_timestamp.
ls_event_log-activityname = 'Supporting Documentation Attached'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = lv_usnam.
ls_event_log-companycode = lv_bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_workflow_events.
" This is a simplified example. Real workflow logic can be complex.
" You must identify your specific Task IDs for these events.
DATA: ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
DATA: BEGIN OF ls_wi, wi_id TYPE sww_wiid, cr_date TYPE sww_cd, cr_time TYPE sww_ct, task TYPE sww_task, instid TYPE swo_typeid, END OF ls_wi.
SELECT h~wi_id h~cr_date h~cr_time h~wi_rh_task o~instid
FROM swwwihead AS h
JOIN sww_wi2obj AS o ON h~wi_id = o~wi_id
INTO @ls_wi
WHERE o~typeid = 'BUS2081' AND o~catid = 'BO'
AND h~cr_date BETWEEN @p_erdat_fr AND @p_erdat_to.
DATA(lv_bukrs) = ls_wi-instid(4).
DATA(lv_belnr) = ls_wi-instid+4(10).
DATA(lv_gjahr) = ls_wi-instid+14(4).
IF lv_bukrs IN so_bukrs.
CLEAR ls_event_log.
CONCATENATE lv_bukrs lv_belnr lv_gjahr INTO ls_event_log-journalentryid.
CONCATENATE ls_wi-cr_date(4) '-' ls_wi-cr_date+4(2) '-' ls_wi-cr_date+6(2) 'T' ls_wi-cr_time(2) ':' ls_wi-cr_time+2(2) ':' ls_wi-cr_time+4(2) INTO lv_timestamp.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-companycode = lv_bukrs.
CASE ls_wi-task.
WHEN '[Your Submit Task ID]'. " e.g., TS20000139
ls_event_log-activityname = 'Journal Submitted For Review'.
APPEND ls_event_log TO gt_event_log.
WHEN '[Your Approve Task ID]'. " e.g., TS20000142
ls_event_log-activityname = 'Journal Entry Approved'.
APPEND ls_event_log TO gt_event_log.
WHEN '[Your Reject Task ID]'. " e.g., TS20000141
ls_event_log-activityname = 'Journal Entry Rejected'.
APPEND ls_event_log TO gt_event_log.
ENDCASE.
ENDIF.
ENDSELECT.
ENDFORM.
FORM get_change_events.
DATA: lt_cdhdr TYPE TABLE OF cdhdr, ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM cdhdr INTO TABLE lt_cdhdr
WHERE objectclas = 'BELEG'
AND udate BETWEEN p_erdat_fr AND p_erdat_to.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_bukrs) = <fs_cdhdr>-objectid(4).
DATA(lv_belnr) = <fs_cdhdr>-objectid+4(10).
DATA(lv_gjahr) = <fs_cdhdr>-objectid+14(4).
IF lv_bukrs IN so_bukrs.
SELECT SINGLE bstat, budat, blart FROM bkpf
INTO (DATA(lv_bstat), DATA(lv_budat), DATA(lv_blart))
WHERE bukrs = lv_bukrs AND belnr = lv_belnr AND gjahr = lv_gjahr.
IF sy-subrc = 0.
CLEAR ls_event_log.
CONCATENATE lv_bukrs lv_belnr lv_gjahr INTO ls_event_log-journalentryid.
CONCATENATE <fs_cdhdr>-udate(4) '-' <fs_cdhdr>-udate+4(2) '-' <fs_cdhdr>-udate+6(2) 'T' <fs_cdhdr>-utime(2) ':' <fs_cdhdr>-utime+2(2) ':' <fs_cdhdr>-utime+4(2) INTO lv_timestamp.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = <fs_cdhdr>-username.
ls_event_log-companycode = lv_bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
IF lv_bstat = ' ' AND <fs_cdhdr>-udate > lv_budat.
ls_event_log-activityname = 'Journal Entry Changed After Posting'.
APPEND ls_event_log TO gt_event_log.
ELSEIF lv_bstat <> ' '.
ls_event_log-activityname = 'Journal Entry Corrected'.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_cleared_events.
DATA: ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
DATA: BEGIN OF ls_clear, belnr TYPE belnr_d, gjahr TYPE gjahr, bukrs TYPE bukrs, augdt TYPE augdt, END OF ls_clear, lt_clear LIKE TABLE OF ls_clear.
SELECT belnr, gjahr, bukrs, MAX( augdt ) AS augdt FROM acdoca
INTO TABLE @lt_clear
WHERE bukrs IN @so_bukrs
AND augdt NE '00000000'
AND augdt BETWEEN @p_erdat_fr AND @p_erdat_to
GROUP BY belnr, gjahr, bukrs.
LOOP AT lt_clear INTO ls_clear.
SELECT SINGLE usnam, blart, budat FROM bkpf
INTO (DATA(lv_usnam), DATA(lv_blart), DATA(lv_budat))
WHERE bukrs = ls_clear-bukrs AND belnr = ls_clear-belnr AND gjahr = ls_clear-gjahr.
IF sy-subrc = 0.
CLEAR ls_event_log.
CONCATENATE ls_clear-bukrs ls_clear-belnr ls_clear-gjahr INTO ls_event_log-journalentryid.
CONCATENATE ls_clear-augdt(4) '-' ls_clear-augdt+4(2) '-' ls_clear-augdt+6(2) 'T12:00:00' INTO lv_timestamp. " Clearing date has no time, use midday
ls_event_log-activityname = 'Journal Entry Cleared'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = lv_usnam.
ls_event_log-companycode = ls_clear-bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_reversal_events.
DATA: lt_reversals TYPE TABLE OF bkpf, ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM bkpf INTO TABLE lt_reversals
WHERE bukrs IN so_bukrs
AND cpudt BETWEEN p_erdat_fr AND p_erdat_to
AND stblg IS NOT NULL.
LOOP AT lt_reversals ASSIGNING FIELD-SYMBOL(<fs_rev>).
SELECT SINGLE usnam, blart, budat FROM bkpf
INTO (DATA(lv_usnam), DATA(lv_blart), DATA(lv_budat))
WHERE bukrs = <fs_rev>-bukrs AND belnr = <fs_rev>-stblg AND gjahr = <fs_rev>-gjahr.
IF sy-subrc = 0.
CLEAR ls_event_log.
CONCATENATE <fs_rev>-bukrs <fs_rev>-stblg <fs_rev>-gjahr INTO ls_event_log-journalentryid.
CONCATENATE <fs_rev>-cpudt(4) '-' <fs_rev>-cpudt+4(2) '-' <fs_rev>-cpudt+6(2) 'T' <fs_rev>-cputm(2) ':' <fs_rev>-cputm+2(2) ':' <fs_rev>-cputm+4(2) INTO lv_timestamp.
ls_event_log-activityname = 'Journal Entry Reversal Processed'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = lv_usnam.
ls_event_log-companycode = <fs_rev>-bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
FORM write_output_file.
DATA: lv_line TYPE string.
FIELD-SYMBOLS: <fs_event_log> TYPE ty_event_log.
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc NE 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_line = 'JournalEntryId,ActivityName,EventTime,CreatedByUser,CompanyCode,JournalEntryType,PostingDate,AmountInLocalCurrency'.
TRANSFER lv_line TO p_fpath.
LOOP AT gt_event_log ASSIGNING <fs_event_log>.
CONCATENATE <fs_event_log>-journalentryid <fs_event_log>-activityname <fs_event_log>-eventtime <fs_event_log>-createdbyuser <fs_event_log>-companycode <fs_event_log>-journalentrytype <fs_event_log>-postingdate <fs_event_log>-amountinlocalcurrency
INTO lv_line SEPARATED BY ','.
TRANSFER lv_line TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: / 'File successfully written to', p_fpath.
ENDFORM.