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 FunctionI 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 -
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 Williamshum 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.GSOracle 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 StaniszewskiHi 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 -
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,
praveenHi,
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,
JonHi 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. -
Hi Gurus,
I want to know thw difference between objectoriented program and abap general programme?
thanks in advanceHi 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 youHi 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: GlynCHi 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 -
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
-
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
-
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