Q103:SQL データをExcel Fileへデータ出力を行うこと、その他について
Q103-1:
現在計画している工程管理簡易版ベースのアプリケーションでは作成したSQL データをExcel Fileへデータ出力を行うことを考えてあり、ご教授いただきたいことがありメールいたします。
1. SQL文の実行の対象となるSQL文はどのように指定するのでしょうか? 工程管理簡易版ではProduction.sqlがProductionのFileにありますが、これとは別に必要なSQL命令文を作成した場合、このSQL文を実行する場合です。
2. Excel Fileへ書き出しの場合、MySQLと同様にSQL文を作成し、実行させればよろしいのですね。
3. コンポーネントの実行に関して先にご教授いただいた内容で工程管理簡易版で勉強させてもらっていますが、ディバッガーを使って確認したところ、ちょっと理解できないことがあり、アドバイスを頂きたいと思います。
関連ファイル資料でボタン作成(ID 7-6)を押して始まるイベントですが、ステップを踏んでいくと、サブルーティン(新規受注追加 ID 7-56)へ飛んだ後、テーブル(受注情報 ID 7-4)が実行され、次に上にあるイベント生成(削除・読み込み ID 7-25)が実行されずにリスト格納変数(作業領域 ID 7-12)の実行に移ります。これはイベント番号の”1”が伝播されイベント生成(ID
7-25)はイベント番号”0”のみ実行されるため、”1”の場合は実行されないためと理解してよろしいでしょうか?もうちょっと確認すれば理解できるかもしれませんが、適切なアドバイスを頂いたほうが確かですのでご教授願う次第です。
関連ファイル:テーブル コンポーネント実行.jpg
A103-1:
> 1. SQL文の実行の対象となるSQL文はどのように指定するのでしょうか?
[データベースアクセス]コンポーネントのメソッド「SQL文を実行する(String)」または「イベント番号を指定してSQL文を実行する(String)」の引数としてSQL文を設定して頂くのが基本となります。
『データベースアクセスチュートリアル』では[テキストフィールド]に入力したテキストを引数として利用し、[ボタン]を押すと実行するようにしています。
『データベースアクセスチュートリアル』を¥MZPlatform¥2.5\AP_DATA¥Tutorialフォルダ内のサンプルアプリケーションと併せてどうぞご覧下さい。
他にも「テーブルに記述したSQL文を実行する(PFObjectTable)」があります。
これは予め2列の[テーブル]を用意し引数に指定すると、各行に書いておいたSQL文を順に実行するというものです。第0列目には「SQL文」第1列目には「イベント番号」をして下さい。
> 2. Excel Fileへ書き出しの場合、MySQLと同様にSQL文を作成し、実行させればよろしいのですね。
MySQLもEXCELも接続後SQL文を実行し、データの取得、更新を行うことに違いはありません。
『エクセル連携導入チュートリアル』P24まででは、『データベースアクセスチュートリアル』とほぼ同様に、「データベースに接続し、SQL文を実行してテーブルデータを取得する」という処理を行っています。
> 3.関連ファイル資料でボタン作成(ID 7-6)を押して始まるイベントですが、ステップを踏んでいくと、サブルーティン(新規受注追加 ID 7-56)へ飛んだ後、テーブル(受注情報 ID 7-4)が実行
され、次に上にあるイベント生成(削除・ 読み込み ID 7-25)が実行されずにリスト格納変数(作業領域 ID 7-12)の実行に移ります。これはイベント番号の”1”が伝播されイベント生成(ID7-25)はイベント番号”0”の
み実行されるため、”1”の場合は実行されな
いためと理解してよろしいでしょうか?
@基本的に同じイベントに繋がっている処理は上から順番に実行される。
A最初に発生したイベントをきっかけとして,そのイベントを受け取ったコンポーネント(接続先コンポーネント)がメソッドを 実行し,さらにそのメソッド実行により新しくイベントが発生して次の動作が行われる。
というご理解で結構なのですが、
[サブルーチン(新規受注追加 ID 7-56)]に一番目に繋がっている[テーブル(受注情報ID7-4)]のメソッド「getCellSelectionList()」の実行では、イベントは発生しません。
したがって次に繋がっている[リスト格納変数(作業領域ID7-12)]の処理が続いて行われます。
[テーブル(受注情報ID7-4)]では「データ更新イベント」に「イベント生成 (削除・読み込みID7-25)]の処理を設定してあります。
イベント番号「0」も設定されているので、特に『テーブルセルの値が更新された時』、「イベント生成 (削除・読み込みID7-25)]の「アクションイベントの発生(int)」が実行されるようになっています。
まとめますと
*[ボタン作成(ID7-56)]を押した時には[テーブル(受注情報ID7-4)]からイベントが発生する処理はない。
*[テーブル(受注情報ID7-4)]のセルの値を変更した時、「イベント生成 (削除・読み込みID7-25)]の「アクションイベントの発生(int)」が実行される。
ということになります。
また、イベント番号についてですが、「イベント生成 (削除・読み込みID7-25)]のイベント番号「0」については上述の通りです。
[サブルーチン(新規受注追加 ID 7-56)]のイベント番号「1」は接続元の[否定演算(NOT)(ID7-57)]の演算の結果が「true」の場合(ここでは納期を入れるセルの値がNULLではない場合)、実行されるようになっています。
「イベント番号」は左側の接続元コンポーネントからイベントが発生した時、さらに細かい条件を付けて右側の接続されているコンポーネントの処理を行うかどうか設定するものとお考え下さい。
*[テーブル(受注情報ID7-4)]のテーブルが更新された時「データ更新イベント」が発生するが、セルの値の更新時のみ「イベント生成 (削除・読み込み ID7-25)]の処理が実行される。(テーブル列の追加や行削除などの際にも「データ更新イベント」は発生するが、処理は実行されない)
*[否定演算(NOT)(ID7-57)]の演算が行われると「処理完了イベント」が発生する。演算結果が「true」の時には「イベント生成 (削除・読み込みID7-25)]の処理が、「falseあるいはNULL」の時にはダイアログを表示するように設定されている。
Q103-2:
SQL文の実行で再度確認させてください。
>『データベースアクセスチュートリアル』では[テキストフィールド]に入力したテキストを引数として利用し、[ボタン]を押すと実行するようにしています。
のテキストフィールドとは何のことを指されているのでしょうか? Tutorial「データベースアクセス」のデータベース検索フレーム(ID 3)の接続先としてデータベースアクセスのコンポーネント(ID 2)の起動メソッドはSQL文を実行するとなっていますが、引数はイベント内包、メソッド対象データとなっており、どこでProductionというSQL文を指定しているのか分からず悩んでおります。
Excel File用のSQL文、Productionとは別のSQL文で他のデータのMySQLへの書き込み、読み出しをしたいと考えていますので複数のSQL文を作成する必要があると考えており、「SQL文を実行する」前にこれらのSQL文を指定する方法が分かればと思います。
A103-2:
お問い合わせの「テキストフィールド」とは、データベース検索フレーム(ID:3)内のテキストフィールドコンポーネント(ID:3-4)のことを示しております。
データベースアクセス(ID:2)の「SQL文を実行する」の引数には、このテキストフィールド(ID:3-4)内の文字列(SQL文)が設定される動作となっております。
詳細を説明する前に、関連情報がございますのでお知らせします。
データベースアクセスチュートリアルは複合コンポーネントを使用しており若干わかりにくくなっておりますため、それを補足するため、複合コンポーネントを用いずに、チュートリアルのStep3までの機能(ツリー表示なし)を実現したものを以下に配置しております。
まずはこちらをご参照ください。
ファイル名:データベースアクセス0.mzax
場所:インストールフォルダ\AP_DATA\Tutorial
チュートリアルで作成するアプリケーションは、同様の機能を複合コンポーネントを用いて実現しているだけです。
アプリケーション内のデータベースアクセス(ID:2)の「SQL文を実行する」の引数取得方法「イベント内包」とは発生するイベントに内包されたデータを引数に使用することを指定するものです。「イベント対象データ」はその内包データを取得するメソッドです。
チュートリアルのアプリケーションでは、複合コンポーネントである「データベース検索フレーム」(ID:3)内で、実行ボタン(ID:3-5)が押された際に、イベント生成コンポーネントを用いて、テキストフィールド(ID:3-4)に設定された文字列(SQL文)を内包データとして設定し「データ設定イベントの発生」を実行してデータ設定イベントを発生し、複合コンポーネント外に伝播しております。
データベースアクセス(ID:2)の「SQL文を実行する」では、この内包データである文字列(SQL文)を「イベント内包」-「イベント対象データ」により取得し引数に設定しています。
関連ファイル:データベースアクセス0.mzax
Q103-3:
ご教授いただいた内容では、テキストフィールド(ID 3-4)の属性情報からSQL文は’Select * from project'と思われますが、それではProductionのFileにある、Production.sqlのSQL文の実行ではないのでしょうか?いろいろなデータを書き込むなどはInsertの命令の羅列のSQL文を作成する必要があると思われます。
もとに戻って、このProduction.sqlは何に、どのように使われているのでしょうか?私としてはMySQL、Excelに接続、データのやり取りをする場合、Production.sqlのような命令文をいくつか作成、それぞれを実行(テキストフィールドにSQL文のIDを指定して?)と理解していましたが、間違いでしょうか?
A103-3:
データベースアクセスチュートリアルのアプリケーションで、実行ボタンを押した際にデータベースアクセスのメソッド「SQL文を実行する」の引数に設定されますのは、Production.sqlの内容ではなく、テキストフィールドに表示されている「Select * from project」です。
Production.sqlは工程管理システム簡易版で用いるデータベースの初期状態を設定するファイルです。
このファイルとバッチファイルを用いて、MySQLにデータベースproductionと、その中のテーブルproject、taskを設定します。
「工程管理システム導入マニュアル」のp.6「2.3. 工程管理システム簡易版用データベースの初期設定」をご参照ください。
ご希望のような動作を実現するには、いくつかの異なるラベルやテキストフィールドに、それぞれのデータベース、それぞれの処理に応じたSQL文(または雛形)を設定し準備しておき、データベース処理時に対応したSQL文を取得し、実行することになると存じます。
あるデータベースに対して連続した一連のSQL文を実行するには、先日のメールでお伝えしましたようにメソッド「テーブルに記述したSQL文を実行する(PFObjectTable)」を使用する方法や、若干高度になりますが、データベース側でのバッチ処理やストアドプロシージャを用いた処理を行うことも可能です。
複雑な処理を、SQL文をデータベースで実行して行うのか、MZ Platformのコンポーネント接続により定義した処理で行うのかそれらのバランス等についても検討が必要になってくるかもしれません。
単純なSQL文実行とコンポーネント接続による処理の組み合わせでもかなりの事が実現可能ですので、まずは、単純なものから検討されるのが良いと存じます。
Q103-4:
Production.sqlの使い方が分かりました。ひとつ下記に関してですが、調べるより伺ったほうが正しく理解できるかと思いますので、ご教授ください。
工程管理簡易版では、どのようにSQL文を指定しているのでしょうか?デバッガでトレースしてみると、作業表の’更新’の場合、受注情報更新(ID 7-22)が送信イベント(ID 7-2)に引数として
"Update Project..." を渡しており、これがSQL文としてイベント内包で引継がれ、ローカルMySQL管理(ID 1-9)のSQL文を実行の起動メソッドで実行されているようですが、この”Update
Project...”の設定の仕方、および引数として送信イベントへ渡す方法が分からず悩んでいます。
文字列格納変数(ID 7-13)から取得しているとすると、文字列格納変数にこのSQL文を設定することはいかに行われているのでしょうか?
A103-4:
[イベント生成(ID:7-22)] に繋がる処理では、
@[文字列格納変数]に設定したUpdate文の雛形(「update project setlabel='DATA',product='DATA',delivery='DATA' where label='LABEL'」)の「DATA」と「LABEL」の部分文字列を実際のデータと置き換える
(「例:update project setlabel='A05',product='A05',delivery='2010-10-1010:00:00' where label='A05'」)
A日付の書式をMySQL用に変換
を目的とした設定となっています。
ここで作成されたUpdate文がSQL文としてイベント内包で引継がれていくというのはご指摘の通りです。
上記@、Aの作業を行っているサンプルとしては他に『エクセル連携導入チュートリアル』がございます。『エクセル連携(応用)P15〜20』でガントチャートが変更された時、作業開始・終了時刻を取得し、Update文を作成するという処理を行っていますので、ご参考になるかと存じます。併せて「エクセル連携導入(派遣管理)-2.mzax」をご覧下さい。
また『データベースアクセスチュートリアル』内でもやはり、SQL文を作成する処理がありますが、こちらでは[文字列格納変数]の「指定した文字列と連結して置き換える(String)」のメソッドを使用しています。
工程管理簡易版の場合、色々な機能を複数の複合コンポーネントに分けて設定しているため、イベントの送信/受信が必要になりますが、ご自身で作成なさる際には絶対に必要ということではございません。
雛形からSQL文を作成する際には、[文字列格納変数]の以下の2つのメソッドが使用する場合が多いです。
1.「指定した文字列と連結して置き換える(Stirng)」
@先に[文字列格納変数]に「文字列を設定」しておく(例:Select * from)
A「指定した文字列と連結して置き換える(Stirng)」
引数:project
「Select * from project」が完成
2.「正規表現に適合するすべての文字列を置換する(String)」
@先に[文字列格納変数]に「文字列を設定」しておく(例:Select*from TABLE)
A「正規表現に適合するすべての文字列を置換する(Stirng,String)」
引数0:TABLE 引数1:project
TABLEとprojectが置き換わる。「Select*from project」が完成置き換え(Replace)のメソッドは幾つかバリエーションがあります。
後は置換えたい部分の情報をどのようにして取得するかということになりますが、それは個々のアプリケーションによってそれぞれ違いますので、ご要望がございましたら、どうぞお知らせ下さい。