To extract Authorization
Hi all,
I need lttle help regarding HR Security Objects. How would i extract which infotyp is used at customer place. I don't want SAP listed Infotype. Only infotype which are in use by client including custom infotype.
Hi Nancy,
Try executing the report S_AHR_61015471 - Infotype overview of employee.
This report lists which infotypes are maintained for a particular employee.
By checking several employees, you'll have an idea on which infotypes are used in your client.
Another option is checking the data entries in PAXXXX tables via SE16.
However, it would be a cumbersome business and requires a long time.
Regards,
Dilek
Similar Messages
-
How to extract authorization data to standart BW DSO's from SAP R/3 system
Hi All,
Does anyone have any experience about this topic? I want to use SAP R/3 as a source system and after i extracted the data to business content DSO's in BW ,i will generate authorization objects from DSO 's.
I am using standar BC DSO 's
0TCA_DS01 Authorization data - Values
• 0TCA_DS02 Authorization data - Hierarchies
• 0TCA_DS03 Descriptive Text Authorizations
• 0TCA_DS04 Assignment User Authorizations
• 0TCA_DS05 Generate users for Authorizations
I have deep research but cant find anything.
Best Regards
OzanHi Ozan,
You can go though thread provided by Suman, These DSO's will help to maintain Analysis Authorizations in BW automatically In-short you don't need to maintain it, it will come from R/3 and same will be configured in BW.
Regards,
Ganesh -
Hi,
Is there a way to extract specific authorization values for a particular user?
In SUIM, using "Users by Complex Selection Criteria" will display all the authorization & values. You then need to find that particular authorization, say "P_ORGIN" and go through each one of them to find the values assigned. It is very tedious if the user have a lot of the "P_ORGIN" authorization assigned.
I think in this case, SUIM is not the best way.
Is there a way to quickly zoom into and look at all the values in just that particular authorization, in this case, "P_ORGIN"?
ThanksIf your focus is on HR authroizations one of the ways :
SE16 - table name AGR_USERS
The technical name will provide the assignment coming from organizational management.
Take just those roles :
use SE16 - AGR_1251
Which will give you an output export to excel filter on P_origin.
If you are not using Organizational management:
Then use SE16 - AGR_1251 find roles having P-origin
get the role list and use AGR_USERS to find role to user relationship. -
ABAP-HR report using only OOPs...
Hi experts,
Can u please tell me is this possible to write a report with out using LDBs but only using OOPs.. are there any classes or methods works as macros in LDBs?
If yes, please guid me with proper hints.
Thanks & Regards,
Friendof all..Hi Friendof mine...;)
LDB though a classic approach provides very flexible way of data extraction, authorization, screens etc. So in my opinion you should stick to using it in some part, in order to get that services provided by standard. I doubt there is an OO approach to substitute the same entirely.
Anyhow, if you want to transit to an OO HR, I would suggest to read about [Decoupling Infotype concept|http://help.sap.com/erp2005_ehp_04/helpdata/EN/4f/d52552575e11d189270000e8322f96/frameset.htm]. There is a separate framework available which you can use for master data reading/writing. It is a bit complex at first but serve an alternative to standard FMs like HR_READ_INFOTYPE , HR_INFOTYPE_OPERATION . For more refer a [Writing Infotype Records subsection|http://help.sap.com/saphelp_erp2005/helpdata/en/43/21d1014bba2bebe10000000a1553f7/frameset.htm] of above link.
To sum up. This framework won't provide you full range options which you have in place by means of LDB. You can however mix classic approach (with GET PERNR events, LDB selection screen etc) with new OO approach for data extraction. The latter becomes recommended by SAP, but is more complex and requires preety good understanding of basic OO concepts (you mostly work with interfaces so the actual code is not so transparent to you). Anyhow I think it's worth trying, even just for sport.
Furhter reading which might help to get the idea http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/14694. [original link is broken] [original link is broken] [original link is broken]
Regards
Marcin -
i am unable to extract data from r/3.it is saying no authorization to extract so and so data source.rfc connection is fine between r/3 and bi.
pls help me out.Hi,
When you do extraction from SAP source system then you need to have extraction authorization
Also check wether Background user id has the SAP_ALL authorization or not if not get it done that first
then check wether your id has assigned Below authorization object or not
S_RO_OSOA
Also once you got no authorization the massage run the tcode Su53 then you can what is missing .
Regards,
Satya -
Authorization Error while extracting data after applying SAP upgrade patch
Hello All,
Recently we have updated the SAP BW patch to 24 and ECC patch to 22. I have the access to perform extraction in RSA3 tcode in ECC.
However, While performing the data load in BW, the process is failing at the Infopackage step with the following error:
"You do not have authorization to extract from Datasource XXXX, Component FI-IO. Message no. R8073"
My basis guy has given the necessary acces.. but still the issue persists..
Please provide solutions ASAP... its very critical issue...
Regards
SnehaHi,
Are you loading the data with your username? it may cause problem sometimes because you may not have the authorization object S_RO_OSOA assigned in your roles.
Try scheduling the loading job with the background user with which normally the process chains are run.
i guess this should solve your problem, if not try adding this authorization object to the corresponding role and you can run with your user name itself.
I am not sure about the auth objt , try and see.
regards,
karthik. -
You do not have authorization to extract from DataSource ZZ_TD_EBAN COMPONE
Hi,
Iam facing the problem As
You do not have authorization to extract from DataSource ZZ_TD_EBAN COMPONENT.
ERROR IN SUBSTEP
ERROR IN SUBSTEP
Error reading the data of InfoProvider ZDP_VIRT..
I had created a Virtual Infoprovider. and taking the Dat source ZZ_TD_EBAN.
done the Trasf and DTP. for data source to cube. which was bulit in BI7..
i can see the flow AS Source system- datasource- virtual provider.
for virtual provider at run time it picks the data from source.
But when i rum the query on this VP iam getting error as
You do not have authorization to extract from DataSource ZZ_TD_EBAN COMPONE
even if i chek data at virtual provider level byclicking display Data..
after selecting the fields once i execute . there aso iam facing the same error. as
You do not have authorization to extract from DataSource ZZ_TD_EBAN COMPONENT.
Once i get in tthe error.. i can see the below msg.. but even though not able to solve .. i need your assistence.
You are not authorized to extract from DataSource ZZ_TD_EBAN in application component: MM .
System Response
The authorization check was performed with the following field values:
DataSource: ZZ_TD_EBAN
Application component: MM
Subobject: DATA
Activity: 03
Procedure
To be able to extract from the DataSource, you need authorization for authorization object S_RO_OSOA (authorizations SAPI-DataSource) with the field values specified above.
Procedure for System Administration
There is a role template S_RO_OSOA_TMPL (DataSource (OSOA) Display/Maintain/Extract) available that contains the authorizations to display, change and extract all DataSources.
Pls help mewith your valuable answer.Hi ,
As given in your error message that S_RO_OSOA authorization object is missing . You need to include this auth object in the ID from which you are extracting the data using the TCODE : PFCG . You can ask the basis person to do so for you .
When you run any report on a virtual infoprovider , you need to give the authorization of the DTP & the transformations apart from your cube and datasource in PFCG so that it can display the output in the report . This setting is only necessary for virtual cubes.
You can always check the missing authorizations in tcode : SU53 .
Hope the above reply was helpful.
Kind Regards,
Ashutosh Singh -
When doing BW Extractions can ALEREMOTE bypass authorizations?
I was sitting in a meeting today about how a consultant wanted/required access to every table in R/3 for his BW extraction. My first response was no and he said that if they had access to ALEREMOTE they could extract all tables. I explained that ALEREMOTE did not have access to all tables either and he said that using this ID allows them to do extractions without doing any authorization checks.
I've been searching SAP Marketplace and SNC for this information but have not found any data to back this up. My assumption is that he assumed ALEREMOTE had SAP_ALL (which it doesn't). Has anyone ever come across an issue with ALEREMOTE bypassing authorization checks?
Edited by: Bree Woodruff on Jun 9, 2011 9:00 PMMy assumption is that he assumed ALEREMOTE had SAP_ALL (which it doesn't).
Sounds like this is the case, however note that S_TABU_DIS is an application layer control and if not coded then there is no check.
More likely is that reporting authorizations were not checked on the BW side for developer access to the DSOs, but analysis authorizations now are.
Anyway... my recommedation would be to break all RFC connections from non-PROD to PROD systems and restrict his authorizations in BW PROD system (e.g. only use applications, and not the test environment of SE37 etc (see SAP note 587410). That way there is a client side restriction, even although the destination does have some powers...
Cheers,
Julius
ps: ALEREMOTE is a configuration default. You can change it and hardcoding of a user ID would be a bug.
Edited by: Julius Bussche on Jun 13, 2011 9:32 PM -
Authorization to extract restricted data
Hi,
We need to extract some specific data from ODS on one BW system to load an other BW system. This restriction is based on specific range of value for a specific infoobject on ODS.
For that, we see 2 solutions :
- 'AUTHORITY CHECK' on ABAP program
or
- specific authorization on user ALEREMOTE but for this solution we don't find the right authorization object (on 1 ODS for 1 authorization object).
Thanks a lot in advance
Isabelle.Isabelle,
Your Requirement is to select specific data from ODS based on the selection criteria.
For this the procedure you have to create an export datasource and change the datasource by marking the specific object for selection and use the datasource in RSA3.
I don't understand the purpose of checking authority.
Regs
Gopi. -
Maintaining BW authorization data in R/3
Hi,
I am faced with a new problem now. My client wants to maintain BW authorization data in R/3 for ease of maintainence. I have used two ODS template for data (value) and (hierarchy) - (0TCT_DS01 and 0TCT_DS02) and have created two data targets for filling in the data and using CSV file for proofing of the concept. My assumption is that if data load from CSV file can execute thte functionality, I can achieve the same thing by extracting data from R/3 also. While generating the profile using RSSM it says that complete authorization data is not maintained. Probably I am not filling in the relevant fields with correct data.
Can anyone help me with the steps involved in doing this and the fields for which entries are mandatory ? Would highly appreciate the help extended with points.
AbhishekMy reqmt says I have to restrict viwewing of data at node level. Let me elaborate more.... Users of sales region EAST and users of region WEST may have same profiles but EAST user should be able to see east data and WEST user should be able t0 see only west data. I am able to do this by using RSSM and restricting the view at report level but client wants to do this at a common place and the table needs to be maintained in R/3 ?
Is my reqmt clear ?
Abhishek -
Analysis Authorization based on Hier node with multiple display hierarchies
Hi guys - I've got a problem where s.o. might have an idea of how to switch on the light at the end of the tunnel, I am currently standing in:
Requirement:
Cost Center Authorization should be given through RSECADMIN, reporting should be possible for any hierarchy that exists for the authorization relevant info object.
Preferred solution:
The Cost Center Analysis Authorization should be given through RSECADMIN - Hierarchy node assignment.
u2022 A dedicated Authorization Cost Center Hierarchy will be maintained in ECC6 as an alternative cost center hierarchy and extracted into BW.
u2022 The RSECADMIN Hierarchy node assignment should be based on a particular node (Type 2).
u2022 The display level will be specified as required (here: Level 7)
u2022 The Authorization granted should be independent of hierarchy name and version (validity 3).
Reporting Scenario and technical impact:
As mentioned above, when designing and running a query the user should be able to freely select other (i.e. than the authorization) display hierarchies for the authorization relevant reporting object 'Cost Center' as well. The technical names of the semantically relevant hierarchy nodes could therefore vary. E.g. cost centers 1, 2 and 3, being assigned under hierarchy node u2018Au2019 of the RSECADMIN relevant authorization hierarchy, could be subsumed by hierarchy node u2018Bu2019 in another display hierarchy, which the user may want to display in accordance to his reporting needs. Ideally, the alternative display hierarchy should therefore display node u2018Bu2019.
My findings so far (based on prototyping) turn out that this is not possible as long u2018Bu2019 (and its hierarchy) is not authorized in RSECADMIN. Can these findings be confirmed? And if not, would anyone have an idea of how to facilitate the reporting scenario?
Would there be any other way to grant access, possibly based on RSECADMIN single values, and also enable the user to flexibly display hierarchies with only those hierarchy nodes whose single cost center values the user has been given access to?
Thanks everyone for your input...
Claus
Edited by: Claus64 on Jul 13, 2009 4:10 AMHI CLause,
On Jul 14 2009, you wrote in SDN and said:
FYI: Found a solution...
The hierarchy analysis authorization will be based on a navigational attribute of cost center.
With analysis authorizations it is possible to declare the Auth object (e.g. 0COSTCENTER__RACCAUT0) as authorization relevant and leave the superior object 0COSTCENTER auth irrelevant.
The auth will be given for 0COSTCENTER__RACCAUT0. This object will be placed as a filter of the query, being restricted by an Authorization variable for hierarchy nodes.
Due to the concept of Analysis Authorizations, this variable will automatically pick up the nodes granted as part of RSECADMIN Hierarchy based Authorization.
As mentioned above, 0COSTCENTER as the regular reporting characteristic remains auth irrelevant and can therefore take any hierarchy thatu2019s available. Reporting on single values will be possible, too. Only those nodes show up that hold the authorized cost centers in accordance to the authorization.
If the auth relevant 0COSTCENTER__RACCAUT0 is not used in the query definition by either not taking it in as a filter or skipping the Auth variable, the query will launch the message that the authorization is missing. No data show up at all.
Claus
See this thread:
Analysis Authorization based on Hier node with multiple display hierarchies
I am also in the same situation as you and need to understadn your solution. I understand that you created a Nav Attr on 0COSTCENTER and made this auth relevant whilst ensuring that 0COSTCENTER is NOT auth relevant. This is all fine. The issue was you have multiple hierachies for 0COSTCENTER, how did the new Nav Attr help you solve your issue. When loading 0COSTCENTER what values did you load ino the new Nav Attribute and how did that link to the hierachies? Also, in RSECADMIN you created hiearchy nodes based on the Nav Attribute but I am confused as to what values you have in the Nav Attr.
I appreciate if you can share your solution from the past in more details.
many thanks -
HOW TO Developing an Authorization plug-in
#if defined (_WIN32)
#pragma warning(disable : 4996)
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
return TRUE;
#endif
How to create here
/*----------------------------------------------------------------------------+
| ___ _ _ |
| / | | | | | |
| / /| | __| | ___ | |__ ___ |
| / /_| |/ _ |/ _ \| _ \ / _ \ |
| / ___ | (_| | (_) | |_) | __/ |
| /_/ |_|\__,_|\___/|____/ \___| |
| |
| |
| ADOBE CONFIDENTIAL |
| __________________ |
| |
| Copyright (c) 2003 - 2010, Adobe Systems Incorporated. |
| All rights reserved. |
| |
| NOTICE: All information contained herein is, and remains the property |
| of Adobe Systems Incorporated and its suppliers, if any. The intellectual |
| and technical concepts contained herein are proprietary to Adobe Systems |
| Incorporated and its suppliers and may be covered by U.S. and Foreign |
| Patents, patents in process, and are protected by trade secret or |
| copyright law. Dissemination of this information or reproduction of this |
| material is strictly forbidden unless prior written permission is |
| obtained from Adobe Systems Incorporated. |
| |
| Adobe Systems Incorporated 415.832.2000 |
| 601 Townsend Street 415.832.2020 fax |
| San Francisco, CA 94103 |
| |
+----------------------------------------------------------------------------*/
#include "StdAfx.h"
#include "FmsAuthAdaptor.h"
#include "FmsAuthActions.h"
#include "FmsMedia.h"
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include "hash.h"
#include <sstream>
#if defined (_WIN32)
#pragma warning(disable : 4996)
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
return TRUE;
#endif
// Flag to process SWF Verification in this auth sample. A real SWF file
// must be targeted in the SWFVerification code below for the example to work.
static const bool kAuthorizeSwfVerification = false;
class FmsAuthAdaptor : public IFmsAuthAdaptor
public:
FmsAuthAdaptor(IFmsAuthServerContext2* pFmsAuthServerContext)
: m_pFmsAuthServerContext(pFmsAuthServerContext) {}
virtual ~FmsAuthAdaptor() {}
void authorize(IFmsAuthEvent* pAev);
void notify(IFmsAuthEvent* pAev);
void getEvents(I32 aevBitAuth[], I32 aevBitNotf[], unsigned int count);
private:
bool getStats(I64 clientStatsHandle, FmsClientStats& baseStats);
void processStats(IFmsAuthEvent* pAev);
IFmsAuthServerContext2* m_pFmsAuthServerContext;
// Utils
// Note: Do not delete the return value. The return value is a buffer
// allocated in FMS memory space, and FMS will manage the memory.
static char* getStringField(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kString)
return reinterpret_cast<char*>(field.str);
return 0;
// Note: Do not delete the return value. The return value is a buffer
// allocated in FMS memory space, and FMS will manage the memory.
static U8* getBufferField(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kBuffer)
return field.buf;
return 0;
static bool getI8Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I8& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kI8)
iValue = field.i8;
return true;
return false;
static bool getI32Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I32& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kI32)
iValue = field.i32;
return true;
return false;
static bool getI64Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I64& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kI64)
iValue = field.i64;
return true;
return false;
static bool getFloatField(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, float& fValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kFloat)
fValue = field.f;
return true;
return false;
static bool getU16Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, U16& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kU16)
iValue = field.u16;
return true;
return false;
static bool setStringField(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, char* pValue)
FmsVariant field;
field.setString(reinterpret_cast<I8*>(pValue));
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setI8Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I8 iValue)
FmsVariant field;
field.setI8(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setU8Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, U8 iValue)
FmsVariant field;
field.setU8(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setI32Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I32 iValue)
FmsVariant field;
field.setI32(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setI64Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I64 iValue)
FmsVariant field;
field.setI64(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setFloatField(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, float fValue)
FmsVariant field;
field.setFloat(fValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool isADPCMSupported(int iAudioCodecs)
return (iAudioCodecs & SUPPORT_SND_ADPCM) != 0;
static bool isVP6Supported(int iVideoCodecs)
int iAllVP6 = ( SUPPORT_VID_VP6ALPHA | SUPPORT_VID_VP6 );
return (iVideoCodecs & iAllVP6) != 0;
static bool isService(int iType)
return (iType & TYPE_SERVICE) != 0;
static bool isAMF3(unsigned char uEncod)
return (uEncod == ENCODE_AMF3);
// This class will process all authorization events
class MyFmsAuthorizeEvent
public:
MyFmsAuthorizeEvent(IFmsAuthEvent* pAev, IFmsAuthServerContext2* pFmsAuthServerContext)
: m_pAev(pAev), m_pFmsAuthServerContext(pFmsAuthServerContext) {}
virtual ~MyFmsAuthorizeEvent() {}
void authorize();
private:
IFmsAuthEvent* m_pAev;
IFmsAuthServerContext2* m_pFmsAuthServerContext;
void MyFmsAuthorizeEvent::authorize()
bool bAuthorized = true; // default authorization state
switch(m_pAev->getType())
case IFmsAuthEvent::E_CONNECT:
// only E_CONNECT allows changes to the following fields:
// F_CLIENT_AUDIO_SAMPLE_ACCESS
// F_CLIENT_AUDIO_SAMPLE_ACCESS_LOCK
// F_CLIENT_READ_ACCESS
// F_CLIENT_READ_ACCESS_LOCK
// F_CLIENT_VIDEO_SAMPLE_ACCESS
// F_CLIENT_VIDEO_SAMPLE_ACCESS_LOCK
// F_CLIENT_WRITE_ACCESS_LOCK
// F_CLIENT_WRITE_ACCESS
I8 iValue;
if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS, iValue))
setI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS, iValue);
// redirect connection example
char* pUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
if (pUri && !strcmp(pUri, "rtmp://localhost/streamtest"))
setStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI,
"rtmp://localhost:1935/streamtest");
bAuthorized = false;
// set DiffServ fields based on a client IP
// char* pIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
// if (pIp && !strcmp(pIp, "192.168.1.1"))
// set the DSCP bits and mask
U8 m_diffServBits = 170;
U8 m_diffServMask = 252;
setU8Field(m_pAev, IFmsAuthEvent::F_CLIENT_DIFFSERV_BITS, m_diffServBits);
setU8Field(m_pAev, IFmsAuthEvent::F_CLIENT_DIFFSERV_MASK, m_diffServMask);
bAuthorized = true;
break;
case IFmsAuthEvent::E_PLAY:
char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
if (pStreamName)
setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName);
char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
if (pStreamType)
setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType);
char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
if (pStreamQuery)
setStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY, pStreamQuery);
I8 iValue;
if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, iValue))
// If iValue is 1 (true) the playlist will be reset and the
// stream will be the only stream in the playlist; otherwise
// 0 (false) means the stream will be added to the existing
// playlist.
setI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, iValue);
if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, iValue))
// If iValue is 1 (true) the stream timestamps will be ignored;
// otherwise 0 (false) means the timestamps will be handled.
setI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, iValue);
char* pStreamTransition = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TRANSITION);
if (pStreamTransition && strlen(pStreamTransition))
// MBR transition example
if (!strcmp(pStreamTransition, "switch") ||
!strcmp(pStreamTransition, "swap"))
// get the old stream's properties
char* pOldStreamName = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_NAME);
char* pOldStreamType = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_TYPE);
char* pOldStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_QUERY);
// if pOldStream is empty (optional for switch) current stream is in play
// do we really want stream transition?
// no we do not allow transition
// bAuthorized = false;
// now transition will be turned off and old stream continue playing
// break;
// doing nothing will execute transition mode as is
// or you could modify transition by changing transition properties
// set it to 1 to indicate they will be hooking up the stream,
// but that it does not currently exist
setI32Field(m_pAev, IFmsAuthEvent::F_STREAM_LIVE_PUBLISH_PENDING, 1);
// get the offset value if transition is set to offset mode for reconnect
if (!strcmp(pStreamTransition, "resume"))
float fValue;
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_OFFSET, fValue))
float offset = fValue; //offset value in seconds
else
// This is a regular play waiting for approval, which may be converted
// into a play2 command by changing transition properties
break;
case IFmsAuthEvent::E_PUBLISH:
char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
if (pStreamName)
setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName);
char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
if (pStreamType)
setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType);
I32 iValue;
if (getI32Field(m_pAev, IFmsAuthEvent::F_STREAM_PUBLISH_TYPE, iValue))
// publish types:
// 0 : record
// 1 : append
// 2 : appendWithGap
// -1 : live
setI32Field(m_pAev, IFmsAuthEvent::F_STREAM_PUBLISH_TYPE, iValue);
break;
case IFmsAuthEvent::E_FILENAME_TRANSFORM:
I64 iValue;
if (getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, iValue))
// some fields are not eligible to be modified. The return
// value will be false when trying to modify the F_CLIENT_ID.
bool bSet = setI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, iValue);
char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
if (pStreamName)
// some fields are not eligible to be modified. The return
// value will be false when trying to modify the F_STREAM_NAME.
bool bSet = setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName);
char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
if (pStreamPath)
setStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH, pStreamPath);
char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
if (pStreamType)
setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType);
break;
case IFmsAuthEvent::E_PAUSE:
bAuthorized = false; // block all E_PAUSE events.
float fValue;
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE_TIME, fValue))
float fPauseTime = fValue; // in seconds
I8 iValue;
if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE, iValue))
// 1 (true) means PAUSE
// 0 (false) means UNPAUSE
bool boolPause = iValue != 0;
if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE_TOGGLE, iValue))
// 1 (true) means PAUSE_TOGGLE
// 0 (false) means no PAUSE_TOGGLE was set
bool boolPauseToggle = iValue != 0;
FmsVariant field;
// Notify Action example: An IFmsNofifyAction is created to notify
// server side action script (SSAS) of the E_PAUSE event by calling
// the function name "method" in the script. In this example two
// variables will be passed to "method" by calling addParam(field)
// on the action.
if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
I64 clientId = field.i64;
IFmsNotifyAction* pAction = m_pAev->addNotifyAction("Notified by adaptor");
pAction->setClientId(field);
const char mtd[] = "method";
field.setString(reinterpret_cast<I8*>(const_cast<char*>(mtd)));
pAction->setMethodName(field);
// create and insert a U16 "12345" as the first parameter
field.setU16(12345);
pAction->addParam(field);
// create and insert clientId as a double as the second parameter
field.setDouble((double)clientId);
pAction->addParam(field);
// Note: SSAS does not work with I64 or Buffer variants
// field.setI64(clientId);
// pAction->addParam(field); // incorrect
break;
case IFmsAuthEvent::E_SEEK:
bAuthorized = false; // block all E_SEEK events
float fValue;
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fValue))
// Modification of the seek position example:
// fValue + 3; will add 3 seconds to the initial seek posistion
float fSeekTime = fValue; // value in seconds
setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fSeekTime);
break;
case IFmsAuthEvent::E_LOADSEGMENT:
// bAuthorized = false; // block all E_LOADSEGMENT events
// E_LOADSEGMENT is a read only event that substitutes E_PLAY on
// FMS Origin servers for recorded streams.
I64 iValue;
if (getI64Field(m_pAev, IFmsAuthEvent::F_SEGMENT_START, iValue))
I64 iStart = iValue; // in bytes
if (getI64Field(m_pAev, IFmsAuthEvent::F_SEGMENT_END, iValue))
I64 iEnd = iValue; // in bytes
break;
case IFmsAuthEvent::E_RECORD:
// bAuthorized = false; // block all E_RECORD events
float fValue;
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, fValue))
float recMaxSize = fValue; // in kilobytes
setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, recMaxSize);
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, fValue))
float recMaxDuration = fValue; // in seconds
setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, recMaxDuration);
break;
case IFmsAuthEvent::E_SWF_VERIFY:
// SWF Verification example:
// kAuthorizeSwfVerification is assigned false by default. The
// target SWF file must be updated for this to work.
if(kAuthorizeSwfVerification)
I8 swfvVersion = 0;
if(getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_VERSION, swfvVersion))
std::stringstream stream;
stream << "Swf verification version is " << static_cast<int>(swfvVersion);
m_pFmsAuthServerContext->log(stream.str().c_str(), IFmsServerContext::kInformation, false);
I64 swfvDepth;
if(getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DEPTH, swfvDepth))
I32 swfvTTL;
if(getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, swfvTTL))
swfvTTL /= 2;
setI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, swfvTTL);
U8 digest[kSHA256DigestLen];
// Target a real SWF file instead of sample.swf
hashSwfFileAtDepth("C:\\sample.swf", swfvDepth, digest);
FmsVariant field;
field.setBuffer(digest, kSHA256DigestLen);
m_pAev->setField(IFmsAuthEvent::F_CLIENT_SWFV_DIGEST, field);
break;
case IFmsAuthEvent::E_APPSTART:
case IFmsAuthEvent::E_APPSTOP:
case IFmsAuthEvent::E_DISCONNECT:
case IFmsAuthEvent::E_STOP:
case IFmsAuthEvent::E_UNPUBLISH:
case IFmsAuthEvent::E_ACTION:
case IFmsAuthEvent::E_CODEC_CHANGE:
case IFmsAuthEvent::E_RECORD_STOP:
case IFmsAuthEvent::E_CLIENT_PAUSE:
case IFmsAuthEvent::E_SWF_VERIFY_COMPLETE:
case IFmsAuthEvent::E_CLIENT_SEEK:
case IFmsAuthEvent::E_START_TRANSMIT:
case IFmsAuthEvent::E_STOP_TRANSMIT:
case IFmsAuthEvent::E_MAXEVENT:
break;
IFmsAuthServerContext2::AuthFailureDesc* desc = NULL;
if(!bAuthorized)
desc = new IFmsAuthServerContext2::AuthFailureDesc("Blocked by auth adaptor",
IFmsAuthServerContext2::kDefaultStatus, -1);
char buf[1024];
const char* const action = bAuthorized ? "approved" : "rejected";
sprintf(buf, "Received authorization type=%d id=%p %s\n", m_pAev->getType(),
m_pAev, action);
// log to the configured FMS log directory. If the third parameter is true,
// also send the log to the system event log.
m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false);
m_pFmsAuthServerContext->onAuthorize(m_pAev, bAuthorized, desc);
delete desc;
class MyFmsNotifyEvent
public:
MyFmsNotifyEvent(IFmsAuthEvent* pAev, IFmsAuthServerContext2* pFmsAuthServerContext)
: m_pAev(pAev), m_pFmsAuthServerContext(pFmsAuthServerContext) {}
virtual ~MyFmsNotifyEvent() {}
void notify() const;
private:
IFmsAuthEvent* m_pAev;
IFmsAuthServerContext2* m_pFmsAuthServerContext;
void MyFmsNotifyEvent::notify() const
switch(m_pAev->getType())
case IFmsAuthEvent::E_PLAY:
char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
I32 iValue;
if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_CODECS, iValue))
bool bADPCM = isADPCMSupported(iValue);
if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_CODECS, iValue))
bool bVP6 = isVP6Supported(iValue);
if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_TYPE, iValue))
bool bService = isService(iValue);
if (getI32Field(m_pAev, IFmsAuthEvent::F_STREAM_ID, iValue))
I32 iStreamId = iValue;
float fValue;
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_LENGTH, fValue))
float fLength = fValue; // in seconds
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_POSITION, fValue))
float iPosition = fValue; // in seconds
I64 lValue;
if (getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, lValue))
I64 iClientId = lValue;
I8 sValue;
if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SECURE, sValue))
bool bSecure = sValue != 0;
if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AMF_ENCODING, sValue))
bool bAMF3 = isAMF3(sValue);
if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS_LOCK, sValue))
bool bRead = sValue != 0;
if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS_LOCK, sValue))
bool bWrite = sValue != 0;
if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS_LOCK, sValue))
bool bAudioRead = sValue != 0;
if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS_LOCK, sValue))
bool bVideoRead = sValue != 0;
if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, sValue))
bool bReset = sValue != 0;
if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, sValue))
bool bIgnore = sValue != 0;
break;
case IFmsAuthEvent::E_SEEK:
float fValue;
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fValue))
float fSeekTime = fValue;
// Disconnect Action example: disconnect the client that was
// specified by the E_SEEK notify event
FmsVariant field;
if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
IFmsDisconnectAction* pAction =
const_cast<IFmsAuthEvent*>(m_pAev)->
addDisconnectAction("Seek is not allowed. Blocked by adaptor");
pAction->setClientId(field);
break;
case IFmsAuthEvent::E_CODEC_CHANGE:
char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
U16 fType;
if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC_TYPE, fType))
U16 streamCodecType = fType;
if (streamCodecType == kVIDEO_CODEC)
U16 fValue;
if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC, fValue))
U16 streamCodecValue = fValue;
if (streamCodecValue == VIDEO_CODEC_SORENSON)
// Disconnect Action example: Disallow clients trying
// to publish content with the sorenson video codec.
FmsVariant field;
if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
IFmsDisconnectAction* pAction =
const_cast<IFmsAuthEvent*>(m_pAev)->
addDisconnectAction("Sorenson is not allowed. Blocked by adaptor");
pAction->setClientId(field);
break;
case IFmsAuthEvent::E_RECORD_STOP:
char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
float fValue;
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, fValue))
float recMaxSize = fValue; // in kilobytes
if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, fValue))
float recMaxDuration = fValue; // in seconds
break;
case IFmsAuthEvent::E_SWF_VERIFY_COMPLETE:
char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
I8 version; // version of SWF verification
getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_VERSION, version);
I64 depth; // depth in the SWF file hashed
getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DEPTH, depth);
I32 ttl; // time to live of the SWF hash provided
getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, ttl);
// digest provided to match against
U8* buffer = getBufferField(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DIGEST);
// result of the attempted match-- see FmsAuthEvents.h enum
// eSWFMatch for the meaning of this field
I32 match;
getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_RESULT, match);
std::stringstream stream;
stream << "swf verification for client: "
<< std::string(pClIp)
<< " is complete, the result is: " << match;
m_pFmsAuthServerContext->log(stream.str().c_str(), IFmsServerContext::kInformation, false);
break;
case IFmsAuthEvent::E_APPSTART:
case IFmsAuthEvent::E_APPSTOP:
case IFmsAuthEvent::E_CONNECT:
case IFmsAuthEvent::E_DISCONNECT:
case IFmsAuthEvent::E_FILENAME_TRANSFORM:
case IFmsAuthEvent::E_STOP:
case IFmsAuthEvent::E_PAUSE:
case IFmsAuthEvent::E_PUBLISH:
case IFmsAuthEvent::E_UNPUBLISH:
case IFmsAuthEvent::E_LOADSEGMENT:
case IFmsAuthEvent::E_ACTION:
case IFmsAuthEvent::E_RECORD:
case IFmsAuthEvent::E_CLIENT_PAUSE:
case IFmsAuthEvent::E_SWF_VERIFY:
case IFmsAuthEvent::E_CLIENT_SEEK:
case IFmsAuthEvent::E_START_TRANSMIT:
case IFmsAuthEvent::E_STOP_TRANSMIT:
case IFmsAuthEvent::E_MAXEVENT:
break;
char buf[1024];
sprintf(buf, "Received notification type=%d id=%p\n", m_pAev->getType(), m_pAev);
// log to the configured FMS log directory. If the third parameter is true,
// also send the log to the system event log.
m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false);
m_pFmsAuthServerContext->onNotify(m_pAev);
/* All authorization events flow through this wrapper function.
* Note: This sample auth adaptor has MyFmsAppAuthEvent allocated on the
* stack, but time intensive implementations may warrant authorization to
* be allocated on the heap so work may be passed to a thread pool. This
* prevents starvation of the calling FMS threads in custom code that may
* have processing delays (ie database calls, network filesystem access, etc..).
void FmsAuthAdaptor::authorize(IFmsAuthEvent* pAev)
MyFmsAuthorizeEvent(pAev, m_pFmsAuthServerContext).authorize();
/* All notification events flow through this wrapper function.
* Note: This sample auth adaptor has MyFmsNotifyEvent allocated on the
* stack, but time intensive implementations may warrant notifications to
* be allocated on the heap so work may be passed to a thread pool. This
* prevents starvation of the calling FMS threads in custom code that may
* have processing delays (ie database calls, network filesystem access, etc..).
void FmsAuthAdaptor::notify(IFmsAuthEvent* pAev)
processStats(pAev);
MyFmsNotifyEvent(pAev, m_pFmsAuthServerContext).notify();
* Get client statistics.
bool FmsAuthAdaptor::getStats(I64 clientStatsHandle, FmsClientStats& baseStats)
bool bValue= m_pFmsAuthServerContext->getClientStats(clientStatsHandle, baseStats);
return bValue;
* Example obtainting client stats from an E_CONNECT or E_STOP event
void FmsAuthAdaptor::processStats(IFmsAuthEvent* pAev)
I64 statsHandle;
FmsClientStats baseStats;
if (!getI64Field(pAev, IFmsAuthEvent::F_CLIENT_STATS_HANDLE, statsHandle))
return;
char* pAppName = getStringField(pAev, IFmsAuthEvent::F_APP_NAME);
if (pAev->getType() == IFmsAuthEvent::E_CONNECT)
getStats(statsHandle, baseStats);
// log data
char buf[1024];
char hashKey[9];
memset(hashKey, 0, 9);
memcpy(hashKey, &statsHandle, sizeof(statsHandle));
sprintf(buf, "client Stats Handle= %s, bytes_in= %f, bytes_out= %f\n", hashKey,
static_cast<double>(baseStats.bytes_in), static_cast<double>(baseStats.bytes_out));
m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false);
else if (pAev->getType() == IFmsAuthEvent::E_STOP)
getStats(statsHandle, baseStats);
/* By default, all authorization and notifications events will be sent.
* Call excludeEvents with the bit set to 1, to stop recieving events.
* Note: The events:
* E_APPSTART, E_APPSTOP, E_DISCONNECT, E_STOP, E_UNPUBLISH, E_CODEC_CHANGE
* are excluded by default and are not authorizable.
void FmsAuthAdaptor::getEvents(I32 aevBitAuth[], I32 aevBitNotf[], unsigned int count)
// exclude certain auth events
IFmsAuthEvent::EventType authExcludeEvent[] = { IFmsAuthEvent::E_SEEK };
// set E_SEEK to a non authorizable event
m_pFmsAuthServerContext->excludeEvents(aevBitAuth, count, authExcludeEvent, 1);
// Warning: if E_CODEC_CHANGE event is not excluded, all messages will be
// scanned to detect codec change. Subscribe to this event only as needed.
// Example that excludes certain notify events. (E_PAUSE, E_CODEC_CHANGE)
IFmsAuthEvent::EventType notifyExcludeEvent[] =
{ IFmsAuthEvent::E_PAUSE, IFmsAuthEvent::E_CODEC_CHANGE };
m_pFmsAuthServerContext->excludeEvents(aevBitNotf, count, notifyExcludeEvent, 2);
extern "C" void FCExport FmsCreateAuthAdaptor3(IFmsAuthServerContext2* pAuthServerCtx,
IFmsAuthAdaptor*& pFmsAuthAdaptor, U32& iVersion)
pFmsAuthAdaptor = new FmsAuthAdaptor(pAuthServerCtx);
U32 version = pAuthServerCtx->getVersion();
U16 w2 = LWORD(version);
U16 w1 = HWORD(version);
iVersion = MKLONG(INTERFACE_MINOR_VERSION, INTERFACE_MAJOR_VERSION);
char buf[1024];
char *ptr = buf;
int valueLen = pAuthServerCtx->getConfig("UserKey1", &ptr, sizeof(buf));
if (!valueLen)
valueLen = pAuthServerCtx->getConfig("UserKey2", &ptr, sizeof(buf));
if (!valueLen)
return;
if (valueLen < 0)
// failed to find this key
return;
if (valueLen < 0)
// failed to find this key
return;
// value length is bigger then the buffer size, and a real adaptor should
// allocate valueLen + 1 bytes and call again
extern "C" void FCExport FmsDestroyAuthAdaptor3(IFmsAuthAdaptor* pAuthAdaptor )
delete pAuthAdaptor;There is no API to Acrobat's document compare feature.
It is certainly possible for an experienced plug-in programmer to
create a new compare plug-in. For example, extract text from two PDFs
and compare it. Comparison algorithms have been much studied so should
be findable in academic literature.
Going beyond text comparison would be a major exercise.
Aandi Inston -
Vendor Master Extraction from Legacy
Hi guys,
We have 2 different legacy systems here (4.5b and 4.6c) and I am trying to extract the vendor master from both of them and integrate them into the new mysap2004.
What is the best way to extract the vendor master along with the address , punchasing doc, bank details, partner functions,etc ? Any sample program for vendor master extraction is most welcome. Here is my extract layout.
ADDRESS
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
SZA1_D0100 Title (TITLE_MEDI) CHAR/30 Not used
ADDR1_DATA Name (NAME1) CHAR/40 Bring values over as is.
ADDR1_DATA Name (NAME 2) CHAR/40 Bring values over as is.
ADDR1_DATA Name (NAME 3) CHAR/40 Bring values over as is.
ADDR1_DATA Name (NAME 4) CHAR/40 Bring values over as is.
ADDR1_DATA Search Term 1 (SORT1) CHAR/20 Convert to HPC methodology.
O-First 8 char. of vendor name
R- First 8 char. of vendor name
B- First 8 char. of vendor name
ADDR1_DATA Search Term 2 (SORT2) CHAR/20 Bring values over as is.
ADDR1_DATA Street/House Number
(Street) CHAR/60 Bring values over as is.
ADDR1_DATA House Number
(HOUSE_NUM1) CHAR/10 Bring values over as is.
ADDR1_DATA Building (number or code)
(BUILDING) CHAR/20 Bring values over as is.
ADDR1_DATA Room or apartment number
(ROOMNUMBER) CHAR/10 Bring values over as is.
ADDR1_DATA Floor in building
(FLOOR) CHAR/10 Bring values over as is.
ADDR1_DATA c/o name
(NAME_CO) CHAR/40 Bring values over as is.
ADDR1_DATA Street 2
(STR_SUPPL1) CHAR/40 Bring values over as is.
ADDR1_DATA Street 3
(STR_SUPPL2) CHAR/40 Bring values over as is.
ADDR1_DATA Street 4
(STR_SUPPL3) CHAR/40 Bring values over as is.
ADDR1_DATA Street 5
(LOCATION) CHAR/40 Bring values over as is.
ADDR1_DATA City
(CITY1) CHAR/40 Bring values over as is.
ADDR1_DATA District
(CITY2) CHAR/40 Bring values over as is.
ADDR1_DATA City (different from postal city)
HOME_CITY CHAR/40 Bring values over as is.
ADDR1_DATA City postal code
(POST_CODE1) CHAR/10 Zip Code. Bring values over as is.
ADDR1_DATA Country
(COUNTRY) CHAR/3 Bring values over as is.
ADDR1_DATA Region (State, Province, County)
(REGION) CHAR/3 E.g., NJ New Jersey, CO Colorado, etc. Bring values over as is.
ADDR1_DATA Time Zone
(TIME_ZONE) CHAR/6 Bring values over as is.
ADDR1_DATA Transportation Zone
(TRANSPZONE) CHAR/10 Bring values over as is.
ADDR1_DATA Regional Structure Group
(REGIOGROUP) CHAR/8 Bring values over as is.
ADDR1_DATA P. O. Box
(PO_BOX) CHAR/10 Bring values over as is.
ADDR1_DATA P.O. Box Postal Code
(POST_CODE2) CHAR/10 Bring values over as is.
ADDR1_DATA Language Key
(LANGU) LANG/1 Bring values over as is.
SZA1_D0100 Telephone
(TEL_NUMBER) CHAR/30 Bring values over as is.
SZA1_D0100 Telephone Number Extension
(TEL_EXTENS) CHAR/10 Bring values over as is.
SZA1_D0100 Fax
(FAX_NUMBER) CHAR/30 Bring values over as is.
SZA1_D0100 Fax Extension Number
(FAX_EXTENS) CHAR/10 Bring values over as is.
SZA1_D0100 E-mail
(SMTP_ADDR) CHAR/240 Bring values over as is.
ADDR1_DATA Standard Communication Type
(DEFLT_COMM) CHAR/3 Bring values over as is.
ADDR1_DATA Data Line
(EXTENSION1) CHAR/40 Not used. Do not bring over field values.
Note: This field will be available to populate with other data during the conversion.
ADDR1_DATA Telebox
(EXTENSION2 CHAR/40 Not used. Do not bring over field values.
Note: This field will be available to populate with other data during the conversion.
ADDR1_DATA Comments
(REMARK) CHAR/50 Bring values over as is.
CONTROL
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
LFA1 Customer
(KUNNR) CHAR/10 Bring values over as is.
LFA1 Authorization
(BEGRU) CHAR/4 It is to be determined if this field will be used in the future. If yes, bring values over as is from HPC and populate with vendor account group code for Foods.
LFA1 Trading Partner
(VBUND) CHAR/6 Bring values over as is.
LFA1 Group Key
(KONZS) CHAR/10 Not used
LFA1 Tax Code 1
(STCD1) CHAR/16 Bring values over as is.
LFA1 Tax Code 2
(STCD2) CHAR/11 Bring values over as is.
LFA1 Fiscal Address
(FISKN) CHAR/10 Bring values over as is.
LFA1 Jurisdiction Code
(TXJCD) CHAR/15 Bring values over as is.
LFA1 VAT Registration No.
(STCEG) CHAR/20 Bring values over as is.
LFA1 Tax Office
(FISKU) CHAR/10 Bring values over as is.
LFA1 Tax Number
(STENR) CHAR/18 Bring values over as is.
LFA1 Industry
(BRSCH) CHAR/4 Bring values over as is.
LFA1 Train Station
(BAHNS) CHAR/25 Not used.
LFA1 Transportation Zone
(LZONE) CHAR/10 Bring values over as is.
LFA1 Actual QM Sys.
(QSSYS) CHAR/4 Bring values over as is.
LFA1 QM System To
(QSSYSDAT) DATS/8 Bring values over as is.
LFA1 DAK
(J_1FDAK) CHAR/8 Bring values over as is.
PAYMENT TRANSACTIONS
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
LFBK Bank Country Key
(BANKS) CHAR/3 Bring values over as is.
LFBK Bank Key
(BANKL) CHAR/15 Bring values over as is.
LFBK Bank Account
(BANKN) CHAR/18 Bring values over as is.
BNKA Bank Name
(BANKA) CHAR/60 Foods - Bring values over as is.
HPC Populate with Bank Account Number
LFA1 Alternative Payee
(LNRZA) CHAR/10 Bring values over as is.
LFA1 Individual Spec.
(XZEMP) CHAR/1 Bring values over as is.
LFA1 Spec. Per. Reference
(XLFZA) CHAR/1 Bring values over as is.
ACCOUNTING INFORMATION ACCOUNTING
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
LFB1 Recon. Account
(AKONT) CHAR/10 Bring values over as is.
LFB1 Sort Key
(ZUAWA) CHAR/3 Bring values over as is.
LFB1 Head Office
(LNRZE) CHAR/10 Bring values over as is.
LFB1 Authorization
(BEGRU) CHAR/4 Bring values over as is.
LFB1 Cash Mgmnt Group
(FDGRV) CHAR/10 Bring values over as is.
LFB1 Release Group
(FRGRP) CHAR/4 Bring values over as is.
LFB1 Minority Indicator
(MINDK) CHAR/3 Bring values over as is.
LFB1 Certification Date
(CERDT)
DATS/8 Bring values over as is.
LFB1 Interest Indicator
(VZSKZ) CHAR/2 Bring values over as is.
LFB1 Last Key Date
(ZINDT) DATS/8 Bring values over as is.
LFB1 Interest Cycle
(ZINRT) NUMC/2 Bring values over as is.
LFB1 Last Interest Run
(DATLZ) DATS/8 Bring values over as is.
LFB1 Withholding Tax Code
(QSSKZ) CHAR /2 Bring values over as is.
LFB1 Withholding Tax Country
(QLAND) CHAR /3 Bring values over as is.
LFB1 Recipient Type
(QSREC) CHAR /2 Bring values over as is.
LFB1 Exemption Number
(QSZNR) CHAR /10 Bring values over as is.
LFB1 Valid Until
(QSZDT) DATS/8 Bring values over as is.
LFB1 Exemption Authority
(QSBGR) CHAR /1 Bring values over as is.
LFB1 Previous Account No.
(ALTKN) CHAR /10 Do not bring over existing values. Will populate during vendor conversion when legacy vendor number is replaced by a new vendor number.
LFB1 Personnel Number
(PERNR) NUMC/8 Bring values over as is.
PAYMENT TRANSACTIONS ACCOUNTING
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
LFB1 Payment Terms
(ZTERM) CHAR/4 Refer to data mapping spreadsheet later in this spec.
LFB1 Tolerance Group
(TOGRU) CHAR/4 Bring values over as is.
LFB1 Credit Memo Terms
(GUZTE) CHAR/4 Bring values over as is.
LFB1 Chk. Double Inv.
(REPRF) CHAR/1 Bring values over as is.
LFB1 Chk. Cashing Time
(KULTG) DEC/3 Bring values over as is.
LFB1 Payment Methods
(ZWELS) CHAR/10 Refer to data mapping spreadsheet later in this spec.
LFB1 Alternate Payee
(LNRZB) CHAR/10 Bring values over as is.
LFB1 Individual Payment
(XPORE) CHAR/1 Bring values over as is.
LFB1 Bill of Exchange Limit
(WEBTR) CURR/13
Decimal/2 9999999999999.99 Bring values over as is.
LFB1 Payment Advance By EDI
(XEDIP) CHAR/1 Bring values over as is.
LFB1 Payment Block
(ZAHLS) CHAR/1 Bring values over as is.
LFB1 House Bank
(HBKID) CHAR/5 Not used. Do not bring forward existing values.
LFB1 Grouping Key
(ZGRUP) CHAR/2 Bring values over as is.
LFB1 Payment Method Supplement
(UZAWE) CHAR/2 Bring values over as is.
LFB1 Alternate Payee Indicator
(XLFZB) CHAR/1 Bring values over as is.
LFB1 Tolerance Group
(TOGRR) CHAR/4 Bring values over as is.
CORRESPONDENCE ACCOUNTING
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
LFB5 Dunning Procedure
(MAHNA) CHAR/4 Bring values over as is.
LFB5 Dunning Recipient
(LFRMA) CHAR/10 Bring values over as is.
LFB5 Last Dunned
(MADAT) DATS/8 Bring values over as is.
LFB5 Dunning Clerk
(BUSAB) CHAR/2 Bring values over as is.
LFB5 Dunning Block
(MANSP) CHAR/1 Bring values over as is.
LFB5 Legal Dunning Proceedings
(GMVDT) DATS/8 Bring values over as is.
LFB5 Dunning Level
(MAHNS) NUMC/1 Bring values over as is.
LFB1 Grouping Key
(MGRUP) CHAR/2 Bring values over as is.
LFB1 Local Processing
(XDEZV) CHAR/1 Bring values over as is.
LFB1 Acct. Clerk
(BUSAB) CHAR/2 Bring values over as is.
LFB1 Account with Vendor
(EIKTO) CHAR/12 Bring values over as is.
LFB1 Clerk at Vendor
(ZSABE) CHAR/15 Bring values over as is.
LFB1 Acct. Clk. Tel. No.
(TLFNS) CHAR/30 Bring values over as is.
LFB1 Clerks Fax
(TLFXS) CHAR/31 Bring values over as is.
LFB1 Clerks Internet
(INTAD) CHAR/130 Bring values over as is.
LFB1 Account Memo
(KVERM) CHAR/30 Bring values over as is.
PURCHASING DATA
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
LFM1 Order Currency
(WAERS) CUKY/5 Bring values over as is.
LFM1 Terms of Payment
(ZTERM) CHAR/4 Refer to data mapping spreadsheet later in this spec.
LFM1 Incoterms (Part 1)
(INCO1) CHAR/3 Refer to data mapping spreadsheet later in this spec.
LFM1 Incoterms (Part 2)
(INCO2)
CHAR/28 Bring values over as is.
LFM1 Minimum Order Value
(MINBW) CURR/13
Decimal/2 9999999999999.99 Bring values over as is.
LFM1 Schema group, vendor
(KALSK) CHAR/2 Bring values over as is.
LFM1 Pricing Date Cat.
(MEPRF) CHAR/1 Bring values over as is.
LFM1 Order Optim. Rest
(BOPNR) CHAR/4 Bring values over as is.
LFM1 Salesperson
(VERKF) CHAR/30 Bring values over as is.
LFM1 Telephone
(TELF1) CHAR/16 Bring values over as is.
LFM1 Acc. With Vendor
(EIKTO) CHAR/12 Bring values over as is.
LFM1 GR. Based Inv. Verif.
(WEBRE) CHAR/1 Bring values over as is.
LFM1 Auto.Eval. GR Setmt. Del.
(XERSY) CHAR/1 Bring values over as is.
LFM1 Auto.Eval. GR Setmt. Ret.
(XERSR) CHAR/1 Bring values over as is.
LFM1 Acknowledgement Reqd.
(KZABS) CHAR/1 Bring values over as is.
LFM1 Automatic Purchase Order
(KZAUT) CHAR/1 Bring values over as is.
LFM1 Subsequent Settlement
(BOLRE) CHAR/1 Bring values over as is.
LFM1 Subseq. Sett. Index
(BOIND) CHAR/1 Bring values over as is.
LFM1 B. Vol.Comp./Ag. Nec.
(UMSAE) CHAR/1 Bring values over as is.
LFM1 Doc. Index Active
(BLIND) CHAR/1 Bring values over as is.
LFM1 Returns Vendor
(KZRET) CHAR/1 Bring values over as is.
LFM1 Srv.-Based Inv. Ver.
(LEBRE) CHAR/1 Bring values over as is.
LFM1 ABC Indicator
(LFABC) CHAR/1 Bring values over as is.
LFM1 Mode Of Transport-Border
(EXPVZ) CHAR/1 Bring values over as is.
LFM1 Office of Entry
(ZOLLA) CHAR/6 Bring values over as is.
LFM1 Sort Criterion
(SKRIT) CHAR/1 Bring values over as is.
LFM1 PROACT Control Prof.
(PAPRF) CHAR/4 Bring values over as is.
LFM1 Revaluation Allowed
(XNBWY) CHAR/1 Bring values over as is.
LFM1 Grant Discount In Kind
(NRGEW) CHAR/1 Bring values over as is.
LFM1 Relevant for Price Determination
(PRFRE) CHAR/1 Bring values over as is.
LFM1 Relevant for Agency Business
(AGREL) CHAR/1 Bring values over as is.
LFM1 Shipping Conditions
(VSBED) CHAR/2 Bring values over as is.
LFM1 Purchasing Group
(EKGRP) CHAR/3 Bring values over as is.
LFM1 Planned Delivery Time
(PLIFZ) DEC/3 Bring values over as is.
LFM1 Confirmation Control
(BSTAE) CHAR/4 Bring values over as is.
LFM1 Unit of Measure Group
(MEGRU) CHAR/4 Bring values over as is.
LFM1 Rounding Profile
(RDPRF) CHAR/4 Bring values over as is.
LFM1 Price Marking Agreed
(LIPRE) CHAR/2 Bring values over as is.
LFM1 Rack jobbing service agreed
(LISER) CHAR/1 Bring values over as is.
LFM1 Order entry by vendor
(LIBES) CHAR/1 Bring values over as is.
LFM1 Serv. Level
(VENSL) DEC/4
Decimal/1 Bring values over as is.
PARTNER FUNCTIONS
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
WYT3 Partner Function
(PARVW) CHAR/2 Bring values over as is.
WRF02K Number (Partner)
(GPARN) CHAR/10 Map to new partner number in vendor correlation table.
ALTERNATE DATA
(Purchasing Data)
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
LFM2 Order Currency
(WAERS) CUKY/5 Bring values over as is.
LFM2 Terms of Payment
(ZTERM) CHAR/4 Refer to data mapping spreadsheet later in this spec.
LFM2 Incoterms (Part 1)
(INCO1) CHAR/3 Refer to data mapping spreadsheet later in this spec.
LFM2 Incoterms (Part 2)
(INCO2)
CHAR/28 Bring values over as is.
LFM2 Minimum Order Value
(MINBW) CURR/13
Decimal/2 Bring values over as is.
LFM2 Schema group, vendor
(KALSK) CHAR/2 Bring values over as is.
LFM2 Pricing Date Cat.
(MEPRF) CHAR/1 Bring values over as is.
LFM2 Order Optim. Rest
(BOPNR) CHAR/4 Bring values over as is.
LFM2 Salesperson
(VERKF) CHAR/30 Bring values over as is.
LFM2 Telephone
(TELF1) CHAR/16 Bring values over as is.
LFM2 Acc. With Vendor
(EIKTO) CHAR/12 Bring values over as is.
LFM2 GR. Based Inv. Verif.
(WEBRE) CHAR/1 Bring values over as is.
LFM2 Auto.Eval. GR Setmt. Del.
(XERSY) CHAR/1 Bring values over as is.
LFM2 Auto.Eval. GR Setmt. Ret.
(XERSR) CHAR/1 Bring values over as is.
LFM2 Acknowledgement Reqd.
(KZABS) CHAR/1 Bring values over as is.
LFM2 Automatic Purchase Order
(KZAUT) CHAR/1 Bring values over as is.
LFM2 Subsequent Settlement
(BOLRE) CHAR/1 Bring values over as is.
LFM2 Subseq. Sett. Index
(BOIND) CHAR/1 Bring values over as is.
LFM2 B. Vol.Comp./Ag. Nec.
(UMSAE) CHAR/1 Bring values over as is.
LFM2 Doc. Index Active
(BLIND) CHAR/1 Bring values over as is.
LFM2 Returns Vendor
(KZRET) CHAR/1 Bring values over as is.
LFM2 Srv.-Based Inv. Ver.
(LEBRE) CHAR/1 Bring values over as is.
LFM2 ABC Indicator
(LFABC) CHAR/1 Bring values over as is.
LFM2 Mode Of Transport-Border
(EXPVZ) CHAR/1 Bring values over as is.
LFM2 Office of Entry
(ZOLLA) CHAR/6 Bring values over as is.
LFM2 Sort Criterion
(SKRIT) CHAR/1 Bring values over as is.
LFM2 PROACT Control Prof.
(PAPRF) CHAR/4 Bring values over as is.
LFM2 Revaluation Allowed
(XNBWY) CHAR/1 Bring values over as is.
LFM2 Grant Discount In Kind
(NRGEW) CHAR/1 Bring values over as is.
LFM2 Relevant for Price Determination
(PRFRE) CHAR/1 Bring values over as is.
LFM2 Relevant for Agency Business
(AGREL) CHAR/1 Bring values over as is.
LFM2 Shipping Conditions
(VSBED) CHAR/2 Bring values over as is.
LFM2 Purchasing Group
(EKGRP) CHAR/3 Bring values over as is.
LFM2 Planned Delivery Time
(PLIFZ) DEC/3 Bring values over as is.
LFM2 Confirmation Control
(BSTAE) CHAR/4 Bring values over as is.
LFM2 Unit of Measure Group
(MEGRU) CHAR/4 Bring values over as is.
LFM2 Rounding Profile
(RDPRF) CHAR/4 Bring values over as is.
LFM2 Price Marking Agreed
(LIPRE) CHAR/2 Bring values over as is.
LFM2 Rack jobbing service agreed
(LISER) CHAR/1 Bring values over as is.
LFM2 Order entry by vendor
(LIBES) CHAR/1 Bring values over as is.
LFM2 Serv. Level
(VENSL) DEC/4
Decimal/1 Bring values over as is.
ALTERNATE DATA
(Partner Functions)
Source File /Table Name Field Name Field Type / Length Format Rule / Logic
WYT3 Partner Function
(PARVW) CHAR/2 Bring values over as is.
WRF02K Number (Partner)
(GPARN) CHAR/10 Map to new partner number in vendor correlation table.Hi Shareen,
Have you looked Master Data Distribution (ALE) for Vendor since your legacy system are SAP?
Please check t/code BD14 (Send Vendor Master Data) and BD15 (Get Vendor Master Data).
Hope this will give you an idea.
Regards,
Ferry Lianto -
Dear Friends / Experts
We have around 10 HR (BW/BO) reports. All are woking fine. Now the users wants to restrict the report based on cost center.
Hence, I have created one DSO with relevent information and extracted the data from ECC ( Used id, Cost Center belonging, Etc....). Created one customer exit variable and lookedup this used cost center data in CMOD. This is perfectly working.
My Doubts
1) This logic no where related with authorization. Do i still need to consider authorization object and handle further ?
2) If the Logged in user not available in the DSO, i am not able to edit the query in BO-Webi .
Can anybody advise ?. Good advise awarded with points.
Regards
Saravanan Raju1) This logic no where related with authorization. Do i still need to consider authorization object and handle further ?
The concept of authorization is only similar, instead of a DSO, you use a Z*COST time-dependent authorization-relavent IObject & start to set the time-intervals for access. I assume the DSO concept, although is a quick fix is not a long term solution, as there needs to be loads, corrections at irregular time intervals & this needs to reflect on the BEx. This holds okay for lesser # of users, but you might never estimate the size, as the business would consider adding more in months to come. As rightly said, you need not have an authoriztion object to handle, but if you make cost center object's customer exit to refer this using a SSO-details (like sy-uname), this will restrict entries & authorization based on this field in your BEx. But still you need to work on the DSO concept & try to migrate towards a authroization-releavant IOBject for good sakes, as there is a possiblity the data is exposed -or- completely not avalialbe even for testing & you need to add the same set of ccenters repeatedly for all users again & again, month-on-month, issues like that.
2) If the Logged in user not available in the DSO, i am not able to edit the query in BO-Webi .
Yes, as stated above, this is the drawbacks in this model. Hope it helps. -
Authorization issue in Info spoke
Hi all,
I am facing some authorization issue when executing info spoke in process chain.
Info spoke is working fine in direct Scheduling (both background and Dialog).
Am getting this error after execution of process chain
"System error: RSDRC / FORM AUTHORITY_CHECK RSDRC / FORM AUTHORITY_CHECK R"
"System error: RSDRC / FUNC RSDRC_BASIC_CUBE_DATA_GET RSDRC / FUNC RSDRC_B"
"System error: RSDRC / FORM DATA_GET RSDRC / FORM DATA_GET RSDRC / FORM DA"
"Extraction Cube : Error in DataManager API".
I dont know why this problem comes.
Can anyone tel me what went wrong and how to solve it.
Thanks in advance.
Kind regards,
Shanbagavalli.SHi All,
The above issue is getting due to # character in text at end(e.g ljdfsaa##). After removing # characters in text issue got resolved.
Thansk,
Manjunatha
Maybe you are looking for
-
Can't get Safari 5.1.1 to run a java applet from Ubuntu Server with unsigned cert
Hi there, I am trying to run a Webmin control panel in the latest safari and no matter what I do, I keep getting this error message: Works fine in Latest Chrome. I am running latest Lion and would like to use Safari as my main browser, but if I can't
-
Outlook Integration inconsistencies
Dear Members, I have been testing the outlook integration functionality in Sap B1 2005 and Sap B1 2007 and the concept is very good because it enhances CRM for clients as well as integrated communication into the erp package. However, I have found so
-
Hi all, In first list i displayed sflight table details.i used this code.if i double click on carrid value i am getting corresponding spfli details in the next list. AT LINE-SELECTION. GET CURSOR FIELD fld VALUE val LENGTH len OFFSET off LINE li. s
-
my email is not working
-
Hey guys, So i am in a total pickle, my blackberry user id has an invalid email, basically i messed up and put googlemail.co.uk instead of .com, this is now registered on my device, and having upgraded apps or ive been avoiding this as i had forgotte