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

introspective logging–why do I get this?

$
0
0

This tells you a lot about what is going on with a running UBE

Job Is Not Responding 
Job Is Not Responding

Please look for the highlighted fields, correct the entries, and resubmit your request.

 

 


 


image


The above is annoying, but sensible.  The job only is looking for these interrupts (when you say “hey enable logging”) when JDE is in ER and looping through it’s own engine.  When the UBE is running a massive SQL statement, it’s not out there listening for you to tell it to enable logging. 


Generally if you get the above warning you need to go into EM (if you are oracle or guess if you are other platforms [just kidding there are some other good monitoring tools out there'] and see the statement that is running.  What you need to do is request logging / introspection when the UBE is likely to run some ER… / runtime engine code.


If the SQL statement takes 20 mins to run, you are not going to get introspective logging for ages…


image


Oracle application testing suite install woes–part 2

$
0
0

It’s the MOST frustrating thing to have a piece of software that should install in 15 minutes burn a day of time.  This is a day that you’ll never get back and a day that you cannot change for, as your quote says “1 hour to install and test”.  Far out!!!!  It’s also potentially the most frustrating day that you’ve been on the planet.

I’ve had my fair share of installation problems with OATS, but I find that you must be a mega administrator of the machine, or nothing is ever going to work.  Remember to run the installer as administrator too, just to get that out of the way.  Check that regedit works and you can create keys under the software tree.

I did an install that failed on the oxe installer (this is a REAL problem area for me), and then no matter how much restarting and cleaning up, the installer would not work.  It’s so painful.

C:\Users\shannon.moir>C:\software\OATS-W~2.287\\oxe\setup.exe /s /f1"C:\software
\OATS-W~2.287\\oxe\oxe_install.iss"

The command that it’s failing on is above, this has changed from the last release.  I’m installing 12.5.0.1.


I tried about 8 times with FULL cleans that I’ve mentioned in a previous post.  (regedit, sc delete OracleATSHelper) etc etc.  Nothing worked.


I then decided to install the database manually, just by running C:\software\oats-win32-full-12.5.0.1.287\oxe\setup.exe, leaving all the defaults and remembering the password.


I then ran the OATS installer manually (not choosing the works burger radio button) and chose to use an existing oracle database.  I chose all of the database defaults it gave me and entered the SYS password I chose earlier.  And POW (very batman) I have a working OATS installation.


I might just use this method from now on…

JD Edwards scheduler catch up canceller

$
0
0

You’ve all been in this situation.  The scheduler has been down for the weekend (intended or not) and now you need to switch it on…  But it’s painful.  ALL of the jobs are going to launch and play catch up.  You really do not care for running all of the jobs… again… one after the other… duplicates…  What are you going to do?

Well, you could spend the next 3 hours double clicking queues, holding jobs, deleting next jobs setting status’ – but I’m not going to do that.  I’m going to use my fried SQLCowboy to get the job done – yeeeehar!

First statement holds all of the queues for the ones that are being used in your scheduler (note that I did not use active jobs and I also did not limit by machine – which you might need to).

I then enable the scheduler in JDE

Then you can delete the waiting jobs that have been launched by the SCHEDULER user

Then release the queues

update sy910.f986130 set qcqusts = '02' where QCJOBQUE in (
select distinct CASE WHEN sjjobque IS NULL THEN N'QBATCH' WHEN sjjobque = '' THEN N'QBATCH' ELSE sjjobque END from sy910.f91300
);
commit;
--ENABLE THE SCHJEDULER NOW IN JDE
--WAIT FOR IT TO CATCH UP, IT CAN TAKE A WHILE

--check for active jobs
select count(1) from svm910.f986110 where jcjobsts = 'W' and jcuser = 'SCHEDULER'  ;

--one you are happy with catchup, delete the W jobs
delete from svm910.f986110 where jcjobsts = 'W' and jcuser = 'SCHEDULER' ;
--activate your queues again
update sy910.f986130
update sy910.f986130 
set qcqusts = '02'
where QCJOBQUE in (
select distinct CASE WHEN sjjobque IS NULL THEN N'QBATCH' WHEN sjjobque = '' THEN N'QBATCH' ELSE sjjobque END
from sy910.f91300
);
commit;

select count(1) from svm910.f986110 where jcjobsts = 'W' and jcuser = 'SCHEDULER' ;

delete from svm910.f986110 where jcjobsts = 'W' and jcuser = 'SCHEDULER' ;

update sy910.f986130
set qcqusts = '01'
where QCJOBQUE in (
select distinct CASE WHEN sjjobque IS NULL THEN N'QBATCH' WHEN sjjobque = '' THEN N'QBATCH' ELSE sjjobque END
from sy910.f91300
);
commit;
set qcqusts = '01' where QCJOBQUE in (
select distinct CASE WHEN sjjobque IS NULL THEN N'QBATCH' WHEN sjjobque = '' THEN N'QBATCH' ELSE sjjobque END from sy910.f91300
);
commit;

Different MO viewer in IE

$
0
0

The inline editor in JDE is nice now, but there are some dangers in activating it that you need to be aware of!

ActiveX

If you are using the traditional ActiveX controls for editing media objects, they look like this:

image

Note that this activeX control is showing an MO that was created in the browser based editor, see the html control characters.  This is an old and clunky control too, I’d avoid it if I were you.

The contents from this look like the following in F00165:

{ \ r t f 1 \ a n s i \ a n s i c p g 1 2 5 2 \ d e f f 0 \ d e f l a n g 1 0 3 3 { \ f o n t t b l { \ f 0 \ f s w i s s \ f p r q 2 \ f c h a r s e t 0   C o u r i e r   N e w ; } } 

{ \ c o l o r t b l ; \ r e d 0 \ g r e e n 0 \ b l u e 0 ; }

\ v i e w k i n d 4 \ u c 1 \ p a r d \ c f 1 \ f 0 \ f s 2 0 j h j \ p a r

\ p a r

n e w l i n e \ p a r

\ p a r

a s d s a d a s d s a d n e x t \ p a r

\ p a r

I d u n n o \ p a r

}

You can see how this is actually written as RTF to the BLOB.  This is rubbish and hard to pull apart.  If you get the choice, avoid it.


Inline editor


It looks WAY cooler – see below.  Also it’s the same on other browsers, which is nice.  I recommend making this your standard.  But, read on!


image


image


When you look into the F00165 gdtxft, you see the following text.  Note that SQL developer is pretty lackadaisical about how it interprets the string.  You think it’s totally RAD and interpreting a unicode string, it’s not.  It’s actually displaying a byte at a time the varchar2 string that is coming back from my fancy f() function to cast the RAW to varchar.


The above is really important when it comes to cowboying.

(CLOB) T h i s   i s   a   m e d i a   O b j e c t . < b r / >
T h i s   i s   a   n e w   l i n e < b r / > s o   i s   t h i s        

Note also that the formatting is TOTALLY different, it’s html based formatting.  The <br/> etc is part of the text, but not shown in the HTML representation of the string, as it’s HTML.  Awesome.


So, what you see from above is that you really need to choose one method or the other so that the text is formatted nicely.  The problem will be when you come to print this media object text on a report, it’ll have html control characters OR it’ll have all the RTF stuff.


The choice between the two settings is in SM, illustrated below:


image


Change you just insert Media Objects into F00165?


Yes, OLE and file based is easy, text quite a bit harder = but possible.  What you are going to find is that if you finally work out the correct casting / unicode and text conversion functions in your statement, JDE STILL will not show the text up as text, it’ll all be funny characters.  This is because JDE store the code as little endian / big endian.  This is not really strictly exactly the right use, but let me explain.  unicode is AL16UTF16 (well my unicode) represents most characters in 2 (or more) bytes.  Therefore the character H is 0 & 72 (decimal values for the two bytes). The data is stored in the second byte (when dealing with conversions and unicode routines in the DB).  The issue with JDE is that it uses the first byte at the significant digit.


image


See above, if you just do an insert into the F00165 with something like:

insert into testdta.f00165
values (
'ABGT',
'12',
4,
0,
'',
'HBECK',
115090,
163908,
'AL16UTF16',
'',
'',
'',
'',
'',
'',
0,
0,
utl_i18n.string_to_raw('Hello','AL16UTF16'));

You get “chinese like” characters come up in the APP.  This is because JDE thinks that the first byte is significant, but oracle wrote the second one as significant – DAMN!


If you are a bit nerdy (like me), then there is always a solution.  I wrote a java program that reversed the byte order of the CLOB byte array, therefore converting the oracle based CLOB character significance into something that JDE understands.


What does this mean, well for starters the combination of the java code and the SQL can have you adding media objects that can be read and then written / modified in JDE – nice!  Also, what I learned from doing this means that I’m going to finally write a program that is going to change UBE QUEUEs without checking in or out versions – hack the BLOB in F983051 directly.

simple… return integer to unicode character parameter.

$
0
0

 

It occurs all of the time, you track internal business function success or failure as an integer, and then you finally want to return it to NER / ER / TER as a char, but a double byte char because it’s unicode.

This is somewhat painful, but I have the remedy.  It also uses the crazy ?: operator, which is sure to confuse all of your friends.

In this case if i is non 0, it’ll return 1, else it’ll return 0 – nice.

       lpDS->cErrorCode=i?_J('1'):_J('0') ;

This could be written:

if (i != 0)

{

lpDS->cErrorCode=_J(‘1’) ;

}

else

{

lpDS->cErrorCode=_J(‘0’) ;

}

a little life lesson on nohup and using it

$
0
0

I would nohup everything in my life if it was possible, it’s a very nice way of ensuring that your jobs continue, even if your session does not.  I do a lot of command line driven processing in E1 where I submit a job and cross my fingers that it’s going to complete.  This is generally running a shed load of SQL in the back ground.  The thing is, if I do not use nohup, I pretty much at the mercy of the network connection between my putty session and my server for a solid commit and knowing that everything has finished nicely.

This is where you cannot write long running scripts without the use of nohup. 

The following linux command could be written like:

./convertBigTables.ksh 

but, it’s too risky for a go-live.  So, what should be done is the following:


nohup ./convertBigTables.ksh > ./uniconvlogs/convertBigTablesnohup.log 2>&1 &

Then you can just

tail –f ./uniconvlogs/convertBigTablesnohup.log 

To follow the progress.  It now does not matter what happens with your network, your processing will continue!

JD Edwards mobile applications–the easy way

$
0
0

There is a new mobile app on the scene, this one is surpassing all of the others and is the new standard based upon the oracle AIS server.

There are over 50 apps available for download and running, and we have the server that can run them.  They’ve been specifically written for a tablet or phone.

Goto google play store or apple “what ever” store and search for JD Edwards.  When you see things like “my work orders” etc, download one to your phone.  #10 below

image


Install it

image

Run it

image

image

Enter the URL above, http://myais.myriad-it.com:9090

no promises on the above, I’m unsure that you’ll have access to our other environments.  If this proves to be popular, I’d be happy to make sure that there is a demo username and password for accessing the mobile apps.

image

Username and password that you use for the JDE demo system.  Note that if you are registered for the myriad demo environment, I can get these credentials working fairly easily against the mobility site. http://e91demo.myriad-it.com/jde/E1Menu.maf for registration.

imageimage

Then Whammo!  Enjoy mobility apps.

We’ve had to do lots of patching (and tuning) to get this thing working.  There are many mandatory ESU’s and builds that need to be done.  Some of the apps require the latest tools release too.

We’ve also been writing our own apps using the AIS server and rest and ionic, which is also going quite nicely.  Watch this space.

Google analytics for JD Edwards

$
0
0

I talk about this quite a bit, but only because it’s UBER cool.

Look at this page for example.  This is a real time summary of ALL users on ALL web servers.  The current pages per minute and per second. 

How many JDE users are logged in and what applications they are running.

I’m sorry, this is so much cooler than server manager it’s not funny

If you want this plugged into your JD Edwards ERP – please get in contact and we can make it happen.  The implementation is simple.  You’ll have a birds-eye view of your performance “real-time” and COMPLETE historical analysis too.

If you make any changes, you can see the actual end user impact of those changes.

image


Next numbers (F0002) and how they work

$
0
0

This is a pretty simple post that might be helpful.

You all know that in many situations (not all), JD Edwards get’s it’s next numbers from the next numbers table (with me so far?  I hope so).

The next numbers table is generally in your control library. <rant>I must admit, for the life of me I do not understand WHY this is in the control library.  It should be in the business data library / schema / owner.  This should be fixed “post haste”.  There is no reason that this table should not be classed as data. </rant>

But, let’s get back to the lesson.  The number for address book next numbers comes from F0101, NNN001 (when dealing with default behaviour – you can get fancy with NN by type).  The value in the NN

select NNN001 from prodctl.f0002@jde_p2jde where NNSY = '01';

select max(aban8) from proddta.F0101@jde_p2jde where aban8 < 5000000;
So, we learn from the above that the F0002 contains the next available unique number, you consume then and update it immediately so that the next transaction can select it.  Best to use the BSFN X0002 for grabbing NNs, then you don’t need to worry too much about all of the locking.
    NNN001
----------
4842748

MAX(ABAN8)
----------
4842747

So you can see from the above, in a normal NN situation, the NN has the NEXT value in it, you do not add 1 to the NN, you use the current value and then when you’ve committed your insert of the new AN8, then update the NN.  I also think that JDE does a “SELECT FOR UPDATE” to ensure that the NN table is locked for the duration of the MST (Multi-statement transaction).  This allows NN’s not to get sprayed all over the shop.

SELECT  *  FROM JDE_CRP.CRPCTL.F0002  (UPDLOCK)  WHERE  ( NNSY = '02' )  ORDER BY NNSY ASC FOR UPDATE OF NNN001, NNN002, NNN003, NNN004, NNN005, NNN006, NNN007, NNN008, NNN009, NNN010 

Then also for SQL

UPDATE JDE_CRP.CRPCTL.F0002  SET NNN001=21573840.000000,NNN002=1.000000,NNN003=0.000000,NNN004=0.000000,NNN005=0.000000,NNN006=0.000000,NNN007=0.000000,NNN008=0.000000,NNN009=0.000000,NNN010=0.000000 WHERE CURRENT OF C4E054F0 

Oracle

SELECT PRODCTL.F0002.*, ROWID FROM PRODCTL.F0002  WHERE  ( NNSY = '04' )  ORDER BY NNSY ASC FOR UPDATE OF NNN001, NNN002, NNN003, NNN004, NNN005, NNN006, NNN007, NNN008, NNN009, NNN010 
UPDATE PRODCTL.F0002  SET NNN001=1469670.000000,NNN002=50.000000,NNN003=5038.000000,NNN004=951130.000000,NNN005=434058.000000,NNN006=4695.000000,NNN007=38391.000000,NNN008=2162.000000,NNN009=10628.000000,NNN010=0.000000 WHERE ROWID = :LASTROWID
So select it, lock it while you’ve selected it and then update it ASAP.  Then use the selected VALUE in all your ongoing transactions.
 
 

OATS and automated regression testing

$
0
0

I’m finding this story is getting better and better.

A number of distinct things are pushing me in the direction of automated regression testing:

  1. It works between tools releases, even 9.1.4 and 9.1.5 which has a large difference in look & feel
  2. It’s very easy to use, record and maintain
  3. You can import UPK test scripts directly into functional test cases
  4. You can take advantage of “testing as a service” easily

Let’s look into these in more detail:

It works between tools releases, even 9.1.4 and 9.1.5 which has a large difference in look & feel

I’ve recorded a number of scripts against an old tools release and then tried running them against the new, and in many instances, this just works.  I guess that the magic is in the identification of the elements on the forms and the fact that much of this does not change.

Let’s look at (for example) if OATs wants to record you clicking the find button, it uses a reference (Path) like the below

image

or syntax like window:iframe:img identifier

/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:img[@alt='Find (Ctrl+Alt+I)' or @id='hc_Find' or @index='6' or @src='http://e1ent-dnt.mits.local:9081/jde/img/hc_Findmo.gif']

And actually looks like this code in java – which is essentially clicking the image hc_Findmo.gif

			web.image(
1053,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:img[@alt='Find (Ctrl+Alt+I)' or @id='hc_Find' or @index='6' or @src='http://e1ent-dnt.mits.local:9081/jde/img/hc_Findmo.gif']")
.click();

The chrome browser can also indicate the exact same information in developer mode


image


this provides a generic path to the object on the form.  No matter what styling goes on (css etc), the path maintains it’s accuracy between tools releases:


image


But you can see that the path (unique method of identifying the object on the form) is maintained between the tools release.


So, you’ll find that many of your scripts will also survive.


I was amazed that the fast path continued to work between the tools release, and that is only some nice code that keeps this working.


It’s very easy to use, record and maintain




image


You can quickly do a lot of testing with some very simple recording.  The power of databanks and simple editing techniques in the scripts allows you to quickly create some generic testing capabilities.  In fact, the combination of SQL scripts (oracle DB connect to find data) and regression testing with dynamic data can allow a generic testing service to test standard functionality.


The tool just records what you do and gives you a pretty easy interface to augment or change and of the tests that you want to do.  Really, very simple.

			web.element(
1193,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:nobr[@innerText='Regional Info ' and @text='Regional Info ' and @jdeWebGUIPopupMenu='yes' and @disabled='False' and @onblur='null' and @onclick='null' and @ondblclick='null' and @onfocus='null' and @onkeydown='null' and @onkeypress='null' and @onkeyup='null' and @onmousedown='null' and @onmousemove='null' and @onmouseout='null' and @onmouseover='null' and @onmouseup='null' and @tabindex='0' and @index='21']")
.assertAttributes(
"Check Regional infor button",
web.attributes(web.attribute("tag", "NOBR",
TestOperator.StringExact), web
.attribute("innerText",
"Regional Info ",
TestOperator.StringExact), web
.attribute("text", "Regional Info ",
TestOperator.StringExact), web
.attribute("jdeWebGUIPopupMenu", "yes",
TestOperator.StringExact), web
.attribute("disabled", "False",
TestOperator.StringExact), web
.attribute("onblur", "null",
TestOperator.StringExact), web
.attribute("onclick", "null",
TestOperator.StringExact), web
.attribute("ondblclick", "null",
TestOperator.StringExact), web
.attribute("onfocus", "null",
TestOperator.StringExact), web
.attribute("onkeydown", "null",
TestOperator.StringExact), web
.attribute("onkeypress", "null",
TestOperator.StringExact), web
.attribute("onkeyup", "null",
TestOperator.StringExact), web
.attribute("onmousedown", "null",
TestOperator.StringExact), web
.attribute("onmousemove", "null",
TestOperator.StringExact), web
.attribute("onmouseout", "null",
TestOperator.StringExact), web
.attribute("onmouseover", "null",
TestOperator.StringExact), web
.attribute("onmouseup", "null",
TestOperator.StringExact), web
.attribute("tabindex", "0",
TestOperator.StringExact), web
.attribute("index", "21",
TestOperator.StringExact)));
web.addGlobalVerifyText("CheckFormName", "Work With Addresses",
Source.DisplayContent, TextPresence.PassIfPresent,
MatchOption.Exact);
}
web.textBox(
1051,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:div[@id='HDR_DIV0_1.1' or @text='Alpha\r\nName' or @index='64']")
.click();
{
think(1.573);
}
eone.grid(
1052,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:EOneGrid[@gridName='Work With Addresses' or @gridId='0_1']")
.setQBEValue(0, "121");
{
think(1.201);
}
web.image(
1053,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:img[@alt='Find (Ctrl+Alt+I)' or @id='hc_Find' or @index='6' or @src='http://e1ent-dnt.mits.local:9081/jde/img/hc_Findmo.gif']")
.click();
{
think(2.464);
}
web.element(
1054,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:div[@text='12121' or @index='99']")
.click();
{
think(1.452);
}
web.image(
1055,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:img[@alt='Find (Ctrl+Alt+I)' or @id='hc_Find' or @index='6' or @src='http://e1ent-dnt.mits.local:9081/jde/img/hc_Findmo.gif']")
.click();
{
think(1.612);
}
web.textBox(
1056,
"/web:window[@index='0' or @title='Work With Addresses']/web:document[@index='10' or @name='e1menuAppIframe']/web:form[@id='E1PaneForm' or @name='P01012_W01012B' or @index='2']/web:input_text[@name='qbe0_1.0' or @index='2']")
.click();
{
think(0.22);
}

The above shows the level of code and how easy it is to change something if a developer or ESU has actually changed the internal ID of a field.  The other nice think is that it identifies with a bunch of “OR”s.  So, it checks for index OR name OR id – problem is when things have moved around – the wrong field might begin to get tested.  It’s simple to verify this in E1, especially looking in chome in developer mode.


You can import UPK test scripts directly into functional test cases


This is precisely what you should be doing.  Testing what you train on, train on what you test.  Therefore having UPK scripts create regression test scripts, that can be executed in a hierarchy in a single click is amazing!  You need to change the way that you test.  Your testing people need to be junior developers (java) and work with BA’s from the business.  Or perhaps the BA’s just write the UPK content and the junior developers write and maintain the test scripts.


The automated testing makes the decision to take an ESU MUCH easier, as you can automate an entire CRP / UAT test cycle in days with 0 users.  You can get graphical reporting and understand exactly where the failures occurred.


This is a powerful enhancement that is sure to get more people using OATs test manager and regression testing.


You can take advantage of “testing as a service” easily


Finally and perhaps most importantly, this opens the door to “testing as a service”, which could be completely generic web based testing.  You’d be asked to provide some data ranges and details of modifications – but the OATs regression testing could do the rest.


The test’s could log in, tell you the app, modification history, last to change, dynamically find some data to test with using database queries and then execute a COMPLETE set of testing over a large range of data (let’s imagine address book for example).  Once complete, email a client the summary of the test results.  Too good to be true – no!  This is being done (by Myriad IT) now!


The service is getting better and better all of the time.

Rantings of a impatient CNC consultant

$
0
0

I want to know know where the upgrade is at, and it’s killing me.  Lucky we have the logops table to help us along.  You need to be on an oracle database to see this information.

SELECT SID, SOFAR, TOTALWORK,
ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE", elapsed_seconds, elapsed_seconds/(ROUND(SOFAR/TOTALWORK*100,2))*((totalwork-sofar)/totalwork*100)
FROM V$SESSION_LONGOPS
where sofar != totalwork

The script above is pretty handy, as it tells me the SID and SERIAL# of the sessions that are taking a long time.  How long the SQL has been running and also how many seconds to go.  This is great.


I can see things like index creation and also constraint creation – as well as complex SQL in the results.

Monitoring a go-live with google analytics and fixing table scans with Application Query Security

$
0
0

A recent large go-live has us monitoring things very closely to ensure that we are not getting problems.  Trying to be a little more proactive on problems

Myriad's Google Analytics Realtime

EM12C shows us all of the problem statements.  We are concentrating on the high impact long running statements.  We are able to then track these back to user applications.  This is a little harder than you might think.  Tracing users back trough their session to a web server and then using server manager to find the screens that they have open.  This information and cross reference can generally find the bad statements.

clip_image004

We then use all of the above and the new “Application Query” security to force users to enter at least 1 value into the keyed fields.

This is a a huge Segway from monitoring with google analytics to adding Application Query security for more efficient database queries:

clip_image002[4]

clip_image004[4]

Remember to save it first

clip_image006[4]

Then open it again to configure fields

clip_image007

What I’m doing witht this SQL is finding the first column in all indexes for the F0911.  Then I’m going to make sure that at least one of these is selected for the Application Query Security, so I can be sure that an index is going to be used when people are looking at the F0911.  I don’t want table scans of 65000000 records.

This shows the columns, and then links to DD to help you find the “JDE name” that links to the DD items.

select distinct(column_name), dd1.frowdi,  dd2.frdscr
from all_ind_columns, dd910.f9210 dd1, dd910.f9202 dd2
where table_name = 'F0911'
and table_owner = 'PRODDTA'
and column_position = '1'
and trim(substr(column_name, 3, 10)) = trim(dd1.frdtai)
and dd1.frdtai = dd2.frdtai;

 




    • GLBRE BatchRearEndPostCode                     Batch Rear End Posted Code             
    • GLSBL Subledger                               Subledger                              
    • GLCO Company                                 Company Number                         
    • GLOBJ ObjectAccount                           Object Account                         
    • GLDCT DocumentType                             Document Type                          
    • GLOBJ ObjectAccount                           Cost Type                              
    • GLAID AccountId                               Account ID                             
    • GLCO Company                                 Company                                
    • GLICUT BatchType                               Batch Type                             
    • GLPOST GLPostedCode                             G/L Posted Code                        
    • GLBC BillCode                                 Bill Code                              
    • GLJELN JournalEntryLineNo                       Journal Entry Line Number              
    • GLJELN JournalEntryLineNo                       J/E Line Number                        
    • GLASID SerialTagNumber                         Serial Number                          
    • GLRCND ReconciledROrBlank                       Reconciled       


                     


The about will help you find the screen:

clip_image009

So, we can force users to only query of keyed columns – nice!

 


What link they are using

image

And where they are coming from.

Quick method of determining yearly usage

$
0
0

I was checking the other day whether data had been archived from the production environment.  The easiest way I could think of to do this was to summarise the relevant tables by year, and see how many rows were added for each of the years.

The very simple queries below were used on all of the tables that were in the archive set.  Note that if you were doing this you’d probably be checking the F0911…  Strange that I did not need to!

The only interesting thing about this post is the round command really, allowing you to group by year julian date style

select count(1), round(rpupmj, -3) from uadta.f03b11 group by  round(rpupmj, -3) order by 2 desc; 

select count(1), round(rzupmj, -3) from uadta.f03b14 group by round(rzupmj, -3) order by 2 desc;

select count(1), round(ryupmj, -3) from uadta.f03b13 group by round(ryupmj, -3) order by 2 desc;

Nice UBE / Batch performance summary

$
0
0

This query will give you a performance summary of your batch jobs for the time period that you specify.  It’ll give you number of times the report|version combo has been run, average runtime, slowest run and fastest run.  That is pretty nice.  You can run this daily or weekly and do comparisons.  This is an advanced version that shows the “friendly” name too, so functional people will understand what you are talking about.

I’ve said here, give me the summary of jobs run between the 29/5 and the 11/5.

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
from svm910.f986114,ol910.f9860, pd910.f983051
where trim(jcpid) = trim(siobnm) and trim(jcvers) = trim (vrvers) and trim(jcpid) = trim (vrpid)
and TO_CHAR(JCETDTIM, 'DDMMYYYY') < '29052015' and TO_CHAR(JCETDTIM, 'DDMMYYYY') > '11052015'
group by jcpid, JCVERS, simd || vrjd ;

 


image

infographic for go-live

$
0
0

Technology has changed, we do not write about our successes in words, we use pictures.

Infographic’s are a nerds choice for not writing paragraphs.  I recently completed another go-live and decided to celebrate the usage with a pictochart:

I love a great piece of marketing, I must admit that I think that infographics are awesome for speaking across the many audiences that have something to do with an ERP go live.

 

image

Now, I must give a shout out to piktochart.com in their most simple free offering I was able to create a pretty cool visual summary that people could understand.  I’ve changed some of the numbers of this form to protect the innocent. 

So you can see from the above that there are some really nice pieces of data, some financial and some usage.  All of these were easily extracted from a series of database queries and also google analytics.  Some of the better statistics of course were gathered from ERP analytics.  For instance, we can tell how many ERP pages are loaded per day.  How many unique users log into the application per day.  We can tell how many times EVERY single JD Edwards application was run and how long they took to load.

We were also able to completely explain to the business that the end user performance was better, as we can tell average page load times per day, week and month.  This enabled us to unequivocally tell end user performance HAD improved!

To paint an accurate picture, performance improved, but we went to AWS in the cloud.  We went from pSeries enterprise and database servers to x86 linux.  We went from websphere to WLS 12C.  There was some massive changes! 

I think that the in memory 12C database option was the thing that saved us from some serious performance issues.


Quick “did you know” post

$
0
0

I was using a development workstation the other day, this DID have jDeveloper installed, but did not have SQLDeveloper…  How that occurred – I will never know.  But the really cool thing I worked out (quite randomly) was that I could evoke a JDeveloper version of SQL and use SQL work sheets from JDeveloper.  This was a really nice find.  It also helps me when I’m using JDeveloper on my mac.

image

To view your connection details, goto window –> databases

image

And see

image

This is really neat.  Very easy to set up connection strings too, of course, because it’s oracle – very easy to find jdbc’s drivers for oracle.

The reason I’m doing this is long and convoluted, I’ll probably post some more details of it soon. 

We are developing a piece of software that will enable you to print attachments as well as reports from JDE.  So, for example, if you wanted to print today’s work orders and the attachments for those work orders, then you could do this automatically.  Our software will find the WO# in the BIP output (or standard PDF) and then query the F00165, find the relevant attachments – download them if necessary and then print them using the appropriate printing software.  WOW – how cool is that!  It’ll also print a cover sheet of the attachments and what was printed. 

We are developing this for the use-case of work orders, but we can see that this is going to be popular for many different business scenarios (ITEM’s / sales orders / addresses etc).

We needed to spend some time ripping the XML data from the F95630 table for the reports that have been run so that we could reverse engineer the data coming out for each report.  There was some slightly tricky stuff to make that visible, but nothing has stopped us so far.

Performance history queries, release 2

$
0
0

I’ve found a bit of a mistake in one of my historical posts, so it’s time to make it right.

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
from svm910.f986114,ol910.f9860, pd910.f983051
where trim(jcpid) = trim(siobnm) and trim(jcvers) = trim (vrvers) and trim(jcpid) = trim (vrpid)
and JCETDTIM < TO_DATE('01072015','DDMMYYYY') and JCETDTIM > TO_DATE('01062015', 'DDMMYYYY')
group by jcpid, JCVERS, simd || vrjd ;

Above is the new improved code, but the difference is subtle (just like the b in subtle).  I’m using date comparison, not string comparison of the dates, which is more accurate. My SQL would have been correct if I put YYYYMMDD, because then then string comparison is accurate for dates – but because I was putting the day first – things were a little “all over the shop”.


The old code was here:


http://shannonscncjdeblog.blogspot.co.nz/2015/06/nice-ube-batch-performance-summary.html

RTE port mapping, the wrong and right way

$
0
0

Interoperability is becoming more and more important and RTE is a great way of getting events out of JDE and into other systems.

Are you finding JDE locking up when RTE messages are being sent out of the system?

When configuring RTE, please remember:

  • The WLS listen port is the port that external systems will come in a pull messages off the queue.  This is NOT the port that JD Edwards talks to.  This is NOT the port that you configure in OCM for the active RTE service record.
  • The JDENET Listen port must be the SAME as the port you put in the OCM’s for the RTE

imageimage


Note that you may get lucky and messages will be delivered, but this is because they are “pulled” by the RTE code from F90710, not pushed by the network kernels via the call object kernels.

Note also that you’ll see things like this in your error log for jdenet_n:


1400/9228 MAIN_THREAD                      
Thu Jul 23 13:27:58.282000
NETFLOW.C1032
1400 (pid) in routeOutgoingQueue(), unable to send message: sd=-1, msgId=72066, msgHost=10.200.11.121, msgPort=8085, sendingHost=10.200.11.15, msgType=15501, msgRange=28, krnlName=APP SERVER KERNEL, reqNet=0, resNet=0, reqKrnl=14008, resKrnl=0, msgFlags=0.

1400/9228 MAIN_THREAD                      
Thu Jul 23 13:30:57.621000
NETFLOW.C1032
1400 (pid) in routeOutgoingQueue(), unable to send message: sd=-1, msgId=72132, msgHost=10.200.11.121, msgPort=8085, sendingHost=10.200.11.15, msgType=15501, msgRange=28, krnlName=APP SERVER KERNEL, reqNet=0, resNet=0, reqKrnl=14008, resKrnl=0, msgFlags=0.

1400/9228 MAIN_THREAD                      
Thu Jul 23 13:32:10.052000
NETFLOW.C1032
1400 (pid) in routeOutgoingQueue(), unable to send message: sd=-1, msgId=72193, msgHost=10.200.11.121, msgPort=8085, sendingHost=10.200.11.15, msgType=15501, msgRange=28, krnlName=APP SERVER KERNEL, reqNet=0, resNet=0, reqKrnl=14008, resKrnl=0, msgFlags=0.

1400/9228 MAIN_THREAD                      
Thu Jul 23 13:36:37.048000
NETFLOW.C1032
1400 (pid) in routeOutgoingQueue(), unable to send message: sd=-1, msgId=72264, msgHost=10.200.11.121, msgPort=8085, sendingHost=10.200.11.15, msgType=15501, msgRange=28, krnlName=APP SERVER KERNEL, reqNet=0, resNet=0, reqKrnl=14008, resKrnl=0, msgFlags=0.

1400/9228 MAIN_THREAD                      
Thu Jul 23 14:28:20.298000
NETFLOW.C1032
1400 (pid) in routeOutgoingQueue(), unable to send message: sd=-1, msgId=72624, msgHost=10.200.11.121, msgPort=8085, sendingHost=10.200.11.15, msgType=15501, msgRange=28, krnlName=APP SERVER KERNEL, reqNet=0, resNet=0, reqKrnl=14008, resKrnl=0, msgFlags=0.

1400/9228 MAIN_THREAD                      
Thu Jul 23 14:29:42.775000
NETFLOW.C1032
1400 (pid) in routeOutgoingQueue(), unable to send message: sd=-1, msgId=72687, msgHost=10.200.11.121, msgPort=8085, sendingHost=10.200.11.15, msgType=15501, msgRange=28, krnlName=APP SERVER KERNEL, reqNet=0, resNet=0, reqKrnl=14008, resKrnl=0, msgFlags=0.


One crazy thing is that this causes a FULL SYSTEM lockup.  While the jdenet kernel is waiting for the TCP confirmation – everything stops!!!  Crykie – that’s not good.

Please be careful with your port specifications when using RTE!

More on RTE and the fix for yesterdays problem

$
0
0

An update on this.

To fix, you generally need to choose a unique net listener port for the RTE net listener and then change the RTE OCM’s to point to that port.  You then need to reset the OCM cache for the kernels.

To change the service entry port

, I goto P90701A

image

From here choose the Server Map’s and System’s for the machines that will need to change (anything that is going to do an RTE lookup).  Then change the RTE mapping to the correct port.

For some reason I had to delete the old entries and add new ones, could not make inactive and copy…

Secondly, the cache reset to the network kernels start looking to the right RTE server for message delivery.

To reset the cache From WSJ, goto form advanced choose the server from the list below

image

Choose the server and then

image

Choose the reset cache row exit

Then the cache that you want to reset

image

All done, messages should go to the right port for RTE and everything will start to behave nicely.

JD Edwards ERP usage statistics via google analytics–better compare

$
0
0

I’ve blogged about the plugin we’ve written for JD Edwards to expose the usage and performance data of your ERP to google analytics.  This gives you unprecedented power in working out how your ERP is being used, what your users are doing and how you should focus your enhancements.

Google analytics has recently enhanced the dash boarding capability to allow you to compare different periods in time, so you are able to compare this month to last month (for example) and determine performance and usage differences.

clip_image001

It’s really easy to see a comparison, all you do is login to google analytics and choose the period for reporting:

clip_image002

Click the compare to and choose your range.

Then you get two lines for all of the statistics – AWESOME!

We can compare a users productivity, week on week / day on day

clip_image003

Or the entire ERP’s usage

clip_image004

A little hint is to make the compare date range start with the same day of the week, because the ERP usage drops significantly on the weekends.

So now we can show you holistically the results of a change to your infrastructure and what that did to aggregated system performance and response times.

Viewing all 541 articles
Browse latest View live