RETURN statement "kills" my BSP event handling
Hi,
I've gone through [this|Downloaded Excel data is shown using Chinese characters (!); and everything went just fine. At the end of that code, to make my BSP react and finally display that popup, I had to insert a RETURN statement, and by doing so, the BSP virtually "dies": stops reacting to any ohter event, and finally makes me close the browser. This is the relevant section of my code:
cFolders
OnInputProcessing event
response->set_data( data = lv_xstring ).
navigation->response_complete( ). " signal that response is complete
return.
Why is that happening? What could I do to avoid that behavior, and keep working my custom pushbutton functionality?
Thanks in advance, hope someone could help me.
Regards,
Federico.
Hi Frederico,
I think there is a misunderstanding, what you want your application to do and what response_complete is used for.
Do I understand your requirement right: You want a popup-window with excel content and in background-window the standard application should run unchanged?
That doesn't work with response_complete in OnInputProcessing, because the statement is used to prevent creating the default response of a page in onLayout method
If you use RETURN, the processing of your page is stopped and the response consists only of the content you filled in but not of any default page layout => excel appears but your application seems to be dead
If you do not use RETURN, you navigate to another page (statement cl_cfx_util_ui=>navigate). As navigation in BSPs is realized by a browser redirect, a complete new request-response-zyklus is started => no excel appears, your response seems to be overwritten
Possible solutions are:
1. Instead of sending the response object back to the client, store it in the server-cache (method SERVER_CACHE_UPLOAD of class CL_HTTP_SERVER) in OnInputProcessing and open a new browser window with url of object in server-cache.
OR
2. Open a new browser window with url of a new custom bsp page and generate the response in onInitialization of the new custom page.
Search the forum, you'll find a lot of examples how to use the server-cache and how to open a new window with javacript.
Anyway: read also SAP help to understand the control flow of BSPs: [http://help.sap.com/saphelp_nw70/helpdata/en/a3/4b9afa7aa511d5992e00508b6b8b11/frameset.htm]
Best regards,
CW
Similar Messages
-
Javascript embedded in button pl/sql event handler not being executed
Javascript calls not working from pl/sql button event handler. What am I missing? Are specific settings needed to execute javascript from pl/sql proceedures?
Example: Want to toggle target='_blank' off and on in a button pl/sql event handler to open url call in new window & then reset when processing submit is done & the app returns to the form.
portal form button's pl/sql submit handler:
begin
htp.p('<script language=JavaScript>') ;
htp.p('this.form.target="_blank"') ;
htp.p('</script>') ;
PORTAL.wwa_app_module.set_target('http://www.oracle.com') ;
htp.p('<script language=JavaScript>') ;
htp.p('this.form.target="_blank"') ;
htp.p('</script>') ;
end ;
Putting the following in the button's javascript on_click event handler works great:
this.form.target='_blank'
to force opening new window with a call in the button's submit pl/sql code via:
PORTAL.wwa_app_module.set_target('http://www.oracle.com') ;
but then the target='_blank' is left on when the submit is done & we return to the form.
putting the above javascript as a function (called fcn_newpage) elsewhere (e.g., after form opens) & calling in the submit pl/sql with
htp.p('fcn_newpage') ;
also doesn't work.
Metalink thought this was an application issue instead of a bug, so thought I'd see if anyone knows what's going wrong here. (Portal 9.0.4.1)thanks for your discussion of my post.
Please clarify:
"htp.p('fcn_newwindow') sends a string":
What would you suggest the proper syntax for a function fcn_newwindow() call from a pl/sql javascript block that differs from
htp.p('<script language="Javascript">') ;
htp.p('fcn_newwindow');
htp.p('</script>');
or more simply
htp.p('fcn_newwindow') ;
More generally, what I'm trying to figure out is under what conditions javascript is executed, if ever, in the pl/sql of a button (either the submit or custom event handler, depending on the button).
I've seen lots of posts asking how to do a simple htp.p('alert("THIS IS TROUBLE")') ; in a pl/sql event handler for a button on a form, but no description of how this can be done successfully.
In addition to alerts, in my case, I'd like to call a javascript fcn from a pl/sql event handle that would pass a URL (e.g., http://www.oracle.com) where the javascript fcn executed
window.open(URL). The API call to set_target(URL) in pl/sql has no ability to open in a new window, so calling that is inadequate to my needs and I must resort to javascript.
Its clear in the PL/SQL of a button, you can effect form components since p_session..set_target & p_session.get_target set or get the contents of form components.
So to see if javascript ever works, I tried to focus on something simple that only had to set what amounts to an enviromental variable when we returned to the form after a post. I chose to try to change the html value of TARGET from javascript in the PL/SQL button because it doesn't need to be implemented until we finish the post and return to the form.
So I focused on a hack, setting this.form.TARGET='_blank' in the on_click event handler that forced every subsequent URL call or refresh of the form to be a new window. I then wanted to turn off opening new windows once I'd opened the URL call in a new window by setting TARGET='' in the portal form. I can achieve what I want by coding this.form.TARGET='' in the javascript (on_focus, on_change, or on_mousedown, ...) of every form component that might refresh the form. However, that is a ridiculous hack when a simple htp.p('<script>') ; htp.p('this.form.target=""') ; htp.p('</script>') ; at the end of the button's pl/sql event handle should do the same thing reliably if javascript ever works in the pl/sql event handler.
If we didn't have access to form components through p_session calls, I'd assume it was a scope issue (what is available from the pl/sql event handler). But unless my syntax is just off, when, if ever, can javascript be used in a portal form's pl/sql event handler for a button?
if I code a javascript funtion in the forms' pl/sql before displaying form:
htp.p('<script language="JavaScript">') ;
htp.p('function fcn_new_window(URL)') ;
htp.p('window.open(URL)' ) ;
htp.p('</script>') ;
the function can be called from a button's on_click javascript event handler:
fcn_new_window('http://www.oracle.com')
but from the same button's pl/sql submit event handler this call doesn't work: htp.p('fcn_new_window("http://www.oracle.com")')
So my questions remain: Is there other syntax I need, or does javascript ever work properly from the pl/sql of a form button's event handler? If it doesn't work, isn't this a bug that should be fixed by Oracle?
I can probably figure out hacks to make things work the way I need, but executing javascript from pl/sql event handlers seems to be the expected way to affect portal html pages (forms, reports, ...) and it seems not to work as expected. I don't feel I should have to implement hacks for something as simple as calling a javascript function from pl/sql when almost every example I've found in metalink or the forums or Oracle Press's "portal bible" suggests using javascript from pl/sql via the utility htp.p() to effect web page components in portal.
My TAR on the subject, while still open, returned the result basically: "We can reproduce your situation. Everything looks okay to us, but we can't explain how to use javascript where you want or point you to any documentation that would solve your problem or expain why it should not work the way you want it to. We don't feel its a technical issue. Why don't you post the problem on the portal applications forum."
I'm hoping I'm just missing something fundamental and everything will work if I implement it a little differently. So if anyone sees my error, please let me know.
by the way, not sure this is germain, but in reference to your comment:
"redirections in pl/sql procedures give a peculiar result. in a pl/sql procedure, usually, portals give the last redirection statement and ignore anything else coming after it."
if I try to raise an alert:
htp.p('alert("you screwed up")');
return;
in a pl/sql event handler, it still doesn't raise the alert, even though its the last thing implemented in the event handler. But if I set the value of a text box using p_session..set_value_as_string() at the same spot, it correctly sets the text box value when I return to the form. -
Hi all,
I want to know the significance of creating event handler method in Class builder.
and how it can be used at the time of event trigger.( Is it called automatically or programmer need to call it explicitly in the program.)
Thanks,
Sushant singhHi Sushant,
1. In ABAP Objects, triggering and handling an event means that certain methods act as triggers and trigger events, to which other methods - the handlers - react. This means that the handler methods are executed when the event occurs.
2.To trigger an event, a class must
Declare the event in its declaration part
Trigger the event in one of its methods
3.You declare events in the declaration part of a class or in an interface. To declare instance events, use the following statement:
EVENTS evt EXPORTING... VALUE(e1 e2 ...) TYPE type [OPTIONAL]..
4. An instance event in a class can be triggered by any instance method in the class. Static events can be triggered by any method. However, static methods can only trigger static events. To trigger an event in a method, use the following statement:
RAISE EVENT evt EXPORTING e1 = f1 e2 = f2 ...
5. Events are handled using special methods. To handle an event, a method must
be defined as an event handler method for that event
be registered at runtime for the event.
Declaring Event Handler Methods
Any class can contain event handler methods for events from other classes. You can, of course, also define event handler methods in the same class as the event itself. To declare an event handler method, use the following statement:
METHODS meth FOR EVENT evt OF cif IMPORTING e1 e2 ...
6. Registering Event Handler Methods
To allow an event handler method to react to an event, you must determine at runtime the trigger to which it is to react. You can do this with the following statement:
SET HANDLER h1 h2 ... [FOR]...
It links a list of handler methods with corresponding trigger methods. There are four different types of event.
7. Timing of Event Handling
After the RAISE EVENTstatement, all registered handler methods are executed before the next statement is processed (synchronous event handling). If a handler method itself triggers events, its handler methods are executed before the original handler method continues. To avoid the possibility of endless recursion, events may currently only be nested 64 deep.
Handler methods are executed in the order in which they were registered. Since event handlers are registered dynamically, you should not assume that they will be processed in a particular order. Instead, you should program as though all event handlers will be executed simultaneously.
Reward if useful. -
Hi guys,
i need the framework of event handling in BSP. if have multiple controls on my BSP (with flow logic, how ican capture each event occured by each control.
a- i have two radiobutton groups, each have two radiobuttons.
b- i have a tableview, if user select a row i need the value of the selected row.
c- i have a button, onclick i want to handle all the events, checked radiobuttons value, selected row to do a action or navigation.in the event click of the button (oninputprocessing)
you can get the value of other objects (radiobutton, tableview etc,
you have to do something like below.
for tableview
DATA: table TYPE REF TO cl_htmlb_tableview .
table ?= cl_htmlb_manager=>get_data( request = request
name = 'tableView'
id = 'TV1' ).
for radiobuttons
data: radiobuttongroup1 type ref to cl_htmlb_radiobuttongroup.
data: radiobuttongroup2 type ref to cl_htmlb_radiobuttongroup.
radiobuttongroup1 ?= cl_htmlb_manager=>get_data(
request = runtime->server->request
name = 'radioButtonGroup'
id = 'RBG1' ).
if radiobuttongroup1 is not initial.
r1sel = radiobuttongroup1->selection.
endif.
radiobuttongroup2 ?= cl_htmlb_manager=>get_data(
request = runtime->server->request
name = 'radioButtonGroup'
id = 'RBG2' ).
if radiobuttongroup2 is not initial.
r2sel = radiobuttongroup2->selection.
endif.
Hope this helps.
Regards
Raja -
Event Handler Between Reboot states using Powershell
Hi,
I need some help writing an event handler for a powershell script that would meet the following requirement:
1. Continue Upon a restart
2. Continue Upon a sleep state
3. Continue Upon a hibernation state.One way that I can see that would meed all three of your requirements is to use a permanent WMI Consumer to watch the event log for each of these type of events and then perform an action.
http://learn-powershell.net/2013/08/14/powershell-and-events-permanent-wmi-event-subscriptions/
It would be best to make a filter for each type of event rather than throwing all into one filter. Depending on your OS, the event IDs may be different, but it is nothing that a quick query via a search engine could find for you.
Boe Prox
Blog |
Twitter
PoshWSUS |
PoshPAIG | PoshChat |
PoshEventUI
PowerShell Deep Dives Book -
What's different between event handle by bsp frame & MAC
Hi,
Can anyone know the different between event handle by BSP frame & handle by MAC?
and how to know which event is handle by BSP frame or MAC?
thanks
GangHi Abdul,
So that means the add_entry event is standard event handle by BSP frame.
thanks
Gang -
Button not triggering event handler in bsp
Hi
I hav e created button in bsp using htmlb component but it is not triggering onInputProcessing event handler
in bsp when i click on button in webpage. Can any body pls provide me solution.
Regards.
MukeshHi Mukesh
Please check if the following link works for you:
http://help.sap.com/saphelp_nw70/helpdata/en/5d/64a0ed34c59e4c9754be5c0759c7c0/content.htm
and
http://help.sap.com/SAPHELP_NW70/helpdata/EN/60/1f1f056f057d4d962375efd3c92ed0/content.htm
Regards
Chen -
BSP extension "download" - event handling problem
Folks,
First of all, I apologize if the answer is already out there, but I spent quite some time to find the solution for my problem but finally gave up:
I implemented the Download extension from Brian's and Tom's book. Since I am using an MVC based app, I put the event handling in the DO_HANDLE_EVENT of a controller instead of the OnInputProcessing event of a page. Here's how my app is designed:
I have a main controller that has an execute button to trigger a data selection based on some selection criteria. The result of this selection is displayed by means of a subcontroller with tableviews that are wrapped into my zdownload extension. Everything works fine: I make my selections, execute the app through the button of the main controller and get my result shown in the tableviews. I push the download icon, select my file format (XLS, HTML etc), get the dialog to choose whether to download or to display the file, perfect!
But now after I processed the download successfully - if I click the execute button in the main controller again, I still get the download dialog. It looks like the created event for the download does not get cleared. As I mentioned, I searched through SDN, but all I found were referrals to the call of DISPATCH_INPUT( ) in DO_REQUEST of the main controller, but unfortunately this one is already implemented.
Any ideas?
Thanks,
GuentherThere is an attribute of the download extension called display_url. You pass a value to the extension telling it what cached URL contains the binary content for your download. if this display_url attribute has a value assigned to it, then the element will render an iFrame to call the URl. However if the display_url attribute is empty, it won't render the iFrame. I suspect that you have a stateful application and after your download event you aren't clearing whatever field that you pass into the display_url attribute.
-
Event handling in multi state application
Hi
I am developing a flex application. I have a problem with
event handling. my application has a common header with 4 buttons
like edit,save,new and cancel. I created a header component with
these 4 buttons.I attached click events to these buttons but How
can I handle the events.because if I am in form1 it should go to
form1 event handler. I have more than 20 forms with this
header.each form is inside view stack. please give me some
solution. is there a way to dispatch the event depending on the
child loaded . thanksYou might look at the Mate framework. It offers an EventMap
class that might be quite useful in this situation.
Link:
http://mate.asfusion.com/ -
What is the correct process to return errors from an Event Handler
I have a pre-Create and pre-Modify Event Handlers. If the event handler detects an error, I want to throw an exception back to terminate the create user or modify user event. I also want to display a meaningful error message on the OIM UI. In my pre-modify event handler I am throwing the following exception when an error is detected:
throw new EventFailedException(processId, null, "User ID not available", "", "MODIFY", null);
However, the OIM UI is not displaying the message "User ID not available" as I want it to. Instead it is displaying the following error message:
An error occurred. The corresponding error code is IAM-0080062
Does anyone know where that error code is coming from? My event handler is not doing that. Also, does anyone know where I can find any documentation on the proper use of the EventFailedException? What do the parameters mean? How do I get a meaningful error message to display on the OIM UI?
Thank you for any help here.
-DavePlease try to cancel the PO 1st and then Cancel Sales order...
Refer following note id
How to Cancel a Drop Ship Order Line (Doc ID 393688.1)
Thanks -
Event handler when using partial page refresh ?
Hi
I have a calendar, which uses partial page refresh. The problem is how to make javascript wait until the calendar has loaded and then do some updates on the calendar (after the user has pressed the next button that runs apex.widget.calendar.ajax_calendar('S','next');, for example ). I thought I could add "onreadystatechange" (or onload) event handler to the calendar like this: onreadystatechange="checkState()", where the function would check the state and if ready then do the updates. This doesn't work. Could somebody please tell me why not ?
TiinaHi,
It seems that ajax calendar missing event apexafterrefresh.
I do not know is this "bug" or just feature.
That event would be useful to your case , if I understand correct what you looking for.
For workaround , you can over write original function by placing this to calendar region footer
<script>
apex.widget.calendar.ajax_calendar=function(p_calendar_type, p_calendar_action, p_calendar_date, p_calendar_end_date){
var l_cal_type_field = $v('p_cal_type_field_id');
var l_cal_date_field = $v('p_cal_date_field_id');
var l_cal_end_date_field = $v('p_cal_end_date_field_id');
var l_cal_id = $v('p_calendar_id');
var l_calendar_region = 'calendar' + l_cal_id;
if ( p_calendar_type != 'C' ){
$s(l_cal_date_field,$v('p_calendar_date'));
}else{
if ( $v(l_cal_date_field) == '' ) {
$s(l_cal_date_field,$v('p_calendar_date'));
if ( $v(l_cal_end_date_field) == '' ) {
$s(l_cal_end_date_field,$v('p_calendar_end_date'));
// create and apex.ajax.widget object
var a = new apex.ajax.widget('calendar',function(){
/* start the return function */
if(p.readyState == 1){
document.body.style.cursor = "wait";
}else if(p.readyState == 2){
}else if(p.readyState == 3){
}else if(p.readyState == 4){
$x(l_calendar_region).innerHTML = p.responseText ;
$s(l_cal_date_field,$v('p_calendar_date'));
if (p_calendar_type == 'C') $s(l_cal_end_date_field,$v('p_calendar_end_date'));
document.body.style.cursor = "";
/* DO HERE THINGS AFTER CALENDAR REFRESH */
}else{return false;}
// code for next,previous and today
if (p_calendar_type == 'S'){
p_calendar_type = $v('p_calendar_type');
}else{
$s(l_cal_type_field,p_calendar_type);
a.ajax.addParam('p_widget_mod',p_calendar_type);
a.ajax.addParam('p_widget_action',p_calendar_action);
a.ajax.addParam('x01',l_cal_id);
var lDate = (!!p_calendar_date && p_calendar_date !== '')?p_calendar_date:$v(l_cal_date_field);
if (p_calendar_type == 'C') {
var lendDate = (!!p_calendar_end_date && p_calendar_end_date !== '')?p_calendar_end_date:$v(l_cal_end_date_field);
a.ajax.add(l_cal_date_field,lDate);
if (p_calendar_type == 'C') a.ajax.add(l_cal_end_date_field,lendDate);
a.ajax.addParam('x02',lDate);
if (p_calendar_type == 'C') a.ajax.addParam('x05',lendDate);
a.ajax.add(l_cal_type_field,p_calendar_type);
a._get();
</script>Where I have comment *"do here things after calendar refresh"*, you can hook own scripts.
Of course this is not best way, but might help you till ajax calendar support dynamic actions fully
Regards,
Jari
Edited by: jarola on Oct 20, 2010 3:11 PM -
Event handler for dropdownlistbox how to determine selection ?
Hello,
As a newby in BSP programming, I'm trying to build a small application with a menu structure . This menu is defined in a page fragment and consists of dropdownlistboxes. The event handling is located in the main page which contains the page fragment.
My problem is that I cannot get these dropdownlist boxes to work. The coding in the page fragment is :
==========================
<htmlb:content>
<htmlb:form>
<htmlb:dropdownListBox id = "myDropdownListBox1"
tooltip = "Tooltip for my DropdownListBox"
onClientSelect = "alert('myDropdownListBox1')"
onSelect = "mySelect" >
<htmlb:listBoxItem key = "k1"
value = "MenuChoice1" />
<htmlb:listBoxItem key = "k2"
value = "MenuChoice2" />
<htmlb:listBoxItem key = "k3"
value = "MenuChoice3" />
<htmlb:listBoxItem key = "k4"
value = "MenuChoice4" />
<htmlb:listBoxItem key = "k5"
value = "MenuChoice5" />
<htmlb:listBoxItem key = "k6"
value = "MenuChoice6" />
</htmlb:dropdownListBox>
</htmlb:form>
</htmlb:content>
==========================
The event handler ( OnInputProcessing ) code is :
==========================
CLASS CL_HTMLB_MANAGER DEFINITION LOAD.
DATA: event TYPE REF TO if_htmlb_data,
ddlb_event TYPE REF TO CL_HTMLB_EVENT_SELECTION.
event = CL_HTMLB_MANAGER=>get_event( runtime->server->request ).
IF event IS NOT INITIAL AND event->event_name =
'dropdownListBox'.
ddlb_event ?= event.
CASE event->event_id.
WHEN 'myDropdownListBox1'.
CASE ddlb_event->selection.
WHEN 'k1'.
.......( Contains other statements )
WHEN 'k2'.
.......( Contains other statements )
WHEN 'k3'.
.......( Contains other statements )
WHEN 'k4'.
.......( Contains other statements )
WHEN 'k5'.
.......( Contains other statements )
WHEN 'k6'.
.......( Contains other statements )
ENDCASE.
ENDCASE.
ENDIF.
==========================
I have tried several different event handlers including the example in the documentation of the dropdownlistbox HTMLB element, but in the event handler I don't know how to determine the selection made.
I would appreciate it hugely if someone could give me an example how to do this ?
With regards,
Fred van de LangenbergHello,
Thanks for your answers & suggestions Subramanian, Ulli & Sebastian.
I forgot the <htmlb:content> tags ( thanks Ulli ) and eventually I got things working with the following :
Main page layout : dopdownlistbox element
<htmlb:dropdownListBox
id = "Ddlb1"
onSelect = "OnInputProcessing" >
selection = "<%= selection1 %>"
<htmlb:listBoxItem key = " "
value = " "/>
<htmlb:listBoxItem key = "k1"
value = "k1" />
<htmlb:listBoxItem key = "k2"
value = "k2" />
<htmlb:listBoxItem key = "k3"
value = "k3" />
<htmlb:listBoxItem key = "k4"
value = "k4" />
<htmlb:listBoxItem key = "k5"
value = "k5" />
</htmlb:dropdownListBox>
Event handler
CLASS CL_HTMLB_MANAGER DEFINITION LOAD.
IF event_id = CL_HTMLB_MANAGER=>EVENT_ID.
Scenario 1: Read event from manager.
DATA: event TYPE REF TO CL_HTMLB_EVENT.
event = CL_HTMLB_MANAGER=>get_event( runtime->server->request ).
IF event IS NOT INITIAL AND event->name = 'dropdownListBox'.
DATA: data TYPE REF TO CL_HTMLB_DROPDOWNLISTBOX.
data ?= CL_HTMLB_MANAGER=>GET_DATA(
request = runtime->server->request
name = 'dropdownListBox'
id = 'Ddlb1'
CASE data->selection.
WHEN 'k1'.
WHEN 'k2'.
WHEN 'k3'.
WHEN 'k4'.
WHEN 'k5'.
ENDCASE.
ENDIF.
ENDIF.
Fred van de Langenberg -
Return statement inside AddEventListener?
I am writing a custom function that will add a component to
the stage. However, I want to postpone adding this component until
some data has been loaded. Problem is that placing the return
statement inside the Event handler function won't work, because it
would be interpreted as a return statement for the Event handler
function. Is there a way to for instance refer to the parent
function?"Jurgen Beli?n" <[email protected]> wrote in
message
news:gq7jbs$7i4$[email protected]..
>I am writing a custom function that will add a component
to the stage.
>However,
> I want to postpone adding this component until some data
has been loaded.
> Problem is that placing the return statement inside the
Event handler
> function
> won't work, because it would be interpreted as a return
statement for the
> Event
> handler function. Is there a way to for instance refer
to the parent
> function?
>
> private function addDrawer(...):Drawer {
> var newDrawer:Drawer = new Drawer();
>
> drawerContentLoader.addEventListener(Event.COMPLETE,
function
> (event:Event):void {
> newDrawer.DrawerContentXml =
XML(drawerContentLoader.data);
>
> // return newDrawer when loaded.
>
> });
> drawerContentLoader.load(drawerContentRequest);
>
> return newDrawer;
> }
Why not just put your logic inside the handler for the event
where the data
exists for you to actually be able to populate it? -
Using page attribute in event handler method of controller
Hi all,
I have created a page attribute GT_TABLE. I need to use this table in one of the event handler methods of the controller of the same page. I tried to use the GET_ATTRIBUTE method but it always returns an empty table.
Can someone please guide me in this respect.
Thanking you in advance,
Regards,
Sumit.Hi Sumit,
The page attribute you mention (GT_TABLE) it's an internal table, isn't it? So far I know, the value of internal table will gone when BSP finish to load in server. If you want to keep the data in internal table, you need to load the internal table into Session (in one of page event in BSP).
Regards
David -
About Event Handling in user Defined Form (In Addon)
Hi Every One,
Can Anyone Give Me Notes On EventHandling in forms That are Disgened using Sdk UIAPI .Like Button event ,application event, menuevent... etc with saple code
Regards
SrinivasHi Sura,
Hope this helps. C# sample code.
// SAP MANAGE UI API 2005 SDK Sample
// File: CatchingEvents.cs
// Copyright (c) SAP MANAGE
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// BEFORE STARTING:
// 1. Add reference to the "SAP Business One UI API"
// 2. Insert the development connection string to the "Command line argument"
// 1.
// a. Project->Add Reference...
// b. select the "SAP Business One UI API 2005" From the COM folder
// 2.
// a. Project->Properties...
// b. choose Configuration Properties folder (place the arrow on Debugging)
// c. place the following connection string in the 'Command line arguments' field
// 0030002C0030002C00530041005000420044005F00440061007400650076002C0050004C006F006D0056004900490056
using System;
using System.Windows.Forms;
class CatchingEvents {
// This parameter will use us to manipulate the
// SAP Business One Application
private SAPbouiCOM.Application SBO_Application;
private void SetApplication() {
// Use an SboGuiApi object to establish connection
// with the SAP Business One application and return an
// initialized appliction object
SAPbouiCOM.SboGuiApi SboGuiApi = null;
string sConnectionString = null;
SboGuiApi = new SAPbouiCOM.SboGuiApi();
// by following the steps specified above, the following
// statment should be suficient for either development or run mode
sConnectionString = System.Convert.ToString( Environment.GetCommandLineArgs().GetValue( 1 ) );
// connect to a running SBO Application
SboGuiApi.Connect( sConnectionString );
// get an initialized application object
SBO_Application = SboGuiApi.GetApplication( -1 );
public CatchingEvents() {
// set SBO_Application with an initialized application object
SetApplication();
// events handled by SBO_Application_AppEvent
SBO_Application.AppEvent += new SAPbouiCOM._IApplicationEvents_AppEventEventHandler( SBO_Application_AppEvent );
// events handled by SBO_Application_MenuEvent
SBO_Application.MenuEvent += new SAPbouiCOM._IApplicationEvents_MenuEventEventHandler( SBO_Application_MenuEvent );
// events handled by SBO_Application_ItemEvent
SBO_Application.ItemEvent += new SAPbouiCOM._IApplicationEvents_ItemEventEventHandler( SBO_Application_ItemEvent );
// events handled by SBO_Application_ProgressBarEvent
SBO_Application.ProgressBarEvent += new SAPbouiCOM._IApplicationEvents_ProgressBarEventEventHandler( SBO_Application_ProgressBarEvent );
// events handled by SBO_Application_StatusBarEvent
SBO_Application.StatusBarEvent += new SAPbouiCOM._IApplicationEvents_StatusBarEventEventHandler( SBO_Application_StatusBarEvent );
private void SBO_Application_AppEvent( SAPbouiCOM.BoAppEventTypes EventType ) {
// the following are the events sent by the application
// (Ignore aet_ServerTermination)
// in order to implement your own code upon each of the events
// place you code instead of the matching message box statement
switch ( EventType ) {
case SAPbouiCOM.BoAppEventTypes.aet_ShutDown:
SBO_Application.MessageBox( "A Shut Down Event has been caught" + Environment.NewLine + "Terminating Add On...", 1, "Ok", "", "" );
// Take care of terminating your AddOn application
System.Windows.Forms.Application.Exit();
break;
case SAPbouiCOM.BoAppEventTypes.aet_CompanyChanged:
SBO_Application.MessageBox( "A Company Change Event has been caught", 1, "Ok", "", "" );
// Check the new company name, if your add on was not meant for
// the new company terminate your AddOn
// If SBO_Application.Company.Name Is Not "Company1" then
// Close
// End If
break;
case SAPbouiCOM.BoAppEventTypes.aet_LanguageChanged:
SBO_Application.MessageBox( "A Languge Change Event has been caught", 1, "Ok", "", "" );
break;
private void SBO_Application_MenuEvent( ref SAPbouiCOM.MenuEvent pVal, out bool BubbleEvent ) {
// in order to activate your own forms instead of SAP Business One system forms
// process the menu event by your self
// change BubbleEvent to False so that SAP Business One won't process it
BubbleEvent = true;
if ( pVal.BeforeAction == true ) {
SBO_Application.SetStatusBarMessage( "Menu item: " + pVal.MenuUID + " sent an event BEFORE SAP Business One processes it.", SAPbouiCOM.BoMessageTime.bmt_Long, true );
// to stop SAP Business One from processing this event
// unmark the following statement
// BubbleEvent = False
else {
SBO_Application.SetStatusBarMessage( "Menu item: " + pVal.MenuUID + " sent an event AFTER SAP Business One processes it.", SAPbouiCOM.BoMessageTime.bmt_Long, true );
private void SBO_Application_ItemEvent( string FormUID, ref SAPbouiCOM.ItemEvent pVal, out bool BubbleEvent ) {
// BubbleEvent sets the behavior of SAP Business One.
// False means that the application will not continue processing this event.
BubbleEvent = true;
if ( pVal.FormType != 0 ) {
// the message box form type is 0
// I chose not to deal with events triggered by a message box
// every event will open a message box with the event
// name and the form UID how sent it
SAPbouiCOM.BoEventTypes EventEnum = 0;
EventEnum = pVal.EventType;
// To prevent an endless loop of MessageBoxes,
// we'll not notify et_FORM_ACTIVATE and et_FORM_LOAD events
if ( ( EventEnum != SAPbouiCOM.BoEventTypes.et_FORM_ACTIVATE ) & ( EventEnum != SAPbouiCOM.BoEventTypes.et_FORM_LOAD ) ) {
SBO_Application.MessageBox( "An " + EventEnum.ToString() + " has been sent by a form with the unique ID: " + FormUID, 1, "Ok", "", "" );
private void SBO_Application_ProgressBarEvent( ref SAPbouiCOM.ProgressBarEvent pVal, out bool BubbleEvent) {
SAPbouiCOM.BoProgressBarEventTypes EventEnum = 0;
EventEnum = pVal.EventType;
BubbleEvent = true;
SBO_Application.MessageBox( "The event " + EventEnum.ToString() + " has been sent", 1, "Ok", "", "" );
private void SBO_Application_StatusBarEvent( string Text, SAPbouiCOM.BoStatusBarMessageType MessageType ) {
SBO_Application.MessageBox( @"Status bar event with message: """ + Text + @""" has been sent", 1, "Ok", "", "" );
Regards,
Jay.
Maybe you are looking for
-
Setting Third-Party Saxon parser for parsing xml files
Hi, I wish to parse certain xhtml files using saxon parser because that serves our needs. In order to that in tomcat, I used to use the following code - System.getProperties().setProperty("javax.xml.parsers.SAXParserFactory","com.
-
Error in query execution after upgrade
Hi Gurus, 013 An exception with the type CX_SY_CREATE_OBJECT_ERROR occurred, but was neither handled locally, nor declared in a RAISING Message no. RS_EXCEPTION000 013 The object could not be created: The class \CLASS=CL_IM_RS_BCT_PA does
-
Characters not found in embedded font
What font does the TLF uses when it can't find the characters in the embedded font? For example we have a non-latin text (like Arabic, Chinese, ...), but in the text are a few latin-type characters used (a brand name, numbers, ...). TLF won't find th
-
Change FI doc number range indicator from internally to externally assigned
Hi, I created a new numberrange for 2011 but did not check the Ext (external number range indicator). When I try to change it to external by trying to mark the option, it does not work. What can cause this ?? Thanks in advance, regards Peter
-
Every since I updated my itunes, I get error 4850 for burning a disc. How do I fix this error. I am unable to burn a disc. Please help!!!