"

É meu, só meu e de mais ninguém

cadeado

Imagina que estás a trabalhar num sistema partilhado por muitos outros utilizadores que não conheces. Como no IDESACCESS por exemplo. Nada impede que, por distracção ou perfídia, algum desses outros utilizadores altere ou mesmo apague os teus programas.

Na SE38, nas características técnicas do programa, existe um pisco chamado “Bloqueio do editor” que, se o activares, só tu próprio passarás a poder modificá-lo.

O Abapinho saúda-vos.

Was ist ABAP?

pensador_rodin

Mas afinal o que é que quer dizer ABAP?

  • Em 1970 chamaram-lhe ABAP que queria dizer “Allgemeiner Berichts-Aufbereitungs-Prozessor”, ou em português “Processador de geração de reports genéricos”.
  • Em 1990 mudaram-lhe o nome para ABAP/4 e disseram que afinal queria dizer “Advanced Business Application Programming”, ou em português “Programação avançada para aplicações de negócio”.
  • Em 2000 largam o /4 e tornaram a chamar-lhe só ABAP e é o que ainda lhe chamam agora.
  • Estamos em 2010. Já era altura de lhe inventarem um novo significado.

O Abapinho saúda-vos.

Import/Export = Contrabando

Contrabando

O Java, uma linguagem de programação bem pensada, ajuda o programador a organizar o seu código obrigando-o a desenvolvê-lo de forma estruturada. A sua própria filosofia potencia o pensamento estruturado e promove coerência e arrumação.

Já o ABAP… promove o caos. Está cheio de caminhos perniciosos que levam direitinho a um inferno confuso e labiríntico. E geralmente são as coisas aparentemente mais convenientes que se revelam as mais perigosas.

Uma das conveniências piores é a parelha IMPORT e EXPORT.

Ler o resto do artigo »

Mensagens entre utilizadores

Selo 1892 Moçambique

Muitas vezes precisamos de aceder aos dados de uma tabela através da SM30 ou a um qualquer documento e esbarramos com uma mensagem a dizer que os dados estão bloqueados por outro utilizador.

Há várias hipóteses:

  1. Ter muita paciência e esperar;
  2. Ter bastante paciência, enviar uma mensagem do SAPOffice e esperar que um dia o utilizador a vá ver;
  3. Ter alguma paciência, enviar um e-mail e esperar;
  4. Ser impaciente, ir ter com o outro e pedir-lhe para por favor sair dali;
  5. Ser impaciente e cruel e mandar abaixo a sessão do outro sem dizer água vai;
  6. Ser esperto e enviar uma mensagem de sistema pelo SAP Gui. Segue a explicação:

Primeiro há que identificar o utilizador, o que é fácil visto ele vir geralmente identificado na mensagem que avisa do bloqueio.

Depois é ir à transacção SE37 e executar a função TH_POPUP.

Preenche-se os seguintes campos:

  • CLIENT – é o mandante
  • USER – o utilizador destinatário
  • MESSAGE – o texto da mensagem

O resto deixa-se como está. Executa-se a função com F8 e já está: o utilizador é imediatamente confrontado com o seguinte popup:

Nota: Em rigor, através do SAPOffice é também possível enviar mensagens expresso que, quando enviadas, notificam imediatamente o utilizador. Mas este recebe apenas um aviso de que tem uma nova mensagem e depois tem de ir ao SAPOffice lê-la. Dá-lhe mais trabalho e há o risco de a ignorar sem a ler.

O Abapinho saúda-vos.

Dá e receberás

etiqueta

Vivia-se o ano do Senhor de 1998. No século XX portanto, quando ainda se trabalhava de gravata. Estava eu com 1 mês de experiência em SAP e pela primeira vez sozinho num cliente, de gravata ao pescoço, num armazém gigante, a fazer formulários de WM e coisas do género ao serviço de um funcional de WM. Certo dia fui directamente abordado por um senhor condutor de um empilhador que me disse que o código identificador na etiqueta das paletes tinha letras muito pequeninas e ele tinha muita dificuldade em lê-lo. O senhor empilhador perguntou-me se eu lhe podia aumentar o tamanho das letras. Situação relativamente irregular visto que tudo o que eu fazia deveria ser pedido pelo tal consultor funcional.

Parecia uma coisa simples e então tomei a iniciativa de tentar ajudá-lo. Afinal acabei por demorar 2 dias porque era uma impressora matricial antiga e tive de obter o seu manual de instruções, descobrir e configurar as sequências de escape no SAP. Mas no fim desses 2 dias, para enorme felicidade do senhor condutor do empilhador, o código começou a aparecer com letras garrafais. Ele, que passava todos os dias 8 horas por dia a transportar paletes, viu a sua qualidade de vida aumentar substancialmente. E até hoje, em quase 12 anos de SAP, esta foi uma das tarefas que me deu mais satisfação fazer, só pela alegria que lhe dei.

Os deuses deviam estar do meu lado porque, quando alguns dias depois fui enviado para um novo cliente, no próprio dia em que cheguei, o chefe desse projecto veio ter comigo e perguntou-me se sabia como é que se aumentava as letras de uma etiqueta, que andavam às voltas com aquilo e ninguém conseguia. Eu, com o ar mais natural e confiante do mundo disse-lhe que sim, que sabia, imprimi e dei-lhe as minhas notas que explicavam detalhadamente os vários passos necessários para fazê-lo, resolvendo-lhe o problema, ficando imediatamente com fama de especialista.

Moral da história: Dá (sempre) e (às vezes) receberás.

O Abapinho saúda-vos.

Procurar uma BADI no palheiro

palha

O SAP é um enorme palheiro. E os ABAPers são pessoas que trepam por esse palheiro acima e nele vasculham e escarafuncham em busca de agulhas de todo o género. Às vezes, desesperados, deitam-se a descansar e vêm uma quantidade enorme de bicharocos que vivem no palheiro fazer-lhes comichão. Para evitar que isso aconteça, o Artur Moreira propõe-nos uma série de diferentes técnicas para procurar BADIs neste grande palheiro que é o SAP.

Ler o resto do artigo »

Enfiar um browser dentro do SAPGui

SAP Internet Explorer

Quem não gosta de uma promiscuidadezita de vez em quando? Até o Abapinho. É por isso que hoje vos sugerimos que se deleitem a enfiar um browser dentro do SAPGui. E para conseguir isso basta correr este programa na SE38: SAPHTML_R3HTTP_DEMO.

Pronto, ficam a saber. E como há clientes para tudo, quem sabe não se encontre aí pelo mundo algum cliente que invente um problema para esta solução.

O Abapinho saúda-vos.

ZTETRIS

tetris

O Abapinho aconselha todos os ABAPers a, pelo sim, pelo não, instalarem o programa ZTETRIS no seu ambiente de desenvolvimento. A versão do Tetris para ABAP é da autoria de Sergey Shumakov.

Quando te fartares de jogar podes sempre investigar como é que o programa faz para ir várias vezes ao servidor sem intervenção do utilizador.

O Abapinho saúda-vos.

ALV Grid Control – Manuais de referência

Azulejos

Os ALVs são poderosos. Mas esse poder vem à custa de alguma complexidade. Além disso, como quase tudo em SAP, funcionam de forma obscura. Aqui ficam dois manuais de referência em PDF. São muito parecidos mas suficientemente diferentes para referir os dois.

Este chama-se BCSRVALV, é da SAP e data de 2001. No site da SAP encontra-se aqui. E aqui também se aprende sobre isto.

este chama-se ALV_Grid_Control, é de 2004 e está assinado por um senhor chamado Serdar ŞİMŞEKLER que diz ser turco.

Ambos ensinam a pintar os ALVs com cores alegres, a torná-los editáveis e interactivos e a fazer uma série de outras coisas boas.

Escolhe o que gostares mais e faz bom proveito.

O Abapinho saúda-vos.

Transportar conteúdo de uma tabela

Caixa de cartão

Fazes assim:

  1. Vais à transacção SE01;
  2. Crias uma nova ordem de workbench;
  3. Editas a lista de objectos;
  4. Adicionas-lhe o objecto R3TR-TABU-[nome_tabela];
  5. Clicas na chave que aparece na coluna a seguir;
  6. Metes um asterisco * na primeira linha;
  7. Gravas a ordem de transporte;
  8. Pedes a quem de direito para a passar para onde te aprouver;
  9. Vais beber um sumo de melão;
  10. Quando voltas, já está.

O Abapinho saúda-vos.

Glossário SAP

Livro antigo

É frequente em SAP cruzarmo-nos com um conceito desconhecido. Às vezes esqueço-me de que há ferramentas disponíveis muito fáceis de consultar. E o glossário SAP é um exemplo disso. Pode ser acedido de várias formas:

  • No próprio SAP: através da transacção STERM;
  • Online: num site da SAP: http://help.sap.com/saphelp_glossary/en/;
  • No nosso computador: usando o programa ABAP GLOS_DOWNLOAD_HTML para fazer download de todo o seu conteúdo.

Tenho a certeza de que, agora que sei onde está, o vou consultar muito mais vezes.

O Abapinho saúda-vos.

Evernote – No anotar é que está o ganho

Evernote

Il faut cultiver notre jardin – Voltaire

No SAP fala-se muito de experiência. Fulano tem muita experiência, sicrano tem pouca experiência. Tenta-se com isso medir a capacidade que alguém tem de usar o seu passado para lidar com o seu futuro. Mas nem sempre ter experimentado uma coisa é sinónimo de ganhar experiência com ela. O exemplo paradigmático ao alcance de todos é o amor: quantos desgraçados, por muitas experiências desgraçadas que tenham tido, se continuam a desgraçar-se no amor! O SAP não é o amor. Ainda assim não nos faltarão exemplos de consultores que no CV descrevem muitas experiências e na prática se revelam uns grandes inexperientes.

A Inteligência terá certamente muito peso nessa capacidade de sublimar as experiências, de as conservar, de fazer delas Compota de Experiência. Mas, pelo menos no que toca ao mirabolante mundo do SAP, quem tem também muito a dizer é a senhora Memória. Ou melhor dizendo, a falta dela.

O mundo do SAP é horizontal e vasto. Para onde quer que se olhe é a perder de vista. E embora seja um mundo bastante populado e onde se viaja muito, não houve até hoje, que eu saiba, cartógrafos de jeito. Os mapas que dele se fizeram são parcos, pobres, distorcidos e normalmente ainda o julgam plano quando toda a gente já sabe há muito tempo que ele é curvo.

Há que cartografar o nosso mapa.

Ler o resto do artigo »

Onde é que eu vi aquilo?

A pesquisa de objectos em ABAP e por todo o SAP é normalmente feita de duas formas: listando objectos de um tipo através de search helps ou procurando objectos em que um determinado objecto é usado, através da opção where used.

Só que às vezes o que buscamos não se trata de um objecto mas sim de uma frase qualquer ou mesmo um comentário que sabemos existir no código mas não fazemos ideia de onde.

Quando é assim pode usar-se o programa RPR_ABAP_SOURCE_SCAN ou, se este não existir, o programa RSRSCAN1. Ambos permitem procurar cadeias de caracteres em todo o código fonte ABAP.

Obrigado a Pedro Lima pela dica.

O Abapinho saúda-vos.

A técnica das Matrioskas

É sabido que quando é necessário fazer uma pequena alteração a uma função standard para a qual não há nenhum tipo de user-exit, o mais normal é fazer uma cópia dela para uma função Z e lá proceder à alteração necessária.

No entanto, quando esta alteração pode ser feita no início ou no final do programa, há uma forma mais elegante de conseguir o mesmo resultado: a técnica das Matrioskas. Criar uma função Z com os mesmos parâmetros que lá dentro invoca a função standard e que, além disso, antes ou depois de a invocar, tem o código para implementar a alteração necessária. Assim evita-se repetir o código que não muda. Menos lixo logo mais ecológico.

Nota 1: Embora nas funções esta solução seja óbvia, não só com elas se pode aplicar a técnica das Matrioskas: aplica-se também a programas, métodos, includes, etc.

Nota 2: Claro que nas últimas versões esta dica é já de utilidade relativa graças ao último grito da moda, os enhancements. Mas mesmo assim pode fazer sentido puxar de uma Matrioska em vez de um enhancement quando, por exemplo, se quer que o programa standard continue a funcionar da forma original.

O Abapinho saúda-vos.

O maravilhoso mundo do Application Log

Uma boa parte dos reports, interfaces ou jobs, têm de produzir algum tipo de relatório. É normal ver isso feito recorrendo ao comando WRITE. Ora nos dias que correm, usar o comando WRITE para isto é como recorrer a um par de pedras para acender uma fogueira. Afinal, porque não usar o Application Log que é muito mais simples e prático e standard e é só vantagens?

Application log

O Application Log é um sistema standard do SAP para guardar logs aplicacionais e é usado por várias transacções standard. Ao utilizá-lo podemos simplificar e uniformizar os logs dos nossos programas. Vamos aprender aqui como é simples usá-lo nos nossos desenvolvimentos.

Ler o resto do artigo »

Macros – Velocidade de ponta

Normalmente quando há um pedaço de código que pretendemos reutilizar várias vezes, transformamo-lo numa sub-rotina que pode depois ser invocada repetidamente. Embora a SAP não saiba estruturar o seu próprio código, ainda assim, o ABAP, coitadinho, permite-o. E até disponibiliza várias alternativas para modularizar o código. Eu conto quatro alternativas que listo aqui, da mais rígida para a mais flácida: METHOD, FUNCTION, FORM, DEFINE. Se os 3 primeiros são já familiar de todos, o último – DEFINE – quase ninguém usa. O DEFINE permite definir macros em ABAP. E o que são macros? São sub-rotinas aparentes.

Aparentes porquê?

Ler o resto do artigo »

Evitar mensagens dinâmicas

Qual é, digam lá, a melhor coisinha que o ABAP tem? É, digo eu, poder fazer where used em cima de tudo o que mexe.

E no entanto, esta maravilhosa funcionalidade só funciona maravilhosamente quando as coisas não são invocadas dinamicamente. Eu uso o where used amiúde para descobrir onde uma determinada mensagem está a ser usada. Ora não é nada incomum encontrar chamadas dinâmicas a mensagens, principalmente em casos onde as mensagens não são enviadas directamente para o utilizador mas sim, por exemplo, para o Application Log. Neste caso é normal encontrar coisas tipo:


PERFORM trata_mensagem1 USING 'E' '056' 'ZSD' a b c.

FORM trata_mensagem1 USING msgty msgno msgid msgv1 msgv2 msgv3 msgv4.
* Aqui podemos gravar num ficheiro ou
* escrever no ecrã ou no application log
* ou o que for preciso.
ENDFORM.

Claro que, por ser dinâmica, esta invocação à mensagem E056 não será encontrada pelo where used.

Sugiro aqui uma alternativa que contém o melhor dos dois mundos. Permite invocar uma mensagem de forma normal (ou seja, não dinâmica e por isso detectável pelo where used) sem ela ir parar ao ecrã, e em seguida fazer com ela o que nos der na real gana:


DATA: dummy.
MESSAGE E056(ZSD) WITH a b c INTO dummy.
PERFORM trata_mensagem2.

FORM trata_mensagem2.
* A única diferença em relação à versão dinâmica é que aqui em
* vez de usar as variáveis "msgty", "msgno", etc. deverá usar-se
* as variáveis de systema SY-*MSGTY, SY-MSGNO, etc.
* o resto é tudo igual.
ENDFORM.

E pronto. Assim se torna o código ao mesmo tempo mais elegante e mais funcional. Dois coelhos com uma só cajadada.

Isto funciona porque quando se faz MESSAGE INTO dummy, o sistema preenche as variáveis do sistema SY-MSGNO, SY-MSGID, etc. com os dados da mensagem, que podem depois ser facilmente usados para o que se quiser.

O Abapinho saúda-vos.

READ TABLE blablabla TRANSPORTING NO FIELDS

Por vezes ao fazer READ TABLE a uma tabela interna queremos apenas verificar se um determinado registo existe, e não nos preocupamos com os dados retornados. Algo tipo:


READ TABLE lt_kna1 INTO wa_kna1 WITH KEY kunnr = l_kunnr.
CHECK SY-SUBRC = 0.

Ora já que a estrutura WA_KNA1 não vai ser necessária de qualquer forma, mais vale não a usar, usando antes a opção TRANSPORTING NO FIELDS:


READ TABLE lt_kna1 TRANSPORTING NO FIELDS WITH KEY kunnr = l_kunnr.
CHECK SY-SUBRC = 0.

O Abapinho saúda-vos.

Pesquisa SAP no Firefox e no Internet Explorer

Quando se faz desenvolvimentos em ABAP, pesquisar na SDN ou nas notas e na documentação da SAP é uma actividade recorrente. Como tal, quanto mais fácil for fazê-lo, melhor. Ideal seria que fazê-lo fosse tão fácil como pesquisar no Google. Ora uns senhores chamados JNYSolutions tornaram isso possível criando plugins de pesquisa para o Firefox e o Internet Explorer que adicionam a SDN, as notas e a documentação da SAP como motores de busca. São fáceis de instalar e fáceis de usar.

Não vou meter aqui os plugins porque não seria longe de roubar o próximo. Meto antes um link para a página onde eles os disponibilizam. Para instalar basta clicar em cima dos links respectivos.

E fica assim:
Pesquisa SAP no Firefox

Quem experimentar, por favor deixe um comentário dizendo se funcionou e se agradou.

O Abapinho saúda-vos.

Verificar pasta

Eis uma função para verificar se uma pasta existe e se nela temos permissões de escrita.


PARAMETERS: p_dir TYPE btctext80 DEFAULT '/usr/sap/trans'.

CALL FUNCTION 'PFL_CHECK_DIRECTORY'
  EXPORTING
    directory = p_dir
    write_check = 'X'
* FILNAME = ' '
  EXCEPTIONS
    pfl_dir_not_exist = 1
    pfl_permission_denied = 2
    pfl_cant_build_dataset_name = 3
    pfl_file_not_exist = 4
    others = 5.

CASE sy-subrc.
  WHEN 0.
    WRITE /: 'Directory:', p_dir, ' exists'.
  WHEN 1.
    WRITE /: 'Directory does not exist:', p_dir.
  WHEN 2.
    WRITE /: 'No permission to write in directory:', p_dir.
ENDCASE.

Obrigado Renato Oliveira.

O Abapinho saúda-vos.


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