Skip to content

拡張 SQL の先頭の AND・OR を本体で取り除く(改修案) ​

第1版作成 最終更新 (日本時間)
確認バージョン1.5.3.01.5.8.1

本体の標準機能ではありません

このページは本体を改修する場合の設計メモです。前提にした現行の実装は 1.5.8.1 です。

OnSelectingWhere の拡張 SQL は、本文の先頭に AND を書くと一覧が SQL エラーになります。SQL の WHERE に続けて書く感覚で AND を付けてしまいやすく、しかも画面には「この項目は並べ替えることができません」と出るため原因が分かりにくい、という問題があります。本体で先頭の AND・OR を取り除けば、どちらの書き方でも動くようになります。

前提にした現行の実装 ​

現行の動きの詳細は「この項目は並べ替えることができません」になるときにまとめています。要点は次のとおりです。

  • Rds.OnSelectingWhereExtendedSqls() は、ExtendedSql.ReplacedCommandText() の結果をそのまま raw の条件として WHERE の条件の集まりに加えます(Rds.cs)。ReplacedCommandText() はプレースホルダーを置き換えるだけです(ExtendedSql.cs)。
  • SqlWhereCollection.Sql() は先頭に "where " を付け、条件を " and " でつなぎます(SqlWhereCollection.cs)。先頭に AND があると where AND ... や ... and AND ... になります。
  • OnSelectingWhereExtendedSqls() は一覧(View.SetColumnsWhere())のほか、権限設定画面の組織・グループ・ユーザーの一覧(OnSelectingWherePermissions〜)からも呼ばれます(View.cs、L2375-L2384、PermissionUtilities.cs)。

改修案 ​

対象内容
Rds.OnSelectingWhereExtendedSqls()where.Add(raw: ...) に渡す前に、ReplacedCommandText() の結果から先頭の AND / OR(大文字・小文字を区別しない)を取り除く
拡張 SQL の説明本文には条件式だけを書く(先頭に AND を書かない)こと、または本体が取り除くことを明記する

OnSelectingWhereExtendedSqls() の 1 か所で直せば、一覧と権限設定画面の両方に効きます。

取り除くときは、次の点に気を付けます。

  • 先頭の空白・改行・コメントを飛ばしてから判定します。.json.sql の先頭が改行やコメントのこともあります。
  • AND / OR の後ろが空白・改行・( のときだけ取り除きます。列名などが AND / OR で始まる場合(ORDER_NO = 1 など)を誤って削らないためです。
  • 先頭の OR を取り除くと、書いた人が OR でつなぐつもりだった条件も and でつながります。現行でも先頭の OR は構文エラーなので既存の動く設定は変わりませんが、OR でつなぐ意図は反映できないことを説明に書きます。

件数取得の SQL へのパラメータ渡し(1.5.8.1 では不要) ​

GridData.Get() は件数取得の Rds.SelectCount() に view.Param() を渡していません(GridData.cs)。Rds.SelectCount() は param を受け取れるので(Rds.cs)、param: param を足す改修も考えられます。

ただし 1.5.8.1 では、データ取得と件数取得の SQL は 1 つの SqlCommand で実行され(SqlIo.cs)、拡張フィールドのパラメータは NoCount = true で文の番号の付かない名前(@FilterCodes など)で追加されます(View.cs、SqlStatement.cs)。件数取得の SQL からも同じパラメータを参照できるため、この改修をしなくてもエラーにはなりません。足す場合も、同じ名前のパラメータは二重に追加されない(SqlStatement.cs)ので、足しても動きは変わりません。

変更履歴

第1版拡張 SQL で一覧が「この項目は並べ替えることができません」になる原因と、先頭の AND を取り除く改修メモを追加