こんにちは、渡邊です。
GeneXus17の新機能として、グリッドコントロールにSaveSessionStateメソッドと
LoadSessionStateメソッドが追加されています。
SaveSessionStateメソッドはグリッドのフィルタやページ番号をセッションに保存するメソッドで、
LoadSessionStateメソッドはSaveSessionStateメソッドで保存した情報を読み込むメソッドになります。
これらのメソッドはWorkWithパターンの適用時に生成される一覧画面のコードにも出力されていました。
ご紹介も兼ねて検証していきたいと思います。
前提
次のような構造のトランザクションを保存後、設定を変更せずにWorkWithパターンを適用します。
GeneXus17
下記はGeneXus17でWorkWithパターンが生成した一覧画面のEventsエレメントのコードになります。
Event Start
If not IsAuthorized(&PgmName)
NotAuthorized(&PgmName)
Endif
Grid.Rows = 10
&Update = "GXM_update"
&Delete = "GX_BtnDelete"
Form.Caption = 'Sample Trns'
Do 'PrepareTransaction'
Grid.LoadSessionState()
EndEvent
Event Refresh
Grid.SaveSessionState()
EndEvent
Event Grid.Load
&Update.Link = SampleTrn.Link(TrnMode.Update, SampleTrnId)
&Delete.Link = SampleTrn.Link(TrnMode.Delete, SampleTrnId)
SampleTrnName.Link = ViewSampleTrn.Link(SampleTrnId, "")
EndEvent
Event 'DoInsert'
SampleTrn(TrnMode.Insert, nullvalue(SampleTrnId))
EndEvent
Sub 'PrepareTransaction'
&TrnContext = new()
&TrnContext.CallerObject = &Pgmname
&TrnContext.CallerOnDelete = True
&TrnContext.CallerURL = &HTTPRequest.ScriptName + !"?" + &HTTPRequest.QueryString
&TrnContext.TransactionName = !"SampleTrn"
&Session.Set(!"TrnContext", &TrnContext.ToXml())
EndSub
StartイベントにGrid.LoadSessionState()、LoadイベントにGrid.SaveSessionState()のコードが生成されています。
それぞれのメソッドの引数は不要のようです。
ビルドをして実際の画面上でフィルタリングやページング操作を行いましたが、
再表示時にフィルタに値が再設定され、初期ページも想定通りでしたので、
機能的にはこれまでと同じ動きをしていました。
GeneXus16
下記はGeneXus16で同じように操作して生成されたコードになります。
Event Start
If not IsAuthorized(&PgmName)
NotAuthorized(&PgmName)
Endif
Grid.Rows = 10
&Update = "GXM_update"
&Delete = "GX_BtnDelete"
Form.Caption = 'Sample Trns'
Do 'PrepareTransaction'
Do 'LoadGridState'
EndEvent
Event Refresh
Do 'SaveGridState'
EndEvent
Event Grid.Load
&Update.Link = SampleTrn.Link(TrnMode.Update, SampleTrnId)
&Delete.Link = SampleTrn.Link(TrnMode.Delete, SampleTrnId)
SampleTrnName.Link = ViewSampleTrn.Link(SampleTrnId, "")
EndEvent
Event 'DoInsert'
SampleTrn(TrnMode.Insert, nullvalue(SampleTrnId))
EndEvent
/*** Subroutines used to load and save the grid state. ***/
Sub 'LoadGridState'
If (&HTTPRequest.Method = HttpMethod.Get)
// Load grid state from session.
&GridState.FromXml(&Session.Get(&PgmName + !"GridState"))
If &GridState.FilterValues.Count >= 1
&SampleTrnName.FromString(&GridState.FilterValues.Item(1).Value)
Endif
If &GridState.CurrentPage > 0
&GridPageCount = Grid.PageCount
If (&GridPageCount > 0 and &GridPageCount < &GridState.CurrentPage)
Grid.CurrentPage = &GridPageCount
Else
Grid.CurrentPage = &GridState.CurrentPage
Endif
Endif
Endif
EndSub
Sub 'SaveGridState'
&GridState.FromXml(&Session.Get(&PgmName + !"GridState"))
// Save grid state in session.
&GridState.CurrentPage = Grid.CurrentPage
&GridState.FilterValues.Clear()
&GridStateFilterValue = new()
&GridStateFilterValue.Value = &SampleTrnName.ToString()
&GridState.FilterValues.Add(&GridStateFilterValue)
&Session.Set(&PgmName + !"GridState", &GridState.ToXml())
EndSub
Sub 'PrepareTransaction'
&TrnContext = new()
&TrnContext.CallerObject = &Pgmname
&TrnContext.CallerOnDelete = True
&TrnContext.CallerURL = &HTTPRequest.ScriptName + !"?" + &HTTPRequest.QueryString
&TrnContext.TransactionName = !"SampleTrn"
&Session.Set(!"TrnContext", &TrnContext.ToXml())
EndSub
GeneXus16まではLoadGridStateサブルーチンやSaveGridStateサブルーチンに記述されたコードが、
フィルタやページ番号の読み込みや保存機能を実現していました。
これらが1行の標準メソッドで実現できることになり、
全体のコード量が減少していることがお分かりになるかと思います。
まとめ
検証したグリッドはフィルタ項目が1つでグリッドのカラム数も少なかったですが、
実際の開発ではフィルタ数やカラム数は多くなるため、コードの量に大きく差が出るかと思います。
新しいメソッドによりコードがすっきりして、ビルド時間の短縮にも期待できそうです。
この記事がお役に立ちましたら幸いです。最後までご覧頂きありがとうございました。