06 - Performance

Embed Size (px)

Citation preview

  • 7/13/2019 06 - Performance

    1/72

    ABAP Training

    1

    Performance

  • 7/13/2019 06 - Performance

    2/72

    ABAP Training

    2

    Objetivo

    Troca de informaes sobre os pontos mais comuns no mercado de programaoABAP que tem causado problemas graves de performance (clientes e parceiros)

    Recomendaes SAP Demonstrar alguns casos verdicos Demonstrar estatsticas sobre o uso de algumas tcnicas de converso (Batch-Input,

    Call Transaction, Direct Input)

    1. A rqui t et ura Cl i ent -Serv er

    O R/3 trabalha com uma filosofia de cliente/servidor de 3 nveis:

    Database server : responsvel pelo acesso e pela atualizao dos dadosApplication server : responsvel pelo processamento da aplicao (tempo

    despendido com a interpretao de comandos ABAP)Frontend : responsvel pelo processamento dos grficos (tempo

    despendido pelo sistema R/3, ou seja, o middleware eKernel). Kernel = conjunto de programas utilitrios queexiste dentro do R/3, servindo ao cumprimento deinmeras tarefas

    A alocao dos servidores de aplicao definida automaticamente no momento delogon ( checado qual servidor est menos sobrecarregado).

    Dica: Para se obter uma otimizao da performance em programas ABAP, deve-seminimizar o tempo de acesso ao database.

  • 7/13/2019 06 - Performance

    3/72

    ABAP Training

    3

    2. Grandes v i les no que se refere performance

    Ninhos de select Select . Endselect ao invs de comandos que recuperem do banco de dados todos

    os registros de uma nica vez Select * ao invs de select com as colunas necessrias ao processamento Select single sem chave completa especificada ao invs de Select up to 1 row Selects genricos, ou seja, onde a clusula where no foi fortemente especificada,

    com vrias condies, visando restringir a seleo ndices no utilizados Falta de ndices Select em tabelas com alto nmero de registros utilizando clusula where baseada

    em tela de seleo onde o preenchimento no obrigatrio Definio funcional falha Grandes tabelas do sistema: BKPF, BSEG, EKKO, EKPO, VBAK, VBAB, MKPF,

    MSEG, J_1BNFDOC, J_1BNFLIN Funes genricas, como por exemplo CLAF_CLASSIFICATION_OF_OBJECTS

  • 7/13/2019 06 - Performance

    4/72

    ABAP Training

    4

    2.1. Comunicao entre o Application Server e Database Server - Transmisso depacotes

    Premissa:VBAK contm 1000 registros, sendo que cada registro contm 575 bytes.

    Fato:A comunicao entre o DB server e o Application server acontece em pacotes de 32.000bytes, dependendo da rede e equipamentos de comunicao utilizados.

    Select * from VBAK.

    Portanto:1000 registros x 575 bytes = 575.000 bytes575.000 bytes / 32.000 = 20 pacotes20 pacotes: na verdade este nmero um pouco mais alto (mais ou menos 24), uma vezque informaes administrativas so transferidas em cada transmisso, juntamente comos dados.O exemplo acima tenta ilustrar que, se forem selecionadas apenas as colunasnecessrias, a transferncia de dados ser menor e, consequentemente, haver umareduo significativa no tempo de resposta.

    2.2. Select e Logical Database

    Get VBAKGet VBAK fields vbeln auart bname kunnr

    O segundo comando muito melhor que o primeiro. Porm, nem todos os logicaldatabase suportam select em colunas. Para verificar se isso possvel, acesse atransao SE36, coloque o nome do database no qual se deseja efetuar uma pesquisa eescolha a opo: extras -> field selection.

  • 7/13/2019 06 - Performance

    5/72

    ABAP Training

    5

    2.3. Cursor Caching

    Os seguintes comandos SQL produzem o mesmo resultado, mas cada um deles requerseu prprio cursor uma vez que os comandos no so idnticos (verifique a ordem dascolunas aps a palavra Select e na clusula WHERE):

    Select vbeln auart into (vbak-vbeln, vbak-auart) from vbakwhere vbeln = nnn and auart = yyyy

    Select vbeln auart into (vbak-vbeln, vbak-auart) from vbakwhere auart = yyyy and vbeln = nnn

    Select auart vbeln into (vbak-auart, vbak- vbeln) from vbakwhere vbeln = nnn and auart = yyyy

    Select auart vbeln into (vbak-auart, vbak- vbeln) from vbakwhere auart = yyyy and vbeln = nnn

    Desnecessrios comandos Declare e Prepare podem ser evitados se os comandos SQLso mantidos consistentes nos programas que esto sendo desenvolvidos (quando seusar select com colunas ou declarando condies WHERE sempre use a sequncia de

    campos conforme definido no Data Dictionary)

  • 7/13/2019 06 - Performance

    6/72

    ABAP Training

    6

    2.4. Logical database e Tables statementsReport ZACCENTURE.

    Tables: vbak, vbkd, vbpa.

    Get vbak fields vbeln auart bname kunnr.Write: vbak-vbeln, vbak-auart, . .

    Get vbpa fields parvw kunnr.Write: vbpa-parvw, vbpa-kunnr, vbkd-zterm.

    Ao invs use:

    Get vbak fields vbeln auart bname kunnr.Write: vbak-vbeln, vbak-auart, . .

    Get vbkd field zterm.

    Get vbpa fields parvw kunnr.Write: vbpa-parvw, vbpa-kunnr, vbkd-zterm.

    OBS.: A estrutura do logical database VAV (utilizado anteriormente) VBAK VBUK VBKD VBPA.

    Se uma tabela no especificada via um carto TABLES ento o sistemaautomaticamente recupera somente os campos chave para aquela tabela (aqui VBUKno est presente no carto tables, assim somente os campos chaves so recuperadospelo sistema).

    Se uma tabela especificada via TABLES, todas as colunas so recuperadas, mesmo senenhum campo daquela tabela usado no programa (veja a tabela VBKD somente o

    campo ZTERM deveria ser impresso).

    Para evitar ter todas as colunas selecionadas da tabela, insira um comando GET paraaquela tabela, especificando os campos que sero utilizados pelo programaposteriormente.

  • 7/13/2019 06 - Performance

    7/72

    ABAP Training

    7

    2.5. Select exit versus Select . Up to 1 rows.

    Vantagem em performance:Select exit. Endselect. = 150.000 msSelect up to 1 rows = 1.500 ms

    2.6. Check inside Select endselect.

    Comparao de Runtime baseada numa varredura de 57.000 registros na VBAK

    Select & Check = 27.958.000 ms

    Select com clusula WHERE = 3.065.000 ms

    Em caso de condies de checagens muito complexas poderia ser mais rpido obterdados do banco de dados primeiramente. SQL Trace precisa ser usado para verificarqual mtodo o mais rpido.

    Isso tambm vlido para select single.

    2.7. Selects em campos sem ndices

    Select-options: bname_so for vbak-bname.Select vbeln bname . Into (vbak-vbeln ) from vbak

    Where bname in bname_so order by descending.

    Endselect.

    O sistema standard distribudo sem um ndice para o campo bname. A seleo acimair resultar numa varredura sequencial da tabela vbak. Isto no aceitvel num sistemaem produo. Criando um ndice na tabela vbak para o campo bname ir resolver oproblema neste caso. Exceo: tabelas cuja buferizao full ou generic (neste caso no

    tem sentido pois o primeiro acesso ir trazer todos os dados para a memria. Dasprximas vezes, o sistema busca do buffer e no do database at que o dado mudenovamente).

  • 7/13/2019 06 - Performance

    8/72

    ABAP Training

    8

    2.8. Select sum, avg, min, max versus ABAP calculations

    Select matnr kwmeng meins into From vbap where . .Collect .

    Endselect.

    Ao invs use:Select matnr sum( kwmeng ) meins into table

    From vbap where .Group by matnr meins.

    O ganho em performance para o processamento de 10.000 registros:

    Select + collect = 2.370.000 msSelect sum . Into table = 1.574.000 msOBS.: o group by no pode ser usado para tabelas pool e cluster.

    2.9. Select sem clusula where

    Select col1 col2 . Into . from vbak.Perform calculate_stuff.

    Endselect.

    Um select sem clusula WHERE idnica um erro no design do programa, especialmentese o select usado em tabelas SAP com grande crescimento/tamanho em pouco tempo,em geral, BKPF, BSEG, COBK, COEP, LIPK, LIPS, MKPF, MSEG, VBAK, VBAP, VBPA,VBFA.

    Programas iro rodar de forma correta e bem na entrada em produo, todavia aperformance ir decrescer medida que dados so adicionados diariamente.

    2.10.Table buffering

    Para analisar a buferizao de tabelas use funo de chamadas estatsticas: Transaction

    ST02 -> details analysis menu -> call statistics (tables). Esta funo ajuda voc adeterminar se tabelas desenvolvidas pelo cliente so buferizadas corretamente.

    Para analisar a qualidade da buferizao de tabelas use a transao ST02, d duplo clickem TABLES (generic key) e clique no pushbutton buffered objects.

    Por que buferizar ?

  • 7/13/2019 06 - Performance

    9/72

    ABAP Training

    9

    Usando buferizao pode-se reduzir consideravelmente o tempo que se leva pararecuperar um registro.

    Tipos de buferizao:

    a) full: resident buffer (100 %): o contedo de toda a tabela carregado no buffer noprimeiro acesso realizado na tabela

    b) generic: uma chave genrica (primeiros n campo chaves) especificado quandoda criao da tabela, quando se mantm technical settings. Esta chave genricadivide o contedo da tabela em chamadas reas genricas. Quando acessandoqualquer dado com uma deteminada/especificada chave genrica, toda a reagenrica carregada no buffer.

    c) Partial (single record): somente registros nicos so lidos do banco de dados e

    armazenados no buffer.

    Quando bufferizar uma tabela ?

    Uma tabela deveria ser buferizada quando: Menor em tamanho (poucas linhas ou poucas colunas com tamanho de campos

    pequenos) acessada muito mais para leitura alteraes no ocorrem frequentemente

    Tabelas que so boas candidatas a buferizao: tabelas de controle/tabelas de customizao small master data tables (ex.: 100 material master recores -> few changes)

    Como buferizar uma tabela ?

    a) Como ativar/desativar uma buferizao: dictionary maintenance (SE11 -> technical settings) technical settings for a table (transaction SE13)

    a) Decidindo sobre o tipo de buferizao: full (resident = 100 %) generic (with number of key fields for the generic key) single records (partial buffering)

  • 7/13/2019 06 - Performance

    10/72

    ABAP Training

    10

    Comandos SQL bypassing a buferizao:

    select bypassing buffer select from database views (projection views are ok) select distinct select count, sum, avg, min, max select order by (outros alm da chave primria) select for update Clusula where contm o comando IS NULL Comandos natives do SQL (EXEC SQL ENDEXEC) Evite esses commandos

    quando estiver trabalhando com tabelas buferizadas!!!

    3. Outros responsveis pela degradao da performance

  • 7/13/2019 06 - Performance

    11/72

    ABAP Training

    11

    Move corresponding interessante para pequenas tabelas ou quando alguns

    campos (mas no todos) precisam ser movimentados. No use sort - appends. Ele consome muito tempo de CPU e os resultados so

    frequentemente imprevisveis. Sempre especifique ASCENDING ou DESCENDING em processamentos com

    SORT. Qualificar todos os comados SORT atravs da clusula BY melhora a performance e a leitura do cdigo, evitando assim que todos os camposdo registro sofram classificao

    Use COMPUTE ao invs de ADD, SUB, MULTI, DIV desde que performance noseja um grande problema. O comando COMPUTE mais fcil de implementar ecom ele a leitura do programa se torna mais fcil. A diferena em performance minuto, todavia se o objetivo conseguir tempo de resposta de subsegundos paratransaes complexas, ento deve-se usar comandos separados

    Quando da definio de uma tabela no dicionrio de dados do R/3 os campos chavesempre devem ser colocados nas primeiras posies do registro da tabela(primeiras colunas). O banco de dados comprime os dados para todos os campos databela, mas a compresso no ocorre para campos chave. A compresso tambm s possvel para as colunas aps o ltimo campo chave: isso explica o porque deagrupar todos os campos chaves nas primeiras posies

    Transparent e Pool Tables: sempre que for feito um select para buscar dados detabelas deste tipo pode-se qualificar a clusula WHERE com campos chave e nochave, ou seja, quanto mais condies puderem ser definidas, melhor para a

    obteno de performance. Isto permite que o banco de dados avalie os registros eretorne somente aqueles que combinem com o critrio de seleo definido Cluster table: ocorre exatamente o inverso: devido a forma de armazenamento

    destas tabelas, na clusula WHERE deve constar apenas os campos chaves e osdemais campos devem ser checados atravs do comando CHECK. O banco dedados no consegue processar cluster tables como ele processa transparent tables.Forando o banco de dados a descompactar e checar campos (em caso de Select comcampos no chaves na clusula WHERE) menos eficiente, na maioria dos casos,que qualificando somente com campos chaves e deixando o CHECK para os camposno chave aps eles terem sido retornados. Na verdade ambos modos irofuncionar, porm um deles ser ineficiente pois ir requerer grande parte damemria disponvel, espao em buffer e tempo do banco de dados paradescompactar campos no chave, o que certamente ir refletir em performance. Emalgumas tabelas Cluster, mesmo a seleo com restries atravs das chavesprimrias torna-se lenta, compensando, nestes casos, a seleo da tabela inteira ejogando-a para uma tabela interna e a partir desta fazer as restries.

  • 7/13/2019 06 - Performance

    12/72

    ABAP Training

    12

    Campos que sero comparados na clusula WHERE devem ter atributos similares.Se isso no ocorre, o sistema tem que converter o dado toda vez que a comparao

    feita. Quando isso no possvel, mova o dado a ser comparado para uma rea

    auxiliar, antes de efetuar a comparao (esta rea auxiliar deve ser definida com omesmo tipo e tamanho da coluna da tabela)

    Evitar classificaes em vrias tabelas e, posteriormente, a realizao de loops. Ouseja, evitar construes do tipo SORT tab1, SORT tab2, , e depois o LOOP tab1,LOOP tab2 . . Isso funciona, porm ir requerer mais memria e recursos parapossuir todos os dados resultantes da classificao at que eles sejam usados. Aocontrrio, quando se faz SORT seguido de LOOP, o espao liberado ao trmino doloop

  • 7/13/2019 06 - Performance

    13/72

    ABAP Training

    13

    4. Quando usar i nternal tabl e ou Di ct i onary st ructure

    Para tabelas que so usadas repetidamente ou por vrios programas, considere apossibilidade de criar estruturas de dados no Data Dictionary (e abr-las atravs docomando TABLES) ao invs de defin-las dentro de programas individuais (atravs docomando DATA . ENDDATA).

    Sobre estas circunstncias, o uso de tabela interna atravs do Data Dictionary prefervel:

    a tabela interna grande a tabela acessada da mesma forma toda vez a mesma tabela interna usada em vrios programas o programa ir processar vrias tabelas internas ao mesmo tempo (e ento precisa

    de muita memria) o uso de memria um ponto chave para otimizao de um programa em particular

    Use o comando FREE para liberar memria alocada a tabelas internas. Este comandodeve seguir o ltimo comando para processamento do dado na tabela.

    Use o comando FREE sob as seguintes condies: a tabela interna grande a tabela interna classificada e reprocessada vrias vezes o programa est processando vrias tabelas internas (e portanto necessita de grande

    quantidade de memria) o uso de memria importante para um programa em particular ser otimizado: um

    LOOP AT . WHERE prefervel a um LOOP AT CHECK ENDLOOPporque estar sendo reduzido o nmero de comandos a serem interpretados

  • 7/13/2019 06 - Performance

    14/72

    ABAP Training

    14

    5. Processament o de grandes tabelas

    5.1. Quando estiverem sendo manipuladas grandes tabelas muito importante que sejaprocessada a maior quantidade possvel de informao num primeiro momento e, sepossvel, eliminar qualquer outra passagem nesta mesma tabela. Muitas vezes issorequer o uso de tabelas internas. Cada situao deve ser analisada e avalidada, paraver qual o procedimento correto a ser tomado: se armazenar o dado ou fazer novoacesso tabela do Data Dictionary. Considere as seguintes questes:

    qual o tamanho da tabela original comparado ao subset que seria armazenado emuma tabela interna ?

    quanto espao para armazenamento seria necessrio para armazenar o dado emuma taela interna ?

    Se o processamento precisar ocorrer somente uma vez (por exemplo, armazenar algunsdados para posterior comparao), esteja certo que isso acontecer for a de umaestrutura em forma de looping (por exemplo, Select, Loop, Do), de forma que oprocessamento no seja repetido desnecessariamente.

    Dica: o operador IN consome muito tempo de mquina e no deveria ser usado em

    lugar do operador EQ .

  • 7/13/2019 06 - Performance

    15/72

    ABAP Training

    15

    5.2. Expresses lgicas so avaliadas da esquerda para a direita. A avaliao terminaquando o resultado final foi estabelecido (eliminao ou incluso completa). Todavia,quando se utiliza os operadores AND ou OR (por exemplo, em IF, WHERE) o critriode eliminao mais comum deve ocorrer primeiramente.

    Exemplo:A seguinte tabela deve ser lida, imprimindo-se os empregados da companhia ABC naGeorgia

    EMPLOYEE NAME COMPANY STATE001 Doe, Jr. ABC TX

    002 Doe, M. ABC OK003 Jones, A. XYZ TX004 Jones, B. ABC GA005 Jones, C. ABC TX006 Jones, D. XYZ GA007 Jones, E. ABC TX008 Smith, A. ABC GA009 Smith, B. ABC TX010 Smith, C. ABC OK

    if company = ABC andstate = GAwrite ..

    endif.isto funciona, mas tanto os campos company quanto state precisam ser avaliados para oito de

    dez campos

    if state = GA andcompany = ABCwrite ..

    endif.

    isto necessita menos tempo para ser processado, porque ele elimina todos os registros sem state= GA e portanto tanto o campo company quanto state precisam ser avaliados para somente trsregistros.

  • 7/13/2019 06 - Performance

    16/72

    ABAP Training

    16

    5.3. ndices secundrios:

    sempre esteja certo que o seu ndice est sendo usado: A well-defined and properly implemented index is one of the best performanceand tuning tool available. Because of the diversity of various database systems,however, and in particular various database optimizers, it is not possible toestablish any hard-and-fast rules for creating and using database index.Additionally, it is impossible to guarantee that the database optimizers will useyour index .Para saber se o ndice definido est sendo usado:* use o SQL Trace (transao ST05) para ativar e desativar o trace

    * clique em trace on* execute a transao em questo em uma outra sesso* retorne a ST05 e clique em trace off* clique em list trace para visualizar os resultados de seu trace* clique em prepare, open ou reopen para selecionar o comando SQL que

    ser avaliado* clique em EXPLAIN para obter o resultado do comando SQL

  • 7/13/2019 06 - Performance

    17/72

    ABAP Training

    17

    5.4. Regras gerais para criao e uso de ndices secundrios:

    5.4.1. Um ndice suporta pesquisa a dados no banco de dados. Todas as tabelasstandard SAP possuem um ndice primrio, o qual consiste de campos chaves que ousurio define quando da criao de uma tabela. Para os selects aonde a chave primriano pode ser utilizada na clusula WHERE, ou quando selects no so qualificados, obanco de dados pesquisa a tabela inteira (executa uma varredura sequencial).

    O Dicionrio de Dados da SAP suporta at 16 ndices para cada tabela.Geralmente, crie ndices com menos que 5 campos.

    Geralmente, se uma condio inclui OR, o otimizador pra o processamento (e chamauma varredura sequencial) to logo o primeiro OR seja encontrado. A exceo possvel um OR que prope uma condio separada e nica para avaliao.

    Exemplo:ZTABLE definida com um ndice secundrio:

    FIELD NAME TYPE LENGTHFieldC Char 3FieldF Char 2

    Select * from ztable wherefieldc = ABC and(fieldf = 12 or 13)

    isto executado, mas no usa o ndice conforme esperado

    Select * from ztable where(fieldc = ABC and fieldf = 12) or(fieldc = ABC and fieldf = 13)

    isto executado usando o ndice

  • 7/13/2019 06 - Performance

    18/72

    ABAP Training

    18

    5.4.2. Informaes gerais: Clusulas IN so frequentemente interpretadas como condies OR e podem gerar

    alguns problemas ndices no so usados para condies IS (NOT) NULL A maior parte dos otimizadores tem problemas com condies OR, NEQ e LIKE

    Exemplo:ZTABLE definida com um ndice secundrio

    FIELD NAME TYPE LENGTH

    FieldA Char 3FieldB Char 3FieldC Char 2FieldD Char 4

    Select * from ztableWhere fieldA = ABC and

    field B = XYZ andfieldC = 12.

    isto funciona bem.

    Select * from ztableWhere fieldA = ABC andfield B = XYZ andfieldD = DEFG.

    isto no usa o ndice conforme esperado e provavelmente invoca uma varredurasequencial da tabela baseada na chave primria

  • 7/13/2019 06 - Performance

    19/72

    ABAP Training

    19

    5.4.3. Considere a criao de um ndice se um ou mais condies se aplicarem:

    campos no chave so repetidamente usados para fazer selees somente uma pequena parte de uma grande tabela selecionada (< 5%) a clusula WHERE de um comando SELECT simples os campos que compe o ndice reduzem significativamente o conjunto de registros

    em uma clusula WHERE

    5.4.4. No crie ndices se uma das seguintes condies se aplicar:

    a redundncia de dados de armazenamento do ndice cria problemas devido aotamanho da tabela ou ndice

    atualizaes constantes criam excessivo overhead ou perda de performance durantea atualizao do ndice

    manuteno de um ndice (como a reorganizao) causa perda dos benefcios esto sendo usados campos cujos valores para a maioria dos registros na tabela um

    valor inicial ou tem um valor que idntico para a maioria dos registros

  • 7/13/2019 06 - Performance

    20/72

    ABAP Training

    20

    6. Concei t o de at ual i zao em updat e t ask

    Para aproveitar ao mximo os recursos computacionais de cada nvel, a SAP criou umconceito de atualizao em update task. Se for feita uma pesquisa em todos osprogramas "on-line" da SAP, ser verificado que a atualizao sempre em funesque s fazem o update, e que no retornam valores nem mesmo exceptions se estasocorrerem. (CALL FUNCTION .... IN UPDATE TASK).

    Logo todas as aplicaes fazem todas as checagens possveis e imaginveis antes dechamarem estas funes, ou seja, as exceptions que podem ocorrer so somentes as deBD (por exemplo table space, ou algo no previsto). Se uma aplicao faz "n"atualizaes, esta ir chamar "n" funes (uma para cada update de um conjunto detabelas) e, ao final, dar um commit work. O que o R/3 faz simplesmente ir criandotodos estes dados em uma espcie de log. No momento do commit work ele cria umaoutra LUW (Logical Unit of Work) no servidor de BD e passa esta tarefa para este. Noteque o programa (que esta sendo processado no servidor de aplicao), no ficaesperando a resposta se o update ocorreu corretamente ou no, ele continua oprocessamento e termina a transao muitas vezes antes do servidor de DB terterminado o processamento.

    A vantagem bvia deste processo a diminuio de gargalos via este "tratamento de

    mensagens" entre as duas camadas (DB e aplicao).

    Quando se utiliza o comando SET UPDATE TASK LOCAL o servidor de aplicaopassa a executar o update (ou seja, no criado uma outra LUW no servidor de DB) eeste fica esperando a resposta se tudo ocorreu OK.

    Um SET UPDATE TASK LOCAL suficiente para todo o processamento do commitser efetuado como local. Por isso, todos os updates da SAP procuram no utilizar ocomando Set update task local. O default o SET UPDATE (em funes). Isso evita quea performance seja degradada.

  • 7/13/2019 06 - Performance

    21/72

    ABAP Training

    21

    7. Comandos Sel ectVisando garantir a performance e evitar problemas futuros, cuidado com os comandosempregados. Existem alguns tipos de select mais eficientes que outros. Analise aaplicao que ser desenvolvida e faa a melhor escolha.

    ALGUNS TIPOS DE SELECT

    7.1. SELECT FROM INTO TABLE .A estrutura da tabela interna deve corresponder estrutura da tabela que est sendoacessada. O sistema l os registros em conjunto, no individualmente, e os colocadentro de uma internal table. Este processo mais rpido que ler individualmenteatravs de um LOOP e ir gravando os registros, um a um.

    7.2. SELECT * FROM APPENDING TABLE .L os registros e os inclui - no sobrepe - em uma internal table.

    7.3. SELECT . INTO CORRESPONDING FIELDS OF TABLE .Neste caso a estrutura da tabela interna no precisa corresponder estrutura da tabelaque est sendo acessada. o nome da internal table. Movimentar os registros

    para as colunas definidas na internal table que possuam nome igual ao da tabelaacessada).Obs.:corresponding ou appending corresponding no exigem o endselect.

    7.4. SELECT .. APPENDING CORRESPONDING FIELDS OF TABLE .L e grava (no sobrepe) os dados em uma internal table que possua nomes idnticosaos nomes da tabela que est sendo lida.

    7.5. SELECT SINGLE * FROM SPFLI WHERE .... EQ Toda vez que se usa select single * a chave primria completa deve ser especificada. Sea chave especificada no qualificada, voc receber uma mensagem de warning e a

    performance ficar prejudicada.No caso de haver a necessidade de acessar um nico registro via select, as opes so:select * .. seguido de comando exit OU select * up to 1 rows. Neste caso no necessrio especificar a chave completa.

  • 7/13/2019 06 - Performance

    22/72

    ABAP Training

    22

    7.6. SELECT * FROM

    Quando no se impe nenhum tipo de restrio, ocorre uma varredura sequencial dosregistros da tabela. Quando se utiliza grandes tabelas, isso obviamente afeta o runtime.

    Select * seleciona todas as colunas de uma tabela. melhor sempre especificar ascolunas, pois em caso de tabelas com muitas colunas, prejudicar performance.

    7.7. SELECT * FROM WHERE eq .L todos os registros da tabela especificada onde o campo igual ao contedoespecificado. O ideal que se qualifique a clusula WHERE tanto mais quanto sejapossvel. Atentar que isso vlido para tabelas do tipo Pool e Transparent. ParaCluster, seguir as recomendaes dadas anteriormente.

    7.8. SELECT INTO (, , ) FROM .WHERE .

    L as colunas especificadas (a1, a2). Aps INTO devero ser especificadas as reas detrabalho auxiliares (f1, f2). O nmero de colunas lidas dever ser igual ao nmero dework-areas especificadas.

    7.9. SELECT * FROM WHERE BETWEEN and .Ex.: field1 = 100 e field2 = 500. Pega inclusive 100 e 500. Voc trabalha com o range.

    7.10. SELECT * FROM WHERE LIKE ._R%._ = a primeira letra no importa o que vira segunda dever ser R (eu defini)% = no importa a sequncia de caracteres que vir.(Varredura para que possa realizar a comparao)

    7.11. SELECT MAX(campo)MIN(campo)AVG(campo)COUNT(*) FROM INTO (..,,..,.)WHERE .

    AVG e SUM: somente para campos numricos.No se usa endselect.Mais rpido fazer uma rotina mo que utilizar este comando.

  • 7/13/2019 06 - Performance

    23/72

    ABAP Training

    23

    7.12. SELECT * FROM WHERE IN (.,.).

    Exemplo: select * from where campo1 in (123,1000) - podem ser valores ouliterais. igual a perguntar se campo1 123 ou 1000.

    7.13. SELECT * FROM WHERE IN .Exemplo:DATA : begin of ITAB occurs 10,

    sign(1), option(2), low like sflight-price, high like sflight-price,end of ITAB.

    * RANGES: ITAB for sflight-tableMove: I to itab-sign, btto itab-option, 500 to itab-low, 1000 to itab-high.

    Append itab. Move: I to itab-sign, btto itab-option, 440 to itab-low.Append itab.

    7.14. SELECT * FROM () INTO .Exemplo: data: begin of WA,

    line(100),end of WA.

    7.15. Select * from (tabname) into WAWrite .

    Endselect.Parameters: tabname(10) default SPFLI.Obs.: especificando o nome da tabela dinamicamente no select statement sempreconsome mais tempo de CPU que especificando estaticamente no programa.

    7.16. SELECT * FROM FOR ALL ENTRIES IN WHEREcampo1 = andcampo2 =

    Defino uma tabela interna. Alimento os campos desta tabela interna. (move e append).No meu select campo1 e campo2 sero os campos definidos e alimentados na tabela

    interna.Esta uma excelente soluo quando se trabalha com grandes tabelas.O select for all entries simula a funcionalidade join.

  • 7/13/2019 06 - Performance

    24/72

    ABAP Training

    24

    7.17. SELECT * FROM ORDER BY PRIMARY KEY.Obs.: Classifica a tabela interna numa rea auxiliar, sem afetar a tabela original. Evitar

    o uso de sorts dentro de um select. Consome mais tempo que descarregar os dados emuma tabela interna e classific-los.

    7.18. SELECT carrid MIN( price ) max( price ) INTO (carrid, minimum, maximum)FROM sflight GROUP BY carrid.(Todos os campos que eu quero que apaream na minha lista eu preciso especificaraps a clusula GROUP BY. Carrid, maximum e minimum so campos auxiliares. Se onome do database no conhecido at runtime no se pode especificar a clusulaGROUP BY).Performance no to boa (funes MIN, MAX, etc. geram uma varredura sequencialna tabela).

    7.19. SELECT * FROM BYPASSING BUFFER.(Usado para ler diretamente da tabela original, e no do buffer).

    OBS.: Select single * sempre com chave completa especificada. Particularidade doAbap/4.

    Select * - procurar evitar. Informar as colunas que sero necessrias, apenas.

  • 7/13/2019 06 - Performance

    25/72

    ABAP Training

    25

    7. Di cas para ot imi zao do cdigo

    - Use o comando FREE para liberar espao em internal tables; Sempre usar oscomandos Clear / Refresh aps o fim de um LOOP;

    - Evite comparaes num SELECT com campos numricos versus camposalfanumricos; o sistema perde tempo para converso;

    - Testar SY-SUBRC aps cada acesso ao banco de dados;- O comando MOVE-CORRESPONDING bom para tabelas pequenas. interessante

    que a tabela interna contenha os campos na sequncia em que sero movimentados;- Ao utilizar o comando CASE, codificar sempre a clusula WHEN OTHERS;- Sempre identifique se um SORT ascending ou descending e especifique a clusula

    BY . Caso contrrio, todos os campos sero classificados.- Evitar lgicas do tipo IF not CPOA = CPOB. mais claro codificar IF CPOA ne

    CPOB.- Evitar construes do tipo:

    SORT tabela1, SORT tabela2, SORT tabela3.LOOP tabela1, LOOP tabela2, LOOP tabela3Para cada SORT fazer o LOOP correspondente. A ento iniciar novoSORT e LOOP, e assim por diante.

    - Campos chave devem ser sempre os primeiros campos da tabela. Assim, todos osdemais campos sero comprimidos;

    - SELECT (para Transparent e Pool Tables): a clusula WHERE deve conter,preferencialmente, os campos chaves e demais campos que possam restringir apesquisa;

    - SELECT (para Cluster Tables): s os campos chaves devem ser especificados naclusula WHERE. Os demais devem ser checados atravs do comando CHECK;

    - O conhecimento do contedo dos dados de uma tabela pode auxiliar no momentoda codificao do comando select. O campo que ocorrer em nmero menor de vezesdever constar na clusula where antes daquele que ocorre um nmero maior devezes, caso seja necessrio satisfazer a ambas condies. Isso faz com que oprocessamento seja mais gil.

    - Manuseio de tabelas: Estudar a possibilidade de manuseio em tabelas internas para

    agilizar o processo. Analisar tambm o uso de comando select, sendo o que melhorse adapte a situao em questo.

  • 7/13/2019 06 - Performance

    26/72

    ABAP Training

    26

    8. Ferr amentas para auxl i ar os desenvol vedores

    Existem algumas ferramentas que auxiliam os desenvolvedores a descobrir erros(errors, warnings, etc), bem como avaliar a performance de seus programas.

    Path: Tools Abap/4 Workbench Test - Runtime Analysis

    Existe um pushbutton chamado Tips and Tricks Clicando-se nele poder ser feitacomparao entre comandos Select (diferentes tipos). Dando double-click sobre um dosexemplos voc passar para outra tela, onde voc visualizar a medida do tempo emmicrosegundos de ambos, servindo de base de comparao.

    Neste mesmo path, pode-se utilizar as facilidades do Runti me Analy sispara verificar aperformance de seu programa. Ao final da execuo voc poder acessar informaessobre o seu programa (grficos, acesso a tabelas, etc). Para tanto clique o pushbuttonANALYSE, que somente aparecer depois que for informado o nome do programae/ou transao e clicado execute.

    O SQL Trace (transao ST05) outra facilidade que pode ser utilizada para trilhar algica de sua aplicao e verificar possveis pontos de correo. Voc poder visualizaros comandos de acesso a banco de dados utilizados, obter informaes sobre um

    comando especfico, visualizar os ndices que esto sendo utilizados (ver tpico 5.3sobre como utilizar o SQL Trace).

    O Extended Pr ogram Check outra facilidade que deve ser empregada visando mantero seu cdigo o mais correto possvel. Nesta opo voc poder selecionar os tens quevoc deseja que sejam checados e o sistema apontar o seu parecer. Para tanto bastaclicar os tens e o pushbutton PERFORM CHECK Selecionando uma linha voc poderver os detalhes, bem como posicionando o cursor em uma linha e clicando opushbutton DISPLAY ALL CHANGES.

  • 7/13/2019 06 - Performance

    27/72

    ABAP Training

    27

    9. In t erf aces Bat ch ou Converses:

    Segundo a documentao da SAP, existem trs mtodos para converso: Direct input,Call transaction e o Batch Input.

    Direct Input: um dos mtodos para transferncia de dados do sistema legado parao sistema R/3. considerado o mtodo mais rpido. Um arquivo sequencial comdados gerado como um arquivo texto para processamento por alguns functionmodules especiais. Estas funes executam todas as checagens normais paragarantir a integridade de dados. Quando os registros so processados com sucesso,eles so gravados diretamente nas correspondentes tabelas do banco de dados daaplicao. Na ocorrncia de erros, os dados errados so passados para uma rotinade manuseio de exceo. O gargalo associado com o processamento do dialog eupdate so eliminados neste caso. Para todas as necessidades de transferncia dedados, especialmente com transaes de alto volume, o direct input o mtodo maisindicado. Nota: este mtodo deveria ser usado em todas as situaes nas quaisfunes de aplicao utilizando esta tecnologia existam.

    Call Transaction: o prximo mtodo mais rpido para processamento de dados dosistema legado para o sistema R/3. Neste caso, o programa de transferncia dedados processa os dados do arquivo sequencial e chama a transao desejada

    usando um comando Abap. Dados de um arquivo sequencial so processados viatelas de aplicao para uma nica transao. A lgica de aplicao executa todos oschecks e a validao dos dados. Este um processamento sncrono. Quando oprocessamento do dialog realizado com sucesso, o processamento do update chamado pela aplicao correspondente para executar todas as solicitaes do bancode dados. A escolha pode ser feita entre update sncrono ou assncrono. Nenhumprotocolo de erros ou sada para lidar com os erros fornecida por esta tcnica. responsabilidade do programador da aplicao incorporar rotinas de execuo efunes dos protocolos desejados como parte do programa de transferncia dedados. A nossa recomendao usar o mtodo Call Transaction em todos os casosem que no existe um programa Direct Input. Somente em situaes de lidar com

    erros ns recomendamos que o batch-input tradicional seja realizado para posteriorprocessamento. Resumo: em contraste com o Batch-Input, o Call Transactionpermite que sejam passados dados diretamente ao dialog interface sem usar umafila. Para armazenar estes dados temporariamente, voc usa uma internal table (umatabela BDC, a qual tem a mesma estrutura daquela utilizada no batch-input). Antesde entrar dados na BDC table necessrio fazer uma verificao nos dados. Calltransaction: pode ser executado imediatamente.

  • 7/13/2019 06 - Performance

    28/72

    ABAP Training

    28

    Batch-Input: o batch-input tem sido tradicionalmente selecionado como um mtodode implementao de programas de transferncia de dados. Um benefcio que este

    mtodo traz sobre o Call Transaction que o batch-input tem um utilitrioresponsvel pela administrao e gerenciamento das funes do batch-input. Almdo mais, utilitrios existem para monitorar e dar manuteno em tarefas associadascom este mtodo. Assim, no h necessidade de nenhuma programao adicionalpara anlise de excees e funes de protocolo. Dados vindos de um arquivosequencial so processados via telas de aplicao e armazenados numa sesso batch-input. Por definio, uma sesso uma coleo de dados de transao para uma oumais transaes. As sesses batch-input so fisicamente armazenadas pelo sistemanum banco de dados como uma fila. Estas sesses podem conter tanto registros dedados corretos quanto incorretos. O batch-input trata tanto o update sncrono comoo assncrono. O mtodo batch-input, em contraste com o mtodo Call Transaction,

    pode transferir dados do sistema legado para o sistema R/3 para mltiplastransaes da aplicao. Todavia, nenhuma nova transao iniciada at que atransao anterior tenha sido gravada no correspondente banco de dados durante oprocessamento das sesses de batch-input. Tambm, sesses de batch-input nopodem ser geradas em paralelo. Ele pode ser processado de trs modos: foreground,display erros only ou background.Este mtodo oferece excelente capacidade para gerenciamento de erros e detalhado para anlise do protocolo da transao.Resumo: gerado um log e pode ser programada a execuo. Em caso de erro, oregistro pode ser corrigido e inserido novamente. Atravs deste recurso, todos os

    dados so entrados na transao original SAP, ou seja, seguindo todas asconsistncias necessrias, evitando assim que erros de integridade sejam cometidos.

    AVALIAO:

    Sempre execute alguns testes dentro do processo de transferncia de dados e avaliequal o mtodo mais apropriado para uso, dado o volume de dados, tamanho,recursos e performance do sistema.

    Todos os fatores sendo iguais, o mtodo Direct Input deve ser usado em todos oscasos em que tais funes estejam disponveis ou novas funes para transferncia

    de dados precisem ser desenvolvidas.

    Para escolher entre o Call Transaction e o Batch-Iput, sempre use o Call Transactionprimeiro e manuseie as excees ento atravs do mtodo de batch-input. Estaestratgia altamente recomendada em implementao de solues de programaopara transferncia de dados com sistemas legados.

  • 7/13/2019 06 - Performance

    29/72

    ABAP Training

    29

    10. Est udo de Caso Cl i ent e XYZ(Parte do relatrio de Quality Assurance da Fase III)

    Dentro do escopo do XYZ seria necessrio o desenvolvimento dos seguintes tipos deprograma:

    . Converses

    . Reports

    . Formulrios (SapScript)

    . Interfaces

    O trabalho baseou-se na anlise de interfaces, haja visto as converses j terem sidoprocessadas (na sua maioria) para atender a primeira fase de implantao do projeto.Mesmo assim, foi analisado um programa de converso, cuja tcnica utilizada foi Batch-Input. Quanto aos Reports, estes se encontram em fase de levantamento, no sendopossvel, portanto, fazer qualquer tipo de validao.

    Do total de interfaces desenvolvidas, buscou-se uma amostra (7 programas), utilizando-seos seguintes critrios:

    . programas considerados crticos, ou seja, que necessitam de um tempo de resposta

    eficiente, pela necessidade de serem pseudo-online e seu processamento ocorrer a cada xminutos;. programas que manipulam quantidades elevadas de dados diariamente;. grandes tabelas do R/3 (quantidade de registros versus colunas existentes);. funes do standard que no apresentam boa performance (por serem genricas) quandoutilizadas com finalidades especficas;. reas de aplicao diferentes (MM, FI, etc). desenvolvedores diferentes (foram analisados programas de diferentes pessoas).

    Obs.: exclui-se de nossa anlise todos os programas de interface que encontram-se em fasede desenvolvimento.

    Alguns dados:. Total de interfaces : 40. Status : 03 em desenvolvimento

    02 no tiveram desenvolvimento ABAP35 esto concludas

    . Programas selecionados : ZIFIT002, ZIFIT006, ZLUIZ001 (antigo ZIMMT001)ZIMMT006, ZIMMT010, ZIPMR001

  • 7/13/2019 06 - Performance

    30/72

    ABAP Training

    30

    Quanto confeco de especificao tcnica:

    1. O correto seria existir uma especificao tcnica com o intuito de servir como base parao desenvolvedor. Todavia, tal documentao est ficando pronta apenas ao trmino doprograma. Esta situao no a ideal. Todavia, se torna indispensvel a sua confecovisando facilitar manutenes futuras;

    Quanto ao esquema de testes:

    1. de extrema importncia que, alm dos testes individuais, sejam realizados testes commassa de dados real de produo, visando reproduzir um ambiente real durante a fasede execuo das interfaces, com o objetivo de minimizar/eliminar problemas com

    performance;

    2. Os testes devem englobar todas as condies lgicas possveis, e at mesmo condiesde erro. No existe esquema de stress-test (com grande volume de dados). A massade dados no deve ser gerado pelos desenvolvedores;

    Quanto uniformidade do cdigo e ao uso da metodologia (padres) definidos naFase II:

    1. Na amostragem analisada foi constatado que o manual de Padres no foi seguido de

    forma ntegra. Em alguns casos (como por exemplo na Nomenclatura definida paraFunes) constante no manual, a forma utilizada nos programas muito mais clara queaquela anteriormente definida. Aconselha-se alterar o manual de Padres, citando anova forma utilizada. No caso da definio de data-elements, este padro no foiseguido para as tabelas analisadas. Isso tambm se aplica aos nomes definidos para assesses de Batch-input pesquisadas via SM35 na data de nossa visita. Estes pontos notem implicaes graves sobre os programas, todavia somente vale a pena a criao deuma metodologia caso ela seja, de fato, seguida, e que esta visa facilitar o trabalho depesquisa/leitura/manuteno de programas ;

    2. Ainda dentro do tpico metodologia alguns pontos deveriam estar sendo seguidos: so

    os nomes de variveis. Nem todos os programas obedecem este tpico de forma integralou parcial. Este item muito importante, uma vez que facilita a leitura dos programas efuturas manutenes por terceiros ou at mesmo pela equipe tcnica do XYZ;

    3. Uso de mensagens fixas ao invs de text-elements, uma vez que o R/3 aceita vriaslinguagens e isto definido em momento de logon no sistema.

  • 7/13/2019 06 - Performance

    31/72

    ABAP Training

    31

    Quanto a performance dos programas:

    1. Dentro da amostra selecionada foram encontrados erros que se repetiam. So eles:

    a) Ninhos de selectb) Select * ao invs de select com suas respectivas colunasc) Falta de condies na clusula where para limitar o nmeros de registros retornados

    atravs do comando Selectd) Tabelas como BKPF, BSEG, EKKO, EKPO, VBAK, VBAB, MKPF, MSEG, J_1BNFDOC,

    J_1BNFLIN devem possuir, tantos campos quanto possvel para restringir a pesquisa ebusca de dados.

    e) Uso da funo CLAS_CLASSIFICATION_OF_OBJECTS com finalidades especficas

    Devido estrutura cliente servidor, resultados melhores de performance estaro sendoalcanados toda vez que a comunicao entre o servidor de aplicao e o servidor de bancode dados for minimizado.

    Em vrios casos encontramos selects em tabelas grandes, como por exemplo, a BKPF,trazendo-se todos os registros que atendessem a uma nica condio (por exemplo, cdigoda transao). de extrema importncia que, em casos de tabelas grandes (tanto em termosde volume quanto em termos de quantidade de colunas) sejam recuperadas apenas asinformaes necessrias ao atendimento do propsito do programa (colunas e condies).

    Deve-se lembrar que, com o passar do tempo, a quantidade de dados presentes nestastabelas estar crescendo; em contrapartida, haver uma reduo da performance caso oprograma no esteja fazendo selees adequadas. Uma forma de se obter maior seleo inserindo um delimitador do tipo DATA, campos que estejam presentes no somente natabela acessada mas tambm na prxima que se deseja acessar.

    Dentro do exemplo acima, em forma de um ninho de Selects, feito um outro Select para atabela BSEG. Ou seja, para cada registro da BKPF ser acessada a tabela BSEG. Esta mesmasituao pode aparece em vrios nveis, o que resulta num caos em termos de performance, medida que temos a base de dados sendo acrescida.

    Alm das precaues anteriores, as quais devem ser aplicadas sempre que possvel, vale apena mencionar que o uso de tabelas internas agiliza muito o processamento. Selects que,num nico comando, sejam responsveis por acessar a tabela, fazer a seleo do range dedados necessrio, movimentar estes dados para uma tabela interna e gravar estes dadostero performance superior uma situao de Select endselect e infinitamente superior auma situao de Select endselect em ninho.

  • 7/13/2019 06 - Performance

    32/72

    ABAP Training

    32

    Ilustrando uma situao semelhante, temos:

    Select * from bkpf where tcode = FB01.Select * from bseg where bukrs = bkpf-bukrs and

    belnr = bkpf-belnr andgjahr = bkpf-gjahr.

    Endselect.

    Endselect.

    * O primeiro comando seleciona as 79 colunas da tabela bkpf atravs do campo TCODEque, alm de no pertencer chave primria desta tabela, tambm um critrio muito

    amplo para pesquisa em tabelas deste porte. Campos como company code, data, ano fiscal,entre outros, podem ser fortes candidados a restringir a pesquisa.

    * O segundo comando seleciona as 266 colunas da tabela bseg, onde os campos bukrs,belnr e gjahr sejam iguais tabela anterior. Como na tabela anterior no foi utilizado umcritrio de seleo mais adequado, muitos registros sero retornados da bkpf e,consequentemente, para cada um destes registros, sero retornados n registros da BSEG.

    * Ambos os selects correspondero a tantos acessos no banco de dados quantos registrosexistirem.

    Visando garantir melhor performance, poder-se-ia utilizar:

    Select col1 col2 col3 into table tab_bkpf from bkpf where .

    Select col1 col2 col3 col4 into table tab_bsegfrom bsegfor all entries in tab_bkpfwhere < conditions >.

    OBS.: O exemplo dado de seleo de colunas vlido. Porm, vale lembrar que no

    possvel fazer select colunado de tabelas Cluster.

    A l gumas consideraes:

  • 7/13/2019 06 - Performance

    33/72

    ABAP Training

    33

    * Ambos os selects correspondero a um nico acesso no banco de dados.

    * O primeiro comando select j seleciona, move e grava os dados numa tabela interna.* O segundo select ser baseado no resultado, j em tabela interna, do primeiro select.* So selecionadas apenas as colunas realmente necessrias. Assim, os pacotes transmitidosentre o servidor de banco de dados e o servidor de aplicao so menores, agilizandoportanto a transferncia.* tab_bkpf e tab_bseg so tabelas internas.

    Outros erros que devem ser evitados:

    a) Hard CodeAlguns programas foram desenvolvidos baseando-se apenas na configurao atual do

    sistema R/3. Com isso, aparecem algumas checagens de forma fixa, por exemplo,checagens de centros (campo werks), conta contbil, etc., o que invalida os programas casoseja alterada a configurao.

    b) Tabela de contadores idealizada para controle de processamentos e reprocessamentosno totalmente confivel

    Foi criada uma tabela para controle do processamento, visando controlar quais registrosforam ou no processados em caso de alguma interrupo. O objetivo permitirreprocessamentos parciais. Tendo em mente que as transaes esto sendo chamadas viaCall transaction, tcnica esta que possui um commit prprio, e que a atualizao da tabela

    de controle est num outro commit, poder ocorrer situaes onde a tabela de controle norepresenta exatamente o que aconteceu.

    Necessidades:

    a) Stress-testb) Testes integrados

    Comentrios/Recomendaes:

  • 7/13/2019 06 - Performance

    34/72

    ABAP Training

    34

    O ponto mais crtico est associado ao tpico de performance. necessrio fazer reviso emtodos os programas de interface, visando detectar situaes semelhantes descrita

    anteriormente e providenciar as adequaes necessrias.Outro ponto de fundamental importncia se refere aos testes. A garantia do bomfuncionamento do programa e a minimizao de problemas com performance somenteocorrer caso seja realizado testes com massa de dados real, ou seja, volumes prximos aoesperado em ambiente produtivo, cobrindo as situaes que possam ocorrer.

    Restries:

    Caso ocorra a entrada em produo sem a alteraes nos programas, a performance ser

    decrescente, medida que as bases de dados forem crescendo. Tambm no se podegarantir que todas as interfaces pseudo-online sero processadas e finalizadas dentro dotempo estipulado (por exemplo, a cada 5 minutos, etc).

    Parecer:

    De uma forma geral pode-se dizer que o desenvovimento est bom, porm caso osprogramas no sejam revisados e adequados, certamente ocorrero problemas deperformance aps a implantao.

    QUADRO RESUMO DA SITUAO DO PROJETO DA XYZ

    Tpico Status

    Confeco de especificao tcnicaVal i dado com rest ri es

    Esquema de testes No validadoUniformidade do cdigo-metodologia-padres

    Validado com restries

    Performance Validado com restries, desdeque os programas sejamrevisados e alterados

    Outros erros No se aplica

  • 7/13/2019 06 - Performance

    35/72

    ABAP Training

    35

    11. Estudo de Caso - Cl i ent e ABC(Parte do relatrio de Quality Assurance da Fase III)

    SITUAO ATUAL

    Dentro do escopo da ABC seria necessrio o desenvolvimento dos seguintes tipos deprograma:

    . Converses

    . Reports

    . Formulrios (SapScript)

    . Interfaces

    Obs.: No houve necessidade de programas online.

    Devido a alguns problemas, que sero detalhados mais adiante, o cronograma inicial cujaexpectativa era conter apenas 26 gaps sofreu alteraes em termos de volume dedesenvolvimentos e tambm um atraso, estando neste momento a maioria dos programasem fase de desenvolvimento e/ou testes. Novos desenvolvimentos tambm foramincorporados ao projeto (cerca de oito novos programas foram criados). Assim sendo,

    optou-se por fazer o QA sobre os programas em 24.06.98, independente de no estaremconcludos, uma vez que em caso da necessidade de efetuar algum tipo de correo,haveria ainda seis dias corridos antes da data de implantao.

    Dado a esta situao, ressalta-se tambm que o coordenador de ABAP (parceiro da SAP)ainda no teve tempo hbil para fazer a reviso dos programas que foram desenvolvidos,verificando o cumprimento de normas, padres e situaes cuja performance no fossesatisfatria, antes que os programas fossem apresentados ao Quality Assurance da SAP. Agrande preocupao, no momento, a confeco dos programas.

    Essa situao de anlise de programas em desenvolvimento atpica, uma vez que nossaanlise deveria se basear apenas sobre os programas j concludos e revisados pelo parceirode implementao, mas dada a situao, isso no foi possvel.

    Alguns dados (dados aproximados, uma vez que o cronograma do projeto e status noestavam atualizados):. Total de programas : 34. Status

  • 7/13/2019 06 - Performance

    36/72

    ABAP Training

    36

    1. Converses - Cargas automticas:

    . Cadastro de cdigo NBM : converso realizada. Cadastro de taxas de cmbio : converso realizada

    . Cadastro de Materiais (inicial) : converso realizada

    . Cadastro de Fornecedores (inicial) : converso realizada

    . Cadastro de Contas a Pagar (inicial) : programa em fase de testes

    . Atualizao de Estoques : em desenvolvimento-80 % j realizado

    . Atualizao de Pedidos : em desenvolvimento-80 % j realizado

    2. Interfaces (em ordem de prioridade):. Estoques (SAP -> DISPO/OP) : em desenvolvimento

    . Livros Fiscais (SAP->PRECIS) : em desenvolvimento

    . Pedidos (SAP -> AVERAGE) : em desenvolvimento

    . Contas a Pagar (SAP -> BAYMAP) : em desenvolvimento

    . Movimentos de Materiais (SAP -> BAYMAP): em desenvolvimento

    . Fornecedores (SAP -> BAYMAP) : no desenvolvido

    . Moedas (SAP -> AVERAGE) : no desenvolvido

    Obs.: Interfaces de Estoques e Livros Fiscais so indispensveis para a data de implantao(01.07.98), no mnimo. As demais devem ser disponibilizadas logo aps, para uso no

    decorrer do ms de julho.3. SapScripts:. Certificado de Qualidade : desenvolvido. Certificado de Anlise : desenvolvido. Pedidos : em testes. Cotaes : em testes. Requisies : no ser desenvolvido

    4. Relatrios:. Relatrio de Confirmao de ordem de processo (1 e 2): desenvolvido

    . Relatrio de produo diria e mensal : aguarda definio de uma dasinterfaces para ser desenvolvido

    . Relatrio sntese de estoque : no ser desenvolvido. Serutilizado relatrio standard do R/3.

  • 7/13/2019 06 - Performance

    37/72

    ABAP Training

    37

    5. Matchcodes:.Lote na ordem de processo : ser desenvolvido

    . Ordens no liberadas : ser desenvolvido. Ordens no confirmadas : ser desenvolvido

    . Materiais por grupo de listas tcnicas : desenvolvido

    . Fornecedores CGC/CPF : desenvolvido

    Panorama das atividades:

    O trabalho baseou-se na anlise de interfaces, e de alguns relatrios j concludos, haja vistoa maioria dos programas de converso j terem sido processados antes do QualityAssurance da Fase III. Mesmo assim, foi analisado um programa de converso, cujastcnicas utilizadas foram Batch-Input/Call Transaction. Posteriormente, obteve-se a

    informao de que estes mesmos programas sero utilizados para as interfaces inbound(carga de dados do sistema R/3 a partir do sistema legado). Neste caso, seroencaminhados somente os dados alterados e/ou os dados novos. Como a carga de dadosinicial apresentou tempo de processamento considerado baixo pela equipe da ABC,utilizando os mesmos programas e com volume de dados superior ao que existir naexecuo das interfaces, este item no se torna preocupante.

    Do total de interfaces desenvolvidas, buscou-se uma amostra (11 programas), utilizando-seos seguintes critrios:. programas considerados crticos, ou seja, que necessitam de um tempo de resposta

    eficiente, pela necessidade de serem pseudo-online e seu processamento ocorrer a cada xminutos;. programas que manipulam quantidades elevadas de dados diariamente;. grandes tabelas do R/3 (quantidade de registros versus colunas existentes);. funes do standard que no apresentam boa performance (por serem genricas) quandoutilizadas com finalidades especficas;. reas de aplicao diferentes (MM, FI, etc). desenvolvedores diferentes (foram analisados programas de diferentes pessoas).

    . Programas selecionados : ZAFIB001 - ConversoZACII001 - Include do programa anterior

    ZAFII001 - Interface para lanamentos contbeisZAPPR001 - Relatrio de confirmao da ordem de

    ProcessoZAPPR002 - Listagem do cadastro de material

    ZAMMI001 - Interface para movimento de materiais

  • 7/13/2019 06 - Performance

    38/72

    ABAP Training

    38

    M. BAYMAPZAMMI002 - Interface para livros fiscais

    ZAMMI003 - Interfaces para pedidos de comprasZAMMI010 - Interface para movimento de materiaisM. BAYMAP

    ZAMMI020 - Interface para livros fiscaisZAMMI030 - Interfaces para pedidos de comprasZAPPI001 - Interface para produo de materiais

    Obs.: Dos programas relacionados anteriormente, apenas os programas ZAPPR001 e 002tinham status concludo. Todos os programas foram analisados a partir de versesexistentes no ambiente de desenvolvimento da ABC.

    Quanto confeco de especificao funcional/tcnica:

    1. O correto seria existir uma especificao tcnica com o intuito de servir como base parao desenvolvedor. Todavia, devido ao aumento do nmero de programas a seremdesenvolvidos (entre programas novos e programas para correo de cargas jrealizadas/programas para auxiliar na conferncia, problemas com o ambiente R/3 quetem apresentado short dumps em transaes standard) tal documentao ficar prontaapenas ao trmino dos desenvolvimentos. Esta situao no a ideal. Todavia, se tornaindispensvel a sua confeco visando facilitar manutenes futuras. O coordenador doprojeto est realizando um levantamento junto equipe funcional e fornecendo as

    informaes necessrias para que os desenvolvedores ABAP possam realizar suasatividades.

    Quanto documentao do projeto (cronogramas, relatrios de controle eacompanhamento):

    1. Estes documentos no esto sofrendo atualizao

    Quanto ao esquema de testes:

    1. de extrema importncia que, alm dos testes individuais, sejam realizados testes com

    massa de dados real de produo, visando reproduzir um ambiente real durante a fasede execuo das interfaces, com o objetivo de minimizar/eliminar problemas comperformance. Na ABC no esto sendo feitos testes com alto volume de dados. Issoacaba mascarando problemas que podem vir a ocorrer no futuro, caso haja um aumentosignificativo nos dados;

    2. Os testes devem englobar todas as condies lgicas possveis, e at mesmo condiesde erro. No existe esquema de stress-test (com grande volume de dados). A massa

  • 7/13/2019 06 - Performance

    39/72

    ABAP Training

    39

    de dados no deve ser gerado pelos desenvolvedores nesta etapa de testes finais, pr-produo.

    Quanto uniformidade do cdigo e ao uso da metodologia (padres) definidos naFase II:

    Foi estabelecido na fase II de QA que a metodologia e padres seriam adotados do parceirode implementao.

    1. Na amostragem analisada foi constatado que o manual de Padres no foi seguido deforma ntegra. Algumas das diferenas so demonstradas abaixo

    . nome de programa: no manual estava estabelecido que a composio seria:

    Z23456789, onde Z = fixo, 2 e 3 = ao mdulo SAP (FI, MM, PP, etc), 4 a 6 = gap de origem, 7= B (batch-input) ou I (interface) ou R (relatrio) ou S (Sapscript), 8 e 9 = nmero sequencialreferente ao gap. Na verdade, os programas desenvolvidos no esto obedecendo estepadro;

    . classes de desenvolvimento: de fato, obedeceu a estrutura definida anteriormente, ouseja, uma por mdulo. Todavia, existem programas que no esto na sua classe dedesenvolvimento correta (exemplo, programa de FI na classe de MM);

    . nome de variveis: notamos que a atribuio de nomes para tabelas internas,

    parameters, select-options, constants e types nem sempre estiveram padronizadas entre osprogramas. Este item importante, na medida que facilita a leitura dos programas e futurasmanutenes por terceiros ou at mesmo pela equipe tcnica da ABC;

    . existem forms sem nenhum contedo sendo chamados pelos programas;

    . existem variveis definidas que no esto sendo utilizadas;

    . certificar-se que tabelas definidas com clusula occurs de forma fixa no iroestourar.

    Quanto a performance dos programas:

  • 7/13/2019 06 - Performance

    40/72

    ABAP Training

    40

    1. Dentro da amostra selecionada foram encontrados erros que se repetiam. So eles:

    a) Ninhos de selectb) Select * ao invs de select com suas respectivas colunasc) Falta de mais condies na clusula where para limitar o nmeros de registros

    retornados atravs do comando Selectd) Tabelas como BKPF, BSEG, EKKO, EKPO, VBAK, VBAB, MKPF, MSEG, J_1BNFDOC,

    J_1BNFLIN devem possuir tantos campos quanto possvel para restringir a pesquisa ebusca de dados

    Devido estrutura cliente servidor, resultados melhores de performance estaro sendoalcanados toda vez que a comunicao entre o servidor de aplicao e o servidor de banco

    de dados for minimizado.

    Em vrios casos encontramos selects em tabelas grandes, como por exemplo, a BSEG,trazendo-se todos os registros que atendessem a uma nica condio. de extremaimportncia que, em casos de tabelas grandes (tanto em termos de volume quanto emtermos de quantidade de colunas) sejam recuperadas apenas as informaes necessrias aoatendimento do propsito do programa (colunas e condies). Deve-se lembrar que, com opassar do tempo, a quantidade de dados presentes nestas tabelas estar crescendo; emcontrapartida, haver uma reduo da performance caso o programa no esteja fazendoselees adequadas. Uma forma de se obter maior seleo inserindo um delimitador do

    tipo DATA, campos que estejam presentes no somente na tabela acessada mas tambm naprxima que se deseja acessar, etc.

    Num outro programa existe um ninho de Selects em trs nveis. Para cada registro da tabelaJ_1BNFDOC feito um ou mais acessos na tabela J_1BNFLIN e um ou mais acessos natabela J_1BNFSTX. Ninhos como este, com o crescimento na base de dados, trar resultadosdesfavorveis performance. Esta mesma situao se repete em outros programas.

    Alm das precaues anteriores, as quais devem ser sempre tomadas, vale a penamencionar que o uso de tabelas internas agiliza muito o processamento. Selects que, numnico comando, seja responsvel por acessar a tabela, fazer a seleo do range de dados

    necessrio, movimentar estes dados para uma tabela interna e gravar estes dados teroperformance superior uma situao de Select endselect e infinitamente superior a umasituao de Select endselect em ninho.

    Ilustrando situao semelhante, com grandes tabelas do sistema, temos:

  • 7/13/2019 06 - Performance

    41/72

    ABAP Training

    41

    Select * from bkpf where condition = XXXX.

    Select * from bseg where bukrs = bkpf-bukrs andbelnr = bkpf-belnr andgjahr = bkpf-gjahr.

    Endselect.

    Endselect.

    * O primeiro comando seleciona as 79 colunas da tabela bkpf atravs do campo que um critrio muito amplo para pesquisa em tabelas deste porte. Campos comocompany code, data, ano fiscal, entre outros, podem ser fortes candidados a restringir apesquisa.

    * O segundo comando seleciona as 266 colunas da tabela bseg, onde os campos bukrs,belnr e gjahr sejam iguais tabela anterior. Como na tabela anterior no foi utilizado umcritrio de seleo mais adequado, muitos registros sero retornados da bkpf e,consequentemente, para cada um destes registros, sero retornados n registros da BSEG.

    * Ambos os selects correspondero a tantos acessos no banco de dados quantos registrosexistirem.

    Visando garantir melhor performance, poder-se-ia utilizar:

    Select col1 col2 col3, into table tab_bkpf from bkpf where .

    Select col1 col2 col3 col4 into table tab_bsegfrom bsegfor all entries in tab_bkpfwhere < conditions >.

    Algumas consideraes:

    * Ambos os selects correspondero a um nico acesso no banco de dados.

  • 7/13/2019 06 - Performance

    42/72

    ABAP Training

    42

    * O primeiro comando select j seleciona, move e grava os dados numa tabela interna.* O segundo select ser baseado no resultado, j em tabela interna, do primeiro select.

    * So selecionadas apenas as colunas realmente necessrias. Assim, os pacotes transmitidosentre o servidor de banco de dados e o servidor de aplicao so menores, agilizandoportanto a transferncia.* tab_bkpf e tab_bseg so tabelas internas.

    Exemplificando atravs de um trecho do programa ZAFII001:

    Select mblnr bldat budat into table tab01From bkpf where budat in s_budat

    Loop at tab01.Select * from bseg where mblnr eq tab01-mblnr.

    Move-corresponding tab01 to tab02.Move-corresponding mseg to tab02.Append tab02. Clear tab02.

    Endselect.Endloop.

    O primeiro select faz um nico acesso ao servidor de banco de dados, trazendo todos osdados necessrios de uma nica vez. (OK)

    O select * na tabela bseg est dentro de um loop. Ou seja, este comando estar trazendotodas as colunas desta tabela, que uma das maiores do sistema R/3. Ser movimentadoatravs do comando move-corresponding os campos cujos nomes sejam semelhantes detab01 e mseg. Este comando no oferece boa performance (gasta tempo identificando aigualdade no nome dos campos).

    Alternativa: O loop na tab01 indica que, para cada registro da tab01 (tabela interna), seracessado um registro na bseg. Ento, seria melhor proceder conforme abaixo:

    Select mblnr bldat budat into table tab01 from bkpf where .

    Select col1 col2 col3 col4 into table tab_bseg (*)from bseg

  • 7/13/2019 06 - Performance

    43/72

    ABAP Training

    43

    for all entries in tab01where < conditions >.

    Ou seja, evitar select * trazendo somente os campos necessrios e fazer um nico acesso tabela BSEG, trazendo todos os registros importantes para o processamento. Colocartambm mais selees, objetivando restringir a quantidade de dados trazidos no primeiroselect para, consequentemente, restringir a quantidade de dados trazidos no segundoselect. Pode-se pensar em trazer todos os dados da BSEG para a prpria tab01, atravs deappending corresponding fields os table . .Ver help online para maiores detalhes sobre os comandos, em caso de dvidas.

    Este recurso de for all entries baseado na tabela anterior pode ser usado sempre,

    principalmente nos casos onde performance for um fator crtico. Normalmente, os casos deselects encadeados em forma de ninhos podem usar tal facilidade com uma incrvelmelhoria na performance.

    Cl assi fi cao dos pr ogramas ps-anl i se:

    Exemplos de programas que encontram-se na situao de ninhos de select: ZAMMI020,

    ZAMMI030, ZAMMI002, ZAMMI003.Exemplos de programas que encontram-se na situao de vrios acessos entre o servidor deaplicao e o servidor de banco de dados: ZAMMI010.

    Exemplos de programas que selecionam todas as colunas das tabelas acessadas: ZAFII001,ZAMMI002, ZAMMI003.

    Exemplos de programas que no acessam, selecionam, movimentam e gravam num nicocomando select: ZAFII001.

    Necessidades:

    a) Stress-testb) Testes integrados

  • 7/13/2019 06 - Performance

    44/72

    ABAP Training

    44

    Comentrios/Recomendaes:

    O ponto mais crtico est associado ao tpico de performance. necessrio fazer reviso emtodos os programas, visando detectar situaes semelhantes descrita anteriormente eprovidenciar as adequaes necessrias.

    Outro ponto de fundamental importncia se refere aos testes. A garantia do bomfuncionamento do programa e a minimizao de problemas com performance aps entradaem produo somente ocorrer caso seja realizado testes com massa de dados real, ou seja,volumes prximos ao esperado em ambiente produtivo, cobrindo as situaes que possamocorrer.

    Restries:

    Caso ocorra a entrada em produo sem a alteraes nos programas, a performance serdecrescente, medida que as bases de dados forem crescendo. Tambm no se podegarantir que todas as interfaces pseudo-online sero processadas e finalizadas dentro dotempo estipulado (por exemplo, a cada x minutos, etc).

    A documentao dos programas dever ser providenciada, mesmo que aps entradaem produo, visando facilitar trabalhos de manutenes futuras.

    Testes com massas de dados real ou com alto volume de dados eliminam/minimizamos problemas com performance. A entrada em produo, na maioria dos casos, no comprometida. Porm, aps alguns meses, pode-se ter um decrscimo significativo na

    performance.

    O atraso no cronograma deveu-se ao aumento do nmero de desenvolvimentos, problemas com o ambiente R/3 da ABC, que apresentava short dumpem transaes online,o que impossibilitava configuraes, entrada de dados para testes, etc. Outro ponto quetrouxe dificuldades para a equipe ABAP do parceiro de implementao foi a inexistnciade formulrios (Sapscripts) da localizao no ambiente que eles estavam utilizando, sendonecessrio desenvolv-los a partir de cpia de outros clientes. Principalmente devido ao

    problema de dumpsem transaes standard, a equipe de ABAP foi inmeras vezesinterrompida para auxiliar os funcionais, tentando driblar o problema, para que o projetosofresse menor impacto.

    Obteve-se a informao que o material de Quality Assurance da Fase II apenas foi entregue equipe de desenvolvimento ABAP a cerca de uma semana atrs. Vale ressaltar que estematerial altamente tcnico, e basicamente voltado equipe do projeto ABAP. O fato daequipe no ter feito a leitura deste material desde o incio do projeto traz alguns pontos

  • 7/13/2019 06 - Performance

    45/72

    ABAP Training

    45

    negativos. Estes s no foram maiores dada a experincia da equipe em outros projetos.Mesmo assim, certas irregularidades poderiam ter sido evitadas.

    Parecer:

    De uma forma geral pode-se dizer que o desenvovimento est bom, porm caso osprogramas no sejam revisados e adequados, certamente ocorrero problemas deperformance aps a implantao.Um ponto positivo que todos os programas possuem lgica simples e fcil paramanutenes futuras, se houver necessidade.

  • 7/13/2019 06 - Performance

    46/72

    ABAP Training

    46

    3 . QUADRO RESUMO DA SITUAO DO PROJETO

    Tpico Status

    Confeco de especificao tcnicaVal i dado com rest r ies: o

    format o da especi f i cao

    tcnica foi val i dado no

    Qual i t y Assurance da Fase

    I I , porm nesta fase no se

    pde ver as especif i caes

    concl udas.

    Esquema de testes No validado.So necessrios testes com altovolume de dados.

    Uniformidade do cdigo-metodologia-padres

    Validado com restries.

    Performance Validado com restries, desdeque os programas sejamrevisados e alterados no que serefere questes de

    performance. Pontofundamental e indispensvelpara correo antes da entradaem produo.

    Outros erros No se aplica

    Observao:

    Valer muito pouco todo este trabalho se a configurao da mquina no estivercorreta. necessrio que ocorra uma visita de basis se o problema de performance no

    est num programa em especfico, mas em vrios.

  • 7/13/2019 06 - Performance

    47/72

    ABAP Training

    47

    Anlise de casos reais programas com problemas:

    1.Performance ruim seleo de dados

    *- Tabelas Internas --------------------------------------------------- *

    * Tabela de OV's incompletas.DATA: I_ZPTES_ESPECIF LIKE ZPTES_ESPECIF OCCURS 100 WITH HEADER LINE.

    * Tabela de OV's serem especificadas.DATA: BEGIN OF I_ESPECIF OCCURS 100.

    INCLUDE STRUCTURE ZPTES_ESPECIF.DATA: FLAG. "// O valor 'X' indica que o

    "// registro dever ser"// atualizado.

    DATA: END OF I_ESPECIF.

    * Tabela p/ atualizao das Ordens de Venda.DATA: BEGIN OF I_ATUALIZA OCCURS 100,

    VBELN LIKE VBAP-VBELN, "// Documento de venda.POSNR LIKE VBAP-POSNR, "// Item do documento.MTVO LIKE ZPTES_ESPECIF -MOTIVO. "// Motivo da

    "// impossibilidade de"// completar a OV.

    DATA: END OF I_ATUALIZA.

    * Mestre de clientes (parte geral).DATA: BEGIN OF I_KNA1 OCCURS 100,

    KUNNR LIKE KNA1-KUNNR, "// N cliente.NAME1 LIKE KNA1-NAME1. "// Nome do cliente.

    DATA: END OF I_KNA1.

    * Documento de vendas: dados de cabealho.DATA: BEGIN OF I_VBAK OCCURS 100,

    VBELN LIKE VBAK-VBELN, "// Documento de venda.ERDAT LIKE VBAK-ERDAT, "// Data criao do registro.

    ERZET LIKE VBAK-ERZET, "// Hora do registro.ERNAM LIKE VBAK-ERNAM, "// Nome do responsvel.VBTYP LIKE VBAK-VBTYP, "// Ctg.documento de vendas e

    "// distribuio.KUNNR LIKE KNA1-KUNNR, "// ClienteVKGRP LIKE VBAK-VKGRP. "// Grupo de trabalho

    DATA: END OF I_VBAK.

    * Documento de vendas: dados de item.DATA: BEGIN OF I_VBAP OCCURS 100,

    VBELN LIKE VBAP-VBELN, "// Documento de venda.POSNR LIKE VBAP-POSNR, "// Item do documento.MATNR LIKE VBAP-MATNR, "// N do material.OBJNR LIKE VBAP-OBJNR, "// N objeto a nvel de item.CUOBJ LIKE VBAP-CUOBJ. "// Configurao.

    DATA: END OF I_VBAP.

    * Cpia de I_VBAP p/ melhor performance.

    DATA: I_VBAP_AUX LIKE I_VBAP OCCURS 100WITH HEADER LINE.

    * Status individual por objeto.DATA: BEGIN OF I_JEST OCCURS 100,

    OBJNR LIKE JEST-OBJNR, "// N objeto.STAT LIKE JEST-STAT. "// Status individual de um

    "// objeto.DATA: END OF I_JEST.

    * Textos relativos a status de usurio.DATA: BEGIN OF I_TJ30T OCCURS 100,

    ESTAT LIKE TJ30T-ESTAT, "// Status do usurio.TXT04 LIKE TJ30T-TXT04. "// Status individual de um

  • 7/13/2019 06 - Performance

    48/72

    ABAP Training

    48

    "// objeto (forma breve).DATA: END OF I_TJ30T.

    * Textos relativos a status do sistema.

    DATA: BEGIN OF I_TJ02T OCCURS 100,ISTAT LIKE TJ02T-ISTAT, "// Status do sistema.TXT04 LIKE TJ02T-TXT04. "// Status individual de um

    "// objeto (forma breve).DATA: END OF I_TJ02T.

    * Dados do usurio.DATA: BEGIN OF I_USER_ADDR OCCURS 100,

    BNAME LIKE USER_ADDR-BNAME, "// Nome do usurio no"// cadastro.

    NAME_FIRST LIKE USER_ADDR -NAME_FIRST. "// Nome.DATA: END OF I_USER_ADDR.

    * Caractersticas.DATA: BEGIN OF I_CABN OCCURS 100,

    ATINN LIKE CABN-ATINN, "// Valor da caractersticaATNAM LIKE CABN-ATNAM. "// Nome da caracterstica

    DATA: END OF I_CABN.

    * Descricao das Caractersticas e Valor.DATA: BEGIN OF I_CARACT OCCURS 20,

    NOME LIKE CABN-ATNAM, "// Nome da caratersticaVALOR LIKE ZPTES_ESPECIF -CANAL. "// Valor da caracterstica

    DATA: END OF I_CARACT.

    * Tabela com nomes das caractersticas.RANGES: R_ATNAM FOR CABN-ATNAM.

    *&--------------------------------------------------------------------- **& Form f_seleciona_dados*&--------------------------------------------------------------------- *

    * Seleciona os dados, carregando os mesmos nas tabelas internas.*---------------------------------------------------------------------- *FORM F_SELECIONA_DADOS.

    * Recupera as ordens de venda do tipo make to order.select vbeln posnr matnr objnr cuobjfrom vbapinto table i_vbapwhere pstyv = c_tacor pstyv = c_ytacor pstyv = c_ztac.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Grava os documentos em i_vbap_aux, e apaga os registros duplicados.i_vbap_aux[] = i_vbap[].delete adjacent duplicates from i_vbap_aux comparing vbeln.

    * Obtem os tipos de documentos (ordem ou contrato).select vbeln erdat erzet ernam vbtyp kunnr vkgrpfrom vbakinto table i_vbakfor all entries in i_vbap_auxwhere vbeln = i_vbap_aux-vbeln.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

  • 7/13/2019 06 - Performance

    49/72

    ABAP Training

    49

    * Obtem a descrio do cliente.select kunnr name1from kna1

    into table i_kna1for all entries in i_vbakwhere kunnr = i_vbak-kunnr.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem a chave de pesquisa para os s tatus.select objnr statfrom jestinto table i_jestfor all entries in i_vbapwhere objnr = i_vbap-objnrand inact c_x.

    if sy-subrc ne c_zero.

    message e007(zp_abap).endif. "// No existe dados no par metro indicado.

    * Obtem o status do usurio. (I_JEST-STAT(1) = 'E')select estat txt04from tj30tinto table i_tj30tfor all entries in i_jestwhere estat = i_jest-statand spras = sy-langu.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem o status do sistema. (I_JEST-STAT(1) = 'I')select istat txt04from tj02tinto table i_tj02tfor all entries in i_jestwhere istat = i_jest-statand spras = sy-langu.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem o nome do usurio que criou a ordem.select bname name_firstfrom user_addrinto table i_user_addrfor all entries in i_vbakwhere bname = i_vbak-ernam.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem os itens a serem especificados.select *

    from zptes_especifinto table i_zptes_especif.

    perform f_carregar_caracteristicas. "// Carrega a tabela i_cabn.

    ENDFORM. "// f_seleciona_dados

  • 7/13/2019 06 - Performance

    50/72

    ABAP Training

    50

    Performance melhorada seleo de dados

    * Tabela de OV's incompletas.DATA: I_ZPTES_ESPECIF LIKE ZPTES_ESPECIF OCCURS 100 WITH HEADER LINE.

    * Tabela de OV's serem especificadas.DATA: BEGIN OF I_ESPECIF OCCURS 100.

    INCLUDE STRUCTURE ZPTES_ESPECIF.DATA: FLAG. "// O valor 'X' indica que o

    "// registro dever ser"// atualizado.

    DATA: END OF I_ESPECIF.

    * Tabela p/ atualizao das Ordens de Venda.DATA: BEGIN OF I_ATUALIZA OCCURS 100,

    VBELN LIKE VBAP-VBELN, "// Documento de venda.POSNR LIKE VBAP-POSNR, "// Item do documento.MTVO LIKE ZPTES_ESPECIF-MOTIVO. "// Motivo da

    "// impossibilidade de"// completar a OV.

    DATA: END OF I_ATUALIZA.

    * Mestre de clientes (parte geral).DATA: BEGIN OF I_KNA1 OCCURS 100,

    KUNNR LIKE KNA1-KUNNR, "// N cliente.NAME1 LIKE KNA1-NAME1. "// Nome do cliente.

    DATA: END OF I_KNA1.

    * Documento de vendas: dados de cabealho.DATA: BEGIN OF I_VBAK OCCURS 5000,

    VBELN LIKE VBAK-VBELN, "// Documento de venda.ERDAT LIKE VBAK-ERDAT, "// Data criao do registro.ERZET LIKE VBAK-ERZET, "// Hora do registro.ERNAM LIKE VBAK-ERNAM, "// Nome do responsvel.VBTYP LIKE VBAK-VBTYP, "// Ctg.documento de vendas e

    "// distribuio.KUNNR LIKE KNA1-KUNNR, "// ClienteVKGRP LIKE VBAK-VKGRP. "// Grupo de trabalho

    DATA: END OF I_VBAK.

    * Documento de vendas: dados de item.DATA: BEGIN OF I_VBAP OCCURS 10000,

    VBELN LIKE VBAP-VBELN, "// Documento de v enda.POSNR LIKE VBAP-POSNR, "// Item do documento.MATNR LIKE VBAP-MATNR, "// N do material.OBJNR LIKE VBAP-OBJNR, "// N objeto a nvel de item.CUOBJ LIKE VBAP-CUOBJ. "// Configurao.

    DATA: END OF I_VBAP.

    * Cpia de I_VBAP p/ melhor performance.DATA: I_VBAP_AUX LIKE I_VBAP OCCURS 10000WITH HEADER LINE.

    * Ordens de VendaDATA: BEGIN OF I_ordem OCCURS 10000,

    vbeln LIKE vbap-vbeln, "// Documento de vendaposnr LIKE vbap-posnr. "// Item Documento de venda

    DATA: END OF I_ordem.

    * Status individual por objeto.

  • 7/13/2019 06 - Performance

    51/72

    ABAP Training

    51

    DATA: BEGIN OF I_JEST OCCURS 100000,OBJNR LIKE JEST-OBJNR, "// N objeto.STAT LIKE JEST-STAT. "// Status individual de um

    "// objeto.

    DATA: END OF I_JEST.

    * Status individual por objeto.DATA: BEGIN OF I_JEST_aux OCCURS 100000,

    OBJNR LIKE JEST-OBJNR, "// N objeto.STAT LIKE JEST-STAT. "// Status individual de um

    "// objeto.DATA: END OF I_JEST_aux.

    * Histrico de modificaes no satus do usurio/sistema.DATA: BEGIN OF I_JCDS OCCURS 1000,

    STAT LIKE JCDS-STAT, " Status do usurio.CHGNR LIKE JCDS-CHGNR. " Nmero da modificao

    DATA: END OF I_JCDS.

    * Textos relativos a status de usurio.DATA: BEGIN OF I_TJ30T occurs 100,

    ESTAT LIKE TJ30T-ESTAT, "// Status do usurio.TXT04 LIKE TJ30T-TXT04. "// Status individual de um

    "// objeto (forma breve).DATA: END OF I_TJ30T.

    * Textos relativos a status do sistema.DATA: BEGIN OF I_TJ02T,

    ISTAT LIKE TJ02T-ISTAT, "// Status do sistema.TXT04 LIKE TJ02T-TXT04. "// Status individual de um

    "// objeto (forma breve).DATA: END OF I_TJ02T.

    * Dados do usurio.DATA: BEGIN OF I_USER_ADDR OCCURS 100,

    BNAME LIKE USER_ADDR-BNAME, "// Nome do usurio no"// cadastro.

    NAME_FIRST LIKE USER_ADDR-NAME_FIRST. "// Nome.DATA: END OF I_USER_ADDR.

    * Caractersticas.DATA: BEGIN OF I_CABN OCCURS 100,

    ATINN LIKE CABN-ATINN, "// Valor da caractersticaATNAM LIKE CABN-ATNAM. "// Nome da caracterstica

    DATA: END OF I_CABN.

    * Descricao das Caractersticas e Valor.DATA: BEGIN OF I_CARACT OCCURS 20,

    NOME LIKE CABN-ATNAM, "// Nome da caratersticaVALOR LIKE ZPTES_ESPECIF -CANAL. "// Valor da caracterstica

    DATA: END OF I_CARACT.

    * Tabela com nomes das caractersticas.RANGES: R_ATNAM FOR CABN-ATNAM.

    *&--------------------------------------------------------------------- **& Form f_seleciona_dados*&--------------------------------------------------------------------- ** Seleciona os dados, carregando os mesmos nas tabelas internas.*---------------------------------------------------------------------- *FORM F_SELECIONA_DADOS.

    * Obtem o status do usurio. (I_JEST-STAT(1) = 'E')select estat txt04from tj30t

  • 7/13/2019 06 - Performance

    52/72

    ABAP Training

    52

    into table i_tj30twhere spras = sy -langu

    and ( txt04 = c_specor txt04 = c_lcot

    or txt04 = c_pcot ).

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem o status do sistema. (I_JEST-STAT(1) = 'I')select istat txt04up to 1 rowsfrom tj02tinto i_tj02twhere spras = sy -languand txt04 = c_incompleto.

    endselect.

    if sy-subrc ne c_zero.

    message e007(zp_abap).endif. "// No existe dados no parmetro indicado.

    read table i_tj30t with key txt04 = c_spec.if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem a chave de pesquisa para os status.select objnr statfrom jestinto table i_jestwhere ( STAT = i_tj30t-estat or

    STAT = i_tj02t-istat )and inact c_x.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * ordena a tabela i_jest.sort i_jest by objnr stat.

    * seleo das OVs incompletas.

    i_jest_aux[] = i_jest[].

    loop at i_jest. "leitura da tabela de Status individual por objetoread table i_jest_aux with key objnr = i_jest -objnr

    stat = i_tj30t -estat.if sy-subrc eq c_zero.read table i_jest_aux with key objnr = i_jest -objnr

    stat = i_tj02t -istat.if sy-subrc eq c_zero.i_ordem-vbeln = i_jest-objnr+2(10).i_ordem-posnr = i_jest-objnr+12(6).append i_ordem.clear i_ordem.

    endif.endif.

    endloop. " fim da leitura da tab de Status indiv. por objeto

    * elimina registros duplicados da tabela.delete adjacent duplicates from i_ordem.if i_ordem[] is initial.

  • 7/13/2019 06 - Performance

    53/72

    ABAP Training

    53

    message e007(zp_abap).endif. "// No existe dados no parmetro indicado.

    * Recupera as ordens de venda do tipo make to order cujo status seja* incompleta

    select vbeln posnr matnr objnr cuobjfrom vbapinto table i_vbapfor all entries in i_ordemwhere vbeln = i_ordem-vbeln

    and posnr = i_ordem-posnrand ( pstyv = c_tacor pstyv = c_ytacor pstyv = c_ztac ).

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem os tipos de documentos (ordem ou contrato).select vbeln erdat erzet ernam vbtyp kunnr vkgrpfrom vbakinto table i_vbakfor all entries in i_vbap_auxwhere vbeln = i_vbap_aux-vbeln.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem a descrio do cliente.select kunnr name1from kna1into table i_kna1for all entries in i_vbakwhere kunnr = i_vbak-kunnr.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem o nome do usurio que criou a ordem.select bname name_firstfrom user_addrinto table i_user_addrfor all entries in i_vbakwhere bname = i_vbak-ernam.

    if sy-subrc ne c_zero.message e007(zp_abap).

    endif. "// No existe dados no parmetro indicado.

    * Obtem os itens a serem especificados.select *

    from zptes_especifinto table i_zptes_especif.

    perform f_carregar_caracteristicas. "// Carrega a tabela i_cabn.

    ENDFORM. "// f_seleciona_dados

  • 7/13/2019 06 - Performance

    54/72

    ABAP Training

    54

    2. Performance Ruim Lgica errada

    * Corte externo ao - I_T320_ACO.DATA: BEGIN OF I_T320_ACO OCCURS 100,WERKS LIKE T320-WERKS, "// Material.LGORT LIKE T320-LGORT. "// Depsito.

    DATA: END OF I_T320_ACO.

    ** Corte externo ao - I_T320_NACO.*DATA: BEGIN OF I_T320_NACO OCCURS 100,* WERKS LIKE T320-WERKS, "// Material.* LGORT LIKE T320-LGORT. "// Depsito.*DATA: END OF I_T320_NACO.

    * Quanto ao - I_LQUA_ACO.DATA: BEGIN OF I_LQUA_ACO OCCURS 100,

    LGNUM LIKE LQUA-LGNUM, "// Sist de depsitoMATNR LIKE LQUA-MATNR, "// Material

    WERKS LIKE LQUA-WERKS, "// CentroCHARG LIKE LQUA-CHARG, "// N lote de produoLGTYP LIKE LQUA-LGTYP, "// Tipo de Depos.LGPLA LIKE LQUA-LGPLA, "// Pos.Depos.LGORT LIKE LQUA-LGORT. "// Depsito.

    DATA: END OF I_LQUA_ACO.

    * Totalizador1 AO - MSLB + S692DATA: BEGIN OF I_TOTALIZADOR1_ACO OCCURS 100,

    MATNR LIKE MARA-MATNR, "// Material.MATKL LIKE MARA-MATKL, "// Centro.MTART LIKE MARA-MTART, "// Tipo de Material.WERKS_MSLB LIKE MSLB-WERKS, "// Centro.CHARG_MSLB LIKE MSLB-CHARG, "// Lote.LIFNR LIKE MSLB-LIFNR, "// Depsito.

    LBLAB LIKE MSLB-LBLAB, "// Lote.LBINS LIKE MSLB-LBINS, "// Utilizao Livre.VBELN_S692 LIKE S692-VBELN, "// Em contr.qualid.POSNR_S692 LIKE S692-POSNR, "// BloqueadoEBELN LIKE S692-EBELN, "// DevoluoENSAIO TYPE C. "// Ensaio

    DATA: END OF I_TOTALIZADOR1_ACO.

    * Totalizador2 AO - MARA + MSKADATA: BEGIN OF I_TOTALIZADOR2_ACO OCCURS 100,

    MATNR LIKE MARA-MATNR, "// Material.MATKL LIKE MARA-MATKL, "// Centro.MTART LIKE MARA-MTART, "// Tipo de Material.WERKS_MCHB LIKE MCHB-WERKS, "// Centro.LGORT_MCHB LIKE MCHB-LGORT, "// Depsito.CHARG_MCHB LIKE MCHB-CHARG, "// Lote.

    CLABS LIKE MCHB-CLABS, "// Utilizao livreCINSM LIKE MCHB-CINSM, "// Em contr.Qualid.CSPEM LIKE MCHB-CSPEM, "// BloqueadoCRETM LIKE MCHB-CRETM, "// DevoluoCHARG_MSKA LIKE MSKA-CHARG, "// Lote.WERKS_MSKA LIKE MSKA-WERKS, "// Centro.LGORT_MSKA LIKE MSKA-LGORT, "// Depsito.VBELN_MSKA LIKE MSKA-VBELN, "// Ordem.POSNR_MSKA LIKE MSKA-POSNR, "// Item.KALAB LIKE MSKA-KALAB, "// Estq.aval de utilizao livreKAINS LIKE MSKA-KAINS, "// Estq.em controle de qualidade

  • 7/13/2019 06 - Performance

    55/72

    ABAP Training

    55

    KASPE LIKE MSKA-KASPE, "// Estoque bloqueadoLGTYP LIKE LQUA-LGTYP, "// Tipo de depsitoLGPLA LIKE LQUA-LGPLA, "// Posio no depsitoLGNUM LIKE LQUA-LGNUM, "// Sistema de depsitoTPTAB(4) TYPE C. "// Tabela de origem dos dados

    DATA: END OF I_TOTALIZADOR2_ACO.

    *----------------------------------------------------------------------** Form F_SELECIONA_DADOS_ACO*----------------------------------------------------------------------** Seleciona os dados para os parmetros indicados na tela - ao.*----------------------------------------------------------------------*FORM F_SELECIONA_DADOS_ACO.

    * Seleo dos materiais* Seleo dos dados de material - Ao* MARAselect matnr

    matkl

    mtartfrom marainto table i_mara_acowhere matkl between c_500 and c_504.

    *--------------------------------------------* Seleo dos lotes* Seleo dos lotes de material - Ao* MCHBif not i_mara_aco[] is initial.

    select matnrwerkslgortchargclabscinsmcspemcretmfrom mchbinto table i_mchb_acofor all entries in i_mara_acowhere matnr = i_mara_aco-matnrand ( clabs c_zero

    or cinsm c_zeroor cspem c_zero ).

    endif.

    *------------------------------------------------* Seleo dos Estoque de ordens-cliente* Dados ordem/itens para os materiais - Ao* MSKA

    if not i_mara_aco[] is initial.select matnrchargwerkslgortvbelnposnrkalabkainskaspefrom mska

  • 7/13/2019 06 - Performance

    56/72

    ABAP Training

    56

    into table i_mska_acofor all entries in i_mara_acowhere matnr = i_mara_aco-matnrand ( kalab c_zero

    or kains c_zeroor kaspe c_zero ).

    endif.

    *---------------------------------------------------* Seleo dos estoques especiais junto ao fornecedor* Estoques especiais junto ao fornecedor - Ao* MSLBif not i_mara_aco[] is initial.

    select matnrwerkscharglifnrlblablbins

    from mslbinto table i_mslb_acofor all entries in i_mara_acowhere matnr = i_mara_aco-matnrand ( lblab c_zero

    or lbins c_zero ).endif.

    *-----------------------------------------------------* Corte Externo* Corte Externo - Ao* S692if not i_mslb_aco[] is initial.

    select matnrchargvbelnposnrebelnfrom s692into table i_s692_acofor all entries in i_mslb_acowhere matnr = i_mslb_aco-matnrand charg = i_mslb_aco-charg.

    endif.*------------------------------------------------------* Atribuio depsito IM a sistema de depsito WM* Atribuio depsito IM a sistema de depsito WM - Ao T320 - mchbif not i_mchb_aco[] is initial.

    select werkslgort

    from t320into table i_t320_acofor all entries in i_mchb_acowhere werks = i_mchb_aco-werksand lgort = i_mchb_aco-lgort.

    endif.

    * Seleo da t320 - mskaif not i_mska_aco[] is initial.

    select werkslgort

  • 7/13/2019 06 - Performance

    57/72

    ABAP Training

    57

    from t320appending table i_t320_acofor all entries in i_mska_acowhere werks = i_mska_aco-werksand lgort = i_mska_aco-lgort.

    endif.

    * Ordena a tabelasort i_t320_aco by werks lgort.

    * Deleta os itens adjacentes.delete adjacent duplicates from i_t320_aco comparing werks lgort.

    *-----------------------------------------------------------* Quanto