拡張 SQL の先頭の AND・OR を本体で取り除く(改修案)
本体の標準機能ではありません
このページは本体を改修する場合の設計メモです。前提にした現行の実装は 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)ので、足しても動きは変わりません。