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