Odata 新会话启动时保存全局属性值

Odata 新会话启动时保存全局属性值,odata,abap,sap-fiori,Odata,Abap,Sap Fiori,SAP Fiori应用程序中有两个字段:Template\u ID和Offer\u ID 我想根据Template\u ID字段值在Offer\u ID中选择值 为了解决这个问题,我尝试了以下步骤: 当用户单击后端中的Template\u ID字段时,将运行该方法: CL\u CUAN\u CAMPAIGN\u DPC->contentset\u get\u entityset() 此方法具有返回参数et\u result。在et\u result中,我有必要的字段temp\u id 为了保存t

SAP Fiori应用程序中有两个字段:
Template\u ID
Offer\u ID

我想根据
Template\u ID
字段值在
Offer\u ID
中选择值

为了解决这个问题,我尝试了以下步骤:

当用户单击后端中的
Template\u ID
字段时,将运行该方法:

CL\u CUAN\u CAMPAIGN\u DPC->contentset\u get\u entityset()

此方法具有返回参数
et\u result
。在
et\u result
中,我有必要的字段
temp\u id

为了保存
temp\u id
值,我在class
ZCL\u CUAN\u class
中创建了一个全局属性

ZCL_CUAN_CLASS=>GV_CONTENT = VALUE #( et_result[ 1 ]-temp_ID OPTIONAL ).
我将使用此全局属性作为第二种方法的
输入
参数:

CL\u CUAN\u活动\u DPC->GET\u OFFER\u BY\u TEMPLATE()

此方法返回具有
offer\u id
的内部表,该表属于我选择的
temp\u id

但是,当用户单击Web UI上的
Offer\u ID
字段时,在调试过程中,我看到我的全局属性为空

可能是因为会话或其他原因,但它是空白的


当其他用户单击OfferId字段时,它将启动一个新的会话,当然,您在类
ZCL\u CUAN\u类中存储为
GV\u内容的内容将丢失

您应该做的是,对于第二个请求,您应该使用filter
Template\u ID
发送到后端,因此在您的
CL\u CUAN\u活动\u DPC->GET\u OFFER\u BY\u Template()
方法中,您可以通过
Template\u ID
进一步处理结果

或者

,意思是服务器响应您的查询,然后忘记您曾经在那里。根据定义,这不允许您将主内存内容从一个请求传输到下一个请求

另一方面,用户界面通常需要状态。可通过以下选项之一获得:

有状态用户界面 正如Haojie所指出的,一种解决方案是存储用户界面中选择的数据,并在下一个请求时将其作为筛选条件提交回服务器。有状态用户界面是无状态服务器应用程序的标准解决方案

有状态持久性 另一种选择是将数据永久存储在服务器的数据库中,最好是存储在ABAP中的业务对象中。此对象具有唯一标识符(可能是GUID),您可以在请求中引用该标识符来标识正在处理的进程

草稿持久性 如果在一个步骤中(例如在多步骤向导中)并非所有信息都可用,不应立即变为“活动”,或者您希望能够在处理多步骤流程时切换设备,则可以选择草稿。草稿是常规的业务对象,有一个特点,即在用户触发最终激活步骤之前,草稿保持惰性

软状态 对于性能优化,您可以看看,它允许您缓冲一些数据,以便能够更快地响应相关请求。但这通常是不鼓励的,因为它与OData的无状态范例相矛盾

有状态协议
在某些情况下,像OData这样的无状态协议不是正确的选择。例如,银行应用程序仍然倾向于使用状态,以避免用户无限期地登录,从而容易受到CSRF等攻击。如果你是这样,你应该看看ABAP WebDynpro的用户界面。一般来说,有状态服务器协议被认为是劣等的,因为它们会长期绑定大量服务器资源,因此无法处理较大的用户数。

请添加更多的上下文:您所说的“会话”到底是什么意思?用户是否注销并再次登录?您能否分享一些代码,说明您如何以及在何处准确声明gv_temp_id
<代码>this.gv\u temp\u id=…
this.getController().gv_temp_id=…
<代码>窗口.gv_temp_id或等效的
gv_temp_id='1234'?非常感谢你的回答,弗洛里安。我将尝试添加有关我的问题的更多信息。我将编辑我的问题。我是一个初学者,但看起来Fiori和OData服务是无状态的,所以这意味着您必须在每次请求时发送所有必需的数据。为什么这在你的情况下是个问题?我和你一样是新来的菲奥里和奥达塔人,我很难理解。我不知道如何保存必要的值,以及如何在后端执行所有这些操作,因为在前端我无法更改任何内容。当用户单击
Offer\u ID
字段时,为什么您不能发送
Template\u ID
字段的值?(也就是说,这将使它成为一个无状态应用程序,您将传输所有必填字段)非常感谢,Haojie。你能解释一下我怎么做吗?只有使用后端工具才能做到这一点吗?我是SAP Fiori的新手,不知道如何解决此问题!在前端请求GET_ENTITY_SET时,您需要在http请求中添加$filter。这是解决我的问题的唯一方法吗?只有在前端才有可能吗?根据我的经验,是的。你必须从前端发送谢谢你,浩杰,谢谢你的建议。非常感谢,弗洛里安的详细回答。这对我很有帮助。Florian如果我想使用“有状态用户界面”,我应该如何正确应用?可能是你可以给我看任何例子或向我解释步骤?“有状态用户界面”意味着你的Fiori应用程序的JavaScript代码将数据存储在主内存中。这可以是传递的简单局部变量。许多应用程序用于存储数据,因为数据的内容可以绑定到控件。不幸的是,我只能访问ABAP代码,不能更改任何java脚本。你觉得呢,还有别的办法解决我的问题吗?