ちょっと前にやったけど、どこにも記録無いので実験&備忘録。
概要
やりたいことはSDTコレクションから条件にあうアイテム(行)を削除したいというだけ。
今回の条件は日付(&SDT_TEST001.Date)が入力されていない場合はSDTコレクションから削除。
というのを条件としました。
wiki
参考
SDT コレクションの実装wiki.genexus.jp
想定環境
GeneXus X Ev3 u14
DB:MYSQL
言語:Java
SDT・WebPanel
■Start Event
Event Start // SDTコレクション を初期化 &SDT_TEST001Collection.Clear() // ループで10件のSDTを作成 For &i = 1 to 10 // SDT を作成 &SDT_TEST001 = New() &SDT_TEST001.Id = &i // コレクションに追加 &SDT_TEST001Collection.Add(&SDT_TEST001) Endfor
Endevent
削除処理(失敗例)
Event Enter // ループでSDTコレクションを展開 For &SDT_TEST001 in &SDT_TEST001Collection // 画面にIDを表示して確認 MSG(&SDT_TEST001.Id.ToString().Trim()) // Indexを取得 &Index = &SDT_TEST001Collection.IndexOf(&SDT_TEST001) // 日付が入力されていない場合はコレクションから削除 If &SDT_TEST001.Date.IsEmpty() &SDT_TEST001Collection.Remove(&Index) Endif Endfor
Endevent
■解説
ループ中にSDTコレクションからアイテム(行)を消したことでズレが発生し、ID:5のアイテム(行)がForInで処理されませんでした。
コレクションを昇順で回しながら消すとこういったことが発生します。
削除処理(成功例)
Event Enter // SDTコレクションを降順でループする For &i = &SDT_TEST001Collection.Count to 1 step -1 // SDTアイテムを取得 &SDT_TEST001 = &SDT_TEST001Collection.Item(&i) // 画面にIDを表示して確認 MSG(&SDT_TEST001.Id.ToString().Trim()) // Indexを取得 &Index = &SDT_TEST001Collection.IndexOf(&SDT_TEST001) // 日付が入力されていない場合はコレクションから削除 If &SDT_TEST001.Date.IsEmpty() &SDT_TEST001Collection.Remove(&Index) Endif Endfor
Endevent
■解説
失敗時は昇順でループしたことでズレが発生しましたが、
降順でループすることで、ループ中にアイテム(行)を消してもズレが発生することはありません。まぁ少し考えれば分かることかもねw
おまけ
ForToを使って昇順でループしても 削除処理(失敗例)と同じ結果になりますw
// SDTコレクションを昇順でループする
For &i = 1 to &SDT_TEST001Collection.Count step 1 // ~~ 削除処理 ~~
Endfor
ということで、SDTのコレクションから該当行を削除できたのでOKとしましょう。
本当はもっと簡単なメソッドとかあると嬉しいんですが、しょうがないですね。
以上