内表的Key
bw题归类总结

一.Delta增量1.什么是DEL TA机制?答:DELTA就是说在第一次load (加载)数据之后,允许下次在load数据的时候只load 还没有load过的数据。
2.不同模块事务数据DEL TA加载的操作过程一样吗?答:不一样,MM有MM的DELTA機制,FI有FI的機制。
FI用的处理机制是时间戳,AIE,PULL。
LO用的处理机制是DELTA queue,ABR,PUSH。
3.通用提取的数据来源有哪几种,是否可以DEL TA加载?答:TABLE/VIEW,INFOSET,FUNCTION MODULE,可以DELTA加载。
4.什么是增量队列?(delta queue)答:增量队列是新建或已更改数据记录的数据储存形式(上次数据请求以来出现的数据记录)。
从系统收到数据请求时,会使用源系统中的更新流程或录入自动写入增量队列。
package几种更新模式?答:1完全更新2初始化增量流程3增量更新(F,I,D)6.什么是增量更新?答:增量更新仅为源系统中的请求上次加载以来已创建或已更改(或已删除)的数据记录。
7.各个增量流程都支持哪些记录类型?答:后像前像倒象新象。
8.平面文件的增量流程原理是怎么样的?答:如果增量流程使用平面文件,数据不会通过增量队列传输到BI ,而是直接从DA TASOURSE 加载到PSA。
平面文件肯定不会用到DELTA queue,因为这是数据源的增量原理。
9.0RECORDMODE 是什么?答:数据状态RECORDMODE:有以下几个值' '在更改记录或添加数据后传输记录状态。
只有在请求相应的前像时,才会将记录直接更新到InfoCube(稍后解释)。
'X' 前像在更改或删除记录前传输记录状态。
所有可以汇总(关键值)的记录属性必须用加/减冲销符号进行传输。
冲销加/减符号由提取器(缺省)或服务Service API 负责。
这些记录在DataStore 对象的非附加(覆盖)更新中予以忽略。
abap语法

abap语法ABAP1 了解ABAP2 ABAP语法概述3 ABAP语言的数据类型4 ABAP的语法格式5 结构类型和结构体6 内表7 数据库操作ABAP(Advanced business application program),是一种高级企业应用编程语言,它支持封装性和继承性,封装性是面向对象的基础,而继承性是建立在封装性基础上的重要特性。
它适合生成报表,支持对数据库的操作,如:Sqlserver,Oracle,DB2等主流数据库系统。
语法概述ABAP基本语法特点由各自独立的语句构成。
每个语句的第一个单词必须是ABAP关键字。
单词之间至少要用一个空格分隔。
每个语句结束必须要用句号。
一个语句可以跨多行,只要不遇到句号,就认为是一个延续的语句。
可以把多个语句放在一行。
ABAP不区分大小写,关键字和用户操作数都一样,为了便于阅读,一般把关键字大写,而操作数小写。
如果连续多行的第一个关键字相同,可以使用链语句方式减少输入 data: id type I.data: name type c.可写为:data: id type I ,name type c.注释:注释行由第一列的星号(*)开头,并且必须写在第一列,前面不能有空格。
在行末的注释用双引号(”)作为前导。
data: id type i. “ 定义一个对象num数据类型为IABAP的命名规则使用至少1个但不超过8个字符。
不要使用下列字符:句点(.);逗号(,);空格( );括号‘(’‘)’;单引号(‘);双引号(“);等号(=);星号(*);百分号(%);ABAP数据类型(八种基本数据类型)D :日期类型,格式为YYYYMMDD,长度为8T :时间类型,格式为HHMMSS,长度为6I :整数类型,默认长度为4,初始值为0F :浮点类型,默认长度为8,初始值为0,常用于计算C :字符串类型,定义变量时指定字符个数N :数字字符串类型,定义变量时指定数值字符个数X :字节序列类型,定义变量时指定字节数P(压缩号) :允许的长度为1 到16 个字节,系统会指定默认值8 个字节(也就是15 位数字)和0 个小数位常用:大小,长度,重量,货币等单位的场合.定义方法:[f1] type I.[f2] type p decimals [num].[f3] type f.如:DATA number(10) type p value '9.876543210' decimals 9.输出:9.876543210如果decimals 8 输出: 9.87654321ABAP运算数值运算(在ABAP中数学表达式可以任意多层嵌套)算术运算二元操作符包括:–+ :加法– - :减法–* :乘法–/ :除法–** :乘方–DIV :整除忽略余数–MOD :取模需要注意,圆括号和操作符都是关键字,需要跟操作数之间至少用一个空格分开。
ALV中的fieldcat常用以及大全

字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.常用的字段如下:row_pos: 默认值为0,可选值为1、2、3,既最大分3级别显示fieldname 字段的名字(内表中定义的字段名)ref_field (ALV 控制: 内部表字段的参考字段名称) 参考的数据字典的字段名,配合ref_tabname一起使用,一般用来使单元格生成F4帮助ref_table (ALV 控制: 内部表字段的参考表名称) 参考数据字典的表名,配合ref_fieldname使用fieldname ALV 控制: 内部表字段的字段名称TABNAME LVC 标签名称Cfieldname currency unit field name值为当前输出内表中的货币单位字段的字段名称Ctabname Cfieldname字段值对应的输出内表Qfieldname 计量单位字段名,例如如值EA对应的字段名Qtabname Qfieldname 对应的输出内表名COLTEXT ALV 控制: 列标题key 字段是否为关键字(X或空)checkbox 复选框形式(X或空)ICON 作为图标输出,在ALV输出内表中的字段内容必须是有效的图标名称,图标名称和ID存在数据字典中ICON表中。
OUTPUTLEN ALV 控制: 列的字符宽度edit 当前列可编辑emphasize 设置列的颜色。
取值格式C(1-7)(0-1)(0-1)当有字段的edit属性生效时,会与该参数值想冲突。
edit_mask 同write语句中的edit mask格式是一样的,一般用来格式化时间和日期等col_pos 字段的位置no_out 当前列隐藏输出just 对齐方式(取值为R,L,C)lzero 输出前导零(X或空),仅NUMC类型字段有效no_zero 如果取值为零,则为空,既不输出零。
do_sum 对当前列输出时自动求和scrtext_l 字段的文本描述,输出时候显示。
ALV详细说明

一.ALV介绍The ALV Grid Control (ALV = S A P L ist V iewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自定义来进行增强,因此可以允许你可以在大型的应用程序中使用.SAP提示: 在SAP的开发项目中,ALV GRID也可以作为修改和创建数据的一种工具,然而,目前这个功能只在实验计划中使用,还没有向客户发布.下面是一个ALV GRID的图片:它包括3大部分,工具栏,标题,用于显示数据的网格控制器.如果有必要,用户可以隐藏标题和工具栏.ALV家族包含3中ALV工具:简易的,两层ALV,分等级连续的列表和树形结构的ALV.二.ALV GRID CONTROL (ALV网格控制器)ALV GRID CONTROL使用了控制器技术以实现艺术性的屏幕显示,象所有的控制器一样,ALV GRID CONTROL通过系统中的一个全局的类提供了方法,以响应它的动作.使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理.三.ALV GRID CONTROL 实例ALV GRID实例的定义,参照CL_GUI_ALV_GRID类data ALV_GRID1 type ref to cl_gui_alv_grid.ALV GRID继承结构:四、ALV GRID相关的几个控制结构1.字段目录[Field catalog]字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.常用的控制字段如下:(下面的示例将说明这些字段的使用,参考STRUCTURELVC_S_FCAT)2ROW_POS ALV 控制: 输出行(内部使用)3COL_POS ALV 控制: 输出列列的位置,第几列,例如1,2,…..4FIELDNAME ALV 控制: 内部表字段的字段名称字段名称5TABNAME LVC 标签名称表名,如果是内表,是1 6CURRENCY ALV 控制: 货币单位7CFIELDNAME ALV 控制: 参考的当前单位的字段名称8QUANTITY ALV 控制: 计量单位9QFIELDNAME ALV 控制: 参考计量单位的字段名称10IFIELDNAME ALV 控制: 内部表字段的字段名称11ROUND ALV 控制: ROUND 值12EXPONENT ALV 控制:流动表示的指数13KEY ALV 控制: 关键字段关键字段,前面变蓝色14KEY_SEL ALV 控制: 可以被隐藏的关键列可以被隐藏的关键列15ICON ALV 控制: 作为图标输出此列作为图标输出16SYMBOL ALV 控制: 输出作为符号17CHECKBOX ALV 控制: 作为复选框输出复选框输出18JUST ALV 控制: 对齐对齐方式:'R': right justified 'L': left justified 'C': centered19LZERO ALV 控制: 输出前导零X'20NO_SIGN ALV 控制:输出抑制符号X',不输出符号21NO_ZERO ALV 控制: 为输出隐藏零X',隐藏022NO_CONVEXT ALV 控制: 不考虑输出的转换退出23EDIT_MASK ALV 控制: 为输出编辑掩码格式24EMPHASIZE ALV 控制: 带有颜色的高亮列列的颜色25FIX_COLUMN ALV 控制: 固定列26DO_SUM ALV 控制: 总计列值X',合计27NO_SUM ALV 控制: 没有总计列值X' ,没有合计28NO_OUT ALV 控制: 列没有输出X' ,隐藏此列29TECH ALV 控制: 技术字段X'.也是隐藏,但是有点不一样30OUTPUTLEN ALV 控制: 列的字符宽度输出的长度31CONVEXIT转换例程32SELTEXT ALV 控制: 对话功能的列标识符33TOOLTIP ALV 控制: 列抬头的工具提示34ROLLNAME ALV 控制: F1 帮助的数据元素35DATATYPE ABAP 字典中的数据类型ABAP 字典中的数据类型36INTTYPE ABAP 数据类型(C,D,N,...)ABAP 数据类型(C,D,N,...) 37INTLEN以字节计的内部长度内容的长度38LOWERCASE允许/不允许小写字母X' 允许大小写39REPTEXT标题40HIER_LEVEL ALV 控制: 内部使用41REPREP ALV 控制: 价值是补充/补充接口的选择标准42DOMNAME定义域名43SP_GROUP组代码44HOTSPOT ALV 控制: 单击敏感X',下面出现下划线,响应单击45DFIELDNAME ALV 控制: 数据库中列组的字段名称46COL_ID ALV 控制: 列 ID47F4AVAILABL字段有输入帮助吗X'.此列有搜索帮助48AUTO_VALUE ALV 控制: 自动复制值49CHECKTABLE表名50VALEXI固定值存在51WEB_FIELD ALV 控制: 内部表字段的字段名称52HREF_HNDL自然数热点连接的句柄53STYLE ALV 控制: 样式下面有例子会介绍,比如PUSHBUTTION54STYLE2ALV 控制: 样式55STYLE3ALV 控制: 样式56STYLE4ALV 控制: 样式57DRDN_HNDL自然数下拉的句柄58DRDN_FIELD ALV 控制: 内部表字段的字段名称下拉的字段59NO_MERGING字符字段长度1相同的值不合并60H_FTYPE ALV 树控制: 功能类型(总计,平均,最大.最小, ...)61COL_OPT可选列优化的条目62NO_INIT_CH字符字段长度163DRDN_ALIAS字符字段长度164REF_FIELD ALV 控制: 内部表字段的参考字段名称65REF_TABLE ALV 控制: 内部表字段的参考表名称66TXT_FIELD ALV 控制: 内部表字段的字段名称67ROUNDFIELD ALV 控制: 带有 ROUND 说明的字段名称68DECIMALS_O ALV 控制: 输出小数位的编号69DECMLFIELD ALV 控制: 带有 DECIMALS 说明的字段名称70DD_OUTLEN ALV 控制: 输出字符长度71DECIMALS小数点后的位数设置小数的位数72COLTEXT ALV 控制: 列标题列标题73SCRTEXT_L长字段标签74SCRTEXT_M中字段标签75SCRTEXT_S短字段标签76COLDDICTXT ALV 控制: 确定 DDIC 文本参考77SELDDICTXT ALV 控制: 确定 DDIC 文本参考78TIPDDICTXT ALV 控制: 确定 DDIC 文本参考79EDIT ALV 控制: 准备输入输出状态.'X'可输入80TECH_COL ALV 控制: 内部使用81TECH_FORM ALV 控制: 内部使用82TECH_COMP ALV 控制: 内部使用83HIER_CPOS ALV 控制: 层次列位置84H_COL_KEY树控制: 列名称/项目名称85H_SELECT标识是否可以选择树控制中的列86DD_ROLL数据元素(语义域)87DRAGDROPID ALV 控制: 拖&放处理拖放对象88MAC字符字段长度189INDX_FIELD自然数90INDX_CFIEL自然数91INDX_QFIEL自然数92INDX_IFIEL自然数93INDX_ROUND自然数94INDX_DECML自然数95GET_STYLE字符字段长度196MARK字符字段长度12.布局控制[layout]布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色. 参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.详细的结构说明字段名描述 Value range CWIDTH_OPT最优化宽度SPACE, 'X'SMALLTITLE 小标题,如果设置了这个字段,则标题与列标题大小一样SPACE, 'X'GRID_TITLE标题,在网格和工具条之间最长70个字符NO_HEADERS如果被设置,列标题隐藏SPACE, 'X' NO_HGRIDLN隐藏水平线SPACE, 'X' NO_MERGING禁用单元格合并SPACE, 'X'NO_ROWMARK 如果被设置,选择列在选择模式为D和A的时候隐藏SPACE, 'X'NO_TOOLBAR隐藏工具条SPACE, 'X'NO_VGRIDLN隐藏垂直线SPACE, 'X'SEL_MODE选择模式SPACE, 'A', 'B', 'C', 'D' EXCP_CONDS合计例外SPACE, 'X'EXCP_FNAME字段名称带有例外编码最长30个字符EXCP_LED例外作为 LED SPACE, 'X'EXCP_ROLLN例外文档的数据元素SPACE, 'X'CTAB_FNAME带有复杂单元格颜色编码的字段名称最长30个字符INFO_FNAME带有简单行彩色代码的字段名称最长30个字符ZEBRA可选行颜色,如果设置了,出现了间隔色带SPACE, 'X'NO_TOTLINE没有总计SPACE, 'X'NUMC_TOTAL可以对NUMC字段进行合计SPACE, 'X'TOTALS_BEF总计输出在第一行,小计在新的值之前SPACE, 'X' STYLEFNAME设置单元格,比如PUSHBUTTON最长30个字符3.打印和排序,过滤控制打印的参数控制请参考结构[LVC_S_PRNT]排序的参数控制请参考结构[LVC_S_SORT]过滤的参数控制请参考结构[LVC_S_FILT]这里不再一一解释,进入中文版本,里面应该也有解释的,虽然一些不是很清楚.五.编写简单的ALV程序.首先这里就不详细介绍DIALOG的用法了.OO的ALV GRID必须存在于一个容器当中,就是FUNCTION的ALV,其实也是一样的,底层也是使用CL_GUI_ALV_GRID这个类的.首先ALV的显示需要有几个先决条件.1,字段目录,这个是必须的,如果没有这个参数,参考一个数据字典也是可以的,就是参数I_STRUCTURE_NAME.2.存放数据的内表,最好内表的结构和字段目录是一致的,否则可能会出现一些无法预知的错误,当然你说我非要不一样,那也不一定会出现错误.我建议是最好一样的.这2个是必须的,布局的话,应该是可以不设置的,使用默认的就可以了.第一步:创建个SCREEN,在屏幕上创建个容器,CONTAINER.定义变量.DATA:WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .*--- 存放字段目录的内表DATA gt_fieldcat TYPE lvc_t_fcat .*--- 布局结构DATA gs_layout TYPE lvc_s_layo .*----声明需要显示的内表(以SFLIGHT为例)DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA END OF gt_list .第二步: 创建ALV这个对象,它的父组件是那个容器.在PBO中写入如下代码:PROCESS BEFORE OUTPUT .MODULE display_alv .创建DISPLAY_ALV的MODULE后,写下如下代码:MODULE display_alv OUTPUT .PERFORM display_alv .ENDMODULE .在FORM DISPLAY_ALV中,判断ALV实例是否存在,如果不存在,则创建:IF WCL_ALV IS INITIAL .CREATE OBJECT: WCL_CONTAINEREXPORTINGCONTAINER_NAME = 'ALV_CON'.CREATE OBJECT WCL_ALVEXPORTINGI_PARENT = WCL_CONTAINER.*-----准备获取字段目录PERFORM prepare_field_catalog CHANGING gt_fieldcat .*-----设置布局PERFORM prepare_layout CHANGING gs_layout .*-----显示ALVCALL METHOD gr_alvgrid->set_table_for_first_display EXPORTING* I_BUFFER_ACTIVE =* I_CONSISTENCY_CHECK =* I_STRUCTURE_NAME =* IS_VARIANT =* I_SAVE =* I_DEFAULT = 'X'is_layout = gs_layout* IS_PRINT =* IT_SPECIAL_GROUPS =* IT_TOOLBAR_EXCLUDING =* IT_HYPERLINK =CHANGINGit_outtab = gt_list[]it_fieldcatalog = gt_fieldcat* IT_SORT =* IT_FILTER =EXCEPTIONSinvalid_parameter_combination = 1program_error = 2too_many_lines = 3OTHERS = 4 .ELSE .*----刷新ALVCALL METHOD gr_alvgrid->refresh_table_display* EXPORTING* IS_STABLE =* I_SOFT_REFRESH =EXCEPTIONSfinished = 1OTHERS = 2 .IF sy-subrc <> 0.*--异常处理ENDIF.ENDIF .方法"set_table_for_first_display"的参数说明参数含义I_BUFFER_ACTIVE 如果方法调用是静态的,可以设置这个标记,这表示,如果每次显示ALV都相同的字段目录.既然这样,那么字段目录会被放到一个特殊的缓存里,这样加速了ALV的显示I_STRUCTURE_NAME 输出数据参考的数据字典的结构名,例如'SFLIGHT'.如果指定了这个参数目录会自动生成,下面的参数IT_FIELDCATALOG不需要传值.IS_VARIANT决定布局显示的变式I_SAVE 决定用户是否可以保存变式: 'X' 只能保存全局变式'U' 只能保存特定变式'A' 都可以保存SPACE 不可以保存变式I_DEFAULT 决定用户是否可以定义默认的布局:'X' 可以定义默认布局,这个参数是默认的SPACE 不可以定义默认布局IS_LAYOUT布局参数,传递布局控制的一些信息IS_PRINT后台打印属性的参数IT_SPECIAL_GROUPS 如果在字段目录中,一些字段通过SP_GROUP被分组在一起.我们就必须组传递一个组的文本内表进去IT_TOOLBAR_EXCLUDING需要隐藏的标准的按钮的内表IT_HYPERLINK 为每个句柄分配了超连接的内表,LVC_S_HYPE中的HREF存放了超连接的HANDLE指定了句柄,使用这些句柄,你可以在GRID中使用超连接IT_ALV_GRAPHICS比较复杂,没有用过,意思好象是可以在图表中显示ALV. IT_OUTTAB输出数据存放的内表,数据都是存放在这个内表里IT_FIELDCATALOG字段目录IT_SORT排序的标准IT_FILTER过滤的标准方法"REFRESH_TABLE_DISPLAY"的参数说明参数含义IS_STABLE 刷新的稳定性,有2个参数,一个是行,一个是列.如果设置了相应的值那么对应的行,或者列,在刷新的时候,将会保持稳定,就是滚动条保持I_SOFT_REFRESH 这个参数只是在异常情况下被使用,如果设置了这个参数,任何创建的合任何排序次序,任何为了显示数据而设置的过滤都将保持不变.这个是非有意义的.例如:当然你没有修改数据内表里的数据而想刷新ALV,仅仅只改变一下布局和字段目录.第三步,获取要显示数据的字段目录.有两种方式.1.手动创建FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .DATA ls_fcat type lvc_s_fcat .ls_fcat-fieldname = 'CARRID' .ls_fcat-inttype = 'C' .ls_fcat-outputlen = '3' .ls_fcat-coltext = 'Carrier ID' .ls_fcat-seltext = 'Carrier ID' .APPEND ls_fcat to pt_fieldcat .CLEAR ls_fcat .ls_fcat-fieldname = 'CONNID' .ls_fcat-ref_table = 'SFLIGHT' .ls_fcat-ref_table = 'CONNID' .ls_fcat-outputlen = '3' .ls_fcat-coltext = 'Connection ID' .ls_fcat-seltext = 'Connection ID' .APPEND ls_fcat to pt_fieldcat .ENDFORM .2.半自动的创建FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat . DATA ls_fcat type lvc_s_fcat .CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'EXPORTINGi_structure_name = 'SFLIGHT'CHANGINGct_fieldcat = pt_fieldcat[]EXCEPTIONSinconsistent_interface = 1program_error = 2OTHERS = 3.IF sy-subrc <> 0.*--Exception handlingENDIF.LOOP AT pt_fieldcat INTO ls_fcat .CASE pt_fieldcat-fieldname .WHEN 'CARRID' .ls_fcat-outpulen = '10' .ls_fcat-coltext = 'Airline Carrier ID' .MODIFY pt_fieldcat FROM ls_fcat .WHEN 'PAYMENTSUM' .ls_fcat-no_out = 'X' .MODIFY pt_fieldcat FROM ls_fcat .ENDCASE .ENDLOOP .ENDFORM .第四步,设置布局FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.ps_layout-zebra = 'X' .ps_layout-grid_title = 'Flights' .ps_layout-smalltitle = 'X' .ENDFORM. " prepare_layout第五步,排除不需要的标准按钮(可选,这个是第一种方法,还有另外一种,在添加自定义的按钮的时候介绍)在你的ALV上,如果你想排除一些你不想要的标准按钮,你可以把需要排除的按钮填入到表UI_FUNCTIONS中,然后传给set_table_for_first_display方法的参数"IT_TOOLBAR_EXCLUDING".这些按钮的功能码一般都可以通过查看类cl_gui_alv_grid的常量属性中获取到,或者自己加个断点,在after_user_command事件中.如果你要隐藏全部的工具条,你可以把layout中的no_toolbar设置为"X".FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .DATA ls_exclude TYPE ui_func.ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_minimum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_subtot .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_sum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_average .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_mb_sum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_mb_subtot .ENDFORM .按照上面的步骤,一个ALV的DEMO基本可以创建了.下面我们将讲述一些功能.功能一:在第一次显示以后,修改字段目录和布局.在运行的时候,很有可能需要在显示之后,需要设置一个新的布局或者字段目录.有下面这些方法去实现.字段目录 : get_frontend_fieldcatalogset_frontend_fieldcatalog布局:get_frontend_layoutset_frontend_layout使用这些方法,你在执行的任何时候,可以获取这些内容,然后修改他们.DATA ls_fcat TYPE lvc_s_fcat .DATA lt_fcat TYPE lvc_t_fcat .DATA ls_layout TYPE lvc_s_layo .CALL METHOD gr_alvgrid->get_frontend_fieldcatalogIMPORTINGet_fieldcatalog = lt_fcat[] .LOOP AT lt_fcat INTO ls_fcat .IF ls_fcat-fieldname = 'PAYMENTSUM' .ls_fcat-no_out = space .MODIFY lt_fcat FROM ls_fcat .ENDIF .ENDLOOP .CALL METHOD gr_alvgrid->set_frontend_fieldcatalogEXPORTINGit_fieldcatalog = lt_fcat[] .CALL METHOD gr_alvgrid->get_frontend_layoutIMPORTINGes_layout = ls_layout .ls_layout-grid_title = 'Flights (with Payment Sums)' .CALL METHOD gr_alvgrid->set_frontend_layoutEXPORTINGis_layout = ls_layout .功能二:设置排序条件有时候我们需要使用到数据的排序.这个可以通过填充参考结构LVC_T_SORT创建的内表来实现,这个内表中包含了排序的标准.可以传递给set_table_for_first_display这个方法的IT_SORT参数来初始化一个排序.FORM prepare_sort_table CHANGING pt_sort TYPE lvc_t_sort .DATA ls_sort TYPE lvc_s_sort .ls_sort-spos = '1' .ls_sort-fieldname = 'CARRID' .ls_sort-up = 'X' . "A to Zls_sort-down = space .APPEND ls_sort TO pt_sort .ls_sort-spos = '2' .ls_sort-fieldname = 'SEATSOCC' .ls_sort-up = space .ls_sort-down = 'X' . "Z to AAPPEND ls_sort TO pt_sort .ENDFORM. " prepare_sort_table这有2点特别的说明:1.如果这边排序的字段名,不存在于字段目录中,那将出现DUMP.2.排序以后,垂直的网格中,如果出现相同的内容,就会合并,如果要避免,请在布局中设置"no_merging"为"X" .你可以通过使用方法“get_sort_criteria” 和“set_sort_criteria”来获取和设置排序的标准.功能三:设置过滤(和排序类似)ALV的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件.我们需要把过滤条件填充到参考表类型"LVC_T_FILT"创建的内表中.过滤条件是类似一个RANGES结构的.然后把这个内表传递给方法"SET_TABLE_FOR_FIRST_DISPLAY"中的参数"IT_FILTER"FORM prepare_filter_table CHANGING pt_filt TYPE lvc_t_filt .DATA ls_filt TYPE lvc_s_filt .ls_filt-fieldname = 'FLDATE' .ls_filt-sign = 'E' .ls_filt-option = 'BT' .ls_filt-low = '20030101' .ls_filt-high = '20031231' .APPEND ls_filt TO pt_filt .ENDFORM. " preparefiltertable我们可以使用"get_filter_criteria" 和"set_filter_criteria"来获取过滤条件和设置过滤条件.功能四:选择方式有时候,我们需要选择一些单元格,行或者列,在布局中,有个参数"SEL_MODE"可以设置我们不同的选择方式.下面是参数的介绍.和不同的地方.值模式可能的选择注释SPACE等同于B参考B默认设置'A'行和列的选择,无法选择单元格多行,多列用户可以使用'B'单选,不可以多选行,不可以多选单元格多行,多列'C'多选,可以多选行,不可以多选单元格多行,多列'D'单元格的选择,可以多选单元格多行,多列,任何单元格多选用户可以使用注意:1.如果你设置了ALV是可编辑的,可能会覆盖你在布局中选择方式的设置的.2.设置了选择方式以后,我们可以使用很多方法来获取用户的选择.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"3.在执行PAI以后,用户所选择的单元格,行或者列可能丢失.你可以在PBO中,使用对应的SET方法来恢复这些选择.功能五:颜色设置有的时候,我们需要在ALV网格上绘上一些颜色.可以给特定的行,某个特定的列,某个特定的单元格绘制颜色.如果某列被设置为关键列,这列的颜色将被自动绘制,而不需要我们额外的指定.先介绍ALV里色码.就是颜色编码,4位CHAR型.Cx y z---Color | | || 1/0: 相反开/关1/0: 强化开/关其中C是固定的第一位,第二位代表是颜色编码(1到7),第三位是加强的设置,第四位是相反,个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化.颜色编码:x颜色主要使用在1Gray-blue headers2Light gray List bodies3yellow totals4Blue-green Key columns5green Positive threshold value6red Negative threshold value7orange Control levelsA)设置列的颜色.我们可以通过字段目录的"emphasize"控制字段来控制某列的颜色.这个字段同样是4位的CHAR型,传入上述的颜色编码.例如:LS_FCAT-EMPHASIZE = 'C701'.如果这列被设置为关键列,就是 LS_FCAT-KEY = 'X' ,那么颜色设置就不会起作用.请注意,自动产生的字段目录中,KEY的设置是自动获取的.B)设置行的颜色为某行设置颜色,是有点复杂的,我们需要在要显示的数据内表中增加一个字段,这个字段不需要在字段目录中存在.同样,这个字段也是4位的CHAR型,符合颜色编码的定义.那我们就需要这样来定义我们的数据内表:DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA rowcolor(4) TYPE c .DATA END OF gt_list .很明显,填入颜色编码以后,ALV怎么知道它是我们用来设置颜色的呢,在布局中,有个控制字段"INFO_FNAME",我们可以设置这个字段来告诉ALV,我们的颜色字段是哪个.ps_layout-info_fname = 'ROWCOLOR'.请注意,这个字段随便你起名字,但是记住,一定是数据内表里的字段,而且这边设置的时候一定要大写.你可以在任何时候设置行的颜色,只需要去修改内表里的这个字段的值,但是记得,一定要刷新以后才起作用.C)设置单元格的颜色设置单元格和设置行的颜色,本质上没有什么大的区别,但是定位单元格需要2个参数.我们需要在数据内表中插入一个表类型的字段,这样我们的数据内表就变成了DEEP结构了,不过ALV是可以处理的.不需要担心.插入的这个表类型的类型为"LVC_T_SCOL".里面有3个参数:FNAME告诉我们你需要设置的是哪个字段,如果为空,然后直接在COLOR中设置颜色,就是整行设置为这个颜色.如果具体到某个单元格,必须指定是哪个字段.COLOR字段是用来设置颜色的.NOKEYCOL字段比较关键了.设置为关键列的一些字段,我们的颜色设置可能被覆盖.通过这个字段的设置,可以避免被关键列覆盖.同样,ALV在布局中有个字段"CTAB_FNAME"告诉我们,数据内表中,哪个字段是用来设置单元格的颜色的.DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA rowcolor(4) TYPE c .DATA cellcolors TYPE lvc_t_scol .DATA END OF gt_list .DATA ls_cellcolor TYPE lvc_s_scol ....READ TABLE gt_list INDEX 5 .ls_cellcolor-fname = 'SEATSOCC' .ls_cellcolor-color-col = '7' .ls_cellcolor-color-int = '1' .APPEND ls_cellcolor TO gt_list-cellcolors .MODIFY gt_list INDEX 5 .注意:颜色设置中有优先级顺序,他们是单元格--->行--->列.功能六:插入超链接插入超链接是通过一个含有超级链接和句柄的表来实现的.这个表类型为"LVC_T_HYPE" ,句柄是一个INT4类型的字段,我们需要在数据显示的内表中,加入这样的字段,来告诉ALV,我们的字段指定的句柄,从而找到对应的超级链接.在字段目录中,WEB_FIELD是用来指定对应的句柄名的.下面举个例子来说明,我们要为字段CARRID,CONNID建立超级链接:首先,内表定义中,我们加入2个句柄字段:DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA rowcolor(4) TYPE c .DATA cellcolors TYPE lvc_t_scol .DATA carrid_handle TYPE int4 .DATA connid_handle TYPE int4 .DATA END OF gt_list .第二: 建立一个超级链接内表,里面存放句柄所对应的超级链接.创建的时候注意,它参考的表类型,一定是"LVC_T_HYPE".FORM prepare_hyperlinks_table CHANGING pt_hype TYPE lvc_t_hype . DATA ls_hype TYPE lvc_s_hype .ls_hype-handle = '1' .ls_hype-href = '/carrids/car1' .APPEND ls_hype TO pt_hype .ls_hype-handle = '2' .ls_hype-href = '/carrids/car1' .APPEND ls_hype TO pt_hype .ls_hype-handle = '3' .ls_hype-href = '/carrids/car1' .APPEND ls_hype TO pt_hype .ls_hype-handle = '4' .ls_hype-href = '/connids/con11' .APPEND ls_hype TO pt_hype .ls_hype-handle = '5' .ls_hype-href = '/connids/con12'APPEND ls_hype TO pt_hype ... ..ENDFORM .第三.通过字段目录FIELDCATLOG来指定相应的句柄字段.对于CARRID的field catalogLs_fieldcat-web_field = ‘CARRID_HANDLE’.对于CONNID的field catalogLs_fieldcat-web_field = ‘CONNID_HANDLE’.在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄内表传给参数it_hyperlink。
结构体变量和结构体类型的定义

结构体变量和结构体类型的定义1.结构体类型定义定义方式1:Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域} *LinkList;定义方式2:struct LNode { int data; // 数据域 struct LNode *next; // 指针域};Typedef struct LNode *LinkList;以上两个定义方式是等价的,是将*LinkList 定义为struct LNode 类型,即LinkList 被定义为一个类型名。
这样就可以用LinkList 来定义说明新的变量了,如:LinkList L;即将 L 定义为 struct LNode 类型的指针变量。
2.结构体类型变量定义定义方式1:struct LNode { int data; // 数据域 struct LNode *next; // 指针域}LnodeA;定义方式2:struct LNode { int data; // 数据域 struct LNode *next; // 指针域};struct LNode LnodeA;以上两个定义方式也是等价的,这样就将LnodeA 定义为一个struct LNode 类型的变量,即 LnodeA 为一个 struct LNode 类型的变量名。
结构体内标的定义方式1.结构体,透明表区,DATA ELEMENT,DOMAIN透明表是对一个物理表的逻辑描述,透明表里有许多字段,并且定义某些字段为 PRIMARY KEY,字段里又包含 DATA ELEMENT,用来描述语言属性和技术属性。
DATA ELEMENT 中又包含DOMAIN,它是定义数据类型和字段长度。
结构体一般是用来定义一个结构变量,有临时数据的储存,没有PRIMARY KEY,结构体里包含 COMPONENT 而不是 FIELD2.Internal table 中的属性分为三种LINE TYPE ,KEY,TABLE KIND。
SAP变量用法

SAP系统变量用法----ABAP程序系统字段中英文详解SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功SY-DBLNT: 被处理过的记录的笔数SY-UNAME: 当前使用者登入SAP的USERNAME;SY-DATUM: 当前系统日期;SY-UZEIT: 当前系统时间;SY-TCODE: 当前执行程序的Transaction codeSY-INDEX : 当前LOOP循环过的次数SY-TABIX: 当前处理的是internal table 的第几笔SY-TMAXL: Internal table的总笔数SY-SROWS: 屏幕总行数;SY-SCOLS: 屏幕总列数;SY-MANDT: 當前系統編號(CLIENT NUMBER)SY-VLINE: 画竖线SY-ULINE: 画横线SY-PAGNO: 当前页号SY-LINSZ: 当前报表宽度SY-LINCT: 当前报表长度SPACE: 空字符串SY-LSIND: 列表索引页SY-LISTI: 上一个列表的索引SY-LILLI: 绝对列表中选定行的行号SY-CUROW: 屏幕上的行SY-CUCOL: 光标列SY-CPAGE: 列表的当前显示页SY-STARO:真实行号SY-LISEL: 选择行的内容,长度为255SY-LINNO: 当前行系统内部有一个专门存放系统变量的结构SYST,其中最常用的系统变量有:SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功SY-UNAME: 当前使用者登入SAP的USERNAME;SY-DATUM: 当前系统日期;SY-UZEIT: 当前系统时间;SY-TCODE: 当前执行程序的Transaction codeSY-REPID: ABAP 程式名,目前的主程式SY-CPROG: ABAP 程式名SY-SYSID: R/3 系統,R/3 系統名稱SY-UCOMM: 畫面,PAI 驅動的功能代碼,一般用來參照定義變量SY-INDEX : 当前LOOP循环过的次数READ TABLE it_po INDEX 1 此時變量值1 SY-TABIX: 当前处理的是internal table 的第几笔下面說下sy-index 和sy-tabix的區別sy-index和sy-tabix都是系统字段,用来记录循环的次数。
ABAP新语法记录(一)
ABAP新语法记录(⼀)原⽂链接:主要内容内联声明构造表达式内表操作Open SQL其他本⽂列出了ABAP新语法的⼀些使⽤⽅式,供⼤家学习参考。
内联声明代码实现:*&----------------------------------------------------------------------* 主题⼀:内联声明* 语法:DATA(...) ,FILED-SYMBOL(…)* 1. 定义变量* 2. 定义结构* 3. 定义内表* 4. 定义指针*&---------------------------------------------------------------------** 记录时间:23.03.2019 记录⼈: YALUOO*&---------------------------------------------------------------------**&*********取数"客户的标签信息表SELECT *FROM ztcust_tagINTO TABLE @DATA(gt_data)UP TO 5 ROWS.cl_demo_output=>write( gt_data ).*&*********定义变量DATA(lv_card_no) = '1000023312'. "会员号cl_demo_output=>write( lv_card_no ).*&*********定义结构READ TABLE gt_data INTO DATA(gs_data) INDEX 1.IF sy-subrc EQ 0.DATA(ls_data) = gs_data.cl_demo_output=>write( ls_data ).ENDIF.*&*********定义内表DATA(lt_data) = gt_data.cl_demo_output=>write( lt_data ).*&*********定义指针LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE card_no EQ lv_card_no.<fs_data>-create_user = 'YALUOO'. "修改创建⼈ENDLOOP.cl_demo_output=>write( lt_data ).cl_demo_output=>display( ).运⾏结果:构造表达式代码实现:*&----------------------------------------------------------------------* 主题⼆:构造表达式* 1. 实现构造: NWE -创建数据对象或类的实现* 1.1 构造单值* 1.2 构造结构* 1.3 构造内表* 1.4 构造类* 2. 值构造: VALUE - 创建⼀个类型为dypee的数据* 2.1 构造结构* 语法: ... VALUE dtype | #( [BASE dobj] comp1 = dobj1 comp2 = dobj2 ... ) ...* 2.2 构造内表:* 语法: ... VALUE dtype | #( [BASE itab] ( (line1-com1 = dobj1) ( line2 ..) ... ) ...* note: dytpe可接具体类型或者# ,接#数据类型必须确定* 可以嵌套使⽤;* 内表赋值不能带表头;* 3. 组件构造: CORRESPONDING* 语法:... CORRESPONDING dtype | #( [BASE dobj] comp1 = dobj1 comp2 = dobj2 ... ) ... *&---------------------------------------------------------------------** 记录时间:23.03.2019 记录⼈: YALUOO*&---------------------------------------------------------------------*" ⾃定义类型TYPES: BEGIN OF ty_man,name TYPE char10, " 姓名sex TYPE char1, " 性别age TYPE p DECIMALS 2," 年龄school TYPE char20, " 学校END OF ty_man.DATA: gt_man TYPE TABLE OF ty_man.*&*********结构赋值DATA(gs_man) = VALUE ty_man( name = 'Tom' sex = 'B' ).cl_demo_output=>write( gs_man )."附加年龄信息gs_man = VALUE #( name = 'Tom' sex = 'B' age = 18 ).*DATA(gs_man_02) = VALUE #( name = 'Tom' sex = 'B' age = 18 ) . "错误,未明确类型cl_demo_output=>write( gs_man )."附加学校信息gs_man = VALUE ty_man( BASE gs_man school = 'A SCHOOL' ).cl_demo_output=>write( gs_man )."调整学校信息gs_man = VALUE #( BASE gs_man school = 'B SCHOOL' ).cl_demo_output=>write( gs_man ).*&*********内表赋值gt_man = VALUE #( ( name = 'Anna' sex = 'G' age = 17 ) ( name = 'Ann' sex = 'G' age = 16 ) ).cl_demo_output=>write( gt_man )."内表基础上附加额外数据gt_man = VALUE #( BASE gt_man ( name = 'Xiaohong' sex = 'G' age = 20 school = 'C SCHOOL' ) ( name = 'Xiaoming' sex = 'B' age = 21 school = 'D SCHOOL' ) ).cl_demo_output=>write( gt_man ).cl_demo_output=>display( ).&*********Range 表赋值DATA: r_data TYPE RANGE OF ztcust_tag-data_type. "内表不带表头RANGES: r_data_01 FOR ztcust_tag-data_type. "内表带表头-不⽀持"逐步往下填充内表数据r_data = VALUE #( sign = 'I' option = 'BT' ( low = 10 high = 20 )( low = 100 high = 150 )option = 'GT' ( low = 180 )option = 'LT' ( low = 200 )option = 'EQ' ( low = 8 )sign = 'E' option = 'BT' ( low = 15 high = 18 )).cl_demo_output=>write( r_data ).cl_demo_output=>display( ).运⾏结果:代码实现:TYPES: BEGIN OF ty_data.INCLUDE TYPE ztcust_tag.TYPES: flag TYPE char1,END OF ty_data.TYPES: BEGIN OF ty_data_t.INCLUDE TYPE ztcust_tag.TYPES: flag_t TYPE char1,END OF ty_data_t.DATA: gs_data_02 TYPE ty_data,gs_data_03 TYPE ty_data_t.*&*********取数SELECT SINGLE *FROM ztcust_tagINTO @DATA(gs_data).*&*********对应字段赋值gs_data_02 = CORRESPONDING #( gs_data ).cl_demo_output=>write( gs_data_02 ).gs_data_03-flag_t = abap_true.gs_data_03 = CORRESPONDING #( BASE ( gs_data_03 ) gs_data_02 )."不指定BASE 初始值会丢失 cl_demo_output=>write( gs_data_03 ).gs_data_03 = CORRESPONDING #( gs_data_02 )."初始值丢失cl_demo_output=>write( gs_data_03 ).cl_demo_output=>display( ).运⾏结果:内表操作代码实现:*&----------------------------------------------------------------------* 主题三:内表操作* 1. 内表表达式- 相当于READ TABLE* 语法:… itab[ … ] …* note: 如果未找到对应的记录就会抛出CX_SY_ITAB_LINE_NOT_FOUND异常,SY-SUBRC不会记录* 可以通过line_exists预定义函数改进* 2. 內表预定义函数* 2.1 line_exists( ) - 判断记录是否存在* 2.2 line_index( ) - 获取符合记录的索引值* 3. 內表推导 - FOR 理解为LOOP,是对实现操作符 NEW 和值操作符VALUE的⼀种增强,作⽤是构造內表内容* 语法1 : …FOR i = ... [THEN expr] UNTIL | WHILE log_exp ...* 语法2 : …FOR wa|<fs> IN itab [INDEX INTO idx][cond][let_exp]...* 4. 內表筛选-FILTER -筛选内表中的数据* 语法: FILTER type( itab [EXCEPT] [IN ftab] [USING KEY keyname ]* WHERE c1 op f1 [AND c2 op f2 [...] ] ) ...* note: WHERE对应过滤的条件,是必须要指定的,注意有些操作符是不能在WHERE中使⽤的,如:OR , NOT 等* EXCEPT如果不指定则表⽰满⾜条件的找出来,如果指定则表⽰不满⾜条件的找出来* 5. 內表缩减* 语法: ... REDUCE type(* [let_exp]* INIT {x1 = rhs1}|{<x1> = wrexpr1}|{x1|<x1> TYPE dtype1}* {x2 = rhs2}|{<x2> = wrexpr2}|{x2|<x2> TYPE dtype2}* ...* FOR for_exp1* FOR for_exp2* ...* NEXT ...* {x1 = rhs1}|{<x1> = wrexpr1}* {x2 = rhs2}|{<x2> = wrexpr2}* ... ) ...* 6. 内表分组*&---------------------------------------------------------------------** 记录时间:23.03.2019 记录⼈: YALUOO*&---------------------------------------------------------------------**&*********取数SELECT *FROM ztcust_tagINTO TABLE @DATA(gt_data)UP TO 5 ROWS.*&*********定义变量DATA(lv_card_no) = '1000023312'. "会员号cl_demo_output=>write( gt_data )."通过索引值判断某⼀⾏记录是否存在,也可通过条件判断IF line_exists( gt_data[ 4 ] )."获取第4⾏记录DATA(ls_data) = gt_data[ 4 ]."获取第4⾏记录中的标签类型DATA(lv_classify) = gt_data[ 4 ]-classify."标签类型cl_demo_output=>write( ls_data ).cl_demo_output=>write( lv_classify ).ENDIF."获取符合条件的索引值,未找到LV_INDEX为0DATA(lv_index) = line_index( gt_data[ card_no = lv_card_no classify = lv_classify ] ).IF lv_index NE 0 AND line_exists( gt_data[ lv_index + 1 ] ) .CLEAR ls_data."获取下⼀⾏记录ls_data = gt_data[ lv_index + 1 ].cl_demo_output=>write( ls_data ).ENDIF.cl_demo_output=>display( ).运⾏结果:代码实现:TYPES: BEGIN OF ty_line,col1 TYPE i,col2 TYPE i,col3 TYPE i,END OF ty_line, "结构体ty_tab TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.*&*********通过语法1给新內表赋值 - 类似于JAVA中的FOR循环"for每次遍历⼀次都将结果,通过value赋值给内表gt_itabDATA(gt_itab) = VALUE ty_tab( FOR j = 11 THEN j + 10 UNTIL j > 40 "初始值,递增量,结束条件" 结构中的字段赋值-参考类型ty_tab( col1 = j col2 = j + 1 col3 = j + 2 )"11 12 13 - value 到 gt_itab"21 22 23 - value 到 gt_itab"31 32 33 - value 到 gt_itab"41 - 结束循环).cl_demo_output=>display( gt_itab ).运⾏结果:代码实现:*&*********同过语法2给新內表赋值*&*********取数"客户标签信息SELECT *FROM ztcust_tagINTO TABLE @DATA(gt_data)UP TO 5 ROWS.IF gt_data IS NOT INITIAL."标签⽇期⽇志表SELECT *FROM ztcust_tag_logINTO TABLE @DATA(gt_data_t)FOR ALL ENTRIES IN @gt_dataWHERE tag_id = @gt_data-tag_id.SORT gt_data_t BY tag_id.DELETE ADJACENT DUPLICATES FROM gt_data_t COMPARING tag_id.ENDIF.cl_demo_output=>write( gt_data ).cl_demo_output=>write( gt_data_t ).TYPES: BEGIN OF ty_tag_line,"标签表tag_id TYPE ztcust_tag-tag_id, "标签IDcard_no TYPE ztcust_tag-card_no, "会员号tag_name TYPE ztcust_tag-tag_name, "标签值"⽇志表sernumber TYPE ztcust_tag_log-sernumber, "流⽔号uname TYPE ztcust_tag_log-uname, "⽤户名log_date TYPE ztcust_tag_log-log_date, "备份⽇期log_time TYPE ztcust_tag_log-log_time, "备份时间message_type TYPE ztcust_tag_log-message_type,"消息类型message TYPE ztcust_tag_log-message, "消息⽂本END OF ty_tag_line,ty_tag_tab TYPE STANDARD TABLE OF ty_tag_line WITH EMPTY KEY.*&*********将标签表和⽇志表的数据整合在⼀起,构建新的内表DATA(gt_itab) = VALUE ty_tag_tab( FOR ls_itab IN gt_data WHERE ( classify = 'brands' )"遍历标签类型为brands; ls_itab 为隐形声明或者<fs> (tag_id = ls_itab-tag_idcard_no = ls_itab-card_notag_name = ls_itab-tag_namesernumber = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-sernumber ) "通过VALUE语句和内表表达式赋值uname = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-uname )log_date = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-log_date )log_time = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-log_time )message_type = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-message_type )message = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-message ))).cl_demo_output=>write( gt_itab ).*&*********使⽤操作符FILTER过滤DATA: gt_filter TYPE HASHED TABLE OF ty_tag_lineWITH UNIQUE KEY uname.***INitialize filter Tablegt_filter = VALUE #( ( uname = 'XUWENPAN' ) )."找出满⾜条件的数据DATA(gt_out) = FILTER #( gt_itab IN gt_filter WHERE uname = uname ) .cl_demo_output=>write( gt_out )."找出不满⾜条件的数据DATA(gt_out_t) = FILTER #( gt_itab EXCEPT IN gt_filter WHERE uname = uname ) .cl_demo_output=>write( gt_out_t ).cl_demo_output=>display( ).运⾏结果:代码实现:*&*********取数TYPES: BEGIN OF ty_man,name TYPE char10, " 姓名sex TYPE char1, " 性别age TYPE p DECIMALS 2," 年龄school TYPE char20, " 学校END OF ty_man.DATA: gt_man TYPE TABLE OF ty_man.gt_man = VALUE #( ( name = 'Anna' sex = 'G' age = 17 )( name = 'Ann' sex = 'G' age = 16 ) ).cl_demo_output=>write( gt_man )."内表基础上附加额外数据gt_man = VALUE #( BASE gt_man ( name = 'Xiaohong' sex = 'G' age = 20 school = 'C SCHOOL' )( name = 'Xiaoming' sex = 'B' age = 21 school = 'D SCHOOL' ) ).cl_demo_output=>write( gt_man )."内表⾏数DATA(lv_lines) = lines( gt_man )."内表中符合条件的数据有⼏条DATA(lv_lines_g) = REDUCE i( INIT x = 0FOR ls_man IN gt_man WHERE ( sex = 'G' )NEXT x = x + 1 ).cl_demo_output=>write( lv_lines ).cl_demo_output=>write( lv_lines_g )."累计内表中符合条件的年龄之和TYPES: ty_age TYPE p DECIMALS 2.DATA(lv_sum_age) = REDUCE ty_age( INIT dage = VALUE ty_age( )FOR wa IN gt_man WHERE ( sex = 'G' )NEXT dage = dage + wa-age ).cl_demo_output=>write( lv_sum_age )."综合例⼦TYPES:BEGIN OF ty_result,sum TYPE p DECIMALS 2, "总和max TYPE p DECIMALS 2, "最⼤值avg TYPE p DECIMALS 2, "平均cunt TYPE i, "记录数END OF ty_result.DATA(ls_result) = REDUCE ty_result( INIT res = VALUE ty_result( ) "可以默认值:ty_result( min = 0 max = 0 ) FOR <fs_man> IN gt_man WHERE ( sex = 'G' ) "性别为GNEXT res-sum = res-sum + <fs_man>-age "年龄总和res-max = nmax( val1 = res-max val2 = <fs_man>-age )"最⼤年龄res-cunt = res-cunt + 1 "满⾜条件的条⽬数).ls_result-avg = ls_result-sum / ls_result-cunt. "平均值cl_demo_output=>write( ls_result ).cl_demo_output=>display( ).运⾏结果:Open SQL代码实现:*&----------------------------------------------------------------------* 主题四:Open SQL**&---------------------------------------------------------------------** 记录时间:23.03.2019 记录⼈: YALUOO*&---------------------------------------------------------------------*DATA(lv_card_no) = '1000023083'.SELECT a~tag_id, "标签IDcard_no, "会员号tag_name, "会员值sernumber, "流⽔号uname, "⽤户名log_date, "备份⽇期log_time, "备份时间message_type, "消息类型message "消息⽂本FROM ztcust_tag AS aINNER JOIN ztcust_tag_log AS bON a~tag_id = b~tag_idINTO TABLE @DATA(gt_tag)WHERE a~card_no = '1000023312' OR a~card_no = @lv_card_no AND classify = 'brands' .cl_demo_output=>display( gt_tag ).运⾏结果:。
antd-table列表数据未刷新的问题
antd-table列表数据未刷新的问题
使⽤Table和Form表单的时候,有时候会遇到⼀种场景,就是修改本条数据并刷新列表:
例如:更新第⼀条数据,修改供应商的名称,点击更新按钮,后台返回正确的也是⾃⼰输⼊的数据,但是页⾯仍然显⽰之前的内容。
原因:Table组件的key值不变的时候,是不会刷新页⾯的,⽐如原来的key为0,更新之后,得到⼀个新的数组,但是给它的key重新赋值,⼜按顺序排列,他还是0,所以,这⼀⾏数据是不会刷新的,解决办法,重新赋值⼀个新的key,与原来的key不相同。
解决办法:给key值重新赋值,可以给id或者添加⼀个时间戳都可以
感觉以前理解错误,真正的写法应该是这样
直接push的时候,引⽤没有改变,只是改变了引⽤指向的内存数据,React认为虚拟DOM并没有改变,因此,不会重新渲染页⾯。
这就会导致Table组件的dataSource改变了,但是Table并没有重新渲染。
Excel-事件(Workbook、Worksheet、Range、OnKeyOnTime)
Excel-事件(Workbook、Worksheet、Range、OnKeyOnTime)⼀、Excel事件介绍Excel事件就是⼀个能被对象识别的操作。
当某个事件发⽣后⾃动运⾏的过程称为事件过程。
事件过程也是Sub过程。
实践过程必须写在特定对象所在的模块中,⽽且只有过程所在的模块⾥的对象才能触发这个事件。
事件过程名由Excel⾃动设置,以“对象名称_事件名称”的形式存在,不能更改。
⼆、Worksheet事件Worksheet事件是发⽣在Worksheet对象⾥的事件。
事件过程必须写在对应的Worksheet对象⾥,只有过程所在的Worksheet对象⾥的操作才能触发该事件。
1、Worksheet_Change事件:⾃动提⽰更改的内容Private Sub Worksheet_Change(ByVal Target As Range) '⼊参中Target代表被选中的单元格Application.EnableEvents = False '禁⽤事件If Target.Column = 1ThenMsgBox Target.Address & "单元格的值被修改为:" & Target.ValueEnd IfApplication.EnableEvents = True '启⽤事件End Sub2、Worksheet_SelectionChange事件:你选中了谁可以⽤此事件来记录Excel单元格修改前的旧值。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)Dim oldvalue As StringMsgBox"当前选中的单元格区域为:" & Target.Addressoldvalue = Target.ValueIf Target.Column <> 1ThenCells(Target.Row, "A").SelectEnd IfEnd Sub3、Worksheet_Activate事件:⾃动提⽰⼯作表名Private Sub Worksheet_Activate()MsgBox"当前活动⼯作表为:" & End Sub4、Worksheet_Deactivate事件:禁⽌选中其他⼯作表Private Sub Worksheet_Deactivate()MsgBox"不允许选中" & & "⼯作表外的其他⼯作表"Worksheets("Sheet1").SelectEnd Sub5、Worksheet事件列表Worksheet对象⼀共有9个事件可供使⽤。
sqlserver建表语句带中文注释
标题:SQL Server建表语句带中文注释一、引言在SQL Server数据库中,建表语句是非常重要的,它决定了数据库中表的结构和属性。
建表语句的编写需要遵循一定的规范和标准,同时也需要适当的注释来方便其他人阅读和理解。
本文将介绍如何使用SQL Server建表语句,并给出带中文注释的示例。
二、SQL Server建表语句的基本语法SQL Server建表语句的基本语法如下:```sqlCREATE TABLE 表名(列名1 数据类型1,列名2 数据类型2,...列名N 数据类型N);```在上面的语法中,CREATE TABLE是创建表的关键字,后面跟着表的名称。
括号中包含了表的列名和数据类型。
在每一行中,列名和数据类型之间使用空格分隔,不同的列之间使用逗号分隔。
三、示例:使用SQL Server建表语句创建学生表下面我们将以学生表为例,展示如何使用SQL Server建表语句,并在注释中说明每个字段的含义。
```sql-- 创建学生表CREATE TABLE 学生(学号 VARCHAR(10), -- 学号尊称 NVARCHAR(20), -- 尊称性别 NVARCHAR(2), -- 性别生日 DATE, -- 生日入学年份 INT -- 入学年份);```在上面的示例中,我们使用CREATE TABLE语句创建了一个名为“学生”的表。
表中包含了5个字段,分别是学号、尊称、性别、生日和入学年份。
每个字段后面的注释说明了该字段的含义,方便其他人阅读和理解表结构。
四、SQL Server建表语句的注意事项在使用SQL Server建表语句时,需要注意以下几点:1. 数据类型的选择:根据实际需求选择合适的数据类型,例如VARCHAR、NVARCHAR、INT、DATE等。
2. 主键和外键:如果需要设置主键和外键,需要在建表语句中加入相应的约束。
3. 索引:根据查询需求,为表中的字段添加索引以提高查询效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
With KEY & With Table KEY 的使用
在做闡述之前,我覺得有必要了解一下KEY。
ABAP的內表和我們真正的DB 表是類似的,有結構有欄位,但是在處理Key
上DB表顯得更為隨意,可以要也可以不要,而內表如果沒有顯式聲明,會將內
表中的所有非數值欄位的欄位都作為KEY,當然也可以顯式聲明KEY。
With- 這種結構用的地方主要就是在內表的處理上,包括DELETE,READ.
READ 可以用WITH KEY 或者WITH TABLE KEY,但是DELETE只能用WITH
TABLE KEY
語法結構如下:
1.
DELETE / READ itab - table_key
Syntax
... { WITH TABLE KEY {comp_name1|(name1)} = dobj1
{comp_name2|(name2)} = dobj2
... } ... .
2.
READ – table free key
Syntax
READ TABLE itab { { WITH KEY dobj }
| { WITH KEY = dobj [BINARY SEARCH] } } RESULT
那么我們真正關注的是內表的訪問效率問題。訪問表可以用WITH KEY 或
WITH KEY - BINARY SEARCH 或 WITH TABLE KEY,那么各種語法的效率如
何?
分析這個問題,我們必須了解一下表的訪問方式有那些。目前內表的訪問,
主要有Index、Binary Search(二元法)、線性、Hash算法等。
內表的訪問和內表的類型有直接的關係,具體情況如下:
Standard Table:線性訪問
Sorted Table :Binary Search
Hashed Table :Hash算法
說了那么多,此篇的重點就是要講,我們在使用Standard Table時,如果用訪問
表,使用With Key或With Table Key的效率都會比 With key --- Binary Search 差,
因為前面兩個都是采用線性方式,With Table key 很多人會理解成DB的INDEX
訪問,那么在理解內表的時候就要稍微變通一下。