Quantcast
Channel: Shannon's JD Edwards CNC Blog
Viewing all 541 articles
Browse latest View live

Performance comparison ODA vs. AS/400 part 2

$
0
0

I wrote recently on comparing performance between a new platform and an old platform previously (here).  Note that this was comparing an OLD AS/400 with a new engineered appliance. This blog entry was a method by which you might be able to simulate a similar batch load on your new platform without having all of the users connected.

The article showed you how to generate the command line commands for running the batch load on your new enterprise server, create a script and away you go.

I ran this 5 times on the new platform and then gathered statistics from F986114 of both environments so that I could do an accurate comparison of the performance.

I cheated a little bit, despite having database links to the AS/400, I decided to do some number crunching in EXCEL.

clip_image002[4]

Above is what the spreadsheet looked like at the end of the day. There are a couple of important elements that I’d like to explain.

I’m going to use some real world numbers, but also abstract the client from this post. I hope I do a good job.

I found that there were 800+ unique jobs that took more than 1500 seconds to run, so this was a really good workload to send to the new batch server.

When comparing the performance I needed to add an additional dimension to the data – which was rows processed. I needed this further dimension, as if the jobs where not processing a similar amount of rows (for the main loop), then the compare is pointless. I decided to only compare batch jobs that processed a workload that was within 20% of each other.

The above filtering gave me a unique list of 221 jobs that processed a workload that was within 20% of the original amount.

Great, so this is a pretty good amount. I can compare the runtime of 221 distinct and unique real world batch jobs between the old system and the new system and see, on average, which was faster or slower.

I don’t want to let any cat’s out of the bag, but in the situation I was testing I saw that the replacement server was 2.7 times slower on average. Wow, there is some significant tuning to complete to get this thing singing.

There are lots of things that need further analysis and justification, so please don’t just assume that the replacement hardware that I’ve hinted to above is slow, by no means this is the case – it’s great. Perhaps just not as great as what it needs to be to replace a monster AS/400.

I’m going to continue the analysis, but the jury is out for the particular configuration that has just been tested.

alter session set global_names = FALSE;

SELECT JCPID as INNERPID, JCVERS as INNERVERS, simd || vrjd, count(1) as INNERCOUNT, Avg(86400*(JCETDTIM-JCSTDTIM)) as INNERAVERAGE, min(86400*(JCETDTIM-JCSTDTIM)) AS INNERMIN, max(86400*(JCETDTIM-JCSTDTIM)) AS INNERMAX, avg(jcpwprcd) as "ROWS PROCESSED"from svm900.f986114@youras400.com t1,ol900.f9860@youras400.com,copd900.f983051@youras400.com, svm900.f986110@youras400.com t2where trim(t1.jcpid) = trim(siobnm) and trim(t1.jcvers) = trim (vrvers) and trim(t1.jcpid) = trim (vrpid)and t1.jcjobnbr=t2.jcjobnbrand t1.jcexehost = 'YOURAS400'group by 'runube JDE JDE PY900 *ALL ' || JCPID || '' || JCVERS || CASE WHEN jcjobque IS NULL THEN N'QBATCH' WHEN jcjobque = '' THEN N'QBATCH' ELSE jcjobque END || ' Batch Hold Save', t1.jcpid, JCVERS, simd || vrjd having Avg(86400*(JCETDTIM-JCSTDTIM)) > 15 and Avg(86400*(JCETDTIM-JCSTDTIM)) < 15000;

The above SQL will give you a list of jobs that took longer than 150 seconds to process on the AS/400.

SELECT JCPID as INNERPID, JCVERS as INNERVERS, simd || vrjd,

count(1) as INNERCOUNT,

Avg(86400*(JCETDTIM-JCSTDTIM)) as INNERAVERAGE,

min(86400*(JCETDTIM-JCSTDTIM)) AS INNERMIN,

max(86400*(JCETDTIM-JCSTDTIM)) AS INNERMAX, avg(jcpwprcd) as "ROWS PROCESSED"

from svm900.f986114,ol900.f9860@jdeprod_dblink, py900.f983051

where trim(jcpid) = trim(siobnm) and trim(jcvers) = trim (vrvers) and trim(jcpid) = trim (vrpid)

and JCETDTIM < TO_DATE('25082016','DDMMYYYY') and JCETDTIM > TO_DATE('01062015', 'DDMMYYYY')

group by jcpid, JCVERS, simd || vrjd ;

Above is to get the results of all batch jobs processed on the linux server for compare.

clip_image004[4]

Above is a graphical compare of the old and the new. The old server runtime is in blue.

Hmm, more tuning needed


This is a simple guide to help me next time I need to start VM’s on an ODA.

$
0
0

This post started life as a description of oakcli commands and where to run them. Pretty simple… It ended up with me really trying to understand the virtualised ODA architecture and where it might be letting me down.

All my research came down to a couple of salient facts:

· Start and stop VM’s from oakcli on ODA_BASE

· Start and stop ODA_BASE from Dom0

First, you should do with through EM12C if you can, but I had a pile of problems with that too.

So, you need to use oakcli – nice…  go old school on it

oakcli is a command that seems to do anything for your VM’s on your ODA.

A good reference is here:  https://docs.oracle.com/cd/E22693_01/doc.12/e55580/oakcli.htm

Before you start hacking away, it’s nice to understand what you are dealing with when you have a virtualized ODA.

What are all these machines?

clip_image002

image

Each “Dom X” is a VM, where Dom0 is the management domain and Dom 1 is the ODA_BASE domain (a Dom U with special privs). All of these Dom’s sit above the hypervisor.

clip_image009

Each node is a physical machine

So, you’ve probably called your host – ronin… After the singer!

Dom0 gives you control over the hypervisor (ronin0_net1)

Dom1 is ODA_BASE (which is a glorified Dom U), it has direct access to the storage shelf.

Dom U is user domains, for each VM essentially

clip_image011

Then you have ronin0 and ronin1 which are hostnames for each of the ODA_BASE machines on your physical “ronin” ODA. You then have hypervisors (essentially another VM) known as ronin0_net1 and ronin1_net1.

Oakcli from Dom0

So you need to login as root to ronin0_net1 to use the oakcli command interface:

which oakcli

/opt/oracle/oak/bin/oakcli

if you are in Dom0, you have a limited number of objects for oakcli, but you still have the same command:

[root@ronin1-net1 ~]# oakcli show oda-base Usage: oakcli [] : [show | configure | deploy | start | stop | restart | create | delete]: [firstnet | additionalnet | ib2fiber | oda_base | env_hw | vlan | network] []: [force] []: [-changeNetCard | -publicNet] available with configure network

[root@buttons-net1 ~]# oakcli show oda_base
ODA base domain
ODA base CPU cores      :8
ODA base domain memory  :384
ODA base template       :/OVS/oda_base_12.1.2.5.tar.gz
ODA base vlans          :['net1', 'net2']
ODA base current status :Running

Oakcli from ODA_BASE

You get a few more options from ODA_BASE, you can actually control your VMs. Now, this is strange, as the Dom0 machine actually has them running within it… Very strange to me.

So, when you are on ODA_BASE, you can run vm commands:

[root@ronin0 tmp]# oakcli show vm

         NAME                                  NODENUM         MEMORY          VCPU            STATE           REPOSITORY

        bear                                    1               8192M              2            ONLINE          jderepotst
        chinapeak                               0               8192M              2            ONLINE          jderepotst
        georgetown                              0               8192M              2            ONLINE          jderepotst
        homewood                                0               8192M              2            ONLINE          jderepotst
        jdessosvr                               0               4096M              2            ONLINE          jderepotst
        mountshasta                             1               8192M              2            ONLINE          jderepotst

Note also that the database and grid run in ODA_BASE too:

oracle   57905     1  0 Apr15 ?        00:55:14 ora_ckpt_JDETEST1
oracle   57909     1  0 Apr15 ?        00:18:57 ora_smon_JDETEST1
oracle   57913     1  0 Apr15 ?        00:01:06 ora_reco_JDETEST1
oracle   57917     1  0 Apr15 ?        00:35:03 ora_mmon_JDETEST1
oracle   57921     1  0 Apr15 ?        06:05:21 ora_mmnl_JDETEST1
oracle   57925     1  0 Apr15 ?        00:01:33 ora_d000_JDETEST1
oracle   57929     1  0 Apr15 ?        00:01:27 ora_s000_JDETEST1
oracle   58081     1  0 Apr15 ?        06:44:49 ora_lck0_JDETEST1
oracle   58089     1  0 Apr15 ?        00:06:48 ora_rsmn_JDETEST1
oracle   58287     1  0 Apr15 ?        00:02:24 ora_arc0_JDETEST1
oracle   58291     1  0 Apr15 ?        00:03:50 ora_arc1_JDETEST1

See above there are a heap of processes for the JDETEST1 RAC instance of the database

When logged into Dom0, you actually see the ODA_BASE VM and the other VM’s if you PS for a command.

Note also that your VM’s don’t run in ODA_BASE, they run in Node 0

[root@ronin1-net1 ~]# ps -ef | grep domain
root      6590 10362  0 21:38 pts/2    00:00:00 grep domain
root     15970 15027  0 Mar04 ?        04:58:17 /usr/lib64/xen/bin/qemu-dm -d 1 -domain-name oakDom1 -videoram 4 -vnc 0.0.0.0:0 -vncunused -vcpus 16 -vcpu_avail 0xffff -boot c -serial pty -acpi -net none -M xenfv
root     31107 15027  2 16:26 ?        00:08:16 /usr/lib/xen/bin/qemu-dm -d 7 -domain-name bear -videoram 4 -vnc 0.0.0.0:10 -vncunused -vcpus 2 -vcpu_avail 0x3L -boot c -acpi -usbdevice tablet -net none -M xenfv
root     49452 15027  2 Apr07 ?        3-17:47:50 /usr/lib/xen/bin/qemu-dm -d 5 -domain-name mountshasta -videoram 4 -vnc 0.0.0.0:10 -vncunused -vcpus 2 -vcpu_avail 0x3L -boot c -acpi -usbdevice tablet -net none -M xenfv

Note that an interesting point is that the first vm above is actually ODA_BASE or oakDom1.  So the _net1 is the bare metal host.

If you run this command from the dom0 on the other node,

[root@ronin0-net1 ~]# ps aux |grep domain

root 5674 2.5 0.0 64744 2944 ? SLl Aug01 876:22 /usr/lib/xen/bin/qemu-dm -d 16508 -domain-name chinapeak -videoram 4 -vnc 0.0.0.0:10 -vncunused -vcpus 2 -vcpu_avail 0x3L -boot c -acpi -usbdevice tablet -net none -M xenfv

root 15964 0.2 0.0 56552 996 ? SLl Mar04 573:03 /usr/lib64/xen/bin/qemu-dm -d 1 -domain-name oakDom1 -videoram 4 -vnc 0.0.0.0:0 -vncunused -vcpus 16 -vcpu_avail 0xffff -boot c -serial pty -acpi -net none -M xenfv

root 39236 0.0 0.0 61208 736 pts/5 S+ 22:38 0:00 grep domain

root 60399 4.0 0.1 64744 5100 ? SLl Apr07 8210:40 /usr/lib/xen/bin/qemu-dm -d 12 -domain-name georgetown -videoram 4 -vnc 0.0.0.0:10 -vncunused -vcpus 2 -vcpu_avail 0x3L -boot dc -acpi -usbdevice tablet -net none -M xenfv

root 61443 2.6 0.0 64744 956 ? SLl Apr07 5231:00 /usr/lib/xen/bin/qemu-dm -d 13 -domain-name homewood -videoram 4 -vnc 0.0.0.0:10 -vncunused -vcpus 2 -vcpu_avail 0x3L -boot c -acpi -usbdevice tablet -net none -M xenfv

You see another ODA_BASE (of course, because we are running RAC), but you see a different list of Dom0’s

This is a great diagram of how disk works for OVM guest OS’s on the ODA:

clip_image013

What a mess! The hypervisor exposes disk to ODA_BASE a little more natively, but VM disks are exposed as a NFS share to an ACFS volume. The above is stolen from http://blog.dbi-services.com/oda-vms-possibilities-a-performances/ . So you have VMs running on the hypervisor which are stored on an NFS share itself exported by a VM……not the most efficient architecture.

nodemanager password problems

$
0
0

I’m using a copy of a copy of a copy of a web server to make another web server, this is the quickest way…

Why?  I have patched it, tested it, installed server manager etc.  This is easy when clients are using AWS, as I have pre-baked AMI’s with my JD Edwards code already installed.  Very simple for me to share the AMI and get the server up and running very quickly.  Just depends on how “baked” the AMI is.

I have a bit of an issue though (actually two).

First issue is to ensure that the nodemanager password from nm_password.properties has the correct values.  I use nmstart in all of my service start commands, and this password needs to be right to connect to the nodemanager automatically.

You cannot just enter a plain text value into this like the boot.properties.  I think that you need to do nmenroll or use WLS console.  So, it’s easy to change the weblogic password, and move on.  Change the boot.properties in the /u01/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/e1_apps/servers/AdminServer/security/ dir

image

Then you need to ensure that your nodeManager passwords are also updated, different location in the console.

image

Then

image

 

So, now the mn_password.properties file in /u01/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/e1_apps/config/nodemanager/ will be updated

[root@vawswls50 user_projects]# ls -l ./domains/e1_apps/config/nodemanager/nm_password.properties
-rw-r-----. 1 oracle oracle 79 Sep 13 12:16 ./domains/e1_apps/config/nodemanager/nm_password.properties
[root@vawswls50 user_projects]# ls -l ./domains/e1_apps/config/nodemanager/nm_password.properties
-rw-r-----. 1 oracle oracle 135 Sep 13 13:20 ./domains/e1_apps/config/nodemanager/nm_password.properties

After hitting save and activating the changes in WLS console, you have the confirmed changes to the file above.  Now the server is going to start using nmStart, let’s test it out.

using mnConnect without specifying passwords in a text file

$
0
0

Easy, well you’d think.

There is a bit of a caveat, we  are creating a key file and a credential file.  If people can get a hold of these, then they can run nm commands as that user without needing to know the username and password, so you need to keep these files a little bit secure and secret.  chmod is your friend.

firstly, lets explain the problem

if a shell script, you run the following to start a server

/u01/oracle/Oracle/Middleware/Oracle_Home/oracle_common/common/bin/wlst.sh /u01/startscripts/nmStartServer.py

import sys;
print 'Starting with :',str(sys.argv);
if len(sys.argv) != 1:
  print 'Usage nmstartsvr.py servername'
  sys.exit(2)
try:
  print 'Connecting to nodemanager and creating encrypted credentials'
  nmConnect('weblogic','mySecurityHole',domainName='e1_apps', port='5556', nmType='ssl');

So that is great, we need to stop using mySecurityHole, so we now create a new script:

This has the connect and the following line:

import sys;
print 'Starting with :',str(sys.argv);
if len(sys.argv) != 1:
  print 'Usage nmEncryptPassword.py '
  sys.exit(2)
try:
  print 'Connecting to nodemanager and creating encrypted credentials'
  nmConnect('weblogic',’mySecurityHole;,domainName='e1_apps', port='5556', nmType='ssl');
  storeUserConfig(userConfigFile='/u01/startscripts/userconfig.secure', userKeyFile='/u01/startscripts/userkey.secure',nm='true');
except:
  print 'Could not change the password or store it to nodemanager'
  sys.exit(2)
exit()

So you can create the two files '/u01/startscripts/userconfig.secure', & '/u01/startscripts/userkey.secure'– the script will do this for you.

You only run the above once, which is nice.  The next thing you do is change your nmConnect line like below:

import sys;
print 'Starting with :',str(sys.argv);
if len(sys.argv) != 1:
  print 'Usage nmstartsvr.py servername'
  sys.exit(2)
try:
  print 'Connecting to nodemanager and creating encrypted credentials'
  nmConnect(userConfigFile='/u01/startscripts/userconfig.secure', userKeyFile='/u01/startscripts/userkey.secure',domainName='e1_apps', port='5556', nmType='ssl');

viola! You are now using a keyfile to run start, not the plain text credentials.

Note that in between I started to get:

Connecting to nodemanager
Connecting to Node Manager ...
This Exception occurred at Thu Sep 15 14:09:14 AEST 2016.
java.io.IOException: Get a TLS/SSL Alert. Connection is rejected. Probably caused by attempting to connect to a SSL server (SecureListener==true in nodemanager.properties) with a Plain client.
Could not connect to nodemanager

I noticed that I’d cut and pasted wrong  nmConnect(userConfigFile='/u01/startscripts/userconfig.secure', userKeyFile='/u01/startscripts/userkey.secure',domainName='e1_apps', port='5556', nmType=’plain’);

Once this was back to ssl, all was good in the WLST world.

Building blocks–exactly what a DD is!

$
0
0

This is a post for all DEV and CNC people to use when deciding how they are going to change some description on a screen.  It’s important to consider the lifecycle of the change, not just the time it takes for you to hack the change into FDA.  You need to think about ESU’s, upgrades and more to ensure that you are doing the right thing and the cheapest method of making your change.

Verbatim from oracle support – “To override the data dictionary default text in the application, the following methods are available and the text override method is applied in the following order:”

And here are the handy documents and some description from me.

  1. Data Dictionary Text Change
    Review Document 626622.1 E1: DD: Data Dictionary Text Change
  2. Data Dictionary Jargon
    Review Document 626565.1 E1: DD: Data Dictionary Jargon Code
  3. Vocabulary Overrides
    Review Document 626466.1 E1: DD: Vocabulary Overrides
  4. Event Rule Code
    Review Document 865183.1 E1: DD: Override Application Text using Event Rule code

DD

  • DD Text is easy and goes everywhere that there has not been a specific override done, P92001
  • DD affects interactive and batch the same
  • Do a full package after a DD change, just to be sure.  Then you’ll know what you have to do next if some text does not change
  • If you have made a change with FDA / Jargon or Vocab overrides – this is NOT going to work!

Jargon

  • This is like an override per system code
  • So finance people call MCU Business Unit and Distribution call it warehouse, cool
  • We have a Jargon code for a task which says whether it’s 09 or 42 and we have an alternate description based upon that
  • Note that a task can have a jargon code, and a application can define it with OMW Product System Code of the Application

image

image

image

Note that the screen shot above is for the various descriptions per system code for MCU

Vocab overrides (VO)

  • first rule of vocab overrides is don’t use vocab overrides
  • The second rule of vocab overrides is don’t use vocab overrides
  • The third rule of vocab overrides is to understand them to use them properly! (thanks fightclub!)
  • Apart from changing code, this is as hard core as configuration gets. 
  • The only thing that is going to trump a VO is code change.  So – unless you are tucking into FDA and RDA – this is your last chance to get your description correct.
  • Remember that vocab overrides write DIRECTLY to central objects, no check-out needed!  WOW!
  • So you change a VO, the change is written to the F987* files for the pathcode that the project status allows you to check-in to.  There is a leap of faith there, I hope you understand what I wrote.  It does not change your local SPECS.  You need to do a get!  (When making Vocabulary Override changes in the Vocabulary Overrides application, the application updates the information in the Central Objects repository directly. The information is not updated in the local client specifications. In order to see the changes the specifications can be deployed in a package or the specifications can be refreshed on the individual local client.)
  • You should only do VO’s under the guise of OMW, as the objects will need to be promoted.
  • They are cheeky and sometimes require a bunch of builds and deploys.
  • You need a fatty for them
  • They do not survive an upgrade or ESU
  • After checking in the application, the vocabulary overrides can be verified using P9220
  • Vocabulary Overrides are stored by language:
    • in FDATEXT by Interactive Application name, TextID, Language
    • in RDATEXT By Batch Application template/version, TextID, Language
  • Below is an interesting sequence of screen shots demonstrating JDE not recognising a subsequent change to a VOCAB, a rechange / back to original messes everything up.
  • It shows that the specs on the app have the new description of “Shannon”, but the vocab overrides app thinks that it’s the first changed value – wow – what a mess.

clip_image002

If you look in UTB for local specs:

clip_image004

The id is 2088 and it’s got a value of Shannon, but if you look at vocab overrides, it’s default

clip_image006

Where is it coming from?

Delete glbltbl and dd* from spec dir – still wrong  - delete runtimecache for fdaspec in spec dir – still wrong.

Restart JDE on fatty

Still wrong locally

clip_image008

I change to Wrong Side failure (note that I cannot use the overridden DD item description, as it marks the item as not changed if I use this)

clip_image010

When I open the item, I get the standard description:

clip_image012

But, it’s been overridden in CO in PY.

No matter if I get from PY too, I still do not get the override

clip_image014

ER Code:

This one is simple, open the app and change the description.  Follow your SDLC and it’ll work like any other change.

uninstall deployment server…

$
0
0

It hurts, but it needs to be done.

I’ve been fighting an install of JDE92 on a dep server and need to start again, I’ve messed up tnsnames and the import of the data has failed.

I was able to run “attach_

but, now I’ve got problems with C:\JDEdwards\E920_1\Planner\data\attach_metadata

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit
Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
ions
ORA-39001: invalid argument value
ORA-39000: bad dump file specification
ORA-31640: unable to open dump file "C:\JDEdwards\E920_1\Planner\spec\SPEC_E920.
DMP" for read
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.

This is not good.  I find this – and it basically says start again - https://support.oracle.com/epmos/faces/DocContentDisplay?id=2149904.1

Note that I did learn that the default passwords for system etc are admin in all of the install scripts.  I used ReconfigureMSDE a number of times to change the admin password,s this was handy…  I got the attach_planner to work, but the attach spec would not – Doh!

So start again – ouch!

I find 2012 hard to navigate still – which is bad I know.  Too much time selling and not doing!

I find the program files in this folder, C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Oracle - JDE_DEP920_HOME1\Oracle Installation Products

So, easy to run the correct uninstaller from there.

image

The corrective actions suggested in AWS are:

Step 2: Corrective actions to ensure connection to database
1, Make sure copy the tnsnames.ora file from X:\Oracle\E1Local\Network\Admin to 32BIT Client Home\Network\Admin
For example: C:\Oracle\E1Local\Network\Admin\tnsnames.ora to C:\app\product\12.2.0\client_1\network\admin
was this process done.This has the necessary information to connect to E1Local
2.Set the ORACLE_HOME value for the E1Local database to <drive:>\Oracle\E1Local from command prompt.This precautionary measure helps in case there is an old installation of E1Local interfering with the OUI installer.
3.Make sure the tnsnames.ora and the listener.ora have a host name or IP address instead of localhost (both tnsnames.ora and listener.ora should consistently have either a host name or IP address in both the places).

I had 1 and 2 covered…  I did number 3 and the install worked…  Although this could have been a restart between config too…

if you connect to e1local on the deployment server,

image

you’ll see the above owners when things are right

Gamification in JD Edwards vi Google analytics

$
0
0

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.

JD Edwards release dates–makes me feel old

$
0
0
ReleaseLayerAscendingStatusRelease DateDescriptionFeatures
WorldApplications  

Reference point for migrations to JD Edwards EnterpriseOne.

1
XeApplicationsSustaining Support15-Sep-2000

Originally called OneWorld.

305
8.0ApplicationsSustaining Support15-Jun-2002

Originally called ERP 8.

27
8.9ApplicationsSustaining Support15-Sep-2003 120
8.10ApplicationsSustaining Support15-Jun-2004 92
8.11ApplicationsSustaining Support15-Dec-2004

Includes release 8.11 SP1.

228
8.12ApplicationsSustaining Support21-Apr-2006 202
9.0ApplicationsExtended Support23-Sep-2008 166
9.0 Update 1ApplicationsPremier Support30-Oct-2009 19
9.0 Update 2ApplicationsPremier Support10-Nov-2010 67
9.1ApplicationsPremier Support16-Mar-2012 125
9.1 Update 2ApplicationsPremier Support19-Sep-2013Additional 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)ApplicationsPremier Support06-Oct-2015For 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)ApplicationsPremier Support06-Oct-2015For 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)ApplicationsPremier Support06-Oct-2015For additional information on these features and how to access them prior to Applications 9.2, see article 1901372.1 on My Oracle Support.18

Tools 9.2.0.5 and list view

$
0
0

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

Trying to log into OATS–404 once again

$
0
0

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

selectusername, account_status, expiry_date, profile fromdba_users;

image

You’ll get a pile of locked accounts as above

selectresource_name,limit fromdba_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!

automated JDE regression testing with OATS

$
0
0

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!

running on AWS and need to increase your limits?

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

$
0
0

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

configure SMTP server for OATS–oracle application testing suite

$
0
0

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 spaces in databank alias’

$
0
0

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);


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

$
0
0
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.

JD Edwards and Azure AD Services for SSO via oauth

$
0
0

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?

OATS JDE regression testing & data banks

$
0
0

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.

Installing JD Edwards in AWS using RDS

$
0
0

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!

More accurate automatic data selection entry tips

$
0
0

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.

Viewing all 541 articles
Browse latest View live