PDA

View Full Version : oracleのソートとグリッドのソート



ak_ext
14 Jun 2009, 11:05 PM
ext2.2.1です。

グリッド1 → オラクルで検索したデータをサーバー通信で取得してグリッドに表示する。

グリッド2 → グリッドの1のデータをコピーして表示する

例えばグリッド1表示後、コピーボタンを押下するとグリッド2にデータが表示されます。

2つのグリッドをソートします。

グリッド1ではsortメソッドをオーバーライドしてextのソートが走らないようにしてます。
常にオラクルの取得する順番で表示されるようにします。

グリッド2はデータはグリッド1と同じですが、
サーバー通信をせず、ただグリッド内extのソートを行います。

2つのグリッドでソート結果が同じになりません。
文字コードの違い(グリッドのソートはUTF-8、オラクルはShift-jis)
だと思うのですが、オラクルの文字コードは変えられないです。
これを解決する方法はありますでしょうか・・・

kiyoto01
23 Jun 2009, 1:29 AM
このあたりを参考に、JS 内ではすべて UTF-8 で取り扱う、という方向に持っていくのが無難な気がしますね。。。

http://www2.wbs.ne.jp/~kanegon/doc/code.txt (http://www2.wbs.ne.jp/%7Ekanegon/doc/code.txt)

もちろん、サーバサイドで変換したほうがスマートだとは思いますが。

2バイト文字まわりはホント大変ですよね。。。
がんばってください。

ak_ext
24 Jun 2009, 8:24 PM
JSの文字コードはUTF-8になってなかったです。
それでソートがちゃんとできてなかったのかもです。
文字コード変えられないので、しょうがないです。

kiyoto01
25 Jun 2009, 5:10 AM
ちゃんと考えていないので、わりと的外れな回答かもしれませんが、前回の私の回答は Ext.data.Store のサブクラスとして、Ext.data.UtfXmlStore 等を作ってあげればいいのでは、といったことです。



Ext.data.UtfXmlStore = function(c)
something_to_do_fot_initialization;
...
Ext.data.UtfXmlStore.superclass.constructor.call(this, c);
...
this.on('load', this.onLoad, this);
this.on('beforeload', this.onBeforeLoad, this);
});
Ext.extend(Ext.data.UtfXmlStore, Ext.data.XmlStore, {
// private
onLoad: function() {
// ロードした各レコードの文字列を SJIS から UTF-8 に置き換える。
for (var i = 0; i < this.data.data.length; i++) {
var rec = this.data.data[i];
for (var j in rec.data) {
data[j] = convert_to_sjis_to_utf;
}
}
Ext.data.UtfXmlStore.superclass.onLoad.call(this);
},

// private
onBeforeLoad: function() {
// 送信する query の文字コードを UTF-8 から SJIS に置き換える。
...;
}
});
とか、そんな感じで、この Store を経由して取得する情報の文字コードはすべて UTF-8 になっており、また送信時の文字コードはすべて SJIS になることを保証できれば、それが一番シームレスなのでは、といった考え方になります。

実際の実装は、わりと苦労しそうなんですけどね。
上記のメソッドをオーバーライドだけで済みそうな気もしませんし。。。

というわけで、もし作ってくださったら、Ext.ux にしていただけると、SJIS に苦しんでいる方には、非常な朗報かもしれません。