<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7799155813168292187</id><updated>2024-09-10T17:39:54.941+02:00</updated><category term="apex"/><category term="ExtJS"/><category term="Item"/><category term="Javascript"/><category term="LOV"/><category term="Template"/><category term="ich"/><category term="jQuery"/><category term="oracle"/><title type='text'>apex2rule-the-world</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-607744256063767641</id><published>2016-06-08T11:41:00.000+02:00</published><updated>2016-06-08T11:42:55.030+02:00</updated><title type='text'>7 Tips to survive your first ever conference presentation ;)</title><content type='html'>&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-size: 11pt;&quot;&gt;Are you sometimes
bored or think, you would like to try something new? Something that
challenges you?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
I was bored, so I
submitted a last minute&amp;nbsp; abstract for
Apex Connect 2016 last november. You just have to write a little text about
what you would like to talk about. We all have something to talk about, right?
So that part was easy. And the conference was scheduled for april 2016. You
probably think… That is a loooooong time. Lots of time to finish the project,
prepare the perfect presentation and practice your speaker skills. Think again!&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
Deadlines have a
habit of sneaking up on you. So... &lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Tip No. 1 : Start right away!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
If it is not part of
your usual work anyway, schedule some time every week to work on your project
and/or presentation.&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
You might also want
to think about some presentations you can do to practice your speaker skills.
We have a regular thing called &quot;DevTalk&quot;, where anyone can speak
about stuff they&#39;re working on. Another opportunity could be a meetup&amp;nbsp; or a smaller conference in your area. Keep
your eyes open for things like that. It really helps.&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Tip No. 2: Keep it simple! &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
While preparing your
presentation you should keep in mind, that you usually only have 45 minutes
time for your presentation. You don&#39;t have time for all the interesting little
details you might want to talk about. So try to do an overview, so everyone gets
an overview of the topic and has a place to start to dig in. You can always
prepare an additional paper or some blog posts with more detailed information.&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
By the way… you
don&#39;t have to keep an eye on your watch the whole time. There will probably be
someone there, who will give you a sign, when your time runs out.&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Tip No. 3: &quot;Testdrive&quot; your final
presentation!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
Hopefully you are
done with your final presentation at least two weeks before the conference. I
did a trial run of my presentation for my colleagues. I got some great feedback
and i had a feeling how much time i really needed. I ended up changing a few things
and delete a view slides, since the presentation took a bit more time then i
had anticipated.&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Tip No. 4: Don&#39;t do last minute changes! (except of
course you really have to) &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
It&#39;s the day before
the presentation and you are probably quite nervous by now. At least i was and
i was constantly going over my slides. And every time i found something, that i
thought i could have done better. But I decided to leave it as is. I only did
one change. I added a slide with a quote I found on linkedIn earlier that day.&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;background: white; font-style: italic; font-weight: bold;&quot;&gt;&quot;No matter how
many mistakes you make or how slow you progress, you are still way ahead of
everyone who isn&#39;t trying.&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
I felt, that this
quote sums it up very well and it actually helped me to...&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Tip No.5: Have a good nights sleep!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
So, not much to say
about this one… &lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Tip No. 6: Don&#39;t freak out! Murphy will have his way,
anyway…&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
So, it is the day of
the presentation. You might fell like running the other way right now. I sure
did. I never was good at speaking in front of a crowd. Especially a crowd, i
did not know. So this was the moment i thought: What were you thinking???? The
hour before my slot i used to go over my presentation one more time and prepare
all the tools i would use in my demo. I felt really well prepared. And then
this happened….&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
I went into the room to set up my laptop, but the projector did not work. The tech guys got on it
right away but they did not get it to work before the talk was scheduled to
start. Since i knew exactly how much time i needed for my presentation i
decided to start without my slides. You usually have some introduction stuff
you can do without slides. So i hoped for the best and went on with it…&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
A few minutes into the presentation the doors opened and a really huge ladder was set up right in
front of me… it was kind of surreal, but funny at the same time… they worked on
the projector and finally got it to work. So i could move on and finish my presentation
with my slides and the demo. &lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;
&lt;div dir=&quot;ltr&quot; lang=&quot;en&quot;&gt;
Remote control 2.0 at &lt;a href=&quot;https://twitter.com/hashtag/apexconn16?src=hash&quot;&gt;#apexconn16&lt;/a&gt; during &lt;a href=&quot;https://twitter.com/anjeli2001&quot;&gt;@anjeli2001&lt;/a&gt; first public talk … &lt;a href=&quot;https://t.co/gDBF9GjQI1&quot;&gt;pic.twitter.com/gDBF9GjQI1&lt;/a&gt;&lt;/div&gt;
— Roel Hartman (@RoelH) &lt;a href=&quot;https://twitter.com/RoelH/status/724949107400400896&quot;&gt;April 26, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; charset=&quot;utf-8&quot; src=&quot;//platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div style=&quot;margin: 0in;&quot;&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;
&lt;div dir=&quot;ltr&quot; lang=&quot;en&quot;&gt;
Real Hardware issues on the software conference &lt;a href=&quot;https://twitter.com/hashtag/APEXconn16?src=hash&quot;&gt;#APEXconn16&lt;/a&gt;. And still calm: &lt;a href=&quot;https://twitter.com/anjeli2001&quot;&gt;@anjeli2001&lt;/a&gt; congrats! &lt;a href=&quot;https://t.co/4ahCZzh5gn&quot;&gt;pic.twitter.com/4ahCZzh5gn&lt;/a&gt;&lt;/div&gt;
— Stephan La Rocca (@StephanLaRocca) &lt;a href=&quot;https://twitter.com/StephanLaRocca/status/724949509336272899&quot;&gt;April 26, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; charset=&quot;utf-8&quot; src=&quot;//platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-size: 11pt;&quot;&gt;Did i mention that
this was the room where all the presentations where filmed. So there is proof
of this story somewhere.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
What I&#39;m trying to
say is… No matter how well prepared you feel, there are always things that can
and probably will go wrong. In that case: Don&#39;t freak out, just smile and talk
through it!&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Tip No.7: Relax and give yourself a pat on the
shoulder!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
You&#39;ve done it! You
made it through your very first conference presentation in one piece. Be proud
and enjoy the moment. &lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
So, there you have
it. My tips to survive your very first conference talk. I actually enjoyed the
experience enough to submit 3 abstracts for DOAG 2016 right away.&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
What about you? Any
fun stories about your first public talk?&lt;/div&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Calibri; font-size: 11.0pt; margin: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/607744256063767641/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2016/06/7-tips-to-survive-your-first-ever.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/607744256063767641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/607744256063767641'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2016/06/7-tips-to-survive-your-first-ever.html' title='7 Tips to survive your first ever conference presentation ;)'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-3992124885379245605</id><published>2010-03-07T11:06:00.002+01:00</published><updated>2010-03-07T11:09:44.689+01:00</updated><title type='text'>Refresh template based extjs tree dynamically...</title><content type='html'>&lt;div style=&#39;&#39; lang=&#39;en&#39;&gt;In the last few posts i talked about how to use apex templates to create extjs trees and property grids. In this post i will show you how to refresh these regions dynamically....&lt;br/&gt;Our report statement needs a special result set...&lt;br/&gt;&lt;pre class=&#39;brush:sql&#39;&gt;&amp;lt;br /&amp;gt;select  dname as CATEGORY&amp;lt;br /&amp;gt;      , empno as ID&amp;lt;br /&amp;gt;      , ename as NAME&amp;lt;br /&amp;gt;      , rank() over (partition by emp.deptno order by empno asc) as ROW_ASC&amp;lt;br /&amp;gt;from emp, dept&amp;lt;br /&amp;gt;where emp.deptno=dept.deptno&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;Next thing we need is a template... I called mine &quot;ExtJS_Tree_Report_With_Refresh&quot;.... It&#39;s basically the same as before....&lt;br/&gt;&lt;b&gt;Row Template 1&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;{&quot;text&quot;:&quot;#CATEGORY#&quot;,&quot;expanded&quot;:true,&quot;leaf&quot;:false,&quot;children&quot;:[&amp;lt;br /&amp;gt;{&quot;text&quot;:&quot;#NAME#&quot;,&quot;id&quot;:&quot;#ID#&quot;,&quot;leaf&quot;:true}&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Row Template 1 Expression&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;#ROW_ASC#=1 and #ROWNUM#=1&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Row Template 2&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;]},{&quot;text&quot;:&quot;#CATEGORY#&quot;,&quot;expanded&quot;:true,&quot;leaf&quot;:false,&quot;children&quot;:[&amp;lt;br /&amp;gt;{&quot;text&quot;:&quot;#NAME#&quot;,&quot;id&quot;:&quot;#ID#&quot;,&quot;leaf&quot;:true}&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Row Template 2 Expression&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;#ROW_ASC#=1 and #ROWNUM#!=1&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Row Template 3&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;,{&quot;text&quot;:&quot;#NAME#&quot;,&quot;id&quot;:&quot;#ID#&quot;,&quot;leaf&quot;:true}&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Row Template 3 Condition&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;#ROW_ASC#!=1&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Before Rows&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;&amp;lt;div id=&quot;tree-div#REGION_ID#&quot;&amp;gt;[&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;After Rows&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;]}]&amp;lt;/div&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&amp;lt;br /&amp;gt;  Ext.onReady(function(){&amp;lt;br /&amp;gt;  initTreeRegion(&#39;#REGION_ID#&#39;);&amp;lt;br /&amp;gt;  })&amp;lt;br /&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;The function &quot;initTreeRegion&quot; looks like that....&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;function initTreeRegion(pId) {&amp;lt;br /&amp;gt;    var myDiv = $x(&#39;tree-div&#39;+pId);&amp;lt;br /&amp;gt;    var myData = Ext.util.JSON.decode(myDiv.innerHTML);    &amp;lt;br /&amp;gt;        myDiv.innerHTML = &#39;&#39;;&amp;lt;br /&amp;gt;        new Ext.tree.TreePanel({&amp;lt;br /&amp;gt;          renderTo: &#39;tree-div&#39;+pId,&amp;lt;br /&amp;gt;          border:false,&amp;lt;br /&amp;gt;          id: &#39;REGION_&#39;+pId+&#39;_tree&#39;,&amp;lt;br /&amp;gt;          cls: &#39;myTreePanel&#39;,&amp;lt;br /&amp;gt;          margins: &#39;2 2 0 2&#39;,&amp;lt;br /&amp;gt;          autoScroll: true,&amp;lt;br /&amp;gt;          rootVisible: false,&amp;lt;br /&amp;gt;          root:{ &quot;text&quot;: &quot;rootnode&quot;,&amp;lt;br /&amp;gt;                 &quot;expanded&quot;: true,&amp;lt;br /&amp;gt;                 &quot;children&quot;: myData &amp;lt;br /&amp;gt;                }&amp;lt;br /&amp;gt;        });&amp;lt;br /&amp;gt;}&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;It just recreates the extjs tree using the json object generated by refreshing the report region via $a_report()....&lt;br/&gt;You can now easily refresh every tree region like that...&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;$a_report(&#39;9159609248948926&#39;,&#39;1&#39;,&#39;100&#39;);&amp;lt;br /&amp;gt;initTreeRegion(&#39;R9159609248948926&#39;);&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;You only need to know the ID of the region...&lt;br/&gt;Have fun...&lt;/div&gt;&lt;div style=&#39;display: none;&#39; lang=&#39;de&#39;&gt;Post only available in english!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/3992124885379245605/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/03/extjs-tree-via-apex-report-template.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3992124885379245605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3992124885379245605'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/03/extjs-tree-via-apex-report-template.html' title='Refresh template based extjs tree dynamically...'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-3769287955167000815</id><published>2010-02-12T13:26:00.001+01:00</published><updated>2010-02-12T13:26:07.880+01:00</updated><title type='text'>ExtJS Property Grids in APEX...</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;I found this&lt;a href=&#39;http://www.extjs.com/deploy/dev/examples/grid/property-grid.html&#39; target=&#39;_blank&#39;&gt; example for creating an extjs property grid&lt;/a&gt;, which made me think how nice it would be, to have this in apex.... so i played around and came up with another report template....&lt;br /&gt;Let&#39;s look at the example....&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;&lt;br /&gt;var propsGrid = new Ext.grid.PropertyGrid({&lt;br /&gt;        renderTo: &#39;prop-grid&#39;,&lt;br /&gt;        width: 300,&lt;br /&gt;        autoHeight: true,&lt;br /&gt;        source: {&lt;br /&gt;            &#39;(name)&#39;: &#39;Properties Grid&#39;,&lt;br /&gt;            grouping: false,&lt;br /&gt;            autoFitColumns: true,&lt;br /&gt;            productionQuality: false,&lt;br /&gt;            created: new Date(Date.parse(&#39;10/15/2006&#39;)),&lt;br /&gt;            tested: false,&lt;br /&gt;            version: 0.01,&lt;br /&gt;            borderWidth: 1&lt;br /&gt;        },&lt;br /&gt;        viewConfig : {&lt;br /&gt;            forceFit: true,&lt;br /&gt;            scrollOffset: 2 // the grid will never have scrollbars&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, what we basically have to do is to create the source part.... pretty much usual value pairs....&lt;br /&gt;So, i created a new report template of type &quot;Generic Columns (column template)&quot; ... I called it ExtJS_PropertyGrid_Report... &lt;br /&gt;&lt;b&gt;Before Rows&lt;/b&gt;&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;&lt;br /&gt;&amp;lt;div id=&quot;prop-grid#REGION_STATIC_ID#&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br /&gt;Ext.override(Ext.grid.PropertyGrid, {&lt;br /&gt;       removeProperty: function(property){&lt;br /&gt;            delete this.source[property];&lt;br /&gt;            var r = this.store.getById(property);&lt;br /&gt;            if(r){&lt;br /&gt;                // remove property&lt;br /&gt;                this.store.remove(r);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;   });&lt;br /&gt;&lt;br /&gt;function initRegion#REGION_STATIC_ID#() {&lt;br /&gt;    var propsGrid = new Ext.grid.PropertyGrid({&lt;br /&gt;        applyTo: &#39;prop-grid#REGION_STATIC_ID#&#39;,&lt;br /&gt;        id: &#39;myPropertyGrid#REGION_STATIC_ID#&#39;,&lt;br /&gt;        width: 300,&lt;br /&gt;        autoHeight: true,&lt;br /&gt;        source: {&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I copied more or less the example from above, added #REGION_STATIC_ID# to make the names and ids unique.... Then i just add a value pair for every column in the report.... (Reports, that use this template should only have one row!!!)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Column Template 1&lt;/b&gt;&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;&lt;br /&gt;&#39;#COLUMN_HEADER#&#39;:&#39;#COLUMN_VALUE#&#39;,&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I have a comma to much, so i add a dummy entry, which i instantly remove when the grid is created.....&lt;br /&gt;&lt;b&gt;After Rows&lt;/b&gt;&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;&lt;br /&gt;&#39;MYDUMMY123&#39;:&#39;&#39;},&lt;br /&gt;        viewConfig : {&lt;br /&gt;            forceFit: true,&lt;br /&gt;            scrollOffset: 2 // the grid will never have scrollbars&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;propsGrid.removeProperty(&#39;MYDUMMY123&#39;); // remove the dummy entry&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Ext.onReady(function(){&lt;br /&gt;  initRegion#REGION_STATIC_ID#();&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I put the whole magic inside a function, so i can call it again, wenn i refresh the report via $a_report()....&lt;br /&gt;Now we can create a report region with any select, that generates a one row result set.... the column names have to be unique....&lt;br /&gt;For example: &lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;&lt;br /&gt;select &#39;01.06.1980&#39; as &quot;Birthday&quot;&lt;br /&gt;     , &#39;Anja&#39; as &quot;Firstname&quot;&lt;br /&gt;     , &#39;Hildebrandt&#39; as &quot;Name&quot;&lt;br /&gt;     , &#39;Developer&#39; as &quot;Profession&quot; &lt;br /&gt;  from dual&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Select your new created template...&lt;br /&gt;The result shoul look something like this....&lt;br /&gt;&lt;img height=&#39;381&#39; width=&#39;634&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3MpednO056SHn7Se8jaK57-Nw64s_t7zj-Ef4iXoL9Vp9No8PIBmVS8ogXe8Xo9GoagQ8Uil5Z8eisnH8C-G_zKhxVjXraDUOJav2WAu5owA5hsqHHz68M0fK-BU7GpFeNLYaDAX08w/?imgmax=800&#39;/&gt;&lt;br /&gt;That&#39;s it....&lt;br /&gt;Have fun...&lt;br /&gt;Anja&lt;br /&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class=&#39;zemanta-pixie&#39;&gt;&lt;img src=&#39;http://img.zemanta.com/pixy.gif?x-id=dbe1126c-779e-82fe-acd1-02b10b737cab&#39; alt=&#39;&#39; class=&#39;zemanta-pixie-img&#39;/&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/3769287955167000815/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/02/extjs-property-grids-in-apex.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3769287955167000815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3769287955167000815'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/02/extjs-property-grids-in-apex.html' title='ExtJS Property Grids in APEX...'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3MpednO056SHn7Se8jaK57-Nw64s_t7zj-Ef4iXoL9Vp9No8PIBmVS8ogXe8Xo9GoagQ8Uil5Z8eisnH8C-G_zKhxVjXraDUOJav2WAu5owA5hsqHHz68M0fK-BU7GpFeNLYaDAX08w/s72-c?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-3093742900491107844</id><published>2010-02-09T11:38:00.001+01:00</published><updated>2010-02-09T11:56:53.427+01:00</updated><title type='text'>ExtJS tree via Apex report template....</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;div style=&#39;&#39; lang=&#39;en&#39;&gt;&lt;br/&gt;This morning i needed to show some data in a simple ExtJS tree... Just a view categories with a few children each.... I could have created the needed json string with the pl/sql function i described in an earlier post, but i finally decided to build a little report template to use for this easy stuff...&lt;br/&gt;That&#39;s what i came up with....&lt;br/&gt;&lt;br/&gt;Create a new report template of type &quot;Named Column (row template)&quot;... I called mine &quot;ExtJS_Tree_Report&quot;...&lt;br/&gt;&lt;br/&gt;Define the Row Templates as follows...&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Row Template 1&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;{  &quot;text&quot;     : &quot;#CATEGORY#&quot;&amp;lt;br /&amp;gt; , &quot;expanded&quot; : true&amp;lt;br /&amp;gt; , &quot;leaf&quot;     : false&amp;lt;br /&amp;gt; , &quot;children&quot; : [&amp;lt;br /&amp;gt;                  {  &quot;text&quot; : &quot;#NAME#&quot;&amp;lt;br /&amp;gt;                   , &quot;id&quot;   : &quot;#ID#&quot;&amp;lt;br /&amp;gt;                   , &quot;leaf&quot; : true&amp;lt;br /&amp;gt;                  }&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;Use Based on PL/SQL Expression: &lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;#ROW_ASC#=1 and #ROWNUM#=1&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Row Template 2&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;]},{  &quot;text&quot;     : &quot;#CATEGORY#&quot;&amp;lt;br /&amp;gt;    , &quot;expanded&quot; : true&amp;lt;br /&amp;gt;    , &quot;leaf&quot;     : false&amp;lt;br /&amp;gt;    , &quot;children&quot; : [&amp;lt;br /&amp;gt;                    {  &quot;text&quot; : &quot;#NAME#&quot;&amp;lt;br /&amp;gt;                     , &quot;id&quot;   : &quot;#ID#&quot;&amp;lt;br /&amp;gt;                     , &quot;leaf&quot; : true&amp;lt;br /&amp;gt;                    }&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;Use Based on PL/SQL Expression: &lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;#ROW_ASC#=1 and #ROWNUM#!=1&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Row Template 3&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;,{  &quot;text&quot; : &quot;#NAME#&quot;&amp;lt;br /&amp;gt;  , &quot;id&quot;   : &quot;#ID#&quot;&amp;lt;br /&amp;gt;  , &quot;leaf&quot; : true&amp;lt;br /&amp;gt; }&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;Use Based on PL/SQL Expression&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;#ROW_ASC#!=1&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Before Rows&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;&amp;lt;div id=&quot;tree-div#REGION_STATIC_ID#&quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&amp;lt;br /&amp;gt;Ext.onReady(function(){&amp;lt;br /&amp;gt;  new Ext.tree.TreePanel({&amp;lt;br /&amp;gt;            renderTo    : &#39;tree-div#REGION_STATIC_ID#&#39;,&amp;lt;br /&amp;gt;            border      : false,&amp;lt;br /&amp;gt;            id          : &#39;tree-panel&#39;,&amp;lt;br /&amp;gt;            margins     : &#39;2 2 0 2&#39;,&amp;lt;br /&amp;gt;            autoScroll  : true,&amp;lt;br /&amp;gt;            rootVisible : false,&amp;lt;br /&amp;gt;            root:{ &amp;lt;br /&amp;gt;                 &quot;text&quot;     : &quot;rootnode&quot;,&amp;lt;br /&amp;gt;                 &quot;expanded&quot; : true,&amp;lt;br /&amp;gt;                 &quot;children&quot; : [&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;After Rows&lt;/b&gt;&lt;br/&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;br /&amp;gt;     ]} &amp;lt;br /&amp;gt;   ]}&amp;lt;br /&amp;gt;  }); // new Ext.tree.TreePanel...  &amp;lt;br /&amp;gt;}); //Ext.onReady...&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;Now, create a new report region in your page with the following statement... &lt;br/&gt;&lt;pre class=&#39;brush:sql&#39;&gt;&amp;lt;br /&amp;gt;select  dname as CATEGORY&amp;lt;br /&amp;gt;      , empno as ID&amp;lt;br /&amp;gt;      , ename as NAME&amp;lt;br /&amp;gt;      , rank() over (partition by emp.deptno order by empno asc) as ROW_ASC&amp;lt;br /&amp;gt;from emp, dept&amp;lt;br /&amp;gt;where emp.deptno=dept.deptno&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br/&gt;These are the minimum columns my report template needs... &lt;br/&gt;In the report attributes select your created report template and disable pagination... &lt;br/&gt;That&#39;s it... Your result should look like this....&lt;br/&gt;&lt;br/&gt;&lt;img src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuAl142gOHIJR-_MC5zVkXLiLITrHdC0yNIBSAX_GZfgyBohBPsBWUKy6mcfJE8kHHPJx08Psh_XN-v6DE6kLWraIKHHggvCCHtTNf6EKTOExwNIx8-4sXBPYTZNCrQCKM-zT9Ky8Q1ZM/?imgmax=800&#39;/&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class=&#39;zemanta-pixie&#39;&gt;&lt;img class=&#39;zemanta-pixie-img&#39; alt=&#39;&#39; src=&#39;http://img.zemanta.com/pixy.gif?x-id=88929e2a-78da-808f-b115-71cd090e95ad&#39;/&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class=&#39;zemanta-pixie&#39;&gt;&lt;img src=&#39;http://img.zemanta.com/pixy.gif?x-id=2d98ad29-033a-8e7e-bf71-11483b8075fa&#39; alt=&#39;&#39; class=&#39;zemanta-pixie-img&#39;/&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/3093742900491107844/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/02/extjs-tree-via-apex-report-template.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3093742900491107844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3093742900491107844'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/02/extjs-tree-via-apex-report-template.html' title='ExtJS tree via Apex report template....'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuAl142gOHIJR-_MC5zVkXLiLITrHdC0yNIBSAX_GZfgyBohBPsBWUKy6mcfJE8kHHPJx08Psh_XN-v6DE6kLWraIKHHggvCCHtTNf6EKTOExwNIx8-4sXBPYTZNCrQCKM-zT9Ky8Q1ZM/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-3587824234030348142</id><published>2010-02-08T16:35:00.003+01:00</published><updated>2010-02-09T12:17:52.989+01:00</updated><title type='text'>APEX navigation bar in sexy extJS toolbar...</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;It&#39;s been a while ;).... But i have a lot of new APEX and ExtJS stuff to blog about. I&#39;ve been working on a complete extJs based template for my latest APEX project... So here is my first part of the upcoming series.... It&#39;s about how to get the usual apex navigation bar to show up in a sexy extJS toolbar... &lt;br /&gt;There are 3 options i always have in my toolbar - logout, help, home... I usually use image buttons, so my definition looks something like this...&lt;br /&gt;&lt;br /&gt;&lt;img style=&#39;max-width: 800px;&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0OUiYkeRJNaRRxOIj-z5LX6GCRmhOrP38jyUmK4TQGrU5E6BeEX1lka2Nnud2RC5VCr6O9mbTX4q3_nsw8C1hK7o9evrvKnDPcLiaMA3s0f6ZwQVP8DKJO-72rNbamAgkrdwwSeY4Ncg/?imgmax=800&#39;/&gt;&lt;br /&gt;And in more detail.... &lt;br /&gt;&lt;img style=&#39;max-width: 800px;&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4aBP1jDaxAtHczsYjudvuVttUnZpTyfMKMIcE1t0tS1Ff2-u6aK1xZ-x5oVpK34_77KNeC-PDrkHu7b60L8_NHIt6VjSUTR8nf5yW0D-78pI8uyUyJhOTKzmjIf7CEHA-eoxV97KDivE/?imgmax=800&#39;/&gt;&lt;br /&gt;Now we have to build up a little JSON object via navigation bar template.... This is what i put in my page template....&lt;br /&gt;&lt;br /&gt;&lt;b&gt;navigation bar&lt;/b&gt;&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;[{&lt;br /&gt;  xtype: &#39;box&#39;,&lt;br /&gt;  el: &#39;my_reg_pos_08&#39;&lt;br /&gt;},&#39;-&amp;gt;&#39;#BAR_BODY#]&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;navigation bar entry&lt;/b&gt;&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;,{&lt;br /&gt;  xtype: &#39;box&#39;,&lt;br /&gt;  autoEl: {&lt;br /&gt;    tag: &#39;a&#39;,&lt;br /&gt;    href: &#39;#LINK#&#39;,&lt;br /&gt;    cn: &#39;&amp;lt;img src=&quot;#IMAGE#&quot; alt=&quot;#TEXT#&quot; /&amp;gt;&#39;,&lt;br /&gt;    title : &#39;#TEXT#&#39;&lt;br /&gt;  }&lt;br /&gt;},{xtype: &#39;tbspacer&#39;, width: 10}&lt;br /&gt;&lt;/pre&gt;As you can see, I build the complete json string to define my toolbar items.... I also include one of my region-position-divs (defined in the body below), because i need a bit of form-magic inside my toolbar....&lt;b&gt;&lt;br /&gt;&lt;/b&gt;The body looks something like this...&lt;b&gt;&lt;br /&gt;&lt;br /&gt;body&lt;/b&gt;&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;div id=&quot;my_nav_bar&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;myTabs&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_messages&quot;&amp;gt;#GLOBAL_NOTIFICATION##SUCCESS_MESSAGE##NOTIFICATION_MESSAGE#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_box_body&quot; width=&quot;100%&quot;&amp;gt;#BOX_BODY#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_01&quot;&amp;gt;#REGION_POSITION_01#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_02&quot;&amp;gt;#REGION_POSITION_02#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_03&quot;&amp;gt;#REGION_POSITION_03#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_04&quot;&amp;gt;#REGION_POSITION_04#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_05&quot;&amp;gt;#REGION_POSITION_05#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_06&quot;&amp;gt;#REGION_POSITION_06#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_07&quot;&amp;gt;#REGION_POSITION_07#&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;my_reg_pos_08&quot;&amp;gt;#REGION_POSITION_08#&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br /&gt;Ext.onReady(function(){&lt;br /&gt;   var nb = #NAVIGATION_BAR#;&lt;br /&gt;   var tb = new Ext.Toolbar({renderTo: &#39;my_nav_bar&#39;, items: nb});&lt;br /&gt;&lt;br /&gt;var myform = new Ext.ux.FormViewport({&lt;br /&gt;        layout:&#39;border&#39;,&lt;br /&gt;        items:[new Ext.Panel({&lt;br /&gt;                    region:&#39;north&#39;,&lt;br /&gt;                    id: &#39;my_toolbar&#39;,&lt;br /&gt;                    height: 40,&lt;br /&gt;                    collapsible: false,&lt;br /&gt;                    margins:&#39;0 0 0 0&#39;,&lt;br /&gt;                    allowDomMove:false,&lt;br /&gt;                    tbar: tb                  &lt;br /&gt;                   }),new Ext.Panel({&lt;br /&gt;                    region:&#39;south&#39;,&lt;br /&gt;                    id: &#39;footer&#39;,&lt;br /&gt;                    height: 22,&lt;br /&gt;                    collapsible: false,&lt;br /&gt;                    margins:&#39;0 0 0 0&#39;,&lt;br /&gt;                    html:&#39;&amp;lt;div id=&quot;DeveloperToolbar&quot;&amp;gt;&amp;lt;/div&amp;gt;&#39;        &lt;br /&gt;                   }),&lt;br /&gt;              new Ext.Panel({&lt;br /&gt;            region:&#39;west&#39;,&lt;br /&gt;            id:&#39;my_info&#39;,&lt;br /&gt;            title:&#39;Info&#39;,&lt;br /&gt;            split:true,&lt;br /&gt;            width: 220,&lt;br /&gt;            minSize: 175,&lt;br /&gt;            maxSize: 400,&lt;br /&gt;            collapsible: true,&lt;br /&gt;            margins:&#39;40 0 5 5&#39;,&lt;br /&gt;            cmargins:&#39;40 0 5 5&#39;,&lt;br /&gt;            contentEl: &#39;my_reg_pos_01&#39;,&lt;br /&gt;            layoutConfig:{&lt;br /&gt;                animate:true&lt;br /&gt;            }&lt;br /&gt;        }),new Ext.Panel({region:&#39;center&#39;,&lt;br /&gt;            margins:&#39;40 5 5 5&#39;,&lt;br /&gt;            id: &#39;my_workarea&#39;,&lt;br /&gt;            items: [tabs],&lt;br /&gt;            layout : &quot;fit&quot;&lt;br /&gt;        })&lt;br /&gt;              ]&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;I don&#39;t use any usual html table layout. I only define a bunch of div regions according to the region positions, messages, navigation bar etc...&lt;br /&gt;In the onReady-function i use the #NAVIGATION_BAR# substitution string to put my created json string inside a variable.&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;var nb = #NAVIGATION_BAR#;&lt;/pre&gt;Then i use nb as item parameter for my toolbar object ...&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;var tb = new Ext.Toolbar({renderTo: &#39;my_nav_bar&#39;, items: nb});&lt;/pre&gt;After that i am able to use tb in my actual page layout.... If everything works, it shoul look something like this.... &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img height=&#39;423&#39; width=&#39;736&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ItuyAXf2rK3RuGP518W4HNbJTimRe2p90kkGkSIzXzj21yZvW19wcKox7yssiXdXkjyjsA4mlsUUHWC69J3-6sUzHI7MkAL9TLlWavEqU-2PFQas4pplL-uTeDllUWIWdfFt1qVCf3k/?imgmax=800&#39; style=&#39;max-width: 800px;&#39;/&gt;&lt;br /&gt;&lt;br /&gt;In case your wondering... I used the &lt;a href=&#39;http://oracleinsights.blogspot.com/2009/04/extjs-customized-viewport-for-oracle.html&#39;&gt;customized viewport from Mark Lancaster&lt;/a&gt; to make sure, that my elements stay inside my apex form... &lt;br /&gt;To get my developer toolbar inside the footer i used another tip from Mark, which you find &lt;a href=&#39;http://oracleinsights.blogspot.com/2008/02/moving-developer-toolbar-with-extjs.html&#39;&gt;here&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class=&#39;zemanta-pixie&#39;&gt;&lt;img src=&#39;http://img.zemanta.com/pixy.gif?x-id=0d61a6e5-7236-8982-b263-4f71072ee691&#39; alt=&#39;&#39; class=&#39;zemanta-pixie-img&#39;/&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/3587824234030348142/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/02/long-time-no-post-and-what-i-did-in.html#comment-form' title='4 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3587824234030348142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/3587824234030348142'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2010/02/long-time-no-post-and-what-i-did-in.html' title='APEX navigation bar in sexy extJS toolbar...'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0OUiYkeRJNaRRxOIj-z5LX6GCRmhOrP38jyUmK4TQGrU5E6BeEX1lka2Nnud2RC5VCr6O9mbTX4q3_nsw8C1hK7o9evrvKnDPcLiaMA3s0f6ZwQVP8DKJO-72rNbamAgkrdwwSeY4Ncg/s72-c?imgmax=800" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-758657955356345738</id><published>2009-11-20T18:56:00.005+01:00</published><updated>2009-11-21T22:24:01.519+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apex"/><category scheme="http://www.blogger.com/atom/ns#" term="ExtJS"/><category scheme="http://www.blogger.com/atom/ns#" term="Template"/><title type='text'>Regions as tabs using ExtJS... (Regionen als Tabs anzeigen mit ExtJS)</title><content type='html'>&lt;div lang=&#39;en&#39; style=&#39; color: rgb(204,102,0)&#39;&gt;Title: Regions as tabs using ExtJS... &lt;/div&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;I&#39;m working on an &lt;a href=&#39;http://extjs.com&#39;&gt;ExtJS&lt;/a&gt;-Theme right now. One of the first features i wanted to integrate was to show regions as tabs, but i wanted it to be defined only by the position of the region and its template. To do that i created the following region template.&lt;/div&gt; &lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;Ich arbeite momentan an einem &lt;a href=&#39;http://extjs.com&#39;&gt;ExtJS&lt;/a&gt;-Theme. Eine der ersten Funktionalitäten, die ich hierbei vorgesehen habe, ist das anzeigen von Regionen als Tabs. Dabei möchte ich keine großartigen Einstellungen in den einzelnen Regionen selbst vornehmen, sondern nur über die Positionierung definieren, welche Regionen als Tab angezeigt werden. Hierfür hab ich zunächst ein Regionstemplate wie folgt angelegt.&lt;/div&gt; &lt;script class=&#39;brush: html&#39; type=&#39;syntaxhighlighter&#39;&gt;&lt;br/&gt;&lt;div id=&quot;#REGION_STATIC_ID#&quot; #REGION_ATTRIBUTES# class=&quot;x-tab&quot; title=&quot;#TITLE#&quot;&gt;&lt;br/&gt; &lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;0&quot; width=&quot;90%&quot;&gt;&lt;br/&gt;  &lt;tr&gt;&lt;br/&gt;   &lt;td&gt;&lt;br/&gt;    &lt;div class=&quot;Buttons#REGION_ID#&quot; style=&quot;display:none;&quot;&gt;  &lt;br/&gt;     #CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#  &lt;br/&gt;    &lt;/div&gt;&lt;br/&gt;   &lt;/td&gt;&lt;br/&gt;  &lt;/tr&gt;&lt;br/&gt;  &lt;tr&gt;&lt;br/&gt;   &lt;td&gt;#BODY#&lt;/td&gt;&lt;br/&gt;  &lt;/tr&gt;&lt;br/&gt; &lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;&lt;/script&gt; &lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;The attribute class=”x-tab” marks the regions that should be displayed as tabs. The title attribute defines the name of the tab (title=”#TITLE#”). Now we have to change a few things in our page template. For my little example i want all regions in the BOX_BODY area to be displayed as tabs, so i place the #BOX_BODY# inside a div-tag.&lt;/div&gt;&lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;Das Attribut class=”x-tab” kennzeichnet die umzuwandelnden Regionen. Als Tabbezeichnung wird der Titel der Region angezeigt (title=”#TITLE#”). Als nächstes sind ein paar Änderungen am Seitentemplate notwendig. Für mein kleines Beispiel möchte ich, das alle Regionen im BOX_BODY als Tabs angezeigt werden. Dazu schließe ich diesen in eine benannte DIV-Region ein.&lt;/div&gt; &lt;pre name=&#39;code&#39; class=&#39;brush:html&#39;&gt;&lt;div id=&quot;box_body&quot;&gt;#BOX_BODY#&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;Next thing to do is to put the following javascript inside the page-template too. It uses the &lt;a href=&#39;http://www.extjs.com/deploy/dev/docs/output/Ext.TabPanel.html#Ext.TabPanel-autoTabs&#39;&gt;autoTabs-Option&lt;/a&gt; of ExtJS, which creates tabs based on existing markup.&lt;/div&gt;&lt;br /&gt;&lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;Nun nutze ich die &lt;a href=&#39;http://www.extjs.com/deploy/dev/docs/output/Ext.TabPanel.html#Ext.TabPanel-autoTabs&#39;&gt;autoTabs-Option&lt;/a&gt; von ExtJS, um die vorhandenen Regionen im BOX_BODY automatisch in Tabs umzuwandeln. Dazu folgendes Skript ebenfalls ins Seitentemplate kopieren.&lt;/div&gt;&lt;br /&gt;&lt;pre class=&#39;brush:js&#39;&gt;&lt;script type=&quot;text/javascript&quot;&gt; &lt;br /&gt;    Ext.onReady(function(){&lt;br /&gt;&lt;br /&gt;    var tabs = new Ext.TabPanel({ &lt;br /&gt;          applyTo: &#39;box_body&#39;, &lt;br /&gt;&lt;br /&gt;          activeTab: 0, &lt;br /&gt;&lt;br /&gt;          deferredRender: false, &lt;br /&gt;&lt;br /&gt;          width: &quot;700&quot;, &lt;br /&gt;&lt;br /&gt;          autoTabs: true &lt;br /&gt;&lt;br /&gt;      }); &lt;br /&gt;&lt;br /&gt;  }); &lt;br /&gt;  &lt;/script&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;In this script two parameters are important. First one is the “autoTabs:true”, which triggers the ExtJS feature we&#39;re using to replace our normal regions with tab-regions. Second one is “applyTo: ‘box_body’”, which defines the div-region this feature should be used on. Now we are ready to display regions as tabs by setting our created region template and positioning the region inside the BOX_BODY.&lt;/div&gt;&lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;Wichtig hierbei sind die Parameter “autoTabs:true” und “applyTo: ‘box_body’”, die angeben auf welchen Bereich die autoTab-Funktion angewendet werden soll. Nun genügt es beim Erstellen einer neuen Region das neue Regionstemplate anzugeben und die Region im BOX_BODY zu platzieren.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEqZxQ4qEwBm4sTmlEoLSE4VDdvkMjQQ1vSWToooyro753HT2S7jr4XyXLj7Hk_4xwLuXRjbxE6Xx0TD7isiIpXYB3z_9wp9fqMQtiXLdkUHUComtbPb7yMnEY7Ax0i7UupelMV0q5vhk/s1600-h/image%5B4%5D.png&#39;&gt;&lt;img height=&#39;152&#39; border=&#39;0&#39; width=&#39;822&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRRuLbnZSiV_lMXoUC0lnVJj7ooqT_Id4r-9ijHppJZKDr3smx3uxrwikJgc4H4hZPb-8MjTMtAGHBCxTtU6VIf0HFu4aVvS0UKbBg8sdAt5IrnwcZoASdUPG9UbWIEj5ci0GYY0pVooI/?imgmax=800&#39; alt=&#39;image&#39; title=&#39;image&#39; style=&#39;border: 0px none ; display: inline;&#39;/&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;The result should look something like this.&lt;/div&gt;&lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;Das Ergebnis sollte etwa so aussehen.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqU4cbU5BDvaXP11oCem5WnIn1pyD4r61hw-T1_TXO7z0nZjrDbQPpRXBTJXOS_-uTQ215T2SfBHaCQi_ew0YL0sCDQm0rqIyZO8wy531hl3nLTUQ-ZxYb38fmLPE3lzxEyb3nlaIz9GA/s1600-h/image%5B3%5D.png&#39;&gt;&lt;img height=&#39;233&#39; border=&#39;0&#39; width=&#39;346&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzfLBZY8YYydhq6Jyj1_t56FNdUyn2l5GX7z0yUZfH0VtD-X00YOgtxSO21y2UCEgEdCnPJ0t0bxgX3x_-t23uqp-MAOqwMEILqBVK1HVQr9IHDXdr5hPPb-k9fOoQinHzv4r6vse76dk/?imgmax=800&#39; alt=&#39;image&#39; title=&#39;image&#39; style=&#39;border-width: 0px; display: inline;&#39;/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;By the way, the usual conditions to show or hide the regions still work.&lt;/div&gt;&lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;Übrigens funktioniert das bedingte ein- und ausblenden der Regionen immer noch.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/758657955356345738/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/11/regionen-als-tabs-anzeigen-mit-extjs.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/758657955356345738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/758657955356345738'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/11/regionen-als-tabs-anzeigen-mit-extjs.html' title='Regions as tabs using ExtJS... (Regionen als Tabs anzeigen mit ExtJS)'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRRuLbnZSiV_lMXoUC0lnVJj7ooqT_Id4r-9ijHppJZKDr3smx3uxrwikJgc4H4hZPb-8MjTMtAGHBCxTtU6VIf0HFu4aVvS0UKbBg8sdAt5IrnwcZoASdUPG9UbWIEj5ci0GYY0pVooI/s72-c?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-1642808094304316381</id><published>2009-10-02T12:26:00.007+02:00</published><updated>2009-11-23T17:58:31.201+01:00</updated><title type='text'>Nice trees with ExtJS (Erstellung eines ExtJS-Baums…)</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;div lang=&#39;de&#39; style=&#39;display: none;&#39;&gt;&lt;div align=&#39;justify&#39;&gt;&lt;table cellspacing=&#39;0&#39; cellpadding=&#39;2&#39; border=&#39;0&#39; width=&#39;100%&#39;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&#39;157&#39; valign=&#39;top&#39;&gt;&lt;a href=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3MMtFMk37pImFDSaRhxb3_plx_QcFK3oUpiQ6BtdvWrK7wVGYtDCmkkaE11w4wtdRmXZxb2QJ6UTlehQttqMb2GJiI_2jHPDevUvTv1QZiKN0_i-gk-l3LWdeippkYbQqYzX9AktIzmA/s1600-h/image2.png&#39;&gt;&lt;img height=&#39;244&#39; border=&#39;0&#39; width=&#39;145&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUDFKM8gHmmozWr4Nu1h5RYEaexmwa6ZfQM4JrX3H3u_KVVK6q6WfFiFy2-6ajlrfDsEExAFhCR8kYiQLqtjYzZUz9wjflU8NLP3u0eXhKYl_Rj5JOAOcTpGL-BW740ldTjnAr1Ei6Q64/?imgmax=800&#39; alt=&#39;image&#39; title=&#39;image&#39; style=&#39;border-width: 0px; display: inline;&#39;/&gt;&lt;/a&gt;&lt;/td&gt;            &lt;td valign=&#39;top&#39;&gt;Bekannterweise ist die in APEX standardmäßig verfügbare Baumstruktur suboptimal und nicht wirklich sexy. Abhilfe kann hier die ExtJS-Bibliothek schaffen, die eine einfach zu definierende Baumstruktur anbietet. Links ist ein Beispiel einer solchen sexy Baumstruktur…              &lt;br /&gt;In diesem Beitrag möcht ich kurz zeigen, wie sich ein solcher Baum einfach in eine APEX-Anwendung einbinden und mit Daten aus der Datenbank füttern lässt.&lt;br /&gt;Meistens wird beim Austausch von Standardelementen der Weg bevorzugt, das Element erst von APEX laden zu lassen und es dann entsprechend zu verändern. Ich denke bei einem Baum ist das nicht unbedingt notwendig, so das ich diesen von Grund auf durch ExtJS generieren werde.&lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;   &lt;/div&gt;    &lt;p align=&#39;justify&#39;&gt;Zunächst mal ein paar Worte zu ExtJS. ExtJS ist ein clientseitiges Javascript bzw. AJAX-Framework, das browserunabhängige Funktionalitäten für die DOM-Manipulation, Event-Handling oder auch asynchrone Serverkommunikation zur Verfügung stellt. Die API von ExtJS ist leicht erlernbar und wirklich intuitiv nutzbar, da sie fast vollständig JSON gestützt ist. &lt;/p&gt;    &lt;p align=&#39;justify&#39;&gt;Für das folgende Beispiel wurde eine APEX-Anwendung mit einer Seite erstellt. Innerhalb dieser Seite gibt es eine einfache Region, die als Inhalt eine DIV-Region mit der Id “tree” definiert.&lt;/p&gt;    &lt;p align=&#39;justify&#39;&gt;Folgende Stylesheets und Javascript-Dateien aus dem ExtJS-Package sollten im Headerbereich eingebunden sein.&lt;/p&gt;    &lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;#IMAGE_PREFIX#javascript/ext-2.2.1/resources/css/ext-all.css&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;#IMAGE_PREFIX#javascript/ext-2.2.1/adapter/ext/ext-base.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;#IMAGE_PREFIX#javascript/ext-2.2.1/ext-all.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;Zusätzlich wurde folgende JS-Funktion im Footer der Seite hinterlegt.&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;    Ext.onReady(function(){&lt;br /&gt;    new Ext.Panel({&lt;br /&gt;      title: &#39;My first tree&#39;,&lt;br /&gt;      renderTo: &#39;tree&#39;,&lt;br /&gt;      layout: &#39;border&#39;,&lt;br /&gt;      width: 500,&lt;br /&gt;      height: 500,&lt;br /&gt;      items: [{&lt;br /&gt;          xtype: &#39;treepanel&#39;,&lt;br /&gt;          id: &#39;tree-panel&#39;,&lt;br /&gt;          region: &#39;center&#39;,&lt;br /&gt;          margins: &#39;2 2 0 2&#39;,&lt;br /&gt;          autoScroll: true,&lt;br /&gt;          rootVisible: false,&lt;br /&gt;          root: { text: &quot;rootnode&quot;,&lt;br /&gt;              expanded: true,&lt;br /&gt;              children: [{ text:&quot;node 1&quot;,&lt;br /&gt;                           id:1,&lt;br /&gt;                           leaf:true&lt;br /&gt;                         },&lt;br /&gt;                         { text: &quot;node 2&quot;,&lt;br /&gt;                           id: 2,&lt;br /&gt;                           leaf:false,&lt;br /&gt;                           expanded: true,&lt;br /&gt;                           children:[{ text:&quot;node 1&quot;,&lt;br /&gt;                                         id:3,&lt;br /&gt;                                       leaf:true&lt;br /&gt;                                     }&lt;br /&gt;                                    ]&lt;br /&gt;                         }&lt;br /&gt;                        ]&lt;br /&gt;                },&lt;br /&gt;&lt;br /&gt;      }]&lt;br /&gt;  });&lt;br /&gt;});&lt;/pre&gt;&lt;br /&gt;  &lt;p align=&#39;justify&#39;&gt;Was passiert hier? Ganz einfach…&lt;br /&gt;    &lt;br /&gt;Wenn die Seite vollständig geladen ist, wird die onReady-Funktion ausgeführt. Innerhalb dieser Funktion wird ein neues ExtJS-Panel mit dem Titel “My first tree” generiert. Die Option renderTo gibt an, in welchem Bereich der Seite das neu erstellte Panel eingefügt wird. In diesem Beispiel die in unserer Seite definierte DIV-Region.&lt;br /&gt;    &lt;br /&gt;Innerhalb dieses Panels wird ein TreePanel generiert, was einen nicht sichtbaren (rootVisible:false) Root-Knoten bekommt, der zwei Unterknoten (children) “node 1” und “node 2” enthält. “node 2” wiederum hat einen weiteren Unterknoten. &lt;/p&gt;&lt;br /&gt;  &lt;p align=&#39;left&#39;&gt;Die entscheidenden Werte zur Definition einen Knoten sind:&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;text&lt;/em&gt;&lt;/strong&gt;: Der Text der für den betreffenden Knoten im Baum angezeigt werden soll.&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;id&lt;/em&gt;&lt;/strong&gt;: Eine eindeutige Bezeichnung für den Knoten, z.B. die tatsächliche numerische ID einer Kategorie oder ähnliches.&lt;br /&gt;   &lt;br /&gt;&lt;strong&gt;&lt;em&gt;leaf&lt;/em&gt;&lt;/strong&gt;: Diese Option gibt an, ob der betreffende Knoten ein Blatt ist oder ob er weiter Unterknoten enthält.&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;children&lt;/em&gt;&lt;/strong&gt;: Ist ein Array der Unterknoten, sofern vorhanden.&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;href&lt;/em&gt;&lt;/strong&gt;: Muss gesetzt werden, falls der Knoten als Link funktionieren soll.&lt;br /&gt;&lt;br /&gt;Nun hat man natürlich eher selten eine feste Baumstruktur abzubilden. Normalerweise wollen wir eine dynamische Struktur aus der Datenbank laden.&lt;br /&gt;    &lt;br /&gt;Hierzu erstellen wir eine Datenbank-Funktion, die das JSON-Objekt als Text zurückgibt. Da es relativ mühselig wäre die dafür benötigte Struktur zusammenzubauen, bin ich mal auf die Suche nach einer fertigen Lösung gegangen. Und siehe da, es gibt bereits ein &lt;a target=&#39;_blank&#39; href=&#39;http://database-geek.com/2009/03/25/json-in-and-out-of-oracle-json-data-type&#39;&gt;JSON-Datentyp für Oracle&lt;/a&gt;. Vielen Dank an Lewis Cunningham dafür.&lt;br /&gt;    &lt;br /&gt;Ok, bereiten wir also erstmal ein paar Testdaten und die benötigte Funktion auf der Datenbank vor.&lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;create table tbl_mon_category (cat_id number, cat_par_id number, cat_label varchar2(100));&lt;br /&gt;&lt;br /&gt;insert into tbl_mon_category (cat_id,cat_par_id,cat_label) values (1,0,&#39;Node 1&#39;);&lt;br /&gt;insert into tbl_mon_category (cat_id,cat_par_id,cat_label) values (2,0,&#39;Node 2&#39;);&lt;br /&gt;insert into tbl_mon_category (cat_id,cat_par_id,cat_label) values (3,1,&#39;Childnode A for Node 1&#39;);&lt;br /&gt;insert into tbl_mon_category (cat_id,cat_par_id,cat_label) values (4,2,&#39;Childnode A for Node 2&#39;);&lt;br /&gt;insert into tbl_mon_category (cat_id,cat_par_id,cat_label) values (5,2,&#39;Childnode B for Node 2&#39;);&lt;br /&gt;insert into tbl_mon_category (cat_id,cat_par_id,cat_label) values (6,2,&#39;Childnode C for Node 2&#39;);&lt;br /&gt;commit;&lt;br /&gt;&lt;br /&gt;create or replace package PCK_EXTJS_JSON_EXAMPLE is&lt;br /&gt;&lt;br /&gt;-- Author  : AHILDEBRANDT&lt;br /&gt;-- Created : 10.08.2009&lt;br /&gt;&lt;br /&gt;-- Purpose : Prüfen, ob eine Kategorie und Unterkategorien hat&lt;br /&gt;function hasChildren(i_cat_id in number) return boolean;&lt;br /&gt;&lt;br /&gt;-- Purpose : anhand einer übergebenen Kategorie-ID das&lt;br /&gt;--           vollständige JSON-Objekt generieren (nutzt&lt;br /&gt;--           Datentyp PL/JSON; arbeitet rekursiv!)&lt;br /&gt;function getJsonObject(i_cat_id in number default 0) return json;&lt;br /&gt;&lt;br /&gt;-- Purpose : Aufruf der Funktion zum Generieren des&lt;br /&gt;--          JSON-Objekts und Rückgabe des Ergebnisses&lt;br /&gt;--          als String&lt;br /&gt;function getTreeDataDynamic return varchar2;&lt;br /&gt;&lt;br /&gt;end PCK_EXTJS_JSON_EXAMPLE;&lt;br /&gt;/&lt;br /&gt;create or replace package body PCK_EXTJS_JSON_EXAMPLE is&lt;br /&gt;/*&lt;br /&gt;-- Author  : AHILDEBRANDT&lt;br /&gt;-- Created : 10.08.2009&lt;br /&gt;-- Purpose : Prüfen, ob eine Kategorie und Unterkategorien hat&lt;br /&gt;*/&lt;br /&gt;function hasChildren(i_cat_id in number) return boolean is&lt;br /&gt;v_count number:=0;&lt;br /&gt;begin&lt;br /&gt;select nvl(count(*),0) into v_count from tbl_mon_category where cat_par_id=i_cat_id;&lt;br /&gt;if v_count&amp;gt;0 then&lt;br /&gt;  return true;&lt;br /&gt;else&lt;br /&gt;  return false;&lt;br /&gt;end if;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;-- Author  : AHILDEBRANDT&lt;br /&gt;-- Created : 10.08.2009&lt;br /&gt;-- Purpose : anhand einer übergebenen Kategorie-ID das vollständige JSON-Objekt generieren&lt;br /&gt;--           (nutzt Datentyp PL/JSON)&lt;br /&gt;--           ACHTUNG! REKURSIV!&lt;br /&gt;*/&lt;br /&gt;function getJsonObject(i_cat_id in number default 0) return json is&lt;br /&gt;v_json json:=json();&lt;br /&gt;v_arr_id NUMBER;&lt;br /&gt;v_ele_id NUMBER;&lt;br /&gt;begin&lt;br /&gt;if i_cat_id = 0 then -- wenn Kategorie 0 dann wird das der Root-Knoten mit festen Werten&lt;br /&gt;  v_json.add_member(p_name =&amp;gt; &#39;id&#39;, p_value =&amp;gt; i_cat_id);&lt;br /&gt;  v_json.add_member(p_name =&amp;gt; &#39;text&#39;, p_value =&amp;gt; &#39;root&#39;);&lt;br /&gt;else -- sonst regulärer Knoten; Werte für die Kategorie benutzen&lt;br /&gt;  for cat in (select * from tbl_mon_category where cat_id=i_cat_id) loop&lt;br /&gt;    v_json.add_member(p_name =&amp;gt; &#39;id&#39;, p_value =&amp;gt; i_cat_id);&lt;br /&gt;    v_json.add_member(p_name =&amp;gt; &#39;text&#39;, p_value =&amp;gt; cat.cat_label);&lt;br /&gt;  end loop;&lt;br /&gt;end if;&lt;br /&gt;&lt;br /&gt;if not hasChildren(i_cat_id) then -- wenn Knoten keine Child-Knoten hat&lt;br /&gt;  v_json.add_member(p_name =&amp;gt; &#39;leaf&#39;, p_value =&amp;gt; true); -- als Blatt markieren und fertig&lt;br /&gt;  v_json.add_member(p_name =&amp;gt; &#39;href&#39;, p_value =&amp;gt; &#39;f?p=108:2:&#39;||v(&#39;APP_SESSION&#39;)); -- einen Link setzen&lt;br /&gt;else -- sonst&lt;br /&gt;  v_json.add_member(p_name =&amp;gt; &#39;leaf&#39;, p_value =&amp;gt; false); -- als Knoten mit Unterknoten kennzeichnen&lt;br /&gt;  v_json.add_array(p_name =&amp;gt; &#39;children&#39;, p_array_id =&amp;gt; v_arr_id ); -- Array für Unterknoten hinzufügen&lt;br /&gt;  for child in (select * from tbl_mon_category where cat_par_id=i_cat_id) loop -- Schleife über alle Unterkategorien&lt;br /&gt;    -- Unterknoten über rekursiven Aufruf generieren und ins Array hängen&lt;br /&gt;    v_json.add_array_element(p_array_id =&amp;gt; v_arr_id, p_value =&amp;gt; getJsonObject(i_cat_id =&amp;gt; child.cat_id), p_element_id =&amp;gt; v_ele_id);&lt;br /&gt;  end loop;&lt;br /&gt;end if;&lt;br /&gt;&lt;br /&gt;return v_json;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;-- Author  : AHILDEBRANDT&lt;br /&gt;-- Created : 10.08.2009&lt;br /&gt;-- Purpose : Aufruf der Funktion zum Generieren des JSON-Objekts und Rückgabe des Ergebnisses als String&lt;br /&gt;*/&lt;br /&gt;function getTreeDataDynamic return varchar2 is&lt;br /&gt;v_json json:=json();&lt;br /&gt;begin&lt;br /&gt;v_json:=getJsonObject(i_cat_id =&amp;gt; 0);&lt;br /&gt;return(v_json.getString);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end PCK_EXTJS_JSON_EXAMPLE;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;Als nächstes benötigen wir einen bedarfsgesteuerten Anwendungsprozess &quot;getTreeData&quot;, der die Package-Funktion aufruft.&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;declare&lt;br /&gt;&lt;br /&gt;v_json varchar2(32767);&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;v_json:=PCK_EXTJS_JSON_EXAMPLE.getTreeDataDynamic;&lt;br /&gt;&lt;br /&gt;htp.prn(v_json);&lt;br /&gt;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;Als letzten Schritt muss nun noch die vorhandene Javascript-Funktion angepasst werden.&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;Ext.onReady(&lt;br /&gt;function(){&lt;br /&gt;&lt;br /&gt;var TreeRequest = new htmldb_Get(null,$v(&#39;pFlowId&#39;),&#39;APPLICATION_PROCESS=getTreeData&#39;,0);&lt;br /&gt;var TreeResponse = TreeRequest.get();&lt;br /&gt;if (TreeResponse) {&lt;br /&gt;  var v_extjs_tree_data= Ext.util.JSON.decode(TreeResponse);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;  new Ext.Panel({&lt;br /&gt;    title: &#39;My first tree&#39;,&lt;br /&gt;    renderTo: &#39;tree&#39;,&lt;br /&gt;    layout: &#39;border&#39;,&lt;br /&gt;    width: 500,&lt;br /&gt;    height: 500,&lt;br /&gt;    items: [{&lt;br /&gt;      xtype: &#39;treepanel&#39;,&lt;br /&gt;      id: &#39;tree-panel&#39;,&lt;br /&gt;      region: &#39;center&#39;,&lt;br /&gt;      margins: &#39;2 2 0 2&#39;,&lt;br /&gt;      autoScroll: true,&lt;br /&gt;      rootVisible: false,&lt;br /&gt;      root: v_extjs_tree_data,&lt;br /&gt;    }]&lt;br /&gt;  });&lt;br /&gt;}&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;Das Ergebnis sollte in etwa wie folgt aussehen.&lt;br /&gt;  &lt;br /&gt;&lt;a href=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_hY_BWxfG-bNryc3uAFG9h2rf4Rrg4_0spwSyzBNEWHCY5nV_RMjt_1TWQgHKoJXfbNatnIro5abEX8Rxt_921ckV3SFFfzwCHlkH7ZTBhS4lYokRq3dVyVgPCJ-RWB2ykljcrKjqDaA/s1600-h/image%5B3%5D.png&#39;&gt;&lt;img height=&#39;182&#39; border=&#39;0&#39; width=&#39;219&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK-NlE9P8zfhNM6sfpcBKzAK_hn4hXU1az-fn74K2YGeGuKJDDgb2NeLTai64pkoxUm7FWhVv1-XNqG2YnQB-1-XYkRcmdjZOE06t_bAyeouUniCJWhcgfiwaTQPzFvIKHp8RHusYtE-c/?imgmax=800&#39; alt=&#39;image&#39; title=&#39;image&#39; style=&#39;border-width: 0px; display: inline;&#39;/&gt;&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;Und das war’s auch schon….&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div lang=&#39;en&#39; style=&#39;&#39;&gt;&lt;div lang=&#39;en&#39; style=&#39;color: rgb(204, 102, 0);&#39;&gt;Title: How to create an ExtJS-Tree... &lt;/div&gt;&lt;div align=&#39;justify&#39;&gt;&lt;table cellspacing=&#39;0&#39; cellpadding=&#39;2&#39; border=&#39;0&#39; width=&#39;100%&#39;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&#39;157&#39; valign=&#39;top&#39;&gt;&lt;a href=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3MMtFMk37pImFDSaRhxb3_plx_QcFK3oUpiQ6BtdvWrK7wVGYtDCmkkaE11w4wtdRmXZxb2QJ6UTlehQttqMb2GJiI_2jHPDevUvTv1QZiKN0_i-gk-l3LWdeippkYbQqYzX9AktIzmA/s1600-h/image2.png&#39;&gt;&lt;img height=&#39;244&#39; border=&#39;0&#39; width=&#39;145&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUDFKM8gHmmozWr4Nu1h5RYEaexmwa6ZfQM4JrX3H3u_KVVK6q6WfFiFy2-6ajlrfDsEExAFhCR8kYiQLqtjYzZUz9wjflU8NLP3u0eXhKYl_Rj5JOAOcTpGL-BW740ldTjnAr1Ei6Q64/?imgmax=800&#39; alt=&#39;image&#39; title=&#39;image&#39; style=&#39;border-width: 0px; display: inline;&#39;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign=&#39;top&#39;&gt;&lt;br /&gt;You probably all now, that the apex trees aren&#39;t really sexy. Therefore i decided to give ExtJS a shot. On the left you can see a tree build with ExtJS. Nice, isn&#39;t it?&lt;br /&gt;This post shows how you can integrate an ExtJS tree like this in your apex application.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Let&#39;s start with a few words about ExtJS. ExtJS is a clientside javascript and ajax framework, that provides browser independent functionality for DOM-manipulation, event-handling or asynchronous server communication. The api is really easy to learn and to use, because it is completely based on JSON.&lt;br /&gt;  &lt;br /&gt;For the example in this post i created an application with one page. This page contains a region in which a div-region with id &quot;tree&quot; is defined.&lt;br /&gt;  &lt;br /&gt;The following stylesheets and javascript-files have to be included in the header of the page.&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;#IMAGE_PREFIX#javascript/ext-2.2.1/resources/css/ext-all.css&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;#IMAGE_PREFIX#javascript/ext-2.2.1/adapter/ext/ext-base.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;#IMAGE_PREFIX#javascript/ext-2.2.1/ext-all.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;Now we put the following function in the page footer.&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;    Ext.onReady(function(){&lt;br /&gt;    new Ext.Panel({&lt;br /&gt;      title: &#39;My first tree&#39;,&lt;br /&gt;      renderTo: &#39;tree&#39;,&lt;br /&gt;      layout: &#39;border&#39;,&lt;br /&gt;      width: 500,&lt;br /&gt;      height: 500,&lt;br /&gt;      items: [{&lt;br /&gt;          xtype: &#39;treepanel&#39;,&lt;br /&gt;          id: &#39;tree-panel&#39;,&lt;br /&gt;          region: &#39;center&#39;,&lt;br /&gt;          margins: &#39;2 2 0 2&#39;,&lt;br /&gt;          autoScroll: true,&lt;br /&gt;          rootVisible: false,&lt;br /&gt;          root: { text: &quot;rootnode&quot;,&lt;br /&gt;              expanded: true,&lt;br /&gt;              children: [{ text:&quot;node 1&quot;,&lt;br /&gt;                           id:1,&lt;br /&gt;                           leaf:true&lt;br /&gt;                         },&lt;br /&gt;                         { text: &quot;node 2&quot;,&lt;br /&gt;                           id: 2,&lt;br /&gt;                           leaf:false,&lt;br /&gt;                           expanded: true,&lt;br /&gt;                           children:[{ text:&quot;node 1&quot;,&lt;br /&gt;                                         id:3,&lt;br /&gt;                                       leaf:true&lt;br /&gt;                                     }&lt;br /&gt;                                    ]&lt;br /&gt;                         }&lt;br /&gt;                        ]&lt;br /&gt;                },&lt;br /&gt;&lt;br /&gt;      }]&lt;br /&gt;  });&lt;br /&gt;});&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;After the page is completely loaded the onReady-Function creates an ExtJS-Panel with the title &quot;My first tree&quot;, which is rendered to our defined div-region.&lt;br /&gt;  &lt;br /&gt;Inside this panel the treepanel is created with an invisible root-node and two childnodes &quot;node 1&quot; and &quot;node 2&quot;. &quot;node 2&quot; has another childnode.&lt;br /&gt;  &lt;p align=&#39;left&#39;&gt;The most important options to define a node are:&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;text&lt;/em&gt;&lt;/strong&gt;: text to be displayed in the tree&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;id&lt;/em&gt;&lt;/strong&gt;: id for the node, which should be unique in the tree&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;leaf&lt;/em&gt;&lt;/strong&gt;: this option shows wether the node is a leaf or not&lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;children&lt;/em&gt;&lt;/strong&gt;: an array of childnodes if there are any&lt;br /&gt; &lt;br /&gt;&lt;font color=&#39;#ff0000&#39;&gt;&lt;strong&gt;&lt;em&gt;href&lt;/em&gt;&lt;/strong&gt;: has to be set for the node to work as a link (line 68 next scriptblock)&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;    &lt;br /&gt;Usually we need to load dynamic data from the database.&lt;br /&gt;    &lt;br /&gt;To do that, we will create a database function, that gives us a generated JSON-Object as a string.&lt;br /&gt;    &lt;br /&gt;After a bit of research i found that Lewis Cunningham already build a &lt;a target=&#39;_blank&#39; href=&#39;http://database-geek.com/2009/03/25/json-in-and-out-of-oracle-json-data-type&#39;&gt;JSON-Datatype for Oracle&lt;/a&gt;. Thanks for that, because that makes our task really easy.&lt;br /&gt;    &lt;br /&gt;The following script creates a table, some test data and a package with needed functions.&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;create table tbl_category (cat_id number, cat_par_id number, cat_label varchar2(100));&lt;br /&gt;&lt;br /&gt;insert into tbl_category (cat_id,cat_par_id,cat_label) values (1,0,&#39;Node 1&#39;);&lt;br /&gt;insert into tbl_category (cat_id,cat_par_id,cat_label) values (2,0,&#39;Node 2&#39;);&lt;br /&gt;insert into tbl_category (cat_id,cat_par_id,cat_label) values (3,1,&#39;Childnode A for Node 1&#39;);&lt;br /&gt;insert into tbl_category (cat_id,cat_par_id,cat_label) values (4,2,&#39;Childnode A for Node 2&#39;);&lt;br /&gt;insert into tbl_category (cat_id,cat_par_id,cat_label) values (5,2,&#39;Childnode B for Node 2&#39;);&lt;br /&gt;insert into tbl_category (cat_id,cat_par_id,cat_label) values (6,2,&#39;Childnode C for Node 2&#39;);&lt;br /&gt;commit;&lt;br /&gt;&lt;br /&gt;create or replace package PCK_EXTJS_JSON_EXAMPLE is&lt;br /&gt;&lt;br /&gt;  -- Author  : AHILDEBRANDT&lt;br /&gt;  -- Created : 10.08.2009&lt;br /&gt;&lt;br /&gt;  -- Purpose : check if category has sub-categories&lt;br /&gt;  function hasChildren(i_cat_id in number) return boolean;&lt;br /&gt;&lt;br /&gt;  -- Purpose : create JSON-Object for category;&lt;br /&gt;  --           recursive&amp;lt;br/&amp;gt;  function getJsonObject(i_cat_id in number default 0) return json;&lt;br /&gt;&lt;br /&gt;  -- Purpose : function that calls getJsonObject and returns the result as string&lt;br /&gt;  function getTreeDataDynamic return varchar2;&lt;br /&gt;&lt;br /&gt;end PCK_EXTJS_JSON_EXAMPLE;&lt;br /&gt;/&lt;br /&gt;create or replace package body PCK_EXTJS_JSON_EXAMPLE is&lt;br /&gt;/*&lt;br /&gt;  -- Author  : AHILDEBRANDT&lt;br /&gt;  -- Created : 10.08.2009&lt;br /&gt;  -- Purpose : check if category has sub-categories&lt;br /&gt;*/&lt;br /&gt;function hasChildren(i_cat_id in number) return boolean is&lt;br /&gt;  v_count number:=0;&lt;br /&gt;begin&lt;br /&gt;  select nvl(count(*),0) into v_count from tbl_category where cat_par_id=i_cat_id;&lt;br /&gt;  if v_count&amp;gt;0 then&lt;br /&gt;    return true;&lt;br /&gt;  else&lt;br /&gt;    return false;&lt;br /&gt;  end if;  &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;  -- Author  : AHILDEBRANDT&lt;br /&gt;  -- Created : 10.08.2009&lt;br /&gt;  -- Purpose : create JSON-Object for category;&lt;br /&gt;  --           recursive&lt;br /&gt;*/&lt;br /&gt;function getJsonObject(i_cat_id in number default 0) return json is&amp;lt;br/&amp;gt;  v_json json:=json();&lt;br /&gt;  v_arr_id NUMBER;&lt;br /&gt;  v_ele_id NUMBER;&lt;br /&gt;begin&lt;br /&gt;  if i_cat_id = 0 then -- if category is root then set root-node&lt;br /&gt;    v_json.add_member(p_name =&amp;gt; &#39;id&#39;, p_value =&amp;gt; i_cat_id);&lt;br /&gt;    v_json.add_member(p_name =&amp;gt; &#39;text&#39;, p_value =&amp;gt; &#39;root&#39;);&lt;br /&gt;  else -- else --&amp;gt; usual node; use category infos&lt;br /&gt;    for cat in (select * from tbl_category where cat_id=i_cat_id) loop&lt;br /&gt;      v_json.add_member(p_name =&amp;gt; &#39;id&#39;, p_value =&amp;gt; i_cat_id);&lt;br /&gt;      v_json.add_member(p_name =&amp;gt; &#39;text&#39;, p_value =&amp;gt; cat.cat_label);&lt;br /&gt;    end loop;&lt;br /&gt;  end if;&lt;br /&gt;&lt;br /&gt;  if not hasChildren(i_cat_id) then -- if node has no children&lt;br /&gt;    v_json.add_member(p_name =&amp;gt; &#39;leaf&#39;, p_value =&amp;gt; true); -- mark as leaf&lt;br /&gt;    v_json.add_member(p_name =&amp;gt; &#39;href&#39;, p_value =&amp;gt; &#39;f?p=108:2:&#39;||v(&#39;APP_SESSION&#39;)); -- set a link if needed&lt;br /&gt;  else -- sonst&lt;br /&gt;    v_json.add_member(p_name =&amp;gt; &#39;leaf&#39;, p_value =&amp;gt; false); -- mark as node with children&lt;br /&gt;    v_json.add_array(p_name =&amp;gt; &#39;children&#39;, p_array_id =&amp;gt; v_arr_id ); -- add array for subcategories&lt;br /&gt;    for child in (select * from tbl_category where cat_par_id=i_cat_id) loop -- loop through all sub-categories&lt;br /&gt;      -- create JSON-object for sub-category using recursive call and the append to array&lt;br /&gt;      v_json.add_array_element(p_array_id =&amp;gt; v_arr_id, p_value =&amp;gt; getJsonObject(i_cat_id =&amp;gt; child.cat_id), p_element_id =&amp;gt; v_ele_id);&lt;br /&gt;    end loop;&lt;br /&gt;  end if;&lt;br /&gt;&lt;br /&gt;  return v_json;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;  -- Author  : AHILDEBRANDT&lt;br /&gt;  -- Created : 10.08.2009&lt;br /&gt;  -- Purpose : function that calls getJsonObject and returns the result as string&lt;br /&gt;*/&lt;br /&gt;function getTreeDataDynamic return varchar2 is&lt;br /&gt;  v_json json:=json();&lt;br /&gt;begin&lt;br /&gt;  v_json:=getJsonObject(i_cat_id =&amp;gt; 0);&lt;br /&gt;  return(v_json.getString);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end PCK_EXTJS_JSON_EXAMPLE;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;Next thing we need is an on-demand application process &quot;getTreeData&quot;, that will call our package-function.&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;declare&lt;br /&gt;&lt;br /&gt;v_json varchar2(32767);&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;v_json:=PCK_EXTJS_JSON_EXAMPLE.getTreeDataDynamic;&lt;br /&gt;&lt;br /&gt;htp.prn(v_json);&lt;br /&gt;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;Only thing left to do is changing our javascript-function...&lt;br /&gt;  &lt;pre class=&#39;brush:js&#39;&gt;Ext.onReady(&lt;br /&gt;function(){&lt;br /&gt;&lt;br /&gt;var TreeRequest = new htmldb_Get(null,$v(&#39;pFlowId&#39;),&#39;APPLICATION_PROCESS=getTreeData&#39;,0);&lt;br /&gt;var TreeResponse = TreeRequest.get();&lt;br /&gt;if (TreeResponse) {&lt;br /&gt;  var v_extjs_tree_data= Ext.util.JSON.decode(TreeResponse);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;  new Ext.Panel({&lt;br /&gt;    title: &#39;My first tree&#39;,&lt;br /&gt;    renderTo: &#39;tree&#39;,&lt;br /&gt;    layout: &#39;border&#39;,&lt;br /&gt;    width: 500,&lt;br /&gt;    height: 500,&lt;br /&gt;    items: [{&lt;br /&gt;      xtype: &#39;treepanel&#39;,&lt;br /&gt;      id: &#39;tree-panel&#39;,&lt;br /&gt;      region: &#39;center&#39;,&lt;br /&gt;      margins: &#39;2 2 0 2&#39;,&lt;br /&gt;      autoScroll: true,&lt;br /&gt;      rootVisible: false,&lt;br /&gt;      root: v_extjs_tree_data,&lt;br /&gt;    }]&lt;br /&gt;  });&lt;br /&gt;}&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;The result should look like this...&lt;br /&gt;  &lt;br /&gt;&lt;a href=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_hY_BWxfG-bNryc3uAFG9h2rf4Rrg4_0spwSyzBNEWHCY5nV_RMjt_1TWQgHKoJXfbNatnIro5abEX8Rxt_921ckV3SFFfzwCHlkH7ZTBhS4lYokRq3dVyVgPCJ-RWB2ykljcrKjqDaA/s1600-h/image%5B3%5D.png&#39;&gt;&lt;img height=&#39;182&#39; border=&#39;0&#39; width=&#39;219&#39; src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK-NlE9P8zfhNM6sfpcBKzAK_hn4hXU1az-fn74K2YGeGuKJDDgb2NeLTai64pkoxUm7FWhVv1-XNqG2YnQB-1-XYkRcmdjZOE06t_bAyeouUniCJWhcgfiwaTQPzFvIKHp8RHusYtE-c/?imgmax=800&#39; alt=&#39;image&#39; title=&#39;image&#39; style=&#39;border-width: 0px; display: inline;&#39;/&gt;&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;And that&#39;s it....&lt;br /&gt;  &lt;p/&gt;&lt;br /&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class=&#39;zemanta-pixie&#39;&gt;&lt;img src=&#39;http://img.zemanta.com/pixy.gif?x-id=c4cc266a-97eb-8b3e-9a88-d211480575f1&#39; alt=&#39;&#39; class=&#39;zemanta-pixie-img&#39;/&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/1642808094304316381/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/10/erstellung-eines-extjs-baums.html#comment-form' title='4 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/1642808094304316381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/1642808094304316381'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/10/erstellung-eines-extjs-baums.html' title='Nice trees with ExtJS (Erstellung eines ExtJS-Baums…)'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUDFKM8gHmmozWr4Nu1h5RYEaexmwa6ZfQM4JrX3H3u_KVVK6q6WfFiFy2-6ajlrfDsEExAFhCR8kYiQLqtjYzZUz9wjflU8NLP3u0eXhKYl_Rj5JOAOcTpGL-BW740ldTjnAr1Ei6Q64/s72-c?imgmax=800" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-5270438621827154438</id><published>2009-06-30T11:28:00.002+02:00</published><updated>2009-11-21T22:37:17.791+01:00</updated><title type='text'>Apex Developer Competition 2009</title><content type='html'>&lt;div style=&quot;&quot; lang=&quot;en&quot;&gt;   &lt;p&gt;Just got news, that there will be an apex competition this year...&lt;/p&gt;    &lt;p&gt;&lt;a title=&quot;http://www.oracle.com/technology/products/database/application_express/html/competition.html&quot; href=&quot;http://www.oracle.com/technology/products/database/application_express/html/competition.html&quot;&gt;http://www.oracle.com/technology/products/database/application_express/html/competition.html&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;You can win tickets for this years Oracle Open World, so better go now and submit your application ;) ...&lt;/p&gt;    &lt;p&gt;Good luck...&lt;/p&gt;    &lt;p&gt;Anja&lt;/p&gt; &lt;/div&gt;  &lt;div lang=&quot;de&quot; style=&quot;display:none;&quot;&gt;   &lt;p&gt;Habe gerade einen Link zum diesjährigen internationalen APEX Wettbewerb bekommen.&lt;/p&gt;    &lt;p&gt;&lt;a title=&quot;http://www.oracle.com/technology/products/database/application_express/html/competition.html&quot; href=&quot;http://www.oracle.com/technology/products/database/application_express/html/competition.html&quot;&gt;http://www.oracle.com/technology/products/database/application_express/html/competition.html&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Es gibt Tickets für die Open World zu gewinnen, also am besten gleich registrieren und Applikation hochladen…&lt;/p&gt;    &lt;p&gt;Viel Erfolg&lt;/p&gt;    &lt;p&gt;Anja&lt;/p&gt; &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/5270438621827154438/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/apex-contest-2009.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/5270438621827154438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/5270438621827154438'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/apex-contest-2009.html' title='Apex Developer Competition 2009'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-8859490594997323339</id><published>2009-06-29T16:30:00.001+02:00</published><updated>2009-06-30T14:25:30.874+02:00</updated><title type='text'>APEXLIB und was noch so geht…</title><content type='html'>&lt;div style=&quot;display: none; color: rgb(204,102,0)&quot; lang=&quot;en&quot;&gt;Title: ApexLib and what you can do with it... &lt;/div&gt;  &lt;div lang=&quot;de&quot;&gt;   &lt;p&gt;Viele kennen bestimmt das ApexLib-Framework von Patrick Wolf…. Ich bin darüber gestolpert, als ich auf der Suche nach einer Möglichkeit war, anhand der aktuell eingegebenen Daten zu entscheiden, das bestimmte Felder required sein sollen oder eben nicht. Mit Bordmitteln von Apex kam ich da nicht weiter. Selbst die ApexLib half mir zunächst nicht weiter, bis ich dann etwas Zeit fand, um mir das ganze mal näher anzusehen.&lt;/p&gt;    &lt;p&gt;Wie funktioniert’s?&lt;/p&gt;    &lt;p&gt;Ganz einfach! ApexLib laut Anleitung installieren und in die betreffende Anwendung integrieren. Dann kann man auch schon die diversen Hints nutzen. Zum Beispiel reicht der String “$APEXLIB_REQUIRED$&amp;quot; im Kommentar des Items aus damit das Framework eine hübsche Out-of-the-box-Validierung daraus baut (mit Inline-Fehlermeldung u.ä.).&lt;/p&gt;    &lt;p&gt;Das gefiel mir gut, also sah ich mir das genauer an….&lt;/p&gt;    &lt;p&gt;Alle Beschreibungsdaten der Seiten, Felder, Regionen u.Ä. werden in der Datenbank gespeichert. Diese Tatsache nutzt das ApexLib-Framework aus. Bei der Installation werden verschiedene Views angelegt, z.B. APEXLIB_V_PAGE_ITEM. Diese View enthält alle Daten der Seitenelemente (also auch den Kommentar). Da kam mir dann die Idee… Warum nicht einfach diese View so anpassen, das sie anhand von Daten in der aktiven Session (mit der V-Funktion kann man ja alle Werte abrufen) den Eintrag im Kommentar dynamisch erzeugt. Gesagt, getan…. und was soll ich sagen…. funktioniert perfekt…&lt;/p&gt;    &lt;p&gt;Nachteil von der ganzen Geschichte ist natürlich, das man aufpassen muss, wenn man eine neuere Version des Frameworks installiert.&lt;/p&gt;    &lt;p&gt;Vielleicht hilft es ja doch dem ein oder anderen weiter, der eine ähnliche Anforderung bekommen hat…&lt;/p&gt;    &lt;p&gt;Das war’s für heute…&lt;/p&gt;    &lt;p&gt;Anja&lt;/p&gt; &lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/8859490594997323339/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/apexlib-und-was-noch-so-geht.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/8859490594997323339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/8859490594997323339'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/apexlib-und-was-noch-so-geht.html' title='APEXLIB und was noch so geht…'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-7809524101730302983</id><published>2009-06-11T17:04:00.003+02:00</published><updated>2009-07-01T15:51:07.049+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Item"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="LOV"/><title type='text'>Strukturierte Wertelisten? Geht nicht? Geht wohl!</title><content type='html'>&lt;p&gt;Und noch so ein Kundenwunsch… ;)&lt;/p&gt;  &lt;p&gt;Der Inhalt einer normalen Werteliste kann schon mal unübersichtlich werden. Was also tun, um ein bißchen mehr Übersichtlichkeit in die Sache zu bringen? Ganz einfach: Gruppieren! Aber wie?&lt;/p&gt;  &lt;p&gt;Auf der Suche nach einer Lösung für dieses Problem stolperte ich vor einer Weile über eine wirklich nützliche Javascript-Bibliothek genannt &lt;a href=&quot;http://jquery.com/&quot; target=&quot;_blank&quot;&gt;jQuery&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Das Ziel der ganzen Übung soll dann etwa so aussehen…&lt;/p&gt;  &lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1bo-z1iP07o15hzzwlnWQX9df-GwXi0HX_qR3leZDthyWrH4xZRqfbiSe7R9fCnEWRfq_g_PdxXgk1-N2h6i6MgyIWXgRHOeYDTEUGS-qPsKMLVWwb-DsJt8_1LwIZG41NPuFfo1GWZ8/s1600-h/list_after9.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px&quot; title=&quot;list_after&quot; border=&quot;0&quot; alt=&quot;list_after&quot; align=&quot;left&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtO72z-cKGmmfKRX2oXiXabV1icKlh2tymDhWVflzlRaT2S0BxjNAvx8DtsfBgYdXnO3ontQp5NJJSoHFfQsC_OZpiipBzrfZCe9Vfn2SM-FhNG5seFKf1b0zZbsmZg75706OPkTy7BUQ/?imgmax=800&quot; width=&quot;149&quot; height=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNx_cBfk3Px71bqG5OJdMZjF5-yaWMs_06pOwJFqFT7yr3rtX_SKcEB01RZxIZhCLepjrVtQq9IRLYrEzvh5sN-7Sbcd2a04MtFijCU-jdlDOeVsFG7oeUxKAt5749i_WuwIxHcD9Ne1I/s1600-h/js_after14.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;js_after&quot; border=&quot;0&quot; alt=&quot;js_after&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKeap-yenmvH5GmoXV51Eq_CjHDSpMugSD39QxdMHBLlyLbx1auuiIvp8lrNaeU_gfo7gzTsSV3aI7JYzI1qPdTx7oC7jClPKmyYchtcxvQkZwcuiBfnog0EZRIeWouJX1lYdUFdu6_Ug/?imgmax=800&quot; width=&quot;484&quot; height=&quot;136&quot; /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Eine normale Werteliste sieht aber normalerweise so aus….&lt;/p&gt;  &lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidlWV_ll-yPx2veBfwpu0KDPXhed0TarosZZRsLuxi6wqAl8am3x4wehfQEvH8S-JitqKTjP5jXLULcVKyrNYhlYxGZp5i8ey0LzLQ-WTBv5YLKBmUAVO3_z8NIPhuGCKakHoV7hnghCw/s1600-h/list_before5.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;list_before&quot; border=&quot;0&quot; alt=&quot;list_before&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO5aUlBQ-wXtntDxHkLi8VtejZAhTznxXoZyK9vyRyNr584NlNuS2DyUgwBtMXLkZM4vhUnV0uRUfztNOLEqJ8rsEJcM_9J1B1b4emqCDfWQZRqlIyKGMBbMgWDFG96PIjt5xq0eKzXOg/?imgmax=800&quot; width=&quot;147&quot; height=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6P81vDMVPnh87BirpqqztxOLGoZ4-OzDi43cG_fNMzLMTR4OnqCjDJQg-3YGh7u-qcdR-FEbEgQcueGYe31JwH-4kRSN_69B1tnUMZJEJB1zWz0pM8ZN_hsdrbg11P76LmO9MbtZSovE/s1600-h/js_before8.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;js_before&quot; border=&quot;0&quot; alt=&quot;js_before&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgymd-t_ctfMt_A81SlLzytis7ZcQ2R9EIEoBeIlkEBljLdjNok0qiAVhG-FTfvZVu_SS3fcfprNpUHiUYUeQoESg7N9kaF0xJocaQbh_7HudX2TUPoWdM8z0_vngDgiWvgtlqi9MUW9Io/?imgmax=800&quot; width=&quot;484&quot; height=&quot;108&quot; /&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Was also tun, um von der normalen Werteliste zur Strukturierten zu kommen? &lt;/p&gt;  &lt;p&gt;Zunächst hab ich alle Wertelisten, die entsprechend “nachbearbeitet” werden sollen gekennzeichnet. Dazu einfach bei der Definition des Elements im Bereich HTML-Form-Elementattribute eine eigene Klasse zuweisen. &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixyjzCV3b8-8xxMfF8VbXklHXscmjTEwAUQ-GRxcFvSpsAt4_VyQbPS2vnFQRqmHltg6C6He3fyGZBj58BnFchtWLEHXJy8MkyjDZomi-dog6inNW_znUngdp_D5nTkrZ0r5Y5NT1_oTM/s1600-h/Clipboard057.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Clipboard05&quot; border=&quot;0&quot; alt=&quot;Clipboard05&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBvkf6xtfBkuY11Y9RAPjI5Vl423ehl3pl7iTiRyKiaQeDG9bUHSNJT-biTekeOHQNdnmkMAZ2aomgQ7l2-3fKuquK-uOsN5_M5i49iJ0x57DoKYlFlwjBNXG05AiMy5P1SKA9s7bcfI/?imgmax=800&quot; width=&quot;418&quot; height=&quot;138&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So kann man schon mal normale Wertelisten von denen unterscheiden, die entsprechend strukturiert werden sollen. Außerdem habe ich die Positionen meiner Gruppierung innerhalb der normalen Werteliste mit Einträgen (Wert “-1”) markiert.&lt;/p&gt;  &lt;p&gt;Nun kommt jQuery ins Spiel. Folgendes Stückchen Javascript in die Seite einfügen….&lt;/p&gt;  &lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt; &lt;br /&gt;  $(document).ready(function(){ &lt;br /&gt;  $(&amp;quot;select.MyGroupedLOV&amp;quot;).each(function(i) { &lt;br /&gt;  var $sel=$(this); &lt;br /&gt;  $sel.find(&amp;quot;option&amp;quot;).filter(&amp;quot;option[value=&#39;-1&#39;]&amp;quot;).each(function(i) { &lt;br /&gt;  var s = $sel.find(&amp;quot;option&amp;quot;).index($(this)); &lt;br /&gt;  var e = $sel.find(&amp;quot;option&amp;quot;).index($sel.find(&#39;option:gt(&#39;+s+&#39;)[value=&amp;quot;-1&amp;quot;]:first&#39;)); &lt;br /&gt;  if (e &amp;lt; 0) e = $sel.find(&amp;quot;option&amp;quot;).length;&lt;br /&gt;  $sel.find(&amp;quot;option&amp;quot;).slice(s, e).wrapAll(&amp;quot;&amp;lt;optgroup label=&#39;&amp;quot;+$(this).text()+&amp;quot;&#39;&amp;gt;&amp;lt;/optgroup&amp;gt;&amp;quot;); &lt;br /&gt;  }); // .. $sel.find(&amp;quot;opt .. &lt;br /&gt;  $sel.find(&amp;quot;option[value=&#39;-1&#39;]&amp;quot;).remove(); &lt;br /&gt;  }); &lt;br /&gt;  }); &lt;br /&gt;  &amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Was passiert da? Eigentlich ganz einfach… Die Funktion parst die “option”-Listen aller gekennzeichneten “select”-Elemente und schließt alle Optionen, die nicht einen Wert von “-1” haben in eine Optionsgruppe ein. Das Label der Gruppe wird jeweils durch die Option mit Wert “-1” vor den eingeschlossenen Optionen benannt.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Es gibt natürlich noch weitere, weitaus schönere Ansätze dieses Problem zu lösen. Man könnte beispielsweise die gesammte Liste per AJAX laden, aber das könnt ihr ja selbst ausprobieren…. ;)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Dieser &lt;a href=&quot;http://forums.oracle.com/forums/thread.jspa?threadID=911092&quot; target=&quot;_blank&quot;&gt;Thread&lt;/a&gt; im OTN Forum beschäftigt sich unter anderem mit der Ersetzung des normalen Datepickers und benutzt dazu einen ähnlichen Ansatz.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/7809524101730302983/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/strukturierte-wertelisten-geht-nicht.html#comment-form' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/7809524101730302983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/7809524101730302983'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/strukturierte-wertelisten-geht-nicht.html' title='Strukturierte Wertelisten? Geht nicht? Geht wohl!'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtO72z-cKGmmfKRX2oXiXabV1icKlh2tymDhWVflzlRaT2S0BxjNAvx8DtsfBgYdXnO3ontQp5NJJSoHFfQsC_OZpiipBzrfZCe9Vfn2SM-FhNG5seFKf1b0zZbsmZg75706OPkTy7BUQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-8869767223604203077</id><published>2009-06-08T18:26:00.002+02:00</published><updated>2009-06-08T18:28:45.704+02:00</updated><title type='text'>Flash MP3 Player</title><content type='html'>&lt;p&gt;Kürzlich bekam ich von einem Kunden die Anforderung in einem Call Center aufgenommene Gespräche mit Hilfe eines Fragebogens auf deren Qualität hin zu bewerten. Dazu muss man sich das File natürlich anhören können. Auf der Suche nach einem kleinen leicht in eine APEX-Anwendung zu integrierenden MP3-Player stieß ich dann auf den &lt;a href=&quot;http://www.varal.org/media/niftyplayer/&quot; target=&quot;_blank&quot;&gt;Nifty Player&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2K9XadiGfxWXjXJ-d7ZKGueDQcASMAWVsFF4l9HWmfaYLuIbfLkVbUSKZSM70VQ-QZYKqGsgN1ZPOCfoHAbJ5EPbyhKEaRwlLem9h1_psRutWE_mOr80w-dASVrfxGSjqeLL8_L3cJU8/s1600-h/nifty_player.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 182px; height: 83px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2K9XadiGfxWXjXJ-d7ZKGueDQcASMAWVsFF4l9HWmfaYLuIbfLkVbUSKZSM70VQ-QZYKqGsgN1ZPOCfoHAbJ5EPbyhKEaRwlLem9h1_psRutWE_mOr80w-dASVrfxGSjqeLL8_L3cJU8/s320/nifty_player.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5344994349901961778&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Ein kleiner Flashplayer, der auch komplett per Javascript zu steuern ist, so dass man das Flashfrontend theoretisch auch vollständig umgehen kann. Für meine kleine Demo-Anwendung reichte dieser Player zumindest völlig aus.&lt;/p&gt;  &lt;p&gt;Hat jemand ähnliche Player gefunden???? Ich bin immer auf der Suche nach Alternativen….&lt;/p&gt;  &lt;p&gt;Tschüß für heute&lt;/p&gt;  &lt;p&gt;Anja&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/8869767223604203077/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/flash-mp3-player.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/8869767223604203077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/8869767223604203077'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/flash-mp3-player.html' title='Flash MP3 Player'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2K9XadiGfxWXjXJ-d7ZKGueDQcASMAWVsFF4l9HWmfaYLuIbfLkVbUSKZSM70VQ-QZYKqGsgN1ZPOCfoHAbJ5EPbyhKEaRwlLem9h1_psRutWE_mOr80w-dASVrfxGSjqeLL8_L3cJU8/s72-c/nifty_player.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7799155813168292187.post-6976033555651865606</id><published>2009-06-07T10:57:00.002+02:00</published><updated>2009-06-07T11:37:45.083+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apex"/><category scheme="http://www.blogger.com/atom/ns#" term="ich"/><category scheme="http://www.blogger.com/atom/ns#" term="oracle"/><title type='text'>Der erste Eintrag ;)</title><content type='html'>&lt;p&gt;Ja, das ist er also… Der erste Eintrag in meinem brandneuen APEX-Blog. Nach inzwischen 8 Jahren Erfahrung im Bereich Entwicklung datenbankgestützter Anwendungen  und 3 Jahren Erfahrung mit Oracle Application Express wird es wohl Zeit diese Erfahrung mit der Community zu teilen. Und was wär da einfacher als mich all den anderen Blogbetreibern anzuschließen und hiermit mein eigenes Blog zu eröffnen und meinen Teil zur “Weltherrschaft ” von APEX beizutragen.  &lt;/p&gt;  &lt;p&gt;In diesem Sinne, viel Spaß beim Lesen!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://apex2rule-the-world.blogspot.com/feeds/6976033555651865606/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/der-erste-eintrag.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/6976033555651865606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7799155813168292187/posts/default/6976033555651865606'/><link rel='alternate' type='text/html' href='http://apex2rule-the-world.blogspot.com/2009/06/der-erste-eintrag.html' title='Der erste Eintrag ;)'/><author><name>Anja Hildebrandt</name><uri>http://www.blogger.com/profile/18001954202277928931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzMDt5Tw0zMSh88HW4ZI7c2xAFXqJFDJMmoNdDRgMwg4EH9DOH5ZtOiQBZngrrFHB7DmQAeWPByaDokLNEIU-4YKxNVvoTQrZQzA4Jaw560EzP3EDotPsAxhJhakg12Q/s220/image.1024x1024.jpg'/></author><thr:total>0</thr:total></entry></feed>