In this episode, Chandra and Paul discuss the realities of software customization within JD Edwards environments. They emphasize that while extensibility tools have reduced the need for customizations, some remain necessary for business-specific requirements. The hosts lay out best practices and key dos and don’ts for customizing software, such as following naming conventions, avoiding modifications to base objects and indices, and using customer-reserved system codes. They warn against common pitfalls that can harm performance or data integrity and suggest always adhering to published development standards.
03:52 What’s more important at INFOCUS than Paul’s hair?
09:21 Customizations are a reality
11:58 Object customization best practices
14:03 Adhere to JDE naming standards
15:33 Maintaining data integrity
18:25 Do I need a custom table for a custom application?
21:44 Design for performance when customizing
23:57 Let’s talk about the Don’t Do’s
32:26 Midwesternism of the Day
Resources:
JD Edwards EnterpriseOne System Extensibility Guidelines: https://www.oracle.com/webfolder/technetwork/tutorials/jdedwards/Tools/system_extensibility_guidelines/system-extensibility-guide.pdf
Development Guidelines for Application Design Guide: https://docs.oracle.com/en/applications/jd-edwards/development-tools/9.2.x/eotds/index.html
Form Design Aid Guide: https://docs.oracle.com/en/applications/jd-edwards/development-tools/9.2.x/eotfd/index.html
Event Rules Guide: https://docs.oracle.com/en/applications/jd-edwards/development-tools/9.2.x/eotev/index.html
Development Standards for Business Function Programming Guide: https://docs.oracle.com/en/applications/jd-edwards/development-tools/9.2.x/eotds/index.html
Quest Oracle Community proudly presents The
Speaker:JDE Connection, a Quest on-air podcast
Speaker:production. This podcast explores and showcases how JDE
Speaker:customers are harnessing specific functionality and capabilities to
Speaker:drive business success. This
Speaker:episode is brought to you by RST Solutions,
Speaker:accelerating digital transformation with AI-driven
Speaker:business efficiency. Hello, JDE Connection
Speaker:listeners. Welcome back. I'm Chandra Wobschall, one of
Speaker:your podcast hosts, and I'm the Business Solutions Lead
Speaker:at Colossus IS Support. Back with me this week,
Speaker:and maybe this week I'll move you to most weeks, is
Speaker:my friend— Hi. And podcast partner, Paul Houtkooper,
Speaker:Vice President of JD Edwards Product Development at Oracle.
Speaker:Hey, Paul. Hey, Chandra. Hello, everybody. How's it
Speaker:going? Boy, you sound excited today. What?
Speaker:Geez. Hey, Chandra, pick it up a notch.
Speaker:Let's go. Pick it up a notch? Okay. Hey, did you know we need new
Speaker:poker chips? These were, uh, 10,000 downloads. We're at
Speaker:25. Oh, 25,000 downloads? That's
Speaker:awesome. No, just, just 25.
Speaker:Today, you mean? Today.
Speaker:25,000. Yes, we did hit 25,000. So now
Speaker:when we give these out, we'll have to give people 2 and a half. Should
Speaker:I bring like the little hacksaw? Little hacksaw.
Speaker:That's right. Yeah. I'm not flying, so technically I could, I could just drive
Speaker:in with my hacksaw. All right. Well, with the way inflation is going on, you
Speaker:probably need to give them like 5 of them or whatever. I don't know. Yeah,
Speaker:it's 50 in there, about 50 cents. Yeah, about 50 cents on the dollar. So
Speaker:there you go. All right. There you go. Oh, I love it. That's
Speaker:awesome. We're a week out from Enfocus. All right. I suppose we
Speaker:better figure out what the heck it is we're going to say, what it is
Speaker:we're going to do, not only from our podcast, but from the team perspective.
Speaker:So pressure is now really on. So yay. Yeah,
Speaker:I know I've got a couple, obviously I should probably figure out what I'm gonna
Speaker:talk about for the financial SIG meeting and obviously
Speaker:what we're going to talk about. So. I'll get there. We
Speaker:always do. I know. And of course, we got the fun factor this
Speaker:year. I think Wes brought in Blockbuster. Remember Blockbuster where you'd
Speaker:go Friday nights, get your video, get some popcorn,
Speaker:get your soda? My VHF tape, which some people may not know what
Speaker:those are. VHF, VHS, whatever it was.
Speaker:VHS. VHS, not VHS. You're right. You were going down the
Speaker:VFW, so you just can buy them. You went to the VFW to watch
Speaker:your VHS. See how that works?
Speaker:Now you got me going. I got you going too. Sweet. Awesome.
Speaker:What the youngins out there say is, well, the fact that you guys are talking
Speaker:about it means you belong in the— anyway. Yeah, right.
Speaker:Yeah, that should be fun. I'm excited. I'll have to think of a character and
Speaker:show up in some sort of costume. I guess I should get on that. I
Speaker:guess I could make it my twofer. It could be my Halloween costume too, since
Speaker:that's in like a month and a half. Yeah. I'll get on that.
Speaker:So we may as well get into this week's topic, I suppose. Do you mind?
Speaker:Or did you have an update that you wanted to provide for everybody? I
Speaker:do. Oh, you do? We have something really
Speaker:fun that's going to happen at InFocus besides the party.
Speaker:I knew I should have moved straight to the topic. You should have. You didn't
Speaker:move fast enough. You gave me an opportunity. And guess what?
Speaker:I'm going to take it. Um, all right, so I'll
Speaker:unmute now while you do what you need to do. Catch you guys in
Speaker:a little bit. So I think I alluded to it earlier at the
Speaker:end of one of our podcasts where we were going to talk about what was
Speaker:really important to add in Focus. It has been a topic I
Speaker:think that as long as I've known you,
Speaker:I've heard talked about in the community, and that is your
Speaker:hair. Yeah, I know, I know. I
Speaker:don't personally— I don't get it. I think it fits you. I think it's
Speaker:you, but it is a contentious topic. It's, you know,
Speaker:yeah, it's a heated debate, whatever. It's a heated debate. I've
Speaker:noticed there are some strong opinions that you need to cut that.
Speaker:Yeah, that ponytail. I am. Yeah, I'm sure you're more aware than
Speaker:that. It's not just in the community, it's in my family.
Speaker:Family too. Yeah. So yeah. Well, we had
Speaker:originally talked about doing this as like an auction and
Speaker:fundraiser for a charity, but there's a lot of
Speaker:regulations involved with that, I've learned. So
Speaker:instead, what we're gonna do is we are going to have a
Speaker:mechanism for people to vote on whether you should
Speaker:cut it or keep it. So kind of like Love It or List It for
Speaker:those that might watch HGTV type stuff. Either
Speaker:cut it or keep it. And so this will be available to
Speaker:attendees at InFocus only. So if you're not going, well,
Speaker:you better get signed up so you can cast a vote. I don't
Speaker:think anybody's coming to InFocus just for this. Thanks. You
Speaker:never know. But anyway, so we will have that option. We
Speaker:will still encourage a donation. The charity that we're going
Speaker:to point people towards is called Wigs for Kids. And that is
Speaker:where my hair actually will go, not
Speaker:just Monetary contribution, but my, my physical hair. I will
Speaker:be donating it after In Focus, and we will
Speaker:record said haircut as well. And for
Speaker:yours, we may or may not be able to do said
Speaker:cut at our live podcast episode.
Speaker:However, we will announce if it is a cut
Speaker:it or keep it. And then from there, we'll either, if
Speaker:we are able to do it there, we will allow
Speaker:Hopefully one of the people that voted is in attendance and
Speaker:is selected and could cut your hair, or
Speaker:we will go to an appropriate hair establishment
Speaker:and record and publish it after the fact. So
Speaker:there will be video evidence so people can see it.
Speaker:When you say select somebody, are we going to like hand out a raffle ticket
Speaker:or something like that to be able to do some sort of sweepstakes and somebody
Speaker:gets to be the lucky person or what? Still working
Speaker:out that level of detail, but I do know in order to vote, you will
Speaker:be required to provide an email address. So we might be able to
Speaker:do it through that as well. So we'll figure out a way. We're working on
Speaker:that last minute detail. So that is the plan. So for
Speaker:those that want to see Paul without the ponytail,
Speaker:you can vote that way. I think it's— or they want to see Paul lose
Speaker:the ponytail. Great. Yeah. If you're fine with the ponytail and
Speaker:whatnot, you can vote to keep it. And regardless, we're going to have
Speaker:some chopping going on because you are going to chop your hair and donate
Speaker:that. So that's going to go to a good cause. And maybe through doing this,
Speaker:we're able to actually raise some money for a good charity as
Speaker:well in the process. Exactly. So I'll just have to
Speaker:make sure that some certain family members have access to
Speaker:The voting tool so they get to cast their vote as well. And
Speaker:I'm guessing you can only vote once, otherwise I'll be out there with
Speaker:my vote blocking everybody. You just go in a bunch of times. I
Speaker:think you'll be limited since you have to provide your email address. You'll be limited
Speaker:to one vote. We won't have somebody going in there every second of the day
Speaker:to vote yes, yes, yes, or no, no, no, whatever it might be.
Speaker:Right. And this voting site will have some Pretty cool photos.
Speaker:Some pretty epic photos, actually, if I do say so.
Speaker:I'm so glad I was consulted in this,
Speaker:obviously, as people can tell. Okay, fun. I can't wait
Speaker:to see it. It's gonna be wonderful. I know. They always say
Speaker:laugh at yourself before anybody else does. So. Exactly.
Speaker:All right. I'd say we move on from that topic
Speaker:and talk about something super fun.
Speaker:Crickets. Super fun. Super fun. Um, actually.
Speaker:Yeah. I mean, you and I were talking earlier this week about this topic and
Speaker:it is an important topic. It's extensibility. And the reason
Speaker:that this is coming up is I had a situation in
Speaker:the last week or so where a customer
Speaker:did customize. They had to customize. And it
Speaker:reminded me that the reality is, is that No matter how much we
Speaker:provide these extensibility tools, there's always going to be a use case out there
Speaker:somewhere that requires some level of customization, or
Speaker:maybe it's just easier. I don't know. There's a lot of different reasons, but customizing
Speaker:the software is just a reality. And as we were
Speaker:working through this situation with this customer, I was just reminded
Speaker:that we used to have some guidelines out there that we tried to share with
Speaker:folks to try to keep things in bounds, to try to—
Speaker:protect your customizations as much as possible,
Speaker:recognizing that most customizations, they create a level of
Speaker:overhead and serve as almost blockers to your upgrade and
Speaker:applying ESUs and stuff like that. But there are ways to do
Speaker:customization. So customizations are a reality still.
Speaker:So we should probably talk about what are some of the best
Speaker:practices around doing those customizations that
Speaker:help you reduce that TCO, that total cost of ownership,
Speaker:lower risk. Right? Some people may not realize that there are
Speaker:certain ways in which you could customize the software that actually puts you at
Speaker:risk of object contention and other things. And then
Speaker:if you are going to customize, one would argue that
Speaker:you should apply the same standards that we do when it comes to
Speaker:development. And those are a lot of different standards, whether it be
Speaker:design standards or performance or naming, whatever we should.
Speaker:be at least trying to adhere to similar
Speaker:standards for consistency's sake. So anyway, so I thought
Speaker:we would talk a little bit about the best practices around that,
Speaker:because it is still a reality, but we don't talk about it as much
Speaker:because of course we have all these other really cool ways in which to extend
Speaker:the software, right? So we've spent all our time talking about those, and we've
Speaker:kind of gotten away from the fact that, hey, guess what? People still
Speaker:customize software. They don't just extend it. They don't just throw out a NUDO
Speaker:here or there and accomplish what they need to accomplish. Sometimes they actually need to
Speaker:make some changes that just aren't covered by a logic extension
Speaker:or form extension or you name it.
Speaker:Yes, I think it's true. And I know we've really kind of beat on the
Speaker:drum and, I don't know, called it the dreaded C word, right? And
Speaker:we've really beat on the modernization. And as part of that
Speaker:path, decustomization comes into play, right?
Speaker:But the reality is Most of us have a
Speaker:business need or a requirement to have
Speaker:some customization. There isn't a product that
Speaker:will allow me to transact business the way my
Speaker:business wants to transact business without this
Speaker:customization. Maybe we can reduce some of what we have put
Speaker:in over the years now with the quote unquote newer
Speaker:tools that are available. But the reality is there's
Speaker:probably still some level of customization. So
Speaker:agree. I think this is a good thing to talk about. I mean, I think
Speaker:we strive to eliminate the need. I mean, I think we should continue to strive
Speaker:to eliminate the need and improve our ability
Speaker:to extend without customization. That remains a goal and we
Speaker:keep on getting closer and closer. But in the
Speaker:meantime, while customization remains a reality, let's talk
Speaker:about maybe some of the best practices. All right.
Speaker:So I should modify all the base objects, right? That
Speaker:is the number one thing that you can do. I don't know why
Speaker:anybody doesn't do that. Like the easiest thing to do is to go into
Speaker:P4210 or P42101 and just change
Speaker:it to fit whatever it is that you want and you're good to go.
Speaker:And then, well, I don't want to throw anybody under the bus, but I have
Speaker:seen this of all things. And then what you do is, well, you
Speaker:do that, you modify the base object in whatever release you're on. Let's say you're
Speaker:on 8.11 or 8.11.1. SB1, you modify the base
Speaker:object. And then what you do when you upgrade to 9.2, you know what you
Speaker:do? Or 9.1, you know what you do? You transfer that
Speaker:object. Oh. Yeah. And then you wonder why it doesn't work.
Speaker:You call development and say you should make it work, but we won't go into
Speaker:that. All right. I've got some scars. There's still some scar tissue.
Speaker:Maybe some counseling has been involved. Who knows? But
Speaker:anyway, but the cool thing is, is I've gotten to travel around the world
Speaker:for Situations like that. All right, moving on. No, please
Speaker:don't modify the core object, the base
Speaker:object. I want to say, if you can avoid it, I want to say, geez,
Speaker:I sure as heck hope these days you can avoid that. Modifying the
Speaker:base object is a bad idea. Your stuff's just going to get
Speaker:overwritten the next time you take an ESU. You put yourself directly into that
Speaker:difficult spot. So in that sense, if you need to
Speaker:change an existing object, then one of the main ways to do that then ends
Speaker:up being cloning. At least clone it. Then you own it. You clone
Speaker:it, you own it. I like it. You clone it, you own it, and you
Speaker:can tweak it from there. And depending on the degree of changes that you take
Speaker:or that you have, when you then take subsequent ESUs
Speaker:and whatnot, you're either retrofitting what we did or you're
Speaker:retrofitting what you did one way or the other, right? But you're not
Speaker:putting your changes directly to the base object that are just going to get overwritten
Speaker:by us the next time we take an ESU. Naming standards.
Speaker:It might seem like a simple thing, or maybe an unimportant thing,
Speaker:or an innocent thing, but naming standards matter.
Speaker:Yeah. You want to make sure that you're adhering to
Speaker:the naming standards that we prescribe so that you don't
Speaker:have conflicts. And it's not just conflicts
Speaker:within production, or it's not conflicts with us,
Speaker:it's also conflicts across Your environments.
Speaker:So yes, when you name a table, it should be F
Speaker:followed by your system code. And as a
Speaker:customer, I believe your system codes are whatever,
Speaker:55 through 59. If you're not a customer, don't
Speaker:use those system codes. I don't know who I'm supposed to tell that to. Maybe
Speaker:it's a business partner. So, okay, business partners don't do that, but you're
Speaker:probably doing it on the part of a customer. So chances are you are going
Speaker:to use those system codes. So the only people I'm talking to, I guess, is
Speaker:my own staff. Don't use 56. Anyway, I'm just kidding. We wouldn't.
Speaker:But the point is 55 through 59 reserved for customers. So if you're
Speaker:naming a table, it's F followed by your system code, followed by some
Speaker:sort of sequential number of your file and whatnot.
Speaker:So there are different naming standards for business views, table
Speaker:conversions, processing options, templates for your
Speaker:applications. If you're going to go create your own applications,
Speaker:interactive apps, everything. And we do publish those. I believe in our
Speaker:development standards documents. So please make a
Speaker:point of adhering to those to avoid conflicts and avoid
Speaker:contention. We've got all these wonderful ways to
Speaker:do things, whether it be form extensions, logic extensions.
Speaker:But if you are going to make a modification,
Speaker:another way to extend is to use some of
Speaker:the other design patterns that we have for like
Speaker:localizations. Localizations allows you to do a bit
Speaker:of plug and play. And there's advantages to that.
Speaker:So look at those design standards and how we've done
Speaker:things for localizations and see if that makes sense for how you
Speaker:want your customization to behave. Other things,
Speaker:create hooks into new functionality. Again, I look at this and I
Speaker:was like, if you do have to add a call to a function or a
Speaker:named var, put it at the end of an event. But I also look at
Speaker:that and say, geez. A form extension should allow you to do these sorts of
Speaker:things. And again, not everything's going to be handled through logic
Speaker:extensions. So maybe you want to create a business function, maybe you want to create
Speaker:an AMDR, maybe that's what you have to do for whatever reason.
Speaker:But if you're going to hook it in, hook it in at the end and
Speaker:make it easy. A few other things, insert, updates, deletes
Speaker:to Oracle tables. If you're going to do that,
Speaker:don't write your own. Don't do updates
Speaker:directly from ER. In a
Speaker:standard application that you cloned. In almost all of our
Speaker:major system codes and A applications, we
Speaker:have standard interfaces that are used to
Speaker:update the tables, and that's to ensure data
Speaker:integrity. And what you don't want to do
Speaker:is start writing your own inserts,
Speaker:updates, deletes. Whether it be from ER or
Speaker:from other functions, you get potential contention. You
Speaker:get potential problems with transaction
Speaker:boundaries. We created what we called file servers
Speaker:for a lot of our functions. X3111 is an example. There's
Speaker:many others that you should be using those to do
Speaker:your adds, your updates, your deletes to ensure that things are
Speaker:consistent and adhered to. There's things like— Interoperability
Speaker:and other things that we have to also make sure
Speaker:that we retain integrity for and do consistently.
Speaker:And so we want to funnel all updates to major tables
Speaker:through those interfaces for consistency and data integrity
Speaker:purposes. So it may not be obvious when you write your
Speaker:little update as to how could this possibly be causing
Speaker:problems, but we have transaction processing and we
Speaker:have The ability to roll back things. And depending on
Speaker:how we've written it and depending on how we've cached certain
Speaker:information, you could be creating some
Speaker:risk, risk of a data integrity problem. So question then,
Speaker:if I create a custom application and that custom
Speaker:application has fields on it that aren't in the
Speaker:standard, let's say I'm customizing PO entry.
Speaker:And I've got a bunch of stuff in my custom application
Speaker:that I want in my purchasing table. Should I be
Speaker:creating a 55, if that's, say, the system code I'm going to
Speaker:use, a 55 table then and not use the
Speaker:standard table? So it depends. As
Speaker:always, there's never just a yes/no answer.
Speaker:And again, it can get more complicated than this, but to try to keep it
Speaker:simple and not eat up the entire 30 minutes on
Speaker:one Question. One question. There are things like user reserve
Speaker:fields as well as future use fields.
Speaker:Yes. Okay. Very familiar with those. We use some of those.
Speaker:Well, and you say you use some of them and I'd say, okay,
Speaker:you can use the user reserve fields. You are the user, you are the
Speaker:customer. You can use those. You should not use the future
Speaker:reserve fields. Those are for me. Those are for my team. So
Speaker:if there are available user reserve fields, that you
Speaker:can use to represent the data attributes that
Speaker:you wanna store. I mean, that's what they're there for. If
Speaker:not, then yes, what you're creating after that, what we would call
Speaker:a tag table, that is probably a
Speaker:System55 table with the same
Speaker:key structure as the base table, and it serves
Speaker:as an extension, and you will be the one to write the logic
Speaker:to update that table. Mm-hmm. But that's outside the confines
Speaker:of probably the standard interface that writes to the base table.
Speaker:Now, if you look at some of our tables, we've created our own
Speaker:tag tables because we've had to do that for many
Speaker:reasons. And those standard interfaces also control
Speaker:the tag table, which is again— Tag table. Another good example of, well, if
Speaker:you didn't go through the standard interface, all of a sudden you're adding records to
Speaker:the base table without adding the corresponding records to the tag table
Speaker:because you didn't know about the tag table, didn't think about the tag table.
Speaker:In addition, all the records that you were adding to the base table were supposed
Speaker:to also be getting put into the, say, the Z1
Speaker:interoperability table, and you didn't write that. So now all of a sudden,
Speaker:what are you doing, right? You're creating this data integrity nightmare where the tag
Speaker:table is out of alignment with the base table and your
Speaker:interoperability is missing records potentially. I mean, again, just an example,
Speaker:not the best example perhaps, but an example. Yep. Thank
Speaker:you. Yeah. What are some of the other tips? Man, I hate to say this
Speaker:because I know we've got great partners out there and we've got development
Speaker:teams at customers that are very sophisticated
Speaker:and they do some amazing things. So I am not bringing these
Speaker:things up to browbeat anybody or anything or—
Speaker:Yeah. Throw anyone under the bus or anything. But of the
Speaker:times that I got put on a plane to put on my Superman pajamas to
Speaker:go fix somebody. I can tell you I boarded the plane more
Speaker:times because somebody did
Speaker:customize the software and didn't follow some
Speaker:basic tips and tricks and best practices around performance.
Speaker:Yep. And because they modified the base object, it
Speaker:wasn't clear and obvious to the customer
Speaker:themselves, whether it was their team or a
Speaker:business partner that did it, doesn't matter. It was not obvious. So they're calling thinking
Speaker:they have a problem with the base object, that it's not performing.
Speaker:Which they do, but it's not really the based object at that point because it's
Speaker:been customized and somebody's added a while loop
Speaker:that is reading records and accumulating
Speaker:values one by one, row by row
Speaker:at the ER level because that's what they knew. So they got in there and
Speaker:they said, oh, I need to go add up these values. And so they loop
Speaker:through 1,000 sales order lines and they try to accumulate that value and they
Speaker:do it through ER. And meanwhile, the application falls
Speaker:asleep or whatnot. And I wish I was joking. I really do.
Speaker:But I've found these loops. I've found infinite loops
Speaker:written. Oh gosh. In ER to accumulate
Speaker:values. I see people writing loops even in C, whether it be
Speaker:ER or C, and not using our aggregation functions
Speaker:that allow you in a single call to aggregate and group by
Speaker:and do these things so that you can do a count, you can do a
Speaker:sum, you can do those sorts of things. Much more efficiently, 'cause you're
Speaker:actually using the database rather than this chatty
Speaker:interface between your application or your business function and the table.
Speaker:So all of that is related to what? It's related to performance. I ask
Speaker:that if you do have to customize, please keep performance in mind.
Speaker:Please. You should design for performance. And
Speaker:there's a lot of documentation out there about dos and don'ts and whatnot.
Speaker:And I just ask that people try their best to write
Speaker:efficient logic. And we will do the same. Trust me. I'm not saying we're
Speaker:flawless and that we don't make our own mistakes and that there's not our own
Speaker:opportunities, especially in today's day and age with the tools that
Speaker:you have available. Writing performant code gets a lot easier
Speaker:now than perhaps it was before. Some restrictions. Let's just
Speaker:rattle off some don'ts. So those were maybe some best practices.
Speaker:Let's rattle off a few Please don't do this. I think we already
Speaker:talked about system codes, right? 55 to 59, reserve that for
Speaker:customers. Don't modify the
Speaker:indexes of a table or the tables.
Speaker:Which, this one was a little bit of news to me. Like,
Speaker:I, I hear a lot about, and maybe I've not asked the questions
Speaker:enough to say, did we just create our own
Speaker:index or did we modify The base one,
Speaker:because a lot of times maybe you're putting another field
Speaker:in, you're using one of the user reference fields, and you're
Speaker:populating that field with data that your business
Speaker:inquires on a lot. So you want it to be indexed, right? Yep.
Speaker:And I've never asked the question. I was
Speaker:like, oh, I never thought about that. Oh, is that our own
Speaker:index or did we modify the existing one?
Speaker:Again, this is stuff that we have to adhere to internally as well, right? So
Speaker:indexes get used all over the place. We have to be cognizant of where they
Speaker:get used. And the problem with modifying the existing
Speaker:index is you may be modifying it for your utilization within
Speaker:one use case, but it's currently used in 100
Speaker:different other places. And by doing what you just did, whether it's
Speaker:changing the sort order or because of the way those
Speaker:other usage instances access it, you
Speaker:suddenly created a full table scan and you're creating performance
Speaker:problems in those other places. Not that you intended to do that. You did something
Speaker:that you thought was innocent, but it can cause problems. And we don't want to
Speaker:get into, again, the way databases choose what index to use, this, that, and everything
Speaker:else. There's some sophistication there as well, right? Mm-hmm.
Speaker:But we open a table in code to use specific indexes,
Speaker:and you have to be mindful of that. So if you decide you want a
Speaker:new index for performance reasons, go create one. But if you
Speaker:modify an existing one, again, you just run the risk. Same thing, you already asked
Speaker:about tables. Don't modify the tables. That doesn't mean you can't use user reserve
Speaker:fields, but don't go adding columns to a table. That's a big no-no.
Speaker:Don't go modifying business views. Same sort of thing, right?
Speaker:Right. They're used in multiple places, and unless you
Speaker:know all those places and you understand the implications of that, even then,
Speaker:unless you're going to own the ramifications to it, because as soon as you
Speaker:change that business view, if I use that in 5 different applications, technically you just
Speaker:customized 5 different applications. Oh gosh.
Speaker:So yeah, again, it's just some dos and don'ts. Data dictionary items,
Speaker:yeah, don't modify them with the exception of the glossary. Please
Speaker:don't. Um, do you know how many times in
Speaker:my career I have been asked to add more characters to a
Speaker:field? Oh God. Yeah, I'm sure. I'm sure.
Speaker:No, we can't do that. We are not modifying. No, no,
Speaker:still no. Nope. It's
Speaker:true. I get it. And I got to live by those same restrictions, right?
Speaker:There's plenty of times when somebody says, geez, we want that field to be,
Speaker:I don't know, 32 characters long. And we go, sorry, can't do that.
Speaker:Right. Yeah. It's a very, is the word
Speaker:invasive, intrusive, or both? All of the above.
Speaker:Yes. Don't delete data items from data structures. What are
Speaker:data structures? Well, there's processing options.
Speaker:Don't delete a processing option value. No,
Speaker:right? As you probably noticed, we have processing options out there that
Speaker:have the word obsolete on them. Why? Because we don't delete them
Speaker:either. Okay. It causes problems. Form data structures, report data
Speaker:structures, business function data structures, which includes named ER data
Speaker:structures. Don't delete. Bad idea.
Speaker:Okay. Don't delete items from structures. Don't
Speaker:write code around a new value in an existing processing
Speaker:option. So maybe we're checking for 0, 1, 2, 3.
Speaker:You decide, hey, let's do 4. You're running risk. Why?
Speaker:Because what if I decide to do 4? Now what are you going to do?
Speaker:Right. It's just, just, just, and I reserve the right.
Speaker:To make those changes. And I lose. Absolutely. It's your software.
Speaker:Unfortunately. Yeah. And we win, so to speak. So, we already said this one,
Speaker:use user reserve fields if you're a customer, but not future
Speaker:use fields because future use fields we put there.
Speaker:Try not, I shouldn't say try not, I guess I'm just more
Speaker:empathetic to the cost, but I say do
Speaker:not use existing fields for another purpose. Right.
Speaker:I don't know that I'm talking to customers right now, business partners right now. I
Speaker:could be talking to my own development team right now. This is one of those
Speaker:pet peeves that I have is somebody decided to
Speaker:reuse an existing field for a purpose it was never intended.
Speaker:And then we wonder why things break, because
Speaker:nobody knew that all of a sudden we're going to put the 19th
Speaker:character of the 32-character string when
Speaker:it is X is now going to mean Whatever. No,
Speaker:just no. Don't do it. Just don't do it. All right. Don't
Speaker:override data dictionary items settings in an
Speaker:application. Bad idea. If an app doesn't have the toolbar
Speaker:up top, don't go into FDA and add it. There's a
Speaker:reason it doesn't have it. Yes, exactly.
Speaker:Maybe to kind of wrap, the base object, obviously we own.
Speaker:If you copy a base object, which I would call cloning, right?
Speaker:You own that. Yeah. Well, as soon as you clone it, like we said before,
Speaker:you own it. So we'll own the base. And this is where many times
Speaker:when you call into support with an issue with your
Speaker:customized version, we ask if you could reproduce it in
Speaker:the pristine version, which gets back to kind of managing your
Speaker:customizations. One good thing to make sure that you have is a pristine copy
Speaker:of everything that you can go back to, to try to reproduce.
Speaker:Easier said than done. I 100% appreciate that. I
Speaker:really do. I'm just putting it out there because it is best
Speaker:practice, but that doesn't mean it's easy. It doesn't mean it gets adhered to all
Speaker:the time. But in many of these instances, we find
Speaker:ourselves going, all right, at least to establish a
Speaker:baseline, can you go back to the preceding object and are you able
Speaker:to replicate it? We ask that as if that's a simple thing,
Speaker:and I recognize that it's not because it's likely a different
Speaker:environment, it's likely different data, it's likely different volume,
Speaker:it's likely different— I don't need to go on. I get it. It's
Speaker:very, very difficult in those cases. But
Speaker:regardless, if you clone it, you own it. I mean, that's
Speaker:enough for this time around. I think so. You know, I mean, there's more, don't
Speaker:get us wrong. Yeah, there's probably some more we could talk about and Maybe
Speaker:we will. And maybe not. In the future. Well, you know, maybe I trip
Speaker:some triggers and we're going to get some negative feedback and I'll
Speaker:have to deal with that, but that's fine. Again, many of these are
Speaker:best practices. Many of these are things that will get you in
Speaker:difficult situations. I've seen almost, I
Speaker:hate to admit it and maybe I shouldn't, but most of these I've seen violated.
Speaker:Oh, 100%. You've been around. You've been with JDE a
Speaker:long time, so I'm not shocked at that. Yep.
Speaker:And many of the times when I've seen them violate it, I'm on site and
Speaker:I'm pointing it out, and then I'm being educated
Speaker:on why I'm wrong. And then I just remind them
Speaker:that, then why am I here? Right. You brought
Speaker:me here to solve your problem. Anyway,
Speaker:enough on that. I don't know if that's helpful to folks. Or not, but
Speaker:there are dos and don'ts and guidelines for customizing the
Speaker:software still, because we can't get
Speaker:100% away from it yet. Nope. Not quite there yet,
Speaker:but I think this was a good overview. Hopefully, like you
Speaker:said, it was helpful for our listeners. We know we have newer
Speaker:folks that listen. I didn't even know there was actually published
Speaker:guidelines, but I'm also not a developer. But
Speaker:now that I know, it might be interesting to go find those and
Speaker:maybe we can link to them in our show notes so that if people are
Speaker:interested and want to make sure that their business is
Speaker:following best practice, or as they're looking at maybe some of
Speaker:their decustomizations, if there's an opportunity to
Speaker:even bring this in, if maybe they haven't followed some best
Speaker:practices. Agreed. Yeah. All right.
Speaker:Well. Can't wrap up without one last item.
Speaker:Oh yes. What is this week's
Speaker:Midwesternism? This week's Midwesternism is
Speaker:actually brought to you by a friend of yours that sent you a Facebook
Speaker:video that was rather entertaining. But there were some things in said
Speaker:video that I was like, oh my gosh, wow, I haven't said that in
Speaker:a while. But yeah, funny as heck. And one of those was
Speaker:Clicker. Ah, the old clicker. The old
Speaker:clicker. Can you hand me the clicker? I want to change the
Speaker:channel on the TV and I use a clicker to do that,
Speaker:AKA a remote control. We have names for
Speaker:everything. I know. I mean, it's like we can't call it by
Speaker:whatever it is. Nope. Yeah. Like who thought the clicker and how
Speaker:did that catch on? Quite frankly. It makes me laugh.
Speaker:And I know I've said it. I think I retrained myself. I
Speaker:probably got made fun of at some point in my life. And I retrained myself
Speaker:to say, oh, can you hand me the remote? And so, hey, can you hand
Speaker:me the clicker? Yep, absolutely. I mean, that's, that's probably the one
Speaker:that everybody's used to is, hey, give me the remote. Yeah. I mean, I use
Speaker:that for everything. But it's like, no, I want that clicker. And I'm not talking
Speaker:about the PowerPoint thingamajig. Yeah, right.
Speaker:So I can point to that specific bullet on my slide. I'm referring to
Speaker:the remote control so I can change the channel. Which almost doesn't make any
Speaker:sense anymore because most of them now have that little thumb thing that they
Speaker:ripped off of Apple and there's not as much clicking involved. Clicking. Yeah,
Speaker:there's definitely not. At least on certain
Speaker:brands, I would say. Brands, for sure. Oh yeah, that's fair. Maybe certain
Speaker:brands of televisions or whatever. So at least the ones
Speaker:I'm most familiar with anyway. So, oh, the ones where you actually have
Speaker:to walk up to and like turn the dial. Oh, 100%.
Speaker:Yeah. Dang, man. And then you gotta get the rabbit ears just right. You might
Speaker:even have to get some foil to put on the rabbit ears. And
Speaker:then you gotta get it just right. You're dating yourself. And then you can't take
Speaker:your hands off it. So then the problem is, is then you gotta get outta
Speaker:the way of the TV, but you have to stand there and hold it so
Speaker:that everybody can watch. Okay. Never mind. Yeah, dating yourself, just so you
Speaker:know. Uh, yeah, yeah. Yes, but the first TV we had in my house
Speaker:definitely did not have a clicker. I remember getting up to change the channel.
Speaker:Yep. For my parents. For my parents. I think it—
Speaker:right? Yes. Oh, those were the days. As they were sitting
Speaker:on the— what is it, the Davenport? Well, that might be coming
Speaker:in a future episode. Oh, my bad, my bad. Did I— You're jumping
Speaker:ahead. I might have read ahead. My bad. Yeah, sorry.
Speaker:Oh, oh, geez, you really messed
Speaker:that one up now, didn't you? Geez Louise. Geez Louise.
Speaker:All right, until next time, let's keep learning, sharing,
Speaker:and most importantly, laughing together. Toodles! See
Speaker:ya! Thank you for tuning in for today's episode of
Speaker:The JDE Connection, a Quest On Podcast production.
Speaker:Show notes and links can be found at
Speaker:questoraclecommunity.org/jdeconnection.
Speaker:To learn more about what's happening in the Quest JD Edwards community,
Speaker:visit our website at questoraclecommunity.org/jdedwards.