Business

Home / Archive by category "Business" (Page 10)

UI5 – Updating a record

I’m feeling pretty excited right now.  I’ve been struggling for over a week to get a stupid POST or PUT statement to work in my UI5 application.  Let’s just say, there have been a lot of “color metaphors” said after the kids went to bed.  I’ve scoured google, tried so many things I can’t even remember them all.  Finally, today I was able to pull it all together.

First, the issue I was running into was that my GET services worked fine everywhere, but my PUT & POST would only work in a rest client.  For some reason, the X-CSRF-TOKEN was always undefined, so the service could never work.

component.js

I’m using an oDataModel, and I’m including this so you know what headers I’m setting.  It turns out that the Content-Type was my undoing.  I had been using application/atom+xml, as soon as I changed it to json, everything started working.

oModel.oHeaders = {
“DataServiceVersion”: “2.0”,
“MaxDataServiceVersion”: “2.0”,
“X-Requested-With”: “XMLHttpRequest”,
“Content-Type”: “application/json”,
}

detail.controller.js

I made a method to execute this upon save.  My next step is make it more dynamic, taking values from the screen, but step one was hardcoding.  /Dispatch is my service that does the PUT.

handleSaveButtonPress : function (evt) {
var oEntry = {};
oEntry.IOrderNumber = “1000001”;
oEntry.IPriority = “1”;
oEntry.ISequence = “25”;
var lServ = “/Dispatch(‘” + “1000001” + “‘)”;

var oModel = this.getView().getModel(“orders”);

jQuery.sap.require(“sap.ui.commons.MessageBox”);
oModel.update(lServ, oEntry, null, function(){
oModel.refresh();
sap.ui.commons.MessageBox.alert(“Success!”)
},function(){
sap.ui.commons.MessageBox.alert(“Error!”);
})

}

It all looks so simple now… but believe me, what a headache.  I hope this can help someone else in the future.

Thanks for reading,

ROI in service management – Making your products better

Continuing on in the series of how you can use Service management to improve your bottom line.  One of the best ways I can think of is making your products better.  Everyone who uses quality notifications knows the value of this, but for some reason, service notifications are often overlooked for this purposes.

The whole key to this is collecting enough data to categorize each notification.  The best way, in my opinion is using the many different catalogs to classify what is going on.  Just as a recap, depending on what fields you have available, you can have as many as 5 different catalogs available within a single notification.  You can even use the same catalog multiple times for things like causes.  Why do you care?

Because you can do reporting against these values to find trends in your products.  If you notice that 20 notifications come in a week for the same product, all stating that the product was damaged in transit, well, that should be a pretty big flag to review your packaging and your carrier to review what the hell is going on.  Maybe you got a bad batch of packaging materials, maybe you recently made a “cost saving” change to a different vendor…  regardless, you have an obvious set of data that you should be reviewing.

You may also simply find a pattern in your customers “mis-using” your products.  This might give your marketing/legal group something to include your literature stating in certain terms, product not to be used in the rain, or product should not be used for longer than 3 hours without shut down.  Doesn’t matter, but the data is there if you can collect.  This should be reason enough to train your call center to collect this every time.

Now, there is another way to capture information that is very valuable, and often more flexible.  You can use classification, along with multiple value characteristics allowing you to select as many options as apply.  This has the potential to give your organization ALL the data they could use.  SAP provides standard reporting using CL30N.  But if you’d like even more data, check out our out of the box service management dashboard.

Thanks for reading,

UI5 – Reading the context on the detail page

I wanted to share this breakthrough I finally made.  I hope that maybe you won’t struggle with it as long as I did.  I spent a few hours digging and banging my head against the wall before I finally figured out what was going on.

If you haven’t been reading all my posts, I’ll give you the highlights of my UI5.  I’m following the split app, using XML for my views.  I have a master view, that contains a list of orders, and a detail view that shows the full order details.  My latest hurdle was that I had a list of notes associated with each order.  The challenge is that the entityset for the notes is separate from the orders, so that meant I needed a different service call.  The note entityset contains all notes for all orders, so I needed to filter it down before I display it on the detail view.

My challenge was that I didn’t realize that the context isn’t passed until after the onInit, onBeforeRender, and onAfterRender.  I finally found a post that gave me an idea to try.  So, let me walk you through it.

master.controller.js

I had a method called handleListSelect that is called when an order is clicked.

handleListSelect : function (evt) {
var context = evt.getParameter(“listItem”).getBindingContext(“orders”);
this.nav.to(“Detail”, context);
var detController = this.nav.getView().app.getPage(“Detail”).getController();
detController.updateNoteTableBinding();
},

I needed to add the last 2 lines, first to get the detail controller, then to call a method from the detail controller.

detail.controller.js

I added the following method

updateNoteTableBinding: function(){
var oContext = this.getView().getBindingContext(“orders”);
var property = oContext.getProperty(“OrderNumber”);

var filters = new Array();
var filterOrder = new sap.ui.model.Filter(“OrderNumber”, sap.ui.model.FilterOperator.EQ,property);
filters.push(filterOrder);
// update list binding
var list = this.getView().byId(“Notes”);
var binding = list.getBinding(“items”);
binding.filter(filters);
}

This was the first time that getBindingContext didn’t return undefined.  From there, I was able to add a simple filter to my list to show only the notes that I needed.

detail.view.xml

this part worked fine, but it’ll help you put it in context.  I used a simple table, and you can see that I define the items in the xml, hence the reason I am filtering the results.

<Table
id=”Notes”
headerText=”{i18n>NotesTableHeader}”
items=”{orders>/notes}” >
<columns>
<Column
width=”4em”
hAlign=”Center” >
<header><Label text=”Num” /></header>
</Column>
<Column
minScreenWidth=”Tablet”
demandPopin=”true”
hAlign=”Center” >
<header><Label text=”Create Date” /></header>
</Column>
<Column>
<header><Label text=”Title” /></header>
</Column>
<Column>
<header><Label text=”Note Text” /></header>
</Column>
</columns>
<ColumnListItem
type=”Navigation”
press=”handleLineItemPress” >
<cells>
<Text
text=”{orders>NoteNum}” />
<Text
text=”{
path:’orders>Crdat’, formatter:’sap.ui.jvs.ProxProdSup.util.Formatter.date’
}”/>
<Text
text=”{orders>Title}” />
<Text
text=”{orders>Line}” />
</cells>
</ColumnListItem>
</Table>

Thanks for reading,

What’s your biggest issue? What is your Company’s biggest issue?

As always, when I talk to my buddy Justin, he hits me with ideas that I wish I came up with myself.  We were talking recently about how the software business was doing, and as normal, I explained it’s not where I want it to be.  I’m still a very small company, struggling to find the right people to talk, thus it’s very hard to get my foot in the door.  Well, he took me backward, and asked if I knew I was in the right space?  was my idea legit today?  Do I need to thinking about a major pivot…

Well, naturally, I got a bit uncomfortable.  I’ve been working on this stuff for so long, making it better, adapting to the new technology, etc…  It’s hard to imagine giving all of that up.  But at the end of the day, I have to consider it if there really isn’t a market for what I’m offering.  So I explained that I was going to just attend some ASUG meetings, not sponsor, but rather just check them out and talk to people as peers, rather than as a vendor.

That’s when he hit me with 2 simple questions to ask people.

  1. What’s your biggest issue or complaint?  or Why are you here today?
  2. What’s your company’s biggest issue?  or Why did they send you here today?

These 2 simple questions have the potential to answer my question of where to go next.  Just by getting ideas of what people need or want, may tell me where my next pivot should go.  Or, it might open up a whole new line of business.  Don’t get me wrong, it’s scary to think of scrapping everything I’ve worked so hard on…  but it’s far scarier to keep throwing money at a solution that no one is willing to pay for.

I’d love to hear your answers to these questions…  please post below,

Thanks for reading,

UI5 – implementing a sort, $orderby

Well, even though I’ve been building services for a while, I realize there is a lot I don’t know.  Today (well, let’s be honest, for the past few days) I’ve been trying to figure out why my grouping and sorting just doesn’t work in my first UI5 application.  Well, it turns out that checking that nice little box as sortable in SEGW doesn’t really do anything for you.  I’m still checking it, but it doesn’t appear to be helping me at all.

https://scn.sap.com/thread/3746888

and especially

http://scn.sap.com/community/gateway/blog/2013/09/03/sap-gw–implement-a-better-orderby-for-cust-ext-class

finally opened my eyes.  It’s not something I was missing, just not something that the gateway does.  Which seems a little crazy.  They 2nd post above does a great job of showing me what needed to be done…  but let me add a bit of clarification.

First off, remember to make these changes in the _DPC_EXT class.  I know this obvious to most, but since I’m still learning, it took me a few trials.  next, once you get into the correct method:

/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_ENTITYSET

You still need to do some data transformation.  this took me a bit, so let me add this here:

DATA output_get_entityset TYPE /jvs/cl_prx_prodsup_mpc=>tt_prxprodsupoutput.
FIELD-SYMBOLS:
<ls_data> TYPE ANY.

ASSIGN ER_ENTITYSET->TO <ls_data>.
output_get_entityset <ls_data>.

when you get into this method, you only have the abstract data of ER_ENTITYSET.  which can’t be used for much.  so I needed to transform it to be the same type as my table.  Then I could use the method provided in the post to do the sorting.  Then don’t forget to transform it back when you are done.

<ls_data> output_get_entityset.

I won’t pretend this is the best solution, but it is working for me, and I’m more than a little excited about that.  My UI5 journey is going slower than I expected, but not having a lot of experience with js or xml, it’s going alright.

thanks for reading,

Service ROI – Measure Productivity

Well, continuing in our theme of showing you what you can do with Service data to directly improve your bottom line, this is a great metric that most businesses care about, but maybe don’t realize all the different aspects available when it comes to measuring productivity.  Let me tell you what I mean by that.

Now of course, there is a obvious call center metric of calls taken, calls waiting, etc…  But in the service management world, you can also be looking at more of the post call analytics.  For example, how many of the calls are closed during the initial call.  You could be tracking this using the standard status.  The initial status of the notification is closed, it means that your call center agent was able to close the call on the phone, no additional follow up was needed.  The only thing better than this is if the customer didn’t have to call in the first place .

One of the other productivity metrics you can track is the number of notifications created by each SAP user.  You can be tracking how long each notification is kept open, simply by tracking the date/time stamp of the system status within the notification.  You can even keep track of who is filling in their notifications properly.  For example, if you use the catalogs, you can keep track of who is filling in this information.  This could lead you to additional training opportunities, especially if you employ temporary employees in your call center.  Losing this information could be costing you money. Anyway, the point of all of this is allowing you to see who your best call center employees are, and if you use temporary employees, they could be the people you entice to stay on full time, or the other end of the spectrum can be let go to bring in better people.

Now this same concept can be applied to your service shop.  You can be tracking all the different aspects of the service order, right down to the amount of time it takes to set a status, close an order, complete an operation or even just compare planned to actual.  All of this data is provided to you free of charge…  well, at least if you know where to get it from.  Now if you are looking for a great out of the box dashboard that will provide you with all this data and MUCH, MUCH more, check out Broadsword.

Thanks for reading,

UI5 Loops with duplicate records

Well, in my quest to convert some of my applications from iOS or Web Dynpro to UI5, I’ve recently run into something new.  I had a table of information, and my UI5 was able to render the table and put in the correct number of rows, but all the data was the same.  Every row was identical, and it was the last row in my table.  After some digging, I found a rather simple solutions.

https://scn.sap.com/thread/3670270

Thanks to SCN for this, but the issue was in my Gateway service.  I needed to make the key of the table unique.  This was interesting to me because in the iOS, this didn’t make any difference.  So perhaps my developer jumped through some extra hoops, or it’s just a function of XML.  Regardless, make sure your entity set keys form a unique row (I just had to update my services to include an input for the key field (didn’t matter for reading the service).

Thanks for reading,

Partnerships, the new adventure

After trying to do everything myself for many years, my buddy Jeff finally beat me over the head enough to realize that it is impossible.  For those you that know me, you know that I like to be self-sufficient.  I depending on other people, I hate waiting for others to get things done, so often I just do things myself.  Here’s the problem with that approach.

  • Time is the most valuable commodity I have.
  • The best of my time should be spend doing what can make me the most successful.
  • No one can be an expert at everything.
  • All the time I spend doing it myself, could have been spent doing something more valuable.

You get the idea.  Well, finding prospects is one of the most important things any business can do.  The problem is that I had misguided notions that if I talk to my friends, past clients, doing a little blogging and have a website the sales will just start flowing in.  Well, for any of you in business, you know that isn’t the case.  Software seems to be especially difficult, at least in the SAP space, because to get in the door you need to convince a lot of people.  You need to convince the business, business managers/directors, and then IT needs to sign off on it since you’ll be installing programs in their environment.  But even before you get to that point…  you need to find people to talk to, you need to find the right people that can say yes to get the process started, and even if you find them, it doesn’t mean they will ever take your calls, respond to your emails, or take your meetings.

This is where Jeff finally got through to me.  We need to work with people that already have relationships with people we want to talk to.  This is doubly good because if you work with someone that already has relationships, not only do they know the people, but the people know them.  So you can get a warm introduction and a better chance to at least be heard 🙂  The key is that this needs to be a win-win situation for you and the partner.  The key is being able to provide something of value in exchange for the introductions.  Some of it will be monetary, some of it needs to be access to our contacts so our partner can do the same thing.

This is the road I’m just starting to travel down.  If any of you have any ideas, advice, or are interested in partnering, please reach out.  I’d love to hear from you.

mpiehl@gojavellin.com

Thanks for reading,

 

Building for tomorrow

I talked a little about 2015, and how I’m glad the year is past.  For me, 2015 was a big rebuilding year.  The problem with rebuilding years is that you usually aren’t “winning”.  I often go back to football, whenever your favorite team has a bad season, what’s the common thing people say?  “This is a rebuilding year”, “We had to get some pieces in place before we could start winning again”, etc.  While this can often be an excuse, sometimes it really is true.  The problem is that usually when it is true, it means you were making mistakes in the previous years.

Well, that was exactly what happened with JaveLLin last year.  It truly was a rebuilding year for me.  I finally found some pieces I was missing, and then I found out that much of what I was spending time and money on, were the wrong things.  I was spending $20k to be a vendor for 4 days, when I could have spread that money out to 15 shows, got myself in front of a lot more people, and could have been doing presentations.

I spent the past 6 months trying to get myself into a position to make myself and my company more visible.  Yeah, I spent time developing new features, but for me, that’s my reward.  If I can get all my marketing stuff done for the day, then I can develop some stuff.

Now that the groundwork is in place, I think I know where I need to pivot my business to get myself back on the winning track.  How about you?  Are you rebuilding?  Or better yet, have been constantly managing things so that you can have a championship team year after year?

Thanks for reading,

New Year, time to pivot

I don’t know about you, but I’m glad that 2015 is in the books.  Do you ever have one of those years where it seems like the expenses just keep piling on?  For me, that was last year.  The thing is that most of the expenses weren’t really anything bad, in fact they were a building block for things to come.  How much of your life is like that?  We all go through things that suck at the time, but looking back, you realize how you can build off of that.

For example, last year I had to replace both of my heating/AC units.  That was a big bite out of the wallet, but because I’ve had a few really good years consulting, I had the money saved and more importantly, this is something I won’t need to deal with for at least 10 years.

My point is that everything that happens to us can be good or bad, but most of the time it depends on how you look at it.  Every experience could be construed as negative, “why does this always happen to me?” type thinking…  or you can choose to build on it.  You can choose to focus on how the experience made you stronger, helped you get where you are today, and will help you achieve your goals.

Thanks for reading,