在Fiori ListReport模板上编辑项目

2020-09-05 20:45发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)我们需要能够为报告中的每个项目编...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们需要能够为报告中的每个项目编辑一些字段,而不必导航到详细信息页面来执行此操作。 我假设如果ODataModel为TwoWay且ui.table.Table已配置为可编辑,则当按下"编辑"按钮时,基于meta.xml中的sap:updatable属性,这些字段将变为可编辑控件。

问题:
-我们没有在表格顶部获得"编辑"按钮。
-如果我在控制器中将ui.table设置为"可编辑",那么所有字段都将变为可编辑状态,而不仅仅是 具有相应可更新属性的广告。

如果有人可以指出正确的方向以使"编辑"模式进入列表报告,我将不胜感激。

SAPui5 V1.38.5

3条回答
歪着头看世界
2020-09-05 21:13

设置表进行编辑会导致所有字段变为可编辑状态,而不仅仅是具有配置的字段 : sap:updatable =" true"
,并且没有"编辑","保存"或"取消"按钮。 在UI适应编辑器中使用"编辑可切换"属性在ListReport中无效。

我手动执行此操作,这是我解决此问题的方法:

已为EntitySet和EntitySet中的各种属性配置了可更新属性。
"编辑"按钮仅在详细信息页面上可用,但我们不希望在详细信息页面上显示"编辑"按钮,因此我在清单中为ObjectPage创建了Controller扩展:

" sap.suite.ui.generic.template.ObjectPage.view.Details":{
 " controllerName":" MY_NAMESPACE.ext.controller.ObjectPageController"
 }
 

并在控制器内部,从界面中删除了编辑控件:

 var oEditBtn = this.getView()。byId(this._sCtrlId +" edit");
 如果(oEditBtn){
 oEditBtn.setEnabled(false);
 oEditBtn.setVisible(false);
 }
 

我通过在清单中包括"动作"以及"保存"和"取消"按钮,将"编辑"按钮添加到了ListReport:

"操作":{
 " EditItems":{
 " id":" EditActionId",
 " text":" {{LBL_EDIT}}",
 " press":" onEditPressed",
 " requiresSelection":否,
 "确定":false
 },
 " SaveItems":{
 " id":" SaveEditActionId",
 " text":" {{LBL_SAVE}}",
 " press":" onSavePressed",
 "确定":正确
 },
 "取消项目": {
 " id":" CancelEditActionId",
 " text":" {{LBL_CANCEL}}",
 " press":" onCancelPressed",
 "确定":正确
 }
 

根据文档,将这些操作之一设置为" determining":true应该将控件呈现在应用程序的页脚中,但是在此版本(1.38.5)中并未发生。 保存和取消按钮与编辑按钮一起保留在标题上。
要解决此问题,我必须根据应用程序的状态隐藏/显示这些按钮。

现在我必须实现编辑功能,当用户按下"编辑"按钮时,应用程序进入编辑状态。
为确保编辑后的项目不会从屏幕上消失,我禁用了FilterBar中的所有过滤器以及"转到"按钮。
隐藏"编辑"按钮,并显示"保存"和"取消"按钮。 我清除了消息并显示了一个消息弹出按钮,以便用户将获得有关编辑的一些反馈。


然后我为字段/列构建了一组模板。 这是有趣的部分,使用服务元数据,我检查了EntitySet的所有属性以发现所有可更新的字段:

 var oMeta = this._oSmartTable.getModel()。getServiceMetadata();
 对于(oMeta.dataServices.schema中的var iSchema){
 对于(oMeta.dataServices.schema [iSchema] .entityType中的var iEntityType){
 如果(oMeta.dataServices.schema [iSchema] .entityType [iEntityType] .name ===" MyEntity"){
 this._oEntitySchema = oMeta.dataServices.schema [iSchema] .entityType [iEntityType];
 打破;
 }
 }
 如果(this._oEntitySchema){
 打破;
 }
 }
 

根据字段的数据类型,我创建了一个合适的控件,该控件将被设置为表中列的模板。

 for(this._oEntitySchema.property中的var iProp){
 var bUpdatable = true;
 var sLabel ="";
 用于(此this._oEntitySchema.property [iProp] .extensions中的var iUpdatable){
 如果(this._oEntitySchema.property [iProp] .extensions [iUpdatable] .name ===" label"){
 sLabel = this._oEntitySchema.property [iProp] .extensions [iUpdatable] .value;
 }
 如果(this._oEntitySchema.property [iProp] .extensions [iUpdatable] .name ==="可更新" &&
 this._oEntitySchema.property [iProp] .extensions [iUpdatable] .value ===" false"){
 bUpdatable = false;
 }
 }
 如果(bUpdatable === true){
 var sName = this._oEntitySchema.property [iProp] .name;
 var sType = this._oEntitySchema.property [iProp] .type;
 var oControlTemplate = null;
 开关(sType){
 ...//Edm.Decimal,Edm.DateTime等...
 }
 }
 }
 

现在,我们的用户希望当输入具有焦点时,每个控件中的所有文本都会被选中/突出显示,并且我们对某些字段还有一些其他要求:最小值,日期和数字验证,并且有一个可读取的文本。 价格值更新时必须更新的-only字段。 因此,在创建模板来处理这些要求时,我在控件中添加了一些事件处理程序。

ui.table.Table与m.Table不同,它没有非常有用的setKeyboardMode()方法,因此我不得不向这些控件添加键侦听器并处理Tab,Shift + Tab,向上和向下箭头 键来管理从一个输入到下一个输入的导航。

 oControlTemplate.attachBrowserEvent(" keydown",this._handleEditNavigationKey,this); 

我通过检查表的行和单元格来管理此导航,将重点放在下一个/上一个可编辑控件上。

更新更改时,ODataModel出现了一些问题:使用批处理时,对一项进行编辑失败,批处理中的所有更新均失败,因此必须逐项更新每个项。 submitChanges()文档中提到:" 重要提示:仅在启用批处理支持的情况下,才会调用成功/错误处理程序。" 因此,当不使用批处理更新单个编辑内容时,我没有收到响应 成功/错误,并且无法处理消息,我尝试了attachBatchRequestSent并在oParameter中为commitChanges和update调用设置了成功/错误回调。

因此,我手动进行了此操作...我将每个编辑记录在一个数组中。 存储sPath,propertyName,新值和旧值以及数据类型。 当对一个字段进行多次编辑时,我只是更新了新值,如果某个值与原始值相同,则删除了edits数组中该字段的条目。

当用户单击"保存"按钮时,我使用此数组发送更新。 我创建一个新的ODataModel并将其设置为使用批处理。 然后,对于编辑列表中的每个项目,我调用了update()方法,并且能够处理单个项目的成功/错误结果。

如果用户按"取消",我将使用存储在编辑列表中的sPath并使用主模型的resetChanges()方法来重置更改。 确保只读字段的值正确重置。

大量修改。
我在对话框中处理了批量编辑。 因此,我创建了一个新片段" MassEditDialog"以用作我的对话框。
我写了两个自定义控件,一个RadioButton扩展,旁边有一个输入控件(Number,Text,ComboBox或DatePicker)而不是标签,还有一个RadioButtonGroup,用于保存这些自定义RadioButton。
然后我创建了另一个片段" FieldEditor",其中包含一个VBox,并插入了一个带有ComboBox的自定义RadioButton,以便可以显示一些预定义值和" <保持现有值>"项(设置为默认选择)。

对话框启动时,我为每个可更新字段创建一个FieldEditor。
我查看表的选定项目值,并将前10个唯一值添加到FieldEditor的第一个ComboBox中。
再次使用之前收集的元数据来指定控件类型,我在VBox中插入了另一个自定义RadioButton,以允许用户指定唯一值。

对于这些反馈,我们深表感谢:

我不确定将Mass Edit功能的触发器放在何处,因此我在可编辑的Columns菜单中添加了" Mass Edit"菜单项。

自定义RadioButton控件出现了一些问题。 我想在添加的输入控件获得输入焦点时将其设置为选中。 但是并没有做到这一点,因此决定在输入控件的值更改或用户单击RadioButton的点时将其设置为选定状态。

此外,当按下表的"全选"复选框时,进行批量编辑时,我将获得所有记录。
我必须将表的阈值设置为当前过滤选择的模型的"计数",并执行" rebindTable"以确保加载所有内容以进行大规模编辑。

如果智能控件可以为我管理,我会更喜欢它,但我只是无法使它继续进行。 并且必须做很多工作才能对列表报告进行编辑。 希望这会帮助同一条船上的任何人。

一周热门 更多>