Este programa tem por finalidade a submissão de JOBs em sequência, isto é, a partir da lista de parâmetros, ele submete o primeiro da lista imediatamente e os demais sucessivamente após o término do job anterior.
REPORT ZYPCFPSSBMJOB MESSAGE-ID ZY NO STANDARD PAGE HEADING. ************************************************************************ * Programa : ZYPCFPSSBMJOB - Submissão de Jobs relacionados * * Autor : Walmir Basevic - Pimentel C.A. * * Criação: : 12/05/2000 Primeira liberação: / / * * Modificações : * * 1) * * Propósito: * * Data: / / por: * * 2) * * Propósito: * * Data: / / por: * ************************************************************************ ************************************************************************ ** ** ** Este programa tem por finalidade a submissão de JOBs em sequência, ** ** isto é, a partir da lista de parâmetros, ele submete o primeiro ** ** da lista imediatamente e os demais sucessivamente após o término ** ** do job anterior. ** ** ** ************************************************************************ ************************************************************************ * *** Declaração de tabelas e estruturas do dicionário TABLES: TBTCJOB. "Estrutura para transferir dados de cabeçalho j * *** Definição de tipo de estrutura de dados do JOB a submeter TYPES: BEGIN OF TP_JOB, JOBNAME LIKE TBTCJOB-JOBNAME, CPROG LIKE SY-CPROG, JOBCOUNT LIKE TBTCJOB-JOBCOUNT, UNAME LIKE SY-UNAME, INDEX LIKE SY-INDEX, END OF TP_JOB. * *** Definição de tabela para submissão de jobs DATA: T_JOB TYPE STANDARD TABLE OF TP_JOB WITH HEADER LINE. * *** Definição de tabela auxiliar para submissão de jobs DATA: T_JOB_AUX TYPE STANDARD TABLE OF TP_JOB WITH HEADER LINE. * *** Definição de variáveis globais DATA: VG_INDEX LIKE SY-INDEX, VG_INDEX_AUX LIKE SY-INDEX. * *** Tela de seleção de parâmetros SELECTION-SCREEN BEGIN OF BLOCK BL01 WITH FRAME TITLE TEXT-001. * SELECT-OPTIONS: S_JNAME FOR TBTCJOB-JOBNAME OBLIGATORY DEFAULT 'Job', S_CPROG FOR SY-CPROG OBLIGATORY DEFAULT 'Programa', S_UNAME FOR SY-UNAME OBLIGATORY DEFAULT SY-UNAME. * SELECTION-SCREEN END OF BLOCK BL01. * *** Consistência dos parâmetros informados * *** Nome de JOB AT SELECTION-SCREEN ON END OF S_JNAME. * LOOP AT S_JNAME. IF NOT S_JNAME-SIGN = 'I' OR NOT S_JNAME-OPTION = 'EQ'. *** Indicar apenas um Nome de Job por linha MESSAGE E033. ENDIF. ENDLOOP. * DESCRIBE TABLE S_JNAME LINES VG_INDEX. * *** Nome de Programa AT SELECTION-SCREEN ON END OF S_CPROG. * LOOP AT S_CPROG. IF NOT S_CPROG-SIGN = 'I' OR NOT S_CPROG-OPTION = 'EQ'. *** Indicar apenas um Nome de Programa por linha MESSAGE E034. ENDIF. ENDLOOP. * DESCRIBE TABLE S_CPROG LINES VG_INDEX_AUX. * IF VG_INDEX <> VG_INDEX_AUX. *** Quantidade de JOBs difere da quantidade de Programas MESSAGE E035. ENDIF. * *** Nome de JOB AT SELECTION-SCREEN ON END OF S_JNAME. * LOOP AT S_JNAME. IF NOT S_JNAME-SIGN = 'I' OR NOT S_JNAME-OPTION = 'EQ'. *** Indicar apenas um Nome de Job por linha MESSAGE E033. ENDIF. ENDLOOP. * DESCRIBE TABLE S_JNAME LINES VG_INDEX. * *** Nome de Programa AT SELECTION-SCREEN ON END OF S_CPROG. * LOOP AT S_CPROG. IF NOT S_CPROG-SIGN = 'I' OR NOT S_CPROG-OPTION = 'EQ'. *** Indicar apenas um Nome de Programa por linha MESSAGE E034. ENDIF. ENDLOOP. * DESCRIBE TABLE S_CPROG LINES VG_INDEX_AUX. * IF VG_INDEX <> VG_INDEX_AUX. *** Quantidade de JOBs difere da quantidade de Programas MESSAGE E035. ENDIF. * *** Nome de Usuário AT SELECTION-SCREEN ON END OF S_UNAME. * LOOP AT S_UNAME. IF NOT S_UNAME-SIGN = 'I' OR NOT S_UNAME-OPTION = 'EQ'. *** Indicar apenas um Nome de Usuário por linha MESSAGE E036. ENDIF. ENDLOOP. * DESCRIBE TABLE S_UNAME LINES VG_INDEX_AUX. * IF VG_INDEX <> VG_INDEX_AUX AND VG_INDEX_AUX > 1. *** Quantidade de Usuários > 1 e diferente da quantidade de JOBs MESSAGE E037. ENDIF. * ************************************************************************ * Início do processamento * ************************************************************************ START-OF-SELECTION. * DESCRIBE TABLE S_JNAME LINES VG_INDEX. DESCRIBE TABLE S_CPROG LINES VG_INDEX_AUX. * IF VG_INDEX <> VG_INDEX_AUX. *** Quantidade de JOBs difere da quantidade de Programas MESSAGE E035. ENDIF. *** Carrega os parâmetros na tabela de submissão de jobs PERFORM PARAMETROS_2_T_JOB. *** Ordena a tabela de submissão pelo Índice SORT T_JOB BY INDEX. *** Abre cada um dos JOBs e atualiza a tabela de submissão PERFORM ABRE_JOBS. *** Submete cada programa no seu respectivo JOB PERFORM SUBMETE_PROGRAMA_NO_JOB. *** Move os dados da tabela de JOBs para a auxiliar MOVE T_JOB[] TO T_JOB_AUX[]. *** Ordena a tabela de submissão pelo Índice de forma descendente SORT T_JOB BY INDEX DESCENDING. *** Ordena a tabela auxiliar pelo Índice SORT T_JOB_AUX BY INDEX. *** Fecha cada um dos JOBs, cada um dependente do anerior e o primeiro *** immediatamente PERFORM FECHA_JOBS. * END-OF-SELECTION. ************************************************************************ * Final do processamento * ************************************************************************ *&---------------------------------------------------------------------* *& Form PARAMETROS_2_T_JOB *&---------------------------------------------------------------------* * Carrega os parâmetros na tabela de submissão de jobs *----------------------------------------------------------------------* FORM PARAMETROS_2_T_JOB. * LOOP AT S_JNAME. * MOVE SY-TABIX TO VG_INDEX. READ TABLE S_CPROG INDEX VG_INDEX. READ TABLE S_UNAME INDEX VG_INDEX. IF NOT SY-SUBRC IS INITIAL. READ TABLE S_UNAME INDEX 1. ENDIF. MOVE: S_JNAME-LOW TO T_JOB-JOBNAME, S_CPROG-LOW TO T_JOB-CPROG, S_UNAME-LOW TO T_JOB-UNAME, VG_INDEX TO T_JOB-INDEX. APPEND T_JOB. * ENDLOOP. * ENDFORM. " PARAMETROS_2_T_JOB *&---------------------------------------------------------------------* *& Form ABRE_JOBS *&---------------------------------------------------------------------* * Abre cada um dos JOBs e atualiza a tabela de submissão *----------------------------------------------------------------------* FORM ABRE_JOBS. * LOOP AT T_JOB. * CALL FUNCTION 'JOB_OPEN' EXPORTING * DELANFREP = ' ' * JOBGROUP = ' ' JOBNAME = T_JOB-JOBNAME * SDLSTRTDT = NO_DATE * SDLSTRTTM = NO_TIME IMPORTING JOBCOUNT = T_JOB-JOBCOUNT EXCEPTIONS CANT_CREATE_JOB = 1 INVALID_JOB_DATA = 2 JOBNAME_MISSING = 3 OTHERS = 4. * IF SY-SUBRC IS INITIAL. MODIFY T_JOB INDEX T_JOB-INDEX TRANSPORTING JOBCOUNT. ELSE. *** Erro na criação do JOB & para o usuário & MESSAGE E038 WITH T_JOB-JOBNAME T_JOB-UNAME. ENDIF. * ENDLOOP. * ENDFORM. " ABRE_JOBS *&---------------------------------------------------------------------* *& Form SUBMETE_PROGRAMA_NO_JOB *&---------------------------------------------------------------------* * Submete cada programa no seu respectivo JOB *----------------------------------------------------------------------* FORM SUBMETE_PROGRAMA_NO_JOB. * LOOP AT T_JOB. * SUBMIT (T_JOB-CPROG) AND RETURN USER T_JOB-UNAME VIA JOB T_JOB-JOBNAME NUMBER T_JOB-JOBCOUNT TO SAP-SPOOL DESTINATION 'SPOSV07IL3' LIST NAME T_JOB-JOBNAME LIST AUTHORITY 'JOBSPOOL' COVER TEXT T_JOB-JOBNAME KEEP IN SPOOL 'X' IMMEDIATELY 'X' DATASET EXPIRATION 8 WITHOUT SPOOL DYNPRO. * ENDLOOP. ENDFORM. " SUBMETE_PROGRAMA_NO_JOB *&---------------------------------------------------------------------* *& Form FECHA_JOBS *&---------------------------------------------------------------------* * Fecha cada um dos JOBs, cada um dependente do anerior e o primeiro * immediatamente *----------------------------------------------------------------------* FORM FECHA_JOBS. * *** Definição de variável local DATA: EL_JOB TYPE TP_JOB. * LOOP AT T_JOB. * MOVE T_JOB TO EL_JOB. * IF T_JOB-INDEX <> 1. COMPUTE VG_INDEX = T_JOB-INDEX - 1. READ TABLE T_JOB_AUX INDEX VG_INDEX. * CALL FUNCTION 'JOB_CLOSE' EXPORTING * AT_OPMODE = ' ' * AT_OPMODE_PERIODIC = ' ' * CALENDAR_ID = ' ' * EVENT_ID = ' ' * EVENT_PARAM = ' ' * EVENT_PERIODIC = ' ' JOBCOUNT = EL_JOB-JOBCOUNT JOBNAME = EL_JOB-JOBNAME * LASTSTRTDT = NO_DATE * LASTSTRTTM = NO_TIME * PRDDAYS = 0 * PRDHOURS = 0 * PRDMINS = 0 * PRDMONTHS = 0 * PRDWEEKS = 0 * PREDJOB_CHECKSTAT = ' ' PRED_JOBCOUNT = T_JOB_AUX-JOBCOUNT PRED_JOBNAME = T_JOB_AUX-JOBNAME * SDLSTRTDT = NO_DATE * SDLSTRTTM = NO_TIME * STARTDATE_RESTRICTION = BTC_PROCESS_ALWAYS * strtimmed = ' ' * TARGETSYSTEM = ' ' * START_ON_WORKDAY_NOT_BEFORE = SY-DATUM * START_ON_WORKDAY_NR = 0 * WORKDAY_COUNT_DIRECTION = 0 * RECIPIENT_OBJ = * IMPORTING * JOB_WAS_RELEASED = ' ' EXCEPTIONS CANT_START_IMMEDIATE = 1 INVALID_STARTDATE = 2 JOBNAME_MISSING = 3 JOB_CLOSE_FAILED = 4 JOB_NOSTEPS = 5 JOB_NOTEX = 6 LOCK_FAILED = 7 OTHERS = 8. * IF NOT SY-SUBRC IS INITIAL. *** Erro no fachamento do JOB &, programa &, usuário & MESSAGE E039 WITH EL_JOB-JOBNAME EL_JOB-CPROG EL_JOB-UNAME. ENDIF. * ELSE. * CALL FUNCTION 'JOB_CLOSE' EXPORTING * AT_OPMODE = ' ' * AT_OPMODE_PERIODIC = ' ' * CALENDAR_ID = ' ' * EVENT_ID = ' ' * EVENT_PARAM = ' ' * EVENT_PERIODIC = ' ' JOBCOUNT = EL_JOB-JOBCOUNT JOBNAME = EL_JOB-JOBNAME * LASTSTRTDT = NO_DATE * LASTSTRTTM = NO_TIME * PRDDAYS = 0 * PRDHOURS = 0 * PRDMINS = 0 * PRDMONTHS = 0 * PRDWEEKS = 0 * PREDJOB_CHECKSTAT = ' ' * PRED_JOBCOUNT = ' ' * PRED_JOBNAME = ' ' * SDLSTRTDT = NO_DATE * SDLSTRTTM = NO_TIME * STARTDATE_RESTRICTION = BTC_PROCESS_ALWAYS STRTIMMED = 'X' * TARGETSYSTEM = ' ' * START_ON_WORKDAY_NOT_BEFORE = SY-DATUM * START_ON_WORKDAY_NR = 0 * WORKDAY_COUNT_DIRECTION = 0 * RECIPIENT_OBJ = * IMPORTING * JOB_WAS_RELEASED = ' ' EXCEPTIONS CANT_START_IMMEDIATE = 1 INVALID_STARTDATE = 2 JOBNAME_MISSING = 3 JOB_CLOSE_FAILED = 4 JOB_NOSTEPS = 5 JOB_NOTEX = 6 LOCK_FAILED = 7 OTHERS = 8. * IF NOT SY-SUBRC IS INITIAL. *** Erro no fachamento do JOB &, programa &, usuário & MESSAGE E039 WITH EL_JOB-JOBNAME EL_JOB-CPROG EL_JOB-UNAME. ENDIF. * ENDIF. * ENDLOOP. * ENDFORM. " FECHA_JOBS