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.

Extending JDE to generative AI