A lot of changes, like this one, cannot be made through the application at all - only through SQL. Damn you, IBM.
Why there is no screen for it
Duplicate an application in Application Designer and Maximo will show it in the Go To menu, nested under whatever you copied. Duplicate Work Order Tracking and your new application turns up when you hover over Work Orders, three levels from where anyone will look for it.
What people usually want is their own top-level module, sitting next to Assets and Purchasing. There is no screen for that, and hunting for one is wasted time. Two tables drive the menu:
MAXMODULESholds the modules - the top-level groupings.MAXMENUholds the entries that render them: which module an entry belongs to, where it sits, which icon it uses.
Applications get their MAXMENU rows automatically when you create them. Modules get nothing from anywhere in the UI. Application Designer creates applications, not modules.
Take a database backup before you start. The failure mode here is a navigation menu that will not render, for every user at once, and the fastest way out of that is a restore.
1. Create the module
INSERT INTO MAXMODULES (MODULE, DESCRIPTION, MAXMODULESID)
VALUES ('TEST', 'Test Module',
(SELECT NVL(MAX(M.MAXMODULESID), 0) + 1 FROM MAXMODULES M));
Letting the database pick the ID beats hard-coding one. MODULE is the internal key you will select in Application Designer later; DESCRIPTION is what users read.
2. Create the menu entry that renders it
The module exists now, but nothing points at it. MODULEAPP and KEYVALUE both carry the same value as MODULE above - that is the join that makes the entry render your module instead of an empty heading.
INSERT INTO MAXMENU
(MENUTYPE, MODULEAPP, POSITION, SUBPOSITION, ELEMENTTYPE, KEYVALUE,
HEADERDESCRIPTION, URL, VISIBLE, IMAGE, ACCESSKEY, TABDISPLAY, MAXMENUID)
VALUES
('MODULE', 'TEST', 9500, 0, 'MODULE', 'TEST',
NULL, NULL, 1, 'modimg_wo.gif', NULL, NULL, MAXMENUSEQ.NEXTVAL);
MAXMENUSEQ.NEXTVAL keeps you out of the ID collisions you get from picking numbers by hand. POSITION decides the order in the menu - leave room between entries so you can slot something in later without renumbering. VISIBLE set to 1 is what actually makes it appear.
An empty module is not shown. If you stop here you will restart the server, see no change, and conclude the insert failed. It did not - a module with no applications in it simply does not render. Do step 3 before you judge whether any of this worked.
3. Attach an application to it
INSERT INTO MAXMENU
(MENUTYPE, MODULEAPP, POSITION, SUBPOSITION, ELEMENTTYPE, KEYVALUE,
HEADERDESCRIPTION, URL, VISIBLE, IMAGE, ACCESSKEY, TABDISPLAY, MAXMENUID)
VALUES
('MODULE', 'TEST', 9510, 0, 'APP', 'WOTRACK',
NULL, NULL, 1, 'appimg_wotrack.gif', NULL, NULL, MAXMENUSEQ.NEXTVAL);
Note ELEMENTTYPE is APP here rather than MODULE, and KEYVALUE is the application name.
4. Restart the application server
The menu structure is read at startup. Until you restart, the rows are in the database and the screen is unchanged - which is the single most common reason people give up on this. After the restart your module is also selectable in the Module field in Application Designer, so new applications can be assigned to it the normal way.
Icons
The IMAGE column takes a filename, not a path. Maximo looks for it under:
Maximo/applications/maximo/maximouiweb/webmodule/webclient/images
Point it at an icon already in that folder while you are testing - a missing image is one more variable when the menu does not appear. If you ship your own, it must be a 16×16 GIF. Anything larger renders badly and looks like a rendering bug rather than an asset problem.
A worked example: a sub-module
Adding a View Incidents application under a new Incidents sub-module inside Self Service, so the path reads Self Service → Incidents → View Incidents. The header row comes first, then the application, sharing the same POSITION and separated by SUBPOSITION:
INSERT INTO MAXMENU
(MENUTYPE, MODULEAPP, POSITION, SUBPOSITION, ELEMENTTYPE, KEYVALUE,
HEADERDESCRIPTION, URL, VISIBLE, IMAGE, ACCESSKEY, TABDISPLAY, MAXMENUID)
VALUES
('MODULE', 'SSDR', 3230, 0, 'HEADER', NULL,
'Incidents', NULL, 1, 'modimg_wo.gif', NULL, NULL, MAXMENUSEQ.NEXTVAL);
INSERT INTO MAXMENU
(MENUTYPE, MODULEAPP, POSITION, SUBPOSITION, ELEMENTTYPE, KEYVALUE,
HEADERDESCRIPTION, URL, VISIBLE, IMAGE, ACCESSKEY, TABDISPLAY, MAXMENUID)
VALUES
('MODULE', 'SSDR', 3230, 10, 'APP', 'VWINC',
NULL, NULL, 1, 'modimg_wo.gif', NULL, NULL, MAXMENUSEQ.NEXTVAL);
What this is not
If what you want is a new action inside an existing application - an entry in Select Action, or a toolbar button - none of the above applies. That is a signature option plus a menu entry in Application Designer, granted to the right security groups, and it needs no database work at all. The two problems sound alike and share nothing underneath.
Worth saying plainly
You are inserting rows into a schema you do not own. It is stable - these entries survive upgrades - but it is configuration living outside your usual change process, so write it down somewhere. The person debugging a missing menu two years from now will not think to look in MAXMENU.
