大家好,又见面了,我是你们的朋友全栈君。
一、20181217-20181226笔记
selection_options和alv
二、相关服务
1、
事务码:SICF
默认SERVICE,执行。
Service:
default_host/sap/option/*
default_host/sap/public/bc/*
default_host/sap/bc/wdvd
default_host/sap/bc/webdynpro/*
2、
在应用WEBDYNPRO之前,首先要将你的APPLICATION SERVER中的FQDN配置好,也就是说您的WS必须是
Full Qualified Domain Name,如:hostname.companyname.com这种形式,任何以IP地址或者机器名称为命名
的URL地址都不能正常访问WEBDYNPRO,因此在开始开发WEBDYNPRO之前,首先我们要和BASIS确认服务器是
Full Qualified Domain Name即FQDN。
三、界面、元素介绍
1.ELEMENTS:
Context上下文的参数
添加元素
添加单个元素
按上下文添加
展示文本
删除
BUTTON 按钮
TRAY 可折叠块
INPUT_FIELD (文本输入框)
LABEL (说明文本)
TABLE 表控制
VIEW_CONTAINER_UIELEMENT 视图组建控制器(一般用来放ALV、SELECT_OPTIONS或其他组建)
2.APPLICATION STRUC
3.架构说明
一般的程序框架如图:
1)组建控制器是定义的全局的组建,与视图相似,组建控制器是一个程序对外的部分,是整个程序最开始执行的环节 ,也是控制多个视图间数据交互的纽带,一般考虑到程序的扩展性会优先使用组件控制器,然后关联各视图。
2)组建接口是用来引入一些外部组建接口的。引入的组建接口可添加到相应的视图窗口中使用
3)视图是一个DYNPRO程序显示的部分,可有多个视图,视图见可跳转,每个视图中需要显示的字段结构表等信息需要单独定义在该视图的节点中(CONTEXT)注意:组建控制器中也可以添加节点,作为全局节点属性,如果将它与某视图中的节点进行MAPPING,则可以再视图结束后,程序没结束的时候保存节点属性。一般界面跳转如此做
4)窗口与视图相似,只是每个程序每次显示只能有一个单独的窗口,可定义多个窗口,窗口间跳转,与视图跳转相似,都是在Inbound Plugs(入站)和Outbound Plugs(出站)里做对应的绑定。
5)应用程序,单独的执行程序。
4.普通样例展示
5.样例布局展示
6.布局说明
一般是以TRAY为折叠区域划分设计屏幕,(此处为两个,1是查询条件,2是查询结果)
在某个区域中,可用GROUP来分组。(看个人习惯)
区域的Layout一般选择MatrixLayout (MatrixHeadData 行开头 MatrixData 紧接着 HEAD,没有新的HEAD,会一直往后排。新的HEAD,另起一行)
常用属性:
enabled 是否灰显,EDITABLE
readOnly 只显示
suggestValues 这个是值建议,就像淘宝输入 手机 会有手机壳,手机膜。。。
value 绑定的VALUE
visible 可见
width 占的宽度,或者比例 一般200,250,150,TRAY 一般95%之类
EVENTS 事件,每种ELEMENT对应事件不同,有field的输入,按钮的事件。。。
cellDesign 单元格格式
colSpan 字段占列数,比如文本框,我们可以设置占5格等(前提是容器TRAY,CONTAINER的COL设置的够)
hAlign 格式
以上是些常用的属性。
7.视图的整体介绍
Properties:VIEW的属性,一般引入一些控件,alv,select-option等
Layout:视图布局,显示的样式,字段排版
Inbound Plugs:转入的连接(内向链接),一般视图跳转需要带些参数什么的,需要在这里定义plugs和参数相关信息
Outbound Plugs:转出的连接(外向链接),对Inbound对应,传出的连接和参数
Context:节点。视图使用的表,结构,全部放在这里。一般0-1/1-1/0-n三种。前两种相当于工作区,结构,后一种是内表。1-1时需要勾选Initialization Lead Selection
Attributes:视图属性,可在本视图的各方法中使用
Action一般是对应ELEMENT对应的EVENT产生的
Methods:方法
四、SELECT_OPTIONS
1、引入组件
WDR_SELECT_OPTIONS
2、组件加入视图
3、在layout中添加按钮和ViewContainerUIElement
只写ID即可
在视图的Attributes页签中,添加组件对象GD_HANDLE typr ref to IF_WD_SELECT_OPTIONS.
初始化代码:
method WDDOINIT .
DATA:LO_CP_USAGE TYPE REF TO IF_WD_COMPONENT_USAGE,
LO_SELECT_OP TYPE REF TO IWCI_WDR_SELECT_OPTIONS,
LT_RANGE TYPE REF TO DATA.
“get the component usage
LO_CP_USAGE = WD_THIS->WD_CPUSE_SELECT_OPTION( ).
IF LO_CP_USAGE->HAS_ACTIVE_COMPONENT( ) IS INITIAL.
LO_CP_USAGE->CREATE_COMPONENT( ).
ENDIF.
“get the select option usage
“选择屏幕的引用
LO_SELECT_OP = WD_THIS->WD_CPIFC_SELECT_OPTION( ).
“init the select option
“修改SELECT_OPTIONS
WD_THIS->GD_HANDLE = LO_SELECT_OP->INIT_SELECTION_SCREEN( ).
“设置全局信息
WD_THIS->GD_HANDLE->SET_GLOBAL_OPTIONS(
I_DISPLAY_BTN_CANCEL = ABAP_FALSE
I_DISPLAY_BTN_CHECK = ABAP_FALSE
I_DISPLAY_BTN_RESET = ABAP_TRUE
I_DISPLAY_BTN_EXECUTE = ABAP_FALSE ).
“CREATE ONE RANGE TABLE
* LT_RANGE = WD_THIS->GGD_HANDLE->CREATE_RANGE_TABLE( ).
DEFINE ADD_SELECT_OPTIONS.
CALL METHOD WD_THIS->GD_HANDLE->CREATE_RANGE_TABLE
EXPORTING
I_TYPENAME = &1
RECEIVING
RT_RANGE_TABLE = LT_RANGE. “RANGE_TABLE
CALL METHOD WD_THIS->GD_HANDLE->ADD_SELECTION_FIELD
EXPORTING
I_ID = &2 “ID
* I_WITHIN_BLOCK = MC_ID_MAIN_BLOCK
I_DESCRIPTION = &3 “描述
* I_IS_AUTO_DESCRIPTION = ABAP_TRUE
IT_RESULT = LT_RANGE. “RANGE_TABLE
* I_OBLIGATORY = ABAP_FALSE “必输
* I_COMPLEX_RESTRICTIONS =
* I_USE_COMPLEX_RESTRICTION = ABAP_FALSE
* I_NO_COMPLEX_RESTRICTIONS = ABAP_FALSE
* I_VALUE_HELP_TYPE = IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_NONE
* I_VALUE_HELP_ID =
* I_VALUE_HELP_MODE =
* I_VALUE_HELP_STRUCTURE =
* I_VALUE_HELP_STRUCTURE_FIELD =
* I_HELP_REQUEST_HANDLER =
* I_LOWER_CASE =
* I_MEMORY_ID =
* I_NO_EXTENSION = ABAP_FALSE
* I_NO_INTERVALS = ABAP_FALSE
* I_AS_CHECKBOX = ABAP_FALSE
* I_AS_DROPDOWN = ABAP_FALSE
* IT_VALUE_SET =
* I_READ_ONLY = ABAP_FALSE
* I_DONT_CARE_VALUE =
* I_EXPLANATION =
* I_TOOLTIP =
* I_IS_NULLABLE = ABAP_TRUE
* I_FORMAT_PROPERTIES =
* I_SUGGEST_VALUES =
* I_SUGGEST_FILTER_METHOD =
.
END-OF-DEFINITION.
ADD_SELECT_OPTIONS ‘VBELN’ ‘S_VBELN’ ‘订单号’.
ADD_SELECT_OPTIONS ‘POSNR’ ‘S_POSNR’ ‘订单行项目’.
endmethod.
查询按钮(SEARCH事件)代码:
method ONACTIONSEARCH .
“字段搜索条件
DATA lo_nd_search TYPE REF TO if_wd_context_node.
DATA lo_el_search TYPE REF TO if_wd_context_element.
DATA ls_search TYPE wd_this->element_search.
“展示TABLE
DATA lo_nd_item TYPE REF TO if_wd_context_node.
DATA lt_item TYPE wd_this->Elements_item.
“SELECT OPTIONS条件
DATA:RT_RANGE TYPE REF TO DATA.
FIELD-SYMBOLS:<FS_VBELN> TYPE TABLE,
<FS_POSNR> TYPE TABLE.
*
*
*
*
“得到字段搜索条件的填入值
lo_nd_search = wd_context->get_child_node( name = wd_this->wdctx_search ).
lo_el_search = lo_nd_search->get_element( ).
IF lo_el_search IS INITIAL.
ENDIF.
lo_el_search->get_static_attributes(
IMPORTING
static_attributes = ls_search ).
“获取TABLE内容
lo_nd_item = wd_context->get_child_node( name = wd_this->wdctx_item ).
SELECT
*
FROM LIPS
INTO CORRESPONDING FIELDS OF TABLE lt_item
WHERE VBELN = ls_search–VBELN
AND POSNR = ls_search–POSNR.
“获取SELECT OPTIONS条件的填入值
DEFINE GET_RANGE.
RT_RANGE = WD_THIS->GD_HANDLE->GET_RANGE_TABLE_OF_SEL_FIELD( I_ID = &1 ).“此处ID对应上面INIT中的ID
ASSIGN RT_RANGE->* TO &2.
END-OF-DEFINITION.
GET_RANGE ‘S_VBELN’ <FS_VBELN>.
GET_RANGE ‘S_POSNR’ <FS_POSNR>.
“获取TABLE内容
SELECT
*
FROM LIPS
INTO CORRESPONDING FIELDS OF TABLE lt_item
WHERE VBELN IN <FS_VBELN>
AND POSNR IN <FS_POSNR>.
“绑定table传入网页
“将以获取查询信息的内表lt_item绑到NODE中
lo_nd_item->bind_table( new_items = lt_item SET_INITIAL_ELEMENTS = ABAP_TRUE ).
“重要,默认是ABAP_TRUE,表示表格每次传值都会刷新ALV框体,
“如果为ABAP_FALSE,则表示每次查询的内容都会往框体里追加
endmethod.
清空按钮(CLEAR事件)代码:
method ONACTIONCLEAR .
“字段搜索条件
DATA lo_nd_search TYPE REF TO if_wd_context_node.
DATA lo_el_search TYPE REF TO if_wd_context_element.
DATA ls_search TYPE wd_this->element_search.
“设置字段搜索条件的填入值
lo_nd_search = wd_context->get_child_node( name = wd_this->wdctx_search ).
lo_el_search = lo_nd_search->get_element( ).
IF lo_el_search IS INITIAL.
ENDIF.
CLEAR ls_search.
lo_el_search->SET_static_attributes( ).
endmethod.
4、嵌入SELECT OPTIONS视图
5、效果:
五、ALV组件的使用
1、引入组件
SALV_WD_TABLE
2、视图引入组件中集成的ALV对象
视图method页签中新建方法
在WDDOMODIFYVIEW里加上 CALL METHOD ME->INIT_ALV.
或(WD_THIS->INIT_ALV)
不然不调用INIT_ALV( )方法
将INIT_ALV方法加入到WDDOMODIFYVIEW
INIT_ALV( ).
INIT_ALV添加初始化代码:
METHOD INIT_ALV .
DATA: LR_SALV_WD_TABLE_USAGE TYPE REF TO IF_WD_COMPONENT_USAGE.“①重要的下面要用
DATA: LR_SALV_WD_TABLE TYPE REF TO IWCI_SALV_WD_TABLE. “②重要的下面要用
DATA: LR_CONFIG TYPE REF TO CL_SALV_WD_CONFIG_TABLE.“③重要的下面要用
DATA: LR_TABLE_SETTINGS TYPE REF TO IF_SALV_WD_TABLE_SETTINGS.
DATA: LR_COLUMN_SETTINGS TYPE REF TO IF_SALV_WD_COLUMN_SETTINGS,
LR_COLUMN TYPE REF TO CL_SALV_WD_COLUMN,
LT_COLUMNS TYPE SALV_WD_T_COLUMN_REF,
LS_COLUMN TYPE SALV_WD_S_COLUMN_REF,
LR_COLUMN_HEADER TYPE REF TO CL_SALV_WD_COLUMN_HEADER.
DATA: lr_function TYPE REF TO cl_salv_wd_function_std,
lt_functions TYPE salv_wd_t_function_std_ref,
ls_function TYPE salv_wd_s_function_std_ref.
“实例LAV组件
LR_SALV_WD_TABLE_USAGE = WD_THIS->WD_CPUSE_ALV( ). “①重要的 将ALV组件实例化
IF LR_SALV_WD_TABLE_USAGE->HAS_ACTIVE_COMPONENT( ) IS INITIAL.
LR_SALV_WD_TABLE_USAGE->CREATE_COMPONENT( ).
ENDIF.
“获取参考模型
LR_SALV_WD_TABLE = WD_THIS->WD_CPIFC_ALV( ). “②重要的 将引用的ALV组件实例 复制
“给参数
LR_CONFIG = LR_SALV_WD_TABLE->GET_MODEL( ). “③重要的 获取控制器的get_model方法,实现定制
“设置ui元素
LR_COLUMN_SETTINGS ?= LR_CONFIG.
LT_COLUMNS = LR_COLUMN_SETTINGS->GET_COLUMNS( ).
“ALV table 设置是否可以输入
LR_TABLE_SETTINGS ?= LR_CONFIG.
LR_TABLE_SETTINGS->SET_READ_ONLY( ABAP_FALSE ).
“设置ALV按钮
LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~SET_ENABLED( ABAP_TRUE ).
LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~SET_VISIBLE( CL_WD_TOOLBAR=>E_VISIBLE–VISIBLE ).
LT_FUNCTIONS = LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~GET_FUNCTIONS_STD( ).“标准功能”GET_FUNCTIONS “用户自定义功能
LOOP AT LT_FUNCTIONS INTO LS_FUNCTION.
lr_function = LS_FUNCTION–R_FUNCTION.
CASE LS_FUNCTION–ID.
WHEN ‘SALV_WD_INPUT_DELETE’.
“隐藏按钮
lr_function->set_visible( cl_wd_uielement=>e_visible–none ).
ENDCASE.
ENDLOOP.
“设置ALV按钮排除
* LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~DELETE_FUNCTION( ID = ‘SALV_WD_PDF’ ).
* LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~DELETE_FUNCTION( ID = ‘SALV_WD_VIEW_LOAD’ ).
* LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~DELETE_FUNCTION( ID = ‘SALV_WD_INPUT_APPEND_ROW’ ).
* LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~DELETE_FUNCTION( ID = ‘SALV_WD_INPUT_INSERT_ROW’ ).
* LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~DELETE_FUNCTION( ID = ‘SALV_WD_INPUT_DELETE’ ).
* LR_CONFIG->IF_SALV_WD_FUNCTION_SETTINGS~DELETE_FUNCTION( ID = ‘SALV_WD_INPUT_CHECK’ ).
“ALV TABLE 可显示行设置
LR_CONFIG->IF_SALV_WD_TABLE_SETTINGS~SET_VISIBLE_ROW_COUNT( ’15’ ).
“选择模式(黄条)
LR_CONFIG->IF_SALV_WD_TABLE_SETTINGS~SET_SELECTION_MODE( CL_WD_TABLE=>E_SELECTION_MODE–SINGLE_NO_LEAD ).
* “获得单独字段
* LR_COLUMN = LR_COLUMN_SETTINGS->GET_COLUMN( ‘POSNR’ ).
LOOP AT LT_COLUMNS INTO LS_COLUMN.
LR_COLUMN = LS_COLUMN–R_COLUMN.
CASE LS_COLUMN–ID.
* WHEN ‘VBELN’.
* LS_COLUMN-R_COLUMN->DELETE_HEADER( ).
* LR_COLUMN_HEADER = LS_COLUMN-R_COLUMN->CREATE_HEADER( ).
* LR_COLUMN_HEADER->SET_TEXT( ‘交货单子’ ).
** LS_COLUMN-R_COLUMN->SET_POSITION( 1 ).
* WHEN ‘POSNR’.
* LS_COLUMN-R_COLUMN->DELETE_HEADER( ).
* LR_COLUMN_HEADER = LS_COLUMN-R_COLUMN->CREATE_HEADER( ).
* LR_COLUMN_HEADER->SET_TEXT( ‘单子行项目’ ).
** LS_COLUMN-R_COLUMN->SET_POSITION( 1 ).
WHEN ‘ERNAM’.
“此处使用INPUT_FIELD 是为了展示前面设置的可编辑属性(默认都是text,不可编辑,所以有要编辑的列,需要这里设置一下)
DATA: LR_INPUT_FIELD TYPE REF TO CL_SALV_WD_UIE_INPUT_FIELD.
CREATE OBJECT LR_INPUT_FIELD
EXPORTING
VALUE_FIELDNAME = ‘ERNAM’.“此ID要与COLUMN对应,或者用GET_COLUMNS,然后循环处理列属性
LR_COLUMN->SET_CELL_EDITOR( LR_INPUT_FIELD ).
* WHEN OTHERS.
* LR_COLUMN = LS_COLUMN-R_COLUMN.
* “隐藏字段
* LR_COLUMN->SET_VISIBLE( CL_WD_UIELEMENT=>E_VISIBLE-NONE ).
** LR_COLUMN->SET_VISIBLE( ’01’ ).
ENDCASE.
ENDLOOP.
“用宏来设置字段
DEFINE SET_COLUMN.
LR_COLUMN = LR_COLUMN_SETTINGS->GET_COLUMN( &1 ).
LR_COLUMN->DELETE_HEADER( ).
LR_COLUMN_HEADER = LR_COLUMN->CREATE_HEADER( ).
LR_COLUMN_HEADER->SET_TEXT( &2 ).
LS_COLUMN–R_COLUMN->SET_POSITION( &3 ).
“是否显示的字段
LR_COLUMN->SET_VISIBLE( &4 ).
“VISIBILITY ’99’
“VISIBILITY_BLANK ’00’
“VISIBILITY_NONE ’01’
“VISIBILITY_VISIBLE ’02’
END-OF-DEFINITION.
“用宏来隐藏字段
DEFINE SET_COLUMN_NONE.
LR_COLUMN = LR_COLUMN_SETTINGS->GET_COLUMN( &1 ).
“排除不显示的字段
LR_COLUMN->SET_VISIBLE( ’01’ ).
“VISIBILITY ’99’
“VISIBILITY_BLANK ’00’
“VISIBILITY_NONE ’01’
“VISIBILITY_VISIBLE ’02’
END-OF-DEFINITION.
SET_COLUMN_NONE ‘LGORT’.
SET_COLUMN_NONE ‘CHARG’.
SET_COLUMN_NONE ‘LICHN’.
SET_COLUMN_NONE ‘KDMAT’.
SET_COLUMN_NONE ‘PRODH’.
SET_COLUMN_NONE ‘LFIMG’.
SET_COLUMN_NONE ‘MEINS’.
SET_COLUMN_NONE ‘VRKME’.
SET_COLUMN_NONE ‘UMVKZ’.
SET_COLUMN_NONE ‘UMVKN’.
SET_COLUMN_NONE ‘NTGEW’.
SET_COLUMN_NONE ‘BRGEW’.
SET_COLUMN_NONE ‘GEWEI’.
SET_COLUMN_NONE ‘VOLUM’.
SET_COLUMN_NONE ‘VOLEH’.
SET_COLUMN_NONE ‘VKGRP’.
SET_COLUMN_NONE ‘SPART’.
* LR_TABLE_SETTINGS->SET_VISIBLE_ROW_COUNT( ’10’ ).”设置可见行
* LR_TABLE_SETTINGS->SET_ROW_SELECTABLE( ABAP_TRUE ).”设置行选择
* LR_TABLE_SETTINGS->SET_WIDTH( ‘50%’ ).”设置ALV宽度
* LR_TABLE_SETTINGS->SET_EDIT_MODE( IF_SALV_WD_C_TABLE_SETTINGS=>EDIT_MODE ).”设置编辑模式
** LR_TABLE_SETTINGS->SET_EDIT_MODE( IF_SALV_WD_C_TABLE_SETTINGS=>EDIT_MODE_STANDARD ).”设置不可编辑模式
* LR_TABLE_SETTINGS->SET_READ_ONLY( ABAP_FALSE ).”设置ALV整体不可编辑
* LR_TABLE_SETTINGS->SET_SCROLLABLE_COL_COUNT( ’10’ ).”设置滚动条
* LR_TABLE_SETTINGS->SET_ENABLED( ABAP_TRUE ) .”可处理的
* LR_TABLE_SETTINGS->SET_EMPTY_TABLE_TEXT( ‘Empty’ ) .”设置空表时显示的文本
* LR_TABLE_SETTINGS->SET_FIXED_TABLE_LAYOUT( ABAP_FALSE ). “使列宽可自动调节
* LR_TABLE_SETTINGS->SET_DISPLAY_EMPTY_ROWS( ABAP_FALSE ). “不展示空表
ENDMETHOD.
讲节点参数传入ALV组件
用向导‘魔法棒’添加代码
删减无用代码:
3、控制器中创建组件、全局节点(之前在视图中创建,现在ALV需要绑定数据)
创建组件
可按结构或按下图
可复制MAIN中已创建的
4、在ALV组件中绑定数据到ALV
绑定成功后,DATA变成双向箭头
在视图中,绑定ITEM节点到COMPONENTCONTROLLER的节点,同上
(注,如果ALV数据只在单个VIEW里使用可以在VIEW中,将ITEM节点绑定到ALV的DATA节点)
5、ALV控制器创建,并在窗口中添加
为了程序效果,这里会将原有的TABLE保留,并将ALV放到TABLE下面
在LAYOUT中创建ViewContainerUIElement容器,放在TABLE后面
激活测试
六、字段,表等visiable,enable,read_only控制
今天主要讲一下布局控制:(visiable,enable,read_only)
visiable:可见性,控制字段,组件,分组等是否现实在界面上。一般按条件来控制隐藏的可以在CONTEXT NODE里定义个属性,类型WDY_BOOLEAN
然后再根据条件赋值X:可见 空:不可见 (visiable使用的较少)
enable:功能性,控制字段,组件,分组等是否功能有效,字段灰色显示。一般用在全局的属性上,例如保存后,全局灰显。定义同上
read_only:最常见属性,控制字段是否可编辑。可控制字段,分组,表等等。。。一般的显示状态和编辑状态切换通过此属性来控制
(相对于displayOnly,displayAsText之类的基本不用,read_only却常用)
(行可编辑,单元格可编辑,可在ITEM中加入READ_ONLY字段,控制对应字段的可编辑,然后在赋值时根据情况来给值)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157995.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...