Avalados por :

Dicas para otimizar a leitura eficiente da tabela BSEG em ABAP

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 13 Vistas
0
Cargando...

Olá comunidade,

Eu sei que a pergunta 'Como ler BSEG de forma eficiente' foi feita várias vezes aqui. Embora eu tenha encontrado algumas sugestões, ainda não consegui otimizar significativamente meu programa ABAP. É por isso que estou aqui em busca de novos conselhos. Aqui estão algumas boas respostas que encontrei:

"Como BSEG é uma tabela de cluster, a tabela BSEG consiste em dados das tabelas BSIS, BSAS, BSID, BSAD, BSIK e BSAK.

BSIS: Partidas em aberto de G/L

BSAS: Partidas fechadas de G/L

BSID: Partidas em aberto de clientes (Contas a receber)

BSAD: Partidas fechadas de clientes (Contas a receber)

BSIK: Partidas em aberto de fornecedores (Contas a pagar)

BSAK: Partidas fechadas de fornecedores (Contas a pagar)

É melhor recuperar dados das tabelas anteriores com base nos dados (fornecedor, cliente, conta de G/L). Caso contrário, podem surgir problemas de desempenho se BSEG for usado em produção e podem ocorrer erros em tempo de execução. Por favor, utilize as tabelas anteriores para evitar erros em tempo de execução na Produção." (Não, na verdade precisamos recuperar dados da tabela BSEG)

Outra sugestão:

"Em vez de selecionar de BSEG por vbel2 = 'xxx' e posn2 = 'yyy', eu deveria: a. obter uma lista de todas as chaves de BSEG que atendam à minha condição de pesquisa na tabela BSID: selecionar burks, belnr, gjahr, buzel de BSID onde vbel2 = 'xxx' e posn2 = 'yyy' b. selecionar todos os dados que preciso de BSEG usando suas chaves: selecionar * de BSEG onde burks = … e belnr = … e gjahr = .. e buzel = … Dado que BSID é uma tabela de banco de dados normal, posso definir um índice nas colunas vbel2, posn2, e como seleciono de BSEG por suas chaves (onde há um bom índice de banco de dados único), este trecho de código será executado bastante rápido." (usamos isso)

Alguns sugerem lê-lo como uma tabela ordenada (até mesmo uma tabela hash!)... Não consigo adicionar um índice lá porque é uma tabela de cluster -Eu sei que há uma nota que descreve como transformar essa tabela de cluster em uma transparente (para que você possa adicionar índices) mas isso não é recomendado e pode gerar muitos dumps de memória- e assim por diante...

Apesar de tudo, nosso programa continua demorando muito tempo. Fico pensando se têm outras soluções que possam otimizar o processo de consulta.

Muito obrigado!

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Olá Barbel,

Na verdade, a ideia de recuperar os dados em lotes fez uma grande diferença! Não segui os passos exatos que você descreveu, mas agora consigo carregar em 2 dias o que costumava levar uma semana.

Muito obrigado, você foi de grande ajuda.

Saudações

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Hasnae,

Aqui está o que fiz quando precisei selecionar uma grande quantidade de dados de BSEG:

  1. Selecionar dados relevantes de BKPF (ou outra tabela adequada para fornecer uma lista de chaves de BSEG necessárias) em uma tabela interna (itab1) que contenha apenas as chaves necessárias para a recuperação posterior de dados de BSEG
  2. Definir um parâmetro na tela de seleção para inserir um "tamanho de pacote", como por exemplo 1000
  3. Copiar o primeiro "pacote" em outra tabela interna (ADICIONAR LINHAS DE itab1 DE 1 A 1000 A itab2)
  4. Utilizar um loop DO
  5. Selecionar e processar dados de BSEG dentro do loop apenas para (por exemplo) 1000 entradas
  6. Determinar o índice de início e fim para o próximo pacote adicionando o valor do tamanho do pacote (certifique-se de estabelecer o valor de fim para o número máximo de linhas em itab1 se o valor calculado for maior que isso)
  7. Sair do loop se o índice de início for maior que o número máximo de linhas em itab1
  8. Copiar o próximo "pacote" de itab1 para itab2
  9. Selecionar o próximo "pacote" de BSEG

Fazer isso com "pacotes" faz sentido apenas se você realmente precisar processar muitos dados. Especificar o tamanho através da tela de seleção lhe dá a opção de testar a lógica com um número bastante baixo no desenvolvimento e depois aumentá-lo em QA ou PROD para ver quantas entradas podem ser processadas de uma vez e ainda assim ser eficientes.

Isenção de responsabilidade: Como não encontrei rapidamente um exemplo real do código que usei há algum tempo, a descrição pode não ser 100% completa. Você deve ter cuidado especial para não criar uma situação de loop infinito. No entanto, lembro que recuperar os dados em pacotes como descrito acima tornou surpreendentemente rápido recuperar dados de BSEG para um ano inteiro (se não mais).

Espero que isso ajude!

Saudações

Baerbel

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Vejo que você está com um desempenho deficiente no relatório. Dado que há muitas razões possíveis, certifique-se de que o relatório está demorando muito tempo na consulta da BSEG ao fazer esta pergunta.

Além disso, você pode fornecer mais detalhes sobre sua consulta atual, o tamanho da BSEG, que método você tentou anteriormente, se sua consulta melhorou seu desempenho então (mesmo que alguns microssegundos)?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Hasnae,

aqui está o que fiz quando precisei selecionar uma grande quantidade de dados de BSEG:

  1. Selecione dados relevantes de BKPF (ou outra tabela adequada para fornecer uma lista das chaves BSEG necessárias) em uma tabela interna (itab1) contendo apenas as chaves necessárias para a recuperação posterior dos dados BSEG
  2. Defina um parâmetro na tela de seleção para inserir um "tamanho de pacote", como por exemplo 1000
  3. Copie o primeiro "pacote" em outra tabela interna (APPEND LINES OF itab1 FROM 1 TO 1000 TO itab2)
  4. Utilize um loop DO
  5. Selecione e processe dados BSEG dentro do loop apenas para (por exemplo) 1000 entradas
  6. Determine o índice de início e fim para o próximo pacote adicionando o valor do tamanho do pacote (certifique-se de definir o valor de fim para o número máximo de linhas em itab1 se o valor calculado for maior que isso)
  7. Saia do loop se o índice de início for maior que o número máximo de linhas em itab1
  8. Copie o próximo "pacote" de itab1 para itab2
  9. Selecione o próximo "pacote" de BSEG

Fazer isso com "pacotes" faz sentido apenas se realmente precisar processar muitos dados. Especificar o tamanho através da tela de seleção lhe dá a opção de testar a lógica com um número bastante baixo no desenvolvimento e depois aumentá-lo em QA ou PROD para ver quantas entradas podem ser processadas de uma vez e ainda ser eficientes.

Isenção de responsabilidade: Como não encontrei rapidamente um exemplo real para o código que usei há algum tempo, a descrição pode não ser 100% completa. Você deve ter cuidado especial para não criar uma situação de loop infinito. No entanto, lembro que recuperar os dados em pacotes como descrito acima tornou surpreendentemente rápido recuperar os dados BSEG de um ano inteiro (se não mais).

Espero que isso ajude!

Saudações

Baerbel

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?