こんにちは、ねこです。

自称プログラマのおばちゃんのブログです。いろいろあるよねぇ~。

remerge()のわな

2014-01-14 06:21:40 | Designer javascript
昨日はついつい、月曜日の憂鬱に負けてメモを更新しませんでした。
今日はRemerge()について語ります。

Remerge()は全画面をもとのDataDOMからの参照に戻します。
そして、その際にFormでDataDOMとデータバインディングしているフィールド(オブジェクト)に変更があれば、それも一度DataDOMに更新されてから再度それを参照し、Formへと反映させます。
だから。。。
表なんか作った場合、一行一行に変更があるかどうか予備のフィールドをもうけてINITIALIZEでDataDOMのデータをそこにコピーし、変更後のものと比較しようとしても、Remerge()してしまったらその内容はなくなっちゃいます。

<Initialize>
比較用予備フィールド = バインディングされたフィールド

<Changekなどのイベント>
『バインディングされたフィールド』内で変更のあったものを『比較用予備フィールド』と比較して違いを見る。その結果、変更を確認できると同時にリセットなどの機能を付け加えることができる。

ところが!!!

たとえば、新しい列を増やしてRemerge()したとする。
そうすると、この変更があったフィールドに対してDataDOMは上書きされているので、Initializeでの式が再び起こると、もちろん、比較できなくなるのであーる。
さぁ、スキーマにフィールドを足して、あらかじめWorkbenchで予備フィールドに比べるための値をいれておきましょう!!!

追記。
WISDLなどを使う場合は、Load()してRemerge()するしかないが、XDPで行う参照のみの表の結果表示や変更であれば使わなくてもよいのかも。こんな式をあらかじめ作っといて検索のたびに呼び出してやる。

====== スクリプトオブジェクト =============================================
function cleanUp(){
var vMain = xfa.resolveNodes("main.siuList.siu[*]");
for (var i=0;i<vMain.length;i++){
vMain.item(i).presence = "hidden";
}
}
====== Thisは検索するターゲットフィールド =================================
cleanUp.cleanUp(); //スクリプトオブジェクトを呼び出す。
var vMain = xfa.resolveNodes("main.siuList.siu.(pfacnam.rawValue.toUpperCase().indexOf('"+this.rawValue.toUpperCase()+"')>=0
|| sfacnam.rawValue.toUpperCase().indexOf('"+this.rawValue.toUpperCase()+"')>=0)");

//なんかわからんが、うまく式がブラウズされないんでここではスクリプトオブジェクトと同じことをしてください。ただし、'visible'で。

dropdown list (超短し)

2014-01-10 11:45:28 | Designer javascript
ドロップダウンリスト、リストボックスの値はなかなか思ったように取れません。

xfa.host.messageBox(String(this.formattedValue));
xfa.host.messageBox(String(this.getDisplayItem));
xfa.host.messageBox(String(this.getSaveItem));
xfa.host.messageBox(String(this.rawValue));
xfa.host.messageBox(String(this.value));

とにかくどれかで値がとれるはず。
リストボックスはちゃんとインデックスをgetItemStateや、selecttedIndexで指定して値をとってください。

for (var i = 0; i < lstCanwbList.length; i++){

if (lstCanwbList.getItemState(i)){

var sText = lstCanwbList.getDisplayItem(i);
var sItemValue = lstCanwbList.getSaveItem(i);

if (sItemValue != null){
xfa.host.messagebox(sText+"\n"+sItemValue);
}

}
}

そうそう、イベントのchangeも忘れずに。
xfa.event.newText
xfa.event.prevText

これでも表示される前の値が取れます。

ねこ

あぁ、もうっ!!! Javascript の比較演算子(スーパー短し)

2014-01-09 07:58:33 | Designer javascript
朝から、なんでこのドロップダウンのrawValueの値が変わるのか約二時間考え続けた。。。あほですか、わたし。←ごちそうさん風。

ねこはもともとVB5.0(古いやろぉ~)やRPG、PHPなどをかじってきたプログラマーで、言語のシンタックスが結構いい加減に頭に入っている。

特にこの演算子なんかはほんま、いい加減。

<> and/or --- VB
!= &&/|| --- Javascript
NOTEQ --- RPG
<> ---RPGIII
!= <> ---どちらもPHP

などなど。。。

で、バグはここ。
if (dSiu.rawValue == fpx.item(a).facid2.value && fpx.item(a).prg12.value =! vComp && fpx.item(a).prg12.value != null){

おわかりになりますよね。

そう、=!ですっ!!!

数ある似たような比較文中、他はちゃんと!=と書いているにもかかわらず、たった一箇所だけ間違えてました。

すると、Designerは面白いです。

=!では"True"と返すのです。

まさに!!!でした。ねこでした。。。



resolveNode と for loopのベンチテスト - どっちが早い? 

2014-01-08 11:53:10 | Designer javascript

今回はパフォーマンスを比べてみようと思います。

ご存知、resolveNodeとresolveNodesはノードの検索をかねてます。

resolveNodeの方は単一のノード
resolveNodesの方はひとつ以上のノードになります。ご存知のように、resolveNodes("test[*]")やresolveNodes("test[5]")と書けても、resolveNode("test[*]")やresolveNode("test[5]")とはかけません。Xpathのシンタックスです。

そして、

var targetRows = xfa.resolveNode("$data.root.l").resolveNodes("m.(s1.value == 'searchCriteria')");
や、
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value == 'searchCriteria')");
としてほしいノードの値を得ることができます。

でもこれって、ループでもできるよねぇ。で、こんな感じ。

var chk = xfa.resolveNodes("$data.root.l.m[*]");
var farray = [];
var fi = 0;

for (i=0; i<chk.length; i++){

if (chk.item(i).s1.value == 'searchCriteria'){
farray[fi] = chk.item(i);
fi++;
}

}

では、どっちが早いでしょう、。。
<u>答えはループのほうがほんの少し早いだけであんま変わりません。



こちら、XMLの構造

<root>
<l>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<l>
</root>


//////////TEST Paformance Time. (One line)
var start = new Date();
var targetRows = xfa.resolveNode("$data.root.l").resolveNodes("m.(s1.value == 'searchCriteria')");

if (targetRows.length > 0){

var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(targetRows.length + " line(s) : "+String(diff));

}

//////////TEST Paformance Time. (One line)
var start = new Date();
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value == 'searchCriteria')");

if (targetRows.length > 0){

var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(targetRows.length + " line(s) : "+String(diff));

}



//////////TEST Paformance Time.(Loop)
var start = new Date();
var chk = xfa.resolveNodes("$data.root.l.m[*]");
var farray = [];
var fi = 0;

for (i=0; i<chk.length; i++){

if (chk.item(i).s1.value == 'searchCriteria'){
farray[fi] = chk.item(i);
fi++;
}

}
var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(fi + " time(s) : "+String(diff));


========================================================================

でもね、こんなテクがresolveNodesならできるんです。

こちらフォームのなんかのイベント。

if (this.rawValue != null){
//dataDOMでsearchCriteriaとsearchCriteria2の両方の検索
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value.toUpperCase().indexOf('"+searchCriteria.rawValue.toUpperCase+"')>=0 || s2.value.toUpperCase().indexOf('"+searchCriteria2.rawValue.toUpperCase+"')>=0)");

}else{

//dataDOMでデータがないものを検索
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value==null>=0 || s2.value==null)>=0)");

}
ここでtargetRowsとして検索結果を直接functionへ送る
showtargetRows.targetRowsScript(targetRows);




以下、送られた先のfunction。

function targetRowsScript(targetRows){

for (i=0; i
_dsp.addInstance(0);
var newLine = xfa.resolveNodes("dummyNode[*]").item(main._dummyNode.count - 1);
newLine.s1.rawValue = targetRows.item(i).s1.value;
newLine.s2.rawValue = targetRows.item(i).s2.value;
newLine.s3.rawValue = targetRows.item(i).s3.value;

}

これで、検索の結果がすべてひと塊のデータノードとして形成されるので、データ全体を表示したくないときにページで振り分けて表示したりできます。

なんか、もっと詳しく書きたかったなぁ。
今日は半ちゃんで、もう帰ります。

半ちゃんって、死語?

ねこでした。

二次元配列の甘いわな(前回の続き)

2014-01-07 14:05:41 | Designer javascript
前回の記事で配列を関数として受け渡す内容を書きました。
で、こちらがファンクション部分。何もせずに返すだけです。
function checkCandidate(vtest){
return vtest;
}

その関数を1と2の両方で行ってみました。


1.多次元構造でちゃんと4つデータを入れた場合。
var parmCombiArray = [];
for (var i=0; i<5; i++){

parmCombiArray[i] = [];
parmCombiArray[i][0] = 'a:'+i;
parmCombiArray[i][1] = 'b:'+i;

}
var vtest = checkCandidate.checkCandidate(parmCombiArray);


2.多次元構造にしているにもかかわらず、ひとつしかデータが入ってない場合。
var parmCombiArray = [];
var i;
parmCombiArray[i] = [];
parmCombiArray[i][0] = 'aaa';
parmCombiArray[i][1] = 'bbb';

var vtest = checkCandidate.checkCandidate(<font color="red">parmCombiArray);


この結果は
xfa.host.messageBox(String(vtest));

1.の結果 『a:0,b:0,a:1,b:1,a:3,b:3,a:4,b:4』
2.の結果 『』


にゃぜ、2の結果がでないっ!
どうやら、配列が勝手に多次元ではないと判断したらしい。で、ちゃんとこんな風に指定してやったら、
var vtest = checkCandidate.checkCandidate(parmCombiArray[i]);

1.の結果 『a:0,b:0,a:1,b:1,a:3,b:3,a:4,b:4』
2.の結果 『aaa,bbb』

でます。
多次元でないものは多次元にしないほうがよいのですな。

ではでは。