Thursday, 29 December 2016

E920 upgrade JDE TCs failing, F98950 R89952450

Getting this in the logs:

2400/6448 WRK:Starting jdeCallObject            Thu Dec 29 14:04:11.762065    jdb_rst.c1243
    JDB9900307 - Failed to find table specifications

2400/6448 WRK:Starting jdeCallObject            Thu Dec 29 14:04:11.762067    jdb_rq1.c1883
    JDB3100007 - Failed to get valid table specifications

2400/6448 WRK:Starting jdeCallObject            Thu Dec 29 14:04:11.762070    tcinit.c1250
    TCE009101 - Couldn't open F952450.

Funny thing is (well, it’s not funny…  This is a new pathcode that is being upgraded – UA920.

This table is new in 920 and should be in central objects.

I can see that it does exist and has the right column count:

select count(1) from qsys2.syscolumns where table_schema = 'COUA920' and table_name = 'F952450';

This did not fail for DV920 or PY920… so we have something specific for UA920.

I enabled logging on the dep server to find out more…

ec 29 14:04:11.762060 - 2400/6448 WRK:Starting jdeCallObject            Exiting JDB_FreeUser with Success(UserHandle 0D3F98E0)
Dec 29 14:04:11.762061 - 2400/6448 WRK:Starting jdeCallObject            Exited jdeCloseDictionary with DDType 0
Dec 29 14:04:11.762062 - 2400/6448 WRK:Starting jdeCallObject            JDB9900913 - Failed to create global table specs for F952450
Dec 29 14:04:11.762064 - 2400/6448 WRK:Starting jdeCallObject            JDB9900307 - Failed to find table specifications
Dec 29 14:04:11.762066 - 2400/6448 WRK:Starting jdeCallObject            JDB3100007 - Failed to get valid table specifications
Dec 29 14:04:11.762068 - 2400/6448 WRK:Starting jdeCallObject            Exiting JDB_OpenTable(Table = F952450) with Failure
Dec 29 14:04:11.762069 - 2400/6448 WRK:Starting jdeCallObject            TCE009101 - Couldn't open F952450.
Dec 29 14:04:11.762071 - 2400/6448 WRK:Starting jdeCallObject            Entering JDB_CloseTable (hRequest 087A5A40)
Dec 29 14:04:11.762072 - 2400/6448 WRK:Starting jdeCallObject            Entering JDB_CloseTable(Table = F98950)
Dec 29 14:04:11.762073 - 2400/6448 WRK:Starting jdeCallObject            Entering JDB_ClearSequencing (hRequest 087A5A40)
Dec 29 14:04:11.762074 - 2400/6448 WRK:Starting jdeCallObject            Exiting JDB_ClearSequencing with Success

Then I think about the fact that this is a new path code and I look in the spec.ini

D:\JDEdwards\E920\UA920\spec & planner

[SPEC LOCATIONS]
PLANNER_DataSource=Local - PLANNER Specs
PLANNER_Package=E920
DV920_DataSource=Local - PLANNER Specs
DV920_Package=E920
PD920_DataSource=Local - PLANNER Specs
PD920_Package=E920
PS920_DataSource=Local - PLANNER Specs
PS920_Package=E920
PY920_DataSource=Local - PLANNER Specs
PY920_Package=E920    

Okay, I think that this might be it

I add

UA920_DataSource=Local - PLANNER Specs
UA920_Package=E920 

And try again.

Am I confident?  No, I leave logging on…  this is the true definition of CNC confidence with table conversions.  If you think you’ve nailed it – you turn logging on in the client jde.ini on the dep server.

image

I should have been more confident – problem solved.

Thursday, 22 December 2016

Is JDE too slow in the mornings, perhaps it needs a wake up call?

Do you find that JD Edwards is a little tardy in the mornings or on weekends?  Would you like an innovative way to fix this?  I might have an idea for you!

We combine google analytics data on your ERP usage as well as AIS and LAMBDA in AWS to cache up the environment that you want to use.  Why do we use so many things to do this?  Because it’s completely dynamic and based upon demand.

As has been discussed before, we’ve configured Google analytics to record ERP usage and performance.  We extract the highly used applications:

A quick snippet shows the applications that are used most over the last month.

image

We have some LAMBDA code that loads this information dynamically and makes AIS calls to the relevant web server to those top applications. This ensures that they are cached and ready for use first thing in the morning.  What servers do you need for LAMBDA?  None!  by definition this is serverless compute.  So we are using no servers to troll your Active ERP usage and then ensure that these applications are ready for action.

I did not write any of this code, but my team of awesome innovation experts have done the hard yards for me!

Personally I think that this is some really innovative use of AWS and AIS to ensure that users have a consistent environment to work in.

You can then use google analytics to measure the page load times of the applications on Monday mornings to ensure that the performance is consistent.

Tuesday, 20 December 2016

More Statistics from your Batch Jobs, UBE performance statistics

 

F986114 is great, shows you some good statistical data for when the job actually run and ended, not taking into consideration queue time.

The query below is extracting the UBE performance data between 15/12/2016 and 19/12/2016.  Note that the times written in F986114 are UTC, so in the example below, I needed to add 13 hours to get the NZ timezone (+interval ‘13’ hour) for the data I was reporting on.  You need to workout your own offset https://en.wikipedia.org/wiki/List_of_UTC_time_offsets

SELECT JCPID as REPORT_NAME, JCVERS as VERSION, simd || vrjd AS DESCRIPTION, TO_CHAR((JCSTDTIM + interval '13' hour),'DDMMYYYY HH24:MI:SS') AS "START TIME", TO_CHAR((JCETDTIM + interval '13' hour),'DDMMYYYY HH24:MI:SS') AS "END TIME",  jcjobnbr
  from svm900.f986114,ol900.f9860, py900.f983051
  where trim(jcpid) = trim(siobnm) and trim(jcvers) = trim (vrvers) and trim(jcpid) = trim (vrpid) and jcjobsts = 'D'
  and (JCETDTIM + interval '13' hour) < TO_DATE('25122016','DDMMYYYY') and (JCETDTIM + interval '13' hour) >= TO_DATE('19122016', 'DDMMYYYY')
;

You can then put this data into excel and run any number of pivot tables over the top to extract slow jobs / fast jobs etc.

Regular analysis will allow you to eval trends and also work out if you have problems somewhere in JDE.

More accurate automatic data selection entry tips

I’m using R98403G with the results from R9698711 and need to create 500 or so missing tables.  I’ve spoken about this previously.

This time however, I engaged my trust “sendKeys” vbs script to pound the data selection into the win32 client, and alas, the application no longer seems to allow the send keys functions to work!  Doh…

So, I’m going to use the browser, which does not suffer from the same depreciation in functionality.

I’ve had to modify my script a little bit to ensure that web data selection entry is going to work.

So, I have a spreadsheet which has all of the values that I want to put into data selection.  I’ve created a formula which is going to make this easy to put into my script.

image

You can see that my script is creating a massive list of comma delimited and strings in double quotes “

Cell B1 = =+""""&A1&""""&","

Cell B2 = =+B1&""""&A2&""""&","

The you can drag the cell B2 to the bottom of your data that you want to add to data selection.

Mine looks like:

("F00151","F0086","F01111","F01111Z1","F03B116T","F03B116W","F03B116X","F03B117T","F0451401","F05290T","F06116T","F06116TZ","F0618T","F063951T","F07051","F0717A","F07186T","F07352T","F08117","F08118","F08119","F08120","F08121","F08122","F08123","F08124","F08210","F08211","F08212","F08214","F0901T","F0902A","F0911T","F0911Z1T","F0917S","F1217Z2","F186407D","F186407T","F31172TE","F31B35T","F3214","F3294","F32941","F32942","F32943","F32944","F32945","F3294Z","F3296","F32961","F329611","F3296T","F40051","F4009T","F40242","F40344A","F4072TEM","F4074TEM","F41001T","F4100T","F4101SRM","F4101T","F4101TT","F4102SRM","F4102TT","F4109","F42005A","F42119A","F42119B","F4211A","F4211B","F42140A","F42150A","F4215T","F42199A","F42I010","F42I013","F42I015","F42I02","F42I03","F42I06","F42I07","F42I08","F42I09","F42I141","F42I20","F42I21","F4311TA","F43121TA","F43199A","F4600T","F4600TPU","F46011T","F46091T","F4611T","F4611TPU","F4620T","F470371","F470375T","F49090","F49711","F5102","F5103","F5104","F51F100","F51F10W","F51F110","F51F115","F51F120","F51F125","F51F20W","F51F30W","F51F40W","F51F90","F51F94","F51F95","F55029","F55031","F55058","F55059","F55326A","F55326T","F55415A","F55415T","F5543008","F55UI038","F55UI121","F55UI515","F56001","F56002","F56003","F56004","F56005","F5603B01","F5698210","F5698211","F56UI006","F570041","F570101B","F570401","F570401A","F570920","F574101X","F74401","F7460","F750401A","F75A001T","F75I101A","F7608B","F7613B","F76422","F76B012","F76B209","F76B410","F76C0006","F76CUI02","F894101","F894101H","F89701","F89702","F89AD020","F89AD050","F89AD060","F89CA020","F89CA050","F89CA060","F89CA080","F89CA65A","F89CB06C","F89LU001","F89LU003","F89LU005","F89LU006","F89LU007","F89LU008","F89LUADD","F90CB072","F90CB073","F952420","F986020","F986030","F98770","F98870","F98BLOB","F98EVHDR","F99302","F993022","F993023","F99303","FD3N0914","FD3N2053","FD3N4382","FY5AF0Z1","FY5AF402","FY5AF403","FY5AF405","FY5AF430","FY5AF431","FY5AF440","FY5AF455","FY5AF501","FY5AF510","FY5AF512","FY5AF513","FY5AF515","FY5AF517","FY5AF518","FY5AF519","FY5AF520","FY5AF521","FY5AF525","FY5AF540","FY5AF544","FY5AF547","FY5AF550","FY5AF570","FY5AF600","FY5AF610","FY5AF900","FY5AF905","FY5AF915","FY5AF919","FY5AF935","FY5AF940","FY5AF945","FY5AF950","FY5AFA01","FY5AFA02","FY5AFA03","FY5AFA04","FY5AFA05","FY5AFA06","FY5AFA07","FY5AFA08","FY5AFA09","FY5AFA10","FY5AFA11","FY5AFA12","FY5AFA13","FY5AFA14","FY5AFA15","FY5AFR01","FY5AFR02","FY5AFR03","FY5AFW01","FY5AFW03","FY5AFW05","FY5AFW06","FY5AFW09","FY5AFW10","FY5AFW11","FY5AFX01","FY5AFX02","FY5AFX03","FY5AFX04","FY5AFX05","FY5AFX06","FY5AFX07","FY5AFX08","FY5AFX09","FY5AFX10","FY5AG909","FY5AG90G","FY5AG90H","FY5AG90I","FY5AG910","FY5AG911","FY5AG912","FY5AG914","FY5AG921","FY5AG925","FY5AG935","FY5AG955","FY5AG995","FY5AGS01","FY5AGS02","FY5AGS03","FY5AGS04","FY5AGS05","FY5AGS06","FY5AGS07","FY5AGS08","FY5AGS09","FY5AGS0A","FY5AGS10","FY5AGS11","FY5AGS12","FY5AGS13","FY5AGS14","FY5AGS15","FY5AGS16","FY5AGS17","FY5AGS18","FY5AGS19","FY5AGS20","FY5AGS21","FY5AGS22","FY5AGS23","FY5AGS24","FY5AGS25","FY5AGS26","FY5AGS27","FY5AGS28","FY5AGS29","FY5AGS30","FY5AGS31","FY5AGS32","FY5AGS33","FY5AGS34","FY5AGS35","FY5AGS36","FY5AGS37","FY5AGW01","FY5AGW02","FY5AGW03","FY5AGX01","FY5AGX02","FY5AGX03","FY5AGX04","FY5AGX05","FY5AGX06","FY5AGX07","FY5AGX08","FY5AH010","FY5AH011","FY5AH014","FY5AH015","FY5AH016","FY5AH017","FY5AH018","FY5AH019","FY5AH020","FY5AH030","FY5AH040","FY5AH050","FY5AH055","FY5AH060","FY5AH061","FY5AH062","FY5AH070","FY5AH071","FY5AH080","FY5AH081","FY5AH085","FY5AH090","FY5AH095","FY5AH100","FY5AH160","FY5AH161","FY5AH30V","FY5AH30X","FY5AH425","FY5AH500","FY5AH50V","FY5AH50X","FY5AH510","FY5AH520","FY5AH530","FY5AH544","FY5AH61T","FY5AH900","FY5AH905","FY5AH910","FY5AH915","FY5AH921","FY5AH925","FY5AH951","FY5AHR01","FY5AHR02","FY5AHR03","FY5AHR2B","FY5AHR2C","FY5AHW01","FY5AHW02","FY5AHW03","FY5AHW04","FY5AHW05","FY5AHW06","FY5AHW07","FY5AHW72","FY5AHX01","FY5AHX02","FY5AHX03","FY5AHX04","FY5AHX05","FY5AHX06","FY5AHX07","FY5AHX08","FY5AHX09","FY5AHX10","FY5AHX11","FY5AHX12","FY5AHX13","FY5AHX21","FY5AHX22","FY5AHX23","FY5AHX24","FY5AHX25","FY5AHX26","FY5AHX27","FY5AHX28","FY5AHX29","FY5AM060","FY5AM080","FY5AZ015","FY5AZ020","FY5AZ025","FY5AZ028","FY5AZ35G","FY5AZ35L","FY5AZ800","FY5AZ900","FY5AZ923","FY5AZ924","FY5AZ927","FY5AZ935","FY5AZW01","FY5AZW02","FY5AZW04","FY5AZW05","FY5AZW07","FY5AZW08","FY5AZW09","FY5AZW10","FY5AZW11","FY5AZW12","FY5AZW13","FY5AZW14","FY5AZW15","FY5AZW16")

Take away the last , and replace with ) and add open ( at the start.

Now, the script template:

set objShell = wscript.createobject("WScript.Shell")
rem tableList=Array("F0101","F0411","F1208")

wscript.sleep 10000

for each table in tableList
    objshell.sendkeys table
    wscript.sleep 500
    objshell.sendkeys "^%(a)"
    wscript.sleep 1000
Next

You need to create a file like “enterDataSelection.vbs” and paste in the above script

So, if you go to your web browser and get the data selection, list of values screen ready.

image

With your cursor in the text box.

The script is going to type the first entry, wait for .5 second, then press ctrl alt a and wait 1 second then start again on the next item.

You can make this line as long as you need:

tableList=Array("F0101","F0411","F1208")

Note that you just need to replace the list in brackets with what you need to type.

If you then run the script (right click open) and then give your data selection window the focus (select the text box), the script will start typing / adding the elements.

Try it out with a small amount…

Extra for experts:

AppActivate is a useful function for this work, but the title (which you can use in AppActivate) for this purpose is important.

I really should have some code like the following at the start of my script, this would prevent my script from typing into the wrong window – but I’ve been struggling to find the complete window title…

Do until success = True
  Success = objshell.AppActivate("Batch Versions - Work With Batch Versions - Available Versions - Google")
  wscript.sleep 1000
Loop
wscript.sleep 100

But, you can get the titles with the below:

C:\Users\shannonm> Tasklist /V |findstr /C:"Batch"
chrome.exe                   10356 Console                    1    194,276 K Running         MITS\ShannonM                                           0:42:27 Batch Versions - Work With Batch Versions - Available Versions - Google
ApplicationFrameHost.exe     11800 Console                    1     32,784 K Running         MITS\ShannonM                                           0:00:06 Batch Versions - Work With Batch Versions - Available Versions ?- Micros

You can see from the above that the full title between Chrome and iexplore is very different.  And AppActivate does not work really with PIDs that well (for what we want to do).  Therefore we need to use AppActivate and also use the titles from the above.  Note that the Tasklist /V is very handy to give you all of the titles.

Sunday, 18 December 2016

Installing JD Edwards in AWS using RDS

Ever wanted high availability with JD Edwards while using Oracle Standard Edition?  Have you looked at the complications of licencing and recovery and turned away thinking that things are too difficult.  I know that I have.

AWS RDS for oracle has changed this dilemma, making it very easy to use oracle “as a service” – carrying over your Standard edition database licences as part of Oracle Technology Foundation and creating the durability your need in your implementation.  I’m talking about a completely recoverable and highly available (well, as highly as is needed) JD Edwards implementation using power in built AWS features and functions – as well as some smart architecture.

Myriad IT have been working closely with AWS engineers to write a seamless guide to installing JD Edwards on AWS using RDS to give you all of the above and more.  We’ve created a number of reference architectures that are built on the architecture that is spelled out in the white paper.  This means that your web servers and enterprise servers are constantly up and running in alternative availability zones.  You database is running in a single AZ using RDS and will “fail over” to an alternate AZ seamlessly to JD Edwards.  JD Edwards has never been perfect at handling these fail-overs – but a quick restart of ent and we (if required) will give your complete functionality AND production scale while handling a DR event.  This power also gives you quasi high availability at the same time.

AWS have enabled you to architect a highly available and disaster recoverable JD Edwards environment facilitated by RDS.  The white paper that has been created in conjunction with AWS shows how (with a couple of tweaks) you can simply get JD Edwards running in AWS using RDS – seamlessly.  You can seem more details here https://aws.amazon.com/blogs/database/installing-jd-edwards-enterpriseone-on-amazon-rds-for-oracle/ and actually download the white paper here: https://aws.amazon.com/whitepapers/#database-applications

This shows you the exact steps for running the platform pack against RDS and using the native datapump files and utilities to get JD Edwards working in RDS.  After following the process, you’ll be able to run up your deployment server, run all of your ESU’s and get the environment complete is a very small amount of time.  You can then perform any amount of performance testing and take advantage of limitless elasticity to bring your business a very cost efficient, stable and powerful platform.

Myriad IT have taken this concept further than the white paper that you see here, we’ve implemented media objects to sit natively in S3 buckets, we are using LAMBDA functions which call AIS forms to “pre-cache” and environment on a Monday morning to take away those slow patches.  We have ELBs in front of load balanced pigeon pair web and ent servers to scale when required – and more.

If you are considering dipping your toes into the cloud, our JD Edwards reference architectures, many live clients and implementations will surely make your journey more efficient.

I’ll begin to post more technical details on the implementation of JD Edwards in AWS – in an attempt to try and highlight the efficiencies that you can gain from this implementation type.

We are so proud to be involved in this innovation with such an amazing business partner – AWS!

Sunday, 11 December 2016

OATS JDE regression testing & data banks

This could be one of the most boring posts that I’ve ever done, or you might love it.  It might be exactly what you’ve been looking for.  It could be what you are looking for if you have done a lot of regression testing using OATs.  Have not?  Oh well.

I’ve been helping the team record 80 business scenarios in OATS for automated regression testing.  This is a cool service that will test tools releases and ESU’s and give the business a level of confidence that the changes are working without involving the business.  This is going to be more important with the proliferation of SaaS, but let’s deal with that in another post.

I have a team of people recording the scripts and using OATS.  They’ve done a great job, but as teams are – they are using databanks (sometimes up to 4) and are using the same data banks in multiple scripts.  Also, they are expecting that the current record (for the current iteration) is passed between the scripts.  Oh dear, I need to invent some magic that can make this happen.

Actually this is a large gap I see with the automated regression in OATS, I want to be able to save off the “latest” number or unique identifier or what-ever…  I want to save off the last PO # I created and read it back next time the script runs.

So, I’ve put together a couple of simple scripts (functions) that will write and read values to a properties file.  Therefore, I can save off the current pointers to data bank iteration values, or I can save any script related data for next time, nice.

public int OATSWriteEntry(String KeyToWrite, String ValueToWrite )
    {

    Properties prop = new Properties();
    OutputStream output = null;

   
    try {
       
        //load the poperties file first
        FileInputStream in = new FileInputStream("\\\\vlneoats\\OatsTests\\GenericCounters.properties") ;
        prop.load(in);
        in.close();
        // set the properties value
        int i;
       
        output = new FileOutputStream("\\\\vlneoats\\OatsTests\\GenericCounters.properties");
        prop.setProperty(KeyToWrite, ValueToWrite);
        // save properties to project root folder
        prop.store(output, null);

    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (output != null) {
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return 0;
    }

and Read\

public String OATSReadEntry(String KeyToRead) throws Exception
    {
        Properties prop = new Properties();
        InputStream input = null;
       

    try {

        input = new FileInputStream("\\\\vlneoats\\OatsTests\\GenericCounters.properties");

        // load a properties file
        prop.load(input);

        // get the property value and print it out
       
        return prop.getProperty(KeyToRead);
   
        } catch (IOException io) {
            io.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return "ERROR";
      }

I created these in a separate project and called this from all my scripts.

I called it with code like the following, when I wanted to iterate the script counter:

image

String szTempValue="";
szTempValue = getScript("ShannonScratch").callFunction("OATSReadEntry", "0501Equipment_Counter").toString();
getVariables().set("CurrentScriptCounter", szTempValue, Variables.Scope.GLOBAL);
getVariables().set("OriginalScriptCounter", szTempValue, Variables.Scope.GLOBAL);
info("Have read value {{CurrentScriptCounter}} as iteration point");
getDatabank("0501VCAMCreatinganEquipmentMasterRecord").getRecord(Integer.parseInt(getVariables().get("CurrentScriptCounter")));
//getDatabank("0501VCAMCreatinganEquipmentMasterRecord").getRecord(13);
/*
* incrementing counter
*/
int tempCounter=Integer.parseInt(szTempValue);
tempCounter++;
getScript("ShannonScratch").callFunction("OATSWriteEntry", "0501Equipment_Counter", Integer.toString(tempCounter));
getVariables().set("CurrentScriptCounter", Integer.toString(tempCounter), Variables.Scope.GLOBAL);
info("Setting current iteration to {{ScurrentScriptCounter}}");
//original script
getDatabank("LoginCredentials").getRecord(2);
getVariables().set("Todays Date", "{{@today(dd/MM/yyyy)}}",
        Variables.Scope.GLOBAL);

Apologies for my dodgy java code, this is based upon desperation, not skill (as you can tell).

The above is reading an entry from the properties file (0501Equipment_Counter), increments it and then writes the new value back for next time.  Nice that you see my library is “ShannonScratch”.

My properties file looks like this:

#Sun Dec 11 12:36:06 EST 2016
0501Equipment_Counter=27
APCustomer_Counter=24
CustomerAddressNumberCreation_Counter=24
0701_Counter=26
APSupplier_Counter=24
0502_Counter=26
ARReceiptNumber_Counter=24
PO1CreateaNonStockPurchaseOrder_Counter=34
CustomerInvoiceNumber_Counter=24
0506MeterReadings_Counter=17
0503_Counter=25

So now I can schedule my OATS scripts using OTM, and they remember where they are up to.

JD Edwards and Azure AD Services for SSO via oauth

I cannot believe how much I enjoy logging into JD Edwards when I do not need to enter my password.  I then start to count the $$ people are saving as their entire staff are no longer forgetting their JD Edwards password.  That’s right, long usernames and passwords also completely supported.

Some other nice things are that traditional sign in also works for the luddites and people that need to use the thick client.

Some of the uber nerds at Myriad have written some awesome software that allow you to SSO into JD Edwards using Azure AD Services – wow. 

When “on prem”,

image

We get the modified login screen, fancy new button for AD login.

click it and…

image

you are in – immediately.

We are using the standard long username mapping functionality in JD Edwards to ensure that it’s all compliant

sign off:

image

Then redirected back to the login screen:

image

Wow, how cool is that.

If you try and login while not in the corporate network

image

You get a challenge for your domain credentials via Azure

Then you log into JDE

How cool is that?

The other extension of this solution is that JDE is hosted in AWS and Azure AD authentication is of course from another cloud – can you see it all coming together?

Friday, 9 December 2016

JDEaaS or E1aaS–how can it be? JD Edwards as a service

No technical details in this post, more strategy.  I want to comment on the ability for JD Edwards to go to the cloud and become a service.  This is going to benefit clients to use resources to sell more widgets, not build more packages!

Do you want to take away the hassles of managing JD Edwards on a day to day basis.  Stop worrying about performance, security, DR and more?  Do you wish you could be provisioned with a URL that you can give to all your users and everyone is in a better place?

We are doing this for people now, it’s the new normal.

The journey to the cloud can be super complex, you start to worry about security, high availability, data sovereignty and more – but you do not have too.  You can decide to take on one system at a time.  This can be JD Edwards.  You can get a fully managed service with SLA’s that suit your business with a simple PUPM charging method.

We can put you in a tier 1 cloud provider (AWS) and completely manage JD Edwards for you – where ever you are in the world.  We can have distributed backups all around the world in secure locations if this is important to you.  I would not rely on a private cloud, as the extensibility and richness of services is always going to be limiting your design.  The reason you want to go to the cloud is to remove constraints. 

We can recreate your entire environment with a cloud formation to have you up and running in minutes / hours after the worst disaster.  We can architect this to be highly available and disaster recoverable (automatically).  We can architect scale up and scale down of compute resources to save you money and give you the horsepower when you need it.  We have predefined cloud templates that give you a lot of this power today.

The solution will be more secure than what you currently have, as there will be 0 database access to anyone, there are firewalls between everything and we can arrange so that only your traffic gets through to your resources.

We can offer automated testing and also provide you with dashboards of performance and usage – unparalleled insight into the usage and performance of your ERP.  Automated testing is going to become more and more important when SaaS vendors will continually provide you with updates (tools releases and upgrades), as they’ll tell you what is wrong in the lower environments. Don’t worry about all the technical messages though, we’ll handle this.

We’ve been on the forefront of AWS migrations and continue to do this more and more for our clients.


The constant innovation in AWS allows us to solve problems quicker and easier than ever before for our clients.

Some managed service providers are including tools releases, quarterly patching and upgrades in the service - this comes at a cost though.

Tuesday, 22 November 2016

openscript and spaces in databank alias’

Don’t put spaces in you databank alias in openscript – period.

Background

You might spend a couple of nights that you’ll never get back (like me) working out why your permutations and combinations of openscript command line options are not working.

OTM uses a commandline interface to openscript.

Things that work in openscript do not always work when calling from OTM.

To see commandline options,  http://docs.oracle.com/cd/E59557_01/OPSUG/opscrpt_cli_tools.htm#BEIFCJFF

One issue in particular is that spaces in the databank filename will fail in OTM.

The basis of this post is that a databank alias with spaces does not work when it goes to OTM.  You can quickly see this when you run the script.  You get 0 errors in the execution and there is also nothing written to your log file in c:\OracleATS\logs

Does not work:

-dbopts alias=0502 Setting Up Service Types:startIndex=11,alias=LoginCredentials:startIndex=1 -DelayPercentage -1 -delayMinSeconds 5 –delayMaxSeconds

-dbopts alias=”0502 Setting Up Service Types”:startIndex=11,alias=LoginCredentials:startIndex=1 -DelayPercentage -1 -delayMinSeconds 5 –delayMaxSeconds

c:\oracleATS\logs\process_console_2016-11-22T15-52-04.972adc5179a-66e5-46e6-8e63-503faa65a3e3_.log

Running "0502 Setting Up Service Types" ...
10:41:12,325 INFO  [DeploymentLogger] creating data source for databank "LoginCredentials". Databank usage: Advance record: by script request, Select record: sequentially, Out of records: loop continuously, Start record: 1, Seed value=0
10:41:12,361 INFO  [DeploymentLogger] creating data source for databank "0502 Setting Up Service Types". Databank usage: Advance record: by script request, Select record: sequentially, Out of records: loop continuously, Start record: 1, Seed value=0

Does work:

image

Ensure that the alias in the databank definition in your script does not have spaces – see above.  Get to this from

image

-dbopts alias=0502SettingUpServiceTypes:startIndex=11,alias=LoginCredentials:startIndex=1 -DelayPercentage -1 -delayMinSeconds 5 –delayMaxSeconds

image

I passed in a startIndex of 4 above, and I can see that the correct substitution is being used.

So, it just does the default databank operation – not using your command line override.

When you remove the spaces from your databank, it iterates as designed:

image

More on databanks and script design

The way OTM works is that you need to configure a pile of command line options if you are doing fancy things with databanks.  This is a little frustrating, as you need to understand the complete lifecycle of your test cases to ensure that the setup of an individual script is going to be correct.

For example, rule 1 – don’t think that you can scroll through a databank on different days and remember were you are up to, you cannot.  You also cannot pass in a pointer at the command line to do this for you.  You would need to maintain the pointer (or current databank record) in a text file (or database file) and update this at the end of every script and also use this on your call to “get next record”.

-dbopts alias=0502SettingUpServiceTypes:startIndex=11,alias=LoginCredentials:startIndex=1 -DelayPercentage -1 -delayMinSeconds 5 –delayMaxSeconds

The startIndex setting cannot be fed into this test set – I need to change this every time.

So, I need to do this in the script:

int scriptIterationCounter;

getDatabank("0506VCAMEnteringMeterReadings").getNextDatabankRecord(scriptInterationCounter);

Wednesday, 16 November 2016

configure SMTP server for OATS–oracle application testing suite

Goto the management app

http://localhost:8088/admin/Login.do – use localhost if you are on the server.

image

Login with Administrator

image

Make sure that you pull down the database tab and select OATS_otm_DS

image

Then goto tools and setup SMTP

image

enter your details and then test.

image

And you get your email – ace!

Note that you need to setup the email address of the user too, this is done also from the main screen:

image

This is also from the admin application.

openscript and OTM–automated regression testing of JD Edwards using openscript and OTM

Wow, this has been a real struggle.  I have a team writing awesome test scripts with openscript.  They work every time…  Awesome!

My job is to whack these into OTM, but gosh (best swear word I have at this stage), this is difficult.

The scripts are bombing all over the place, they are bombing on fast path, they are bombing on finding controls – FAR OUT!

So, my scripts work every time in openscript (once repositories are created [they are a terrible concept too btw])

Fail everytime in OTM.

image

image

See above for details.

I’ve done lots of things to try and fix this, which includes writing java code and also reverse engineering the EOneUtility files (which are AWESOME!).

Nothing has worked, then I stumble on:

https://support.oracle.com/epmos/faces/DocContentDisplay?_afrLoop=326776020417876&id=984133.1&_afrWindowMode=0&_adf.ctrl-state=165att5g2v_233

This is pretty good – not relevant to JDE – but I can draw analogies with the content.

Also the instruction does not work, but I have one that does.

So, what you need to do is stop the service

image

And now start is as the user that you want, I’ve done this from a command window that is run as admin

image

c:\OracleATS\agentmanager\bin>agentmanager.cmd

Now, run a test through OTM – and POW – it actually starts windows and works.

This is quite a relief, as I thought I was going to need jenkins to start running all of the openscript tasks (note that this is totally possible), as per https://docs.oracle.com/cd/E25294_01/doc.920/e15488/opscrpt_cmd_line.htm

Tuesday, 8 November 2016

running on AWS and need to increase your limits?

This can generally be done within an hour.  Just go to this page and choose the limit that you want to increase.  This will raise a support call that get’s actioned very quickly

https://ap-southeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-southeast-2#Limits:

image

Just click the link to get it increased – that was easy!

Wednesday, 2 November 2016

automated JDE regression testing with OATS

I’ve been doing a lot of work with OTM and OATS for JD Edwards.  This is interesting for the main part, but there have been a couple of challenges along the way.  One of significance was that all of my scripts were working perfectly with openscript, but all failing with “Cannot get a connection from helper after 120 seconds.”

You get to see a much better summary of all your tests on the OATS server in a dir like:

C:\OracleATS\otm\Temp\1478063527633

This will allow you to search and find errors easier.  You can also open the following window in it’s own browser location:

image

image

That is a good find!

But, back to the error :  Cannot get a connection from helper after 120 seconds.

Note that this manifested itself with the following text in c”\oracleATS\logs\process_console_2016-10-31T11-17-31.647a21dbaab-a2f5-400d-b746-8b0be57ac651_

11:19:35,452 ERROR [PlayBackHandler] oracle.oats.scripting.modules.webdom.common.api.exception.BrowserHelperException: Cannot get a connection from helper after 120 seconds.
11:19:37,656 ERROR [1] Error in section Initialize at line (script.java:22). Cannot get a connection from helper after 120 seconds.
oracle.oats.scripting.modules.browser.api.utilities.exceptions.BrowserException: Cannot get a connection from helper after 120 seconds.
    at oracle.oats.scripting.modules.browser.api.utilities.exceptions.BrowserException.createBrowserException(BrowserException.java:27)
    at oracle.oats.scripting.modules.webdom.api.internal.InternalWebDOMService.onAfterLaunch(InternalWebDOMService.java:1434)
    at oracle.oats.scripting.modules.browser.api.BrowserService.onAfterLaunch(BrowserService.java:567)
    at oracle.oats.scripting.modules.browser.api.BrowserService.launch(BrowserService.java:319)
    at script.initialize(script.java:22)
    at oracle.oats.scripting.modules.basic.api.IteratingVUser.initialize(IteratingVUser.java:428)
    at oracle.oats.scripting.modules.basic.api.internal.IteratingAgent.run(IteratingAgent.java:720)
    at java.lang.Thread.run(Thread.java:745)
Caused by: oracle.oats.scripting.modules.webdom.common.api.exception.BrowserHelperException: Cannot get a connection from helper after 120 seconds.
    at oracle.oats.scripting.modules.webdom.api.internal.PlayBackHandler.start(PlayBackHandler.java:155)

This was finally sorted by running the 3 oracle ATS services as a domain account:

image

Once this was done, I started to get other different failures!!  fun fun.

Now I’m dealing with:

21:47:36,827 INFO  [1] End Step: [1] JD Edwards (/E1Menu.maf). Step execution time: 1.653 seconds
21:47:36,868 INFO  [1] Step: [2] JD Edwards EnterpriseOne (/E1Menu.maf)
21:49:40,280 ERROR [1] Error in section Run at line (script.java:99). Find Object timeout. Detail information:/web:window[@index='0' or @title='JD Edwards']/web:document[@index='0']/web:span[@text='Asset Management'].
oracle.oats.scripting.modules.webdom.common.api.exception.ObjectNotFoundException: Find Object timeout. Detail information:/web:window[@index='0' or @title='JD Edwards']/web:document[@index='0']/web:span[@text='Asset Management'].
    at oracle.oats.scripting.modules.webdom.api.elements.DOMTestObject.checkTestObject(DOMTestObject.java:237)
    at oracle.oats.scripting.modules.webdom.api.elements.DOMTestObject.checkTestObject(DOMTestObject.java:261)
    at oracle.oats.scripting.modules.webdom.api.elements.DOMTestObject.checkTestObject(DOMTestObject.java:269)
    at oracle.oats.scripting.modules.webdom.api.elements.DOMElement.checkTestObject(DOMElement.java:2107)
    at oracle.oats.scripting.modules.webdom.api.elements.DOMElement.checkElement(DOMElement.java:769)
    at oracle.oats.scripting.modules.webdom.api.elements.DOMElement.click(DOMElement.java:244)
    at script.run(script.java:99)
    at oracle.oats.scripting.modules.basic.api.IteratingVUser.run(IteratingVUser.java:353)
    at oracle.oats.scripting.modules.basic.api.internal.IteratingAgent.run(IteratingAgent.java:801)
    at java.lang.Thread.run(Thread.java:745)
21:49:40,285 ERROR [1] Iteration 1 failed at line (script.java:99). Find Object timeout. Detail information:/web:window[@index='0' or @title='JD Edwards']/web:document[@index='0']/web:span[@text='Asset Management'].
oracle.oats.scripting.modules.webdom.common.api.exception.ObjectNotFoundException: Find Object timeout. Detail information:/web:window[@index='0' or @title='JD Edwards']/web:document[@index='0']/web:span[@text='Asset Management'].
    at oracle.oats.scripting.modules.webdom.api.elements.DOMTestObject.checkTestObject(DOMTestObject.java:237)

Ahh terrific.  This will be a post for another night!

Monday, 24 October 2016

Trying to log into OATS–404 once again

OATS is often on struggle street,  open up the interface from your favourites and  http://localhost:8088/otm/ – you get a wonderful 404!

Error 404--Not Found

From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:
10.4.5 404 Not Found

The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent.

If the server does not wish to make this information available to the client, the status code 403 (Forbidden) can be used instead. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address.

Great, we know that OATs runs on weblogic and is tightly integrated with the database.  We also know that you can use openScript completely independently of the local database.  You can record any number of scripts locally on a machine, as long as the TestManager or LoadTesting software can see where you have recorded all of your scripts – they can do the coordination.

Anyway, back to the problem.

search for *.log in your OATS install directory and you’ll get a bunch of red herrings:

image

Standard messages about not being able to connect to the database, arrgghhh.

####<18/10/2016 3:26:24 PM EST> <Info> <EJB> <devsoe-PC> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <oats> <BEA1-00002F17E612A743959C> <> <1476764784913> <WL-010227> <EJB Exception occurred during invocation from home or business: weblogic.ejb.container.internal.StatelessEJBHomeImpl@152942e threw exception: javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.1.v20111018-r10243): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [OATS_common_DS].
Internal Exception: javax.naming.NameNotFoundException: Unable to resolve 'OATS_common_DS'. Resolved ''; remaining name 'OATS_common_DS'>
####<18/10/2016 3:26:24 PM EST> <Error> <HTTP> <devsoe-PC> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1476764784932> <WL-101216> <Servlet: "struts-action" failed to preload on startup in Web application: "olt".
javax.ejb.EJBException: EJB Exception: ; nested exception is:
    javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.1.v20111018-r10243): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [OATS_common_DS].

Load up the Database config utility from the start menu, or run C:\OracleATS\bin\DbConfig.bat

image

you’ll eventually get a java screen with the local database connection information (sorry, might not be local)

image

Choose save and it’ll try the connection and give you a MASSIVE hint as to the problem, password expiry!  Wow, that is a painful policy / feature.

image

http://shannonscncjdeblog.blogspot.com.au/2014/10/oracle-accounts-expired-dont-let-it.html

Above link will show you what to do, I’ll do the heavy lifting though, save you some work.

sqlplus / as sysdba

select username, account_status, expiry_date, profile from dba_users;

image

You’ll get a pile of locked accounts as above

select resource_name,limit from dba_profiles;

image

alter the profile limit and see the results:

alter profile default limit password_life_time unlimited ;

image

okay, the limit is changed, but we need to unlock the accounts, as they still fail to log in:

image

Even though I execute an “alter user account unlock”, The password is still expired.

ALTER USER otm identified by XXXX;

ALTER USER oats identified by XXXX;

ALTER USER olt identified by XXXX;

ALTER USER OTM account unlock;

ALTER user OATS account unlock;

ALTER user OLT account unlock;

So, now you need to remember the password you assigned to administrator when you installed oats (well I did), and then “alter user otm identified by XXXXX”;

This triggered the correct change to the profile to get everything working

 

You should then restart your OATs machine (or just the services) and everything should come up working!

image

Yay!

Tuesday, 18 October 2016

Tools 9.2.0.5 and list view

This is a nice enhancement, seen it?

Get a demo account for http://e92demo.myriad-it.com/jde/E1Menu.maf and take a gander.

Have you ever seen the address book look like this:

image

This is easy to do now with list view.

image

This is a new type of user override which gives you the ability to look at things a little differently.

You can also search any of the data on the page easily.

image

Hitting the grid format button above, you’ll see

image

Add the fields that you want, choosing additional lines

image

See that 1 will just give you the data and 2 will give you the field title and the data.

You can also choose your sequencing

image

This is a paste from chrome:

image

You can use control and select specific rows and act upon just them!

Cut and paste does NOT work from the list view

Address Number    Sch Typ    Tax ID    Alpha Name
4    O         Alternate US Parent
43    V         Asia Supplies
280    O         Argentian Company
301    O         Argentina Company
306    O         Australian Company
610    O         Australian Operations
1002    C         ADDA Laurent
1007    C         Andrew Blabla
1030    E    833776655    Allen, Wayne
1616    E         ABC

Monday, 17 October 2016

JD Edwards release dates–makes me feel old

Release LayerAscending Status Release Date Description Features
World Applications    

Reference point for migrations to JD Edwards EnterpriseOne.

1
Xe Applications Sustaining Support 15-Sep-2000

Originally called OneWorld.

305
8.0 Applications Sustaining Support 15-Jun-2002

Originally called ERP 8.

27
8.9 Applications Sustaining Support 15-Sep-2003   120
8.10 Applications Sustaining Support 15-Jun-2004   92
8.11 Applications Sustaining Support 15-Dec-2004

Includes release 8.11 SP1.

228
8.12 Applications Sustaining Support 21-Apr-2006   202
9.0 Applications Extended Support 23-Sep-2008   166
9.0 Update 1 Applications Premier Support 30-Oct-2009   19
9.0 Update 2 Applications Premier Support 10-Nov-2010   67
9.1 Applications Premier Support 16-Mar-2012   125
9.1 Update 2 Applications Premier Support 19-Sep-2013 Additional features have been periodically delivered since the release of 9.1.2:

- February 2014

- April 2014

- July 2014

- December 2014

- January 2015

- April 2015

- July 2015

104
9.2 (previous released February 2014) Applications Premier Support 06-Oct-2015 For additional information on these features and how to access them prior to Applications 9.2, see article 1620420.1 on MyOracle Support. 10
9.2 (previously released April 2014) Applications Premier Support 06-Oct-2015 For additional information on these features and how to access them prior to Applications 9.2, see article 1632021.1 on My Oracle Support. 22
9.2 (previously released July 2014) Applications Premier Support 06-Oct-2015 For additional information on these features and how to access them prior to Applications 9.2, see article 1901372.1 on My Oracle Support. 18

Friday, 14 October 2016

Gamification in JD Edwards vi Google analytics

Gamification is a fairly simple concept where you try and make something fun that is not fun.  So, how are we going to make JD Edwards fun? (wait, am I saying JDE is not fun…).  Actually, perhaps the term fun is not appropriate, perhaps competitive is a better term. 

If you could inject an element of competition in your workers, perhaps they would like to win that competition and depending on how the competition is put together – you might all benefit from it.  An analogy is classic “sales volume”, where you could dashboard this by user by summing their sales orders for the day and putting it on a TV screen on the sales floor!  That’d be a nice thing.  We find that in Australia – that can go one of two ways.  People like it and get involved, or people think it’s a waste of time and don’t want the see the details up in lights – it’s a fine line.  I must admit though – competitive nature does tend to shine through…

We’re are using a metric of “clicks” or interactions with the ERP and reporting on this on a weekly basis for a mobile work order solution that we’ve written for a client.  We have an automated google analytics report that is emailed to all of the managers at the end of every week which summarises the interactions of their staff by user ID.  This has turned out to be a terrific success for getting people on the system.  It turned out to be quite competitive that nobody wanted to be at the bottom of the list, it has increased the usage of the application significantly.

We can also drill down into the detail of the usage and know that users are putting in real transactions – not just “playing”.

image

You can see from the above that we are seeing a healthy upward trend in usage.

We can apply the same mechanism to promote certain behaviors in ERP usage too.  We can export usage data by user and application from JD Edwards on a daily, weekly or monthly basis.  We can filter by certain applications to ensure that only valid applications are being counted towards the tally.  Regular “machine” based emails (not up to an administrator to collate) can be sent to a group which will show the new leader board.

image

As you can see from the above, we can see the users, the screen they are using (in this case a JD Edwards mobile application) and also how often those interactions have been over a period of time. 

This detailed analysis allows us to EASY gauge improvements in our design, whether that is navigation or new functionality.  We immediately know whether the new functionality is being used.  Who is using it (and who is not!).

You could compare departments, functional roles, geographic regions – anything!  The data can be sliced and diced in numerous ways to create a competitive landscape.

Extending JDE to generative AI