 
							#検証#機能紹介:新機能SaveSessionStateメソッドとLoadSessionStateメソッドのご紹介
2022年02月01日こんにちは、渡邊です。
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())
EndSubStartイベントに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())
EndSubGeneXus16まではLoadGridStateサブルーチンやSaveGridStateサブルーチンに記述されたコードが、
フィルタやページ番号の読み込みや保存機能を実現していました。
これらが1行の標準メソッドで実現できることになり、
全体のコード量が減少していることがお分かりになるかと思います。
まとめ
検証したグリッドはフィルタ項目が1つでグリッドのカラム数も少なかったですが、
実際の開発ではフィルタ数やカラム数は多くなるため、コードの量に大きく差が出るかと思います。
新しいメソッドによりコードがすっきりして、ビルド時間の短縮にも期待できそうです。
この記事がお役に立ちましたら幸いです。最後までご覧頂きありがとうございました。
 
				.jpg) 
																							 
																							