on 2019 Aug 23 8:23 PM
Olá,
Estou com um requisito onde existe a necessidade de disponibilizar uma SM30 para algumas tabelas SHADOW do TDF de modo que seja possivel manter os dados das mesmas.
Até aí tudo bem, o problema é que estas tabelas possuem o campo MANDT porém o mesmo faz referência ao campo mandt do sistema de origem dos dados mas as tabelas standard trata o campo como um campo MANDT tradicional, ou seja, como se fosse o campo do mandante do ambiente acessado (TDF neste caso).
Exemplo:
Se o meu ambiente produtivo ECC possui o client '666' e meu TDF possui o client '123' se eu acessar a SM30 de uma tabela SHADOW ao tentar incluir um novo registro ele será automaticamente gerado pelo standard com o client '123' quando o correto seria '666'.
Existe um modo de contornar esta limitação ou será necessário criar um programa 'Z' utilizando o comando CLIENT SPECIFIED para realizar tal manutenção?
Desde já agradeço pela atenção.
Request clarification before answering.
Fabio,
Vi sua questão só hoje, mas já me deparei com esse problema e pra resolver foi criada uma view Z para a tabela standard e os forms GET_DATA, DB_UPD e READ_SINGLE gerados automaticamente para essa view foram editados incluindo a opção CLIENT SPECIFIED no statements SQL.
O inconveniente dessa solução é que se a tabela for alterada incluindo um novo campo por exemplo e esse campo precisar ser tratado na view, a mesma deverá ser regerada e alterada novamente. O ponto forte é que é uma solução rápida que não exige que você crie um programa Z.
No exemplo abaixo criamos a view /VWK/TDFTPSERV para a tabela /TMF/D_IT_TPSERV forçando o mandante '305' .
*---------------------------------------------------------------------*
* view related FORM routines
* generation date: 09.06.2018 at 21:49:39
* view maintenance generator version: #001407#
*---------------------------------------------------------------------*
*...processing: /VWK/TDFTPSERV..................................*
FORM GET_DATA_/VWK/TDFTPSERV.
PERFORM VIM_FILL_WHERETAB.
*.read data from database.............................................*
REFRESH TOTAL.
CLEAR TOTAL.
* Ajuste para tratar somente MANDANTE 305
SELECT * FROM /TMF/D_IT_TPSERV CLIENT SPECIFIED WHERE MANDT = '305' AND
(VIM_WHERETAB) .
CLEAR /VWK/TDFTPSERV .
/VWK/TDFTPSERV-MANDT =
/TMF/D_IT_TPSERV-MANDT .
/VWK/TDFTPSERV-EMPRESA =
/TMF/D_IT_TPSERV-EMPRESA .
/VWK/TDFTPSERV-FILIAL =
/TMF/D_IT_TPSERV-FILIAL .
/VWK/TDFTPSERV-NF_ID =
/TMF/D_IT_TPSERV-NF_ID .
/VWK/TDFTPSERV-TP_SERVICO =
/TMF/D_IT_TPSERV-TP_SERVICO .
/VWK/TDFTPSERV-BASE_IRF =
/TMF/D_IT_TPSERV-BASE_IRF .
/VWK/TDFTPSERV-VLR_IRF =
/TMF/D_IT_TPSERV-VLR_IRF .
/VWK/TDFTPSERV-DT_E_S =
/TMF/D_IT_TPSERV-DT_E_S .
/VWK/TDFTPSERV-VLR_RET_SUB =
/TMF/D_IT_TPSERV-VLR_RET_SUB .
/VWK/TDFTPSERV-VLR_N_RET_PRINC =
/TMF/D_IT_TPSERV-VLR_N_RET_PRINC .
/VWK/TDFTPSERV-VLR_SERVICOS_15 =
/TMF/D_IT_TPSERV-VLR_SERVICOS_15 .
/VWK/TDFTPSERV-VLR_SERVICOS_20 =
/TMF/D_IT_TPSERV-VLR_SERVICOS_20 .
/VWK/TDFTPSERV-VLR_SERVICOS_25 =
/TMF/D_IT_TPSERV-VLR_SERVICOS_25 .
/VWK/TDFTPSERV-VLR_N_RET_ADIC =
/TMF/D_IT_TPSERV-VLR_N_RET_ADIC .
/VWK/TDFTPSERV-MUDAR_IRF =
/TMF/D_IT_TPSERV-MUDAR_IRF .
<VIM_TOTAL_STRUC> = /VWK/TDFTPSERV.
APPEND TOTAL.
ENDSELECT.
SORT TOTAL BY <VIM_XTOTAL_KEY>.
<STATUS>-ALR_SORTED = 'R'.
*.check dynamic selectoptions (not in DDIC)...........................*
IF X_HEADER-SELECTION NE SPACE.
PERFORM CHECK_DYNAMIC_SELECT_OPTIONS.
ELSEIF X_HEADER-DELMDTFLAG NE SPACE.
PERFORM BUILD_MAINKEY_TAB.
ENDIF.
REFRESH EXTRACT.
ENDFORM.
*---------------------------------------------------------------------*
FORM DB_UPD_/VWK/TDFTPSERV .
*.process data base updates/inserts/deletes.........................*
LOOP AT TOTAL.
CHECK <ACTION> NE ORIGINAL.
MOVE <VIM_TOTAL_STRUC> TO /VWK/TDFTPSERV.
IF <ACTION> = UPDATE_GELOESCHT.
<ACTION> = GELOESCHT.
ENDIF.
CASE <ACTION>.
WHEN NEUER_GELOESCHT.
IF STATUS_/VWK/TDFTPSERV-ST_DELETE EQ GELOESCHT.
READ TABLE EXTRACT WITH KEY <VIM_XTOTAL_KEY>.
IF SY-SUBRC EQ 0.
DELETE EXTRACT INDEX SY-TABIX.
ENDIF.
ENDIF.
DELETE TOTAL.
IF X_HEADER-DELMDTFLAG NE SPACE.
PERFORM DELETE_FROM_MAINKEY_TAB.
ENDIF.
WHEN GELOESCHT.
* Ajuste para tratar somente MANDANTE 305
SELECT SINGLE FOR UPDATE * FROM /TMF/D_IT_TPSERV CLIENT SPECIFIED WHERE MANDT = '35' AND
EMPRESA = /VWK/TDFTPSERV-EMPRESA AND
FILIAL = /VWK/TDFTPSERV-FILIAL AND
NF_ID = /VWK/TDFTPSERV-NF_ID AND
TP_SERVICO = /VWK/TDFTPSERV-TP_SERVICO .
IF SY-SUBRC = 0.
* Ajuste para tratar somente MANDANTE 305
DELETE /TMF/D_IT_TPSERV CLIENT SPECIFIED.
ENDIF.
IF STATUS-DELETE EQ GELOESCHT.
READ TABLE EXTRACT WITH KEY <VIM_XTOTAL_KEY> BINARY SEARCH.
DELETE EXTRACT INDEX SY-TABIX.
ENDIF.
DELETE TOTAL.
IF X_HEADER-DELMDTFLAG NE SPACE.
PERFORM DELETE_FROM_MAINKEY_TAB.
ENDIF.
WHEN OTHERS.
* Ajuste para tratar somente MANDANTE 305
SELECT SINGLE FOR UPDATE * FROM /TMF/D_IT_TPSERV CLIENT SPECIFIED WHERE MANDT = '35' AND
EMPRESA = /VWK/TDFTPSERV-EMPRESA AND
FILIAL = /VWK/TDFTPSERV-FILIAL AND
NF_ID = /VWK/TDFTPSERV-NF_ID AND
TP_SERVICO = /VWK/TDFTPSERV-TP_SERVICO .
IF SY-SUBRC <> 0. "insert preprocessing: init WA
CLEAR /TMF/D_IT_TPSERV.
ENDIF.
/TMF/D_IT_TPSERV-MANDT =
/VWK/TDFTPSERV-MANDT .
/TMF/D_IT_TPSERV-EMPRESA =
/VWK/TDFTPSERV-EMPRESA .
/TMF/D_IT_TPSERV-FILIAL =
/VWK/TDFTPSERV-FILIAL .
/TMF/D_IT_TPSERV-NF_ID =
/VWK/TDFTPSERV-NF_ID .
/TMF/D_IT_TPSERV-TP_SERVICO =
/VWK/TDFTPSERV-TP_SERVICO .
/TMF/D_IT_TPSERV-BASE_IRF =
/VWK/TDFTPSERV-BASE_IRF .
/TMF/D_IT_TPSERV-VLR_IRF =
/VWK/TDFTPSERV-VLR_IRF .
/TMF/D_IT_TPSERV-DT_E_S =
/VWK/TDFTPSERV-DT_E_S .
/TMF/D_IT_TPSERV-VLR_RET_SUB =
/VWK/TDFTPSERV-VLR_RET_SUB .
/TMF/D_IT_TPSERV-VLR_N_RET_PRINC =
/VWK/TDFTPSERV-VLR_N_RET_PRINC .
/TMF/D_IT_TPSERV-VLR_SERVICOS_15 =
/VWK/TDFTPSERV-VLR_SERVICOS_15 .
/TMF/D_IT_TPSERV-VLR_SERVICOS_20 =
/VWK/TDFTPSERV-VLR_SERVICOS_20 .
/TMF/D_IT_TPSERV-VLR_SERVICOS_25 =
/VWK/TDFTPSERV-VLR_SERVICOS_25 .
/TMF/D_IT_TPSERV-VLR_N_RET_ADIC =
/VWK/TDFTPSERV-VLR_N_RET_ADIC .
/TMF/D_IT_TPSERV-MUDAR_IRF =
/VWK/TDFTPSERV-MUDAR_IRF .
* Ajuste para tratar somente MANDANTE 305
/TMF/D_IT_TPSERV-MANDT = '305'.
/VWK/TDFTPSERV-MANDT = '305'.
IF SY-SUBRC = 0.
* Ajuste para tratar somente MANDANTE 305
UPDATE /TMF/D_IT_TPSERV CLIENT SPECIFIED.
ELSE.
* Ajuste para tratar somente MANDANTE 305
INSERT /TMF/D_IT_TPSERV CLIENT SPECIFIED.
ENDIF.
READ TABLE EXTRACT WITH KEY <VIM_XTOTAL_KEY>.
IF SY-SUBRC EQ 0.
<XACT> = ORIGINAL.
MODIFY EXTRACT INDEX SY-TABIX.
ENDIF.
<ACTION> = ORIGINAL.
MODIFY TOTAL.
ENDCASE.
ENDLOOP.
CLEAR: STATUS_/VWK/TDFTPSERV-UPD_FLAG,
STATUS_/VWK/TDFTPSERV-UPD_CHECKD.
MESSAGE S018(SV).
ENDFORM.
*---------------------------------------------------------------------*
FORM READ_SINGLE_/VWK/TDFTPSERV.
* Ajuste para tratar somente MANDANTE 305
SELECT SINGLE * FROM /TMF/D_IT_TPSERV CLIENT SPECIFIED WHERE MANDT = '305' AND
EMPRESA = /VWK/TDFTPSERV-EMPRESA AND
FILIAL = /VWK/TDFTPSERV-FILIAL AND
NF_ID = /VWK/TDFTPSERV-NF_ID AND
TP_SERVICO = /VWK/TDFTPSERV-TP_SERVICO .
/VWK/TDFTPSERV-MANDT =
/TMF/D_IT_TPSERV-MANDT .
/VWK/TDFTPSERV-EMPRESA =
/TMF/D_IT_TPSERV-EMPRESA .
/VWK/TDFTPSERV-FILIAL =
/TMF/D_IT_TPSERV-FILIAL .
/VWK/TDFTPSERV-NF_ID =
/TMF/D_IT_TPSERV-NF_ID .
/VWK/TDFTPSERV-TP_SERVICO =
/TMF/D_IT_TPSERV-TP_SERVICO .
/VWK/TDFTPSERV-BASE_IRF =
/TMF/D_IT_TPSERV-BASE_IRF .
/VWK/TDFTPSERV-VLR_IRF =
/TMF/D_IT_TPSERV-VLR_IRF .
/VWK/TDFTPSERV-DT_E_S =
/TMF/D_IT_TPSERV-DT_E_S .
/VWK/TDFTPSERV-VLR_RET_SUB =
/TMF/D_IT_TPSERV-VLR_RET_SUB .
/VWK/TDFTPSERV-VLR_N_RET_PRINC =
/TMF/D_IT_TPSERV-VLR_N_RET_PRINC .
/VWK/TDFTPSERV-VLR_SERVICOS_15 =
/TMF/D_IT_TPSERV-VLR_SERVICOS_15 .
/VWK/TDFTPSERV-VLR_SERVICOS_20 =
/TMF/D_IT_TPSERV-VLR_SERVICOS_20 .
/VWK/TDFTPSERV-VLR_SERVICOS_25 =
/TMF/D_IT_TPSERV-VLR_SERVICOS_25 .
/VWK/TDFTPSERV-VLR_N_RET_ADIC =
/TMF/D_IT_TPSERV-VLR_N_RET_ADIC .
/VWK/TDFTPSERV-MUDAR_IRF =
/TMF/D_IT_TPSERV-MUDAR_IRF .
ENDFORM.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
10 | |
10 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.