ABAP学习笔记之——第八章:报表程序

news2024/9/22 23:34:42

一、程序属性

创建程序类型:

状态:

根据程序状态不能使用特定 Utility。例如,选择系统程序,则不能使用 debug 功能

权限组:

分配程序执行/修改相关的权限组。若是安全相关程序有必要设置权限组。

逻辑数据库:

只在 TYPE-1 程序中选择。

通过 LDB 实现程序。为了查询使用频率高的表的数据,将经常使用的表连接及相似的查询条件用一个包创建,可以重复利用的程序称为 LDB。

例:

REPORT zprogram_alv.
DATA : gt_itab TYPE TABLE OF sflight,
       gs_itab TYPE sflight.

SELECT-OPTIONS:s_carrid FOR gs_itab-carrid.

INITIALIZATION.  "初始化
  s_carrid-sign = 'I'.
  s_carrid-option = 'EQ'.
  s_carrid-low = 'AA'.
  APPEND s_carrid.

START-OF-SELECTION.
  SELECT carrid connid
    INTO CORRESPONDING FIELDS OF TABLE gt_itab
    FROM sflight
    WHERE carrid IN s_carrid.

END-OF-SELECTION.

  LOOP AT gt_itab INTO gs_itab.
    WRITE: / gs_itab-carrid,gs_itab-connid.

  ENDLOOP.

二、程序结构——定义

1、数据定义部分和查询选择画面 (SELECTION-SCREEN)

2、直到运行时刻的触发事件

3、显示数据的列表事件

 

定义程序语句:

1.指定程序 LIST Heading

决定在执行程序的报表画面上是否以程序名作为基本标题。

2.Line-Size

指定输出报表的宽度。宽度设置成0 或者删除 LINE-SIZE 语句,则会使用标准宽度。

  1. Message ID

定义ABAP 程序中要使用的 MESSAGE ID

选择画面:

1、PARAMETERS

PARAMETERS 定义用户可以输入值的输入字段。PARAMETERS 变量如果不指定 TYPE 类型,则默认定义为基本 CHAR 1类型PARAMETERS 中输入的值用在查询数据的 SELECT 语的条件中使用。此参数只能接收-个值,且能追加如复选框按钮等选项。

例:

*PARAMETERS用法
DATA :l_fname(20) TYPE c.
PARAMETERS: p_1      DEFAULT 'A',
            p_2      TYPE char10,
            p_3      TYPE c LENGTH 3 DEFAULT '123',
            p_4      TYPE p DECIMALS 2 DEFAULT '123.456789',
            p_5      LIKE sflight-carrid,
            p_6      MEMORY ID sl,
            p_7      MATCHCODE OBJECT zcarrid,
            p_8      MODIF ID mid,
            p_9      NO-DISPLAY,
            p_10     DEFAULT 'a' LOWER CASE,
            p_11     OBLIGATORY,
            p_12     AS CHECKBOX,
            p_13     RADIOBUTTON GROUP radi,
            p_13_2   RADIOBUTTON GROUP radi,
            p_14(10) VISIBLE LENGTH 3 DEFAULT '1234567890',
            p_15     LIKE sflight-carrid VALUE CHECK,
            p_16     LIKE (l_fname),
            p_17     LIKE sflight-carrid AS LISTBOX VISIBLE LENGTH 3,
            p_18     AS CHECKBOX USER-COMMAND abc.

2、SELECT-OPTIONS

PARAMETERS 是只能接收一个值的 INPUT 字段,与之相反,SELECT-OPTIONS 可以通过2个INPUT字段接收多种条件值 (Selection Criteria)。拥有与 RANGE 变量相同的结构(内表)。

例:

*select-options 用法
TABLES: sflight.
DATA: gs_scarr TYPE scarr.
DATA: gv_val TYPE char20.
SELECT-OPTIONS:
s_1 FOR sflight-carrid DEFAULT 'AC',
s_2 FOR gs_scarr-carrid DEFAULT 'AA*' OPTION EQ SIGN I,
s_3 FOR gv_val DEFAULT '111' TO '9999',
s_4 FOR gv_val DEFAULT 'AAAA' TO 'ZZZZ' OPTION BT SIGN E,
s_5 FOR sflight-carrid MEMORY ID scl,
s_6 FOR gv_val MATCHCODE OBJECT zcarrid,
s_7 FOR sflight-carrid MODIF ID car,
s_8 FOR sflight-carrid NO-DISPLAY,
s_9 FOR sflight-carrid LOWER CASE,
s-10 FOR sflight-carrid OBLIGATORY,
s_11 FOR sflight-carrid NO-EXTENSION,
s_12 FOR sflight-carrid NO INTERVALS,
s_13 FOR sflight-carrid VISIBLE LENGTH 1.

3、SELECTION-SCREEN

使用PARAMETER和 SELECTION-OPTION,ABAP 程序会自动调节字段描述与长度生成画面(SELECTION SCREEN)。若想调节系统自动生成的画面,则可以利用 SELECTIONSCREEN语句。

例:

*select-screen 用法
TABLES : scarr,sscrfields.

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT 1(10) TEXT-001 FOR FIELD p_1.
  PARAMETERS:p_1 LIKE scarr-carrid.

  SELECTION-SCREEN POSITION POS_LOW.
  PARAMETERS : p_2 LIKE scarr-carrname.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN ULINE.
SELECTION-SCREEN ULINE /1(10).
SELECTION-SCREEN ULINE pos_low(10).
SELECTION-SCREEN ULINE pos_high(10).

SELECTION-SCREEN PUSHBUTTON /pos_low(10) TEXT-002 USER-COMMAND btn01.
SELECTION-SCREEN BEGIN OF BLOCK block WITH FRAME TITLE TEXT-003.
  PARAMETERS:p_3 TYPE c.
  SELECT-OPTIONS:s_1 FOR scarr-carrid.
SELECTION-SCREEN END OF BLOCK block.

SELECTION-SCREEN BEGIN OF BLOCK block2 WITH FRAME TITLE TEXT-004
  NO INTERVALS.
  PARAMETERS:p_4 TYPE c.
  SELECT-OPTIONS:s_2 FOR scarr-carrid.
SELECTION-SCREEN END OF BLOCK block2.
SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION.
  MOVE 'function key 1' TO sscrfields-functxt_01.

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = 'FCO1'.
    MESSAGE'You clicked Function Key 1' TYPE 'I'.
  ENDIF.
  IF sscrfields-ucomm = 'BTN01'.
    MESSAGE 'You clicked Fuction Key button' TYPE 'I'.
  ENDIF.

4、MESSAGE-ID

若想在ABAP 程序信息栏中显示信息,则需要在报表第一行中记述MESSAGE-ID

三、程序结构——事件

 

1、INITIALIZATION

在事件中执行程序时最先执行的是INITIALIZATION。此事件在显示SELECTION-SCREEN之前触发,因此一般用于指定变量初始值。即在INITIALIZATION 事件中指定 SELECTION-SCREEN 中使用的字段初始值,自动输入用户经常使用的值。

例:

*INITIALIZATION 初始化
TABLES : sflight.  "声明程序用到的数据库表

PARAMETER: p_carrid LIKE sflight-carrid,
p_connid LIKE sflight-connid.

SELECT-OPTIONS: s_fldate FOR sflight-fldate.

INITIALIZATION.
  SET TITLEBAR 'T1000'.
  SET PF-STATUS 'test'.

  p_carrid = 'AA'.
  p_connid = '17'.

  s_fldate-low = '20150101'.
  s_fldate-high = '20151231'.
  APPEND s_fldate.

2、AT SELECTION-SCREEN

AT SELECTION-SCREEN 是在 SELECTION-SCREEN 中Input Field 的值有变更时执行的事件。INITIALIZATION与 START-OF-SELECTION 之间被触发,且对用户事件有回应并调节画面字段。

 3、START-OF-SELECTION

若已经结束查询画面上字段的初始值设置及数据检查(Validation),就要执行从数据库读取数据的实际性操作。执行SOL语句之前最好先执行CLEAR语等准备操作后执行SELECT语句。

例:

*START-OF-SELECTION
DATA :g_total TYPE i,
      g_cnt   TYPE i,
      g_index TYPE i.

DATA: gt_sflight TYPE TABLE OF sflight
      WITH HEADER LINE.

START-OF-SELECTION.
  SELECT * INTO CORRESPONDING FIELDS OF gt_sflight FROM sflight.
  ENDSELECT.

  DESCRIBE TABLE gt_sflight LINES g_total.

  LOOP AT gt_sflight.
    g_cnt = g_cnt + 1.
    PERFORM progress_indicator USING g_cnt g_total 'progressing...'.
  ENDLOOP.
  WRITE 'success'.

FORM progress_indicator USING VALUE(p_cur)
                              VALUE(p_total)
                              VALUE(p_text).
  DATA: lv_text(50) TYPE c,
        lv_idx(3)   TYPE n.

  lv_idx = ( p_cur / p_total ) * 100.

  CONCATENATE lv_idx '%:' p_text INTO lv_text.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = lv_idx
      text       = lv_text
    EXCEPTIONS
      OTHERS     = 0.
ENDFORM.

4、END-OF-SELECTION

此事件作为执行环境下最后调用的事件,是在查询所有数据后最终将这些数据输出到画面之前执行。即在 SELECT 语句中读取所有数据后,画面中显示 Write 在此事件内可以做修改内表数据的操作。

例:

*END-OF-SELECTION
DATA: gs_str TYPE scarr,
      gt_itab TYPE TABLE of scarr.

START-OF-SELECTION.
select * into CORRESPONDING FIELDS OF TABLE gt_itab
  from scarr.

END-OF-SELECTION.
LOOP AT gt_itab into gs_str.
  WRITE: / gs_str-carrid,gs_str-carrname.
ENDLOOP.

四、程序结构——List Process事件

List Process事件说明:

1、TOP-OF-PAGE

TOP-OF-PAGE 在新一页输出第一条数据之前执行。另外,在使用 NO STANDARD PAGEHEADING 选项的程序中直接输入报表表头时使用。没有特殊追加选项时只有生成基本列表时才使用。在NEW-PAGE 语句中不执行 EVENT。在当前页中指定成固定表头,因此移动滚动条也不会有变化

2、END-OF-PAGE

END-OF-PAGE 是当前页页脚触发的事件。即指定当前页页脚。LINE-SIZE.LINE-COUNT 一定要使用数字并且不能使用数据对象。在程序中,若已经追加 NEW-PAGE事件,则不会执行 END-OF-PAGE。

例:

*TOP-OF-PAGE 和 END-OF-PAGE 用法
TOP-OF-PAGE.
  WRITE : sy-title,30 'page no :',sy-pagno.
  ULINE.
  WRITE:'enjoy abap'.
  ULINE AT /(60).

END-OF-PAGE.
  ULINE.
  WRITE: /30 'page no:',sy-pagno.

START-OF-SELECTION.
  DO 20 TIMES.
    WRITE / sy-index.
  ENDDO.

3、AT LINE-SELECTION

当双击报表的一行或按《F2) 键时触发的事件。此时发生的 SY-UCOMM 系统变量中被分配PICK'值。

例:

*AT LINE-SELECTION
DATA: gs_scarr     TYPE scarr,
      gt_scarr     TYPE TABLE OF scarr,
      gv_fname(20) TYPE c,
      gv_value(20) TYPE c,
      gv_carrid    LIKE scarr-carrid,
      gv_carrname  LIKE scarr-carrname.

AT LINE-SELECTION.
  GET CURSOR FIELD gv_fname VALUE gv_value.

  CASE gv_fname.
    WHEN 'gs_scarr-carrid'.
      SPLIT sy-lisel AT '' INTO gv_carrid gv_carrname.
      WRITE: gv_carrid,gv_carrname.
    WHEN OTHERS.
  ENDCASE.

START-OF-SELECTION.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_scarr
    FROM scarr.

  LOOP AT gt_scarr INTO gs_scarr.
    WRITE: / gs_scarr-carrid,gs_scarr-carrname.
  ENDLOOP.
*双击事件
START-OF-SELECTION.
WRITE 'first list'.

FORMAT HOTSPOT on COLOR 7.
WRITE: / 'clik this line'.
FORMAT HOTSPOT off COLOR OFF.

AT LINE-SELECTION.
  WRITE:'secondary list'.
  WRITE: / 'sy-ucomm = ',sy-ucomm.

4、AT USER-COMMAND

例:

*at user-command
START-OF-SELECTION.
  SET PF-STATUS 'test'.
  WRITE:'click the button'.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'FCI'.
      LEAVE PROGRAM.
  ENDCASE.

5、TOP-OF-PAGE DURING LINE-SELECTION

在次级报表中控制表头时使用的事件。系统变量 SY-LSIND 中含有现在报表索引。每当显示次级报表(Secondary List)时SY-LSIND 会加1。Basic list的Index为0。如果使用SY-LSIND=SY-LSIND-1语句,则代表次级报表要覆盖现有画面。在次级报表中单击 Back 按或 Exit(ICON X)按钮,则索引会减 1。

6、WRITE语句:

WRITE 语句主要用于 OUTPUT 报表中显示数据及分配值 (MOVE)的功能。要用于显示的数据会保存在 LIST 缓冲器中。OUTPUT 报表中可以使用的项目有下列所示的几种。

用DATA 语句定义的字段。

用TABLES 语定义的结构体项目。

用FIELD-SYMBOL 定义的变量。

不受语言影响的 Text 文本。

五、调用程序

调用报表程序

调用报表程序与SELECTION-SCREEN

执行TYPE-1 程序首先显示包含 PARAMETERS 和SELECT-OPTION 的标准 SELECTION-SCREEN 画面。利用 SUBMIT 语可以执行向 SELECTION-SCREEN 输入字段中填值的多种选项。

1、 VIA SELECTION-SCREEN。显示被调用程序的 SELECTION SCREEN 画面。不使

用此语句,则不显示SELECTION-SCREEN 画面而直接执行被调用程序。

2、USING SELECTION-SET <var>。可以使用被调用程序的 Variant 来调用程序。

3、WITH p op f SIGN 。给 SELECTION-SCREEN 的构成要素 (PARAMETERS 和SELECT-OPTIONS) 赋值。

4、WITH FREE SELECTION freesel。可以使用动态的 Selection被调用的程序要与LDB 相连接。

5、WITH SELECTION-TABLE rspar。灵活运用结构体 RSPARAMS 的内表,可以动态为被调用程序的 SELECTION-SCREEN 输入字段赋值。

 

设置被调用的程序列表

被调用的程序不存在 REPORT 语句,因此不能设置列表的行数等样式。此时,可以利用SUBMIT语句修改被调用程序的列表结构。

调用事务码:

若程序存在事务码,则可以执行事务码调用其他程序。

 执行上面所示语句会在结束调用的程序的同时执行新程序。结束调用程序,则会回到刚执行时的初始菜单画面。LEAVE 语句与在 COMMAND 命令窗口输入/n + t-code 一样。

此语句在保存被调用程序的数据的同时调用事务码。遇到LEAVE PROGRAM 语句退出被调用程序,则会回到原调用程序中。AND SKIP FIRST SCREEN 选项用于利用内存参数值跳过 SELECTION SCREEN,直接显示 Output List。

六、BDC程序

BDC 程序分为生成 Batch Input 会话执行的方法及在程序内使用 CALL TRANSACTOIN语句调用的方法两种。

利用CALL TRANSACTION

CALL TRANSACTION 是将用户执行事务码输入画面值的过程用程序实现,即以EXCLE 文件形式输入到标准程序的方法。在实务中经常使用,不用生成 Batch Input Session,在ABAP 程序内用 CALLTRANSACTION 语输入数据。

<tcode>:事务码。

<bdc tab>:BDCDATA 结构的内表传递给事务码。

<ctu params>:适用于 Rel4.6B 以上版本,用于设置 CALL TRANSACTION语句选项属性参见下表:

<mode>:

<update>:

Return code:执行 BDC 后给系统变量 SY-SUBRC 返回结果:

MESSTAB:保存 BDC 执行时发生的信息的 BDCMSGCOLL 类型内表: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++中的内存管理

目录 C/C内存分布 C语言中动态内存管理方式 malloc/calloc/realloc和free C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new 与 operator delete new/delete实现原理 内置类型 自定义类型 定位new表达式&#xff08;placement-new&…

[附源码]Python计算机毕业设计Django路政管理信息系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

MySQL 从入门到实战讲解,京东 T5 大咖学习笔记分享,看完我哭了

数据库是一个综合系统&#xff0c;其背后是发展了几十年的数据库理论。也许你会觉得数据库并不难&#xff0c;因为你可以熟练地写出 SQL&#xff0c;也可以在各个客户端里玩得游刃有余。但就以最常见的 MySQL 为例&#xff0c;作为程员&#xff0c;你在使用 MySQL 的过程中&…

「Redis」04 发布和订阅

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——发布和订阅 1. 什么是发布和订阅 Redis 发布订阅&#xff08; pub/sub &#xff09;是一种消息通信模式&#xff1a;发送者&#xff08; pub &#xff09;发送消息&#xff0c;订阅者&#xff08; sub &#xf…

[附源码]Python计算机毕业设计Django环境保护宣传网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

matlab使用移动平均滤波器、重采样和Hampel过滤器进行信号平滑处理

此示例显示如何使用移动平均滤波器和重采样来隔离每小时温度读数的时间周期分量的影响&#xff0c;以及从开环电压测量中消除不需要的线路噪声。 最近我们被客户要求撰写关于信号平滑处理的研究报告&#xff0c;包括一些图形和统计输出。 该示例还显示了如何使用Hampel过滤器…

新时期我国信息技术产业的发展【技术论文,纪念长者,2008】

2008年10月&#xff0c;江泽民在《上海交通大学学报》发表了一篇题为《新时期我国信息技术产业的发展》的论文。作为上海交通大学1947届电机工程系的毕业生&#xff0c;发表这篇论文时&#xff0c;这位曾改变中国的长者已是82岁高龄。在这篇论文中&#xff0c;江泽民提出了“未…

URLDNS链

听说这个链子是最简单的链子之一了&#xff0c;但是却是来来回回看了好多遍才勉强看明白。 在 ysoserial 中我们可以看见链子是这样的&#xff1a; *Gadget Chain: * HashMap.readObject() * HashMap.putVal() * HashMap.hash() * URL.hashCode() 简单流程&#xff1a; 1.Hash…

HTML这一篇就够啦~

HTML这一篇就够啦HTML1、基础认知2、排版标签2.1 标题标签2.2 段落标签2.3 换行标签2.4 水平线标签3、文本格式化标签4、媒体标签4.1 图片标签4.2 路径4.3 音频文件4.4 视频文件5、链接标签6、列表标签、6.1 无序列表&#xff08;最常用&#xff09;6.2 有序列表&#xff08;偶…

2021.06青少年软件编程(Python)等级考试试卷(三级)

2021.06青少年软件编程(Python)等级考试试卷(三级) 一、单选题(共25题,每题2分,共50分) 1.关于open()函数的参数,下列描述正确的是?( D ) A. "w+" 以十六进制格式打开一个文件只用于写入 B. "r+"打开一个文件用于读写。文件指针将会放在文件…

ZMQ之自杀的蜗牛模式和黑箱模式

一、检测慢订阅者&#xff08;自杀的蜗牛模式&#xff09; 在使用发布-订阅模式的时候&#xff0c;最常见的问题之一是如何处理响应较慢的订阅者。理想状况下&#xff0c;发布者能以全速发送消息给订阅者&#xff0c;但现实中&#xff0c;订阅者会需要对消息做较长时间的…

springboot如何增加 application.yml配置文件

新建springboot 项目&#xff0c;默认项目的配置文件为application.properties。 需要将application.properties 修改为application.yml配置文件。 注意&#xff1a; 我发现直接将application.properties文件重命名为application.yml。 新的application.yml没有配置功能的属…

Compose 动画艺术探索之属性动画

本篇文章是此专栏的第三篇文章&#xff0c;如果想阅读前两篇文章的话请点击下方链接&#xff1a; Compose 动画艺术探索之瞅下 Compose 的动画Compose 动画艺术探索之可见性动画 Compose的属性动画 属性动画是通过不断地修改值来实现的&#xff0c;而初始值和结束值之间的过…

Java项目:ssm实验室设备管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 ssm实验室设备管理系统。前台jsplayuieasyui等框架渲染数据、后台java语言搭配ssm(spring、springmvc、mybatis、maven) 数据库mysql5.7、8.0版…

java - 数据结构,双向链表 - LinkedList

一、双向链表 &#xff08;不带头&#xff09; 无头双向链表&#xff1a;在Java的集合框架库中LinkedList底层实现就是无头双向循环链表 双向链表 和 单向链表的区别&#xff0c;就在于 双向 比 单向 多个 一个前驱地址。而且 你会发现 正因为有了前驱地址&#xff0c;所以所…

centos 安装和卸载 webmin

在centos里安装webmin 选择安装最新版本的安装包 官方下载路径可以查看下载版本http://download.webmin.com/download/yum/ wget http://download.webmin.com/download/yum/webmin-2.010-1.noarch.rpm如果安装提示 错误: 无法验证 prdownloads.sourceforge.net 的由 “/CUS…

15年架构师:再有面试官问你Kafka,就拿这篇学习笔记怼他

写在前面 Kafka是一个高度可扩展的消息系统&#xff0c;它在LinkedIn的中央数据库管理中扮演着十分重要的角色&#xff0c;因其可水平扩展和高吞吐率而被广泛使用&#xff0c;现在已经被多家不同类型的公司作为多种类型的数据管道和消息系统。 kafka的外在表现很像消息系统&a…

【图像分割】基于PCA结合模糊聚类算法FCM实现SAR图像分割附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

[附源码]计算机毕业设计疫情网课管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

代码随想录刷题Day53 | 1143. 最长公共子序列 | 1035. 不相交的线 | 53. 最大子数组和

代码随想录刷题Day53 | 1143. 最长公共子序列 | 1035. 不相交的线 | 53. 最大子数组和 1143. 最长公共子序列 题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字…