"
Apoiado por

CTRL-clique para seleccionar uma palavra

rato

Uma dica simples mas valiosa: em qualquer sítio do SAP GUI – incluindo o editor de ABAP – para seleccionar uma palavra basta fazer CTRL-clique em cima dela. Fixe, não?

Infelizmente não funciona no GUI Java do Mac :-(

(Obrigado ao Sérgio Fraga pela dica)

O Abapinho saúda-vos.

RANGE instantâneo – É só juntar água

tang

Vou ensinar-te uma fórmula mágica para gerar um RANGE em que praticamente é só juntar água.

Imagina que queres fazer um RANGE a partir de uma seleção da base de dados para depois o utilizar num outro SELECT qualquer. Claro que o poderias fazer assim:


DATA: lt_kunnr TYPE STANDARD TABLE OF kunnr,
        lr_kunnr TYPE RANGE OF kunnr,
        wa_kunnr LIKE LINE OF lr_kunnr.
FIELD-SYMBOLS: <kunnr> LIKE LINE OF lt_kunnr.

SELECT kunnr
  INTO TABLE lt_kunnr
  FROM kna1.

wa_kunnr-sign = 'I'.
wa_kunnr-option = 'EQ'.
LOOP AT lt_kunnr ASSIGNING <kunnr>.
  wa_kunnr-low = <kunnr>.
  APPEND wa_kunnr TO lr_kunnr.
ENDLOOP.

E assim usaste 15 linhas de código e 4 variáveis.
Mas vê lá agora esta alternativa:


DATA: r_kunnr TYPE RANGE OF kunnr,
      wa_kunnr LIKE LINE OF r_kunnr.

SELECT kunnr AS low
  INTO CORRESPONDING FIELDS OF TABLE r_kunnr
  FROM kna1.

wa_kunnr-sign = 'I'.
wa_kunnr-option = 'EQ'.
MODIFY r_kunnr FROM wa_kunnr TRANSPORTING sign option WHERE low <> ''.

Repara como logo no SELECT renomeio logo o campo KUNNR para LOW por forma a poder metê-lo directamente no sítio certo do RANGE.
Repara também com o comando MODIFY actualiza de uma só vez todas as linhas do RANGE com apenas os campos que explicitamos.

E assim, usando apenas 10 linhas de código e 2 variáveis ficas com uma coisa que é mais sintética, mais bonita de se olhar e que manda muito mais sainete.

Granda pinta, não? É só vantagens.

Eu farto-me de usar isto.

Atenção que os RANGEs têm um limite de (não tenho a certeza mas acho serem) 2000 linhas.

O Abapinho saúda-vos.

LOOP ASSIGNING em vez de LOOP INTO

pointer

No princípio era o INTO.
Aliás, no princípio nem sequer era o INTO.

Ler o resto do artigo »

Soneca

soneca

Volta não volta é preciso meter um programa a dormir. E como em quase tudo, há várias formas de o fazer, e umas formas são melhores do que outras.

A forma mais standard de conseguir isto em ABAP é a seguinte:


WAIT UP TO 10 SECONDS.

A vantagem do WAIT UP TO N SECONDS é que o processo é libertado durante estes 10 segundos, ficando assim disponível para quem o quiser apanhar. A grande desvantagem é que faz um COMMIT implícito, o que nem sempre é bom. Se não te importares com o COMMIT, esta é a melhor forma de adormeceres o teu programa. Nota que não dá para o adormecer por 1.5 segundos pois o parâmetro só aceita números inteiros.

Se um COMMIT não der jeito, porque tens um cursor aberto para a base de dados ou porque estás a meio de uma transacção, podes sempre fazer isto:


DATA: ZTIME LIKE SY-UZEIT.

GET TIME.

ZTIME = SY-UZEIT + 10.

DO.
  GET TIME.
  IF SY-UZEIT >= ZTIME.
     EXIT.
   ENDIF.
ENDDO.

Mas fazer isto é muito parvo. Chama-se espera activa e é a última coisa que queres fazer num programa porque é o mesmo que metê-lo a correr numa passadeira de ginásio: cansa-se e não chega a lado nenhum.

Felizmente há uma alternativa mais saudável que, embora não liberte o processo, evita o malfadado COMMIT:


CALL FUNCTION 'ENQUE_SLEEP'
    EXPORTING
        seconds    = 10.

O Abapinho saúda-vos.

Obrigado Sweet-Rainb0w pela foto.

Várias versões da mesma história

versoes-sap

Toda a gente sabe que as versões do SAP são uma grande confusão. Os senhores de Heidelberg que brincam a dar os nomes às coisas lá deles ou são uns caprichosos, ou andam a gozar connosco, ou devem andar sempre à bulha.

 
 

Aqui fica uma tabelinha para ajudar a deslindá-las:

 
Ano UI Edição Versão Versinha BASIS WebAS ECC NetWeaver
Terminal R/2 - -
1992 Desktop R/3 1.0 - 1.0
Desktop R/3 2.0, 2.1 - 2.0, 2.1
1997 Desktop R/3 3.0, 3.1 3.1I 3.1I
1998 Desktop R/3 4.0 4.0B 4.0B
2000 Desktop R/3 4.5 4.5B 4.5B
2001 Desktop R/3 4.6 4.6B, 4.6C 4.6B, 4.6C
2001 Desktop R/3 4.6D 4.6D 4.6D, 610 6.10
2003 Web R/3 Enterprise 1.10 4.7×110 620 6.20 NetWeaver (2003)
Web R/3 Enterprise 2.00 4.7×200 630 6.30 NetWeaver (2003)
2005 Web mySAP 2004 - 640 6.40 ECC 5.0 NetWeaver 04
2006 Web mySAP 2005 - 700 7.0 (AS) ECC 6.0 NetWeaver 04S

Se isto não for suficiente para deixares de estar confuso, aqui encontras uma apresentação muito boa e detalhada sobre as várias versões do SAP e as diferentes habilidades de cada uma.

O Abapinho saúda-vos.

(obrigado incurable_hippie pela foto)

Partida… lagarta… fugida!

corrida_tabelas

Senhoras e senhores, meninos e meninas, a corrida está prestes a começar.

Introdução

Apresento-vos as 4 participantes. São 4 tabelas internas, de diferentes raças e credos, que se vão pelejar pelo título atlético do LOOP em velocidade. Aqui estão elas:

Concorrente 1: DATA: LT_ITEM TYPE TABLE
Concorrente 2: DATA: LT_ITEM_HASHED TYPE HASHED TABLE
Concorrente 3: DATA: LT_ITEM_SORTED TYPE SORTED TABLE
Concorrente 4: DATA: LT_ITEM TYPE TABLE + INTO INDEX

Ler o resto do artigo »

Macros globais

makro

Noutro artigo falámos de macros, uma funcionalidade relativamente obscura e pouco utilizada que tanto pode ser útil como criar uma grande salganhada. Mas estas não são as únicas macros do ABAP. Há outras, ainda mais obscuras e com ainda maior potencial de enfarelhamento de um sistema: as macros globais.

Nem sei se revele isto de tão esquisito que é…
Mas também não me parece bem escondê-lo…
Seja, revelarei.

É possível definir macros a nível global do sistema que podem ser utilizadas em qualquer programa ABAP. Para isso existe a tabela TRMAC:

A utilização é evidente: NAME é o nome do macro, NUMM é o número da linha e LINE representa uma linha de código. Um macro com 3 linhas deverá ter 3 entradas na tabela TRMAC.

Agora que já sabes da existência destas macros, faz o favor de te esquecer delas. E se para ti o perigo da utilização destes macros não é evidente então tu também és um perigo. Porque é que me dou então ao trabalho de falar sobre esta aberração? Acima de tudo porque isto revela que o famoso comando “BREAK user” não é mais do que uma macro global, como podem ver pela imagem da tabela. Muito curioso.

(Obrigado ao Bruno Filipa pela dica)

O Abapinho saúda-vos.

Começar com o pé direito

pes-praia

Quando se faz login no SAP normalmente vai parar-se ao menu. Mas pode usar-se o módulo de função NAVIGATION_SET_START_TCODE para pré-definir uma transacção inicial. Vale o que vale, mas é melhor saber que existe do que não saber que existe e ainda melhor do que sabe que não existe. Quem sabe dê jeito a alguns utilizadores. Existe também o módulo de função NAVIGATION_GET_START_TCODE para ver qual está pré-definida.

O Abapinho saúda-vos.

Nem o Luís de Matos faria melhor

chaves

Às vezes acontece querermos aceder a uma transacção e não termos permissões. É uma chatice. Felizmente existe o módulo de função ALINK_CALL_TRANSACTION que alivia a situação. Mas usa com cuidado, não vá alguém zangar-se. Bem-vindo ao lado negro do Abapinho. Se disserem que fui eu que disse, nego tudo.

O Abapinho saúda-vos.

(obrigado ao Bohman pela foto)

Bate às portas certas

porta2

Para tua conveniência, aqui tens as portas TCP/IP utilizadas pelo NetWeaver Application Server ABAP e pelo Internet Connection Manager (ICM):

 


Serviço Número porta/Nome serviço Por defeito Fixo
Dispatcher 32NN/sapdpNN 3200 x
Gateway 33NN/sapgwNN 3300 x
Gateway 48NN/sapgwNNs 4800 x
ICM HTTP 80NN 8000  
ICM HTTPS 443NN Inactivo  
ICM SMTP 25 Inactivo  
Message Server 36NN/sapmsSID 3600/sapmsC11  
Message Server HTTP 81NN 8100  
Message Server HTTPS 444NN Inactivo  
Central System Log UDP: 12NN, 13NN, 14NN, 15NN Inactivo  

Para saberes mais consulta este documento da SAP.

O Abapinho saúda-vos.

ABAP Ninja

abapninja

Uma das grandes novidades do ERP 6.0 é a Enhancement Framework que é uma espécie de “amigo do senhorio” que permite dar marteladas em todas as paredes do SAP sem escavacar a pintura. Infelizmente ainda há muito pouca documentação sobre isto e é sempre o cabo dos trabalhos para encontrar o Enhancement Point adequado à martelada desejada.

O site ABAP Ninja tenta ajudar. É um motor de pesquisa de Enhancements. Dizem que têm mais de 13.000 Enhancement Points à espera que alguém os encontre.

Experimentem, caros leitores, e se vos for útil façam-nos saber.

O Abapinho saúda-vos.

Santo Isidoro de Sevilha

santo_isidoro

Não sabes a quem rogar as tuas preces nos momentos de desespero? Já podes ficar descansado. Os programadores têm um santo. Santo Isidoro de Sevilha.

Um senhor muito culto e inteligente que respirou o ar espanhol dos séculos VI e VII que, como diz a Wikipédia, “escreveu sobre matemática, astronomia, medicina, anatomia humana, zoologia, geografia, meteorologia, geologia, mineralogia, botânica e agricultura, não acrescentando nada de inovador ou original, não realizou qualquer experiência, não fez novas observações ou reinterpretações e não descobriu nada, mas a influência na Idade média e no Renascimento foi grande”.

A Internet também passa mais tempo a copiar e compilar do que a inventar propriamente por isso é compreensível que além de apadroar os programadores, o velho Isidoro também acumule o cargo de padroeiro da Internet.

Aqui está ele em forma de estátua:

Não sendo crente, não farei usufruto. Mas é curioso à mesma.

O Abapinho saúda-vos.

LOOP FROM INDEX

norias

É muito fácil meter os pés pelas mãos no que toca a performance quando se manipula tabelas internas. Principalmente quando elas são assim a tender para o grandalhonas. É até comum que estes problemas só surjam passados uns meses, quando as tabelas tendem a crescer com o tempo.

Por exemplo, quando fazes loop a duas tabelas, uma de cabeçalhos e outra de itens, fazes assim?


LOOP AT itab1 ASSIGNING <fs1>.
   LOOP AT itab2 ASSGNING <fs2> WHERE field1 = <fs1>-field1.
   ENDLOOP.
ENDLOOP.

Sabias que, para tabelas grandes, isto pode demorar séculos porque o LOOP WHERE corresponde a fazer uma leitura sequencial da itab2 para cada entrada da itab1?

Porque é que não fazes antes assim?


SORT itab2 BY field1.

LOOP AT itab1 ASSIGNING <fs1>.

   READ itab2 WITH KEY field1 = <fs1>-field1
      BINARY SEARCH TRANSPORTING NO FIELDS.
   CHECK SY-SUBRC = 0.
   lv_tabix = sy-tabix.       

   LOOP AT itab2 FROM lv_tabix ASSIGNING <fs2>.
      IF <fs2>-field1 <> <fs1>-field1.
         EXIT.
      ENDIF.
   ENDLOOP.

ENDLOOP.

É que a diferença é da noite para o dia em termos de performance. Tanto maior quanto mais dados tiver a itab2.

Esta vantagem do LOOP FROM INDEX também pode ser conseguida se, em vez de tabelas internas normais, se usar uma SORTED TABLE. Mas isso fica para um próximo artigo.

Obrigado ao Bruno Filipa por esta dica.

O Abapinho saúda-vos.

Indicador de progresso

hourglass_icon

Sabes aquelas barras de progresso que vão indicando quanto falta para terminar um processo? Aquelas que às vezes quando chegam ao fim voltam ao princípio e te deixam frustrado e baralhado sem entender para que servem afinal? Eis como as podes usar num programa ABAP.


DATA: lv_texto TYPE char40,
      lv_valor type i.

DO 10 TIMES.

  WAIT UP TO 1 SECONDS.

  CLEAR lv_texto.
  lv_valor = sy-index * 10.
  lv_texto(3) = lv_valor.
  CONCATENATE lv_texto '%!' INTO lv_texto.
  CONCATENATE 'Já só falta' lv_texto INTO lv_texto SEPARATED BY space.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = lv_valor
      text       = lv_texto.

ENDDO.

Nota que o cronómetro vai ficando preenchido. Infelizmente o comando WAIT UP TO N SECONDS está limitado a inteiros e por isso não sei como se pode fazer uma contagem mais rápida. Mas já é melhor que nada.

E atenção ao comando WAIT porque faz um COMMIT à base de dados.

O Abapinho saúda-vos.

Executa um comando no teu computador

dir

Imagina que queres executar um programa no teu PC a partir de um programa ABAP. Não sei porque carga de água quererás tu fazer isto mas ok, se queres mesmo fazer, é assim:


DATA: i_returncode TYPE i.
CALL FUNCTION 'GUI_EXEC'
  EXPORTING
    command    = 'Notepad.exe'
    parameter  = 'eu_sou_um_texto.txt'
  IMPORTING
    returncode = i_returncode.

É provável que dê para fazer coisas boas com isto. Mas está à vista a grande javardice que se pode fazer por isso pensa bem antes de começares para aí a escangalhar os computadores dos utilizadores todos. Mantém-te do lado do bem se fazes favor.

O Abapinho saúda-vos.

Actualização: ver alternativa mais actual no comentário de Carlos Valentini.

SAT – A nova ferramenta de análise de execução

peclise

Desde pequenino que uso a transacção SE30 para duas coisas diferentes:

  • Analisar um programa que desconheço (normalmente standard) para saber que funções usa, que BADIs disponibiliza, etc;
  • Analisar um programa meu em busca de problemas de performance.

A verdade, nua e crua, é que a transacção SE30 é uma porcaria pegada. Extremamente limitada e inflexível, não dá jeito nenhum para qualquer análise mais complexa.

Aparentemente os senhores da SAP concordam e resolveram substitui-la pela fantástica nova ferramenta SAT – ABAP Runtime Analysis, em tudo mais sofisticada. Pode ser acedida, como seria de esperar, através da transacção SAT.

Se ainda não existir no teu sistema, terás de esperar por um upgrade. Se já existir, boas investigações.

Aqui está um conjunto de screencasts da SAP a ensinar a usar a nova SAT.

O Abapinho saúda-vos.

Como encavalitar tabelas

Encavalitar

Às vezes temos de criar uma tabela Z. Às vezes temos até de criar várias tabelas Z. Às vezes estas tabelas estão relacionadas de alguma forma. Como quando uma contém dados de cabeçalho e a outra dados de item, por exemplo. Ora se estão relacionadas pode dar jeito que sejam editadas em conjunto. É para isso que servem os Clusters de Visão (view cluster).

Ler o resto do artigo »

As estruturas PRE-a-porter

pre-a-porter

Quantas vezes não é necessária uma pequena estrutura para guardar, por exemplo, uma lista que relacione materiais e centros. Mas perder tempo a inventar a roda é sempre de evitar.

No reino do MM há uma pequena família de estruturas que uso amiúde: são elas as PRE*, uma série de estruturas que vai desde a PRE01 à PRE50, com uns saltos pelo meio. Embora sejam, na sua maioria, específicas demais para servirem algum propósito, há algumas úteis. Eis uma dúzia:

PRE01: MATNR, WERKS
PRE03: MATNR
PRE05: MATNR, WERKS, LGORT, CHARG
PRE07: MATNR, LGNUM, WERKS
PRE08: MATNR, WERKS, LGORT
PRE10: MATNR, VKORG, VTWEG
PRE11: MATNR, MEINH
PRE12: MATNR, LGNUM
PRE15: WERKS
PRE23: MATNR, VKORG, VTWEG, WERKS
PRE24: MATNR, MTART, MATKL
PRE28: EAN11

O Abapinho saúda-vos.

A Ressurreição de um programa

aquiles

Batendo impetuoso com seus braços no peito,
o famoso guerreiro gritava desesperado:
“Oh meu Zeus! Apaguei um grande programa,
um programa precioso, feito de bronze,
forjado por vós deuses no próprio Olimpo.
Que será de mim quando isto for descoberto!
Oh, ignomínia! Oh, funesto infortúnio!
Zeus pai, não te enfureças com tal revés,
Se és mesmo meu pai, acode-me ao invés.”

Assim falou; e Zeus compadeceu-se dele que chorava,
garantindo que seu programa se salvaria e não pereceria.
Logo enviou uma águia, mais seguro dos alados portentos.
Quando o guerreiro viu que da parte de Zeus viera a ave,
acalmou-se e viu que seus pés lhe traziam uma mensagem.

“Do nada criarás um programa novo, jovem e virgem,
e farás que tenha exactamente o mesmo nome que o
desventurado programa que tu, infeliz, apagaste.
Criado o programa, entrarás nele ainda oco e vazio e
seguirás pela vereda de menus que agora te é indicada:
Utilitários -> Versões -> Administração de versões,
e verás, pobre mortal, que as várias vidas passadas
do programa que equivocado em peleja assassinaste,
ainda lá estão, entregues ao sono. Aguardam que tu
escolhas uma que, qual Fénix alado, das cinzas,
renascerá e tornará a brilhar no mundo dos vivos.”

O guerreiro restitui a vida ao falecido programa e
logo oferece uma hecatombe a Zeus seu pai,
agradecendo-lhe a preciosa ajuda divina,
podendo assim seguir descansado sua vidinha.

Nota: esta dica não se aplica só a programas mas a todos os objectos que continham versões anteriores antes de serem apagados.

Imprimir para PDF local

pdf

Receita rápida:

Manda-se imprimir o que se quer, dizendo ao SAP para guardar a ordem de impressão no spool e não a imprimir imediatamente. Reserva-se o número da ordem de impressão num recipiente à parte.

A seguir, corre-se o programa RSTXPDFT4, junta-se-lhe o número da ordem de impressão, mistura-se bem e executa-se o dito.

Por fim escolhe-se onde, no computador local, se quer desenformar o ficheiro PDF com o conteúdo da ordem de impressão.

Servir imediatamente.

O Abapinho saúda-vos.


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).