sexta-feira, 29 de novembro de 2013

Search Help com valores do texto do dominio e não o valor do código - Utilizando EXIT

Situação: Criado um search help no qual um dos campos é um dominio com valores, nesse caso aparece o valor do chave do valor e não a descrição.

Objetivo: Ao invés de mostrar a chave mostrar também a descrição da chave.

Comentário: é um negócio bem chato de fazer. Tem que usar a função de exit no search help, e dentro da função vem uma estrutura de linha com os campos do search help concatenados, o que deve ser feito é ver a posição da coluna onde vai ser inserido o texto e colocar o texto no meio, mas aquilo que vc vê nem sempre é o que parece, tentei fazer os cálculos para colocar uma coluna de texto no meio, mas nunca dava certo, até que debuguei e reparei que internamente ele faz uma leitura binária/hexa que distorce a posição que vc acha que é, e tem outro detalhe na primeira vez que vc executa o matchcode a posição vem de um jeito, se nessa mesma tela vc faz uma segunda busca, a posição se altera, nesse caso tem que fazer uma validação para quando for a primeira visualização e outra para as sequências de busca sem fechar a tela.

Enfim.. eu fiz um exemplo e montei um cálculo para colocar o campo no lugar certo.

Criei uma tabela ZTSZK3 com o campo ZSZK_F1 com tipo do elemento de tados ZSZK1_F1 do dominio ZSZK_F1

- Coloque 3 valores para o dominio conforme abaixo
- Criei a ajuda de pesquisa para o campo CODIGO da tabela
- E a função ZFSZK_SH para exit de ajuda de pesquisa que vou explicar mais abaixo.

- E criei um programa para testar o search help que criei. Nesse caso está mostrando o resultado da ajuda de forma standard com o valor do dominio mas sem a descrição.


- A idéia é que eu tenho q modificar a estrutura que o standard monta, modificando o tamanho do campo do dominio e a posição do próximo campo somando o tamanho desse campo que vou modificar.
- Para isso tem q debugar e pegar primeiro os valores standard montado na ajuda de pesquisa.
- Nessa tela abaixo as propriedades de cada campo da estrutura da ajuda

- Abaixo os valores da tabela.





- Então.. que valores pegar ???
- copie os seguinte valores da tabela SHLP-FIEDDESCR, o nome do campo, a posição, o offset e o tamanho da saída (outputlen).

No meu caso ficou da seguinte forma.
- O Valor original é o valor que o standard trouxe na entrada da função,  um detalhe importante é ordenar os campos pela posição senão não dá certo.
- Como tinha dito, tenho 2 momentos no search help,  a primeira é quando clica no matchcode do campo e o segundo depois que a tela da ajuda já está aberta e se deseja fazer um filtro em cima dos valores apresentados. Eu separei abaixo como "VALOR NA PRIMEIRA EXECUÇÃO" e "VALOR COM BUSCA NA MESMA TELA".
- Coloquei a coluna OFFSET modificado para mostra o valor que tem q ser modiificado no OFFSET do campo seguinte a minha modificação. No meu caso vou modificar o tamanho de saída do meu camp ZSZK_F1 de 1 para 40, nesse caso eu tenho q modificar o OFFSET do próximo campo para depois do tamanho que quero modificar.
- O cálculo para saber o OFFSET do próximo campo fica assim conforme mostrei na fórmula. Seria o OUTPUTLEN do campo modificado no meu caso 40 + o OFFSET do campo seguinte 14 que é igual a 54 nisso soma-se + 2, que vai dar os 56.
- No caso da segunda busca o mesmo cálculo só que com valores diferentes que vai dar 88.



- E abaixo o código da função. Como é um código na visualização, coloquei um CHECK CALLCONTROL-STEP = 'DISP'.
- Depois eu dou um LOOP nas características de cada campo da estrutura do search help, modificando para o campo ZSZK_F1 o outputlen e o inlen = 40, e para o campo seguinte ERDAT eu coloco o novo OFFSET para 56, observem que tem um IF se o OFFSET for menor que 15, eu considerei que quando é menor que 15 é a primeira chamada e o ELSE a segunda chamada que está com OFFSET 88.
- Tenho também uma variável L_OFFSET_AUX que determina a posição do valor do dominio ZSZK_F1.
- Depois tem o LOOP dos valores da RECORD_TAB que vou alterar.
- Utilizo a função DOMAIN_VALUE_GET para pegar a descrição do dominio.
- Basicamente essa lógica pega a parte da linha do começo até o valor do dominio e inclui o texto e coloca o resto do texto na frente.

FUNCTION ZFSZK_SH.
*"----------------------------------------------------------------------
*"*"Interface local:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------

  DATA: ls_fielddescr TYPE dfies, "loc str for shlp-fielddescr
        ls_selopt TYPE ddshselopt.  "loc str for shlp-selopt
*Local structure for itab record_tab
  DATA: BEGIN OF ls_record.
          INCLUDE STRUCTURE seahlpres.
  DATA: END OF ls_record.

  DATA: ls_start TYPE string,
        ls_end TYPE string.

  DATA: l_ddtext TYPE dd07v-ddtext,
        l_domvalue TYPE dd07v-domvalue_l,
        l_offset TYPE i,
        l_offset_aux TYPE i.

  CHECK callcontrol-step = 'DISP'.

  CLEAR l_offset.

  LOOP AT shlp-fielddescr INTO ls_fielddescr.

    CASE ls_fielddescr-fieldname.
      WHEN 'ZSZK_F1'.
        ls_fielddescr-intlen = ls_fielddescr-outputlen = 40.
        MODIFY shlp-fielddescr FROM ls_fielddescr INDEX sy-tabix.
      WHEN 'ERDAT'.
        IF ls_fielddescr-offset < 15.

                        l_offset_aux = 6.
          ls_fielddescr-offset = 56.
        ELSE.

          l_offset_aux = 3.
          ls_fielddescr-offset = 88.
        ENDIF.

        MODIFY shlp-fielddescr FROM ls_fielddescr INDEX sy-tabix.
    ENDCASE.

  ENDLOOP.

 

  LOOP AT record_tab INTO ls_record.
    l_offset = l_offset_aux.

    l_domvalue = ls_record-string+l_offset(1).

    CALL FUNCTION 'DOMAIN_VALUE_GET'
      EXPORTING
        i_domname  = 'ZSZK_F1'
        i_domvalue = l_domvalue
      IMPORTING
        e_ddtext   = l_ddtext
      EXCEPTIONS
        not_exist  = 1
        OTHERS     = 2.

    IF sy-subrc <> 0.
      CLEAR l_ddtext.
    ENDIF.

    ADD 1 TO l_offset.
    ls_start = ls_record-string+0(l_offset).
    ls_end = ls_record-string+l_offset(*).
    CLEAR: ls_record-string.
    ls_record-string+0(l_offset) = ls_start.
    IF l_ddtext IS NOT INITIAL.
      ls_record-string+l_offset(1) = '-'.
    ENDIF.
    ADD 1 TO l_offset.
    ls_record-string+l_offset(20) = l_ddtext(20).
    ADD 20 TO l_offset.
    ls_record-string+l_offset(*) = ls_end.
    MODIFY record_tab FROM ls_record.
    CLEAR: ls_record,ls_start,ls_end.

  ENDLOOP.

ENDFUNCTION.


Resultado das 2 telas.
 - Primeira chamada da ajuda


- Tela de filtro da ajuda de pesquisa 

Nenhum comentário:

Postar um comentário