Q134:テーブルの列の特性を保持するには
Q134-1:
いくつものテーブルにMySQLからデータをロードする場合、他のサンプルを参考にinsert into table (item1,item2,.....) values ('DATA','DATA',....)で数値データも含めて取得していますが、数値データの計算で丸めを適用しようと、テーブル上でテーブルの該当列の列型を実数に設定実施させましたが、データをロードすると列型は文字列となって、設定が元に戻ってしまいます。時間をかけて多くのテーブルの数値列の列型を変更したのが無駄となり、がっかりしています。変更した設定を保存させるには、どうすればよいのでしょうか?
A134-1:
目的の[テーブル]にデータを設定する際、「テーブルデータを設定する(PFObjectTable)」を使っていらっしゃる場合、[テーブル]のデータは基本的に新しいデータに上書きされるとお考え下さい。
但し設定されるテーブルデータの列型が、先に設定されていたテーブルデータと同じ場合には、列の属性は列名以外そのまま維持されます。
[テーブル]にデータを設定して背景色など列の属性を変更し、その後データベースからの同内容のデータを連続して取得・表示する場合などは、列属性は維持されていると思います。
アプリケーションファイルのサイズを小さくするため、アプリケーション終了時に必要の無いGUI部品上のデータはなるべく削除することをお勧めしておりますが、「全行列を削除する()」を行い、列を削除してしまうと列の属性はなくなります。
[テーブル]のデータをクリアする際には「全行を削除する()」をお試し下さい。
列名を表示する部分は残り、列の属性は維持されます。
データを設定する際にも「行を追加する(PFObjectTable)」をお試し下さい。
行はどんどん追加されますので、新たなテーブルデータが表示される形になるよう、直前にでも「全行を削除する()」を行うとよろしいかと存じます。
数値列が文字列型に上書きされてしまったということから、データベースから取得したデータは数値型ではなく、文字列型になっている可能性もあるかと考えております。その場合でもMZPlatformの列型が数値型で、数字を表す文字列が入ったデータがその列に追加されれば、数値型で表示され問題ないかと思います。
数字以外の文字列が入っている場合には「型が異なる値が含まれています」等のエラーメッセージが発生することがあります。
もし随時列型や列数が違うテーブルデータで、丸めーモードを設定したい場合には、データベースから取得したデータの列型を[等価演算(=)]等のコンポーネントで判定し、数値型の場合には、
メソッド「setNumberColumnRoundingMode(int,int)」
<引数0>丸めモード
0: 切り上げ
1: 切り捨て
2: 正の無限大方向(正数切り上げ、負数切り捨て)
3: 負の無限大方向(正数切り捨て、負数切り上げ)
4: 四捨五入
5: 五捨六入
6: 近接値(等距離の場合は偶数側)
<引数1>列インデックス
で丸めモードを設定して頂くのも一案かと存じます。
Q134-2:
現状を考えると一番下の方法が適切かとも思いますが、丸めのほかに、小数点以下の1桁も設定したいので、この設定もすることが必要かと思います。この場合メッソドは何を使えばよろしいのでしょうか?
数値型のテーブルに文字列型で取得した数字を書き込むために、列型が変更してしまうのが現在の問題です。 数値型でデータ(数値)を保存、読み出す方法はあるのでしょうか? データを文字列型で保存、読み出してから、列型を変更(文字列型→数値型)に変えるのが通常の方法なのでしょうか? MZ プラットフォームというより、MySQLの関係かとも思い、またあまりにも初歩的な質問ですみません。実際のテーブルデータは数値型が大部分ですが、文字列型の列もあるのが現状です。
A134-2:
「小数部分の最大桁数」を設定したい場合には
「setNumberColumnMaximumFractionDigits(int,int)」
<引数0>小数部分の最大桁数、<引数1>列インデックス
をお試し下さい。
> 数値型のテーブルに文字列型で取得した数字を書き込むために、列型が変更してしまうのが現在の問題です。
MySQLのテーブルからMZPlatformのテーブルへという意味でしたら、前回ご紹介した「行を追加する(PFObjectTable)」を使えば、数字が入っているデータは文字列型でも、数値型の列に設定されるので問題はないかと思います。
MZPlatformの[データベースアクセス]コンポーネントでinsert文を実行する際に文字列として扱っているという意味でしたら、数値データは本来insert文内でシングルクォーテーションで囲まなくても良いのですが、囲ってもMySQL側で数値として処理されるので問題ありません。数値としてMySQLの数値型列に設定されるはずです。
> 数値型でデータ(数値)を保存、読み出す方法はあるのでしょうか? MySQL上で該当のテーブル列を数値型にしてあれば、[データベースアクセス]コンポーネントでSelect文を実行し取得した結果は数値型となります。
考えられるのは
・MySQL上で該当列がText型等の文字列型になっている
・Select文で取得結果が文字列となるような関数を使用している(例. concat(列1, 列2))
などやはりMySQLに関連する事柄ですが、いかがでしょうか。
表示するデータが都度変わる場合には列数や列型は一定ではないと思いますが、MySQLから数値型のデータを取得すると、通常MZPlatform上でも数値型になりますので、列型は変更する必要はなく、「テーブルデータを設定する(PFObjectTable)」でデータを設定し、後から丸めモードや小数部分の最大桁数を設定すれば良いということになります。
MySQLから取得した結果が数値であっても文字列型となっているというのが気になります。上記書いたようにMySQLでの列型が文字列型であったり、[データベースアクセス]コンポーネントで取得後に何か処理を加えているということはないでしょうか。
ご連絡:
数値列と文字列の問題は、MySQLでのデータ設定が一部文字列(Text)となっていましたので、実数(Int)に変更、また、クリアするために設定していたクリアテーブルの列型、丸め、少数点の設定を行った結果、うまく機能するようになりました。ご教授いただいた、〔小数部分の最大桁数〕および〔丸めの設定〕も適用しています。テーブルの行削除も考えましたが、テーブルの数が多いため、現在は上記で行っています。テーブルの列型設定、丸め、少数部分の桁数設定は、テーブル自体の設定が予め行われていないと、〔setNumberColumnMaximmumFactionDegits〕,〔setNumberColumnRoundingMode〕は機能しないことも理解しました。
備考:「テーブル」の「Q&A64」にも掲載。