GET BADI badi [FILTERS f1 = x1 f2 = x2 ...]
... CONTEXT con
: This statement generates a new BAdI object and sets the
BAdI reference to the object in a
BAdI reference variable
badi. The static type of the reference variable badi must be a
BAdI and determines which BAdI is used. In a
context-free BAdI, the addition CONTEXT must not be specified, and in a context-dependent BAdI it must be specified.
After the addition FILTERS, elementary data objects
x1, x2, ...must be specified for all filters
etc. of the BAdI. If a filter in the BAdI has the property constant filter value at call, then you can specify only
constants. The data objects must be compatible
with the data type of the filter. FILTERS cannot be specified for a BAdI without filters.
After instancing, the program searches for BAdI implementation classes for the BAdI as follows:
Only BAdI implementation classes are selected that are assigned to a
BAdI implementation that has the status active.
Only BAdI implementation classes are selected that are assigned to a BAdI implementation (an
enhancement) that have a
switch in the status on.
If no switch is assigned to a BAdI implementation, it is treated in the same way as an implementation with a switch in the status on.
All BAdI implementations are selected that satisfy the above requirements and for which the filter condition
of the BAdI implementation fits the values specified after FILTERS.
If no BAdI implementations are found with the filter specifications, the system searches for BAdI implementations
that are marked as standard implementations. If there are also none of these, the standard BAdI implementation class of the BAdI is used (if one exists).
If for a BAdI defined for single use several BAdI implementation classes with matching filter conditions have been found, then a
conflict solution is carried out. A successful conflict solution results in exactly one priority
conflict-solving enhancement implementation
and only its BAdI implementation class is selected. If several conflict-solving enhancement implementations
have the same priority or if there are no conflict-solving enhancement implementations at all, then a correct conflict solution is not possible and several BAdI implementation classes will remain in the hit list.
If the resulting hit list is suitable for the definition of the BAdI which means:
For a BAdI defined for a single use, the hit list must contain exactly one BAdI implementation class,
For a BAdI defined for multiple use, the hit list may contain several or no BAdI implementation classes,
then references to object plug-ins of the found BAdI implementations are saved in the BAdI object.
Object plug-ins that do not yet exist
are generated for this purpose. Whether an existing object plug-in is generated or reused, or whether
a new object plug-in is generated, depends on whether the BAdI is context-free or context-dependent,
and depends on the CONTEXT addition. The exact semantics is described in the addition.
If the hit list contains no or several BAdI implementations although the BAdI is defined for single
use, an exception occurs. If the BAdI reference variable badi
receives a valid BAdI reference before the statement in an exception case, this is retained, otherwise it is initialized.
: It is not possible to access BAdI objects directly using BAdI references. The references are only used to call the
BAdI methods in the referenced object
plug-ins with the statement CALL BADI. Otherwise, BAdI reference variables can be used in the same operand positions as normal
object reference variables. In particular, this means that assignments and comparisons are possible.
The method NUMBER_OF_IMPLEMENTATIONS of the class CL_BADI_QUERY returns the number of BAdI implementations that are saved in a BAdI object.
The statement GET BADI prepares an
enhancement spot invocation, and can therefore be seen as part of an explicit
enhancement option in the terminology of the enhancement concept.
To prevent the exception for BAdIs that are defined for single use in systems in which no corresponding
enhancement is carried out, it is recommended to specify a standard BAdI implementation class for these BAdIs. The standard BAdI implementation class belongs to the BAdI and is independent of enhancements.
To access object plug-ins directly requires the corresponding references. These can be supplied, for example, by BAdI methods.
The BAdI reference cannot be used to treat any instance events of a BAdI. Instead, when the
event handler is registered, either
the addition FOR ALL INSTANCES must be specified using
SET HANDLER, or an reference to an object plug-in must be entered directly.
... CONTEXT con
: With the addition CONTEXT, for context-dependent BAdIs, an
object reference variable con must be specified, the static type of which is, or includes, the
tag interface IF_BADI_CONTEXT, and which contains a reference to a
BAdI context object. If
con is initial, an exception occurs. The addition CONTEXT can not be entered for context-free BAdIs.
The addition CONTEXT controls the generation of the object plug-ins as follows:
Without the addition CONTEXT, hence for context-free BAdIs,
the generation of the object plug-ins is based on the setting of the BAdI. Either new plug-ins are generated
every time the statement GET BADI is executed, or an object
plug-in that has already been generated in the current internal session is reused, if it is required again. An object plug-in of this type is a singleton in terms of its BAdI implementation class.
With the addition CONTEXT, and hence for context-dependent
BAdIs, the same object plug-ins are always used for the same content of
con. These object plug-ins are singletons in terms of their BAdI implementation class and a BAdI context object.
If a BAdI implementation class implements multiple
BAdI interfaces and
GET BADI is executed within one internal session for several of these BAdIs, then multiple
BAdI objects can point to the same object plug-in. This enables the sharing of data between different
BAdIs. For context-free BAdIs, this is only the case for reuse. For context-dependent BAdIs, several BAdI objects from the same context can point to the same object plug-ins.
: The fact that object plug-ins can either be newly generated or reused can also be expressed in terms of an object plug-in being stateful or stateless with reference to a BAdI or a context.
The tag interface IF_BADI_CONTEXT can be implemented by any class. Possible applications range from
the implementation in a local class without other components that have the sole purpose of enabling
internal program context administration for BAdIs, to the implementation in a global application class in which the objects are specifically enhanced.
Cause: No BAdI implementation class was found, although the BAdI is defined for single use. Subclass of CX_BADI_NOT_SINGLE_USE.
Cause: Several BAdI implementation classes were found, although the BAdI is defined for single use. Subclass of CX_BADI_NOT_SINGLE_USE.
Cause: The reference variable specified after CONTEXT is initial.