【GeneXus】SDTコレクションから該当行を消したい

ちょっと前にやったけど、どこにも記録無いので実験&備忘録。

概要

やりたいことはSDTコレクションから条件にあうアイテム(行)を削除したいというだけ。
今回の条件は日付(&SDT_TEST001.Date)が入力されていない場合はSDTコレクションから削除。
というのを条件としました。

wiki

参考 SDT コレクションの実装wiki.genexus.jp

想定環境

GeneXus X Ev3 u14
DB:MYSQL
言語:Java

SDT・WebPanel

■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としましょう。
本当はもっと簡単なメソッドとかあると嬉しいんですが、しょうがないですね。

以上

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください