【解決済】変数の入力状況によってテーブルを切り替える
お世話になっております。
画面上に、
・検索用の商品のメーカコード・商品名のワード
・マスタを一覧で表示するテーブル
・編集画面
上記を配置したマスタメンテ画面を作成しようとしています。
①商品のメーカコード、商品名のワードを変数で配置した親タスク
②メインソースを商品マスタにしたサブタスク(テーブルを配置)
③SQLで絞り込み、商品マスタを表示するサブタスク(テーブルを配置)
④メインソースを商品マスタにしたサブタスク(編集画面)
で構成されています。
検索用の変数が未入力、またはメーカコードの変数のみを入力した場合は、商品マスタのメーカコードに変数の値を位置づけした②のテーブルを表示し、商品名の変数にワードが入力された場合、SQLを使ってそのワードで絞り込んだ③のテーブルを表示するようにしたいのですが、どのような仕組みにしたらよいでしょうか。
③のテーブルだけでなく②のテーブルも使用する理由は、マスタのレコード数が多すぎて、プログラム開始時やメーカコードのみ入力した場合にテーブルを表示するまで時間がかかってしまうためです。
DBはMSSQLです。
わかりにくくてすみません。アドバイスいただけると幸いです。
-
速度の話ですが、xpa3.1 + SQL Server 2012 の時は問題ありませんでしたが
xpa3.2 + SQL Server 2019 へと変更したら、1100万件、1400万件のデータを
テーブル表示するのに長時間待たされるようになった経験があります。
ONLINE_ARRAY_FETCHING=N の付加でそれは解決しました。 -
SQLで全件だと遅いというのは何かしら理由があるのではないでしょうか
結果データベースがメモリーになっているとか(全件メモリーに放り込むので遅いはず)
事前読み込みが有効になっているとか
そもそも書いているSQLが悪いということも、ちょくちょくありますが・・・
面倒ですけどワークテーブルにINSERTして表示するとかにすると
INDEXもきっちり効いて早くなるのではとおもいます。
あ、②③をどうしても切り替えたいならコールタスクを条件で分ける
サブフォームを二つ貼る or 式で変える て感じでよいかと -
KM様
230万件程度ですが、②のサブタスクでSQLを使った品名の絞り込みを入れてみたところ、体感では速度が変わりませんでした。
プログラム開始時に品名=空白で検索してしまうWhere句にしたり、メーカーコードで並び替えすると遅くなりました。
当方MagicXPA2.4なので見当違いかもしれませんが、Where句とINDEXに何かあるのではと思います。
-
皆様助言いただきありがとうございます。
nkmt様
[データベース情報]に記述するので合っていますでしょうか?
記述してみましたが、変化は見られませんでした。
vg様
結果DBはメモリでなく使用しているDBと同様です。
事前読み込みも無しになっています。
岡林拓也様
WHERE句で、部分一致で品名検索していた(変数が空白の場合は、品名 LIKE '%%'のように)ので、そのせいかと思い、
------
SELECT 品番,メーカコード FROM 商品マスタ
WHERE メーカコード= 1
------
上記のクエリでテストしてみたのですが、結果は変わらずに表示されるまでに5秒ほどかかりました。
レコード数は83万件程なのですが、皆様のコメントを見る限り多すぎるってことはないようですね。
SSMSでクエリを実行する場合は部分一致だろうが瞬時に表示されるので、Magic側で何か原因があるのでしょうか。
SQLコマンドを実行するうえで確認した方がいいところがあれば教えていただきたいです。
-
私は、データベースはSQL ServerのDBを指定し、結果データベースは必ずMemoryにしております。
-
xpa4ですが以下のようにしております。
データベース名 = DBMS, 21, hogehogeDB, , hogehoge-SERVER, ,sa,hogepwd, NoMagicRec+
ordLock, ChangeFileInToolkit, CheckDefinition, CheckKey, FileLocks, +
CHECK_KEY=YES ONLINE_ARRAY_FETCHING=N, , CheckExist, 0, , NoAS400SrvrSort, -
nkmt様
ありがとうございます。
iniファイルを同様の設定になるように編集してみましたが効果ありませんでした。
結果DBをメモリーにすると、2秒ほど表示が速くなりました。
他にも改善点がないか探してみます。
-
WHERE句の部分ですが、条件絞りが何もない場合もあるのかもしれないので、
ANDを必ず付加できるよう
WHERE 1=1 を固定で書くことがあります。
今思いましたが、83万件をSQLコマンドで条件絞りが無ければ、全件を結果データベースに
INSERTするような気もしますし、遅い原因はそこではないですかね。
GROUP集計をするのでなければ、普通にメインソースに商品マスタを指定して
以下に範囲条件を書くのもいいと思いました。 -
先日以下の投稿をしましたが、SQLコマンドではなく
メインソースに指定した普通のオンラインタスクの事でした。
速度の話ですが、xpa3.1 + SQL Server 2012 の時は問題ありませんでしたが
xpa3.2 + SQL Server 2019 へと変更したら、1100万件、1400万件のデータを
テーブル表示するのに長時間待たされるようになった経験があります。
ONLINE_ARRAY_FETCHING=N の付加でそれは解決しました。 -
nkmt様
範囲/位置付のSQL Where句というのは初耳でした。
試しに、DB SQL部分に、
------
(V_メーカコード = 0 OR メーカコード = V_メーカコード) AND (V_商品名 = '' OR 商品名 LIKE CONCAT('%', V_商品名 ,'%'))
------
上記のように記述したところ、思い通りの動きになり、瞬時に表示することができるようになりました。
ありがとうございました。
ただ、変数欄に存在しないメーカコードまたは存在しない品名を入力すると、
「設定されているタスク初期モードは使用できません。」
というエラーが表示されてしまいます。
一覧を表示しているタスクは照会モードなのですが、原因がわからず模索中です。
いろいろな知識が身について勉強になりました。
ありがとうございました。
-
KM様
nkmt様の助言で問題解決良かったです。
「設定されているタスク初期モードは使用できません。」は
『タスク特性>オプション>登録=Yes』または『タスク特性>データ>空のデータビュー許可=Yes』のどちらかの設定で解消しませんでしょうか。
-
岡林拓也様
『タスク特性>オプション>登録=Yes』を実行したところ、エラーが表示されないようになりました。
ありがとうございました。
ご面倒かとは存じますが、なぜエラーになり、なぜ登録=YESで解消できるのか、ご教授いただければ幸いです。
よろしくお願いいたします。
-
KM様 うまくいったようで良かったです。
該当データ無し対策は
タスクの特性で、空のデータビュー許可か
あるいは、タスク特性の登録の条件にSTAT(0,'C'MODE)、終了条件にもSTAT(0,'C'MODE)
タスク後処理に、エラー 該当データがありません 条件=STAT(0,'C'MODE)
を追加することもあります。 -
KM様
空のテーブルを開く時は登録モードで動作する為です。
APGでテーブルを開くと、空のテーブルの場合は「登録」になることが確認できます。
既にあるプログラムを登録=Yesにすると別の制御を追加しないといけなくなるでしょうし、
nkmt様が書かれているstat関数でエラーを表示する方が後々の苦労は少ないかもしれないです。
-
nkmt様
岡林拓也様
ご教授いただきありがとうございます。
なぜエラーが起こるのか理解できました。
とても勉強になりました。
サインインしてコメントを残してください。
コメント
15件のコメント