Object Oriented XML Instances - existing standard?

Hi All
I am in search for a standard/package that can remove
redundancy and reduce inconsistencies in XML. It ought
to be done by using object oriented XML instances. I do
not mean XML schema languages like SOX. The
concept I refer to is used earlier on in the config-file. I
have implemented a simple version but as soon as I
realized its potential I also realized that there has to be
an existing standard out there. I have searched the web
without any luck, but since I am new to XML there is a big
chance that I have missed it. I would be grateful if anyone
could point me in the right direction.
To clarify I have an example. Its a small part from the
config-file used by my database bridge and this part is
used to define fields and tables. Following two attributes
are reserved
1. did - the identity of this instance. The name space for
this definition is restricted to the tag name, but can be
seen from anywhere in the project.
2. eid - the identity of the instance that this instance extends.
<database did="my database">
  <field_definitions>
    <field did="super" key="no" unique="no" visible="yes" allow_null="no"/>
    <field did="boolean" eid="super" class="ops.dbb.FieldBoolean"
           default="false"/>
    <field did="integer" eid="super" class="ops.dbb.FieldInteger"
           default="0" display_size="10"/>
    <field did="auto_inc" eid="integer" class="ops.dbb.FieldAutoInc"
        key="yes" unique="yes" name="id" visible="no"/>
    <field did="string" eid="super" class="ops.dbb.FieldString"/>
    <field did="string_10" eid="string" size="10"/>
    <field did="note" eid="string" size="50" name="note" allow_null="yes"/>
  </field_definitions>
  <tables>
    <table did="users">
      <field eid="auto_inc"/>
      <field did="username" eid="string_10"/>
      <field did="password" eid="string_10" visible="no"/>
      <field eid="note"/>
    </table>
    <table did="admin_users" eid="users">
      <field did="security_level" eid="integer"/>
    </table>
  </tables>
</database>If there are only a few tables this might not be
justified, but used in a project with hundreds of
tables, this will help considerable.
As fun as it is to reinvent the wheel, I am trying
not to.

Either there are functions in JAXB that I am missing
or you are misunderstanding me jmwollny. I understand
that given a valid XSD schema JAXB will generate
interfaces and classes that I can work with instead of
working with XML files directly. This is really cool,
but it is not the concept I am looking for. When I
write 'Object Oriented XML Instances' I do not
referring to Java, I mean that the XML elements in the
config-file are capable of inheritance, creating
interfaces, creating abstract elements and more. Here
is a smaller example.
  <field did="super" key="no" unique="no"/>
  <field did="integer" eid="super" unique="yes"/>If we take a look at the second field where
did="integer", it is inheriting the attribute key="no"
from the field where did="super" since the attribute
eid="super" exists. We can also see that since
polymorphism is supported, unique="yes" in the second
field is replacing unique="no" in the first field.
The reason why I think this is helpful is because it
will reduce redundancy and inconsistencies in the
config-file.

Similar Messages

  • How do I check if section and subdivision exist inside object's xml?

    My function is working but not as I expect it to. The problem is that when Section and Subvision are not found in the object aobjXmlGetStatuteRequestNode xml, I get an error NullReference Exception was unhandled by user code. Object reference not set
    to an instance of an object. 
    For that reason, because the two elements are optional, I would like to check if they exist before adding their value into the xml inside the object objXmlRequestMessageDoc.
    The if statement I used in my function did not work. When it found Section element, it did not check for Subdivision. 
    How do I check for both and add them if they exist. If they do not exist, I do not need to do anything and should not throw an error since they are optional.
     Object aobjXmlGetStatuteRequestNode has this xml
    <ns:GetStatutesRequest xmlns:ns="http://www.courts.state.mn.us/StatuteService/1.0">
    <ns:Statute>
    <ns:Chapter>169</ns:Chapter>
    <!--Optional:-->
    <ns:Section>191</ns:Section>
    <!--Optional:-->
    <ns:Subdivision>a</ns:Subdivision>
    </ns:Statute>
    The following output in the objXmlRequestMessageDoc object is correct but this does not work when Section and or Subdivision are not found in the object aobjXmlGetStatuteRequestNode.
    <ns:BasicSearchQueryRequest xmlns:ns="http://crimnet.state.mn.us/mnjustice/statute/service/4.0">
    <ns1:BasicSearchCriteria xmlns:ns1="http://crimnet.state.mn.us/mnjustice/statute/messages/4.0">
    <ns2:Chapter xmlns:ns2="http://crimnet.state.mn.us/mnjustice/statute/4.0"/169</ns2:Chapter>>
    <ns2:Section xmlns:ns2="http://crimnet.state.mn.us/mnjustice/statute/4.0"/>191</ns2:Chapter>
    <ns2:Subdivision xmlns:ns2="http://crimnet.state.mn.us/mnjustice/statute/4.0"/>a</ns2:Chapter>
    </ns1:BasicSearchCriteria>
    </ns:BasicSearchQueryRequest>
    My Function
    Function GetStatutesByChapter(ByVal aobjXmlGetStatuteRequestNode As XmlNode, ByVal aobjXMLNameSpaceManager As XmlNamespaceManager, ByVal aobjBroker As ServiceCatalog.Library.v4.Broker) As XmlDocument
    Dim objXmlRequestMessageDoc As XmlDocument
    Dim objXmlResponseMessageDoc As XmlDocument
    Dim intCount As Integer
    aobjBroker.PostMessageWarehouseInformationalMessage("Chapter found.", 1)
    objXmlResponseMessageDoc = New XmlDocument
    'Add the first element into the document GetStatuteByChapter with its namespace
    objXmlResponseMessageDoc.AppendChild(objXmlResponseMessageDoc.CreateElement("BasicSearchQueryResponse", "http://crimnet.state.mn.us/mnjustice/statute/service/4.0"))
    'Create the BCA request message
    objXmlRequestMessageDoc = New XmlDocument
    objXmlRequestMessageDoc.AppendChild(objXmlRequestMessageDoc.CreateElement("ns:BasicSearchQueryRequest", aobjXMLNameSpaceManager.LookupNamespace("ns")))
    objXmlRequestMessageDoc.SelectSingleNode("ns:BasicSearchQueryRequest", aobjXMLNameSpaceManager).AppendChild(objXmlRequestMessageDoc.CreateElement("ns1:BasicSearchCriteria", aobjXMLNameSpaceManager.LookupNamespace("ns1")))
    objXmlRequestMessageDoc.SelectSingleNode("ns:BasicSearchQueryRequest/ns1:BasicSearchCriteria", aobjXMLNameSpaceManager).AppendChild(objXmlRequestMessageDoc.CreateElement("ns2:Chapter", aobjXMLNameSpaceManager.LookupNamespace("st")))
    objXmlRequestMessageDoc.SelectSingleNode("ns:BasicSearchQueryRequest/ns1:BasicSearchCriteria", aobjXMLNameSpaceManager).AppendChild(objXmlRequestMessageDoc.CreateElement("ns2:Section", aobjXMLNameSpaceManager.LookupNamespace("st")))
    objXmlRequestMessageDoc.SelectSingleNode("ns:BasicSearchQueryRequest/ns1:BasicSearchCriteria", aobjXMLNameSpaceManager).AppendChild(objXmlRequestMessageDoc.CreateElement("ns2:Subdivision", aobjXMLNameSpaceManager.LookupNamespace("st")))
    objXmlRequestMessageDoc.DocumentElement.SelectSingleNode("ns1:BasicSearchCriteria/st:Chapter", aobjXMLNameSpaceManager).InnerText = aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Chapter", aobjXMLNameSpaceManager).InnerText
    objXmlRequestMessageDoc.DocumentElement.SelectSingleNode("ns1:BasicSearchCriteria/st:Section", aobjXMLNameSpaceManager).InnerText = aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Section", aobjXMLNameSpaceManager).InnerText
    objXmlRequestMessageDoc.DocumentElement.SelectSingleNode("ns1:BasicSearchCriteria/st:Subdivision", aobjXMLNameSpaceManager).InnerText = aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Subdivision", aobjXMLNameSpaceManager).InnerText
    'check if there is a section and or subdivision if it is there then set the value
    'If Not (aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Section", aobjXMLNameSpaceManager).InnerText) Is Nothing Then
    ' objXmlRequestMessageDoc.DocumentElement.SelectSingleNode("ns1:BasicSearchCriteria/st:Section", aobjXMLNameSpaceManager).InnerText = aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Section", aobjXMLNameSpaceManager).InnerText
    'End If
    'check if there is a section and or subdivision if it is there then set the value
    aobjBroker.PostMessageWarehouseSnapshot(objXmlRequestMessageDoc.OuterXml, "Request Message", 1)
    'Call the BCA service
    intCount = 0
    'Count how many Statute node found
    CType(objXmlResponseMessageDoc.SelectSingleNode("ss:GetStatutesResponse/ss:StatutesXml/ss:Statutes", aobjXMLNameSpaceManager), System.Xml.XmlElement).SetAttribute("totalCount", CStr(intCount))
    Return objXmlResponseMessageDoc
    End Function

    I have resolved this issue by using two if statements as follows
    'check if there is a section and or subdivision if it is there then set the value
    If Not (aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Section", aobjXMLNameSpaceManager) Is Nothing) Then
    objXmlRequestMessageDoc.DocumentElement.SelectSingleNode("ns1:BasicSearchCriteria/st:Section", aobjXMLNameSpaceManager).InnerText = aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Section", aobjXMLNameSpaceManager).InnerText
    End If
    If Not (aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Subdivision", aobjXMLNameSpaceManager) Is Nothing) Then
    objXmlRequestMessageDoc.DocumentElement.SelectSingleNode("ns1:BasicSearchCriteria/st:Subdivision", aobjXMLNameSpaceManager).InnerText = aobjXmlGetStatuteRequestNode.SelectSingleNode("ss:Statute/ss:Subdivision", aobjXMLNameSpaceManager).InnerText
    End If

  • How to save the instance in standard lead from custom business object

    Hi Experts,
              I am unable to save the instance(Record) in standard Lead business object from custom business object.
    Steps:
    created one custom business object with mandatory fields for creating instance in standard lead.
    in quick create screen i bind  data elements to standard lead business object elements.
    issue:
    when i click on preview i am getting exception as Arguments not found
    can you please tell me that How to save the instance in standard lead from custom business object with step by step .

    Hi Vijay,
    Please refer this link under that mentioned that how to create lead using ABSL code
    Web 2 Lead in SAP Cloud for Customer, step by step - Part 1 - myCloudDoor myCloudDoor
    Under the "Action-CreateLead.absl" mentioned how to create lead
    the above link for convert web 2 lead functionality and under they create lead using web data from ABSL code.
    Regards,
    Mithun

  • Error while loadjava xmlparserv2.jar: ORA-04043: object oracle/xml/.. does not exist

    In Oracle8i.15, I tried to install xmlparserv2.jar after I downloaded xdk_plsql_9_2_0_2_0.zip and upzip to local machine.
    However, when I issued the follwoing command:
    loadjava -v -r -user SYSTEM/manager -force xmlparserv2.jar
    For each class, it has the following error message:
    resolving: oracle/xml/async/DOMBuilderErrorListener
    Error while resolving class oracle/xml/async/DOMBuilderErrorListener
    ORA-04043: object oracle/xml/async/DOMBuilderErrorListener does not exist
    resolving: oracle/xml/comp/CXMLParser
    Error while resolving class oracle/xml/comp/CXMLParser
    ORA-04043: object oracle/xml/comp/CXMLParser does not exist
    How can I solve this problem?
    Thanks in advance.

    Do you mean you use 8.1.5? You can't directly load the xmlparserv2.jar to it.

  • Multiple instances of an Object-Oriented Scrollbar?

    Hi everyone, Ive gone through the Object-Oriented Scrollbar tutorial on gotoandlearn.com. Its working great and I have multiple buttons inside of the moveclip it lives within. The problem occurs when I create another one on the same page. I have put one on frame 1 and the other on frame 5 so that I can select a 'category' and the scrollbar movieclip changes to the relevant buttons.
    Ive duplicated the movie clips and changed the instances accordingly. I keep getting these errors in the Output panel when playing my swf;
    TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at as3_movieplayer_fla::MainTimeline/frame1()
    and when I click the like to the second category it comes up with this error;
    TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at as3_movieplayer_fla::scrollbox_1/thumbUp()
    Not really sure what im doing wrong - or even what these mean!
    Here is the code from my main actions layer;
    stop();
    //buttons
    btn_advertising.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    function mouseDownHandler(event:MouseEvent):void {
        gotoAndStop(1);
    btn_corporate.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler2);
    function mouseDownHandler2(event:MouseEvent):void {
        gotoAndStop(5);
    //video player script
    function videoOne(event:MouseEvent):void{
       vidPlayer.source = "flvs/ib_enginuity.flv";
    function videoTwo(event:MouseEvent):void{
       vidPlayer.source = "flvs/ib_blists_hill.flv";
    function videoOneCorp(event:MouseEvent):void{
       vidPlayer.source = "flvs/ib_explore_enjoy.flv";
    function videoTwoCorp(event:MouseEvent):void{
       vidPlayer.source = "flvs/ib_great_year_visit.flv";
    //text script
    function button1text(event:MouseEvent):void{
       textBox.text = "Ironbridge - Enginuity";
    function button2text(event:MouseEvent):void{
       textBox.text = "Ironbridge - Blists Hill";
    function button1CORPtext(event:MouseEvent):void{
       textBox.text = "Ironbridge - A Place to Explore and Enjoy";
    function button2CORPtext(event:MouseEvent):void{
       textBox.text = "Ironbridge - A Great Year to Visit";
    //event listeners
    scrollbox.content.button1.addEventListener(MouseEvent.CLICK,videoOne);
    scrollbox.content.button1.addEventListener(MouseEvent.CLICK,button1text);
    scrollbox.content.button2.addEventListener(MouseEvent.CLICK,videoTwo);
    scrollbox.content.button2.addEventListener(MouseEvent.CLICK,button2text);
    scrollboxCorp.content.button1Corp.addEventListener(MouseEvent.CLICK,videoOneCorp);
    scrollboxCorp.content.button1Corp.addEventListener(MouseEvent.CLICK,button1CORPtext);
    scrollboxCorp.content.button2Corp.addEventListener(MouseEvent.CLICK,videoTwoCorp);
    scrollboxCorp.content.button2Corp.addEventListener(MouseEvent.CLICK,button2CORPtext);
    and also the code from my actions layer inside my movieclip which is on frame 5;
    import caurina.transitions.*;
    var yOffset:Number;
    var yMin:Number = 0;
    var yMax:Number = sb.track.height - sb.thumb.height;
    sb.thumb.addEventListener(MouseEvent.MOUSE_DOWN, thumbDown);
    stage.addEventListener(MouseEvent.MOUSE_UP, thumbUp);
    function thumbDown(e:MouseEvent):void
       stage.addEventListener(MouseEvent.MOUSE_MOVE, thumbMove);
       yOffset = mouseY - sb.thumb.y;
    function thumbUp(e:MouseEvent):void
       stage.removeEventListener(MouseEvent.MOUSE_MOVE, thumbMove);
    function thumbMove(e:MouseEvent):void
       sb.thumb.y = mouseY - yOffset;
       if(sb.thumb.y <= yMin)
          sb.thumb.y = yMin;
       if(sb.thumb.y >= yMax)
          sb.thumb.y = yMax;
       var sp:Number = sb.thumb.y / yMax;
       Tweener.addTween(contentCorp, {y:(-sp*(contentCorp.height-masker.height)),
                            time:1});
       e.updateAfterEvent();
    Please help me iron out these problems!!! Many thanks
    Dan Williams

    hum thats interesting. Could it be my flash player?
    Ive 'published' it as an .exe and it works fine.
    If i publish to html, the flash player box comes up with that error in it.
    If you dismiss all errors then it works fine!?
    The error appears in the output part. Its referencing scrollbox_1::frame1:18, but I dont have anything called scrollbox_1?! not sure what is going on.
    ignore all that. I just tried exporting it as flash 9 rather than flash 10 and the error has gone!
    I suppose thats the answer then!
    Thanks for all your help anyway ned, was much appreciated.
    Kind Regards
    Dan

  • Object oriented programming aspects in Oracle

    Dear All,
    Can you one explain me the aspects of Object Oriented Programming in Oracle. How to use oops concepts in Oracle Procedures, functions, packages, etc.
    Thanks,
    Moorthy.GS

    Oracle 9i introduces support for inheritance, method overriding and dynamic method dispatch (or "dynamic binding", or "virtual").
    A method call is dispatched to the nearest implementation, working back up the inheritance hierarchy from the current or specified type.
    See, for example, how we can implement the Template Design Pattern in PL/SQL, using inheritance, method overriding and dynamic method dispatch:
    http://www.quest-pipelines.com/pipelines/plsql/tips06.htm#OCTOBER
    Oracle 11g introduces support for "super" object-oriented keyword. One attempt to do this in PLSQL 9i/10g:
    Calling the Parent Object's Version of an Overridden Method
    http://www.quest-pipelines.com/pipelines/plsql/tips03.htm#JUNE
    I expect some OO improvements in the future (in Oracle 12oo ...):
    1. References between transient objects (instances of objects types) and (then) garbage collector
    2. Generic classes (templates, generics) like in Eiffel, C++, Java 5 (PL/SQL was modeled after ADA 83, and ADA 83 has generic packages)
    3. Multiple inheritance like in Eiffel (inner classes like in Java - no, please)
    4. Design By Contract like in Eiffel (C++ / Java 1.4 assert is not enough)
    Design by contract (DBC) is a method whose author is Bertrand Mayer, also maker of OOPL language Eiffel
    (Eiffel was designed in 1985, commercialy released in 1986, ISO-standardized in 2006).
    Simplified, DBC is based on principle that in each routine (procedure or function) with standard code,
    two additional parts – PRECONDITION and POSTCONDITION - need to be asserted.
    An additional assertion in class is called INVARIANT.
    Contract is based on routine's putting up an obligation to caller (to some other routine)
    to satisfy conditions of precondition and conditions of invariant, and hers (called routine's) obligation
    to satisfy conditions of postcondition and conditions of invariant.
    The object oriented Eiffel programming language was created to implement DBC.
    For now, other OO (object-oriented) languages don’t support directly the ideas behind DBC.
    However, precondition and postcondition are applicable to many programming languages, both OO and not OO.
    Invariants are applicable only in OOPL.
    This is my attempt to use DBC methodology (including invariants) in Oracle PL/SQL.
    Eiffel class interface (not like Java interface, but more like PL/SQL package specification)
    from Bertrand Meyer's book "Object oriented software construction", second edition (OOSC2), 1997, page 390-391:
    class interface STACK [G]
    creation make
    feature -- Initialization
      make (n: INTEGER) is -- Alocate stack for a maximum of n elements
        require
          non_negative_capacity: n >= 0
        ensure
          capacity_set: capacity = n
        end
    feature -- Access
      capacity: INTEGER -- Maximum number of stack elements
      count: INTEGER -- Number of stack elements
      item: G is -– Top element
        require
          not_empty: not empty
        end
    feature -- Status report
      empty: BOOLEAN is –- Is stack empty?
        ensure
          empty_definition: Result = (count = 0)
        end
      full: BOOLEAN is –- Is stack full?
        ensure
          full_definition: Result = (count = capacity)
        end
    feature -- Element change
      put (x: G) is –- Add x on top
        require
          not_full: not full
        ensure
          not_empty: not empty
          added_to_top: item = x
          one_more_item: count = old count + 1
        end
      remove is -– Remove top element
        require
          not_empty: not empty
        ensure
          not_full: not full
          one_fewer: count = old count - 1
        end
    invariant
      count_non_negative: 0 <= count
      count_bounded: count <= capacity
      empty_if_no_elements: empty = (count = 0)
    end -– class interface STACK
    -- PL/SQL "equivalent":
    -- Stack implementation - TABLE of INTEGER.
    -- Eiffel has generic classes (like C++ templates and better than Java generics).
    -- PL/SQL (now) has not generic classes or generic packages.
    CREATE OR REPLACE TYPE array_t AS TABLE OF INTEGER
    -- utility package:
    CREATE OR REPLACE PACKAGE dbc AS
      -- 0 = no check
      -- 1 = check preconditions
      -- 2 = check preconditions + postconditions
      -- 3 = check preconditions + postconditions + invariants
      c_no_check                  CONSTANT INTEGER := 0;
      c_check_preconditions       CONSTANT INTEGER := 1;
      c_check_pre_postconditions  CONSTANT INTEGER := 2;
      c_check_pre_post_invariants CONSTANT INTEGER := 3;
      FUNCTION check_preconditions       RETURN BOOLEAN;
      FUNCTION check_pre_postconditions  RETURN BOOLEAN;
      FUNCTION check_pre_post_invariants RETURN BOOLEAN;
      PROCEDURE set_level (p_level INTEGER);
      PROCEDURE display_error (p_error VARCHAR2);
    END;
    CREATE OR REPLACE PACKAGE BODY dbc AS
      m_level INTEGER := c_no_check;
      FUNCTION check_preconditions RETURN BOOLEAN IS
      BEGIN
        IF m_level >= c_check_preconditions THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;  
      END;
      FUNCTION check_pre_postconditions RETURN BOOLEAN IS
      BEGIN
        IF m_level >= c_check_pre_postconditions THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;  
      END;
      FUNCTION check_pre_post_invariants RETURN BOOLEAN IS
      BEGIN
        IF m_level >= c_check_pre_post_invariants THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;  
      END;
      PROCEDURE set_level (p_level INTEGER) IS
      BEGIN
        IF p_level NOT IN
          (c_no_check, c_check_preconditions, c_check_pre_postconditions, c_check_pre_post_invariants)
        THEN
          RAISE_APPLICATION_ERROR (-20000, 'Wrong checking level');
        END IF;
        m_level := p_level;
      END;
      PROCEDURE display_error (p_error VARCHAR2) IS
      BEGIN
        RAISE_APPLICATION_ERROR (-20000, 'ERROR in method ' || p_error);
      END;
    END;
    CREATE OR REPLACE TYPE stack AS OBJECT (
      -- Maximum number of stack elements
      capacity INTEGER,
      -- Number of stack elements
      el_count INTEGER,
      -- Stack implementation
      stack_implementation array_t,
      -- Alocate stack for a maximum of n elements
      CONSTRUCTOR FUNCTION stack (n INTEGER) RETURN SELF AS RESULT,
      -- Top element
      MEMBER FUNCTION item (SELF IN OUT stack) RETURN INTEGER,
      -- Is stack empty?
      MEMBER FUNCTION empty RETURN BOOLEAN,
      -- Is stack full?
      MEMBER FUNCTION full RETURN BOOLEAN,
      -- Add x on top
      MEMBER PROCEDURE put (x INTEGER),
      -- Remove top element
      MEMBER PROCEDURE remove,
      -- INVARIANTS
      -- Note:
      -- If subprogram is declared in an object type body (in PL/SQL 8i/9i/10g)
      -- it must be defined in the object type specification too.
      MEMBER FUNCTION count_non_negative RETURN BOOLEAN,
      MEMBER FUNCTION count_bounded RETURN BOOLEAN,
      MEMBER FUNCTION empty_if_no_elements RETURN BOOLEAN,
      MEMBER PROCEDURE check_invariants
    ) NOT FINAL;
    CREATE OR REPLACE TYPE BODY stack AS
      CONSTRUCTOR FUNCTION stack (n INTEGER) RETURN SELF AS RESULT IS
      BEGIN
        IF dbc.check_preconditions AND n < 0 THEN
          dbc.display_error ('stack - PRE');
        END IF;
        check_invariants;
        capacity := n;
        stack_implementation := array_t();
        stack_implementation.EXTEND (n);
        IF dbc.check_pre_postconditions AND capacity <> n THEN
          dbc.display_error ('stack - POST');
        END IF;
        check_invariants;
      END;
      MEMBER FUNCTION item (SELF IN OUT stack) RETURN INTEGER IS
      BEGIN
        IF dbc.check_preconditions AND empty THEN
          dbc.display_error ('item - PRE');
        END IF;
        check_invariants;
        RETURN stack_implementation(el_count);
      END;
      MEMBER FUNCTION empty RETURN BOOLEAN IS
      BEGIN
        IF el_count = 0 THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;
      END;
      MEMBER FUNCTION full RETURN BOOLEAN IS
      BEGIN
        IF el_count = capacity THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;
      END;
      MEMBER PROCEDURE put (x INTEGER) IS
      BEGIN
        IF dbc.check_preconditions AND full THEN
          dbc.display_error ('put - PRE');
        END IF;
        check_invariants;
        el_count := el_count + 1;
        stack_implementation(el_count) := x;
        -- PL/SQL has not Eiffel's OLD
        -- one_more_item: count = old count + 1
        IF dbc.check_pre_postconditions AND (empty OR item <> x) THEN
          dbc.display_error ('put - POST');
        END IF;
        check_invariants;
      END;
      MEMBER PROCEDURE remove IS BEGIN
        IF dbc.check_preconditions AND empty THEN
          dbc.display_error ('remove - PRE');
        END IF;
        check_invariants;
        el_count := el_count - 1;
        -- PL/SQL has not Eiffel's OLD
        -- one_fewer: count = old count - 1
        IF dbc.check_pre_postconditions AND full THEN
          dbc.display_error ('remove - POST');
        END IF;
        check_invariants;
      END;
      -- INVARIANTS
      MEMBER FUNCTION count_non_negative RETURN BOOLEAN IS
      BEGIN
        IF el_count >= 0 THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;
      END;
      MEMBER FUNCTION count_bounded RETURN BOOLEAN IS
      BEGIN
        IF el_count <= capacity THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;
      END;
      MEMBER FUNCTION empty_if_no_elements RETURN BOOLEAN IS
      BEGIN
        IF empty AND (el_count = 0)
           OR
           NOT empty AND (el_count <> 0)
        THEN
          RETURN TRUE;
        ELSE
          RETURN FALSE;
        END IF;
      END;
      MEMBER PROCEDURE check_invariants IS
      BEGIN
        IF NOT dbc.check_pre_post_invariants THEN
          RETURN; -- without checking invariants
        END IF;
        IF NOT count_non_negative THEN
          dbc.display_error ('INVARIANT count_non_negative');
        END IF;
        IF NOT count_bounded THEN
          dbc.display_error ('INVARIANT count_bounded');
        END IF;
        IF NOT empty_if_no_elements THEN
          dbc.display_error ('INVARIANT empty_if_no_elements');
        END IF;
      END;
    END; -- class body STACK
    /Regards,
    Zlatko Sirotic

  • Object-oriented APEX. Best practices.

    Hello,
    in my company we are developing quite big application in Apex. At the beginning we saw Apex as a very developer friendly application, but now we have problem with it.
    Our application has about 100 pages, most of them are not only reports but are also designed to edit and add new data. We are often using javascript and plsql procedures to handle collections and error processing. There are a lot of elements that are identical on several pages – not only processes, but also buttons, branches etc. – and when something changes, we must do the same operation on every page. Do you know any way to deal with it in better way?
    Are there any “best practices” for APEX to make it more object-oriented? I know I can put e.g. plsql procedures as a function in database, but what about button functions etc.? Maybe I should name most important buttons in the same way and handle them using javascript?
    Regards,
    Przemek Staniszewski

    Hi Przemek,
    I'm not an object oriented expert so I probably can't offer you too much in the way of advice here, I'm old school from relational theory, 3GL etc. But one of the things to remember is that Apex isn't one single language like Java where it is easier to maintain good object oriented practicies and even enforces and encourages. Apex is a collection of technologies such as Relational Design, SQL, PL/SQL, HTML and Javascript which are all held together by a declarative programming interface.
    Although all these technologies have varying degrees of object orientism, they are all quite distinct technologies which work together well but don't really help each other in maintaining or enforcing OO good practices. I think it would be hard to reverse engineer an existing application, but with some thought, kowledge and advice from the right areas you should be able to put together some good design and coding standards which will serve you well going forward.
    There are some documents and threads you should be able to find which will also help you, but also remember you are also dealing with some long established technologies such as Relation Database Design and SQL. Too often developers with skills in more recent languages get lost in the API front end and assume the database isn't really part of the application. You know, DBA stuff. For my money the database is the centre and the most important part of the application.
    My two cents worth anyway.
    Andre

  • Object oriented abap

    hello abapers,
    am new to object oriented abap.cud u pls help me out in explaining me object oriented abap with examples.cud u also pls send me some links related to OO ABAP..
    explanation wid suitable examples will b rewarded higher pints.
    regards,
    praveen

    Hi,
    please find the below material with examples,
    reward points if helpful.
    Public attributes
    Public attributes are defined in the PUBLIC section and can be viewed and changed from outside the class. There is direct access to public attributes. As a general rule, as few public attributes should be defined as possible.
    PUBLIC SECTION.
      DATA: Counter type i.
    Private attributes
    Private attributes are defined in the PRIVATE section. The can only be viewes and changed from within the class. There is no direct access from outside the class.
    PRIVATE SECTION.
        DATA: name(25) TYPE c,
              planetype LIKE saplane-planetyp,
    Instance attributes
    There exist one instance attribute for each instance of the class, thus they exist seperately for each object. Instance attributes are declared with the DATA keyword.
    Static attributes
    Static attributes exist only once for each class. The data are the same for all instances of the class, and can be used e.g. for instance counters. Static attributes are defined with the keyword CLASS-DATA.
    PRIVATE SECTION.
      CLASS-DATA: counter type i,  
    Public methods
    Can called from outside the class
    PUBLIC SECTION.
      METHODS:  set_attributes IMPORTING p_name(25) TYPE c,
                                                                p_planetype LIKE saplane-planetyp,
    Private methods
    Can only be called from inside the class. They are placed in the PRIVATE section of the class.
    Constructor method
    Implicitly, each class has an instance constructor method with the reserved name constructor and a static constructor method with the reserved name class_constructor.
    The instance constructor is executed each time you create an object (instance) with the CREATE OBJECT statement, while the class constructor is executed exactly once before you first access a class.
    The constructors are always present. However, to implement a constructor you must declare it explicitly with the METHODS or CLASS-METHODS statements. An instance constructor can have IMPORTING parameters and exceptions. You must pass all non-optional parameters when creating an object. Static constructors have no parameters.
    Static constructor
    The static constructor is always called CLASS_CONSTRUCTER, and is called autmatically before the clas is first accessed, that is before any of the following actions are executed:
    •     Creating an instance using CREATE_OBJECT
    •     Adressing a static attribute using 
    •     Calling a ststic attribute using CALL METHOD
    •     Registering a static event handler
    •     Registering an evetm handler method for a static event
    The static constructor cannot be called explicitly.
    Protected components
    When we are talking subclassing and enheritance there is one more component than Public and Private, the Protected component. Protected components can be used by the superclass and all of the subclasses. Note that Subclasses cannot access Private components.
    Polymorphism
    Polymorphism: When the same method is implemented differently in different classes. This can be done using enheritance, by redefining a method from the superclass in subclasses and implement it differently.
    Template for making a class
    Delete the parts that should not be used
    Definition part
    CLASS xxx DEFINITION.
    Public section
      PUBLIC SECTION.
        TYPES:
        DATA:
      Static data
        CLASS-DATA:
      Methods
        METHODS:
        Using the constructor to initialize parameters
           constructor    IMPORTING xxx type yyy,
        Method with parameters
          mm1 IMPORTING iii   TYPE ttt.
        Method without parameters
          mm2.
      Static methods
        CLASS-METHODS: 
    Protected section. Also accessable by subclasses
      PROTECTED SECTION.
    Private section. Not accessable by subclasses
      PRIVATE SECTION.
    ENDCLASS.
    Implementation part
    CLASS lcl_airplane IMPLEMENTATION.
      METHOD constructor.
      ENDMETHOD.
      METHOD mm1.
      ENDMETHOD.
      METHOD mm2.
      ENDMETHOD.
    ENDCLASS.
    Template for calling a class
    Create reference to class lcl_airplane
    DATA: airplane1 TYPE REF TO lcl_airplane.
    START-OF-SELECTION.
    Create instance using parameters in the cosntructor method
      CREATE OBJECT airplane1 exporting im_name = 'Hansemand'
                                        im_planetype = 'Boing 747'.
    Calling a method with parameters
      CALL METHOD: airplane1->display_n_o_airplanes,
                   airplane1->display_attributes.
    Subclass
    CLASS xxx DEFINITION INHERITING FROM yyy.
    Using af class as a parameter for a method
    The class LCL_AIRPLANE is used as a parameter for method add_a_new_airplane:
    METHODS:
      add_a_new_airplane importing im_airplane TYPE REF to lcl_airplane.
    Interfaces
    In ABAP interfaces are implemented in addition to, and independently of classes. An interface only has a declaration part, and do not have visibillity sections. Components (Attributes, methods, constants, types) can be defined the same way as in classes.
    •     Interfaces are listed in the definition part lof the class, and must always be in the PUBLIC SECTION.
    •     Operations defined in the interface atre impemented as methods of the class. All methods of the interface must be present in the
    •     implementation part of the class.
    •     Attributes, events, constants and types defined in the interface are automatically available to the class carying out the implementation.
    •     Interface components are adresse in the class by ]
    Define, implement and use simple class
    ***INCLUDE ZBC404_HF_LCL_AIRPLANE .
    Definition part
    CLASS lcl_airplane DEFINITION.
    Public section
      PUBLIC SECTION.
        TYPES: t_name(25) TYPE c.
        METHODS:
          constructor,
          set_attributes IMPORTING p_name       TYPE t_name
                                   p_planetype  TYPE saplane-planetype,
          display_attributes,
          display_n_o_airplanes.
    Private section
      PRIVATE SECTION.
      Private attributes
        DATA: name(25) TYPE c,
              planetype TYPE saplane-planetype.
      Private static attribute
        CLASS-DATA n_o_airplanes TYPE i.
    ENDCLASS.
    Implementation part
    CLASS lcl_airplane IMPLEMENTATION.
      METHOD constructor.
      Counts number of instances
        n_o_airplanes = n_o_airplanes + 1.
      ENDMETHOD.
      METHOD set_attributes.
        name      = p_name.
        planetype = p_planetype.
      ENDMETHOD.
      METHOD display_attributes.
        WRITE:/ 'Name:', name, 'Planetype:', planetype.
      ENDMETHOD.
      METHOD display_n_o_airplanes.
        WRITE: / 'No. planes:', n_o_airplanes.
      ENDMETHOD.
    ENDCLASS.
    REPORT zbc404_hf_maintain_airplanes .
    INCLUDE zbc404_hf_lcl_airplane.
    Create reference to class lcl_airplane
    DATA: airplane1 TYPE REF TO lcl_airplane,
          airplane2 TYPE REF TO lcl_airplane.
    START-OF-SELECTION.
    Create instance
      CREATE OBJECT airplane1.
      CALL METHOD: airplane1->display_n_o_airplanes.
      CREATE OBJECT airplane2.
    Setting attributes using a method with parameters
      CALL METHOD airplane1->set_attributes EXPORTING p_name      = 'Kurt'
                                                      p_planetype = 'MD80'.
    END-OF-SELECTION.
    Using methods
      CALL METHOD: airplane1->display_n_o_airplanes,
                   airplane1->display_attributes. 
    The resulting report:
    Maintain airplanes                                                                               
    No. planes:          1                                
    No. planes:          2                                
    Name: Kurt                      Planetype: MD80       
    Use constructor to create an object with parameters
    CLASS lcl_airplane DEFINITION.
      PUBLIC SECTION.
        TYPES: t_name(25) TYPE c.
        METHODS:
          constructor    importing p2_name      type t_name
                                   p2_planetype  TYPE saplane-planetype,
    ..... more code .......
    CLASS lcl_airplane IMPLEMENTATION.
      METHOD constructor.
        name      = p2_name.
        planetype = p2_planetype.
    ..... more code .......
    START-OF-SELECTION.
      CREATE OBJECT airplane1 exporting p2_name = 'Hansemand'
                                        p2_planetype = 'Boing 747'.
    Subclassing
    This example uses a superclass LCL_AIRPLANE and subclasses it into LCL_PASSENGER_AIRPLANE and LCL_CARGO_PLANE.
    LCL_AIRPLANE has a method display_n_o_airplanes that displays the number of object instances.
    LCL_PASSENGER_AIRPLANE has the private instance attribute n_o_seats, and redefines the superclass method display_attributes, so it also displays n_o_seats.
    LCL_CARGO_PLANE has the private instance attribute cargomax, and redefines the superclass method display_attributes, so it also displays cargomax.
    All instance attributes are provided by the cunstructor method.
    Superclass LCL_AIRPLANE
    ***INCLUDE ZBC404_HF_LCL_AIRPLANE .
    Definition part
    CLASS lcl_airplane DEFINITION.
    Public section
      PUBLIC SECTION.
        TYPES: t_name(25) TYPE c.
        METHODS:
          constructor    IMPORTING im_name      TYPE t_name
                                   im_planetype  TYPE saplane-planetype,
          display_attributes.
      Static methods
        CLASS-METHODS:
          display_n_o_airplanes.
    Protected section
      PROTECTED SECTION.
      Private attributes
        DATA: name(25) TYPE c,
              planetype TYPE saplane-planetype.
      Private static attribute
        CLASS-DATA n_o_airplanes TYPE i.
    ENDCLASS.
    Implementation part
    CLASS lcl_airplane IMPLEMENTATION.
      METHOD constructor.
        name      = im_name.
        planetype = im_planetype.
      Counts number of instances
        n_o_airplanes = n_o_airplanes + 1.
      ENDMETHOD.
      METHOD display_attributes.
        WRITE:/ 'Name:', name, 'Planetype:', planetype.
      ENDMETHOD.
      METHOD display_n_o_airplanes.
        WRITE: / 'No. planes:', n_o_airplanes.
      ENDMETHOD.
    ENDCLASS.
    Sub class LCL_PASSENGER_AIRPLANE
    ***INCLUDE ZBC404_HF_LCL_PASSENGER_PLANE .
    This is a subclass of class lcl_airplane
    CLASS lcl_passenger_airplane DEFINITION INHERITING FROM lcl_airplane.
      PUBLIC SECTION.
      The constructor contains the parameters from the superclass
      plus the parameters from the subclass
        METHODS:
          constructor IMPORTING im_name      TYPE t_name
                                im_planetype TYPE saplane-planetype
                                im_n_o_seats TYPE sflight-seatsmax,
        Redefinition of superclass method display_attributes
          display_attributes REDEFINITION.
      PRIVATE SECTION.
        DATA: n_o_seats TYPE sflight-seatsmax.
    ENDCLASS.
    CLASS lcl_passenger_airplane IMPLEMENTATION.
      METHOD constructor.
      The constructor method of the superclass MUST be called withing the
      construtor
        CALL METHOD super->constructor
                              EXPORTING im_name      = im_name
                                        im_planetype = im_planetype.
        n_o_seats = im_n_o_seats.
      ENDMETHOD.
      The redefined  display_attributes method
      METHOD display_attributes.
        CALL METHOD super->display_attributes.
        WRITE: / 'No. seats:', n_o_seats.
      ENDMETHOD.
    ENDCLASS.
    Sub class LCL_CARGO_PLANE
    ***INCLUDE ZBC404_HF_LCL_CARGO_PLANE .
    This is a subclass of class lcl_airplane
    CLASS lcl_cargo_plane DEFINITION INHERITING FROM lcl_airplane.
      PUBLIC SECTION.
        METHODS:
        The constructor contains the parameters from the superclass
        plus the parameters from the subclass
          constructor IMPORTING im_name      TYPE t_name
                                im_planetype TYPE saplane-planetype
                                im_cargomax  type scplane-cargomax,
        Redefinition of superclass method display_attributes
          display_attributes REDEFINITION.
      PRIVATE SECTION.
        DATA:cargomax TYPE scplane-cargomax.
    ENDCLASS.
    CLASS lcl_cargo_plane IMPLEMENTATION.
      METHOD constructor.
      The constructor method of the superclass MUST be called withing the
      constructor
        CALL METHOD super->constructor
                              EXPORTING im_name      = im_name
                                        im_planetype = im_planetype.
        cargomax = im_cargomax.
      ENDMETHOD.
      METHOD display_attributes.
      The redefined  display_attributes method
        CALL METHOD super->display_attributes.
        WRITE: / 'Cargo max:', cargomax.
      ENDMETHOD.
    ENDCLASS.
    The Main program that uses the classes
    REPORT zbc404_hf_main .
    Super class
    INCLUDE zbc404_hf_lcl_airplane.
    Sub classes
    INCLUDE zbc404_hf_lcl_passenger_plane.
    INCLUDE zbc404_hf_lcl_cargo_plane.
    DATA:
    Type ref to sub classes. Note: It is not necesssary to make typeref to the superclass
      o_passenger_airplane TYPE REF TO lcl_passenger_airplane,
      o_cargo_plane        TYPE REF TO lcl_cargo_plane.
    START-OF-SELECTION.
    Display initial number of instances = 0
      CALL METHOD  lcl_airplane=>display_n_o_airplanes.
    Create objects
      CREATE OBJECT o_passenger_airplane
        EXPORTING
          im_name      = 'LH505'
          im_planetype = 'Boing 747'
          im_n_o_seats = 350.
      CREATE OBJECT o_cargo_plane
        EXPORTING
          im_name      = 'AR13'
          im_planetype = 'DC 3'
          im_cargomax = 35.
    Display attributes
      CALL METHOD o_passenger_airplane->display_attributes.
      CALL METHOD o_cargo_plane->display_attributes.
    Call static method display_n_o_airplanes
    Note: The syntax for calling a superclass method, differs from the syntax when calling a subclass method.
    When calling a superclass => must be used instead of ->
      CALL METHOD  lcl_airplane=>display_n_o_airplanes.
    Result:
    No. planes: 0
    Name: LH505 Planetype: Boing 747
    No. seats: 350
    Name: AR13 Planetype: DC 3
    Cargo max: 35,0000
    No. planes: 2
    Polymorphism
    Polymorphism: When the same method is implemented differently in different classes. This can be done using enheritance, by redefining a method from the superclass in subclasses and implement it differently.
    Classes:
    •     lcl_airplane Superclass
    •     lcl_cargo_airplane Subclass
    •     lcl_passenger_airplane Subclass
    The method estimate_fuel_consumption is implemented differently in the 3 classes, as it depends on the airplane type.
    Object from different classes are stored in an internal table (plane_list) consisting of references to the superclass, and the processed
    identically for all the classes.
    What coding for the estimate_fuel_consumption method taht is actually executed, depends on the dynamic type of the plane reference variable,
    that is, depends on which object plane points to.
    DATA: cargo_plane            TYPE REF to lcl_cargo_airplane,
              passenger_plane    TYPE REF to lcl_passenger_airplane,
              plane_list                  TYPE TABLE OF REF TO lcl_airplane.
    Creating the list of references
    CREATE OBJECT cargo_plane.
    APPEND cargo_plane to plane_list.
    CREATE OBJECT passenger_plane
    APPEND passenger_plane to plane list.
    Generic method for calucalting required fuel
    METHOD calculate required_fuel.
      DATA: plane TYPE REF TO lcl_airplane.
      LOOP AT plane_list INTO plane.
        re_fuel = re_fuel + plane->estimate_fuel_consumption( distance ).
      ENDLOOP.
    ENDMETHOD.
    Working example:
    This example assumes that the classes lcl_airplane,  lcl_passnger_airplane and lcl_cargo plane (Se Subcallsing)  exists.
    Create objects of type lcl_cargo_plane and lcl_passenger_airplane, adds them to a list in lcl_carrier, and displays the list. 
    *& Include  ZBC404_HF_LCL_CARRIER                                      *
          CLASS lcl_carrier DEFINITION                                   *
    CLASS lcl_carrier DEFINITION.
      PUBLIC SECTION.
        TYPES: BEGIN OF flight_list_type,
                  connid   TYPE sflight-connid,
                  fldate   TYPE sflight-fldate,
                  airplane TYPE REF TO lcl_airplane,
                  seatsocc TYPE sflight-seatsocc,
                  cargo(5) TYPE p DECIMALS 3,
               END OF flight_list_type.
        METHODS: constructor IMPORTING im_name TYPE string,
                 get_name RETURNING value(ex_name) TYPE string,
                 add_a_new_airplane IMPORTING
                                       im_airplane TYPE REF TO lcl_airplane,
        create_a_new_flight importing
                              im_connid   type sflight-connid
                              im_fldate   type sflight-fldate
                              im_airplane type ref to lcl_airplane
                              im_seatsocc type sflight-seatsocc
                                        optional
                            im_cargo    type p optional,
         display_airplanes.
      PRIVATE SECTION.
        DATA: name              TYPE string,
              list_of_airplanes TYPE TABLE OF REF TO lcl_airplane,
              list_of_flights   TYPE TABLE OF flight_list_type.
    ENDCLASS.
          CLASS lcl_carrier IMPLEMENTATION
    CLASS lcl_carrier IMPLEMENTATION.
      METHOD constructor.
        name = im_name.
      ENDMETHOD.
      METHOD get_name.
        ex_name = name.
      ENDMETHOD.
      METHOD create_a_new_flight.
        DATA: wa_list_of_flights TYPE flight_list_type.
        wa_list_of_flights-connid   = im_connid.
        wa_list_of_flights-fldate   = im_fldate.
        wa_list_of_flights-airplane = im_airplane.
        IF im_seatsocc IS INITIAL.
          wa_list_of_flights-cargo = im_cargo.
        ELSE.
          wa_list_of_flights-seatsocc = im_seatsocc.
        ENDIF.
        APPEND wa_list_of_flights TO list_of_flights.
      ENDMETHOD.
      METHOD add_a_new_airplane.
        APPEND im_airplane TO list_of_airplanes.
      ENDMETHOD.
      METHOD display_airplanes.
        DATA: l_airplane TYPE REF TO lcl_airplane.
        LOOP AT list_of_airplanes INTO l_airplane.
          CALL METHOD l_airplane->display_attributes.
        ENDLOOP.
      ENDMETHOD.
    ENDCLASS.
    REPORT zbc404_hf_main .
    This reprort uses class LCL_AIRPLNAE and subclasses
    LCL_CARGO_PLANE and LCL_PASSENGER_AIRPLANE and class LCL_CARRIER
    Super class for airplanes
    INCLUDE zbc404_hf_lcl_airplane.
    Sub classes for airplanes
    INCLUDE zbc404_hf_lcl_passenger_plane.
    INCLUDE zbc404_hf_lcl_cargo_plane.
    Carrier class
    INCLUDE zbc404_hf_lcl_carrier.
    DATA:
    Type ref to classes
      o_passenger_airplane  TYPE REF TO lcl_passenger_airplane,
      o_passenger_airplane2 TYPE REF TO lcl_passenger_airplane,
      o_cargo_plane         TYPE REF TO lcl_cargo_plane,
      o_cargo_plane2        TYPE REF TO lcl_cargo_plane,
      o_carrier             TYPE REF TO lcl_carrier.
    START-OF-SELECTION.
    Create objects
      CREATE OBJECT o_passenger_airplane
        EXPORTING
          im_name      = 'LH505'
          im_planetype = 'Boing 747'
          im_n_o_seats = 350.
      CREATE OBJECT o_passenger_airplane2
        EXPORTING
          im_name      = 'SK333'
          im_planetype = 'MD80'
          im_n_o_seats = 110.
      CREATE OBJECT o_cargo_plane
        EXPORTING
          im_name      = 'AR13'
          im_planetype = 'DC 3'
          im_cargomax = 35.
      CREATE OBJECT o_cargo_plane2
        EXPORTING
          im_name      = 'AFL124'
          im_planetype = 'Iljutsin 2'
          im_cargomax = 35000.
      CREATE OBJECT o_carrier
        EXPORTING im_name = 'Spritisch Airways'.
    Add passenger and cargo planes to the list of airplanes
      CALL METHOD o_carrier->add_a_new_airplane
         EXPORTING im_airplane = o_passenger_airplane.
      CALL METHOD o_carrier->add_a_new_airplane
         EXPORTING im_airplane = o_passenger_airplane2.
      CALL METHOD o_carrier->add_a_new_airplane
         EXPORTING im_airplane = o_cargo_plane.
      CALL METHOD o_carrier->add_a_new_airplane
         EXPORTING im_airplane = o_cargo_plane2.
    Display list of airplanes
      call method o_carrier->display_airplanes.
    Result:
    Name: LH505                     Planetype: Boing 747        
    No. seats:       350                                        
    Name: SK333                     Planetype: MD80             
    No. seats:       110                                        
    Name: AR13                      Planetype: DC 3             
    Cargo max:             35,0000                              
    Name: AFL124                    Planetype: Iljutsin 2       
    Cargo max:         35.000,0000                              
    Events
    Below is a simple example of how to implement an event.
    REPORT zbc404_hf_events_5.
          CLASS lcl_dog DEFINITION
    CLASS lcl_dog DEFINITION.
      PUBLIC SECTION.
      Declare events
        EVENTS:
          dog_is_hungry
            EXPORTING value(ex_time_since_last_meal) TYPE i.
        METHODS:
          constructor
              IMPORTING im_name TYPE string,
          set_time_since_last_meal
              IMPORTING im_time TYPE i,
          on_dog_is_hungry FOR EVENT dog_is_hungry OF lcl_dog
              IMPORTING ex_time_since_last_meal.
    ENDCLASS.
          CLASS lcl_dog IMPLEMENTATION
    CLASS lcl_dog IMPLEMENTATION.
      METHOD constructor.
        WRITE: / 'I am a dog and my name is', im_name.
      ENDMETHOD.
      METHOD set_time_since_last_meal.
        IF im_time < 4.
          SKIP 1.
          WRITE: / 'You fool, I am not hungry yet'.
        ELSE.
       Subsrcribe for event:
       set handler <Event handler method>
       FOR <ref_sender>!FOR ALL INSTANCES [ACTIVATION <var>]
          SET HANDLER on_dog_is_hungry FOR ALL INSTANCES ACTIVATION 'X'.
       Raise event
          RAISE EVENT dog_is_hungry
            EXPORTING ex_time_since_last_meal = im_time.
        ENDIF.
      ENDMETHOD.
      METHOD on_dog_is_hungry.
      Event method, called when the event dog_is_hungry is raised
        SKIP 1.
        WRITE: /  'You son of a *****. I have not eaten for more than',
                  ex_time_since_last_meal, ' hours'.
        WRITE: / 'Give me something to eat NOW!'.
      ENDMETHOD.
    ENDCLASS.
          R E P O R T
    DATA: o_dog1 TYPE REF TO lcl_dog.
    START-OF-SELECTION.
      CREATE OBJECT o_dog1 EXPORTING im_name = 'Beefeater'.
      CALL METHOD o_dog1->set_time_since_last_meal
        EXPORTING im_time = 2.
    This method call will raise the event dog_is_hungy
    because time > 3
      CALL METHOD o_dog1->set_time_since_last_meal
        EXPORTING im_time = 5.
    Result:
    I am a dog and my name is Beefeater
    You fool, I am not hungry yet
    You son of a *****. I have not eaten for more than 5 hours
    Give me something to eat NOW!
    1. Simple class
    This example shows how to create a simple employee class. The constructor method is used to initialize number and name of thje employee when the object is created. A display_employee method can be called to show the attributes of the employee, and CLASS-METHOD dosplay_no_of_employees can be called to show the total number of employees (Number of instances of the employee class).
    REPORT zbc404_hf_events_1.
    L C L _ E M P L O Y E E
    *---- LCL Employee - Definition
    CLASS lcl_employee DEFINITION.
      PUBLIC SECTION.
    The public section is accesible from outside  
        TYPES:
          BEGIN OF t_employee,
            no  TYPE i,
            name TYPE string,
         END OF t_employee.
        METHODS:
          constructor
            IMPORTING im_employee_no TYPE i
                      im_employee_name TYPE string,
          display_employee.
      Class methods are global for all instances      
        CLASS-METHODS: display_no_of_employees.
      PROTECTED SECTION.
    The protecetd section is accesible from the class and its subclasses 
      Class data are global for all instances      
        CLASS-DATA: g_no_of_employees TYPE i.
      PRIVATE SECTION.
    The private section is only accesible from within the classs 
        DATA: g_employee TYPE t_employee.
    ENDCLASS.
    *--- LCL Employee - Implementation
    CLASS lcl_employee IMPLEMENTATION.
      METHOD constructor.
        g_employee-no = im_employee_no.
        g_employee-name = im_employee_name.
        g_no_of_employees = g_no_of_employees + 1.
      ENDMETHOD.
      METHOD display_employee.
        WRITE:/ 'Employee', g_employee-no, g_employee-name.
      ENDMETHOD.
      METHOD display_no_of_employees.
        WRITE: / 'Number of employees is:', g_no_of_employees.
      ENDMETHOD.
    ENDCLASS.
    R E P O R T
    DATA: g_employee1 TYPE REF TO lcl_employee,
          g_employee2 TYPE REF TO lcl_employee.
    START-OF-SELECTION.
      CREATE OBJECT g_employee1
        EXPORTING im_employee_no = 1
                  im_employee_name = 'John Jones'.
      CREATE OBJECT g_employee2
        EXPORTING im_employee_no = 2
                  im_employee_name = 'Sally Summer'.
      CALL METHOD g_employee1->display_employee.
      CALL METHOD g_employee2->display_employee.
      CALL METHOD g_employee2->display_no_of_employees.
    2. Inheritance and polymorphism
    This example uses a superclass lcl_company_employees and two subclasses lcl_bluecollar_employee and lcl_whitecollar_employee to add employees to a list and then display a list of employees and there wages. The wages are calcukated in the method add_employee, but as the wages are calculated differently for blue collar employees and white collar emplyees, the superclass method add_employee is redeifined in the subclasses.
    Principles:
    Create super class LCL_CompanyEmployees.
    The class has the methods:
    •     Constructor
    •     Add_Employee - Adds a new employee to the list of employees
    •     Display_Employee_List - Displays all employees and there wage
    •     Display_no_of_employees - Displays total number of employees
    Note the use of CLASS-DATA to keep the list of employees and number of employees the same from instance to instance.
    Create subclasses lcl_bluecollar_employee and lcl_whitecollar_employee. The calsses are identical, except for the redifinition of the add_employee method, where the caclculation of wage is different.
    Methodes:
    •     Constructor. The constructor is used to initialize the attributes of the employee. Note that the constructor in the supclasss has to be called from within the constructor of the subclass.
    •     Add_Employee. This is a redinition of the same method in the superclass. In the redefined class the wage is calcuated, and the superclass method is called to add the employees to the emploee list.:
    The program
    REPORT zbc404_hf_events_2 .
    Super class LCL_CompanyEmployees
    CLASS lcl_company_employees DEFINITION.
      PUBLIC SECTION.
        TYPES:
          BEGIN OF t_employee,
            no  TYPE i,
            name TYPE string,
            wage TYPE i,
         END OF t_employee.
        METHODS:
          constructor,
          add_employee
            IMPORTING im_no   TYPE i
                      im_name TYPE string
                      im_wage TYPE i,
          display_employee_list,
          display_no_of_employees.
      PRIVATE SECTION.
        CLASS-DATA: i_employee_list TYPE TABLE OF t_employee,
                    no_of_employees TYPE i.
    ENDCLASS.
    *-- CLASS LCL_CompanyEmployees IMPLEMENTATION
    CLASS lcl_company_employees IMPLEMENTATION.
      METHOD constructor.
        no_of_employees = no_of_employees + 1.
      ENDMETHOD.
      METHOD add_employee.
      Adds a new employee to the list of employees
        DATA: l_employee TYPE t_employee.
        l_employee-no = im_no.
        l_employee-name = im_name.
        l_employee-wage = im_wage.
        APPEND l_employee TO i_employee_list.
      ENDMETHOD.
      METHOD display_employee_list.
      Displays all employees and there wage
        DATA: l_employee TYPE t_employee.
        WRITE: / 'List of Employees'.
        LOOP AT i_employee_list INTO l_employee.
          WRITE: / l_employee-no, l_employee-name, l_employee-wage.
        ENDLOOP.
      ENDMETHOD.
      METHOD display_no_of_employees.
      Displays total number of employees
        SKIP 3.
        WRITE: / 'Total number of employees:', no_of_employees.
      ENDMETHOD.
    ENDCLASS.
    Sub class LCL_BlueCollar_Employee
    CLASS lcl_bluecollar_employee DEFINITION
              INHERITING FROM lcl_company_employees.
      PUBLIC SECTION.
        METHODS:
            constructor
              IMPORTING im_no             TYPE i
                        im_name           TYPE string
                        im_hours          TYPE i
                        im_hourly_payment TYPE i,
             add_employee REDEFINITION.
      PRIVATE SECTION.
        DATA:no             TYPE i,
             name           TYPE string,
             hours          TYPE i,
             hourly_payment TYPE i.
    ENDCLASS.
    *---- CLASS LCL_BlueCollar_Employee IMPLEMENTATION
    CLASS lcl_bluecollar_employee IMPLEMENTATION.
      METHOD constructor.
      The superclass constructor method must be called from the subclass
      constructor method
        CALL METHOD super->constructor.
        no = im_no.
        name = im_name.
        hours = im_hours.
        hourly_payment = im_hourly_payment.
      ENDMETHOD.
      METHOD add_employee.
      Calculate wage an call the superclass method add_employee to add
      the employee to the employee list
        DATA: l_wage TYPE i.
        l_wage = hours * hourly_payment.
        CALL METHOD super->add_employee
          EXPORTING im_no = no
                    im_name = name
                    im_wage = l_wage.
      ENDMETHOD.
    ENDCLASS.
    Sub class LCL_WhiteCollar_Employee
    CLASS lcl_whitecollar_employee DEFINITION
        INHERITING FROM lcl_company_employees.
      PUBLIC SECTION.
        METHODS:
            constructor
              IMPORTING im_no                 TYPE i
                        im_name               TYPE string
                        im_monthly_salary     TYPE i
                        im_monthly_deductions TYPE i,
             add_employee REDEFINITION.
      PRIVATE SECTION.
        DATA:
          no                    TYPE i,
          name                  TYPE string,
          monthly_salary        TYPE i,
          monthly_deductions    TYPE i.
    ENDCLASS.
    *---- CLASS LCL_WhiteCollar_Employee IMPLEMENTATION
    CLASS lcl_whitecollar_employee IMPLEMENTATION.
      METHOD constructor.
      The superclass constructor method must be called from the subclass
      constructor method
        CALL METHOD super->constructor.
        no = im_no.
        name = im_name.
        monthly_salary = im_monthly_salary.
        monthly_deductions = im_monthly_deductions.
      ENDMETHOD.
      METHOD add_employee.
      Calculate wage an call the superclass method add_employee to add
      the employee to the employee list
        DATA: l_wage TYPE i.
        l_wage = monthly_salary - monthly_deductions.
        CALL METHOD super->add_employee
          EXPORTING im_no = no
                    im_name = name
                    im_wage = l_wage.
      ENDMETHOD.
    ENDCLASS.
    R E P O R T
    DATA:
    Object references
      o_bluecollar_employee1  TYPE REF TO lcl_bluecollar_employee,
      o_whitecollar_employee1 TYPE REF TO lcl_whitecollar_employee.
    START-OF-SELECTION.
    Create bluecollar employee obeject
      CREATE OBJECT o_bluecollar_employee1
          EXPORTING im_no  = 1
                    im_name  = 'Gylle Karen'
                    im_hours = 38
                    im_hourly_payment = 75.
    Add bluecollar employee to employee list
      CALL METHOD o_bluecollar_employee1->add_employee
          EXPORTING im_no  = 1
                    im_name  = 'Gylle Karen'
                    im_wage = 0.
    Create whitecollar employee obeject
      CREATE OBJECT o_whitecollar_employee1
          EXPORTING im_no  = 2
                    im_name  = 'John Dickens'
                    im_monthly_salary = 10000
                    im_monthly_deductions = 2500.
    Add bluecollar employee to employee list
      CALL METHOD o_whitecollar_employee1->add_employee
          EXPORTING im_no  = 1
                    im_name  = 'Karen Johnson'
                    im_wage = 0.
    Display employee list and number of employees. Note that the result
    will be the same when called from o_whitecollar_employee1 or
    o_bluecolarcollar_employee1, because the methods are defined
    as static (CLASS-METHODS)
      CALL METHOD o_whitecollar_employee1->display_employee_list.
      CALL METHOD o_whitecollar_employee1->display_no_of_employees.
    The resulting report
    List of Employees
    1 Karen Johnson 2.850
    2 John Dickens 7.500
    Total number of employees: 2
    3. Interfaces
    This example is similiar to th eprevious example, however an interface is implemented with the method add_employee. Note that the interface is only implemented in the superclass ( The INTERFACE stament), but also used in the subclasses.
    The interface in the example only contains a method, but an iterface can also contain attrbutes, constants, types and alias names.
    The output from example 3 is similiar to the output in example 2.
    All changes in the program compared to example 2 are marked with red.
    REPORT zbc404_hf_events_3 .
          INTERFACE lif_employee
    INTERFACE lif_employee.
      METHODS:
        add_employee
           IMPORTING im_no   TYPE i
                      im_name TYPE string
                      im_wage TYPE i.
    ENDINTERFACE.
    Super class LCL_CompanyEmployees
    CLASS lcl_company_employees DEFINITION.
      PUBLIC SECTION.
        INTERFACES lif_employee.
        TYPES:
          BEGIN OF t_employee,
            no  TYPE i,
            name TYPE string,
            wage TYPE i,
         END OF t_employee.
        METHODS:
          constructor,
         add_employee      "Removed
            IMPORTING im_no   TYPE i
                      im_name TYPE string
                      im_wage TYPE i,
          display_employee_list,
          display_no_of_employees.
      PRIVATE SECTION.
        CLASS-DATA: i_employee_list TYPE TABLE OF t_employee,
                    no_of_employees TYPE i.
    ENDCLASS.
    *-- CLASS LCL_CompanyEmployees IMPLEMENTATION
    CLASS lcl_company_employees IMPLEMENTATION.
      METHOD constructor.
        no_of_employees = no_of_employees + 1.
      ENDMETHOD.
      METHOD lif_employee~add_employee.
      Adds a new employee to the list of employees
        DATA: l_employee TYPE t_employee.
        l_employee-no = im_no.
        l_employee-name = im_name.
        l_employee-wage = im_wage.
        APPEND l_employee TO i_employee_list.
      ENDMETHOD.
      METHOD display_employee_list.
      Displays all employees and there wage
        DATA: l_employee TYPE t_employee.
        WRITE: / 'List of Employees'.
        LOOP AT i_employee_list INTO l_employee.
          WRITE: / l_employee-no, l_employee-name, l_employee-wage.
        ENDLOOP.
      ENDMETHOD.
      METHOD display_no_of_employees.
      Displays total number of employees
        SKIP 3.
        WRITE: / 'Total number of employees:', no_of_employees.
      ENDMETHOD.
    ENDCLASS.
    Sub class LCL_BlueCollar_Employee
    CLASS lcl_bluecollar_employee DEFINITION
              INHERITING FROM lcl_company_employees.
      PUBLIC SECTION.
        METHODS:
            constructor
              IMPORTING im_no             TYPE i
                        im_name           TYPE string
                        im_hours          TYPE i
                        im_hourly_payment TYPE i,
             lif_employee~add_employee REDEFINITION..
      PRIVATE SECTION.
        DATA:no             TYPE i,
             name           TYPE string,
             hours          TYPE i,
             hourly_payment TYPE i.
    ENDCLASS.
    *---- CLASS LCL_BlueCollar_Employee IMPLEMENTATION
    CLASS lcl_bluecollar_employee IMPLEMENTATION.
      METHOD constructor.
      The superclass constructor method must be called from the subclass
      constructor method
        CALL METHOD super->constructor.
        no = im_no.
        name = im_name.
        hours = im_hours.
        hourly_payment = im_hourly_payment.
      ENDMETHOD.
      METHOD lif_employee~add_employee.
      Calculate wage an call the superclass method add_employee to add
      the employee to the employee list
        DATA: l_wage TYPE i.
        l_wage = hours * hourly_payment.
        CALL METHOD super->lif_employee~add_employee
          EXPORTING im_no = no
                    im_name = name
                    im_wage = l_wage.
      ENDMETHOD.
    ENDCLASS.
    Sub class LCL_WhiteCollar_Employee
    CLASS lcl_whitecollar_employee DEFINITION
        INHERITING FROM lcl_company_employees.
      PUBLIC SECTION.
        METHODS:
            constructor
              IMPORTING im_no                 TYPE i
                        im_name               TYPE string
                        im_monthly_salary     TYPE i
                        im_monthly_deductions TYPE i,
             lif_employee~add_employee REDEFINITION.
      PRIVATE SECTION.
        DATA:
          no                    TYPE i,
          name                  TYPE string,
          monthly_salary        TYPE i,
          monthly_deductions    TYPE i.
    ENDCLASS.
    *---- CLASS LCL_WhiteCollar_Employee IMPLEMENTATION
    CLASS lcl_whitecollar_employee IMPLEMENTATION.
      METHOD constructor.
      The superclass constructor method must be called from the subclass
      constructor method
        CALL METHOD super->constructor.
        no = im_no.
        name = im_name.
        monthly_salary = im_monthly_salary.
        monthly_deductions = im_monthly_deductions.
      ENDMETHOD.
      METHOD lif_employee~add_employee.
      Calculate wage an call the superclass method add_employee to add
      the employee to the employee list
        DATA: l_wage TYPE i.
        l_wage = monthly_salary - monthly_deductions.
        CALL METHOD super->lif_employee~add_employee
          EXPORTING im_no = no
                    im_name = name
                    im_wage = l_wage.
      ENDMETHOD.
    ENDCLASS.
    R E P O R T
    DATA:
    Object references
      o_bluecollar_employee1  TYPE REF TO lcl_bluecollar_employee,
      o_whitecollar_employee1 TYPE REF TO lcl_whitecollar_employee.
    START-OF-SELECTION.
    Create bluecollar employee obeject
      CREATE OBJECT o_bluecollar_employee1
          EXPORTING im_no  = 1
                    im_name  = 'Gylle Karen'
                    im_hours = 38
                    im_hourly_payment = 75.
    Add bluecollar employee to employee list
      CALL METHOD o_bluecollar_employee1->lif_employee~add_employee
          EXPORTING im_no  = 1
                    im_name  = 'Karen Johnson'
                    im_wage = 0.
    Create whitecollar employee obeject
      CREATE OBJECT o_whitecollar_employee1
          EXPORTING im_no  = 2
                    im_name  = 'John Dickens'
                    im_monthly_salary = 10000
                    im_monthly_deductions = 2500.
    Add bluecollar employee to employee list
      CALL METHOD o_whitecollar_employee1->lif_employee~add_employee
          EXPORTING im_no  = 1
                    im_name  = 'Gylle Karen'
                    im_wage = 0.
    Display employee list and number of employees. Note that the result
    will be the same when called from o_whitecollar_employee1 or
    o_bluecolarcollar_employee1, because the methods are defined
    as static (CLASS-METHODS)
      CALL METHOD o_whitecollar_employee1->display_employee_list.
      CALL METHOD o_whitecollar_employee1->display_no_of_employees.
    4. Events
    This is the same example as example 4. All changes are marked with red. There have been no canges to the subclasses, only to the superclass and the report, sp the code for th esubclasses is not shown.
    For a simple example refer to Events in Examples.
    REPORT zbc404_hf_events_4 .
          INTERFACE lif_employee
    INTERFACE lif_employee.
      METHODS:
        add_employee
           IMPORTING im_no   TYPE i
                      im_name TYPE string
                      im_wage TYPE i.
    ENDINTERFACE.
    Super class LCL_CompanyEmployees
    CLASS lcl_company_employees DEFINITION.
      PUBLIC SECTION.
        TYPES:
        BEGIN OF t_employee,
          no  TYPE i,
          name TYPE string,
          wage TYPE i,
       END OF t_employee.
      Declare event. Note that declaration could also be placed in the
      interface

  • Shifting from procedural to object oriented

    Hi people,
    I've been programming in ABAP in a procedural fashion since I started, because that's the way I was taught. Now I want to slowly shift to object oriented development. I know and understand all object oriented concepts (please don't copy paste OOP explanations or links merely to get points). Problem is, in the projects i'm involved everything is done in the old fashion. There's no use of UML whatsoever. I believe it's very difficult to shift my mind to OOP (an already difficult task for someone programming procedural for years) if the analisys and design is not done with OO as the base, as additionally I have very little practical experience with OOP (using ALV classes and such). If every other programmer does things in procedural way, when the time comes to integrate programs, problems arise.
    I've been experimenting with OOP in my safe minisap at home, but in day to day work as pressure is put to finish programs on time, always procedural solutions come to mind.
    Do you have any advice on how to cope with this? Can you post your experience on this subject? Has someone gone through this same problems?
    Many thanks.

    Hello Alejandro
    When I started with object-oriented ABAP programming about 2 years ago I made horrible mistakes in my classes and interfaces. However, I have my lessons learnt from these mistakes and improved my skills and knowledge step by step.
    I have 3 recommendations for you:
    <b>(1) Start now!</b>
    Do not expect to develop perfect interfaces and classes from the very beginning. Understanding Object-Orientation takes its time.
    <b>(2) Start with simple objects.</b>
    Interfaces (or classes) can be used to define globally visible constants. Your first classes may contain only static methods. Yet while developing these "simple" objects you will get familiar with the class builder (SE24).
    <b>
    (3) Make heavy use of SAP standard classes.</b>
    Before creating your own class(es) make a comprehensive search for available standard classes (of course, if you are dealing with custom-developed business objects you have to create your own classes).
    For example, if you have to work with purchase orders have a look at the following classes:
    - CL_PO_HEADER_HANDLE_MM
    - CL_PO_ITEM_HANDLE_MM
    If you create an instance of CL_PO_HEADER_HANDLE_MM you will have thousands of coding lines at your fingertip (e.g. method IF_PURCHASE_ORDER_MMGET_DATA returns the header data, method IF_PURCHASE_ORDER_MMGET_ITEMS returns the  order items -> no need of coding, just CALLING).
    Finally, you may have a look at the following examples:
    <a href="https://wiki.sdn.sap.com/wiki/display/profile/2007/07/09/UnderstandingABAPObjects">Understanding ABAP Objects</a>
    <a href="https://wiki.sdn.sap.com/wiki/display/profile/2007/07/09/MessageHandling-FindingtheNeedleintheHaystack">Message Handling - Finding the Needle in the Haystack</a>
    <a href="https://wiki.sdn.sap.com/wiki/display/Snippets/UnifiedAccesstoAllHR+Infotypes">Unified Access to All HR Infotypes</a>
    Regards
      Uwe

  • Partially populating an object from XML data

    I have an unpopulated object which I intend to fill on-demand by grabbing several XML files via HTTP.
    I'm not sure how best to deal with this in Java - at present I keep a set of booleans to describe what information is present, and update these as I grab new data by parsing the XML
    Is there a way I can better use the object oriented features of Java to manage this?
    cheers,
    Jon

    Hi there again,
    Do you have zmaterial on your InfoSource? And in your InfoCube?
    If so, you only need zcolour in the Infocube and the way you're doing is correct. In the rule of the zcolour you can select master data attribute of and from the list it should appear all the InfoObjects that exist on the InfoSource that has zcolour as an attribute, in this case, zmaterial.
    If before you select the list of the InfoObjects available on the master data attribute of you click on F1 you see the help that says exactly that (and I have done it tones of times):
    Master data attrib.
    The specified characteristic has the characteristic to be updated as an attribute.
    With this setting, the value of the characteristic to be updated is read in the master data table of the specified characteristic.
    Example
    The Characteristic 'Material Group' is not delivered through the InfoSource.
    The characteristic 'Material' is delivered through the InfoSource.
    The characteristic 'Material' has the characteristic 'Material Group' as an attribute.
    You can fill 'Material Group' through the master data table 'Material'. To do this select the method 'Master Data Attribute from' and 'Material' as source.
    Regards,
    Diogo.

  • Object oriented concepts

    Hi Gurus,
    I want to know thw difference between objectoriented program and abap general programme?
    thanks in advance

    Hi Rama Krishna ,
    Object Orientation
    A programming technique in which solutions reflect real world objects
    What are objects ?
    An object is an instantiation of a class. E.g. If “Animal” is a class, A cat
    can be an object of that class .
    With respect to code, Object refers to a set of services ( methods /
    attributes ) and can contain data
    What are classes ?
    A class defines the properties of an object. A class can be instantiated
    as many number of times
    Advantages of Object Orientated approach
    Easier to understand when the system is complex
    Easy to make changes
    Encapsulation - Can restrict the visibility of the data ( Restrict the access to the data )
    Polymorphism - Identically named methods behave differently in different classes
    Inheritance - You can use an existing class to define a new class
    Polymorphism and inheritance lead to code reuse
    Classes in abap
    Classes in ABAP are either local or global
    Global classes are declared in class builder (SE24 )
    Local classes are declared within programs
    Components of a class
    Attributes : Internal data fields of class
    Attributes can be either instance attributes – specific to each instance of the class ( object ) or static attributes which are common to all instances
    Methods :
    Subroutines / procedures in a class that define the behavior of the object. Methods can also be instance methods or static methods
    Encapsulation in ABAP
    Encapsulation is obtained through the restriction in visibility of attributes / methods attained through the definition of Public, Private and Protected section of a class
    Public Section
    All of the components declared in the public section are accessible to all users of the class, and to the methods of the class and any classes that inherit from it. The public components of the class form the interface between the class and its users.
    Protected Section
    All of the components declared in the protected section are accessible to all methods of the class and of classes that inherit from it.
    Private Section
    Components that you declare in the private section are only visible in the methods of the same class.
    Inheritance in ABAP
    Inheritance allows you to derive a class based on an already existing class.
    CLASS <subclass> DEFINITION INHERITING FROM <superclass>.
    ENDCLASS.
    CLASS <subclass> IMPLEMENTATION.
    ENDCLASS.
    All attributes / methods of super class become the property of the subclass too. Only public and protected attributes / methods are visible in the subclass
    Polymorphism in ABAP
    When methods with same name perform differently under different
    circumstances we call it polymorphism.
    Methods redefined in a subclass is an example for Polymorphism
    Interfaces
    Interfaces are used to define the model of a class.
    They also like classes can be either local or global.
    Global interfaces are defined through SE24 and local interfaces are defined in program.
    Please check this online document (starting page 1291).
    http://help.sap.com/printdocu/core/Print46c/en/data/pdf/BCABA/BCABA.pdf
    Also check this links as well.
    http://help.sap.com/saphelp_nw2004s/helpdata/en/ce/b518b6513611d194a50000e8353423/frameset.htm
    http://www.sapgenie.com/abap/OO/
    http://www.futureobjects.de/content/intro_oo_e.html
    http://www.sap-img.com/abap/business-add-in-you-need-to-understand-abap-oo-interface-concept.htm
    /people/ravikumar.allampallam/blog/2005/02/11/abap-oo-in-action
    check the below links lot of info and examples r there
    http://www.sapgenie.com/abap/OO/index.htm
    http://www.geocities.com/victorav15/sapr3/abap_ood.html
    http://www.brabandt.de/html/abap_oo.html
    Check this cool weblog:
    /people/thomas.jung3/blog/2004/12/08/abap-persistent-classes-coding-without-sql
    /people/thomas.jung3/blog/2004/12/08/abap-persistent-classes-coding-without-sql
    Hope this resolves your query.
    Reward all the helpful answers.
    Thanks & Regards
    Bhaskar rao.M

  • ANN: PHP Object-Oriented Solutions

    This is not directly related to Dreamweaver, but I know a lot
    of people
    here use PHP. My latest book, "PHP Object-Oriented Solutions"
    has just
    been published and is already in stock at Amazon.com and
    www.compman.co.uk. It's aimed at intermediate PHP developers
    who want to
    create reusable code through PHP 5 classes. It explains the
    basic
    principles of Object-Oriented Programming (OOP), and contains
    practical
    examples, such as a server-side validation class, generating
    XML and RSS
    feeds, and simplifying date handling. It also explains
    several powerful
    features of PHP 5, such as SimpleXML, XMLWriter, and the
    Standard PHP
    Library (SPL).
    The book concentrates exclusively on PHP 5. The code will not
    work on PHP 4.
    David Powers, Adobe Community Expert
    Author, "The Essential Guide to Dreamweaver CS3" (friends of
    ED)
    Author, "PHP Solutions" (friends of ED)
    http://foundationphp.com/

    http://www.amazon.com/dp/1430210117?tag=japaninterfac-20&camp=14573&creative=327641&linkCo de=as1&creativeASIN=1430210117&adid=1HERPDYNB05EX6CJB7D2&
    http://tinyurl.com/63bkgu
    Ken Ford
    Adobe Community Expert Dreamweaver/ColdFusion
    Fordwebs, LLC
    http://www.fordwebs.com
    "Joe Makowiec" <[email protected]> wrote in
    message
    news:[email protected]..
    > On 19 Aug 2008 in macromedia.dreamweaver.appdev, David
    Powers wrote:
    >
    >> Michael White wrote:
    >>> From where do you recommend I buy it? (NY, USA)
    >>
    >> The place that would bring the greatest benefit to
    me is through the
    >> Amazon.com link on my site (see link in my sig).
    Amazon in the USA
    >> is offering it at a 34% discount. However, I'm
    delighted if anyone
    >> buys it anywhere.
    >
    > I didn't see a link to US Amazon, only Canada and UK?
    >
    > --
    > Joe Makowiec
    >
    http://makowiec.net/
    > Email:
    http://makowiec.net/contact.php

  • XML instance validation against XML schema

    How can I get a reference on the error node object after
    validation against an XML schema ?
    Ex. :
    DOMParser domP = new DOMParser();
    domP.setXMLSchema(schemaDoc); // schemaDoc = ref. on an XMLSchema
    domP.setValidationMode(XMLParser.SCHEMA_VALIDATION);
    domP.parse(reader); // reader contains the XML instance data
    If an error occurred, I only get a message string. What I need is to get a reference on the node object which contains the error in order to retrieve its properties to the schema.
    I could then alert the user with a message such as :
    "Data xxx is not valid ; it must be comprised between yy and zz...".
    Did somebody solve this problem ? May I use the XMLError class to do this ?
    Thank you

    Hi Ray,
    Were you able to resolve this issue? I am encountering a very similar problem where I am not connected to the internet and it fails during the newSchema method on javax.xml.validation.SchemaFactory. I have attempted to implement the suggestions of ExtremeGardener and vidyut with no luck.
    Per ExtremeGardener's suggestion of replacing xmlns:xs="http://www.w3.org/2001/XMLSchema" with xmlns:xs="XMLSchema.xsd" and storing it locally, it gave me an error for trying to set the "xs" or "xsd" prefixes to anything other than "http://www.w3.org/2001/XMLSchema." I forget the exact error. I also tried to use my own prefix and it did not like that either.
    Per vidyut's suggestion of using a catalog resolver, I believe that I have tried that too (if I understand correctly). I created an LSResourceResolver and tied it to the SchemaFactory. I can invoke it for a namespace but that did not resolve the issue because it only invokes the resolver on an import, include, or redefine. I believe that it is trying to reach the internet due to the xmlns:xs="http://www.w3.org/2001/XMLSchema" attribute within the top-level schema element in the XSD and I know of no way to invoke it for that.
    I also created an ErrorHandler and tied it to the SchemaFactory. That shows me the errors and they are all related to the standard XML data types defined in XMLSchema.xsd. The errors that I am seeing are all of this form: "UndeclaredPrefix: Cannot resolve 'xs:string' as a QName: the prefix 'xs' is not declared."
    I am currently using the SchemaFactory in Java 1.5, but I am thinking about trying the Xerces SchemaFactory since they are not exactly the same implementation.
    Does anyone have any other suggestions? Any help you can provide would be greatly appreciated!
    Thanks,
    betzro1

  • Trying to understand object oriented programming

    Hi all,
    I'm new to programming and I'm trying to learn C and Objective-C to eventually write an iPhone/iPad app.
    I want to make sure I'm understanding some fundamental Object Oriented principles and so I'm starting with a very basic program.
    I've produced a class called CartesianPoint which has an x and y variable plus methods to set and return these variables and also a method to calculate the magnitude from the origin.
    What I would like to do now is to extend the program to have a CartesianVector class.
    I'm a little unsure as to whether a Vector is a subclass of a Point or whether a Point is a subclass of a Vector... or neither?
    Secondly, I'm a little unsure of how to implement the vector class to use two point objects. How should the header and implementation files be set up to receive point objects from the main.m program?
    I'd like to also try and extend the program to include other ways of defining a vector (i.e. origin, unity vector and magnitude).... and then use the vectors to build 2D shapes.
    Many thanks,
    Glyn
    Message was edited by: GlynC
    Message was edited by: GlynC

    Hi Glyn -
    I agree with William and would vote for "neither". I see a subclass as a specialization of its superclass, not, for example, something contained by its superclass. A container relationship might apply to a subview and its superview, yet the class of the superview could be a specialization of the subview's class so the subview's class might be the parent of the superview's class. The classic example of cat as a subclass of animal (cat:animal) can be misleading if we see the relationship as member:group. Cat is a subclass of animal because it's a specialization.
    Also ask, "What's accomplished by making a subclass"? Does the subclass want to use all or most of the parent's instance variables and methods? Could the job be done any other way? Are any of those ways simpler or do they lead to more reusable code?
    One of the best examples (from the Cocoa docs?) is about a programmer who needs a specialized array. A newbie might immediately attempt a subclass of NSArray (a rather tricky subclassing job as it happens). In most cases however, the correct solution would be a class which includes an NSArray* type instance variable.
    Hope some of the above is helpful!
    \- Ray

  • Trying to reinstall CS5.5 Master Collection from DVD media on Windows 7 64 bit - setup.exe fails due to msxml3.dll error PDApp message [FATAL] PIM - Failed to Create XML instance : DOMDocument40 ADXML::initWithXMLPath Error:80040154

    If anyone is able to solve this they are a genius (or I am doing something very stupid!)
    I am trying to reinstall CS5.5 Master Collection from DVD media on Windows 7 64 bit PC but setup.exe fails due to a msxml3.dll error.
    Following a big bundle of recent Windows 7 updates, I started getting 'bad image' msxml3.dll error messages when opening any CS5.5 master collection program (Eg Premiere / Photoshop / Illustrator / Dreamweaver). Following advice on some threads here I tried uninstalling and then using the Adobe CC Cleaner Tool to clean up install, then reinstalling from my original DVD media.
    Whenever I try using run setup.exe from installtion disc 1 the installing fails due to 'Missing files'. I have also tried dowloading trial versions and runing setup.exe fro mthe downloaded files but i still get the same message.
    I have searched the forum and others have experienced this error but none of the solutions I have found seem to be working for me - as many seem to relate to download installations whereas I am installing from original DVD media (which worked fine before on the same PC)
    These are the FATAL messages from the PDApp log
    12/11/2014 15:29:27 [FATAL] PIM - Failed to Create XML instance : DOMDocument40 ADXML::initWithXMLPath Error:80040154
    12/11/2014 15:29:27 [FATAL] Setup - Could not initialize ADXML object
    12/11/2014 15:29:27 [FATAL] Setup - Unable to initialize. Error parsing setup.xml file
    The PDApp troubleshooting seems to indicate that this is caused by error in downloads but I am getting it with both original media DVD and downloads.
    I have also tried using my logon (which has admin privileges) and under our main admin account - and I get the same errors.
    Is a clean install of Windows 7 + CS5.5 my only option?
    Any help / info / advice / solutions very much appreciated! I have spent the last 2 days trying to sort this out and seem to be getting nowhere.
    Thanks.

    Thanks for the reply kglad - much appreciated.
    I have already tried that option (along with downloading files) as it was one of the solutions mentioned on other threads, but that also failed.
    Any other ideas?

Maybe you are looking for

  • Dynamic Action on IT0002 for France-Molga 06

    Hello, I would like to set up a dynamic action on IT0002 for France (Molga 06) - field State - 'GBDEP'. The field 'GBDEP' is a mandatory field for France, but the business is not maintaining the record of the Birth State of an employees. So I would l

  • Epub document in Marathi

    Task - Create a marathi unicode document and export it to epub. The epub file should be readable on iOS and Android. Problem - I have created an ebook using apple pages in Marathi Language. I have used marathi unicode font to do that. I have exported

  • ACH CCD vs CTX

    If an ACH payment file is created for 1 vendor and it has 2 or more invoices paid within that payment, NO addenda (record type 7) records are produced. If there is only 1 invoice, then the addenda record is produced. How do I get multiple addenda rec

  • What is the exact version of BCB/ICI ?

    Hi, According to Note 1268057, if CRM7.0 is installed, ICI version in it is 3.06. But when I access http://javahost:javaport/bcb, I find the ICI version is 3.00. Because I need to implement free seating function, 3.06 is a must. Do anybody know how t

  • Page item (date picker)

    I have added a date picker to my report . and in the report source I've added a where clause to filter the report as per the selected date(which is one of the columns in the table) but there is nothing shown. where DATE =:P23_DATE when I remove the w