cancel
Showing results for 
Search instead for 
Did you mean: 

ContextException: DataNodeInfo(AdminView): unknown child node IO

Former Member
0 Kudos

Hi all,

I am getting this exception while creating a Web Dynpro application which provides a drop-down menu (containing a list of tables from SQL server) for the user. The user can select a table from the drop-down, and when he clicks Submit, the contents of the table selected has to be displayed.

For this, I am creating a node in the context of the view dynamically and also adding attributes to the node corresponding to the columns of the table selected. I am doing this dynamic creation in the wdModifyView(). I am creating the view layout which displays the table-contents dynamically too.

But when I run the application, I am getting this exception. Following is the complete stack trace,

com.sap.tc.webdynpro.progmodel.context.ContextException: DataNodeInfo(AdminView): unknown child node IO

at com.sap.tc.webdynpro.progmodel.context.Paths.followMetaPath(Paths.java:794)

at com.sap.tc.webdynpro.progmodel.context.Paths.getAttributeInfoFor(Paths.java:234)

at com.sap.tc.webdynpro.clientserver.uielib.standard.uradapter.TableAdapter._getAlignment(TableAdapter.java:11239)

at com.sap.tc.webdynpro.clientserver.uielib.standard.uradapter.TableAdapter._calculateColumnHAlign(TableAdapter.java:12455)

at com.sap.tc.webdynpro.clientserver.uielib.standard.uradapter.TableAdapter.setViewAndNodeElement(TableAdapter.java:398)

at com.sap.tc.webdynpro.clientserver.uielements.adaptmgr.URAdapterManager.getAdapterFor(URAdapterManager.java:285)

at com.sap.tc.webdynpro.clientserver.uielements.adaptmgr.URAdapterManager.getAdapterFor(URAdapterManager.java:93)

at com.sap.tc.webdynpro.clientserver.uielements.adaptbase.AbstractAdapter.getAdapterFor(AbstractAdapter.java:495)

at com.sap.tc.webdynpro.clientserver.uielib.standard.uradapter.FlowLayoutAdapter$Items.getControl(FlowLayoutAdapter.java:368)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutItemFragment(FlowLayoutRenderer.java:288)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutFragment(FlowLayoutRenderer.java:244)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.render(FlowLayoutRenderer.java:49)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.ScrollContainerRenderer.renderScrollContainerFragment(ScrollContainerRenderer.java:619)

at com.sap.tc.ur.renderer.ie6.ScrollContainerRenderer.render(ScrollContainerRenderer.java:74)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.UiWindowRenderer.render(UiWindowRenderer.java:52)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.sendHtml(HtmlClient.java:1057)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.fillDynamicTemplateContext(HtmlClient.java:457)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.sendResponse(HtmlClient.java:1245)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.retrieveData(HtmlClient.java:253)

at com.sap.tc.webdynpro.clientserver.window.WindowPhaseModel.doRetrieveData(WindowPhaseModel.java:595)

at com.sap.tc.webdynpro.clientserver.window.WindowPhaseModel.processRequest(WindowPhaseModel.java:156)

at com.sap.tc.webdynpro.clientserver.window.WebDynproWindow.processRequest(WebDynproWindow.java:335)

at com.sap.tc.webdynpro.clientserver.cal.AbstractClient.executeTasks(AbstractClient.java:143)

at com.sap.tc.webdynpro.clientserver.session.ApplicationSession.doProcessing(ApplicationSession.java:321)

at com.sap.tc.webdynpro.clientserver.session.ClientSession.doApplicationProcessingStandalone(ClientSession.java:713)

at com.sap.tc.webdynpro.clientserver.session.ClientSession.doApplicationProcessing(ClientSession.java:666)

at com.sap.tc.webdynpro.clientserver.session.ClientSession.doProcessing(ClientSession.java:250)

at com.sap.tc.webdynpro.clientserver.session.RequestManager.doProcessing(RequestManager.java:150)

at com.sap.tc.webdynpro.serverimpl.defaultimpl.DispatcherServlet.doContent(DispatcherServlet.java:62)

at com.sap.tc.webdynpro.serverimpl.defaultimpl.DispatcherServlet.doPost(DispatcherServlet.java:53)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.runServlet(HttpHandlerImpl.java:401)

at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.handleRequest(HttpHandlerImpl.java:266)

at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:387)

at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:365)

at com.sap.engine.services.httpserver.server.RequestAnalizer.invokeWebContainer(RequestAnalizer.java:944)

at com.sap.engine.services.httpserver.server.RequestAnalizer.handle(RequestAnalizer.java:266)

at com.sap.engine.services.httpserver.server.Client.handle(Client.java:95)

at com.sap.engine.services.httpserver.server.Processor.request(Processor.java:175)

at com.sap.engine.core.service630.context.cluster.session.ApplicationSessionMessageListener.process(ApplicationSessionMessageListener.java:33)

at com.sap.engine.core.cluster.impl6.session.MessageRunner.run(MessageRunner.java:41)

at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37)

at java.security.AccessController.doPrivileged(Native Method)

at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:100)

at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:170)

Please help...

Accepted Solutions (0)

Answers (4)

Answers (4)

Former Member
0 Kudos

Please post the code that creates the table.

Armin

Former Member
0 Kudos

Here it is,

public static void wdDoModifyView(IPrivateAdminView wdThis, IPrivateAdminView.IContextNode wdContext, com.sap.tc.webdynpro.progmodel.api.IWDView view, boolean firstTime)

{

//@@begin wdDoModifyView

if (firstTime) {

} else {

String[] retString = null;

java.util.ArrayList arList = new java.util.ArrayList();

Context ctx = null;

DataSource ds = null;

String dataSource = "jdbc/WebCASDS";

try {

ctx = new InitialContext();

if (ctx == null) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Error - No Context");

}

ds = (DataSource) ctx.lookup(dataSource);

if (ds == null) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Error - No dataSource: " + ds);

}

} catch (ContextException ce) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside catch1: Context Exception" + ce);

} catch (Exception e) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("DataSource Look up Exception ");

}

try {

IWDDropDownByKey key =

(IWDDropDownByKey) view.getElement("DropDownByKey");

String TableName1 = key.getSelectedKey();

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Selected Table : " + TableName1);

Statement stmt = null;

ResultSet rs = null;

ResultSetMetaData rsmtadta = null;

int colCount;

int x = 0;

int i;

String[] colName = null;

String[] colType = null;

String sqlQuery = null;

stmt = conn1.createStatement();

sqlQuery = "select * from " + TableName1 + "";

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("SQL Query:" + sqlQuery);

stmt.execute(sqlQuery);

rs = stmt.executeQuery(sqlQuery);

rsmtadta = rs.getMetaData();

colCount = rsmtadta.getColumnCount();

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Column Count " + colCount);

colName = new String[colCount + 1];

colType = new String[colCount + 1];

for (i = 1; i <= colCount; i++) {

colName[i - 1] = rsmtadta.getColumnName(i);

colType[i - 1] = rsmtadta.getColumnTypeName(i);

if (colType[i - 1].equalsIgnoreCase("varchar")) {

colType[i - 1] = "ddic:com.sap.dictionary.string";

} else if (colType[i - 1].equalsIgnoreCase("datetime")) {

colType[i - 1] = "ddic:com.sap.tut.wd.languages.myDate";

}

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Column Name " + colName[i - 1]);

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Column Type " + colType[i - 1]);

}

//Creating a node corresponding to the selected table

IWDNodeInfo rootNodeInfo = wdContext.getNodeInfo();

IWDNodeInfo tableNodeInfo =

rootNodeInfo.addChild(

"TableSelected",

null,

true,

false,

true,

false,

false,

true,

null,

null,

null);

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("After node creation");

//Creating the attributes for the node created.. corresponding to the columns present in the selected table

for (i = 1; i <= colCount; i++) {

tableNodeInfo.addAttribute(colName[i - 1], colType[i - 1]);

}

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("After attribute creation");

IWDNode tableNode = wdContext.getChildNode("TableSelected", 0);

int rowCount = 0;

while (rs.next()) {

try {

IWDNodeElement tableElement = tableNode.createElement();

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside while before for, element initialized");

for (i = 1; i <= colCount; i++) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess(

"values1..."

+ rs.getObject(

colName[i - 1].toString()));

}

for (i = 1; i <= colCount; i++) {

tableElement.setAttributeValue(

colName[i - 1],

rs.getObject(colName[i - 1].toString()));

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside for, element row created");

}

tableNode.addElement(tableElement);

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Element created :" + tableElement);

rowCount++;

} catch (ContextException ce) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess(

"Inside catch2: Context Exception" + ce);

} catch (ClassCastException e) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Class cast exception" + e);

}

}

IWDTable table =

(IWDTable) view.createElement(IWDTable.class, null);

IWDNodeInfo tableNodeCreatedInfo = tableNode.getNodeInfo();

table.bindDataSource(tableNodeCreatedInfo);

IWDCaption tableCaption =

(IWDCaption) view.createElement(IWDCaption.class, null);

tableCaption.setText("Table Contents");

table.setHeader(tableCaption);

for (i = 1; i <= colCount; i++) {

IWDTableColumn column =

(IWDTableColumn) view.createElement(

IWDTableColumn.class,

"ColCaption" + i);

IWDCaption caption =

(IWDCaption) view.createElement(

IWDCaption.class,

"TableCaption" + i);

String header = colName[i - 1];

caption.setText(header);

column.setHeader((IWDCaption) caption);

table.addColumn(column);

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside for after creating column header");

}

// IWDUIElementContainer root =

// (IWDUIElementContainer) view.getRootElement();

// root.addChild(table);

int k = 1;

while (k <= rowCount) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside while layout creation after headers are in");

for (i = 1; i <= colCount; i++) {

IWDTableColumn innerColumn =

(IWDTableColumn) view.createElement(

IWDTableColumn.class,

null);

IWDNodeElement nodeElement =

tableNode.getElementAt(k - 1);

String attribValue =

nodeElement.getAttributeAsText(colName[i - 1]);

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess(

"Inside inner for, attrib value "

+ attribValue);

IWDTextView nameTextview1 =

(IWDTextView) view.createElement(

IWDTextView.class,

"nameTextview" + k + i);

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("After text-view creation");

nameTextview1.bindText(attribValue);

innerColumn.setTableCellEditor(

(IWDTableCellEditor) nameTextview1);

table.addColumn(innerColumn);

}

k++;

}

IWDUIElementContainer root =

(IWDUIElementContainer) view.getRootElement();

root.addChild(table);

} catch (ContextException ce) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside catch3: Context Exception" + ce);

} catch (RuntimeException e) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside catch : runtime exception" + e);

} catch (SQLException e) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("Inside catch : SQL exception" + e);

} catch (Exception e) {

wdContext

.wdGetAPI()

.getController()

.getComponent()

.getMessageManager()

.reportSuccess("..normal exc.." + e);

}

}

//@@end

}

Former Member
0 Kudos

String attribValue = nodeElement.getAttributeAsText(colName[i - 1]);
IWDTextView nameTextview1 = (IWDTextView) view.createElement(IWDTextView.class, "nameTextview" + k + i);
nameTextview1.bindText(attribValue);

This looks strange: You bind the "text" property to the value of the attribute in a certain node element. You should bind it to the attribute info instead.

Armin

Former Member
0 Kudos

Thanks a ton Armin!

It's working fine now, but the view layout is not rendered properly. It is creating a new column for every value after creating the column headers and displaying it. And these values are printed twice. I need to display these values below their corresponding column headers.

I also need to destroy the dynamically created node after rendering the view.

Please help me rectify these.

Edited by: kishan chandranna on Dec 17, 2008 7:15 AM

Former Member
0 Kudos

wdDoModifyView() is executed after each action, that could be the reason. You should change your code such that the table is recreated only when needed and the old columns are destroyed before the new ones are added.

Armin

Former Member
0 Kudos

Ok. Is there a way to destroy the dynamically created node after the view layout is rendered?

Kishan

Former Member
0 Kudos

You can only destroy all dynamically created nodes/attributes at once using IWDContext.reset(boolean).

Armin

Former Member
0 Kudos

Hi Armin,

It would be appreciative if you could tell me where I need to put this piece of code you mentioned- IWDContext.reset(boolean).

I tried to put the above line of code inside wdModifyView(), but there is no method called reset in the IWDContext class. Please help.

Kishan

Edited by: kishan chandranna on Dec 18, 2008 7:16 AM

Former Member
0 Kudos

I would move the code that recreates the context structure into some separate method(s) that is called from some event handler. In that event handler, you can set a flag (boolean context attribute) to inform wdDoModifyView() to rebuild the dynamic view parts. Reset this flag after that.

IWDContext.reset(boolean) exists since NW04.

Armin

Former Member
0 Kudos

Thanks Armin.

I will try doing things as you suggested.

Kishan

Former Member
0 Kudos

hi,

u said u have created the context dynamically right? if it is so check whether u have binded the attributes .

For Eg:

IWDNodeInfo soNodeInfo =

rootNodeInfo.addChild(

"SalesOrders", null,

true, false, true,

false, false,

true,

null,

null,

null);

soNodeInfo.addAttribute("OrderNo",

"ddic:com.sap.dictionary.integer");

Regards,

Satya.

Former Member
0 Kudos

That is exactly what I have done here,

for (i = 1; i <= colCount; i++) {

tableNodeInfo.addAttribute(colName[i - 1], colType[i - 1]);

}

Here, colName is an array containing all the names of the column and colType is an array containing the column types.

Thanks

Former Member
0 Kudos

hi,

check whether u have bound the attributes to the node

Regards,

Satya.

Former Member
0 Kudos

Hi,

This is my code for adding the attributes to the node created dynamically,

for (i = 1; i <= colCount; i++) {

tableNodeInfo.addAttribute(colName [i - 1] , colType [i - 1] );

}

Is this what you mean by binding the attributes to the node?

Thanks

Edited by: kishan chandranna on Dec 16, 2008 11:03 AM

Former Member
0 Kudos

hi,

check whether the name of the child node u have provided is right.

it will be case sensitive.

Regards,

Satya.

Former Member
0 Kudos

Thanks for the quick reply. But the exception is ContextException:DataNodeInfo(AdminView): unknown child node IO.

Here, IO is actually the value of the first attribute of the first element inside the node I have created dynamically. It is not the name of the node.

former_member192434
Active Contributor
0 Kudos

Hi

I think node binding is not done properly use this link to bind it properly

Thanks

Former Member
0 Kudos

Hi,

I am not creating the drop-down dynamically. What I am doing is, I am creating the view-layout for displaying the contents of the table selected from the drop-down.

Thanks