#検証#機能紹介:新機能SaveSessionStateメソッドとLoadSessionStateメソッドのご紹介

こんにちは、渡邊です。

GeneXus17の新機能として、グリッドコントロールにSaveSessionStateメソッドと
LoadSessionStateメソッドが追加されています。
SaveSessionStateメソッドはグリッドのフィルタやページ番号をセッションに保存するメソッドで、
LoadSessionStateメソッドはSaveSessionStateメソッドで保存した情報を読み込むメソッドになります。
これらのメソッドはWorkWithパターンの適用時に生成される一覧画面のコードにも出力されていました。

ご紹介も兼ねて検証していきたいと思います。

前提

次のような構造のトランザクションを保存後、設定を変更せずにWorkWithパターンを適用します。

IdとNameの2項目のトランザクションオブジェクト

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つでグリッドのカラム数も少なかったですが、
実際の開発ではフィルタ数やカラム数は多くなるため、コードの量に大きく差が出るかと思います。
新しいメソッドによりコードがすっきりして、ビルド時間の短縮にも期待できそうです。

この記事がお役に立ちましたら幸いです。最後までご覧頂きありがとうございました。