Quantcast
Channel: Jive Syndication Feed
Viewing all 11427 articles
Browse latest View live

SAP NetWeaver Gateway and SAPUI5 CodeJam in Antwerpen

$
0
0

logo SAP CodeJam Antwerp.jpg

 

 

 

 

WP_20140220_007.jpg

 

Welcome

 

On February the 20th Flexso hosted their 2nd CodeJam in their offices in Kontich near Antwerpen. This time it was about showing the End-2-End process of developing Fiori like applications using SAP UI5 Development and the development of OData services using SAP NetWeaver Gateway.

 

 

The session started with a reception and the 25 participants were welcomed by our host David Pierre from Flexo.

 

WP_20140220_013.jpg

The Session

 

The session started with a comprehensive overview of SAPUI5 by my colleague Christoph Kraemer who also walked the participants through the development of a simple SAP UI5 application as described in his blog How To Guide: SAPUI5 & Netweaver Gateway CodeJam Antwerp.

 

After having seen how it's possible to write cool UI's with SAPUI5 technology it was my turn to show how to develop OData services with SAP NetWeaver Gateway that are needed by such Fiori like applications.

 

 

 

CodingWP_20140220_017.jpg

 

As usual in SAP CodeJam events it was now time for the participants to get their hands dirty.

 

Depending on their main interest the participants either started to develop a SAPUI5 application based on Christoph's blog. Or they started to build an OData service using the How-To-Guide How to Develop a Gateway Service using Code based Implementation

 

A lot of participants also managed to do both and were able to build a SAPUI5 application on top of the service they have devloped.

 

Get together

 

After having lots of brain food we were invited a second time to have some finger food which gave the participants time for discussions and questions.

 

Again was very interesting to see the high interest in SAP NetWeaver Gateway and SAPUI5 and I am looking forward to our next SAP CodeJam event.


Back it on up…..then recover it

$
0
0

Hi Everybody!

 

My name is Man-Ted and I’m currently on the SAP HANA Product Support team located in Vancouver, BC. I’m writing this blog to give a look into backup and recovery.

 

Persistence Area

Before getting into backing up the database lets first talk about what exactly are we backing up. Even though SAP HANA is an in-memory database there is still information written to disk as a fallback in case there is ever a failure, this is the persistence area. Inside the persistence area there is a log area and a data area.

 

Log Area

The log area directory is defined in your global.ini under basepath_logvolumes, in this directory log segments are created when a transaction is committed. Log segments size can also be customized in the global.ini file under log_segement_size_mb.

 

Data Area

The data area contains SQL data, undo log information, and modeling data. The data area is written to the persistence area at save point intervals, savepoint intervals are set in the global.ini under savepoint_interval_s (default value is 300) and the persistence area is basepath_datavolumes

1.png

Log backup

Log backups, by default, are done automatically in the following scenarios:

  • The log segment is full
  • The log segment is closed after exceeding the configured time threshold
  • The database is started

 

The log backup is a backup of the log area, once the log area segments are backed up the log area segments can be over written. In the global.ini you will want to make note of the following parameters:

 

·         Basepath_logbackup – the location where the log backups will be stored, the default directory is $DIR_INSTANCE/backup/log

·         Enable_auto_log_backup – enables automatic log backups

·         Log_backup_timeout_s – by default the value is 900 seconds, when the timeout is reached a backup, if the value is 0 then it is disabled

·         Log_mode – there are three log modes

o   Legacy – Log segments are retained until a full data backup is performed. This mode not recommended

o   Overwrite – Log segments are freed by savepoints and no log backups are performed. This made can be used for development environments, but never   use in production.

o   Normal – Log segments are automatically backed up. This is the default setting in SP3 and higher.

 

 

Estimate the Size of Your Backup

Prior to taking your database backup users should always ensure there is enough space on their drive, use the following queries to determine the estimated size of your backup.

 

This query will let you know the total size of the backup

● select sum(allocated_page_size) from M_CONVERTER_STATISTICS

 

This query will inform you what the size of each volume will take. The results of the query will be equivalent to the above query, but provide you with more granularity by grouping the services.

● select volume_id, sum(allocated_page_size) from M_CONVERTER_STATISTICS group by

volume_id

 

 

Authorizations

In order to do a backup the following SYSTEM privileges

  • CATALOG READ - Authorizes the user to have unfiltered read-only access to all system and monitoring views.
  • BACKUP ADMIN or BACKUP OPERATOR - The difference between the two is that the BACKUP OPERATOR can only perform backups, while the BACKUP ADMIN can configure backups and delete backups.

 

 

Data backup

Unlike the log backup, the data backup is not automatically backed by the system (the data backup can be scheduled by 3rd party backint tools, custom scripts, and DBA cockpit). During a backup the database is still operational. The data backup can be backed up by the following SQL

  • BACKUP DATA ALL USING FILE (‘COMPLETE_DATA_BACKUP’)

Or can be done via the Backup Wizard, please following the screen caps

2.png

3.png4.png5.png

As you can see you can also cancel backups via the UI, but can also be canceled via the SQL editor with the following:

•       BACKUP CANCEL <BACKUP_ID>

The following files are made after this backup has completed

<default backup directory>/<prefix_name>_0_1 (contains topology)

<default backup directory>/<prefix_name>_1_1 (contains name server persistency)

<default backup directory>/<prefix_name>_2_1 (normally contains index server persistency)

<default backup directory>/<prefix_name>_3_1 (normally contains statistic server persistency)

 

 

Backup Editor

In the Backup Editor there are three tabs: Overview, Configuration, Backup Catalog

 

Overview

In this tab we can view the last success backup metadata and you can start and cancel a backup

6.png

7.pngPress this to start the backup wizard

 

8.pngPress this to view the backup.log file

 

9.pngThis button will stop the backup

 

Configuration

Can configure backing setting here, change the data and log backup settings here as well. For the data backups you can change where the backup will go while for the log backup settings you can change the destination, interval, and if automatic backup is enabled.

10.png

Backup Catalog

Shows a history of backups and information about the backup when you high light it

11.png

Also you can delete old backup via the Backup Catalog by right clicking on one of backups

12.png

The backup table location $(DIR_INSTANCE)/../SYS/global/hdb/metadata/BackupCatalog.xml

 

Configure table

13.png

Database snapshot

Clones an entire instance during operational state online (consistent state stored in the persistency of an instance). If there is an existing snapshot you will not be able to perform a backup, if you do try to create a backup while a snapshot exists you will see the following error

Could not execute 'BACKUP DATA ALL USING FILE('COMPLETE_DATA_BACKUP')' in 6 ms 181 µs .

SAP DBTech JDBC: [2]: general error: Backup error: The state 'ManagerSnapshotExists' of the BackupManager does not allow the requested operation

To create the database snapshot you would call

BACKUP DATA CREATE SNAPSHOT

To drop it up use

BACKUP DATA DROP SNAPSHOT

There is only one snapshot held at a time, for information on snapshots please refer to the SAP HANA Administration Guide.

 

Types of Recovery

There are 3 different types of recovery available to users

  1. Recover the database to its most recent state – uses the data and log backup and then will refer to the log persistence area and will replay the log
  2. Recover the database to the following point in time – uses the data and log backup area to bring the database back to a point in time, this could be needed if there is a logical error
  3. Recover the database to a specific data backup – uses on the data backup only, the log persistence area is cleared

Please note that for all of these types of recovery the database will need to be down.

 

How to Perform a Recovery

Note that unlike in a backup, users cannot cancel a recovery.

1)      Select your backup type

14.png 

AftAfter selecting the recovery type you will select the log location15.png

1)      After this you will need to specify the data location

16.png

1)      Lastly are the misc settings for the recovery

17.png

 

1)      Once that is done a summary screen appears and you can then start by pressing “Finish”

18.png

Logs and Traces

If there are any issues with the backup and recovery please review the backup.log file. If more information is needed please review the name server trace

CALL FOR SUBMISSIONS: 2014 SAP Education Best Practices Award

$
0
0

What’s the secret to a successful SAP project? You should know – you’ve seen the good, the bad, the ugly, and more. That means you’ve probably also seen the best of the best and, along the way, learned some pretty important lessons.

 

Why not share your hard-won knowledge at SAPPHIRE NOW 2014?

 

All ASUG Installation member companies are invited to compete for the eighth annual SAP Education Best Practices Award, conferred by ASUG and SAP Education in official recognition of 2014’s most innovative and successful training programs.

 

The winner will be selected by the SAP Education Best Practices Award Committee. Entries are judged on the following criteria:

  • Strategy
  • Measurement
  • Innovation
  • Sustainment
  • Lessons Learned

 

The winner will receive one complimentary registration to the 2014 ASUG Annual Conference/SAPPHIRE NOW in Orlando, Florida; an invitation to present an educational program at the event; and a handsome personalized trophy. Finally, get the recognition you deserve!

Submissions accepted through Friday, March 14, 2014. To download the submission file, visit http://www.asug.com/discussions/docs/DOC-36281


To enter, please complete and return the submission form below to Kristy McKinley by March 14,2014.

-gd DBA and -gm 1 usage clarification in SAP Sybase IQ

$
0
0

When I use ‘-gd DBA -gm 1’ to start up IQ1540 server,

One connection using non-DBA login ( ‘thomas’) to connect to IQ1540 OK !

The other connection using DBA login still can connect to IQ1540 without problem !!

 

This example confirmed what IQ1540 installation guide said – when ‘-gm 1’ set on start server configuration, an extra DBA login still can logon IQ server to issue command to kill other connection !!

 

  • Picture 1   ( one non-DBA login + one DBA login )

iq_gm_1.png

 

Two ‘DBA’ logins are also worked !!

 

  • Picture 2  ( one DBA login + one DBA login )

iq_gm_2.png

 

Two non-DBA logins hit the ‘-gm 1’ limit, and 2nd non-DBA connection cannot connect to IQ1540 server !!

 

  • Picture 3  ( one non-DBA login + one non-DBA login )

iq_gm_3.png

 

From the Sybase IQ 1540 utility Guide, we can clearly know these two server option's definition

 

-gm level  => Limit the number of connections to the server that can be active at one time.

-gd level   => Set the permission required to start and stop the database.

 

Please check following links for details on start_iq server options

http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc00168.1540/doc/html/san1276279392032.html

 

 

-gd DBA and -gm 1 server options are used to limit user connection when DBA need to do some maintenance tasks;

for example: 'alter database upgrade' after installed software patches, change table schema, and rebuild indexes tasks.

 

-gm 1 can be used to limit non-DBA login only and only 1 non-DBA login can logon Sybase IQ server !!

However, it is not used to limit DBA login / login with DBA authority to logon Sybase IQ server !!

 

Actually, if one non-DBA login connected to Sybase IQ server, DBA can still open a new connection with DBA login / login with DBA authority

to logon Sybase IQ server and issue 'drop connection conn-handle-number' to clear that existing non-DBA login session to avoid other user interrupt DBA maintenance tasks !!

 

I hope this clarification is helpful to end users to clearly know the definition and usage of these 2 server options ( -gm and -gd ) !!

Nuestro turno: nosotros de SAP Educación gustaríamos mucho de saber que es importante para usted

$
0
0

Entrenamiento y educación tienen mucho que ver con nuestra capacidad de trabajar de forma eficiente, a pensar en nuevas forma, de contribuir y crecer.

 

 

Entonces, pienso que formación y educación deben empezar por nosotros. Y SAP Educación comparte la misma opinión.

 

 

El área Global de Educación está trabajando con la empresa de pesquisa y consultoría, Pierre Audoin Consultants (PAC), para examinar los miembros de SAP Community Network (SCN), para que pueda comprender mejor nuestras prioridades y
preferencias de entrenamiento.

 

 

¡Solo cinco minutos!

 

 

Apreciaríamos si complétaselo así sea posible. Tomará solamente de 5 hasta 7 minutos de su tiempo para que SAP Educación pueda entrar en el proyecto de formación y educación que atienda sus necesidades. La encuesta cuestiona sus objetivos personales para formación, cual es la influencia del entrenamiento en su trabajo diariamente y también cuales los elementos de formación son importantes para usted.

 

 

Sus datos serán tratados de manera estrictamente confidencial.

 

 

El mejor momento para expresarnos es cuando alguien escucha.

 

 

SAP Educación ve las contribuciones de los miembros de SCN como esencial para la mejora continua de sus ofertas. Ahora es el mejor momento para hablar a SAP Educación que es realmente importante para usted.

 

 

¡Participe de la encuesta! - Brief Survey on SAP Education and Training

SAP Fiori Client Available for Android Devices

$
0
0

The SAP Fiori Client is now available in the Google Play store. Licenses SAP Fiori users can download it for compatible Android devices. You can read the product overview and user guide at http://help.sap.com/fiori-client/.

google-app-store-screenshot.png

Hana SPS07, the spatial engine and taking a bite out of the Big Apple

$
0
0

Introduction

 

The Hana Spatial Engine became GA (general availability) as of SPS07.  Very exciting, no more ATAN2, SIN, COS and SQRT for me. 



Let me give you a straightforward example of what is traditionally required to calculate the distance between two pairs of GPS latitude/longitude coordinates.  This is my implementation in JavaScript:

 



myHplApp.controller.Distance = function(fromLatitude, fromLongitude, toLatitude, toLongitude) {

  var earthRadiusMetres      = 6371000; // in metres

  var distanceLatitude       = myHplApp.controller.toRad(fromLatitude - toLatitude);

  var distanceLongitude      = myHplApp.controller.toRad(fromLongitude - toLongitude);

  var lat1                   = myHplApp.controller.toRad(fromLatitude);

  var lat2                   = myHplApp.controller.toRad(toLatitude);

  var a = Math.sin(distanceLatitude / 2) * Math.sin(distanceLatitude / 2) +

          Math.sin(distanceLongitude / 2) * Math.sin(distanceLongitude / 2) *

          Math.cos(lat1) * Math.cos(lat2);

  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

  var distance = (earthRadiusMetres * c).toFixed(2);

  return distance;

};

 

 

 

 

Compared with the requirement being delivered in Hana Spatial:

 

SELECT NEW ST_Point('POINT(58.641759 -3.068672)',4326).ST_Distance(NEW ST_Point('POINT(50.05935 -5.708054)',4326)) FROM dummy;



 

This simple example involves only two coordinate pairs, not 20, 50 or 100 describing a more complex geometric or geographic shape..  Now we have Spatial, let's get Hana to do all the heavy lifting for our GIS (Geographic Information System) needs!



Frequent visitors to the Hana Developer Center and Hana In-Memory forums may have seen fantastic blogs relevant to geo data processing, like Kevin Small's reverse geocoding and Aron MacDonald's spatial with D3.  It's clear this topic has community interest and I'm rather intimidated to be writing my first SCN blog in such esteemed company.

 

 

Regretfully you won't get any beautifully rendered maps nor tablet-enabled apps here. What I do want to share with you is the consolidated learning of a team effort this week in the forum, thanks to all, it's been fun.  I'm going to use Manhattan as an example, let's begin.

 

 

 

Shopping for data on 5th Avenue

 

We need to describe real world objects like streets, areas, roads and other points of interest.  We do this with spatial artifact types like points (points of interest), lines (streets, rivers) and polygons (lakes, counties, countries). 



To describe parts of Manhattan I'm interested in I need geographic data, and I'm going to use a GIS tool to get that.  I use Google Earth, a personal choice, whatever you find works for you.  First I'm interested in the whole of Manhattan, Central Park and Liberty Island.  I want to mark those areas out.  In Google Earth I can use the polygon tool:


blog_polygon.PNG


This is cool because you can give an area a border and fill colour and set the opacity.  You can see from the screenshots below I've set Manhattan as red.

blog2_comp.jpg



Now I want to plot 5th Ave, 59th St and Manhattan Bridge.  I've set these as yellow to stand out.  I have done this with the path tool in Google Earth, which looks like:


blog_path.PNG



Finally some places of interest - my favourite, the Chrysler Building, followed by the Empire State and Statue of Liberty.  You do this with the placemark tool in Google Earth:

 

blog_pin.PNG



Finished mapping Manhattan.

blog1.jpg

 

 

 

You can organise your places rather nicely in Google Earth too, and toggle visibility.

 

blog_big_apple_folder.PNG

 

 

OK, so we have plotted our places of interest, how to we get all these coordinates?  Right-click each place of interest to get the context menu then choose Save Place As.  Set the type as Kml


Open the file in a text editor (I use Notepad++).  For Central Park you will see something like the following - you are interested in the contents of the <coordinates> tag.

 

 

<coordinates>
-73.95804761112954,40.80030564443565,0 -73.98220944876016,40.76822446495113,0 -73.97245661014151,40.76435147208066,0 -73.94896121467113,40.79633309813332,0 -73.95804761112954,40.80030564443565,0
</coordinates>

 

 

 

Filling the Hana bag with spatial data goodness

 

Let's create a table to store our spatial data.

 

 

 

create column table SpatialLocations(

    id        integer,

    name      nvarchar(40),

    shape    ST_GEOMETRY(4326)

);

 

 

 

Q. What is type ST_GEOMETRY?

A. ST_GEOMETRY is the spatial data supertype which we are going to use to define our column shape to contain all our coordinates.  More on that in the Spatial Reference guide page 9.

 

 

Q.What does 4326 represent?

A.4326 is the identifier for WSG84 (World Geodetic System, 1984) for a specific SRS (Spatial Reference System).  For now think of it as a set of specifications that enables us to accurately transform groups of spatial coordinates into real world points and measures.

 

 

 

Now we have our Spatial Locations table created, let's fill it with our Manhattan data. 

IMPORTANT - Longitude is expected first, which is the opposite to that provided by Google Earth.

 

 

 

Central Park going into the "bag"

insert into SpatialLocations values(2, 'Central Park', new ST_POLYGON('POLYGON((

    40.80030564443565 -73.95804761112954,

    40.76822446495113 -73.98220944876016,

    40.76435147208066 -73.97245661014151,

    40.79633309813332 -73.94896121467113,

    40.80030564443565 -73.95804761112954

))'));

 

 

 

 

5th Avenue

insert into SpatialLocations values(3, '5th Avenue', new ST_LINESTRING('LINESTRING((

    40.80326767213774 -73.94457982661453,

    40.7315072365715 -73.99689578972514

))'));

 

 

 

 

And my favourite, the Chrysler

insert into SpatialLocations values(6, 'Chrysler Building', new ST_POINT('POINT((

    40.75157529253383 -73.97548823598672

))'));


 

 

Note how I'm describing each real world "shape" with a spatial shape type - ST_POLYGON, ST_LINESTRING, ST_POINT.  Also note with polygons you "close the loop", my first coordinate pair is also my last.  I have included all 9 Manhattan spatial shape table inserts as an attachment.


 

 

Taking a bite with SQL


Here's an example SQL statement determining the distance (in metres) between a point describing Times Square and spatial shape id 6 in our table, the Chrysler building.  Result 1058m.



Note here we specify SRID 4326 for Times Square, as the SRID (spatial reference identifier) needs to be common.  Soon an enhancement to deduce an implied SRID from the column value SRID will be with us



select shape.st_distance(ST_GeomFromEWKT('SRID=4326;POINT(40.758977 -73.984746)'))

      from spatiallocations

      where id = 6;

 

 

blog5.PNG

 



Q. How can I be sure the result is in metres?

A. Linear unit of measure associated with SRID, in view ST_SPATIAL_REFERENCE_SYSTEMS

blog4.PNG

 

 


Another example of distance between the Chrysler (id 6) and Empire State (id 7) in our spatial locations table:

 

select A.name as "From", B.name as "To", A.shape.ST_DISTANCE(B.shape) as "Distance(m)"

      from SpatialLocations A , SpatialLocations B

      where A.id = 6 and B.id = 7;

blog7.PNG

 

 

 

Munching consumption with XSJS

 

We have seen interrogation of the spatial shapes directly with SQL in the console.  I've also included consumption with an XSJS service (code below and attached - no warranty provided for lack of robustness!). 


Q. Tell me about Central Park?

A. bigApple.xsjs?cmd=poi&poi=2


 

blog20.JPG

Q. Give me the distance between the Chrysler and Empire State?

A. bigApple.xsjs?cmd=dst&poiFrom=6&poiTo=7

 

{

  • shape:

    [

    ]

     

    • {}
      • From: "Chrysler Building",
      • To: "Empire State Building",
      • Distance(m): 1148

}



Q. Is the Chrysler within 1100m of the Empire State?

A.No.  bigApple.xsjs?cmd=wdst&dstM=1100&poiFrom=6&poiTo=7

{

  • shape:

    [

    ]

     

    • {}
      • From: "Chrysler Building",
      • To: "Empire State Building",
      • Distance(m): "1100",
      • Within distance: "No"

}

 




Q. Is the Chrysler within 1200m of the Empire State?

A. Yes.  bigApple.xsjs?cmd=wdst&dstM=1200&poiFrom=6&poiTo=7

{

  • shape:

    [

    ]

     

    • {}
      • From: "Chrysler Building",
      • To: "Empire State Building",
      • Distance(m): "1200",
      • Within distance: "Yes"

}

 


Q. Does 5th Avenue intersect Manhattan Bridge?

A.No. bigApple.xsjs?cmd=int&poiFrom=3&poiTo=5

{

  • shape:

    [

    ]

     

    • {}
      • From: "5th Avenue",
      • To: "Manhattan Bridge",
      • Intersects: "No"

}




Q. Does 5th Avenue intersect 59th St.?

A.Yes. bigApple.xsjs?cmd=int&poiFrom=3&poiTo=4

{

  • shape:

    [

    ]

     

    • {}
      • From: "5th Avenue",
      • To: "59th St",
      • Intersects: "Yes"

}



Q. Does 5th Avenue equal 59th St.?

A.No. bigApple.xsjs?cmd=eq&poiFrom=3&poiTo=4

 

{

  • shape:

    [

    ]

     

    • {}
      • POI A: "5th Avenue",
      • POI B: "59th St",
      • Spatially Equal: "No"

}

 

 

 

Final Thoughts


Currently there is a lack of documentation, example code, cookbooks and developer orientated videos, especially considering the GA status.  Over the last year the Hana Developer community has indulged in a plethora of quality educational and technical resources for core topics.  The bar is set high.  However once I had a few examples on the go it was easy to work with, very code light.

 

 

Hana itself has evolved remarkably over the last year I have been developing with it as a solution - it's an effort to keep up.  There are a few gaps in the current Spatial Engine solution.  One is being able to work with ST_GEOMETRY spatial types in SQLScript procedures.  I understand the Spatial team are making progress towards this for 7.2.  Another gap is inability in declaring entities with spatial-based columns in your CDS (Core Data Services) .hdbdd or hdbtable definition artifacts.  I also understand this is coming in SPS8/9 (TBD).  So improvements and added functionality to Spatial will come with each release, as they have for Hana core as a whole, with the learning materials to support.



In the meantime a HUGE thank-you to Gerrit Simon Kazmaier, chief technical architect for Spatial who has been providing great support in the community forum.  Perhaps whilst I have his attention - for some reason I was unable to successfully work with the ST_CONTAINS and ST_WITHIN methods for SRID 4326, to determine if for example Central Park lies within Manhattan.  I could not get ST_AREA to give me the size of Liberty Island.  It is not clear if some methods are restricted by SRID "type".  Any pointers here welcomed!

 

 

The Hana Spatial Engine opens up a whole host of exciting opportunities for delivering application capability with spatial awareness.  The consumer group is large and diverse, including:

 

  • Healthcare, for tracking of infection.
  • Enabling local authorities with decision support systems for urban planning and geographic analytics on crime.
  • Consumer goods companies delivering targeted customer marketing and effective sales delivery.

 

 

The future is exciting, it's spatial!

 

(Footnote: - no more fruit-orientated blogs from me)

 



XSJS service bigApple.xsjs


(You may wish to get the code from the attachment due to formatting concerns)


 

function bigApple() {

 

    var pstmt          = null,

        rs              = null,

        conn            = $.db.getConnection(),

        bodyContent    = '',

        myCmd          = $.request.parameters.get('cmd'),

        myPoi          = $.request.parameters.get('poi'),

        myPoiFrom      = $.request.parameters.get('poiFrom'),

        myPoiTo        = $.request.parameters.get('poiTo'),

        myDstM          = $.request.parameters.get('dstM'),

        myQuery        = null,

        geoShape        = [];

 

 

    var poiOut = function(val){

          var geometry = JSON.parse(val.getNString(3));

          return {

            "id": val.getInteger(1),

            "name": val.getString(2),

            "geometry": geometry

          };

    };

 

 

    var distanceOut = function(val){

          return {

            "From": val.getString(1),

            "To": val.getString(2),

            "Distance(m)": val.getInteger(3)

          };

    };

 

 

    var withinDistanceOut = function(val){

          return {

            "From": val.getString(1),

            "To": val.getString(2),

            "Distance(m)": myDstM,

            "Within distance": val.getInteger(3) ? "Yes" : "No"

          };

    };

 

 

    var intersectsOut = function(val){

        return {

            "From": val.getString(1),

            "To": val.getString(2),

            "Intersects": val.getInteger(3) ? "Yes" : "No"

        };

    };

 

 

 

    var equalOut = function(val){

        return {

            "POI A": val.getString(1),

            "POI B": val.getString(2),

            "Spatially Equal": val.getInteger(3) ? "Yes" : "No"

        };

    };

 

 

    function querySpatial(myQuery) {

      try { 

            pstmt = conn.prepareStatement(myQuery.query);

            if (myQuery.id) {

                pstmt.setInt(1,myQuery.id);

            } else if (myQuery.dstM) {

                pstmt.setInt(1,myQuery.dstM);

                pstmt.setInt(2,myQuery.idFrom);

                pstmt.setInt(3,myQuery.idTo);

            } else {

                pstmt.setInt(1,myQuery.idFrom);

                pstmt.setInt(2,myQuery.idTo);

            }

 

            rs = pstmt.executeQuery();

            while (rs.next()) {

                geoShape.push(myQuery.fnOut(rs));

            }

 

            bodyContent = JSON.stringify({

              "shape": geoShape

            });

     

            $.response.setBody(bodyContent); 

      } catch (e) {

            $.response.status = $.net.http.INTERNAL_SERVER_ERROR;

            $.response.setBody(e.message);

            return;

      }

    }

 

 

    try {

      switch (myCmd) {

            case "poi":  //Point of Interest

                myQuery = { query: 'select id, name, shape.ST_AsGeoJSON()

                                  from SpatialLocations where id = ?',

                            id:    parseInt(myPoi,10),

                            fnOut:  poiOut };

                querySpatial(myQuery);

                break;

           

            case "dst":  //Distance between two points

                myQuery = { query: 'select A.name as "From", B.name as "To",

                                        A.shape.ST_DISTANCE(B.shape) as "Distance(m)" from

                                        SpatialLocations A ,

                                        SpatialLocations B where A.id = ? and B.id = ?',

                            idFrom: parseInt(myPoiFrom,10),

                            idTo:  parseInt(myPoiTo,10),

                            fnOut:  distanceOut };

                querySpatial(myQuery);

                break;

           

            case "wdst": //Within Distance of two points

                myQuery = { query: 'select A.name as "From", B.name as "To",

                                        A.shape.ST_WithinDISTANCE(B.shape,?) as

                                        "Distance(m)" from SpatialLocationsA,

                                        SpatialLocations B where A.id = ? and B.id = ?',

                            dstM: parseInt(myDstM,10),

                            idFrom: parseInt(myPoiFrom,10),

                            idTo:  parseInt(myPoiTo,10),

                            fnOut:  withinDistanceOut };

                querySpatial(myQuery);

                break;


            case "int":  //Two points intersect

                myQuery = { query: 'select A.name as "From", B.name as "To",

                                        A.shape.ST_Intersects(B.shape) as "Intersects"

                                        from SpatialLocations A ,

                                        SpatialLocations B where A.id = ? and B.id = ?',

                            idFrom: parseInt(myPoiFrom,10),

                            idTo:  parseInt(myPoiTo,10),

                            fnOut:  intersectsOut };

                querySpatial(myQuery);

                break;

           

            case "eq":  //Two spatial geometries equal

                myQuery = { query: 'select A.name as "POI A", B.name as "POI B",

                                        A.shape.ST_Equals(B.shape) as "Spatially Equal"

                                        from SpatialLocations A ,

                                        SpatialLocations B where A.id = ? and B.id = ?',

                            idFrom: parseInt(myPoiFrom,10),

                            idTo:  parseInt(myPoiTo,10),

                            fnOut:  equalOut };

                querySpatial(myQuery);

                break;

 

            default:

                $.response.status = $.net.http.INTERNAL.SERVER.ERROR;

                $.response.setBody('Invalid cmd '+ myCmd);

      };  //End myCmd

    } catch(e) {

      $.response.status = $.net.http.INTERNAL_SERVER_ERROR;

      $.response.setBody(e.message);

    } finally {

      if (rs != null) {

            rs.close();

      }

 

      if (pstmt != null) {

            pstmt.close();

      }

 

      if (conn != null) {

            conn.close();

      }

    }

}

 

 

bigApple();

Reduce / Minimize SAPUI5 JS code with YUI Compressor

$
0
0

Motivation

 

In production environments, mobile devices, etc. reduce size of our JS code is a must in order get a better usability, lower wait time when there is a poor bandwidth.

 

Another reason which we need to reduce code is to "protect" non free code (for example a private B2C, B2E, B2B portal).

A good example could be YUI Compressor. This tool, developed by Yahoo Team, reduces / compresses JS code:


YUI Compressor

 

 

Step by step

 

1. Download YUI Compressor tool fromYUI Compressor

 

2. Use YUI on console. In this example (JS Bin - Collaborative JavaScript Debugging) we reduce this JS example:


Open a console and execute this command (-v in order to see WARNINGs or ERRORs, -o is the output file parameter)

 

java -jar yuicompressor-2.4.8.jar -v myview.view.js -o myview.view-min.js

yuimin0.png

 

This is the original code:

 

 

sap.ui.jsfragment("fragment.Table", {  createContent : function(oController) {      //Obtain data from controller    var aData = oController.fragmentInitData.data;      //Create an instance of the table control    var oTable = new sap.ui.table.Table( {      title : oController.fragmentInitData.title, //Obtain title from controller      visibleRowCount : 7    });      //Obtain column definition from controller    for ( var i = 0; i < oController.fragmentInitData.columns.length; i++) {      var template;          //Define the columns and the control templates to be used      if (oController.fragmentInitData.columns[i].type == "Text")        template = new sap.ui.commons.TextView()        .bindProperty(          "text",          oController.fragmentInitData.columns[i].bindingPath);      else if (oController.fragmentInitData.columns[i].type == "Rating")        template = new sap.ui.commons.RatingIndicator()        .bindProperty(          "value",          oController.fragmentInitData.columns[i].bindingPath);      else if (oController.fragmentInitData.columns[i].type == "Checkbox")        template = new sap.ui.commons.CheckBox()        .bindProperty(          "checked",          oController.fragmentInitData.columns[i].bindingPath);          if (template !== undefined) {        oTable        .addColumn(new sap.ui.table.Column(          {            label : new sap.ui.commons.Label(              {                text : oController.fragmentInitData.columns[i].title              }),            template : template,            sortProperty : oController.fragmentInitData.columns[i].bindingPath,            filterProperty : oController.fragmentInitData.columns[i].bindingPath,            width : "200px"          }));      }    }      var oModel = new sap.ui.model.json.JSONModel();    oModel.setData( {      modelData : aData    });      oTable.setModel(oModel);    oTable.bindRows("/modelData");      //Initially sort the table    oTable.sort(oTable.getColumns()[0]);      //Bring the table onto the UI    return oTable;  }
});
sap.ui.controller("view.FragmentsExample", {});
sap.ui.jsview("view.FragmentsExample", {  /** Specifies the Controller belonging to this View.  * In the case that it is not implemented, or that "null" is returned, this View does not have a Controller.  * @memberOf view.FragmentsExample  */  getControllerName : function() {    return "view.FragmentsExample";  },  /** Is initially called once after the Controller has been instantiated. It is the place where the UI is constructed.  * Since the Controller is given to this method, its event handlers can be attached right away.  * @memberOf view.FragmentsExample  */  createContent : function(oController) {      //Define some sample data    var aData = createSampleData();      //Define fragment init data    oController.fragmentInitData = {      title : "This is a Table Fragment Example",      data : aData,      columns : [ {        title : 'Last Name',        bindingPath : 'lastName',        type : "Text"      }, {        title : 'Name',        bindingPath : 'lastName',        type : "Text"      }, {        title : 'Selected',        bindingPath : 'checked',        type : "Checkbox"      }, {        title : 'Rating',        bindingPath : 'rating',        type : "Rating"      } ]    };      //Instantiate fragment.Table with this init data "oController.fragmentInitData"    var table1 = sap.ui.jsfragment("fragment.Table", oController);      //Define some sample data again    var aData2 = createSampleData();      //Define fragment init data. Different init data this time (different title and less columns).    oController.fragmentInitData = {      title : "This is a Table Fragment Example 2",      data : aData,      columns : [ {        title : 'Last Name',        bindingPath : 'lastName',        type : "Text"      }, {        title : 'Name',        bindingPath : 'lastName',        type : "Text"      } ]    };      //Instantiate fragment.Table with this init data "oController.fragmentInitData"    var table2 = sap.ui.jsfragment("fragment.Table", oController);      var oDivider1 = new sap.ui.commons.HorizontalDivider("divider1");    oDivider1.setHeight(sap.ui.commons.HorizontalDividerHeight.Large);      //Present data into VerticalLayout    var oLayout = new sap.ui.layout.VerticalLayout( {      content : [ table1, oDivider1, table2 ]    });      return oLayout;  }
});
/**  * Returns some sample data  */
function createSampleData() {  return [ {    lastName : "Dente",    name : "Al",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 4  }, {    lastName : "Friese",    name : "Andy",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person2.gif",    gender : "male",    rating : 2  }, {    lastName : "Mann",    name : "Anita",    checked : false,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "female",    rating : 3  }, {    lastName : "Schutt",    name : "Doris",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "female",    rating : 4  }, {    lastName : "Open",    name : "Doris",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "female",    rating : 2  }, {    lastName : "Dewit",    name : "Kenya",    checked : false,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "female",    rating : 3  }, {    lastName : "Zar",    name : "Lou",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 1  }, {    lastName : "Burr",    name : "Tim",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person2.gif",    gender : "male",    rating : 2  }, {    lastName : "Hughes",    name : "Tish",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 5  }, {    lastName : "Lester",    name : "Mo",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 3  }, {    lastName : "Case",    name : "Justin",    checked : false,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 3  }, {    lastName : "Time",    name : "Justin",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 4  }, {    lastName : "Barr",    name : "Gaye",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 2  }, {    lastName : "Poole",    name : "Gene",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person2.gif",    gender : "male",    rating : 1  }, {    lastName : "Ander",    name : "Corey",    checked : false,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 5  }, {    lastName : "Early",    name : "Brighton",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 3  }, {    lastName : "Noring",    name : "Constance",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "female",    rating : 4  }, {    lastName : "Haas",    name : "Jack",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "male",    rating : 2  }, {    lastName : "Tress",    name : "Matt",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person2.gif",    gender : "male",    rating : 4  }, {    lastName : "Turner",    name : "Paige",    checked : true,    linkText : "www.sap.com",    href : "http://www.sap.com",    src : "images/person1.gif",    gender : "female",    rating : 3  } ];
}
var view = sap.ui.view( {  id : "FragmentsExample",  viewName : "view.FragmentsExample",  type : sap.ui.core.mvc.ViewType.JS
});
view.placeAt("content");

 

3. A minimized file is created (we can see how size is reduced from 9k to 5k, WoW):

 

yuimin.png

 

JS Bin - Collaborative JavaScript Debugging

 

 

sap.ui.jsfragment("fragment.Table",{createContent:function(c){var b=c.fragmentInitData.data;var a=new sap.ui.table.Table({title:c.fragmentInitData.title,visibleRowCount:7});for(var d=0;d<c.fragmentInitData.columns.length;d++){var e;if(c.fragmentInitData.columns[d].type=="Text"){e=new sap.ui.commons.TextView().bindProperty("text",c.fragmentInitData.columns[d].bindingPath)}else{if(c.fragmentInitData.columns[d].type=="Rating"){e=new sap.ui.commons.RatingIndicator().bindProperty("value",c.fragmentInitData.columns[d].bindingPath)}else{if(c.fragmentInitData.columns[d].type=="Checkbox"){e=new sap.ui.commons.CheckBox().bindProperty("checked",c.fragmentInitData.columns[d].bindingPath)}}}if(e!==undefined){a.addColumn(new sap.ui.table.Column({label:new sap.ui.commons.Label({text:c.fragmentInitData.columns[d].title}),template:e,sortProperty:c.fragmentInitData.columns[d].bindingPath,filterProperty:c.fragmentInitData.columns[d].bindingPath,width:"200px"}))}}var f=new sap.ui.model.json.JSONModel();f.setData({modelData:b});a.setModel(f);a.bindRows("/modelData");a.sort(a.getColumns()[0]);return a}});sap.ui.controller("view.FragmentsExample",{});sap.ui.jsview("view.FragmentsExample",{getControllerName:function(){return"view.FragmentsExample"},createContent:function(c){var b=createSampleData();c.fragmentInitData={title:"This is a Table Fragment Example",data:b,columns:[{title:"Last Name",bindingPath:"lastName",type:"Text"},{title:"Name",bindingPath:"lastName",type:"Text"},{title:"Selected",bindingPath:"checked",type:"Checkbox"},{title:"Rating",bindingPath:"rating",type:"Rating"}]};var d=sap.ui.jsfragment("fragment.Table",c);var g=createSampleData();c.fragmentInitData={title:"This is a Table Fragment Example 2",data:b,columns:[{title:"Last Name",bindingPath:"lastName",type:"Text"},{title:"Name",bindingPath:"lastName",type:"Text"}]};var a=sap.ui.jsfragment("fragment.Table",c);var e=new sap.ui.commons.HorizontalDivider("divider1");e.setHeight(sap.ui.commons.HorizontalDividerHeight.Large);var f=new sap.ui.layout.VerticalLayout({content:[d,e,a]});return f}});function createSampleData(){return[{lastName:"Dente",name:"Al",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:4},{lastName:"Friese",name:"Andy",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person2.gif",gender:"male",rating:2},{lastName:"Mann",name:"Anita",checked:false,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"female",rating:3},{lastName:"Schutt",name:"Doris",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"female",rating:4},{lastName:"Open",name:"Doris",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"female",rating:2},{lastName:"Dewit",name:"Kenya",checked:false,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"female",rating:3},{lastName:"Zar",name:"Lou",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:1},{lastName:"Burr",name:"Tim",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person2.gif",gender:"male",rating:2},{lastName:"Hughes",name:"Tish",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:5},{lastName:"Lester",name:"Mo",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:3},{lastName:"Case",name:"Justin",checked:false,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:3},{lastName:"Time",name:"Justin",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:4},{lastName:"Barr",name:"Gaye",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:2},{lastName:"Poole",name:"Gene",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person2.gif",gender:"male",rating:1},{lastName:"Ander",name:"Corey",checked:false,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:5},{lastName:"Early",name:"Brighton",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:3},{lastName:"Noring",name:"Constance",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"female",rating:4},{lastName:"Haas",name:"Jack",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"male",rating:2},{lastName:"Tress",name:"Matt",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person2.gif",gender:"male",rating:4},{lastName:"Turner",name:"Paige",checked:true,linkText:"www.sap.com",href:"http://www.sap.com",src:"images/person1.gif",gender:"female",rating:3}]}var view=sap.ui.view({id:"FragmentsExample",viewName:"view.FragmentsExample",type:sap.ui.core.mvc.ViewType.JS});view.placeAt("content");

 

 

4. Let's use new minimized file:

 

yuimin2.png

 

 

 

 

Enjoy!

Cheers


Career Growth: Zero Experience

$
0
0

I believe this blog will help all fresher looking for job opportunity in this competitive world. The first step to finding relief from my pain is to understand about fresher pain. I understand about the freshers jobless pain, how it is and what I feel exactly is graduates without work experience are struggling to get jobs in this competitive world and if you want a good job ? Network & employee referral is a must. Let’s all be open and accept it. This is the most common reason some company ever takes on freshers and only they will look for experience candidates. If you think someone is having a heart attack and condition is critical. The doctor who suggests that you have surgery and may refer you to a surgeon with more experience not less. Experience can play an important role in this situation. That's why freshers are not considered in this example. Fresher was not a Fresher ! Experience was not a Fresher ! They were learning for their career growth. Career was their goal.

Fresher999.jpg


Freshers has a new blood to do something different for grow business.

 

New Blood >> New Thoughts >> New Achievements

 

Fresher enjoy the work and its great passion for them. They are ready to face new faces & challenges. They have the ability to work in any situation by using latest updates & technologies.  If you have good communication skills, sharp technical skills and great background institution doesn't matter. The first important thing is contacts that you have in industries that really matters. Primarily, Most of the companies recruit freshers through campus and secondary is through employee references rather than the talent and capabilities.


Fresher are like hunger lion and out of schooling or college ready to face new faces & new challenges. Most of the freshers jobs are recruited on the basis of employee referral or campus interview. Most of the big universities are conducting campus interviews through 500 Fortune MNC companies in this world. Only one thing is required is only talent nothing more than that is required for job. Anybody can train freshers and we can mould them in better way.

Fresher99.jpg


1. Build Resume for Latest Technology:


First and foremost, I think everyone should work harder on your profile. There are many ways you can document your profile. I suggest you to find a experience professional or template to do it. First step is to include your technology related skills and keep most proficient technology in the top of the list. Please try to search some good standard resume template samples in the internet and it is very easy to find it. Use bullets & tables to organize your information in professional way. Also list all your certifications and categorize your skills in your profile.


2. Why You Are In ? Why You Are Out?

 

This is straight forward question from your interviewer. As a fresher, if you convey/satisfy them and the purpose to look for a job. Be positive and don't give negative presenting about your previous company. This will clearly shows your attitude towards your previous organization which will create very bad impression. Always try to convince the interviewer with positive comments about the previous company. Before attending any interview please do complete company market research like what company is, Company ranking, ISO Levels,What products or process they are doing/following and complete history. Please try to understand complete picture of the company and understand the values by reading its mission statement. Also updates about new products and services the company is providing in the current IT Market. If interviewer ask any question related to their company it is easy to answer and it is big credit to you. The interviewer should realize that you are not looking for a job only you are looking for career. If he/she realize that, it is easy way to enter into large organization. If Interviewer asks Why should we appoint you ? You should reply convincing answer and try to explain your strength & talent. Can you handle the team ? Can you be the team-player? Can you handle pressure?  Again, this should be handle with care and you need to convince the interviewer.

 

Interviewer expects:

 

  • Company History
  • Company Profile
  • Achievements
  • Activities
  • Rankings
  • Avoid lies
  • Avoid Jargon Words
  • Avoid Cell phones
  • Avoid Repeated Thanks
  • Avoid Piercings
  • Cover Tattoos
  • Avoid Chewing gum

 

3. Dress Neatly ! Behave Professionally!


First impression is a best impression. If you want first impression to be great one, I suggest you to go always in formal and avoid Jeans, T-shirt, Casual wear.If you want to make best impression, wear light color long sleeve formal shirt, Dark formal pants, Dark socks, Conservative leather shoes, No jewelry, professional hair style, Belt for male candidates. For female, I suggest you to go in formal dress with light make-up and perfume, clean nails, professional hairstyle. Be happy when you say, “I’m happy to meet you.” Eye contact is very important when you are attending interview in any organization.


As your Freshers' Week begins on Saturday & Sunday! Keep posting your resume and try for new job opportunities. All the best !


BOPF Overview and Report development using BOPF framework

$
0
0

I started working in SAP TM module (Version 8.1) 1 year back and we hardly find little help since we started working on it. My past experience enforced me to publish this blog which I hope it will definitely help developers to learn and understand how to retrieve the data by making use of Business objects based out in BOPF framework.

 

SAP TM has been developed using a set of new technologies that require skills that go beyond typical SAP Developments:

  • Floor plan manager (based on Web Dynpro ABAP concept)
  • BOPF - Business object processing framework
  • BRF+ - Business Rules framework plus
  • Adobe forms.

 

Apart from the above skills, it will always be an advantage if developer has knowledge on Process Integration (PI) and SAP NetWeaver Business client (NWBC).

These days SAP TM client base is getting increased quite significantly since then TM 9.0 had been released. I am sure most of the aspirants who started working on TM and BOPF might have lot of questions in the first experience. In this blog, I have presented how to make use of the standard methods QUERY, RETRIEVE and RETRIEVE BY ASSOCIATION to read the data and display it as report output.

 

Introduction to BOPF:

The Business Object Processing Framework is an ABAP OO-based framework that provides a set of generic services and functionalities to speed up, standardize, and modularize your development.

BOPF controls the application business logic as well as the data retrieval of the buffer and persistency layer. The main design principles are a clear separation of the business logic and the buffering of data as well as a clear structuring of the business logic into small parts with a clear separation of changing and checking business logic. The BOPF approach for implementing business objects breaks down business logic into the following four concepts:

  • Actions
  • Determinations
  • Validations
  • Queries

 

Examples for TM Business Objects are the Forwarding Order (TRQ) and Freight Order / Freight Booking (TOR).

Important transactions to note while working on BOPF:

/BOBF/CONF_UI: This transaction is used to display the modeling of the TM business objects. This is called as BOPF Modeling Tool.

 

/BOBF/CUST_UI: This transaction is used for launching the BOPF Enhancement workbench. This transaction is used for enhancing the standard business objects and for creating a new business objects.


/BOBF/TEST_UI: This transaction is used as a test environment. This transaction would help consultant (Either it is a functional or technical) to see the data of a particular Forwarding order or Freight order or Freight booking. I will explain in detail in my next blog effective use of test environment.

 

Use Case for Report Development:

I would like to explain how to read the data from database using BOPF with below use case. This is based on one of the latest requirement from my customer (Leading Freight Forwarder) which I had developed.

Management is interested in tracking all the shipments (FWO’s with charge calculation) out of which how many are created following the Forwarding agreement and how many are not? Therefore this report will help them to insist business users to ensure effective way of using agreements.

 

Unlike ABAP, here we follow a different approach in BOPF to retrieve the data from database. We are not going to write any select query;
instead data is retrieved by calling the standard methods - QUERY, RETRIEVE and RETRIEVE BY ASSOCIATION depending on the relation between nodes in a business objects.

In this example, we are trying to display shipment (FWO) information, invoicing amount and Forwarding agreement. To achieve the expected
results, we are going to access different business objects such as /SCMTMS/TRQ, /SCMTMS/CUSTFREIGHTINVREQ  and
/SCMTMS/TCC_TRNSP_CHRG. Relations between 2 business object nodes are associated via a direct, unidirectional and binary relationship.

 

Please find a report program below with code snippet for achieving the expected business requirement.

 

*&---------------------------------------------------------------------*
*& Report  ZTM_READ_TRQ_FAG
*&
*&---------------------------------------------------------------------*
*&Purpose: This report will help management to track the usage of Forwarding agreements
*&during invoicing for shipments created globally
*&Report output contain: Sales organization, Forwarding order, FWO Type, country, File Number,
*&Order creation date, Invoice amount, agreement
*&---------------------------------------------------------------------*


REPORT  ztm_read_trq_fag.

TABLES: /scmtms/d_trqrot.
***Data declaration
DATA:     ls_selpar                 TYPE          /bobf/s_frw_query_selparam,
          lt_selpar                
TYPE TABLE OF /bobf/s_frw_query_selparam,
          lt_trq_key               
TYPE          /bobf/t_frw_key,
          lt_trq_root              
TYPE          /scmtms/t_trq_root_k,
          ls_trq_root              
LIKE LINE OF  lt_trq_root.
DATA:     ls_cfir_root              TYPE          /scmtms/s_cfir_root_node_k,
          lt_cfir_root             
TYPE          /scmtms/t_cfir_root_node_k,
          lo_trq_srvmgr            
TYPE REF TO   /bobf/if_tra_service_manager,
          lt_cfir_root_key         
TYPE          /bobf/t_frw_key,
          ls_cfir_root_key         
TYPE          /bobf/s_frw_key,
          lt_tcc_root              
TYPE          /scmtms/t_tcc_root_k,
          lt_tcc_root_key          
TYPE          /bobf/t_frw_key,
          ls_tcc_root_key          
LIKE LINE OF  lt_tcc_root_key,
          ls_tcc_root              
TYPE          /scmtms/s_tcc_root_k,
          lo_srvmgr_cfir           
TYPE REF TO   /bobf/if_tra_service_manager,
          ls_tcc_charge_item       
TYPE          /scmtms/s_tcc_chrgitem_k,
          lt_tcc_charge_item       
TYPE TABLE OF /scmtms/s_tcc_chrgitem_k,
          lt_trq_cfir_link         
TYPE          /bobf/t_frw_key_link,
          ls_trq_cfir_link         
LIKE LINE OF  lt_trq_cfir_link,
          lv_chrg_it_assoc_key     
TYPE /bobf/obm_assoc_key.

TYPES: BEGIN OF ty_final,
        sales_org_id 
TYPE zforw_house,
        fileno       
TYPE zfileno,
        trq_type     
TYPE /scmtms/trq_type,
        fagrmntid044 
TYPE /scmtms/fag_id,
        order_date   
TYPE sydatum,
        amount       
TYPE /scmtms/amount,
END OF ty_final.

DATA: ls_final TYPE ty_final,
      lt_final
TYPE TABLE OF ty_final.

FIELD-SYMBOLS: <fs_root>                 LIKE LINE OF lt_cfir_root,
               <fs_tcc_root_key>        
TYPE /scmtms/s_tcc_root_k.

SELECT-OPTIONS: s_date  FOR syst-datum OBLIGATORY NO-EXTENSION,
                s_org  
FOR /scmtms/d_trqrot-sales_org_id OBLIGATORY NO INTERVALS.

**Get instance of service manager for TRQ
lo_trq_srvmgr
= /bobf/cl_tra_serv_mgr_factory=>get_service_manager( /scmtms/if_trq_c=>sc_bo_key ).

CLEAR: ls_selpar, lt_selpar.
ls_selpar
-attribute_name = /scmtms/if_trq_c=>sc_node_attribute-root-order_date.
MOVE-CORRESPONDING s_date TO ls_selpar.
APPEND ls_selpar TO lt_selpar.

CLEAR: ls_selpar.
DATA: ls_org LIKE LINE OF s_org[].

LOOP AT s_org[] INTO ls_org.
  ls_selpar
-attribute_name = /scmtms/if_trq_c=>sc_node_attribute-root-sales_org_id.
 
MOVE-CORRESPONDING ls_org TO ls_selpar.
 
APPEND ls_selpar TO lt_selpar.
 
CLEAR: ls_selpar, ls_org.
ENDLOOP.

***Here we can not call RETRIEVE method because we do not have TRQ node keys on hand.
***For this requirement it is recommended to call QUERY since RETRIEVE does not aligned with the selection screen parameters

CLEAR: lt_trq_key, lt_trq_root.
lo_trq_srvmgr
->query(
 
EXPORTING
    iv_query_key           
= /scmtms/if_trq_c=>sc_query-root-query_by_attributes
    it_selection_parameters
= lt_selpar
    iv_fill_data           
= abap_true
 
IMPORTING
    et_data                
= lt_trq_root
    et_key                 
= lt_trq_key ).

**If no data exist in database table then raise error message.
IF lt_trq_key IS NOT INITIAL.
 
CLEAR: lt_cfir_root, lt_trq_cfir_link.
  lo_trq_srvmgr
->retrieve_by_association(
 
EXPORTING
    iv_node_key            
= /scmtms/if_trq_c=>sc_node-root                     " Node Name
    it_key                 
= lt_trq_key                                         " Key Table
    iv_association         
= /scmtms/if_trq_c=>sc_association-root-cfir_root    " Name of Association
    iv_fill_data           
= abap_true
 
IMPORTING
    et_data                
= lt_cfir_root    " Data Return Structure
    et_key_link            
= lt_trq_cfir_link
).

 
LOOP AT lt_cfir_root ASSIGNING <fs_root>.
    ls_cfir_root_key
-key = <fs_root>-key.
   
INSERT ls_cfir_root_key INTO TABLE lt_cfir_root_key.
   
CLEAR: ls_cfir_root_key.
 
ENDLOOP.

 
IF lt_cfir_root_key IS NOT INITIAL.

    lo_srvmgr_cfir
= /bobf/cl_tra_serv_mgr_factory=>get_service_manager( /scmtms/if_custfreightinvreq_c=>sc_bo_key ).

   
CLEAR: lt_tcc_root.
    lo_srvmgr_cfir
->retrieve_by_association(
     
EXPORTING
        iv_node_key      
= /scmtms/if_custfreightinvreq_c=>sc_node-trnspcharges
        it_key           
= lt_cfir_root_key
        iv_association   
= /scmtms/if_custfreightinvreq_c=>sc_association-root-trnspcharges
        iv_fill_data     
= abap_true
     
IMPORTING
        et_data          
= lt_tcc_root ).
 
ENDIF.

 
CLEAR: ls_tcc_root_key.
 
LOOP AT lt_tcc_root ASSIGNING <fs_tcc_root_key>.
    ls_tcc_root_key
-key = <fs_tcc_root_key>-key.
   
INSERT ls_tcc_root_key INTO TABLE lt_tcc_root_key.
   
CLEAR: ls_tcc_root_key.
 
ENDLOOP.

 
IF lt_tcc_root_key IS NOT INITIAL.
* Get Charge Item node key and Charge<->Charge Item Association key
   
CALL METHOD /scmtms/cl_common_helper=>get_do_keys_4_rba
     
EXPORTING
        iv_host_bo_key     
= /scmtms/if_custfreightinvreq_c=>sc_bo_key
        iv_host_do_node_key
= /scmtms/if_custfreightinvreq_c=>sc_node-trnspcharges
        iv_do_node_key     
= /scmtms/if_tcc_trnsp_chrg_c=>sc_node-chargeitem
        iv_do_assoc_key    
= /scmtms/if_tcc_trnsp_chrg_c=>sc_association-root-chargeitem
     
IMPORTING
        ev_assoc_key       
= lv_chrg_it_assoc_key.


*& --> Get the DO transportcharges chargeitem data ...
*&-----------------------------------------------------

   
CALL METHOD lo_srvmgr_cfir->retrieve_by_association
     
EXPORTING
        iv_node_key   
= /scmtms/if_custfreightinvreq_c=>sc_node-trnspcharges
        iv_association
= lv_chrg_it_assoc_key
        it_key        
= lt_tcc_root_key
        iv_fill_data  
= abap_true
     
IMPORTING
        et_data       
= lt_tcc_charge_item.

 
ENDIF.
ENDIF.

CLEAR: ls_trq_root, ls_trq_cfir_link, ls_cfir_root, ls_tcc_charge_item, ls_tcc_root, ls_final.
LOOP AT lt_trq_root INTO ls_trq_root.
 
LOOP AT lt_trq_cfir_link INTO ls_trq_cfir_link WHERE source_key = ls_trq_root-key.
   
READ TABLE lt_cfir_root INTO ls_cfir_root WITH KEY key = ls_trq_cfir_link-target_key BINARY SEARCH.
   
IF sy-subrc EQ 0.
     
READ TABLE lt_tcc_charge_item INTO ls_tcc_charge_item WITH KEY root_key = ls_cfir_root-key BINARY SEARCH.
     
IF sy-subrc EQ 0.
        ls_final
-fileno         = ls_trq_root-zfileno.
        ls_final
-sales_org_id   = ls_trq_root-sales_org_id.
        ls_final
-trq_type       = ls_trq_root-trq_type.
        ls_final
-fagrmntid044   = ls_tcc_charge_item-fagrmntid044.
        ls_final
-order_date     = ls_trq_root-order_date.

       
READ TABLE lt_tcc_root INTO ls_tcc_root WITH KEY root_key = ls_cfir_root-key BINARY SEARCH.
       
IF sy-subrc EQ 0.
          ls_final
-amount = ls_tcc_root-rnd_net_amount.
       
ENDIF.
       
APPEND ls_final TO lt_final.
     
ENDIF.
   
ENDIF.
   
CLEAR: ls_final, ls_cfir_root, ls_tcc_charge_item, ls_trq_cfir_link.
 
ENDLOOP.
 
CLEAR: ls_trq_root.
ENDLOOP.

SORT lt_final BY sales_org_id ASCENDING fagrmntid044 order_date DESCENDING.

PERFORM display_grid_output.
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_GRID_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_grid_output .

 
TYPES : BEGIN OF ty_message,
  row         
TYPE i,
  partner
(30TYPE c,
  msg_type    
TYPE char20,
 
message(100) TYPE c,
 
END OF ty_message.

 
DATA: t_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

  t_fieldcat
-col_pos   = '1'.
  t_fieldcat
-fieldname = 'SALES_ORG_ID'.
  t_fieldcat
-seltext_l = 'House'.
  t_fieldcat
-outputlen = '15'.
 
APPEND t_fieldcat.

  t_fieldcat
-col_pos   = '2'.
  t_fieldcat
-fieldname = 'FILENO'.
  t_fieldcat
-seltext_l = 'File Number'.
  t_fieldcat
-outputlen = '20'.
 
APPEND t_fieldcat.

  t_fieldcat-col_pos   = '3'.
  t_fieldcat
-fieldname = 'TRQ_TYPE'.
  t_fieldcat
-seltext_l = 'File Type'.
  t_fieldcat
-outputlen = '10'.
 
APPEND t_fieldcat.

  t_fieldcat
-col_pos   = '4'.
  t_fieldcat
-fieldname = 'FAGRMNTID044'.
  t_fieldcat
-seltext_l = 'Aggreement'.
  t_fieldcat
-outputlen = '30'.
 
APPEND t_fieldcat.

  t_fieldcat
-col_pos   = '5'.
  t_fieldcat
-fieldname = 'ORDER_DATE'.
  t_fieldcat
-seltext_l = 'Order creation Date'.
  t_fieldcat
-outputlen = '20'.
 
APPEND t_fieldcat.

  t_fieldcat
-col_pos   = '6'.
  t_fieldcat
-fieldname = 'AMOUNT'.
  t_fieldcat
-seltext_l = 'Amount'.
  t_fieldcat
-outputlen = '15'.
 
APPEND t_fieldcat.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program
= 'ZTM_READ_TRQ_FAG'
*     i_grid_title       = lw_title
      it_fieldcat       
= t_fieldcat[]
*     is_layout          = ls_layout
   
TABLES
      t_outtab          
= lt_final
   
EXCEPTIONS
      program_error     
= 1
     
OTHERS             = 2.

ENDFORM.                    " DISPLAY_GRID_OUTPUT

 

Hope now you have got a basic idea of how to retrieve the data in BOPF environment. In my further blogs, I would like to present troubleshooting and analyzing the critical issues during support and tips and tricks during Development phase.

 

Appreciate your comments if any better way of doing it.

 

When I started working on BOPF initially, this is one of the blog series and Enhancement guide document (Links pasted below) which had helped me to understand what BOPF is - .

http://scn.sap.com/community/abap/blog/2013/01/04/navigating-the-bopf-part-1--getting-started

http://scn.sap.com/docs/DOC-32985

 

Thanks to James Wood and thanks to Holger.

Know what your consumer is thinking, before they do!

$
0
0

The old adage “the customer is king” is probably truer today than ever. In fact, the customer is not only king, but can also be the judge, the jury and the executioner when it comes to a products reputation and success.

 

New Picture (10).jpg

In a recent blog I wrote about the Emergence of the Demand Network, noting that a “state-of-the-art demand network puts the customer at the center of all processes, and connects all business partners needed to profitably fulfill the demand with the speed customers are expecting.”

 

But how can we put the customer “at the center of all processes?” How can you get into their minds and ensure our processes deliver what they want, when they want it?

 

This involves gathering insight from inside and outside of your organization, from all available structured and unstructured sources.

 

  • How do I usually do with this product (the forecast)?
  • What are the latest orders?
  • What is trending about your products?
  • What is the current sentiment analysis?
  • What is selling in each store, location or region?

 

Gathering a true picture of actual demand and available products, all social and sentiment analysis about your customers and your products and all relevant market dynamics enables this complete view -- now, in real time, wherever you are, on whichever device you have near you. Only then can you focus on targeting the right product to the right customer at the right time.

 

Let’s take an example. Product demand information -- usually historical sales figures (at best a week old) forces to drive my business based on “historical information.” This is like trying to drive a car by looking in the rear view mirror.

 

What is needed is the ability to sense actual product demand signals and indicators across the entire network to enable us to become more demand or market driven. You would then have access to all sales transactions as they are happening at your customers. You could see the sentiment of your products by customers and consumers as it happens. If all of this (big) data was available in a harmonized view of actual demand for your products, you could drive your promotional plans, your inventory positioning and your organizational decisions in real time.

 

Only then can you foresee changes in demand sooner and boost sales by predicting and reducing out-of-stocks or slumps in sales. Or make smarter inventory decisions around logistics, safety stocks and transportation plans.

 

To learn more on how to better sense demand and get closer to your customer and actual demand, SAP and SAP Insider are hosting a webinar on Feb. 27. Register today to join us online and supercharge your demand management.

 

Follow me on Twitter @howellsrichard.

SAP CRM EhP3 Upgrade

$
0
0

I recently performed a upgrade of one of our customer SAP CRM systems form SAP CRM 7.0 EhP0 to SAP CRM 7.0 EhP3. In this document I've collected the errors we encountered during the service pack upgrade as well as the relevant notes to solve them.

 

Post Installation Activities

  • Activating the SICF service

In order to being able to login to the CRM Web UI again I had to activate the necessary SICF service. Note 1295006 - Mandatory SICF services for IC WebClient contains a list of all SICF service that need to be active in order to use the CRM Web UI

In addition to the service mention in the note I also had to activate the service /default_host/sap/webcuif/uif_callback before being able to log into the Web UI again.

  • Adaptation of the component enhancements

After every service pack or EhP upgrade all enhanced Web UI components need to be checked and maybe adapted. The following note describe the necessary steps:

Note 1570869 - Adaption of enhancements after SP or release upgrade

During the upgrade to SAP CRM EhP3 I encountered the following error message in quite a number of the adjusted BSP components: BSP_WD_TOOLS 225 "Multiple usage of view ... is not allowed". The reason is that SAP moved some view into separate view sets. These view sets are then included into the windows. If one simply copies the changes from the SAP Repository.xml to the one in the enhances component, the views that were moved to view sets views are included twice in the window. The following screen shot show an example of such an issue in the component BP_HEAD:

2014-02-11 14_06_06-ABAP - CFD_100_drumm_de [CFD, 100, DRUMM, DE] - Eclipse.png

In order to solve this issue, the unneccesarry embedding of a view (in this case the second one in the screen shot) simply needs to be deleted from the Repository.xml.

 

Component Changes in SAP CRM for Utilties

During the upgrade I also noticed some components that caused dumps although no problems were visible in transaction WCF_CC. The reason was that SAP standard changed the public methods of the view controllers. As the enhancement of a component leads to the copying of the view HTM-file, the HTM-file in the enhanced components in some cases referenced methods of the view controllers that were not available any more.

In order to solve these issues I simply deleted the HTM-file in the enhanced component and copied the HTM-files form the SAP standard component. Note, that before deleting the HTM-file you should make sure that it doesn't contains any customer specific enhancements. If this is the case, the customer specific enhancements need to be added again after copying the SAP standard HTM-file.

 

During our upgrade the issue described above occurred in the following components:

  • IUBOTREE: The problem occurred in the file IsuBolTree.htm
  • UICMP_LTX: The problem occurred in the file ABoxExecution.htm

 

API Changes in SAP CRM for Utilties

Besides the changes in UI components I also encountered some notable changes to some APIs we frequently used in our custom developments.

  • CL_CRM_ISU_EXTENSION: The changes I noticed so far are that the methods GET_SINGLE_CONT_VALUE and SET_SINGLE_CONT_VALUE are now protected instead of public. These two methods can easily be replaced by using the methods GET_SINGLE_ATTR_VALUE and SET_SINGLE_ATTR_VALUE instead.
  • CL_CRM_IU_IC_OBJ_MAPPER: the method GET_ENTITY_FROM_BOR_INT has been removed. It's functionality has been moved to the method IF_CRM_UI_OBJ_MAPPER~GET_ENTITY_FROM_BOR.

 

 

I hope this information is useful for anyone performing an EhP3 upgrade in SAP CRM.

 

Christian

How do you get your experts with negative stance for new things to HANA

$
0
0

We have over 50 ABAP developer (senior experts). Primarily we develop in the old core module (SD, MM, FI, CO, HR, PP, CS, IH, PS) on ERP systems / business suite.


We have three groups of developer:

Group 1: They can’t await to work on new architectures – they’re open for all and have fun to work as a pioneer and dig in the deep of the system

Group 2: For this developer it’s all the same – for this people it’s not a problem to go to a other architectures

Group 3: They have no interest

-       to work in new architectures

-       to spend time to learn new things

-       they are very closed for new things

-       they have for all topics bad statements


I am part of the group 1. In my opinion in the IT it’s normal to spend much time at new topics in free time to keep up to date. New topics / innovative things make the developer job very exciting. For me it’s regular process – and that’s my own passion .


Since two month we have our own HANA system in our data centre as play field :-) (business suite on SAP HANA). I’ve some colleagues who made the HANA certification – and we made the first steps in our system. For group 1 and group 2 everything is okay and they’ve fun .


We have problems with the group 3. They find every hair in the soup – they spend very much time to search arguments against HANA. That’s our “negative group” . We copied our SAP System to a new system and made a technical migration. Now they compare the SAP System, which is based on an oracle datebase, with the new SAP System which is based on a HANA System. They go through the standard ERP process (offer / order / purchase order / goods movements / delivery / MM invoice / SD invoice / material master data / customer master data / vendor master data / conditions / financial bookings / etc.). They main argument is, that they can’t see a grow up of the performance / the added value of the invest / etc. Our other problem is that the group of this people have experience over 20 years in ABAP developing – and their opinion have a high weight. The other arguments: IBM and oracle are working on similar architectures – and we can hold on on the open sqlsyntax / on the present coding.


Have you similar problems to get the acceptance of group 3?


Have you tips / tricks for us?


Have you ideas for catching the group 3?


What standard components are really optimized for HANA?


In which standard components can we see a really performance grow up?


There are standard use cases to see the differences?


Which data volume do we need in the data model to see the differences?


What can we do to take the group 3 with us?

 

Showrooming – threat or opportunity?

$
0
0

Showrooming has changed the way retail customers shop. Even if you are a skeptic like me, evidence suggests 82% of US and UK shoppers are doing it.  Shoppers visit physical stores to research a product - to experience it first hand. The shopper compares prices online, and purchases from the vendor with the lowest price. If the retailer can’t beat or match the price, how do they get customers to buy from them?

 

Shop Outside the Box


In China, many retailers are becoming realtors.  Yes, you read that correctly. They are selling space.  But not to their shoppers. They've turned the oldest joke in retailing into a business plan. (Know the three secrets of retailing ? Location, location, and location.) The plan centres on a new store-within-a-store format. They rent space to vendors within their store and in turn, those vendors receive brand exposure – whether a purchase is made in-store or online.

 

To compete with Amazon, companies like Carrefour are changing how they use space to offer customers ‘instant gratification’ by offering same-day pick up or delivery from their warehouses.   In my mind, Swiss grocery giant COOP has nearly mastered Click & Collect, using a mobile app backed by SAP software. Simply shop online, and drive up to a depot where its waiting for you.

 

Retail Feng Shui


In addition to the new floor plans in China, retailers doing business in South Korea are re-imagining the shop space too. With 91% of its population connected on 4G networks via smartphones, Tesco took the opportunity to offer Seoul subway commuters a ‘virtual grocery wall.’ Customers can scan-and-buy products on their way to work and find their groceries on the doorstep when they get home. Twitter brought me similar news. The London Underground proudly tweeted about the refrigerated grocery van at the train station - so you can order while at work, and it will be ready for you when you get off the train.

 

Be different

 

Customers showroom in competitors’ stores too, so retailers can use price comparison providers to offer special deals. When a product is scanned by a competitor, they can serve up a better price. Retailers are going further by offering unique products like Tesco’s Hudl and Amazon’s Kindle e-book reader. Loyalty programs can also make retailers stand out, and customers will pay a premium for those programs.  In my opinion, success seems imminent for Canadian retailer Loblaw with their new PC Plus program.

 

The human touch

 

It is  important to remember why customers visit a store in the first place. The human touch is something that online shopping can’t provide. Shoppers can pick up items, try on a garment and interact with store associates. Many retailers encourage showrooming by offering free Wi-Fi in their stores. Retailers many not always be able to compete on pricing, but they can create a personal experience with immediate customer satisfaction that will build their brand and result in future sales.

 

Retailers are keenly aware that stores are an essential part of the customer experience, along with e-commerce sites and mobile apps. Merchants are redefining the role stores and the staff play in the context of their overall customer engagement strategy.  The battle for customer loyalty begins with a better understanding of the customer.  Showrooming can be leveraged as another tool in the retailer’s bag to help maximize customer engagement and reinforce their brand.  Is this right for you and your brand?

 

SAP can help you decide > http://bit.ly/1iJWAdz

Design Thinking Cartoon


The Winter Olympics ... Part 4: SAP Business Process Management – Inspired Individuals Can Drive Team Success

$
0
0

Ok, so I've previously coached you on the importance of teamwork in hockey. Scrap everything I said. It's so much more important to have a hot goalie.

 

Oh wait. That was the little Canadian Hockey devil on my right shoulder out-shouting the Process Optimization Angel on my left.

 

Emotion is a powerful ally and has been on stunning display for the last couple of weeks. I am a steadfast college sports fan because, it could be argued, the student athletes have yet to be tainted by a monumental payday. That's what the Olympics used to be, according to my fading memory. But irrespective of whether you are an amateur or a professional, you are likely subject to the disruptive effect of emotions.

 

Take the goal tender for the Latvian Men’s ice hockey team, Kristers Gudlevskis.  Facing 57 shots in a recent game from some of the planet’s premier hockey stars, this young man had emotion on his side.  He could do very little wrong and carried the hopes of his country in what would have been a significant upset had they beaten the Canadians.  This athlete, whose name is not known to the NHL fan base – or wasn’t until these Games, turned aside wrist shots and slap shots with ease.  Yes there was teamwork, but there was a whole lot of heart from a single player.

 

As we reflect on our work-life experiences and seek ways to motivate our teams, it is perhaps worthwhile to consider how channeling positive energy and personal commitment can make a significant difference to our teams.  We can turn up the level of performance by setting examples of what is possible, even as individual contributors.   And delivering results in super-human fashion doesn’t hurt. Congratulations Kristers – you have taught us something important about facing challenges in an inspiring way.

A Few Thoughts on the Facebook Acquisition of WhatsApp

$
0
0

In the late afternoon on Wednesday, February 19th (Eastern Time, USA), Facebook announced that it was acquiring WhatsApp for $19 billion in cash, stock, and restricted stock.   While I’m not a financier, I think $19 billion was a bit much as I’ve read that it roughly translates to $42 or so per WhatsApp subscriber.  I think it was a good move, nonetheless.

 

Facebook wants to remake itself into a fully mobile company.  And they are well on their way.  But, WhatsApp was what I (and several others in the industry) call: Mobile-First.  Mobile-first means that the mobile experience is first and foremost as a service or even online marketplace is launched.  This is why the Japanese firm Rakuten acquired Viber and I think this is among the many reasons that Facebook acquired WhatsApp.  Interestingly (and perhaps timely), my previous blog post highlights “Mobile-First” and the social networking aspect of eCommerce (or an online marketplace).  In the posting, I highlighted a women’s fashion app called Poshmark that lives the “mobile-first” concept as a core strategy.  In the comments section of that blog, I included a quote from Rakuten’s CEO about why he acquired Viber.  Note the recurring theme and then think about what the acquisition means to Facebook.

 

WhatsApp further provides a strong “mobile-first” DNA – one that they can add to their nest of acquisitions – Instagram, for example.  Now, Facebook does note that they will operate these as independent companies, but what I believe is that Facebook is aiming to create a comprehensive mobile-first experience – from social networking, photo sharing and now messaging.  I would not be a bit surprised to see – in the coming year or two – that WhatsApp becomes the default Facebook Messenger.  Mark Zuckerberg did note that “WhatsApp is on a path to connect 1 billion people. The services that reach that milestone are all incredibly valuable."  I think with 450 million WhatsApp subscribers plus the 507 million mobile Daily Active Users, that they could achieve that goal.  Obviously, there is quite a bit of overlap, so you just can’t add up the two numbers.  Otherwise, it would just not be prudent to continue two or more Person to Person (P2P) messaging apps for the long term. 

 

What does this mean to SMS and standards based messaging?  It doesn’t mean too much, yet – everyone that is using SMS is not going to all of the sudden abandon SMS for WhatsApp, just because Facebook acquired them.  But, I think it opens up a variety of possibilities for Facebook and non-SMS messaging in general in that mobile operators must consider.  Operator partnerships as well as enterprise partnerships could emerge as a result of this “mobile-first” ecosystem.  Look at how virtually every business developed Facebook markets have a Facebook business page now.  Couple that with a dedicated messaging capability in the Facebook ecosystem, and you have new ways to engage consumers / customers.  Social, messaging, images/video, a platform for business visibility, and even voice – looks kind of like a very flexible mobile-centric communications ecosystem to me.

 

Mobile operators need to take notice and they need to carefully consider their SMS offerings to their subscribers and what it means in terms of not just competing, but meeting their subscribers – their customers’ needs.   Instead of “fighting OTTs,” I think they have a lot to learn from them.  OTTs, like WhatsApp and many others provide what consumers want.  MNOs, Facebook, and OTTs all need each other and can benefit from closer relationships. 

 

With this acquisition and the Viber acquisition, I think the concept of “Mobile-First” might have some legs in 2014. I think it will be an interesting year for M&A, as companies look to incorporate that DNA into their longer-term strategy.

Statoil Switches from an Oracle DB to the SAP HANA Platform with SAP MaxAttention

$
0
0

Screen Shot 2014-02-21 at 12.56.29 PM.png

 

"We turned to SAP because we needed to have access to the best experts.  The support we got from SAP MaxAttention was excellent and was a key to our success.  The new solution has a simpler architecture, enhanced features, and significantly improved performance."- Stig Skoglund, Lead Analyst - Performance Management, Statoil ASA

 


It’s day 14 of the Sochi Winter Games and—as predicted by many—Norway is once again atop the gold medal count. Hardly surprising given that the Nordic country has been a dominant force in the Winter Games since the inception of the modern Olympic movement.

 

When you stop and consider the fact that Norway has a total population of only just over five million people, the true scope of this accomplishment is apparent. How do they do it? What’s the secret?

 

The secret, of course, is that there is no secret. Success is born out of innate talent, dedication, training, and the will to win. Domination is no accident; it’s the result of blood, sweat, and tears. Success comes to those who put in the work and who dedicate themselves to constantly upping their game. As they say, the competition never sleeps, so nor should you.

 

The same dedication to excellence and commitment to greatness is exemplified by Norway-based Statoil—a global leader in the energy industry. Never content to rest on the laurels, the company continues to push for greater performance in all aspects of its business. Most recently, this includes partnering with the SAP MaxAttention offering and SAP Consulting to implement SAP EPM solution (or SAP enterprise performance management) — significantly improving the company’s planning, production, and finance operations.

 

The move from a legacy Oracle database to the SAP HANA platform reduced implementation risks and accelerated the project’s implementation timetable. But perhaps even more importantly, the new SAP EPM solution was able to take advantage of the speed and agility of SAP HANA, improving Statoil’s ability to analyze mission critical data and make strategic decisions in real time.

 

Like the country’s Olympic athletes, Statoil stays on top by never stopping.

 

There is a lesson here for all of us.


 

Key Achievements:

  • 6x faster financial consolidation (from 2hours to 20minutes)
  • 15x faster data processing with easier editing and fewer errors (from 5minutes to 20seconds)
  • 8x faster opening and closing periods for work status (from 15minutes to 2minutes)

 

See their full business transformation study [link]

See how more customers used SAP support to reduce costs and run better [link]

For more information on SAP MaxAttention, click [here]



SAP Spotlight on Women: Roxane Burtenshaw - Manager, HCM Presales, Canada

$
0
0

roxane.jpgSAP's Spotlight on Women acknowledges diversity in our company as the key to our sustainable growth, innovation, and success and showcases the potential for a strong career path at SAP by highlighting a stand-out employee.

 

As a part of SAP's Spotlight on Women, we want to congratulate Roxane Burtenshaw on her promotion to Manager, HCM Presales, Canada where she will lead the Canadian Presales team in selling SAP's Human Capital Management Solutions.

 

Roxane brings 12 years of presales experience to the role. And with over six years as part of the SuccessFactors/SAP team, Roxane has led the growth of our solutions across Canada. In addition, Roxane was an early presales champion by setting many of the enablement and teamwork standards for our organically-developed Recruiting product. Roxane is and always has been passionate about the collaborative, high performance culture and about leveraging that to help drive exceptional revenue results in Canada.

 

Roxane lives near Toronto, Ontario, with her husband Paul and five children. In her spare time away from work, Roxane is cheering her children on in any one of several endeavors, (most of them competitive) and when not doing that, you will likely find her relaxing by her newly renovated pool and hot tub.

 

We want to thank Roxane for all of her hard work here at SAP, and hope she continues to grow within the company!

 

 

 

Want to find a job you can really be passionate about?

Browse all of our open positions at -
http://jobs.sap.com/http://jobs.sap.com

Learn more about the workplace culture at SAP, see pics of our offices, talk to recruiters, and get real time job openings by connecting with us on our social pages:

http://facebook.com/LifeatSAP
http://twitter.com/LifeatSAP

Accrual Engine error

$
0
0

I am working on Accrual Engine for prepaid exps.monthly wise to be accrued.I got the following error while testing the scenario with the ACACTREE01.but accrual object has created with the number,where I see this document display.

 

I request you, in the Define extended combination of characteristics for Initial (I)and Perioidical (P) and U ,what actually GL accounts have to give .Start Account and target Accounts for I,P and U.

 

I have assigned in the settings Assign company code is in test status .is it correct or need to give productive status.

 

 

The errors are

)Error in document: ACE $3 ECSCLNT300

Message no. RW609

 

Diagnosis

Errors occurred when checking or posting the document

 

Reference type = ACE

 

Reference key  = $3

 

Logical system = ECSCLNT300

 

You can find the errors in the log.

 

System Response

The document cannot be posted.

 

Procedure

Remove the error in the document and create and post the document again.

 

2)Postings to G/L accounts with open item management are not permitted

Message no. FAGL_POST_SERVICE012

 

Diagnosis

You use G/L account 1421005 in company code DS01 with open item management. However, postings are not permitted to G/L accounts in individual ledgers with open item management.

 

 

Please clarify my doubts ,Once I solve this what is another t code to test in the periodical posting please.

Viewing all 11427 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>