O Conhecimento

O conhecimento é inútil a menos que você o compartilhe.

Mostrando postagens com marcador ABAP. Mostrar todas as postagens
Mostrando postagens com marcador ABAP. Mostrar todas as postagens

terça-feira, 31 de março de 2015

Dar um tapinha no SAP........Função RSDU_EXEC_SQL

É necessário aquela alteração, mas o ambiente não permite que se faça da maneira correta...por centenas de milhares de motivos já bem conhecidos....dai você precisar atualiza aquele campo.....????

Como fazer???

Eis a solução dos seus problemas.......

SE37 – módulo de função RSDU_EXEC_SQL


quarta-feira, 11 de fevereiro de 2015

Vários ALV's dentro do mesmo spool.....

Funções que colocam vários alv's no mesmo spool....funciona que é uma beleza.......


  • REUSE_ALV_BLOCK_LIST_INIT
  • REUSE_ALV_BLOCK_LIST_APPEND
  • REUSE_ALV_BLOCK_LIST_DISPLAY

segue a font.....
link : http://www.saptechnical.com/Tutorials/ALV/BlockedList/DemoPrg.htm

terça-feira, 23 de dezembro de 2014

Objeto de Bloqueio

Coisinha bobinha mas que toma um tempo quando não funciona direito......

Objeto de Bloqueio com parâmetro errado pode causar uma dor de cabeça se não estiver feito a chamada de acordo com a sua necessidade....segue....

Atentar parâmetro _scope

CALL FUNCTION 'ENQUEUE_EZTBCO0029'
    
EXPORTING
      repid          
sy-repid
      _scope         
'1'
    
EXCEPTIONS
      foreign_lock   
1
      system_failure 
2
      
OTHERS         3.
  
IF sy-subrc <> 0.
* Implement suitable error handling here
    
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  
ENDIF.

segue a fonte: http://scn.sap.com/thread/1974118 / http://scn.sap.com/thread/346975

If you have _SCOPE = 1 you can have a COMMIT WORK after each update (or one COMMIT after both updates) and have to DEQUEUE it afterwards; if _SCOPE is 2 or 3 a COMMIT WORK automatically dequeues the lock and in this case you need no DEQUEUE fm before COMMIT WORK.

-----------------------------------------------------------------------------------------------------------------------------------------------------------
Mais uma opção.....

fiunção: ENQUEUE_EGMSPPROGRAM

* Chama função de bloqueio de programa
  call function 'ENQUEUE_EGMSPPROGRAM'
    exporting
*     MODE_GMSPPROGRAM       = 'E'
*     CLIENT                 = SY-MANDT
      sponsored_prog         pi_program
*     X_SPONSORED_PROG       = ' '
*     _SCOPE                 = '2'
*     _WAIT                  = ' '
*     _COLLECT               = ' '
    exceptions
      foreign_lock           1
      system_failure         2
      others                 3.

quarta-feira, 3 de setembro de 2014

Como debugar um JOB em ABAP?



"como fazer para o programa rodar exatamente como se tivesse sido iniciado por um JOB?"

Resumindo bem, se o programa funciona bem em dialog, mas no job apresenta um comportamento diferente ou mesmo com erro, então temos que "DEBUGAR" o job .

Como FAZER então????

Simples, ir na transação SM37 e localize o JOB que apresenta erro selecione o JOB na lista e digite JDBG na caixa de comando.

Dai é dado o oinicio do processo de job, com o debug acoplado, e booooaaaaa!!!!!


fonte:
Muito boa a dica que veio do link : http://lucattelli.com/sap/2012/07/como-debugar-um-job-em-abap/ 

quinta-feira, 31 de julho de 2014

Como restringir número de usuários executando um Report?

Acho que não é possível fazer esse tipo de restrição/limite de quantos usuários podem executar simultaneamente um report, mas podemos dar um LOCK na execução do report.....funciona que é uma beleza.

Para isso usamos para bloquear:

call function 'ENQUEUE_ESFUNCTION'
    
exporting
      mode_tfdir     
'E'
      funcname       
'ZCOR00010'
      x_funcname     
' '
      _scope         
'2'
      _wait          
' '
      _collect       
' '
    
exceptions
      foreign_lock   
1
      system_failure 
2
      
others         3.
  
if sy-subrc <> 0.
* Implement suitable error handling here
    
message e000(suwith 'Programa já em execução.' .
    
stop.
  
endif.

 Para isso usamos para desbloquear:

call function 'DEQUEUE_ESFUNCTION'
    
exporting
      mode_tfdir 
'E'
      funcname   
'ZCOR00010'
      x_funcname 
' '
      _scope     
'3'
      _synchron  
' '
      _collect   
' '.

font:http://scn.sap.com/thread/1909186

----------------------------------------------------------------------------------------------------

mais uma opção

função: ENQUEUE_EGMSPPROGRAM

* Chama função de bloqueio de programa
  call function 'ENQUEUE_EGMSPPROGRAM'
    exporting
*     MODE_GMSPPROGRAM       = 'E'
*     CLIENT                 = SY-MANDT
      sponsored_prog         pi_program
*     X_SPONSORED_PROG       = ' '
*     _SCOPE                 = '2'
*     _WAIT                  = ' '
*     _COLLECT               = ' '
    exceptions
      foreign_lock           1
      system_failure         2
      others                 3.

terça-feira, 29 de julho de 2014

LIST_FROM_MEMORY

Sofrer pra que......

Quando quiser dar um print em uma lista (qualquer) nada melhor que exportar para a memória e depois exibir.....
 Na t-code RERAPP (módulo RE - Real State Management, gerenciamento da carteira de imóveis de uma empresa) SAP_RE mais um módulo do infinito mundo SAP.

A coisa é bruta....kkkkkk

vamos ao código:

*&---------------------------------------------------------------------*
*&      Form  SUBMIT_RERAPP
*&---------------------------------------------------------------------*
form submit_rerapp .
  
refresh s_venc.
  
clearwa_venc.


  wa_venc
-option c_le.
  wa_venc
-sign c_i.
  wa_venc
-low last_day_of_month.
  
append wa_venc to s_venc.

  
submit rfrerapp exporting list to memory
    
with s_bukrs     in s_empr
    
with s_recnnr    in s_contr
    
with p_usesid    eq space
    
with p_month     eq mes
    
with p_year      eq ano
    
with s_duedt     in s_venc
    
with p_hdtxt     eq hdtxt "lv_header_txt
    
with p_pdate     eq p_ldate
    
with p_ddate     eq p_ddate
    
with p_period    eq mes "p_data+4(2)
    
with p_pmode     eq pmode
    
and return.
* Recupera o Log do processamento da RERAPP
  
call function 'LIST_FROM_MEMORY'
    
tables
      listobject 
ls_abaplist
    
exceptions
      not_found  
1
      
others     2.
  
if sy-subrc <> 0.
    
message w208(00with text-014.
  
endif.
* Exibe na tela o Log do processamento da RERAPP
  
call function 'WRITE_LIST'
    
exporting
      write_only 
'X'
    
tables
      listobject 
ls_abaplist
    
exceptions
      empty_list 
1
      
others     2.
  
if sy-subrc <> 0.
    
message w208(00with text-014.
  
endif.
endform.                    SUBMIT_RERAPP




sexta-feira, 25 de abril de 2014

REPORT RS_ABAP_SOURCE_SCAN

Report de procura string em objetos z e y no abap....... RS_ABAP_SOURCE_SCAN estilo EWK1 ...fica a dica.....abs.

E mais uma opção de busca a transação CODE_SCANNER

imagem EWK1 e CODE_SCANNER







terça-feira, 3 de dezembro de 2013

Componentes tabela interna em tempo de execução (How to get Internal Table Components at runtime)

Estava precisando para uma demanda, o nome dos campos de uma tabela interna em tempo de execução  e achei essa codificação a mais completa e simples para ser usada......com um resultado bem satisfatório.....

font: http://abap-explorer.blogspot.com.br/2010/01/how-to-get-internal-table-components-at.html

segue o código......

*&---------------------------------------------------------------------*
*& Report  ZTEST_INTERNAL_TAB_COMP
*&
*&---------------------------------------------------------------------*
*&***********DEMO Code for http://abap-explorer.blogspot.com/***********
*&
*&---------------------------------------------------------------------*
 report  ztest_internal_tab_comp line-size 100.type-pools: abap.
 *Declare the type of the internal table
types: begin of x_final,
 matnr type matnr,
 werks type werks_d,
 flag type c length 1,
 value type p length 10 decimals 2,end of x_final.
 data:*The Internal table whose components are to found
i_data type sorted table of x_final with unique key matnr,*Table to hold the components
tab_return type abap_compdescr_tab,*Work area for the component table
components like line of tab_return.
 *Call Perform to get the Int. Table Components
perform get_int_table_fields using    i_data
                            changing  tab_return.*Display Components
loop at tab_return into components.
  write: / components-name,  components-type_kind,
           components-length,components-decimals.endloop.
 
 
 
 *&---------------------------------------------------------------------*
*&      Form  get_int_table_fields
*&---------------------------------------------------------------------*
*       Get the Components of an internal table
*----------------------------------------------------------------------*
*      -->T_DATA     text
*      -->T_RETURN   text
*----------------------------------------------------------------------*
form get_int_table_fields  using    t_data type any table
                           changing t_return type abap_compdescr_tab.
 
  data:
  oref_table type ref to cl_abap_tabledescr,
  oref_struc type ref to cl_abap_structdescr,
  oref_error type ref to cx_root,
  text type string.*Get the description of data object type
  try.
      oref_table ?=
      cl_abap_tabledescr=>describe_by_data( t_data ).
    catch cx_root into oref_error.
      text = oref_error->get_text( ).
      write: / text.
      exit.
  endtry.*Get the line type
  try.
      oref_struc ?= oref_table->get_table_line_type( ).
    catch cx_root into oref_error.
      text = oref_error->get_text( ).
      write: / text.
      exit.
  endtry.
 
  append lines of oref_struc->components to t_return.
 endform.                    " GET_INT_TABLE_FIELDS


quarta-feira, 23 de outubro de 2013

Brincando com o Android......

Muito bakana esse mundo Android, principalmente a velocidade com o conhecimento sobre mobile vem acelerando as coisas..o mercado ...é a tecnologia sempre gerando demanda....

Dai....vem um desafio enviar mensagem (Push Notification via Android), aquelas mensagens que você recebe no seu celular na barra de notificação aquela onde te mostra o sinal do celular, o consumo da bateria, se chegou mensagem, ligação perdida, etc...etc...etc...

Bom, todas as plataformas, pelo que li, possuem esse tipo de serviço, mas aqui no caso só abordei a Android, porque para testar as outras teria que ter os devices próprios e também escrever uma aplicação para cada......Apesar de alguns frameworks como phonegap/cordova/aerogear dentre outros prometeram uma aplicação hibrida, ou seja, com javascript e html5, a aplicação funcione em todas as plataformas. (não acredito muito nessa mágica, mas também não desacredito)

Existem dezenas de server de terceiros que fornecem códigos exemplos dentre outros benefícios para que você (sua aplicação) use seu serviço e pague uma merreca por ele, neste caso o escolhido e o que funcionou foi o pushbots.com.

Para o envia das mensagens escolhemos a REST, comunicação simples e fácil via HTTP, para isso usamos uma app para o CHROME chamada Advanced REST Client, de uma conta no google e habilitação da API / serviço Google Cloud Messaging for Android, e claro de uma conta no server pushbots.com.

Não entrarei em detalhes aqui sobre a criação/habilitação do serviço no google, nem detalhes sobre o pushbots, a ideia é repassar o conhecimento sobre como funciona o mecanismo de envio de push notification.

Vamos aos passos:

1) Habilitar serviço/API no Google (a apple também possui a dela)




2) Criar uma conta no server pushbots.com



3)Baixar o modelo de projeto para android do site pushbots.com e realizar as respectivas alterações, salvar a aplicação no eclipse e mandar a app para seu device android.


ps: apaguei as referencia sobre projetos e outras chaves senão vira festa.....

Vamos ao funcionamento, até agora foi só o preparo para a coisa funcionar, longe de ser algo profissional, mas sim um curioso para matar a curiosidade de saber como as coisas funcionam.

1) Instalar a aplicação no seu android....tai um display da aplkicação no celular, o robo verde BugDroid  (pushbots). O que a aplicação faz, resgitra seu device no pushbots para recebimento de mensagens (Push Notifications)




 Depois do registro efetivado, não quer dizer que todo device android vai ser registrado, por algum motivo alguns não foram, porque?? nem procurei saber, talvez um antivirus no celular, ou problema de versão sei lá, isso agora não vem ao caso.

2) Envio das mensagens via REST, simplicidade em pessoa, assim eu defino o REST, sem complicação de XML, nem nada.....é o que o mundo de troca de informação precisava....alias ele já tinha só eu que ainda não conhecia....rsssss





3) só verificar a mensagem no device.......tai as imagens que não me deixam mentir...... Obrigado ao Leo Benedeti, pelo envio de tela.....e de me ajudar como cobaia das minhas experiencias.....valeu Leo!!!!1


detalhe dos dois robozinhos verdes no alto, na barra de notificação do android.....Abaixo a notificação........



Longe de ser algo profissional, não foi este o proposito, até que para isso devo percorrer ainda um longo trajeto para suportar uma aplicação robusta.]

Mas fica a ideia, de uma nova maneira de se comunicar com os empregados de uma empresa, com os diretores, CLIENTES.....etc...etc....o que a imaginação mandar....basta ter a ideia e implementar....

O que fala internet HTTP, fala REST, então o céu é o limite........


abs.

quinta-feira, 19 de setembro de 2013

BAPI_GOODSMVT_CREATE - O Básico

Mais uma (dentre milhares) de BAPI para a coleção.......

BAPI_GOODSMVT_CREATE


segue exemplo de uso para criação de documentos MM......

**********************************************************************
* BAPI - BAPI_GOODSMVT_CREATE
**********************************************************************

DATAwa_goodhdr        LIKE bapi2017_gm_head_01,
      wa_goodcod        LIKE bapi2017_gm_code,
      it_gooditem       TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
      it_return         TYPE TABLE OF bapiret2   WITH HEADER LINE,
      goodsmvt_headret  LIKE bapi2017_gm_head_ret,
      materialdocument  TYPE bapi2017_gm_head_ret-mat_doc,
      matdocumentyear    TYPE bapi2017_gm_head_ret-doc_year.



*** Preenchendo estrutura de cabeçalho
  wa_goodhdr-pstng_date sy-datum.
  wa_goodhdr-doc_date   sy-datum.
  wa_goodhdr-pr_uname   sy-uname.
  wa_goodhdr-header_txt 'MOVIMENTO'.

***

  wa_goodcod-gm_code '04'.   "MB1B


***** transações possiveis.....e seus cosdigos.....






 CLEARit_gooditem.

    it_gooditem-material    "Nº do material
    it_gooditem-plant       "Centro
    it_gooditem-stge_loc    "Depósito origem
    it_gooditem-move_type  '311'"Tipo de movimento (administração de estoques)
    it_gooditem-entry_qnt  = "QUANTIDADE
    it_gooditem-item_text  'Movimento'.
    it_gooditem-move_stloc = "Depósito destino
    APPEND it_gooditem.



REFRESHit_return.

  CLEARmaterialdocument,matdocumentyear.

  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header  wa_goodhdr
      goodsmvt_code    wa_goodcod
      testrun          ' '
    IMPORTING
      materialdocument materialdocument " retorno documento
      matdocumentyear  matdocumentyear" retorno ano documento
    TABLES
      goodsmvt_item    it_gooditem
      return           it_return.

  READ TABLE it_return WITH KEY type 'E'.

  IF sy-subrc 0."erro encontrado
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBAC
K'.
ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
  ENDIF.


BASICÃO DEMAIS DA CONTA..........ABS.

segunda-feira, 16 de setembro de 2013

Copia de Pacote.......

OOOOPPPPPAAAAA..............

Você no final de uma grande implementação Z, com um grande pacote Z, com diversas coisinhas bakanas...visão, tabelas, elementos de dados , dominios, programas, etc.....dai....não sabe copiar.....vai então umas dicas......( ainda não testadas 100%, falta o ambiente para importar......kkkkk)

Lógico, um Basis (ou outro sapense) pode ler e dizer, cara tem um jeito muito mais fácil de transportar isso, bom pode até ter, mas esse foi o que arquitetei, aparentemente funciona, sem muita intervenção via Basis.

Vamos as dicas:

Programa para gerar request a partir de um pacote: RSWBO060

programa para salvar programas  = REPTRAN

programa para salvar em .MDB = RIACCESS

transação AL11 para ver o caminho do servidor dev.

Liberar a request antes de copiar os arquivos.

Diretório onde fica as request, geralmente:  DIR_TRANS

Request geram, dois arquivos, geralmente:
\usr\sap\tras\cofilese
\usr\sap\tras\data

ECDK905778

nesse caro vai ter um arquivo \usr\sap\tras\cofiles\K905778.ECD
e outro no \usr\sap\tras\data\R905778.ECD

transação para copiar o arquivo = CG3Y

deposi entrar no QAS e deletar a request da fila.

terça-feira, 3 de setembro de 2013

Um report, duas (ou mais) transações diferentes, com telas diferentes.....

Fácil....fácil.....vamos ao código que é melhor do que ficar escrevendo e explicando...as vezes é mais pratico ver.....

SELECTION-SCREEN BEGIN OF SCREEN 4000.
SELECTION-SCREENBEGIN OF BLOCK WITH FRAME TITLE text-001.
PARAMETERSp_locald LIKE zotd_carga-codlocalsaida.
SELECTION-SCREENEND OF BLOCK 1.
SELECTION-SCREEN END OF SCREEN 4000.


SELECTION-SCREEN BEGIN OF SCREEN 5000.
PARAMETERSp_cargap(5)  TYPE c.
SELECTION-SCREEN END OF SCREEN 5000.


Veja as linhas em AZUL.....(corzinha fesca, gosto de preto e branco...rs.....GALOOOO!!!!) foram criadas as duas screen, agora para fazer a chamada é incluir as linhas abaixo no INITIALIZATION.

IF sy-tcode 'ZSDR050'.
    CALL SELECTION-SCREEN 5000.
  ELSE.
    CALL SELECTION-SCREEN 4000.
  ENDIF.



PRONTIUM......funciona que é uma beleza........



fonte:http://scn.sap.com/thread/111698




 
Blogger Templates