Tempo aproximado para leitura: 00:05:17 min
Dúvida
Como realizar a alteração nos programas para execução em modo background JOB em TOTVSTec?
Ambiente
Logix - Administração Logix - Todas as versões
Solução
Alteração no código fonte das aplicações que realizam execução de outra aplicação em modo background JOB em TOTVSTec.
Abaixo segue a relação dos comandos que não podem ser invocados por programas/rotinas quando estiverem sendo executados em modo background JOB por estarem relacionados a um conjunto de instruções de interface, inválidas para este modo de execução em TOTVS Tec:
Códigos:
ERROR
MESSAGE
DEFER
INTERRPUT
OPTIONS
OPEN WINDOW
OPEN FORM
CLOSE WINDOW
CLOSE FORM
CLEAR FORM
CLEARSCREEN
CURRENT WINDOW IS
MENU..COMMAND..END MENU
INPUT..END INPUT
INPUT ARRAY..END
INPUT
DISPLAY
DISPLAY ARRAY..END DISPLAY
PROMPT
fgl_winquestion()
fgl_winmessage()
fgl_winprompt()
fgl_keylabel()
fgl_keysetlabel()
fgl_fglgui()
fgl_dialog_setkeylabel()
fgl_getkey()
fgl_init4js()
Para aplicações que podem ser executadas tanto em modo online com interface quanto background execução em modo JOB acionada a partir de outra aplicação, estes devem ter sua codificação adaptada para prever a execução em modo JOB, para evitar acionamento de qualquer um dos comandos da lista acima e para isso poderá ser utilizada a função LOG_job_mode(), que retornará 1 TRUE se a execução estiver sendo executada em modo JOB background ou 0 FALSE se a execução é online com interface.
Neste caso, para as aplicações que tiverem adaptação para execução em modo background deve-se implementar da seguinte forma:
Exemplo:
IF NOT LOG_job_mode() THEN
MESSAGE ....
END IF
Somente no caso de retorno FALSE da função LOG_job_mode() é que os rotinas background poderão ser executados sem problemas no caso de existirem instruções relacionadas a interface.
No programa chamador deverá ter a seguinte alteração.
Programa Chamador:
CALL log120_procura_caminho("cre0201") RETURNING comando
IF g_ies_ambiente <> "U" THEN
LET m_comando = comando CLIPPED," " , p_tela.dat_base ," ",
p_tela.ies_empresa ," ",
p_tela.ies_tip_docum ," ",
p_tela.tipo_data ," ",
p_ies_impressao ," ",
g_cod_impressora ," ",
p_nom_arquivo_back CLIPPED
RUN m_comando
ELSE
LET m_comando = "nohup ", comando CLIPPED," " , p_tela.dat_base ," ",
p_tela.ies_empresa ," ",
p_tela.ies_tip_docum ," ",
p_tela.tipo_data ," ",
p_ies_impressao ," ",
g_cod_impressora ," ",
p_nom_arquivo_back CLIPPED , " ",
">> /dev/null", " &"
RUN m_comando
END IF
#Alterar para executar da seguinte maneira:
#Passando parâmetros para o programa via tabela "tran_arg"
CALL log1200_parametro_programa_inclui("cre0201", 1, 0, p_tela.dat_base)
CALL log1200_parametro_programa_inclui("cre0201", 2, 0, p_tela.ies_empresa)
CALL log1200_parametro_programa_inclui("cre0201", 3, 0, p_tela.ies_tip_docum)
CALL log1200_parametro_programa_inclui("cre0201", 4, 0, p_tela.tipo_data)
CALL log1200_parametro_programa_inclui("cre0201", 5, 0, p_ies_impressao)
CALL log1200_parametro_programa_inclui("cre0201", 6, 0, g_cod_impressora)
CALL log1200_parametro_programa_inclui("cre0201", 7, 0, p_nom_arquivo_back)
#Executa o programa em Windows ou Linux, 4JS ou Totvstec
CALL log1200_executa_programa_background('cre0201')
A passagem de parâmetros fica definida sempre sendo por tabela, utilizando a função log1200_parametro_programa_inclui() para incluir parâmetro.
A função log1200_executa_programa_background() passará a receber somente UM parâmetro e não mais DOIS, então todos os programas que fazem chamada desta função passando dois parâmetros deverão ser alterados para passar apenas UM. No programa a ser chamado, deverão ser feitas as seguintes alterações:
Todo o bloco que compreende MAIN ... END MAIN deverá ser colocado em uma função chamada <nome do programa>_main(), e a chamada dessa função deverá ser colocada no bloco MAIN, exemplo:
MAIN
CALL cre0201_main()
END MAIN
#----------------------------#
FUNCTION cre0201_main()
#----------------------------#
... #TODO O CÓDIGO QUE ESTAVA ENTRE MAIN
# *** Recebimento dos parâmetros (alterar conforme exemplo abaixo)
END MAIN ...
END FUNCTION
# *** Recebimento dos parâmetros
# Quando o recebimento dos argumentos estiver sendo feito via arg_val(?):
LET p_tela.dat_base = arg_val(1)
LET p_tela.ies_empresa = arg_val(2)
LET p_tela.ies_tip_docum = arg_val(3)
LET p_tela.tipo_data = arg_val(4)
LET p_ies_impressao = arg_val(5)
LET g_cod_impressora = arg_val(6)
LET p_nom_arquivo = arg_val(7)
# Após alteração do programa chamador para passar os parâmetros utilizando
# o log1200_parametro_programa_inclui() o programa chamado deverá efetuar o
# recebimento desses parâmetros utilizando o log1200_parametro_programa_le():
LET p_tela.dat_base = log1200_parametro_programa_le(1,0)
LET p_tela.ies_empresa = log1200_parametro_programa_le(2,0)
LET p_tela.ies_tip_docum = log1200_parametro_programa_le(3,0)
LET p_tela.tipo_data = log1200_parametro_programa_le(4,0)
LET p_ies_impressao = log1200_parametro_programa_le(5,0)
LET g_cod_impressora = log1200_parametro_programa_le(6,0)
LET p_nom_arquivo = log1200_parametro_programa_le(7,0)
Os LOGs log1200_parametro_programa_inclui() e log1200_parametro_programa_le() utilizam as variáveis p_cod_empresa e p_user, tornando-se necessário que a chamada destas funções sejam colocadas depois da chamada da função log001_acessa_usuario().
0 Comentários