Разработка Rich-интерфейса к отчету "Журнал недостоверных значений"
Предварительные наброски
Набросок №1. Не мудрствуя лукаво.
<canvas title="Журнал недостоверных значений" bgcolor="0x11444" > <text fgcolor="silver" fontsize="34" fontstyle="bold" align="center"> АИРС. Журнал недостоверных значений </text> <window align="left" y="10%" resizable="true" title="Выбор параметров отчета"> <form> <view layout="axis:x; spacing:5"> <text width="250">Выбрать группу оборудования</text> <combobox shownitems="10" width="250"> <textlistitem text="Общестанционное оборудование" value="0"/> <textlistitem text="Энергоблок №1" value="1"/> <textlistitem text="Энергоблок №2" value="2" selected="true"/> <textlistitem text="Энергоблок №3" value="3"/> </combobox> </view> <view layout="axis:x; spacing:5"> <text width="250">Выбрать масштаб времени</text> <combobox shownitems="10" width="250"> <textlistitem text="Часовой" value="'h2'"/> <textlistitem text="Сменный" value="'h3'"/> <textlistitem text="Суточный" value="'h4'" selected="true"/> <textlistitem text="Месячный" value="'h5'"/> </combobox> </view> <view layout="axis:x; spacing:5"> <text width="250">Выбрать тип сигнала</text> <combobox shownitems="10" width="250"> <textlistitem text="Аналоговые" value="'a'"/> <textlistitem text="Расчетные" value="'m'" selected="true"/> <textlistitem text="Специальные" value="'s'"/> <textlistitem text="Дискретные" value="'d'"/> </combobox> </view> <view layout="axis:x; spacing:5"> <text width="250">Выбрать формат вывода</text> <combobox shownitems="10" width="250"> <textlistitem text="ВЕБ страница" value="'html'"/> <textlistitem text="Акробат" value="'pdf'" selected="true"/> <textlistitem text="MS Word" value="'rtf'"/> <textlistitem text="MS Excel" value="'xls'"/> </combobox> </view> </form> </window> </canvas>

Набросок №2. LZX - объектный XML.
LZX is a fully object-oriented language. With object-orientation, you can encapsulate common code in reusable classes. This prevents code duplication and greatly facilitates the maintenance of your applications.
<canvas fontsize="14"> <include href='lz/textlistitem.lzx'/> <class name="myview" > <!-- Это - определение класса: --> <attribute name="label" type="string"/> <attribute name="items" /> <attribute name="selected" type="number"/> <view name="v1" layout="axis:x; spacing:5"> <text name="t1" width="260" fontstyle="bold" text="${parent.parent.label}" /> <combobox name="c1" shownitems="10" width="250" /> </view> <handler name="oninit"><![CDATA[ for(var i1=0;i1<items.length;i1++) this.v1.c1.addItem(items[i1][0],items[i1][1]); this.v1.c1.setDefaultSelection(selected); ]]></handler> </class> <window resizable="true" y="10%" title="Выбор параметров отчета"> <!-- Это - экземпляр объекта: --> <myview id="pServ" label="Выбрать группу оборудования" items="[['Общестанционный сервер','0'],['Энергоблок №1','1'],['Энергоблок №2','2'],['Энергоблок №3','3']]" selected="2" /> </window> </canvas>

Набросок №3. Запрос временных рядов.
<canvas fontsize="14" debug="true" proxied="false" > <include href='lz/textlistitem.lzx'/> <class name="myview" > <!-- Это - определение класса: --> <attribute name="label" type="string"/> <attribute name="items" /> <attribute name="selected" type="number"/> <view name="v1" layout="axis:x; spacing:5"> <text name="t1" width="260" fontstyle="bold" text="${parent.parent.label}" /> <combobox name="c1" shownitems="10" width="250" /> </view> <handler name="oninit"><![CDATA[ for(var i1=0;i1<items.length;i1++) this.v1.c1.addItem(items[i1][0],items[i1][1]); this.v1.c1.setDefaultSelection(selected); ]]></handler> </class> <simplelayout axis="y" spacing="8" /> <myview id="pScale" label="Выбрать масштаб времени" items="[['Часовой уровень','h2'],['Сменный уровень','h3'],['Суточный уровень','h4'],['Месячный уровень','h4']]" selected="3" /> <dataset name="dset" request="true" type="http" src="http://advanta.sytes.net:8100/php/sql2xml.php" /> <myview id="pStamp" label="Получить временные ряды" items="[]" selected="0" > <handler name="onclick" > var sql= "select distinct tstamp from " +pScale.v1.c1.value+ " order by 1 desc;"; Debug.write(sql); dset.setQueryString({sql:sql}); dset.doRequest(); </handler> <datapointer xpath="dset:/ROWSET"> <handler name="ondata"> var dp= this.dupePointer(); var stamp,tstamp; dp.selectChild(); do { stamp= dp.xpathQuery("tstamp/text()") if(stamp){ tstamp= stamp.substring(6,8)+ '.'+ stamp.substring(4,6)+ '.'+ stamp.substring(0,4)+ ' '+ stamp.substring(8,10)+ ':'+ stamp.substring(10,12); pStamp.v1.c1.addItem(tstamp,stamp); } } while (dp.selectNext()) pStamp.v1.c1.selectItemAt(0); </handler> </datapointer> </myview> </canvas>

Набросок №4. Запрос отчета.
<canvas fontsize="14" debug="false" > <class name="myview" > <!-- Это - определение класса: --> <attribute name="label" type="string"/> <attribute name="items" /> <attribute name="selected" type="number"/> <view name="v1" layout="axis:x; spacing:5"> <text name="t1" width="260" fontstyle="bold" text="${parent.parent.label}" /> <combobox name="c1" shownitems="10" width="250" /> </view> <handler name="oninit"><![CDATA[ for(var i1=0;i1<items.length;i1++) this.v1.c1.addItem(items[i1][0],items[i1][1]); this.v1.c1.setDefaultSelection(selected); ]]></handler> </class> <alert id="myalert"> Ошибка! Не выбран временной ряд. </alert> <window resizable="true" y="10%" title="Выбор параметров отчета"> <simplelayout axis="y" spacing="8" /> <myview id="pStamp" label="Получить временные ряды" items="[]" selected="0" > </myview> <button width="100%" >Получить отчет <handler name="onclick"> if(!pStamp.v1.c1.value){ Debug.write('Ошибка! Не выбран временной ряд.'); myalert.open(); return; }; var JRphp= 'http://advanta.sytes.net:8100/php/jasperRunner.php?__reportUnit=invalid'; JRphp += '&__output=' +fmt.v1.c1.value ; JRphp += '&pH=' +pScale.v1.c1.value +'&pH2='+encodeURIComponent(pScale.v1.c1.text); ... ... lz.Browser.loadURL(JRphp,'_blank'); </handler> </button> </window> </canvas>

Финиш
OpenLaszlo в действии.
Внутри "wikidot"
В отдельном окне
FLASH-интерфейс к "Журналу недостоверных значений" на отдельной странице
<canvas fontsize="14" > <include href='lz/textlistitem.lzx'/> <dataset name="dset" request="true" type="http" src="http://advanta.sytes.net:8100/php/sql2xml.php" /> <class name="myview"> <attribute name="label" type="string" /> <attribute name="items" value="[]"/> <attribute name="selected" value="0" /> <view name="v1" layout="axis:x; spacing:5"> <text name="t1" width="260" text="${parent.parent.label}" fontstyle="bold" /> <combobox name="c1" shownitems="10" width="250" /> </view> <handler name="oninit"> <![CDATA[ for(var i1=0; i1<items.length; i1++) this.v1.c1.addItem(items[i1][0], items[i1][1]); this.v1.c1.setDefaultSelection(selected); ]]> </handler> </class> <!-- --> <alert id="myalert"> Ошибка! Не выбран временной ряд. </alert> <window resizable="true" title="АИРС. Журнал недостоверных значений (is51-00)" > <simplelayout axis="y" spacing="8" /> <myview id="pServ" label="Выбрать группу оборудования" items="[['Общестанционный сервер','0'],['Энергоблок №1','1'],['Энергоблок №2','2'],['Энергоблок №3','3']]" selected="2" /> <myview id="pType" label="Выбрать тип сигнала" items="[['Аналоговые','a'],['Расчетные','m'],['Дискретные','d']]" selected="1" /> <myview id="pScale" label="Выбрать масштаб времени" items="[['Часовой уровень','h2'],['Сменный уровень','h3'],['Суточный уровень','h4'],['Месячный уровень','h5']]" selected="3" > </myview> <myview id="pStamp" label="Получить временные ряды"> <method name="clear"> while(this.v1.c1.getItemAt(0)) this.v1.c1.removeItemAt(0); this.v1.c1.setText(''); this.v1.c1.value=''; </method> <handler name="onselect" reference="pScale.v1.c1"> try {clear();} catch(er) {Debug.debug(er)}; </handler> <handler name="onclick"> clear(); var sql= "select distinct tstamp from "+ pScale.v1.c1.value+ " order by 1 desc;"; dset.setQueryString({sql:sql}); dset.doRequest(); </handler> <datapointer xpath="dset:/ROWSET"> <handler name="ondata"> var dp= this.dupePointer(); var stamp, tstamp; dp.selectChild(); do { stamp= dp.xpathQuery("tstamp/text()"); tstamp= stamp.substring(6,8)+ '.'+ stamp.substring(4,6)+ '.'+ stamp.substring(0,4)+ ' '+ stamp.substring(8,10)+ ':'+ stamp.substring(10,12); pStamp.v1.c1.addItem(tstamp,stamp); } while (dp.selectNext()); pStamp.v1.c1.selectItemAt(0); </handler> </datapointer> </myview> <myview id="fmt" label="Выбрать формат вывода" items="[['ВЕБ-страница','html'],['Acrobat','pdf'],['MS Word','rtf'],['MS Excel','xls'],['XML-данные','xml']]" selected="1" /> <button width="100%" >Получите отчет <handler name="onclick"> if(!pStamp.v1.c1.value){ Debug.write("Ошибка! Не выбран временной ряд."); myalert.open(); return; } var JRphp= "http://advanta.sytes.net:8100/php/jasperRunner.php?__reportUnit=invalid"; JRphp += "&__output="+ fmt.v1.c1.value; JRphp += '&pH=' +pScale.v1.c1.value +'&pH2='+encodeURIComponent(pScale.v1.c1.text); JRphp += '&pType=' +pType.v1.c1.value +'&pType2='+encodeURIComponent(pType.v1.c1.text); JRphp += '&pServ=' +pServ.v1.c1.value +'&pServ2='+encodeURIComponent(pServ.v1.c1.text); JRphp += '&pStamp=' +pStamp.v1.c1.value +'&pStamp2='+encodeURIComponent(pStamp.v1.c1.text); lz.Browser.loadURL(JRphp,'_blank'); </handler> </button> </window> </canvas>