Q182:テーブルに「SELECT」にてデータを抽出するのですが、WHEREにて条件を掛けるとデータが抽出されなくなってしまいました。
Q182-1:
出荷処理のファイルを作成しているのですが、その中で、テーブルに「SELECT」にてデータを抽出するのですが、WHEREにて条件を掛けるとデータが抽出されなくなってしまいました。
数値や文字といった部分で同じデータだと認識されず、抽出されていないと思い色々と試してみましたが、解決できなかったので問い合わせをさせていただいています。MYSQLのデータベースのサンプル画像と作りましたファイルを添付させていただきます。
抽出以外のデータ登録は間違いなく登録はできております。抽出条件はs_noをキーとして検索を行います。申し訳ありませんがご指導をお願い致します。
関連ファイル:出荷処理.mzax、出荷.xlsx
A182-1:
お送り頂いたアプリケーションファイルを拝見すると、[ボタン(ID:9 処理実行)]にInsertとSelectの処理が繋がっています。
このうち、10番目と11番目のメソッド「文字列を設定する(String)」と「指定文字列と一致するすべての文字列を置換える(String,String)」の順序が前後しています。
また、Insert文用に[文字列格納変数(ID:6 出荷記録SQL)]、Select文用に[文字列格納変数(ID:11 部品NO検索SQL)]を用意していらっしゃいますが、上記10番目が[文字列格納変数(ID:6 出荷記録SQL)]になっています。
正しくは
[ボタン]-------[文字列格納変数(ID:11 部品NO検索SQL)]I
| 「文字列を設定する(String)」
|
|---[文字列格納変数(ID:11 部品NO検索SQL)]J
「指定文字列と一致するすべての文字列を置換える
(String,String)」
となります。
[文字列格納変数]内の文字列は「属性情報」の「String」の項で確認することができます。コンポーネントを右クリック>[属性情報設定...」またはコンポーネントをダブルクリックしてご覧下さい。
上記ご確認頂いても改善されない場合には、再度ご連絡頂ければ幸いです。
どうぞよろしくお願い申し上げます。
Q182-2:
ご指摘いただいたとおりに変更を行った結果思っていたように動いてくれました。
ありがとうございました。
さて、次の処理として作っていたのですが、(ID2:テキストフィールド)の入力内容が変更になった場合に処理が実行になりテーブルが変更になるように作成しました。とりあえず欲しい情報が取得できたのですが、(ID2:テキストフィールド)が空白もしくはMYSQLに登録されていない番号が選択された場合にエラーメッセージがでてきます。エクセルのマクロなどのようにIF文のような考え方でエラーを回避したいのですが教えていただけないでしょうか?
ID2:テキストフィールド 空白もしくは登録以外の場合 処理を終了する
エラーでなければ、処理を続行する。
すみませんがよろしくお願いします。
関連ファイル:出荷処理A.mzax
A182-2:
> (ID2:テキストフィールド)が空白もしくはMYSQLに登録されていない番号が選択された場合にエラーメッセージがでてきます。
1)テキストフィールドが空白の場合
Insert文が不完全になる 例:「values( ,10,200,3000)」
2)MySQLに登録されていない番号が選択された
該当するデータが無い⇒
Selectの結果、行数0のテーブルデータが取得される⇒
第0行目2列目のセルの値取得に失敗する
以上が原因と考えられますので、1)と2)は分けて考えたいと思います。
先に2)について回答致します。
一般的なIF文に当たる処理は、MZPlatform では[等価演算(=)]や[比較演算(>)]などの演算のコンポーネントと、イベント番号を組合わせます。イベント番号を設定すると、その処理の実行の有無を場合分けできます。
例えば『「テーブルの行数>0」の演算を行い、その結果が「真(true)」だったら目的@の処理を行う、「偽(false)」だったら目的Aの処理を行う』といった具合です。
登録されていない番号を条件にSelectした結果、[データベースアクセス]によって、列のみ有り行が無いテーブルテーブルデータが取得されたとお考え下さい。
番号が登録されていれば該当するデータ行数は1以上ありますので、「行数が0より大きいか」で判別ができます。
お送り頂いたファイルに簡単に[比較演算 (>)]を使って設定してみましたので、ご参考になれば幸いです。
なお、[テキストフィールド]の場合、[数値入力フィールド]、[日付入力フィールド]と違い、キーボードから文字を一文字入力する毎に「データ更新イベント」が発生するようになっています。
[テキストフィールド]では、Enterキーを押した時に発生する「アクションイベント」に処理を繋げて頂くと宜しいかと思います。
[テキストフィールド]------ 一文字入力毎にデータ更新イベント発生
[数値入力フィールド]------ 文字を入力し、Enterキーを押した時にデータ更新イベント発生
とお考え下さい。
1)については、Inset文の作成方法に係わり、複雑になる可能性がありますので、少し内容を整理し追ってご連絡致します。
ご不明な点等ございましたら、ご連絡頂ければ幸いです。
関連ファイル:出荷処理B.mzax
回答2-2:> ID2:テキストフィールド 空白もしくは登録以外の場合 処理を終了する
> エラーでなければ、処理を続行する。
1)登録の際に全てのテキストフィールドに入力することを想定なさっていらっしゃる場合には問題ありませんので、読み飛ばして下さい。
お送り頂いた処理では入力されていないフィールドがあると、登録の際にもエラーが発生します。登録する項目の個数によってInsert文を変化させる必要があります。
[テキストフィールド]では「入力されている文字列が無い⇒文字列の長さは0」と言えるので、これを利用して判別します。[文字列格納変数]に文字列を設定すると、文字列の長さを取得できます。[比較演算(>)]等で「長さが0以上か」演算します。
[テキストフィールド]には何も入力されていなくても、空文字が入っているとお考え下さい。空「文字」なので[文字列格納変数]に設定できます。
後は文字列を連結したり、置換えたりすれば良いのですが、項目と値と2箇所を変化させるため、少々複雑になります。
関連ファイルはInset文作成の一例です。コメントを付けてありますが、判り難い箇所があればご連絡頂ければ幸いです。あくまで一例ですので、この通りに行わなくてはいけないということではございません。
なお、今回は文字列長さに着目して判別していますが、データの型によっては「空(NULL)」である場合があります。その際には[NULL判定]も組合わせて処理を設定することもあります。
2)気になった点がございます。
@データベースのデータ列は全てvarchar(文字列)で作成していらっしゃいますが、入力のフィールドに[テキストフィールド]、[数値入力フィールド]の両方が使われています。
[テキストフィールド]、[数値入力フィールド]とそれぞれ特長がありますので、何か特別な目的がありましたら、お知らせ下さい。
A日付の入力にも[テキストフィールド]を使っていらっしゃるのですが、ユーザーの入力のし易さを考えると、[日付入力フィールド]や[日時選択ダイアログ/パネル]の使用も考えられます。
現在は色々お試し頂いている段階かと存じますが、何かご要望等ございましたら、どうぞご連絡下さい。
関連ファイル:Insert文作成例.mzax
Q182-3:
お話を頂いた下記の件「2)」ですが、佐賀県の無償支援(3回)を利用し作成方法などを教えていただいたときのものを参考としてテーブルを作成しております。
日付については、数値で入力し登録した方が検索や日付による期間設定を行う際に便利だということだったので数値で利用しております。深い理由などがありテーブルの構築(型式)を採用しておらず支援を頂いたときのものを参考にしているのが現状です。
もっといい方法、こうした方がといったものがあればご指導をお願い致します。
エクセルにてもう少し行いたい処理を記載させていただきたいと思います。
A182-3:
1)テーブル結合の表示について
前回の回答でSelect文の例を書きましたが、サンプルアプリケーションでSelect文が有効かお試し頂く際に、最後に「(where/and) kosei_tbl.b_no='2710'」を付けてみて下さい。
アプリケーションでの処理は、このWhere文の値部分を今まで通り[文字列格納変数]で置換えることになります。
雛形文は例えば
「select kosei_tbl.table_id, kosei_tbl.b_no, k_no, k_suryo, zaiko from kosei_tbl, buhin_tbl where k_no = buhin_tbl.b_no and kosei_tbl.b_no='$bo_no'」($bo_noが被置換対象)
となります。
2)ユーザーの使い勝手は、後から考えて変更しても大丈夫です。他の会員の方でもユーザーの試用後に様々要望が出てくる例を多く拝見します。
例えば[日付入力フィールド]ですが、入力画面の文字列から[カレンダー]等で書式変換して、文字列の書式を整えることもできます。
@ユーザー入力画面上では[日付入力フィールド]「2013/03/03」
A[カレンダー]に[日付入力フィールド]から取得した日付データを設定
B[カレンダー]「書式指定による文字列表現の取得(String)」
書式:yyyyMMdd
C「20130303」が取得される
といったことも考えられます。
上記ご検討頂き、ご不明な点、ご要望等ございましたら、お手数ですが再度ご連絡下さい。どうぞよろしくお願い申し上げます。
Q182-4:
テーブルの結合について教えてください。
2つのテーブルより新たなテーブル(MZ上のみのテーブル、データ処理等にはその都度作成し利用します)を作ることは可能でしょうか?イメージをエクセルにて作成しましたので添付いたします。MZファイルも参考程度にしかなりませんが添付させていただきます。
ちなみにSQL文を入れたい部分は、「ID:14部品検索FC」の下にある「ID:18構成部品検索」でと考えています。
関連ファイル:製造実績処理.mzax、Book1.xlsx
A182-4:
データベース内の2つのテーブルに別々に格納されたデータを一つに結合することは、SQL文によってSelectする際でも、取得した後MZPlatform上でも、どちらでも行うことができます。
今回はSelect文を工夫する方が簡単かと存じます。
@等価結合
select kosei_tbl.table_id, kosei_tbl.b_no, k_no, k_suryo, zaiko from kosei_tbl, buhin_tbl where k_no = buhin_tbl.b_no
この場合、片方のテーブルにしかない「k_no」または「b_no」のデータは現れません。(例:k_no:12345があるが、b_noにはない)
「table_id」など2つのテーブルに同じ列名が存在し、それをSelect文で使用するには、前に「テーブル名.」を付けて「kosei_tbl.table_id」とします。
ALeft Join (外部結合)
select kosei_tbl.table_id, kosei_tbl.b_no, k_no, k_suryo, zaiko from kosei_tbl left join buhin_tbl on k_no = buhin_tbl.b_no
この場合(例:k_no:12345があるが、b_noにはない)時も「12345」のデータはSelectされ、zaiko列はNULL(MZ上では空白セル)になります。
right join もあります。
上記Select文をサンプルアプリケーション等でお試し下さい。
目的のデータと違うテーブルデータが取得されるようでしたら、再度ご連絡頂ければ幸いです。
どうぞよろしくお願い申し上げます。