別フォームを開いてその値を登録したい

親画面から別フォームの子画面を開いて、子画面で取得した値を親画面に登録したいと考えています。今のところ

・Kintone上で子画面を開いて、子画面上で値を取得することはできています。

・下記のように通常のHTML画面で子画面を開いてその値を親画面に登録することはできています(コードがあちこち飛んでいるのはご容赦を)。

ただ、Kintoneの親画面上で子画面から取得された値を拾うことができていません。window.openerの動作がうまくいっていないように思えます。もしかするとまったくダメだとか異なる角度のアプローチが必要なのかもしれませんが、うまくやる方法があればお願いします。

//親フォーム
mother.html


<form name=“FORM_MOTHER”>
<input name=“RESULT” type=“text” value=“0”>
<button type=“button” onclick=“window.open(‘child.html’,‘SUBWINDOW’,‘toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,width=300,height=300’)”>値を返すサブフォーム</button>
</form>

//子フォーム
child.html
<script type=“text/javascript”>
<!–
function returnValues(){
var valueCode=‘PRODUCT CODE’; //実際はもっと複雑な計算をした結果の戻り値
}
window.opener.document.FORM_MOTHER.RESULT.value=valueCode; //←**********これをKintoneでどう表現する????
window.close();
}
//–>
</script>

<body>
<form name=“FORM_CHILD”>

<button type=“button” onclick=“returnValus()”>値を返す</button>
</form>
</body>
</html>

 

Naohiro Fukuda さん

問題のkintone 画面から子画面を開くコードが無いので、よくわかりませんが、
何かの原因で親画面の情報が取得できないとなると面倒ですね。
用途にもよりますが Jquery でダイアログ表示したほうが、簡単ですし使い勝手がよくなると思われます。

rex0220様

ご回答ありがとうございます。ぜんぜん説明が不足で大変申し訳なかったのですが、実際にやりたかったことは

  1. 見積書明細画面上で、サブテーブルの「商品マスタ」ボタンをクリックして、「商品マスタ」画面を呼び出す。

  2. 1.で呼び出した商品マスタ画面上の「商品選択」ボタンを押したときに、見積書明細画面に選択された商品コードが入力される。商品マスタ上で商品コードは取得できているが、親である見積書明細画面に反映できていない。

  3. そのタイミングで商品コードがルックアップされ、商品コードに紐づけられた商品名と金額などを自動入力させたい。

ことです。子画面(商品マスタ)側で親画面(見積書)の情報が取得できる必要はなく、子画面で選択された商品コードさえ拾えればよいです。

当初、ルックアップで商品マスタを呼び出していましたが、商品の点数が6,000点ほどあり、フィルタ機能などを用いて自由に抽出したいというクライアントの強い要望があり、すでに購入していたグレープシティ社のWijmoを利用することになったわけですが、上記2.でつまづいてしまったわけです。

Jqueryでダイアログ表示させることも検討したのですが、ここにGridを配置できませんでした。また、rex0220様が提供している「Kintone ルックアップ選択条件プラグイン」の導入も検討しましたが、ちょっと理由を書くと長くなるので省略しますが、導入に至っていません。

かなり混沌としており、アプローチの方法が間違っているかもしれませんが、商品コードが親側で取得できれば何とかなるとおもいます。誤った手法ならばササッとあきらめてポップアップなど別な手段を考えます。

図1 見積書作成画面(親画面)

図2 子画面

ここで商品コードは取得できているので、これを親画面の商品コードに持っていきたい。

商品名入力のタイミングで、データの絞り込みのようですね。
データ量が多いと絞り込みも結構厳しいでしょうね。

画面だけみると子画面というよりも、カスタマイズ画面に遷移しているように思われます。
画面遷移だと親画面の情報は取得できませんね。
子画面表示後、デバッグツールを使って、window.opener.document が参照できなければ、無理だと思います。

>Jqueryでダイアログ表示させることも検討したのですが、ここにGridを配置できませんでした

Wijmo ではありませんが、ダイアログ表示内にグリッド表示は行っていますので、
Grid表示できない問題を解決したほうが簡単そうに思われます。

>子画面表示後、デバッグツールを使って、window.opener.document が参照できなければ、無理だと思います。

window.openerの参照ができたので、kintone.app.record.setなどを駆使して商品コードを遷移先から読み出し元に反映させることができました。

ただ、テーブルではない普通?のフィールドに値は反映できたのですが、呼出元がテーブルだったためこちらには値が反映できていません。別アプリのコードを参照にしたので単なる記述ミスだとは思うのですが、テーブルへの値反映のヒントをいただければ幸いです。

// ボタンクリック時に商品コードの値を見積書に反映させる
function dataReturn(pID) {
//alert(pID); //クリックした行の商品コード
if (!window.opener || window.opener.closed) { // メインウィンドウの存在をチェック
window.alert(‘商品マスタを呼び出した見積書が存在しません。’);
} else {
//元の見積書に戻って表示する
window.opener.name = ‘somename’;
var _window = window.open(window.opener.location.href, window.opener.name);
//元の見積書の値を編集する
var _kintone = _window.kintone;
var _record = _kintone.app.record.get();
_record[‘record’][‘備考’][‘value’] = pID; //*****:テーブルではない通常のデータは反映する
//_record[‘record’][‘見積書明細’][‘value’][‘商品コード’][‘value’] = pID; //*****:テーブルにはデータが反映してくれない
//_record[‘record’][‘見積書明細’][‘value’][‘商品コード’][‘lookup’] = true;
_kintone.app.record.set(_record);
window.opener.focus(); //開かれた見積書にフォーカスを当ててアクティブにする
}
//window.close(); //商品マスタを閉じる…開くときに時間がかかるので閉じない
return;
}

 

ダイアログ表示の件は、使い勝手などを考慮して別途考えてみたいと思います。

親画面の情報が取れたようですね。

サブテーブルは、配列構造ですから行位置[n]を指定する必要があります。

_record[‘record’][‘見積書明細’][‘value’][n][‘value’][‘商品コード’][‘value’] = pID;
_record[‘record’][‘見積書明細’][‘value’][n][‘value’][‘商品コード’][‘lookup’] = true;

行位置は、change イベント時に、行毎につけられたid を元にテーブルを調べれば取得できます。
ただし、追加レコードの場合は、行idが無く、複数の追加行がある場合は、特定できません。
対策としては、あらかじめ、サブテーブル内に識別用の行番号項目を持つなどの工夫が必要です。

rex0220様

 

ご指摘の方法で指定明細行の更新に成功しました。かなり強引でしたが、

・「行位置」識別用のフィールドを作成してapp.record.create.change.見積書明細、app.record.edit.change.見積書明細イベントが発生したときに、全行の行位置を振り直す。これにより途中の行に挿入されても正確な行位置を把握できる。

・サブテーブルの行をクリックしたときに、行位置をWeb Storageの変数に格納して商品マスタで利用できるように準備する。商品マスタアプリは開くのに時間がかかるため何度も新たに呼び出したくなかったので、URLにパラメータを埋め込まずにWeb Storageを使ってみた。

・商品マスタから帰ってくるときにWeb Storageに格納された変数を呼び出して行位置として指定する。

これで上手く行ったようです。かなり長くなりましたが今のところ問題なく動作しています。ありがとうございました。

ただ、ここまで難しくする必要もなかったような気もするのですが。

Naohiro Fukuda さん

テーブルの更新処理が実現できたようですね。
いまのところ、テーブルがからむといろいろ工夫が必要になります。
kintone のイベント処理で行位置は、教えてほしいものです。

あとは、ユーザは、いろいろな操作をしますので、その対応が必要かと思います。
別ウィンドウにしたことにより、複数ウィンドウ表示や、ウィンドウを開いたまま別レコードに移動したり出来てしまいそうです。
ある程度、割り切って細かな対応は、しないというのもありでしょうね。