This Blog aims to showcase a Case Study on how Inventory Management can be managed through Workload Automation .A Company runs a production Plant where Inventory Management is to be Automated using Workload Scheduler. The Production Plant wants to be as close to Balanced plant as possible by reducing Inventory when in excess and increasing Inventory when low . The plant plans to achieve this through a Custom Script which runs the Material Requirements Planning for them and lists all Inventory needed on a Weekly Basis to process all Orders in the Manufacturing Plant. The Plant has four types of Inventory mainly :
MATERIAL REQUIREMENTS PLANNING : Materials requirements planning would be executed through a Custom Script to find out the Inventory level needed to process Orders in the Production plant for the week. The Inventory Levels needed would be indicated in terms of the below 4 Inventory Items which the company wants to track mainly and stay on top of them to decide on whether to purchase them additionally or sell excess inventory to reduce the Inventory Carrying Costs : Material Requirements planning is done through a Job MATERIAL_REQ_PLANNING , The Script when executed gives an Output similar to the below in the Log File and computes the Inventory needed to process all Orders this week : [root@EU-HWS-LNX242 unixda]# cat production_mrp.log MS SHEETS: 14867 sheets Machine Oil: 14534 ltrs Angle Brackets: 31193 qty Polish: 16252 ltrs MS SHEETS: 5509 sheets Machine Oil: 21137 ltrs Angle Brackets: 25562 qty Polish: 12581 ltrs Entries generated each week keep getting updated to this log file. So , it indicates all 4 Inventory Items and the levels needed this week(in BOLD) inorder to use them for Order processing this week. CURRENT INVENTORY : The job CURR_INVENTORY computes the Current Inventory level in the Plant available this week , the current inventory Levels are again maintained in a log File ,so there is a Script that is called out from a job which fetches the current Inventory levels : The Output in the Log File of this Job would be similar to the following: [root@EU-HWS-LNX242 unixda]# cat production_factory.log MS SHEETS: 5674 sheets Machine Oil: 8905 ltrs Angle Brackets: 29775 qty Polish: 3662 ltrs MS SHEETS: 32355 sheets Machine Oil: 6497 ltrs Angle Brackets: 28658 qty Polish: 1746 ltrs Once we have the MRP Job and the Current Inventory Job run , we have the Current Inventory Levels and MRP Plan for the week in place , the next step is to use the Features of Workload Scheduler to parse the Joblogs and fetch the Inventory Levels from the Log Files directly and assign them to Workload Automation Variables , so you could then use Variable Passing Features of Workload Scheduler to then pass these variables to a comparison Script . The Comparison Script would compare the Values of Current Inventory Levels with MRP Inventory Levels and then pass conditions depending on the Outcome. Using the Conditional Dependencies of Workload Scheduler , we would be able to PASS different conditions as Output Conditions of the Comparison job , so the Comparison Job would either Pass “EXCESS INVENTORY” , “LOW INVENTORY” or “BALANCED INVENTORY” . If the Output Condition is “LOW INVENTORY” , we would have a Jobs to procure “Raw Material” and generate a Procurement Order. Likewise , we would have another Job to “Sell Inventory” , which would sell all Excess Inventory by raising a Sales Order , this job would return a Sales Order Number , alongwith the Inventory Count it is planning to Sell. PARSE_CURR_INVENTORY Jobs : We would have 4 Jobs which would Parse the Current Inventory Log and would fetch the Inventory levels for each : MS SHEETS , MACHINE OIL , POLISH , ANGLE BRACKETS . This would run a tac command on the Log and grep for the relevant Inventory each from the Current Inventory Log File , it would grep for the latest level of each Inventory and echo the same in the Joblog : [root@EU-HWS-LNX242 unixda]# cat /home/unixda/PARSE_CURR_LOG_MACHINE_OIL.sh #!/bin/sh PARSE_CURR_LOG_MACHINE_OIL=`tac /home/unixda/production_factory.log | grep -m1 "Machine Oil" | cut -d" " -f3` echo $PARSE_CURR_LOG_MACHINE_OIL Likewise , we would have 4 Jobs created for Parsing Current Inventory Levels from Log and echoing the same in the Joblog : =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_CURR_LOG_MSSHEET = USER : unixda = JCLFILE : /home/unixda/PARSE_CURR_LOG_MSSHEET.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881481 = Wed 03/18/2020 08:40:13 CET =============================================================== 32355 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 16 = Job Memory usage (kb) : 1532 = Wed 03/18/2020 08:40:13 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_CURR_LOG_MACHINE_OIL = USER : unixda = JCLFILE : /home/unixda/PARSE_CURR_LOG_MACHINE_OIL.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881484 = Wed 03/18/2020 08:40:13 CET =============================================================== 6497 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 16 = Job Memory usage (kb) : 1532 = Wed 03/18/2020 08:40:13 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_CURR_LOG_POLISH = USER : unixda = JCLFILE : /home/unixda/PARSE_CURR_LOG_POLISH.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881485 = Wed 03/18/2020 08:40:13 CET =============================================================== 1746 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 16 = Job Memory usage (kb) : 1532 = Wed 03/18/2020 08:40:13 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_CURR_LOG_ANGLE_BRACKETS = USER : unixda = JCLFILE : /home/unixda/PARSE_CURR_LOG_ANGLE_BRACKETS.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881483 = Wed 03/18/2020 08:40:13 CET =============================================================== 28658 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 15 = Job Memory usage (kb) : 1532 = Wed 03/18/2020 08:40:13 CET =============================================================== PARSE_MRP_LOG Jobs : Likewise , we would also have Jobs which would Parse the MRP log and would fetch the Needed inventory levels for the week : The Implementation would again run a tac command and grep on the Log for the Latest Inventory Levels from MRP Log : [root@EU-HWS-LNX242 unixda]# cat PARSE_CURR_LOG_POLISH.sh #!/bin/sh PARSE_CURR_LOG_POLISH=`tac /home/unixda/production_factory.log | grep -m1 "Polish" | cut -d" " -f2` echo $PARSE_CURR_LOG_POLISH We would have 4 such Jobs for all Inventory types which are of importance to the company like Polish , MS Sheets , Machine Oil , Angle Brackets : The Joblogs of the 4 Jobs would be similar to the below as shown below , this would reflect the MRP Inventory Levels needed for the week for each of the Inventory items : =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_MRP_LOG_MSSHEET = USER : unixda = JCLFILE : /home/unixda/PARSE_MRP_LOG_MSSHEET.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881482 = Wed 03/18/2020 08:40:13 CET =============================================================== 5509 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 17 = Job Memory usage (kb) : 1532 = Wed 03/18/2020 08:40:13 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_MRP_LOG_ANGLE_BRACKETS = USER : unixda = JCLFILE : /home/unixda/PARSE_MRP_LOG_ANGLE_BRACKETS.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881486 = Wed 03/18/2020 08:40:13 CET =============================================================== 25562 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 17 = Job Memory usage (kb) : 1532 = Wed 03/18/2020 08:40:13 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_MRP_LOG_MACHINE_OIL = USER : unixda = JCLFILE : /home/unixda/PARSE_MRP_LOG_MACHINE_OIL.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881487 = Wed 03/18/2020 08:40:13 CET =============================================================== 21137 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 17 = Job Memory usage (kb) : 1528 = Wed 03/18/2020 08:40:13 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PARSE_MRP_LOG_POLISH = USER : unixda = JCLFILE : /home/unixda/PARSE_MRP_LOG_POLISH.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881488 = Wed 03/18/2020 08:40:13 CET =============================================================== 12581 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 17 = Job Memory usage (kb) : 1532 = Wed 03/18/2020 08:40:13 CET =============================================================== Current INVENTORY Publish Jobs : The Next Set of Jobs would publish the Current Inventory Levels from the Parse Current Inventory Jobs , so for each of the Inventory Items , we would have a corresponding Job which would fetch the Joblog Output from Parse Current Inventory Job and would Store in a Workload Scheduler variable as follows , this job would be an executable Job Type and would use the Jobprop utility of Workload Scheduler to Publish the Current Inventory levels using Workload Scheduler variables : The Jobprop utility of Workload Scheduler would use the format {job:JOBNAME.stdlist} to fetch the Joblog of the PARSE Current Inventory Job and would pass it to a Workload Scheduler variable . =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PUBLISH_CURR_MSSHEETS = TASK : <?xml version="1.0" encoding="UTF-8"?> <jsdl:jobDefinition xmlns:jsdl="http://www.ibm.com/xmlns/prod/scheduling/1.0/jsdl" xmlns:jsdle="http://www.ibm.com/xmlns/prod/scheduling/1.0/jsdle" name="executable"> <jsdl:variables> <jsdl:stringVariable name="tws.jobstream.name">INVENTORY_PLNG</jsdl:stringVariable> <jsdl:stringVariable name="tws.jobstream.id">0AAAAAAAAAAAAC4H</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.name">PUBLISH_CURR_MSSHEETS</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.workstation">MASTER_DA</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.iawstz">202003180839</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.promoted">NO</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.resourcesForPromoted">10</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.num">632881491</jsdl:stringVariable> </jsdl:variables> <jsdl:application name="executable"> <jsdle:executable interactive="false"> <jsdle:script>#!/bin/sh set -xv cd /opt/wauser . ./twa_env.sh jobprop CURR_MSSHEETS ${job:PARSE_CURR_LOG_MSSHEET.stdlist} </jsdle:script> </jsdle:executable> </jsdl:application> <jsdl:resources> <jsdl:orderedCandidatedWorkstations> <jsdl:workstation>11C4F5D45E1011EAAB724BB1022D6B3F</jsdl:workstation> </jsdl:orderedCandidatedWorkstations> </jsdl:resources> </jsdl:jobDefinition> = TWSRCMAP : = AGENT : MASTER_DA = Job Number: 632881491 = Wed 03/18/2020 08:40:18 CET =============================================================== cd /opt/wauser + cd /opt/wauser . ./twa_env.sh + . ./twa_env.sh #!/bin/sh ############################################################################# # Licensed Materials - Property of IBM* and HCL** # 5698-WSH # (c) Copyright IBM Corp. 1998, 2016 All rights reserved. # (c) Copyright HCL Technologies Ltd. 2016 All rights reserved. # * Trademark of International Business Machines # ** Trademark of HCL Technologies Limited ############################################################################# # # This script for UNIX sets the environment for using HCL Workload # Automation # # Launch it in your session, within the dir where it is located, # with a preceding dot # ######################################################################### if [ -f /opt/wauser/TWS/../TDWB/bin/tdwb_env.sh ] then CURRENT_PATH=`pwd` cd /opt/wauser/TWS/../TDWB/bin . ./tdwb_env.sh cd $CURRENT_PATH elif [ -f /opt/wauser/TWS/TDWB_CLI/bin/tdwb_env.sh ] then CURRENT_PATH=`pwd` cd /opt/wauser/TWS/TDWB_CLI/bin . ./tdwb_env.sh cd $CURRENT_PATH else PATH=/opt/wauser/wastools:$PATH export PATH fi ++ '[' -f /opt/wauser/TWS/../TDWB/bin/tdwb_env.sh ']' pwd +++ pwd ++ CURRENT_PATH=/opt/wauser ++ cd /opt/wauser/TWS/../TDWB/bin ++ . ./tdwb_env.sh #!/bin/sh #################################################################### # Licensed Materials - Property of IBM and HCL # Restricted Materials of IBM and HCL # 5698-WSH # (C) Copyright IBM Corp. 2009-2016 All Rights Reserved. # (C) Copyright HCL Technologies Ltd. 2016 All Rights Reserved. # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. ################################################################### if [ ! -f "/opt/wauser/../.noecho" ] then echo "Setting CLI environment variables...." fi +++ '[' '!' -f /opt/wauser/../.noecho ']' +++ echo 'Setting CLI environment variables....' Setting CLI environment variables.... #DB2_HOME=$(db2_home) #export DB2_HOME #ORACLE_HOME=$(oracle_home) #export ORACLE_HOME #TODO informix IDS_JARS=/opt/wauser/dbtools/ids/jars/db2jcc.jar:/opt/wauser/../TDWB/dbtools/ids/jars/db2jcc.jar #export IDS_JARS WLP_USER_DIR=/opt/wauser/usr +++ WLP_USER_DIR=/opt/wauser/usr TDWB_HOME=/opt/wauser/TDWB +++ TDWB_HOME=/opt/wauser/TDWB export TDWB_HOME +++ export TDWB_HOME DB_DRIVER_PATH=/home/db2inst2/sqllib/java +++ DB_DRIVER_PATH=/home/db2inst2/sqllib/java export DB_DRIVER_PATH +++ export DB_DRIVER_PATH JAVA_BIN=/opt/wauser/TWS/JavaExt/jre/jre/bin +++ JAVA_BIN=/opt/wauser/TWS/JavaExt/jre/jre/bin export JAVA_BIN +++ export JAVA_BIN DATA_DIR=/opt/wauser/TWSDATA +++ DATA_DIR=/opt/wauser/TWSDATA export DATA_DIR +++ export DATA_DIR #/opt/wa/server_wauser/usr/servers/engineServer/resources/lib/cars CARS_DIR=$WLP_USER_DIR/servers/engineServer/resources/lib/cars +++ CARS_DIR=/opt/wauser/usr/servers/engineServer/resources/lib/cars export CARS_DIR +++ export CARS_DIR EMF_LIB=$WLP_USER_DIR/servers/engineServer/resources/lib/emf +++ EMF_LIB=/opt/wauser/usr/servers/engineServer/resources/lib/emf export EMF_LIB +++ export EMF_LIB CLASSPATH=$DATA_DIR/broker/config:$TDWB_HOME/lib/*:$DB_DRIVER_PATH/*:$CARS_DIR/events-client.jar:$CARS_DIR/IBMCARSEmitter.jar:$EMF_LIB/* +++ CLASSPATH='/opt/wauser/TWSDATA/broker/config:/opt/wauser/TDWB/lib/*:/home/db2inst2/sqllib/java/*:/opt/wauser/usr/servers/engineServer/resources/lib/cars/events-client.jar:/opt/wauser/usr/servers/engineServer/resources/lib/cars/IBMCARSEmitter.jar:/opt/wauser/usr/servers/engineServer/resources/lib/emf/*' PATH=$PATH:$TDWB_HOME/bin +++ PATH=/opt/wauser/TWSDATA/ITA/cpa/cs:/opt/wauser/TWS/ITA/cpa/ita:/sbin:/usr/sbin:/usr/bin:/opt/wauser/TWS/ITA/cpa/ita:/sbin:/usr/sbin:/usr/bin:/opt/wauser/TWS:/opt/wauser/TWS/bin:/opt/wauser/TWS/xtrace:/opt/wauser/TWS/../appservertools:/opt/wauser/TWS/ITA/cpa/ita:/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib/../bin:/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64/../bin:/opt/wauser/TWS/OpenSSL32/1.0.0/lib/../bin:/opt/wauser/TWS/CLI/bin:/home/testhwa/MDM_package/TWS/LINUX_X86_64/Tivoli_Eclipse_LINUX_X86_64/TWS/JavaExt/jre/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/usr/bin:/opt/wauser/TDWB/bin export PATH +++ export PATH export CLASSPATH +++ export CLASSPATH ++ cd /opt/wauser if [ -f /opt/wauser/TWS/tws_env.sh ] then CURRENT_PATH=`pwd` cd /opt/wauser/TWS . ./tws_env.sh cd $CURRENT_PATH else PATH=/opt/wauser/wastools:$PATH export PATH fi ++ '[' -f /opt/wauser/TWS/tws_env.sh ']' pwd +++ pwd ++ CURRENT_PATH=/opt/wauser ++ cd /opt/wauser/TWS ++ . ./tws_env.sh #!/bin/sh ############################################################################# # Licensed Materials - Property of IBM* and HCL** # 5698-WSH # (c) Copyright IBM Corp. 1998, 2016 All rights reserved. # (c) Copyright HCL Technologies Ltd. 2016, 2017 All rights reserved. # * Trademark of International Business Machines # ** Trademark of HCL Technologies Limited ############################################################################# # # This script for UNIX sets the environment for using HCL Workload # Scheduler # # Launch it in your session, within the dir where it is located, # with a preceding dot # ######################################################################### #Set GSKit path GSKIT_VER=8 +++ GSKIT_VER=8 if [ -d /opt/wauser/TWS/GSKit64/$GSKIT_VER -o -d /opt/wauser/TWS/GSKit32/$GSKIT_VER ] then GSKIT_PATH=/opt/wauser/TWS/GSKit64/$GSKIT_VER/lib64:/opt/wauser/TWS/GSKit32/$GSKIT_VER/lib else GSKIT_PATH=/usr/Tivoli/TWS/GSKit64/$GSKIT_VER/lib64:/usr/Tivoli/TWS/GSKit32/$GSKIT_VER/lib fi +++ '[' -d /opt/wauser/TWS/GSKit64/8 -o -d /opt/wauser/TWS/GSKit32/8 ']' +++ GSKIT_PATH=/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib OPENSSL_VER=1.0.0 +++ OPENSSL_VER=1.0.0 if [ -d /usr/Tivoli/TWS/OpenSSL64/$OPENSSL_VER ] then OPENSSL64_PATH=/usr/Tivoli/TWS/OpenSSL64/$OPENSSL_VER/lib64 else OPENSSL64_PATH=/opt/wauser/TWS/OpenSSL64/$OPENSSL_VER/lib64 fi +++ '[' -d /usr/Tivoli/TWS/OpenSSL64/1.0.0 ']' +++ OPENSSL64_PATH=/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64 if [ -d /usr/Tivoli/TWS/OpenSSL32/$OPENSSL_VER ] then OPENSSL32_PATH=/usr/Tivoli/TWS/OpenSSL32/$OPENSSL_VER/lib else OPENSSL32_PATH=/opt/wauser/TWS/OpenSSL32/$OPENSSL_VER/lib fi +++ '[' -d /usr/Tivoli/TWS/OpenSSL32/1.0.0 ']' +++ OPENSSL32_PATH=/opt/wauser/TWS/OpenSSL32/1.0.0/lib OPENSSL_LIBPATH=$OPENSSL64_PATH:$OPENSSL32_PATH +++ OPENSSL_LIBPATH=/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64:/opt/wauser/TWS/OpenSSL32/1.0.0/lib OPENSSL_PATH=$OPENSSL64_PATH/../bin:$OPENSSL32_PATH/../bin +++ OPENSSL_PATH=/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64/../bin:/opt/wauser/TWS/OpenSSL32/1.0.0/lib/../bin UNISONWORK=/opt/wauser/TWSDATA +++ UNISONWORK=/opt/wauser/TWSDATA export UNISONWORK +++ export UNISONWORK UNISONHOME=/opt/wauser/TWS +++ UNISONHOME=/opt/wauser/TWS export UNISONHOME +++ export UNISONHOME OSName=`uname` uname ++++ uname +++ OSName=Linux case $OSName in AIX|OS400) TWS_TISDIR=$UNISONHOME; export TWS_TISDIR TISDIR=$UNISONHOME export TISDIR AIX_VERSION=`uname -v` #Allow to use the GSKIt and OpenSSL command line if [ "$AIX_VERSION" = "5" -o "$AIX_VERSION" = "4" -o "$OSName" = "OS400" ] then LIBPATH=$UNISONHOME/bin:$LIBPATH:.:$GSKIT_PATH:$OPENSSL_LIBPATH:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin export LIBPATH else LIBPATH=$UNISONHOME/bin:$LIBPATH:$GSKIT_PATH:$OPENSSL_LIBPATH:.:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin export LIBPATH fi PATH=$UNISONHOME:$UNISONHOME/bin:$UNISONHOME/xtrace:$UNISONHOME/../appservertools:$UNISONHOME/ITA/cpa/ita:$OPENSSL_PATH:$UNISONHOME/CLI/bin:$PATH; export PATH JAVA_HOME=$UNISONHOME/JavaExt/jre/jre; export JAVA_HOME ;; Linux) export TISDIR=$UNISONHOME export TWS_TISDIR=$UNISONHOME; #Allow to use the GSKIt and OpenSSL command line uname -m | grep i | grep 86 > /dev/null if [ $? -eq 0 ]; then GSKIT_LIBPATH_SUFFIX=lib GSKIT_PATH=/usr/Tivoli/TWS/GSKit32/8/lib OPENSSL_LIBPATH=$OPENSSL32_PATH OPENSSL_PATH=$OPENSSL32_PATH/../bin else GSKIT_LIBPATH_SUFFIX=lib64 fi export LD_LIBRARY_PATH=$UNISONHOME/bin:$GSKIT_PATH:$OPENSSL_LIBPATH:$LD_LIBRARY_PATH:.:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin export PATH=$UNISONHOME:$UNISONHOME/bin:$UNISONHOME/xtrace:$UNISONHOME/../appservertools:$UNISONHOME/ITA/cpa/ita:$GSKIT_PATH/../bin:$OPENSSL_PATH:$UNISONHOME/CLI/bin:$PATH; export JAVA_HOME=$UNISONHOME/JavaExt/jre/jre; ;; SunOS) TWS_TISDIR=$UNISONHOME export TWS_TISDIR TISDIR=$UNISONHOME export TISDIR LD_LIBRARY_PATH=$UNISONHOME/bin:$GSKIT_PATH/:$OPENSSL_LIBPATH/:$LD_LIBRARY_PATH:.:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin export LD_LIBRARY_PATH PATH=$UNISONHOME:$UNISONHOME/bin:$UNISONHOME/xtrace:$UNISONHOME/../appservertools:$GSKIT_PATH/../bin:$UNISONHOME/ITA/cpa/ita:$OPENSSL_PATH:$UNISONHOME/CLI/bin:$PATH export PATH JAVA_HOME=$UNISONHOME/JavaExt/jre/jre export JAVA_HOME ;; HP-UX) GSKIT_LIBPATH_SUFFIX=lib uname -m | grep ia64 > /dev/null if [ $? -ne 0 ]; then GSKIT_PATH=/usr/Tivoli/TWS/GSKit32/8/lib OPENSSL_LIBPATH=$OPENSSL32_PATH OPENSSL_PATH=$OPENSSL32_PATH/../bin else GSKIT_PATH=/usr/Tivoli/TWS/GSKit64/8/lib64 OPENSSL_LIBPATH=$OPENSSL64_PATH OPENSSL_PATH=$OPENSSL64_PATH/../bin fi TWS_TISDIR=$UNISONHOME export TWS_TISDIR TISDIR=$UNISONHOME export TISDIR #for security reason HP could not allow to append the SHLIB_PATH if the script is launch with source operator IS_ROOT=`id 2>/dev/null | grep "uid=0"` SHLIB_SET=`env | grep "SHLIB_PATH"` if [ ! -z "$IS_ROOT" -a ! -z "$SHLIB_SET" ] then SHLIB_PATH=$UNISONHOME/bin:$GSKIT_PATH:$OPENSSL_LIBPATH:.:$SHLIB_PATH:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin LD_LIBRARY_PATH=$UNISONHOME/bin:$GSKIT_PATH:$OPENSSL_LIBPATH:.:$SHLIB_PATH:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin else SHLIB_PATH=$UNISONHOME/bin:$GSKIT_PATH:$OPENSSL_LIBPATH:.:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin LD_LIBRARY_PATH=$UNISONHOME/bin:$GSKIT_PATH:$OPENSSL_LIBPATH:.:$UNISONHOME/ITA/cpa/ita/lib:$UNISONHOME/CLI/bin fi export SHLIB_PATH export LD_LIBRARY_PATH #Allow to use the GSKIt command line PATH=$UNISONHOME:$UNISONHOME/bin:$UNISONHOME/xtrace:$UNISONHOME/../appservertools:$GSKIT_PATH/../bin:$UNISONHOME/ITA/cpa/ita:$OPENSSL_PATH:$UNISONHOME/CLI/bin:$PATH export PATH JAVA_HOME=$UNISONHOME/JavaExt/jre/jre export JAVA_HOME ;; *) TWS_TISDIR=$UNISONHOME;export TWS_TISDIR TISDIR=$UNISONHOME;export TISDIR PATH=$UNISONHOME:$UNISONHOME/bin:$UNISONHOME/xtrace:$UNISONHOME/../appservertools:$GSKIT_PATH/../bin:$GSKIT_PATH:$UNISONHOME/ITA/cpa/ita:$OPENSSL_PATH:$OPENSSL_LIBPATH:$UNISONHOME/CLI/bin:$PATH;export PATH JAVA_HOME=$UNISONHOME/JavaExt/jre/jre;export JAVA_HOME LD_LIBRARY_PATH=$GSKIT_PATH:$OPENSSL_LIBPATH:.:$LD_LIBRARY_PATH:$UNISONHOME/CLI/bin:$UNISONHOME/ITA/cpa/ita/lib SHLIB_PATH=$GSKIT_PATH:$OPENSSL_LIBPATH:.:$SHLIB_PATH:$UNISONHOME/ITA/cpa/ita/lib LIBPATH=$GSKIT_PATH:$OPENSSL_LIBPATH:$UNISONHOME/ITA/cpa/ita/lib:$LIBPATH export SHLIB_PATH export LD_LIBRARY_PATH export LIBPATH ;; esac +++ case $OSName in +++ export TISDIR=/opt/wauser/TWS +++ TISDIR=/opt/wauser/TWS +++ export TWS_TISDIR=/opt/wauser/TWS +++ TWS_TISDIR=/opt/wauser/TWS +++ uname -m +++ grep i +++ grep 86 +++ '[' 1 -eq 0 ']' +++ GSKIT_LIBPATH_SUFFIX=lib64 +++ export LD_LIBRARY_PATH=/opt/wauser/TWS/bin:/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib:/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64:/opt/wauser/TWS/OpenSSL32/1.0.0/lib::.:/opt/wauser/TWS/ITA/cpa/ita/lib:/opt/wauser/TWS/CLI/bin +++ LD_LIBRARY_PATH=/opt/wauser/TWS/bin:/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib:/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64:/opt/wauser/TWS/OpenSSL32/1.0.0/lib::.:/opt/wauser/TWS/ITA/cpa/ita/lib:/opt/wauser/TWS/CLI/bin +++ export PATH=/opt/wauser/TWS:/opt/wauser/TWS/bin:/opt/wauser/TWS/xtrace:/opt/wauser/TWS/../appservertools:/opt/wauser/TWS/ITA/cpa/ita:/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib/../bin:/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64/../bin:/opt/wauser/TWS/OpenSSL32/1.0.0/lib/../bin:/opt/wauser/TWS/CLI/bin:/opt/wauser/TWSDATA/ITA/cpa/cs:/opt/wauser/TWS/ITA/cpa/ita:/sbin:/usr/sbin:/usr/bin:/opt/wauser/TWS/ITA/cpa/ita:/sbin:/usr/sbin:/usr/bin:/opt/wauser/TWS:/opt/wauser/TWS/bin:/opt/wauser/TWS/xtrace:/opt/wauser/TWS/../appservertools:/opt/wauser/TWS/ITA/cpa/ita:/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib/../bin:/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64/../bin:/opt/wauser/TWS/OpenSSL32/1.0.0/lib/../bin:/opt/wauser/TWS/CLI/bin:/home/testhwa/MDM_package/TWS/LINUX_X86_64/Tivoli_Eclipse_LINUX_X86_64/TWS/JavaExt/jre/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/usr/bin:/opt/wauser/TDWB/bin +++ PATH=/opt/wauser/TWS:/opt/wauser/TWS/bin:/opt/wauser/TWS/xtrace:/opt/wauser/TWS/../appservertools:/opt/wauser/TWS/ITA/cpa/ita:/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib/../bin:/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64/../bin:/opt/wauser/TWS/OpenSSL32/1.0.0/lib/../bin:/opt/wauser/TWS/CLI/bin:/opt/wauser/TWSDATA/ITA/cpa/cs:/opt/wauser/TWS/ITA/cpa/ita:/sbin:/usr/sbin:/usr/bin:/opt/wauser/TWS/ITA/cpa/ita:/sbin:/usr/sbin:/usr/bin:/opt/wauser/TWS:/opt/wauser/TWS/bin:/opt/wauser/TWS/xtrace:/opt/wauser/TWS/../appservertools:/opt/wauser/TWS/ITA/cpa/ita:/usr/Tivoli/TWS/GSKit64/8/lib64:/usr/Tivoli/TWS/GSKit32/8/lib/../bin:/usr/Tivoli/TWS/OpenSSL64/1.0.0/lib64/../bin:/opt/wauser/TWS/OpenSSL32/1.0.0/lib/../bin:/opt/wauser/TWS/CLI/bin:/home/testhwa/MDM_package/TWS/LINUX_X86_64/Tivoli_Eclipse_LINUX_X86_64/TWS/JavaExt/jre/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/usr/bin:/opt/wauser/TDWB/bin +++ export JAVA_HOME=/opt/wauser/TWS/JavaExt/jre/jre +++ JAVA_HOME=/opt/wauser/TWS/JavaExt/jre/jre CONFIGURE_DATASOURCE_PARAMETER_DATA_DIR=/opt/wauser/TWSDATA +++ CONFIGURE_DATASOURCE_PARAMETER_DATA_DIR=/opt/wauser/TWSDATA if [ ! -z "$UNISONWORK" ] then ITA_CFG=$UNISONWORK/ITA/cpa/ita/ita.ini else ITA_CFG=$UNISONHOME/ITA/cpa/ita/ita.ini fi +++ '[' '!' -z /opt/wauser/TWSDATA ']' +++ ITA_CFG=/opt/wauser/TWSDATA/ITA/cpa/ita/ita.ini export ITA_CFG +++ export ITA_CFG MAESTRO_OUTPUT_STYLE=LONG +++ MAESTRO_OUTPUT_STYLE=LONG export MAESTRO_OUTPUT_STYLE +++ export MAESTRO_OUTPUT_STYLE MAESTROLINES=-1 +++ MAESTROLINES=-1 export MAESTROLINES +++ export MAESTROLINES if [ ! -f "/opt/wauser/.noecho" ] then echo HCL Workload Scheduler Environment Successfully Set !!! fi +++ '[' '!' -f /opt/wauser/.noecho ']' +++ echo HCL Workload Scheduler Environment Successfully Set '!!!' HCL Workload Scheduler Environment Successfully Set !!! ++ cd /opt/wauser if [ ! -f "/opt/wauser/.noecho" ] then echo HCL Workload Automation Environment Successfully Set !!! fi ++ '[' '!' -f /opt/wauser/.noecho ']' ++ echo HCL Workload Automation Environment Successfully Set '!!!' HCL Workload Automation Environment Successfully Set !!! jobprop CURR_MSSHEETS 32355 + jobprop CURR_MSSHEETS 32355 =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 56 = Job Memory usage (kb) : 6976 = Wed 03/18/2020 08:40:18 CET ============================================================= Publish MRP Inventory Jobs : These set of Jobs would parse the Joblog of Parse MRP Inventory Job and would fetch the Joblog Output and store them in a Workload Scheduler variable , each Joblog parsed would reflect the Inventory Level of each Item like MACHINE OIL , POLISH , MS STEEL , ANGLE BRACKETS : =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PUBLISH_MRP_ANGLE_BRACKETS = TASK : <?xml version="1.0" encoding="UTF-8"?> <jsdl:jobDefinition xmlns:jsdl="http://www.ibm.com/xmlns/prod/scheduling/1.0/jsdl" xmlns:jsdle="http://www.ibm.com/xmlns/prod/scheduling/1.0/jsdle" name="executable"> <jsdl:variables> <jsdl:stringVariable name="tws.jobstream.name">INVENTORY_PLNG</jsdl:stringVariable> <jsdl:stringVariable name="tws.jobstream.id">0AAAAAAAAAAAAC4H</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.name">PUBLISH_MRP_ANGLE_BRACKETS</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.workstation">MASTER_DA</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.iawstz">202003180839</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.promoted">NO</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.resourcesForPromoted">10</jsdl:stringVariable> <jsdl:stringVariable name="tws.job.num">632881493</jsdl:stringVariable> </jsdl:variables> <jsdl:application name="executable"> <jsdle:executable interactive="false"> <jsdle:script>#!/bin/sh cd /opt/wauser . ./twa_env.sh jobprop MRP_ANG_BRK ${job:PARSE_MRP_LOG_ANGLE_BRACKETS.stdlist} </jsdle:script> </jsdle:executable> </jsdl:application> <jsdl:resources> <jsdl:orderedCandidatedWorkstations> <jsdl:workstation>11C4F5D45E1011EAAB724BB1022D6B3F</jsdl:workstation> </jsdl:orderedCandidatedWorkstations> </jsdl:resources> </jsdl:jobDefinition> = TWSRCMAP : = AGENT : MASTER_DA = Job Number: 632881493 = Wed 03/18/2020 08:40:18 CET =============================================================== Setting CLI environment variables.... HCL Workload Scheduler Environment Successfully Set !!! HCL Workload Automation Environment Successfully Set !!! =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 46 = Job Memory usage (kb) : 6976 = Wed 03/18/2020 08:40:18 CET =============================================================== Comparison Jobs : These 4 Jobs would compare the Workload Scheduler variable from Publish Current Inventory for each item and compare them with the Publish MRP Inventory for each Item and if the Current Inventory Level is more than the MRP Inventory Level , then it would compute the Excess Inventory level and would store the Difference in a Variable called EXCESS and would pass a Success Output Condition of EXCESS_INVENTORY and would return a RC of 15 . It the MRP inventory Level is more than the current Inventory Level , then it would compute the Low Inventory level and would store the Difference in a Variable called NEEDS and would pass a Success Output Condition of NEEDS_INVENTORY and would return a RC of 5 . Procure Raw Material Jobs : These set of jobs would run a Script to Procure Raw material , this would be a Custom Script of the Company and would additionally also use the “Needs” Variable from the COMPUTE Job while placing the Procurement Order with a known Seller.(with which the company has tie ups), this set of jobs would run if the condition passed is “LOW INVENTORY” in the Compute Job : =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PROCURE_RAW_MATERIAL_MACHINE_OIL = USER : unixda = JCLFILE : /home/unixda/procure_rawmaterial_machineoil.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881501 = Wed 03/18/2020 08:40:31 CET =============================================================== Setting CLI environment variables.... HCL Workload Scheduler Environment Successfully Set !!! HCL Workload Automation Environment Successfully Set !!! Placing Order for MachineOil Qty : Procurement Order: 11095 placed =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 22 = Job Memory usage (kb) : 1548 = Wed 03/18/2020 08:40:31 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].PROCURE_RAW_MATERIAL_POLISH = USER : unixda = JCLFILE : /home/unixda/procure_rawmaterial_polish.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881502 = Wed 03/18/2020 08:40:31 CET =============================================================== Setting CLI environment variables.... HCL Workload Scheduler Environment Successfully Set !!! HCL Workload Automation Environment Successfully Set !!! Placing Order for Polish Ltrs : Procurement Order: 27169 placed =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 22 = Job Memory usage (kb) : 1552 = Wed 03/18/2020 08:40:31 CET =============================================================== Sell Inventory Jobs : These Jobs would place a Sales Order with Sales so as to pursue further to Sell all Excess Inventory , these would run a Custom Script , the jobs would also fetch the variable for EXCESS Variable from the Compute Job and would also return a Sales Order Number and would run only when the Condition on the Compute Job returns “EXCESS INVENTORY” : =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].SELL_INVENTORY_MSSHEET = USER : unixda = JCLFILE : /home/unixda/sell_inventory_mssheet.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881504 = Wed 03/18/2020 08:40:31 CET =============================================================== Setting CLI environment variables.... HCL Workload Scheduler Environment Successfully Set !!! HCL Workload Automation Environment Successfully Set !!! Sales Order: 18822 raised with Sales Team in excess =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 22 = Job Memory usage (kb) : 1548 = Wed 03/18/2020 08:40:31 CET =============================================================== =============================================================== = JOB : DAUNIX#INVENTORY_PLNG[(0839 03/18/20),(0AAAAAAAAAAAAC4H)].SELL_INVENTORY_ANGLE_BRACKET = USER : unixda = JCLFILE : /home/unixda/sell_inventory_anglebracket.sh = TWSRCMAP : = AGENT : DAUNIX = Job Number: 632881503 = Wed 03/18/2020 08:40:31 CET =============================================================== Setting CLI environment variables.... HCL Workload Scheduler Environment Successfully Set !!! HCL Workload Automation Environment Successfully Set !!! Sales Order: 2748 raised with Sales Team in excess =============================================================== = Exit Status : 0 = Elapsed Time (hh:mm:ss) : 00:00:01 = Job CPU usage (ms) : 21 = Job Memory usage (kb) : 1548 = Wed 03/18/2020 08:40:31 CET =============================================================== Balanced Inventory : In case of balanced Inventory returned from Compute Jobs , no actions are performed for the Corresponding Inventory Item . Jobstream INVENTORY_PLNG : The Jobstream INVENTORY_PLNG implements the use Case completely in the below way : Job MATERIAL_REQ_PLANNING runs the MATERIAL REQ PLANNING . Job CURR_INVENTORY fetches the Current Inventory Levels . The Jobs PARSE_CURR_LOG* parse the Current Inventory Levels from Inventory log and output it in the joblog for each Inventory Item. The Jobs PARSE_MRP_LOG* parse the MRP Inventory Levels from MRP Inventory log and output it in the joblog for each Inventory Item. The Jobs PUBLISH_CURR* publish the Current Inventory Levels by fetching the Joblog through {job:JobName.stdlist} from the joblog of PARSE_CURR_LOG* Jobs. The Jobs PUBLISH_MRP* publish the MRP Inventory Levels by fetching the Joblog through {job:JobName.stdlist} from the Joblog of PARSE_MRP_LOG* Jobs. The Jobs COMP_* compute the difference between Inventory and store it in either NEEDS or EXCESS Variables through an if and jobprop utility. These also additionally pass a SUCC OUTPUT CONDITION of EXCESS_INVENTORY or LOW_INVENTORY depending on the Case and would also return RC=15 or RC=5 depending on the Scenario . So ,as you can see in this Case , for Angle Brackets : EXCESS_INVENTORY , so the SELL_INVENTORY Job has triggered , likewise for MS SHEET : EXCESS_INVENTORY , so the SELL_INVENTORY Job has triggered and for Machine Oil : LOW_INVENTORY , so the PROCURE_RAW_MATERIAL Job has triggered and for Polish : LOW_INVENTORY , so the PROCURE_RAW_MATERIAL Job has triggered , all other Conditional Dependency jobs have been suppressed (which are not needed for this case). So for any Business Process , using a combination of Variable Passing and Conditional Dependencies , we can Automate a Business Process using Workload Automation . Hope you enjoyed this blog .
0 Comments
Your comment will be posted after it is approved.
Leave a Reply. |
Archives
March 2023
Categories
All
|