on 12-16-2008 9:28 AM
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...
Please post the code that creates the table.
Armin
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
}
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
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
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
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
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
hi,
check whether u have bound the attributes to the node
Regards,
Satya.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
hi,
check whether the name of the child node u have provided is right.
it will be case sensitive.
Regards,
Satya.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
87 | |
10 | |
10 | |
10 | |
7 | |
6 | |
6 | |
5 | |
5 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.