How to Programmatically Open a System Form

UPDATE: The code posted below is not the best way to accomplish this task. Instead use the OpenForm method in the Application object. (Pedro Magueija points this out in the comments section below.)

My add-on needed the ability to programmatically open a related form just the way the LinkedButton object does. In my case, my users will be editing a Sales Order form, and they need to pop open a related Production Order whose key resides in the system-defined matrix object holding the order’s lines–not in any control I have added.

I searched for ways to solve this problem, and what I came up with is to create some hidden objects on the form: a LinkedButton connected to an EditText connected to a DataSource. Although I have only tested with Production Orders, I believe I can open any system form that can be opened by a LinkedButton.

I’m posting my code here in case (a) it helps anyone, or (b) someone can chime in with “hey, you dummy! There’s a built-in function you can call directly!” I suspect such a function exists, but SAP’s SDK documentation leaves a lot to be desired.

Here is the code for my solution. I use it by calling CreateLink() when handling the et_FORM_LOAD after-event, then calling OpenLink() when handling et_CLICK on the matrix column containing the key to a related Production Order.

Please comment if this helps you, or if you know of a better way!

 using SAPbouiCOM; namespace Product {   public class SapDocumentLinker {     //--------------------------------------     #region Public Methods     //--------------------------------------     ///      /// Create form objects to support linking to the window of a particular SAP object     ///      /// Form the user is editing     /// 8-character unique link ID string     /// Object type for the link     ///      static public void CreateLink(       SAPbouiCOM.Form form,       string linkId,       BoLinkedObject linkedSapObject     ) {       // Add a DataSource to support an EditText field       var dsId = MakeId( DATA_SOURCE_PREFIX, linkId );       var userDs = form.DataSources.UserDataSources;       userDs.Add( dsId, BoDataType.dt_SHORT_TEXT );       // Add EditText to store the record key of the object we want to link to       var etId = MakeId( EDIT_TEXT_PREFIX, linkId );       var etItem = form.Items.Add( etId, BoFormItemTypes.it_EDIT );       var etSpec = etItem.Specific as EditText;       etItem.AffectsFormMode = false;       etItem.Left = -100;       etItem.Top = -100;       etItem.Width = 10;       etItem.Height = 10;       if ( etSpec != null ) {         etSpec.DataBind.SetBound( true, "", dsId );         etSpec.Value = "";       }       // Add LinkedButton to the EditText, specifying the type of object we link to       var lbId = MakeId( LINKED_BUTTON_PREFIX, linkId );       var lbItem = form.Items.Add( lbId, BoFormItemTypes.it_LINKED_BUTTON );       var lbSpec = lbItem.Specific as LinkedButton;       if ( lbSpec != null ) {         lbItem.LinkTo = etId;         lbSpec.LinkedObject = linkedSapObject;       }     }     ///      /// Open the edit window of the record specified by recordKey and     /// the type specified in SapDocumentLinker.CreateLink()     ///      /// Form the user is editing     /// 8-character unique link ID string     /// Key of the record to open     ///      static public void OpenLink(       Form form,       string linkId,       string recordKey     ) {       // Copy record key into the EditText field       var etId = MakeId( EDIT_TEXT_PREFIX, linkId );       var etSpec = form.Items.Item( etId ).Specific as EditText;       etSpec.Value = recordKey;       // Simulate a click on the associated LinkButton so SAP will open the required form       var lbId = MakeId( LINKED_BUTTON_PREFIX, linkId );       var lbItem = form.Items.Item( lbId );       lbItem?.Click( BoCellClickType.ct_Regular );     }     #endregion Public Methods     //--------------------------------------     #region Non-Public Methods     //--------------------------------------     static private string MakeId( string prefix, string suffix ) {       var id = $"{prefix}{suffix}".Trim();       if ( id.Length > MAX_ID_LENGTH ) {         id = id.Substring( 0, MAX_ID_LENGTH );       }       return id;     }     #endregion Non-Public Methods     //--------------------------------------     #region Fields     //--------------------------------------     private const int MAX_ID_LENGTH = 10;     private const string DATA_SOURCE_PREFIX = "Ds";     private const string EDIT_TEXT_PREFIX = "Et";     private const string LINKED_BUTTON_PREFIX = "Lb";     #endregion Fields   } } 

New NetWeaver Information at SAP.com

Very Helpfull

User Rating: Be the first one !
Comments (0)
Add Comment