こんにちは、ねこです。

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

複数の検索フィールド、ターゲットノードに対して、ひとつのオブジェクト・スクリプトで対応するには

2014-02-03 12:18:02 | Designer javascript
javascriptをフォームで書いてると、どうしてもできるだけ全ての機能を一極化したいもんです。
特に、検索エンジンを作ってると、その検索フィールドごとにコマンドを埋め込んでくのはとぉ~っても効率が悪く、手直しなんかのメンテナンスなんかで大変です。
そこで、検索キーと探し出す左記のDOMのモード名を変数として、検索結果をグループごとにやり取りする方法はどうでしょう。

あまり詳しく書く時間がないので簡単に書きましたが、いったい何をしているのかというと。。。

1. フォーム上の値をとって、それとバインドされているDOM側のノード名を当ててやる。
2. そのフォーム上の値を検索キーとしてvTargetの変数へあてがってやる。
3. その変数とノード名を当てたvNodeNameを使ってxfa.resolveNodesで検索をかけてその結果をtargetRowsとしてグループ化する。
4. その後、vRemainderという変数に30づつ検索結果がみれて、最後のページに残り全てをひょうじするよう、余剰を当てる。
5. countGroupの変数に30ごとの番号をあててやり、現在のページを表示するときに使用する。
6. 全てをフォームから消すスクリプトオブジェクトを呼び出す。
7. targetRowsとcountGroupの二つのパラメータを表書き出しのオブジェクトスクリプトへ送ってやって、後は書き出すのみ。


if (mosList.HeadersD.aaaFORM.rawValue != null){vNodeName = 'aaaDOM'; vTarget = mosList.HeadersD.aaaFORM.rawValue;}
if (mosList.HeadersD.bbbFORM.rawValue != null){vNodeName = 'bbbDOM'; vTarget = mosList.HeadersD.bbbFORM.rawValue;}

var targetRows = xfa.resolveNodes("$data.deqroot.mosList.mos.(nodes.namedItem('"+vNodeName+"').value.toUpperCase().indexOf('"+vTarget+"')>=0)");

var vRemainder;
vRemainder= targetRows.length%30;
if (vRemainder== 0){
countGroup = targetRows.length - 30;
}else{
countGroup = targetRows.length - vRemander;
}
cleanUpLines.cleanUpLinesScript();
showtargetPrvBck.showtargetPrvBckScript(targetRows, countGroup);


+++書き出しのスクリプトオブジェクト+++++++
function showtargetPrvBckScript(targetRows, countGroup){

for (i=countGroup; i<targetRows.length; i++){
_dsp.addInstance(0);
var newLine = xfa.resolveNodes("dsp[*]").item(main._dsp.count - 1);
newLine.aaaFORM.rawValue = targetRows.item(i).aaaDOM.value;
newLine.bbbFORM.rawValue = targetRows.item(i).bbbDOM.value;

//ここでDOMから検索結果を写し終える数をあらかじめ作ってhiddenしておいたフィールドに挿入。後で使います。
newLine.num.rawValue = main._dsp.count + countGroup;
if (i>countGroup+28){
Paging.btnNext.caption.value.text = String(i+1);
Paging.btnPrev.caption.value.text = String(i-28);
break;

}else{

//このボタンを押すと最後のページになることを意味する。
Paging.btnNext.caption.value.text = String(targetRows.length);
//このボタンを押すと30列前の検索結果の表のあるページに戻ることを意味する。
Paging.btnPrev.caption.value.text = String(countGroup+1);

}

}
}

なんか、もっと、こう。。。いい方法があるような。。。
でも、時間なしっ!

ねこ

日付ほどめんどいフィールドはない。(短いし)

2014-01-29 12:34:12 | Designer javascript
日付はできれば使わない主義のねこですが、たまにカレンダー機能などがほしいとがあります。
でも、このフィールド、パターンで設定するのが又めんどい。
で、パターンは最低限のnullのみの設定にして、あとはJavascriptで制御してやります。

var vTest = this.rawValue.match(/^[0-9]{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/);

if(vTest == null && this.rawValue != ' '){

xfa.host.messageBox("Public Comment Begin date needs to be DATE");
this.rawValue = null;

}

とにかく、一番大事なのは、最初にnullからはじめるか、もしくは"0001-01-01"や" "などの仮想データを使うかを決め手からはじめること。
でなければ、後で、"undefined"などのエラーになかされるかもです。

ねこでした。

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"と返すのです。

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