MAGICXPAでSQLを実行し、結果を取得する方法
MAGICXPAでSqliteのデータを取得する方法について質問です。
以下のSQLをMAGICXPAで実行し、その結果を変数に格納するにはどうすればよいでしょうか?(3営業日後の日付を取得するsqlです)
SELECT WorkDate
FROM WorkCalendar
WHERE WorkDate > '2025-02-26' AND IsWorkDay = 1
ORDER BY WorkDate
LIMIT 1 OFFSET 2; -- 3営業日後(0ベースのため2)
テーブルワークカレンダーには下記のようなテストデータが入っています
sqlの実行結果の値 2025-03-03 をマジックの変数に入れたいです。
-
こんにちはPuです。
見当違いならごめんなさい。埋め込みSQLに記述して結果を出力パラメータで受け取れば良いのでは
でわ~でわ~ -
Puさん
教えて頂き、ありがとうございます。
埋め込みSQLの機能があるのを知りませんでした。なぜか、添付のSQLはno such column: WorkDateとなってしまい動きませんでしたが、
別のSQLで動作検証したところ、結果を変数に格納することができました。
とても助かりました。 -
結果データベース:Memoryにしたら、添付のSQLも動きました。
-
iwasakiさん、
添付のSQLというのは、SQLiteのことでしょうか?
-
tandaさん
添付のSQLというのは下記のSQL文のプログラムのことを示していたつもりでした。不明確で申し訳ありません。
SELECT WorkDate
FROM WorkCalendar
WHERE WorkDate > '2025-02-26' AND IsWorkDay = 1
ORDER BY WorkDate
LIMIT 1 OFFSET 2; -- 3営業日後(0ベースのため2)結果データベースの部分を指定なしのまま、このSQL文をF7(実行)すると、下記のようなエラーとなり、実行できませんでした。
結果データベースのをMemoryにしたら、エラーが発生せずに実行できました。(理由はよくわかっていません) -
iwasakiさん、
とくにSQL文を書く必要がなければ、Magicで普通にロジックを書くだけでも同じことができそうですけどね。そのほうがメンテナン性もいいと思いますが。
-
tandaさん
メンテナンス性を考えると、確かにその通りですね。
Magic xpaのロジックについて、まだ分からないことが多いんですよね。
ChatGPTにやりたいデータ操作を伝えると、SQL文を生成してくれるので、
直接SQL文を使えると便利だなと思ったので質問しました。
-
こんにちはPuです。
Magicのメンテナンス性が高い機能の一つ!!クロスリファレンス
埋め込みSQLだとクロスリファレンスに引っかかりませんので
埋め込みSQL使用する時は、宣言=DだけでもMagicに記述した方が幸せになれます
でわ~でわ~ -
iwasakiさん、
インターネット上には、他の言語と比べてMagicに関する情報が少ないので、ChatGPTの回答は妥当でない場合が多いですよ。ChatGPTは「分かりません」という回答はしてきませんので、適当な回答をしれーっとしてくることが多いです。要注意ですね。
ただし、MagicのHTMLマージに関してだけは、ChatGPTはとても頼りになります。Magic + ChatGPT で完璧なマージアプリが出来上がりますよ。
-
iwasakiさん こんにちは。
Magicのプログラムであれば2件読み込んで結果取得と作るとすれば以下例です。子タスク等を作成し
バッチ、照会、終了条件:COUNTER(0)=3
メインソース WorkCalendar
WorkDate 範囲小 2025/2/26
IsWorkDat 範囲小 1、範囲大 1
レコード後
項目更新 結果受取変数 式=WorkDate※追記:日付順に並んでいる前提です。日付順インデックスが無ければ日付でソート
-
Puさん
ご提案ありがとうございます!
宣言=D 知りませんでした
クロスリファレンスもチュートリアルpdf(getting Started Magic Xpa だったかな?)以来使っていませんでした。ので改めて使ってみます。
今後の開発に生かして行きます
-
tandaさん
ChatGPTの誤った情報には気をつけますね、アドバイスありがとうございますMagic xpa WebClient Serverがないので、もし社内で購入してもらえる見込みがあれば、HTMLマージを試してみようと思います。
-
nkmtさん
ご説明ありがとうございます
非常に参考になります。
sql文でいう OFFSET 2 の部分をMagicではどうするのかなと思っていたのですが、
バッチ、照会、終了条件:COUNTER(0)=3 で取得するのですね。
ご丁寧に教えていただき、ありがとうございます
-
子タスク等を作成し
バッチ、照会、終了条件:Yes、後起き
メインソース 無し
照会リンク WorkCalendar インデックス=日付順のインデックスを指定
WorkDate 位置付け小 ADDDATE('2025/2/26'DATE,0,0,2)
IsWorkDay 範囲小 1、範囲大 1
レコード後
項目更新 結果受取変数 式=WorkDate
これでもいけると思います。 -
nkmtさん
日付加算の関数があるのですね
範囲小 1、範囲大 1 の範囲設定も使ったことが無かったので参考になります。
-
3営業日ということであれば、照会リンク3段重ねとかでもよいかも?
試していないですけど、
WorkDateの範囲を変数にして、
・その変数を'2025/2/26'DATEで項目更新
・照会リンクの結果のWorkDate+1を変数に項目更新(1日目)
・照会リンクの結果のWorkDate+1を変数に項目更新(2回目)
休日が続いたりするケースやカレンダーがないケースも考慮すると
Puさんのおっしゃる宣言だけいれて、SQLにするほうが楽かもしれませんね
ちなみに、SQLコマンドのエラーは往年の不具合だとおもいます
Order byが入ったり副問い合わせがある場合、結果データベースがメモリにしないと
変なSQLが発行されたりするという、v10くらいからあるのでそろそろなおってほしい・・・ -
vgさん
コメントありがとうございます。
確かに、照会リンクを3回重ねる方法でも対応できそうですね。
SQLのエラーについて、昔からの不具合とのことで
ヘルプページをさっと読んでみて、原因がはっきりせずだったのですが、不具合の可能性が高いのですね。
ORDER BY やサブクエリが絡むと意図しないSQLが発行されるのは厄介ですね…。貴重な情報、ありがとうございます!
-
vgさん iwasakiさん こんにちは。
SQLコマンドの結果データベースは、メモリ以外使った事がありませんでした。
それで困っておりませんが、他を指定するのもいいのでしょうか? -
nkmtさんこんにちはPuです
自分も結果データベースはメモリ以外使った事ないです。
他を指定するメリットが見当たりません、自分も知りたいです。
でわ~でわ~ -
Puさん皆さんこんにちは。
SQLコマンドのデメリットも理解していますが、
それを上回るメリットを感じていますので
請求年月別
請求締件数、請求書 要提出件数表示や
担当者別 売上粗利集計表示 など
集計系は特にSQLコマンドを多用するようになりました。
ある方にこんなのも便利だよと教えて頂き、それから使うようになって8年ぐらいだと思います。 -
ビュー事前読み込みをしないとかの条件はありますが、
結果データベースを、例えばoracleにしているとoracle上に実テーブルができるので
行単位でフェッチでき、件数が多い時は初期表示が早くなります
メモリはデータをメモリに移す都合、全レコードを読み込んでからなので
読み込んでからは早いのですけど、初期表示が件数が多いと表示に時間がかかってしまいます -
vgさん 貴重な体験談を教えて頂きありがとうございます。
勉強になりました。
サインインしてコメントを残してください。
コメント
22件のコメント