Q50:Access側で下記のSQL文を利用しているのですが、MZPlatfrom上でMySQL側を利用するときfrom句でテーブル名を変更するだけでは上手く行きません。
Q50-1:
現在、MySQLのデータベースとAccessのデータベース両方を利用しています。
ここで、MySQLとAccessでテーブル名は異なりますが、フィールド名は同じものを利用しています。
以下のような対応状況です。
MySQL Access
order T_受注
all_job ジョブ
machine T_機械
ここで、Access側で下記のSQL文を利用しているのですが、MZPlatfrom上でMySQL側を利用するときfrom句でテーブル名を変更するだけでは上手く行きません。どうすればよいでしょうか?
SELECT 作番,備考2 as 図番,品名,受注金額,受注数量,Format(受注日,'YYYY/MM/DD') as 受注年月日,Format(納期日,'YYYY/MM/DD')
as 納期期限,需要先名 FROM T_受注 WHERE 受注元='U' and 受注NO=0729;
SELECT Format(日付,'MM/DD') as 作業日,略称,工程名 as 機械名,工程名2 as 作業名, sum(時間1) as [作業時間1の合計(h)] FROM ジョブ, T_機械 WHERE ジョブ.機械ID=T_機械.工程ID and ジョブ.時間1 IS NOT NULL And ジョブ.作番2=0729And ジョブ.作番1 ='U' GROUP BY 日付,略称,工程名,工程名2;
A50-1:
SQL文を拝見して、気が付いた点が2点ございます。
@Format関数はMySQLの場合、数値の丸めに適用されます。
日付型の書式設定の関数名はDATE_FORMAT()です。
DATE_FORMAT(受注日,'%Y/%m/%d') といった書式になります。
詳しくは下記のMySQLリファレンスのページをご覧下さい。
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html
なお、日付型データをMZPlatformの[テーブル]上に表示する場合は、そのまま読込んでも、[テーブル]列の上で右クリックして>表示属性(日付)>表示形式で「日付のみ」を選ぶか、メソッドによって「2009/4/24」といった表示にすることができます。
また「mm/dd」の書式にする場合には表示形式>その他で「mm/dd」を設定して下さい。
DATE_FORMAT(受注日,'%Y/%m/%d')で読込んだ場合は文字列型となります。
Aas [作業時間1の合計(h)]は エラーになりました。
大かっこ([])が特殊文字であるためと思われます。特殊文字、予約語などを列名に含む場合は、両側をバッククオーテーション 「`」で囲んでください。as` [作業時間1の合計(h)]`という形になります。
Q50-2:
ご指摘いただいた点を改良して以下の2つのSQL文を実行し、無事に検索結果を表示することが出来ました。
SELECT 作番, 備考2 AS 図番, 品名, 受注金額, 受注数量, Date_Format(受注日, '%Y/%m/%d') AS 受注年月日, Date_Format(納期日, '%Y/%m/%d' ) AS 納期期限, 需要先名 FROM `order` WHERE `受注元` = 'U' AND `受注NO` =0729
SELECT Date_Format(日付, '%m/%d') as 作業日,略称,工程名 as 機械名,工程名2 as `作業名`, sum(時間1) as `[作業時間1の合計(h)]` FROM `all_job`, `machine` WHERE `all_job`.`機械ID`=`machine`.`工程ID` and `all_job`.`時間1` IS NOT NULL And `all_job`.`作番2`= 0729 And `all_job`.`作番1` ='U' GROUP BY 日付,略称,工程名,工程名2;
しかし、MZPlatform上からこのSQLを実行すると下記のエラーメッセージが表示されます。
Exception:You have an error your SQL syntax; check the manual that corresponds to your...)
MySQL上で実行する場合と、MZPlatformから実行する場合とで、何かSQL文に変更を加えるべき箇所はあるでしょうか?
A50-2:
MySQL上とMZPlatform上でのSQL実行とに違いがあるということは、特にございません。
SQL文中に漢字列名が多く使われている入力の関係上、括弧「(」が半角ではなく、全角になっているということはないでしょうか。括弧を全角にした場合、MZPlatform上ではSQL Syntax Errorが発生します。
Q50-3:
ご指摘された全角文字が無いか確認し,ミスの無いよう下記のSQL文を作成して実行したのですが、やはりエラーが発生しました。
SELECT `作番`,`備考2` AS `図番`,`品名`,`受注金額`,`受注数量`,DATE_FORMAT(`受注日`,'%y/%m/%d') AS `受注年月日`,DATE_FORMAT(`納期日`,'%y/%m/%d') AS `納期期限`, `需要先名` FROM `order` WHERE `受注元`='U' AND `受注NO`=0729;
エラーメッセージ
Exception:Unknown column '??' in 'field list'
MySQL上では問題なく実行できるのですが、このエラーが発生するということは、フィールド名に問題があるということでしょうか?
A50-3:
MySQLデータベースインストール時に、default character set の設定はして頂いたでしょうか。MZPlatformでは「sjis」設定をお勧めしております。
(『工程管理システム導入マニュアル』P5を御参照下さい)
もちろん、意図して他の言語(euc,utf8)を選択して頂いても結構なのですが、少なくともデフォルトの「latin1」のままでは日本語列名は扱えません。
こちらで、データベースのdefault character setを「latin1」に変更して確認したところ、お知らせ頂いたものと同じエラーメッセージが発生しました。
これを回避するには「MySQL Server Instance Config Wizard」から文字セットの設定を行って下さい。
また、データベースへの接続文字列のデータベース名の後ろに
「?useUnicode=true&characterEncoding=SJIS」を付けて頂くと、(\AP_DATA\Sample\データベースアクセス_3(機能拡張版).mzaxを御参照下さい)
文字化けを回避できますが、やはり元々のデータベース設定変更をお勧め致します。
また、念のためJDBCドライバーを最新のものにして下さい。
文字セットの設定、JDBCドライバーの更新をなさっても、なお文字化けが発生する場合はお手数ですが、どうか再度ご連絡下さい。
Q50-4:
文字セットの問題ということでしたので、MySQLの文字セットを変更しようと考えたのですが、現在利用しているMySQLは、XAMPPと同時にインストールしているもので、MySQL Server Instance Config Wizardが分かりませんでした。そこで、少し調べたところ、XAMPPの場合、
C:\xampp\phpMyAdmin\config.inc.phpや
C:\xampp\mysql\bin\my.cnfの[mysqld]、[mysql]
の内容を変更すればよいと分ったのですが、下記のようにこれらのファイルの中には文字セットに関する記述が見つかりませんでした。
[mysqld]
port= 3306
socket= "C:/xampp/mysql/mysql.sock"
basedir="C:/xampp/mysql"
tmpdir="C:/xampp/tmp"
datadir="C:/xampp/mysql/data"
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
# safe-updates
この場合、一度XAMPPやMySQLをインストールし直した方がよいのでしょうか?
A50-4:
せっかくインストールなさったものですから、まずは次の手順でお試し下さい。
@「my.cnf」中に記述がない場合はデフォルトの「latin1」で設定されているとお考え頂いてよろしいかと存じます。
default-character-set=sjis
skip-character-set-client-handshake
を[mysqld]の項に追加して下さい。
一旦MySQLデータベースを再起動します。
ASHOW VARIABLES LIKE 'char%'(MZPlatformとMySQLコマンドライン、PHPから)
やstatusコマンドで、文字セット設定を御確認下さい。
B適宜[mysql]や[mysqldump]、[client]の項にdefault-character-set=sjisを追加していって下さい。
恐らくMySQLのバージョンによってmy.cnfの中味が違うのではないかと存じます。再インストールなさってもmy.cnfを編集することになるのは同じです。
Q50-5:
「my.cnf」中に
default-character-set=sjis
skip-character-set-client-handshake
等を適宜追加したのですが、xampp上でSHOW VARIABLES LIKE 'char%';を実行してみると、下記のようになります。
Variable_name Value
character_set_client utf8
character_set_connection sjis
character_set_database sjis
character_set_filesystem binary
character_set_results utf8
character_set_server sjis
character_set_system utf8
character_sets_dir C:\xampp\mysql\share\charsets\
このように、utf8のままの部分ができてしまいます。
また、この段階でMZPlatformからSQLを実行すると、
cannot issue empty query
というエラーが反ってきます。おそらく、上記の文字セットにutf8があるからだと思うのですが、どうすればよいでしょうか?
A50-5:
MySQLコマンドラインから、MZPlatformから、PHPからとそれぞれ「Show variables」を実行した時に、
character_set_client
character_set_results
の値が各クライアントによって違う場合があります。
現在のところ「Show global variables」で sjis と表示されれば問題ないかと考えております。何か問題が見つかりましたら、すぐにご連絡致します。
なお、文字セットはsjisでなければいけないということはございません。
以下の点を御検討下さい。
@テーブルのカラム名に日本語を使っていらっしゃいますが、カラム名やテーブル名に日本語を使うと、文字化けを引き起こし易くなります。
AXAMPPで一括してMySQL等インストールしていらっしゃいますが、PHPも一般的に文字化けを引き起こし易く、設定が難しくなっているかと思われます。
もし差支えなければですが、MySQLデータベースを個別にインストールし、試して頂いてから、XAMPP内のMySQLに適用した方が、判り易いのではないかと存じます。後からMySQLをインストールする際にはフォルダーも違いますし、「サービス名」と「ポート番号」を重複しないように変えて頂ければ、たとえ同じバージョンをインストールなさっても大きな問題はないかと存じます。