SAP ABAP语法完整版

SAP ABAP / 4 基础知识学习  

数据类型

C :字符串

D :日期型格式为 YYYYMMDD  例:'1999/12/03'

F : 浮点数长度为8

I :整数

N :数值组成的字符串 如:011,'302'

P : PACKED数用于小数点数值  如:12.00542

T : 时间格式为:HHMMSS 如:'14:03:00'

X : 16进制数 如:'1A03'

*-------------------------------------------------------------------------------------*

变量声明

DATA [] [][decimals]

     变量名称

     变量类型及长度

     初值

     小数位数

    

exp:

   DATA : COUNTER  TYPE P DECIMALS 3.

          NAME(10) TYPE C VALUE 'DELTA'.

          S_DATE   TYPE D VALUE '19991203'.

exp:

   DATA : BEGIN OF PERSON,

            NAME(10) TYPE C,

            AGE      TYPE I,

            WEIGHT   TYPE DECIMALS 2,

          END OF PERSON.

另外,有关DATA声明的指令还有: CONSTANTS(声明常数)、STATICS(临时变量声明).

exp:

CONSTANTS  PI  TYPE  P  DECIMALS  5  VALUE  '3.14159'.

STATICS 关键字

声明的变量仅在目前的程序中使用, 结束后会自动释放

语法: 

        STATICS [] [] []

系统专用变量说明

   系统内部专门创建了SYST这个STRUCTURE,里面的栏位存放系统变量,常用的系统变量有:

   SY-SUBRC:  系统执行某指令后,表示执行成功与否的变量,'0'表示成功

   SY-UNAME:  当前使用者登入SAP的USERNAME;

   SY-DATUM:  当前系统日期;

   SY-UZEIT:  当前系统时间;

   SY-TCODE:  当前执行程序的Transaction code

   SY-INDEX:  当前LOOP循环过的次数

   SY-TABIX:  当前处理的是internal table 的第几笔

   SY-TMAXL:  Internal table的总笔数

   SY-SROWS:  屏幕总行数;

   SY-SCOLS:  屏幕总列数;

   SY-MANDT:  CLIENT NUMBER

   SY-VLINE:  画竖线

   SY-ULINE:  画横线

  

TYPE 关键字

  用来指定资料型态或声明自定资料型态

  Example:

        TYPES:  BEGIN  OF  MYLIST,

                   NAME(10)  TYPE  C,

                   NUMBER   TYPE  I,

                END  OF  MYLIST.

        DATA  LIST  TYPE  MYLIST.

LIKE 关键字

   跟TYPE关键字使用格式相同, 如

   DATA  TRANSCODE  LIKE  SY-TCODE.

   不同的是 LIKE 用在已有值的资料项, 如系统变量, 而TYPE关键字则是用在指定资料型态。

TABLES 关键字

用来声明 Table Work Area 的数据, 对应至 ABAP/4 资料文件(Dictionary Object), 由SQL 指令加载所需数据

语法:

TABLES

Example:

TABLES: SPFL.

SELECT * FROM SPFL.

WRITE: SPFL-MANDT, SPFL-CARRID,SPFL-CONNECTION.

ENDSELECT.

从ABAP/4 Dictionary 的 SPFL 档载入MANDT,CARRID,CONNECTION 三个字段至SPFL 此Table Work Area

  

*-------------------------------------------------------------------------------------*

输出

一. WRITE 语句

ABAP/4用来在屏幕上输出资料的指令是WRITE指令,例如:

     WRITE: 'USER NAME IS:', SY-UNAME.

二. 指定屏幕输出位置

指定输出位置的语句格式为:

      WRITE: [AT] [ / ] [] [()] 资料项 []

其中: / : 在下一行输出

: 指定输出的行号;

():指定输出位数(长度)

: 指定显示格式参数,参数有:

          LEFT-JUSTIFIED  资料*左对齐

          CENTERED        资料*中间对齐

          RIGHT-JUSTIFIED 资料*右对齐

          UNDER        正对在资料项的下面显示

          NO-GAP          紧接着显示,不留空格

          USING EDIT MASK : 使用内嵌子元显示, 如 12:03:20

          USING NO EDIT MASK: 不使用内嵌子元

          NO-ZER          数字前面 0 的部分不显示

          NO-SIGN:        不显示正负号

          DECIMALS :   显示 位小数

          EXPOENT :    F(浮点数)指数的值

          ROUND :      四舍五入至小数点后

          CURRENCY :   币别显示

          DD/MM/YY :      日期显示格式

          MM/DD/YY:      

          YY/MM/DD:

          YY/DD/MM

          MM/DD/YYYY:

          DD/MM/YYYY

          YYYY/MM/DD:

          YYYY/DD/MM:

例如1: WRITE: /10(6) 'ABCDEFGHIJK'.

输出结果为:        ABCDEF

例如2: DATA: X TYPE I VALUE '11:20:30',

             A(5)  TYPE C VALUE 'AB  CDE'.

      WRITE: / X USING EDIT MASK '__:__:__'.

      WRITE: / X USING EDIT MASK '$___,___'.

      WRITE: / Y NO-GAP.

输出结果为:

        11:20:30

        $112,030

        ABCDEF

例如3: DATA: LEN TYPE I VALUE 10,

       POS TYPE I VALUE 11,

       TEXT(10)   VALUE '1234567890'

       WRITE 'The text ------------ appears in the text.'.

       WRITE AT POS(LEN) TEXT.

WRITE TO 语句的基本 形式

要将值(文字)或源字段内容写入目标字段,可以使用 WRITE TO 语句:

语法

WRITE TO [

DATA: NUMBER TYPE F VALUE '4.3',

      TEXT(10),

      FLOAT TYPE F,

      PACK  TYPE P DECIMALS 1.

WRITE NUMBER.

WRITE NUMBER TO TEXT EXPONENT 2.

WRITE / TEXT.

WRITE NUMBER TO FLOAT.

WRITE / FLOAT.

WRITE NUMBER TO PACK.

WRITE / PACK.

MOVE NUMBER TO PACK.

WRITE / PACK.

exp:

DATA: NAME(10)   VALUE 'SOURCE',

      SOURCE(10) VALUE 'Antony',

      TARGET(10).

...

WRITE (NAME) TO TARGET.

WRITE: TARGET.

exp :

DATA: COUNTER TYPE I.

COMPUTE COUNTER = COUNTER + 1.

COUNTER = COUNTER + 1.

ADD 1 TO COUNTER.

在此,三条运算语句进行相同算术运算

输出屏幕上的线和空行

用下列语法,可以在输出屏幕上生成水平线:

语法

ULINE [AT [/][][()]].

它等同于

WRITE [AT [/][][()]] SY-ULINE.

AT 后的格式规范,与在在屏幕上定位 WRITE 输出(页 28)中为 WRITE 语句说明的格式规范完全一样。

如果没有格式规范,系统则开始新的一行,并用水平线填充该行。否则,只按指定输出水平线。

生成水平线的另一种方法,是在 WRITE 语句中键入恰当数量的连字符,如下所示:

WRITE [AT [/][][()]] '-----...'.

垂直线

用下列语法 ,可以在输出屏幕上生成垂直线:

语法

WRITE [AT [/][]] SY-VLINE.

WRITE [AT [/][]] '|'.

空行

用下列语法 ,可以在输出屏幕上生成空行:

语法

SKIP [].

该语句从当前行开始,在输出屏幕上生成 个空行。如果没有指定 的值,就输出一个空行 。

要将输出定位在屏幕的指定行上,请使用:

语法

SKIP TO LINE .

该语句允许将输出位置向上或向下移动。

       

四. 显示图示:

语法: WRITE: AS SYMBOL.

     WRITE:   AS ICON.

例如: INCLUDE  .

     INCLUDE  .

WRITE: / 'Phone symbol:', SYM_PHONE AS SYMBOL.

WRITE: / 'Alarm Icon:', ICON_VOICE_OUTPUT AS ICON.

要查看系统所提供有那些符号及图示,可选择'EDIT'下的'Insert Statement',选择'Write',接下来选择要查看的群组,如SYMBOL 或ICON, 接下来按'Display'即可.

*-------------------------------------------------------------------------------------*

一. Internal Table 的声明

ABAP/4中的Internal Table是一种Data Structure,类似于其他语言中的STRUTURE,它可以由几个不同类型的栏位(field)组成,用来表示具有不同属性的某一事物,单独一笔资料表示某个事物,多笔资料表示具有相同属性的多个事物.

Internal table 的定义有以下几种格式:

格式一.   DATA: BEGIN OF   OCCURS  ,

                     TYPE ,

                  [  TYPE ,

                     TYPE ,

                    …                  ]

                END OF  .

     语法:

           DATA      OCCURS    [WITH  HEADER  LINE]

           Example:

                   DATA  VECTOR  TYPE  I  OCCURS  10  WITH  HEADER  LINE.

                  

格式二.   TYPES: BEGIN OF ,

                       TYPE ,

                    [  TYPE ,

                       TYPE ,

                    …                  ]

                 END OF .

          TYPES TYPE OCCURS .

         

格式三.   DATA: BEGIN OF .

                  INCLUDE STRUCTURE

.

          DATA: END OF .

          DATA: LIKE OCCURS .

exp:

         

TYPES VECTOR TYPE I OCCURS 10.

TYPES: BEGIN OF LINE,

         COLUMN1 TYPE I,

         COLUMN2 TYPE I,

         COLUMN3 TYPE I,

       END OF LINE.

TYPES ITAB TYPE LINE OCCURS 10.

TYPES: BEGIN OF DEEPLINE,

          TABLE1 TYPE VECTOR,

          TABLE2 TYPE ITAB,

       END OF DEEPLINE.

TYPES DEEPTABLE TYPE DEEPLINE OCCURS 10.

本示例创建与上例相同的内表数据类型(VECTOR 和 ITAB)。然后创建数据类型 DEEPLINE 作为字段串,包含这些内表作为组件。通过该字段串,数据类型 DEEPTABLE 被创建为内表。因此该内表的元素本身就是内表。

exp :

TYPES: BEGIN OF LINE,

         COLUMN1 TYPE I,

         COLUMN2 TYPE I,

         COLUMN3 TYPE I,

       END OF LINE.

TYPES ITAB TYPE LINE OCCURS 10.

DATA TAB1 TYPE ITAB.

DATA TAB2 LIKE TAB1 WITH HEADER LINE.

同创建内表数据类型(页 99)中所示,该示例创建数据类型 ITAB 作为内表。通过使用 DATA 语句的 TYPE 参数引用 ITAB,使数据对象 TAB1 与 ITAB 结构相同。通过使用 DATA 语句的 LIKE 参数引用 TAB1,使数据对象 TAB2 结构相同。创建的 TAB2 带表头行。因此,可以在程序中使用 TAB2-COLUMN1、TAB2-COLUMN2 和 TAB2-COLUMN3 等定位表格工作区域 TAB2。

exp :

DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10.

本示例创建数据对象 FLIGHT_TAB, 其结构与数据库表格 SFLIGHT 相同。

本示例介绍 如何采用两种不同的步骤创建同一内表。

TYPES VECTOR_TYPE TYPE I OCCURS 10.

DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE.

在此创建一个内表数据类型 VECTOR_TYPE,其行包含首先创建的基本类型 I 字段。然后,通过引用 VECTOR_TYPE 创建数据对象 VECTOR。通过使用 WITH HEADER LINE 选项还创建表格工作区域 VECTOR。在这种情况下,表格工作区域包含一种类型 I 字段,可以通过名称 VECTOR 定位。

DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.

在这种情况下,通过直接在 DATA 语句中使用 OCCURS 选项创建完全一样的数据类型 VECTOR。

*-------------------------------------------------------------------------------------*

1. TYPES type.

2. TYPES type(len).

3. TYPES: BEGIN OF structype  ...

          END OF structype.

4. TYPES itabtype {TYPE tabkind OF linetype LIKE tabkind OF lineobj}

         [WITH [UNIQUE|NON-UNIQUE] keydef] [INITIAL SIZE n].

5. TYPES itabtype TYPE RANGE OF type.

   TYPES itabtype LIKE RANGE OF f.

6. TYPES itabtype {TYPE linetype|LIKE lineobj} OCCURS n.

*-------------------------------------------------------------------------------------*

         

APPEND LINE

格式:APPEND TO

举例一:(使用WORK AREA)

DATA : BEGIN OF LINE,

             COL1 TYPE I,

             COL2 TYPE I,

       END OF LINE.

DATA ITAB LIKE LINE OCCURS 10.

DO 2 TIMES.

   LINE-COL1 = SY-INDEX.

   LINE-COL2 = SY-INDEX ** 2.

   APPEND LINE TO ITAB.

ENDDO.

LOOP AT ITAB INTO LINE.

     WRITE : / LINE-COL1,LINE-COL2.

ENDLOOP.

举例二 (不使用WORK AREA)

DATA : BEGIN OF ITAB OCCURS 10,

             COL1 TYPE I,

             COL2 TYPE I,

       END OF ITAB.

DO 2 TIMES.

   ITAB-COL1 = SY-INDEX.

   ITAB-COL2 = SY-INDEX ** 2.

   APPEND ITAB.

ENDDO.

LOOP AT ITAB.

     WRITE : / ITAB-COL1,ITAB-COL2.

ENDLOOP.

exp:

DATA: BEGIN OF ITAB OCCURS 10,

        COL1 TYPE C,

        COL2 TYPE I,

      END OF ITAB.

DO 3 TIMES.

  APPEND INITIAL LINE TO ITAB.

  ITAB-COL1 = SY-INDEX. ITAB-COL2 = SY-INDEX ** 2.

  APPEND ITAB.

ENDDO.

LOOP AT ITAB.

  WRITE: / ITAB-COL1, ITAB-COL2.

ENDLOOP.

举例三. (加入另一个Internal table的元素)

       格式: APPEND LINES OF [FROM ] [TO ] TO .

       将的元素加入至中,可选取自的范围.

       APPEND LINES OF ITAB TO JTAB.

COLLECT LINE

COLLECT 指令也是将元素加入Internal table中,与APPEND 的区别是: COLLECT指令在非数值栏位相同的情况下,将数值栏位汇总.

格式:  COLLECT [ INTO ]

DATA: BEGIN OF ITAB OCCURS 3,

             COL1(3)  TYPE C,

             COL2     TYPE I,

       END OF ITAB.

       ITAB-COL1 = 'ABC'.    ITAB-COL2 = 10.

       COLLECT  ITAB.

       ITAB-COL1 = 'XYZ'.    ITAB-COL2 = 20.

       COLLECT  ITAB.

       ITAB-COL1 = 'ABC'.    ITAB-COL2 = 80.

       COLLECT  ITAB.

此时, internal table中放的是2笔数据, 分别为:

       ITAB-COL1        ITAB-COL2

        'ABC'               90

        'XYZ'               20

*-------------------------------------------------------------------------------------*

INSERT LINE

将元素插入在指定的internal table位置之前.

格式: INSERT [ INTO] [INITIAL LINE INTO ] [INDEX ]

或者: INSERT LINES OF [FROM TO ] INTO INDEX

其中: 即work area,工作区中的元素.

[INITIAL LINE INTO] :插入一笔初始化的记录.

: internal table

[INDEX ]: internal table 的记录号.(新加入的元素放在此记录前面)

         Example:

                  DATA:  BEGIN  OF  LINE,

                           COL1  TYPE  I,

                           COL2  TYPE  I,

                           END  OF  LINE.

                  DATA  ITAB  LIKE  LINE  OCCURS  10.

                  DO  3  TIMES.

                     LINE-COL1 = SY-INDEX *10.

                     LINE-COL2 = SY-INDEX *20.

                     APPEND  LINE  INTO  ITAB.

                  ENDDO.

                  LINE-COL1=100.

                  LINE-COL2=200.

                  INSERT  LINE  INTO  ITAB  INDEX  2.  "插入在位置2之前

                  LOOP  AT  ITAB  INTO  LINE.

                    WRITE:  /  SY-TABIX,LINE-COL1,LINE-COL2. "SY-TABIX为Table位置

                 ENDLOOP.

                 执行结果:

                            1        10       20

                            2       100      200  "插入的元素

                            3        20       40

                            4        30       60

插入另一Internal Table元素

   语法:

         INSERT  LINES  OF    [FROM TO ]  TO    INDEX

        将的元素插入至中, 位置在 之前, 可选取自的范围

         Example:

                  APPEND  LINES  OF  ITAB  TO  JTAB  INDEX  3.

                  将ITAB所有元素插入JTAB中, 位置在第三个元素之前

*-------------------------------------------------------------------------------------*

读取internal table

格式一:

LOOP AT [INTO ][FROM TO ][WHERE ]

      

ENDLOOP.

         Example:

                  LOOP  AT  ITAB  INTO  LINE  WHERE  COL1 >100.

                     WRITE:  /  SY-TABIX,LINE-COL1.

                  ENDLOOP.

                  仅读取 COL1 > 100 的元素

格式二:

READ TABLE [INTO ] [INDEX / WITH KEY ]

举例. (格式二)

DATA: BEGIN OF ITAB OCCURS 10,

             COL1 TYPE I,

             COL2 TYPE I,

      END OF ITAB.

      DO 10 TIMES.

          ITAB-COL1 = SY-INDEX.

          ITAB-COL2 = SY-INDEX * 2.

          APPEND ITAB.

ENDDO.

READ TABLE ITAB INDEX 3.

(或者: READ TABLE  ITAB WITH KEY COL1 = 3.)

WRITE: / 'ITAB-COL1 = ', ITAB-COL1, 'ITAB-COL2 = ', ITAB-COL2.

执行结果同样是:

ITAB-COL1 = 3

ITAB-COL2 = 6.

         Example:

                   READ  TABLE  ITAB  INTO  LINE  INDEX  5

                   读取 ITAB的第5个元素资料, 放入 LINE的栏位中

根据栏位内容寻找

   语法:

          READ  TABLE    INTO 

          Example:

                  ITAB-COL1 = 'ABC'.

                  READ  TABLE  ITAB  INTO  LINE.

                  找出ITAB 中 COL1 栏位内容是 ABC 的元素, 找到的值放入 LINE 中

                  若找到 SY-SUBRC传回0, 找不到则传回 4, 必须声明有 work area

*-------------------------------------------------------------------------------------*

修改internal table 中的值

格式: MODIFY [FROM ][INDEX ][TRANSPORTING …][WHERE ]

举例一. READ TABLE ITAB INDEX 3.

       LINE-COL1 = 29.

       MODIFY ITAB FROM LINE TRANSPORTING COL1.

       将第三笔记录的COL1栏位的值修改为29.

举例二. T_SALARY - salary = 50.

       MODIFY T_SALARY TRANSPORTING salary WHERE birthday = '1999/12/06'.

      

DELETE internal table中的栏位

格式: DELETE INDEX .

或:   DELETE [FROM TO ] [WHERE ]

Internal table 排序 

SORT [][BY …]

其中: 有DESCENDING 和ASCENDING, Default 为ASCENDING.

     : 为指定排序的栏位.

        Example:

                 SORT  ITAB  DESCENDING  BY  COL2.

                 将 ITAB 根据 COL2栏位递减排序

*-------------------------------------------------------------------------------------*

确定内表属性

如果在处理过程中想知道内表一共包含多少行,或者想知道定义的 OCCURS 参数的大小,请使用 DESCRIBE 语句,用法如下:

语法

DESCRIBE TABLE [LINES ] [OCCURS ].

如果使用 LINES 参数,则将填充行的数量写入变量 。如果使用 OCCURS 参数,则将行的初始号写入变量

DATA: BEGIN OF LINE,

         COL1 TYPE I,

         COL2 TYPE I,

      END OF LINE.

DATA ITAB LIKE LINE OCCURS 10.

DATA: LIN TYPE I, OCC TYPE I.

DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.

WRITE: / LIN, OCC.

DO 1000 TIMES.

   LINE-COL1 = SY-INDEX.

   LINE-COL2 = SY-INDEX ** 2.

   APPEND LINE TO ITAB.

ENDDO.

DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.

WRITE: / LIN, OCC.

其输出为:

         0         10

     1.000         10

在此创建内表 ITAB。在填充表格前后执行 DESCRIBE 语句。更改当前行号,但无法更改初始行号。

*-------------------------------------------------------------------------------------*

加总

SUM.

总和计算存放与work area中,但只能在LOOP 中使用.

例: LOOP AT ITAB INTO LINE.

         SUM.

   ENDLOOP.

   WRITE: / LINE-COL1, LINE-COL2.

   LINE-COL1 和 LINE-COL2 存数值总和初始化internal table

REFRESH .  清空中的值.使用在没有 HEADER LINE 的 Internal Table中, 清除所有元素

CLEAR   .  清空的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素

FREE    .  释放内存空间.释放(Release) Internal Table所占的内存空间, 用在 REFRESH和 CLEAR指令之后

将值重置为 默认值

可以用 CLEAR 语句重置任何数据对象值,如下所示:

语法

CLEAR .

exp:

DATA NUMBER TYPE I VALUE '10'.

WRITE NUMBER.

CLEAR NUMBER.

WRITE / NUMBER.

输出为:

        10

         0

CLEAR 语句将字段 NUMBER 的内容从10 重置为默认值 0。

*-------------------------------------------------------------------------------------*

   添加字段顺序并将结果赋给另一个字段

语法

ADD THEN UNTIL GIVING .

如果 、 ... 、 是在内存中相同类型和长度的等距字段序列,则进行求和计算并将结果赋给

   添加字段顺序并将结果添加到另一个字段的内容中

语法

ADD THEN UNTIL TO .

该语句除了将字段总和添加到 的旧内容中之外,与上面语句的工作方式相同 。

有关其它相似变体的信息,参见有关 ADD 语句的关键字文档。

DATA: BEGIN OF SERIES,

         N1 TYPE I VALUE 10,

         N2 TYPE I VALUE 20,

         N3 TYPE I VALUE 30,

         N4 TYPE I VALUE 40,

         N5 TYPE I VALUE 50,

         N6 TYPE I VALUE 60,

      END OF SERIES.

DATA SUM TYPE I.

ADD SERIES-N1 THEN SERIES-N2 UNTIL SERIES-N5 GIVING SUM.

WRITE SUM.

ADD SERIES-N2 THEN SERIES-N3 UNTIL SERIES-N6 TO SUM.

WRITE / SUM.

输出如下:

       150

       350

在此,将 N1 到 N5 组件内容求和并将其值赋给字段 SUM。然后,将 N2 到 N6 组件求和并将其添加到 SUM 的值中。

*-------------------------------------------------------------------------------------*

         

屏幕输入命令

在ABAP/4中要从屏幕输入变量, 使用的命令是 PARAMETERS 及SELECTION-OPTIONS:

    1. PARAMETER: 输入一个变量或栏位内容

    2. SELECTION-OPTIONS: 使用条件筛选画面来输入数据   

PARAMETERS 指令

基本的输入命令, 类似如BASIC的INPUT命令, 但无法使用F格式(浮点数)

    语法:

        PARAMETERS 

  [DEFAULT ]  [LOWER CASE]

                           [OBLIGATORY]  [AS CHECKBOX]

                           [RADIOBUTTON GROUP ]

       Example:

            PARAMETERS:  NAME(8),

                           AGE  TYPE  I,

                           BIRTH  TYPE  D.

            执行结果:            

在日期的输入格式上为 MM/DD/YY , MM/DD/YYYY, MMDDYY或MMDDYYYY , 如输入 020165 表 1965年02月01日, 与02/01/65的输入是一样的, 日期输入范围为西元1950年至2049年

1. DEFAULT

设定输入的预设值

Example:

   PARAMETERS:  COMPANY(20)  DEFAULT  'DELTA',

                BIRTH  TYPE  D  DEFAULT  '19650201'.

2.   LOWER CASE

     ABAP/4预设是将字串输入值自动转换为大写, 加上此参数会将输入的资料转成小写,

3.   OBLIGATORY

强制要求输入, 屏幕上会出现一个 ? , 使用者必须要输入才可.

4.   AS CHECKBOX

输入 CHECKBOX的格式

Example:

          PARAMETERS:  TAX  AS  CHECKBOX  DEFAULT 'X',

                       NTD  AS  CHECKBOX.

          执行结果:

   

5.    RADIOBUTTON GROUP

      输入 RADIO BUTTON GROUP 的方式

      Example:

     PARAMETERS: BOY  RADIOBUTTON GROUP  SEX  DEFAULT 'X',        

                   GIRL  RADIOBUTTON GROUP  SEX.

exp :

TABLES SPLFI.

PARAMETERS: LOW  LIKE SPFLI-CARRID,

            HIGH LIKE SPFLI-CARRID.

SELECT * FROM SPLFI WHERE CARRID BETWEEN LOW AND HIGH.

   ........

ENDSELECT.

*-------------------------------------------------------------------------------------*

  

SELECTION-OPTIONS

   SELECTION-OPTIONS所输入的值实际上是放在internal table中的,该Internal table 有四个栏位,分别是:SIGN,OPTION,LOW,HIGH.. 条件筛选检查条件输入画面指令, 输入条件后可配合SELECT指令自TABLE读取符合条件的资料, 直接执行或放入 Internal Table中, 条件有四个参数:

1. SIGN:

     I: 表筛选条件符合的资料

     E: 表筛选条件不符合的资料

2. OPTION: 比较的条件符号

          EQ(等于),NE(不等于),GT(大于),LE(小于),CP(包含),NP(不包含)

3. LOW: 最小值

4. HIGH: 最大值

   语法:

          SELECTION-OPTIONS    FOR 

Example:

          TABLES  SPFLI.

          SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID.

将条件的输入值存放入 AIRLINE, 筛选选择为SPFLI中的CONNID栏位

改变条件输入格式

1. DEFAULT    TO 

设定开始结束范围输入预设值

     Example:

     SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID DEFAULT  '2042'  TO  '4555'.

2. NO-EXTENSION

设定不要Multi-Option输入画面

3. NO  INTERVALS

设定不要区间范围输入画面

4. LOWER CASE

输入转换成大写

5. OBLIGATORY

强制要求输入

*-------------------------------------------------------------------------------------*

配合 SELECT 命令

   条件输入完后要将符合条件的资料筛选出来, 可配合使用 SELECT 指令

   1.使用WHERE <条件式>

Example:

  TABLES  SPFLI.

  SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID.

  SELECT  *  FROM  SPFLI  WHERE  CONNID  IN  AIRLINE.

       WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.

  ENDSELECT.

2.使用CHECK参数

Example:

  TABLES  SPFLI.

  SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID.

      SELECT  *  FROM  SPFLI.

      CHECK  AIRLINE.

      WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.

  ENDSELECT.

  *

exp: 

TABLES SPFLI.

SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID,

                S_CITYFR FOR SPFLI-CITYFROM,

                S_CITYTO FOR SPFLI-CITYTO,

                S_CONNID FOR SPFLI-CONNID.

SELECT * FROM SPFLI.

  CHECK: SPFLI-CARRID IN S_CARRID,

       SPFLI-CITYFR IN S_CITYFR,

       SPFLI-CITYTO IN S_CITYTO,

       SPFLI-CONNID IN S_CONNID.

   WRITE: / SPFLI-CARRID, SPFLI-CONNID,

          SPFLI-CITYFROM, SPFLI-CITYTO.

ENDSELECT.

 

3.使用 IF … IN 关键字

     Example:

         SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID.

         SELECT  *  FROM  SPFLI.

            IF  SPFLI-CONNID  IN  AIRLINE.

              WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.

                ENDIF.

             ENDSELECT.

*-------------------------------------------------------------------------------------*

SELECTION-SCREEN

    1.产生空白列

语法:

      SELECTION-SCREEN  SKIP  []

          Example:

                   SELECTION-SCREEN  SKIP  2.

                   产生两列空白列

    2.产生底线

语法:

      SELECTION-SCREEN  ULINE  / (length)

          Example:

                   SELECTION-SCREEN  ULINE  /10(30).

                   自第10格开始产生长度30的底线

   3.印出备注说明

     语法:

      SELECTION-SCREEN  COMMENT  / (length) 

          Example:

                   REMARK = 'Pls enter your name'.

                   SELECTION-SCREEN  COMMENT  /10(30)  REMARK.

    4. 同一列中输入数个资料项

语法:

      SELECTION-SCREEN  BEGIN  OF  LINE.

         ……

      SELECTION-SCREEN  END  OF  LINE.

      Example:

              SELECTION-SCREEN  BEGIN  OF  LINE.

                  SELECTION-SCREEN  POSITION 20.

                  PARAMETERS  NAME(10).

                  SELECTION-SCREEN  POSITION 40.

                  PARAMETERS  BIRTH  TYPE  D.

              SELECTION-SCREEN  END  OF  LINE.

              在20格输入NAME内容, 40格输入 BIRTH的内容

    5. 绘出BLOCK PANEL

语法:

SELECTION-SCREEN  BEGIN  OF  BLOCK 

                      [WITH  FRAME  [TITLE  ].</p> <p>          …….</p> <p>SELECTION-SCREEN  END  OF  BLOCK  <block>.</p> <p>Example:</p> <p>SELECTION-SCREEN  BEGIN  OF  BLOCK  RADIO                          WITH  FRAME .</p> <p>                  PARAMETER  R1  RADIOBUTTON  GROUP  GR1.</p> <p>                  PARAMETER  R2  RADIOBUTTON  GROUP  GR1.</p> <p>                  PARAMETER  R3  RADIOBUTTON  GROUP  GR1.</p> <p>               SELECTION-SCREEN  END  OF  BLOCK  RADIO. </p> <p>*-------------------------------------------------------------------------------------*</p> <p> </p> <p>SQL语法<br>      我们在编写ABAP4程序的时候,经常需要从TABLE中根据某些条件读取数据,读取数据最常用的方法就是通过SQL语法实现的。ABAP/4中可以利用SQL语法创建或读取TABLE,SQL语法分为DDL(DATA DEFINE LANGUAGE)语言和DML(DATA MULTIPULATION LANGUAGE)语言,DDL语言是指数据定义语言,例如CREATE等, DML语言是数据操作语言,例如SELECT, INSERT等语句。SQL语句有OPEN SQL语句和NATIVE SQL语句。 OPEN SQL语句不是标准SQL语句,是ABAP/4语言,利用OPEN SQL语句能在Databases 和 Command 之间产生一个BUFFER,所以它有一个语言转换的过程。而NATIVE SQL语句则是标准的SQL语句, 它直接针对Databases操作。</p> <p>OPEN SQL</p> <p>SELECT语句<br> 语法格式:<br> SELECT <result> [INTO <target>] [FROM <source>] [WHERE <condition>]<br>                [GROUP BY <fields>] [ORDER BY <sort order>]<br> 其中: <result>指定要抓取的栏位<br>       <target>将读取的记录存放在work area中<br>       <source>指定从那个TABLE中读取资料<br>       <condition>抓取资料的条件<br>       <fields>指定按那些栏位分组<br>       <sort order>排序的栏位及方式<br> 相关的系统变量:<br>      SY-SUBRC = 0  表示读取数据成功<br>               <> 0 表示未找到符合条件的记录<br>      SY-DBLNT: 被处理过的记录的笔数.<br> 相关的命令:<br>      EXIT. 退出循环.<br>      CHECK <logistic statement>.如果逻辑表达式成立,则继续执行,否则,开始下一次循环。<br>    <br> 利用循环方式读取所有记录<br> SELECT ….ENDSELECT.是循环方式读取记录的。<br>      例如:<br> TABLES MARD.<br> SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'.<br>     <Statements>.<br> ENDSELECT.<br> (从MARD中抓取所有料号=3520421700的资料)<br> ◆读取一笔资料<br>       Example:<br>                TABLES  SPFLI.<br>                SELECT  SINGLE  *  FROM  SPFLI    <br>                      WHERE  PLANT ='CHUNGLI'  AND  TEL='4526174'.<br>                WRITE:  /  SPFLI-COMPANY,SPFLI-PLANT,SPFLI-TEL.<br> ◆将读取的记录放在work area中,并且加入Internal table 中.<br> 格式有:<br>    ... INTO <work area><br>    ... INTO CORRESPONDING FIELDS OF <work area><br>    ... INTO (f1, ..., fn) 变量组.<br>    ... INTO TABLE <internal table><br>    ... INTO CORRESPONDING FIELDS OF TABLE <internal table><br>    ... APPENDING TABLE <internal table><br>    ... APPENDING CORRESPONDING FIELDS OF TABLE <internal table><br> 举例一:<br> TABLES MARD. <br> DATA:  BEGIN OF ITAB OCCURS 10,<br>               MATNR LIKE MARD-MATNR,<br>               WERKS LIKE MARD-WERKS,<br>               LGORT LIKE MARD-LGORT,<br>               LABST LIKE MARD-LABST,<br>         END OF ITAB.<br> SELECT MATNR WERKS LGORT LABST  <br>               INTO CORRESPONDING FIELDS OF ITAB <br>               FROM MARD<br>               WHERE MATNR = '3520421700'.<br>        APPEND ITAB.<br>        CLEAR ITAB.<br> ENDSELECT.<br> (将读取的结果放在Internal table ITAB中)</p> <p>DATA: BEGIN OF WA, <br>         LINE(240),<br>       END OF WA.<br> DATA NAME(10).<br> NAME = 'SPFLI'.<br> SELECT * FROM (NAME) INTO WA.<br>   WRITE: / WA-LINE. <br> ENDSELECT.<br> 数据库表名称 SPFLI 被赋给字符字段 NAME。SELECT 语句将所有的行从 SPFLI 中读到目标区 WA 中。在该示例中,WA 与 SPFLI 的结构并不相同,每一行都将自动地转换成字符字段.</p> <p>举例二.<br> TABLES MARD.<br> SELECT MATNR  MTART  MAKTX  INTO (t_matnr, t_mtart, maktx) <br>                FROM MARD<br>                WHERE MATNR = '3520421700'.<br>        <Statements>.<br> ENDSELECT.<br> (从MARD中抓取料号=3520421700的料号、类型和描述,放在变量t_matnr, t_mtart, maktx中)。</p> <p>        Example:<br>                  TABLES  SPFLI.<br>                  DATA  WA  LIKE  TABLES.<br>                  SELECT  *  FROM  SPFLI  INTO  WA.<br>                     WRITE:  /  WA-COMPANY,WA-PLANT.<br>                  ENDSELECT.<br>                  逐笔写入WA 工作区中<br> 举例三.<br> 将读取的资料写入 Initial Table 中<br>   语法:<br>         SELECT  .. INTO  TABLE  <itab>   <br>         Example:<br>         TABLES  SPFLI.<br>         DATA  ITAB  LIKE  SPFLI  OCCURS  10  WITH  HEADER  LINE.<br>         SELECT  *  FROM  SPFLI  INTO  ITAB.<br>         一次读10笔(Initial Table的长度)记录存入 ITAB 中<br>         <br>         SELECT  .. INTO  TABLE  <itab>  PACKAGE  SIZE <n><br>         一次读取 <n> 笔记录至 <itab>中<br>         Example:<br>            TABLES  SPFLI.<br>            DATA  ITAB  LIKE  SPFLI  OCCURS  10  WITH  HEADER  LINE.<br>            SELECT  *  FROM  SPFLI  INTO  ITAB  PACKAGE  SIZE  5. <br>            一次读取 5 笔记录</p> <p>exp :</p> <p>TABLES SPFLI.<br> DATA: BEGIN OF WA,<br>          NUMBER TYPE I VALUE 1,<br>          CITYFROM LIKE SPFLI-CITYFROM,<br>          CITYTO   LIKE SPFLI-CITYTO,<br>       END OF WA.<br> SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF WA.<br>    WRITE: / WA-NUMBER, WA-CITYFROM, WA-CITYTO.<br> ENDSELECT.<br> 输出如下所 示:</p> <p>在该示例中,系统只将数据库表 SPFLI 中选定行的列 CITYFROM 和 CITYTO 传送到 WA 中。WA 中的组件 NUMBER 保持不变。<br> *-------------------------------------------------------------------------------------*</p> <p>按指定的栏位排序<br> TABLES SBOOK.<br> SELECT * FROM SBOOK   WHERE CARRID = 'LH' AND<br>                             CONNID = '0400' AND<br>                             FLDATE = '19950228'<br>                             ORDER BY BOOKID ASCENDING.<br>    WRITE: / SBOOK-BOOKID,   SBOOK-CUSTOMID,<br>            SBOOK-CUSTTYPE,  SBOOK-SMOKER,<br>            SBOOK-LUGGWEIGHT, SBOOK-WUNIT,<br>            SBOOK-INVOICE.<br> ENDSELECT.<br> (利用参数ORDER BY所指定的栏位排序)<br> *-------------------------------------------------------------------------------------*</p> <p>◆ 抓取数据的条件关键字<br> (1) BETWEEN <g1>  AND  <g2><br> 例如:  WHERE YEAR BETWEEN 1995 AND 2000.<br> (2) LIKE <g><br> 例如:  WHERE NAME LIKE 'MIKE%'.<br> ('%'是通配符号)<br> (3) IN (<g1>…<gn>)<br> 是<g1>…<gn>里面的任意一个值即可.<br> 例如: WHERE PLANT IN ('CHUNGLI', 'TAOYUAN','LIUTU').<br> (表示PLANT 只要是'CHUNGLI'或'TAOYUAN'或'LIUTU'都可以).<br> (4)  ORDER  BY 关键字<br>      指定排序的栏位或顺序<br>      (1). ..ORDER BY PRIMARY KEY.<br>         根据 PRIMARY KEY 递增排序<br>      (2)…ORDER BY <f1> [DESCENDING] <f2> [DESCENDING]<br>         Example:<br>                   SELECT * FROM IM ORDER BY PART .<br> *-------------------------------------------------------------------------------------*</p> <p>INSERT 语句<br> ◆从work area 加入到Internal Table中<br> 格式: INSERT INTO <database> VALUES <work area><br> 例如: <br> DATA:  BEGIN OF WA,<br>               CODE(6)  TYPE C,<br>               NAME(30) TYPE C,<br>         END OF WA.<br> DATA:  VEN LIKE WA OCCURS 10.<br> …<br> WA-CODE  =  '530120'.<br> WA-NAME  =  'XINGDA ELECTRONICS CO.,LTD'.<br> INSERT INTO VEN VALUES WA .<br> 如果work area的名称就是internal table的名称,可以直接写成:<br>       INSERT <internal table><br> 例如:<br> DATA:  BEGIN OF WA OCCURS 10,<br>               CODE(6) TYPE C,<br>               NAME(30) TYPE C,<br>         END OF WA.<br> …<br> WA-CODE = '530120'.<br> WA-NAME  =  'XINGDA ELECTRONICS CO., LTD'.<br> INSERT WA.<br> ◆从另外一个Internal table中INSERT 资料<br> 格式:<br> INSERT <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICATE KEY]<br> 将<itab2>中非NULL的资料加入<itab1>中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重复加入.</p> <p>   加入一笔记录至资料库</p> <p>   1.自 Work Area 工作区<br>    语法:<br>         INSERT  INTO  <database>  VALUES  <wa><br>         Example:<br>                  TABLES  SPFLI.<br>                  DATA  WA   LIKE  SPFLI.<br>                  WA-NO = '34051920'.<br>                  WA-COMPANY='DELTA'.<br>                  INSERT  SPFLI  VALUES  WA.<br>                  将 ITAB 资料加入 SPFLI中, 也可写成 INSERT  SPFLI  FROM  ITAB.<br>            <br>                   SPFLI-NO='34299876'.<br>                   SPFLI-COMPANY='HP'.<br>                   INSERT  SPFLI  FROM  SPFLI.<br>                   将Work Area  SPFLI中的资料加入资料库档案 SPFLI中<br>                   因Work Area SPFLI的结构与资料档 SPFLI一样, 所以也可<br>                   写成 INSERT  SPFLI.</p> <p>   2.自 Internal Table<br>      语法:<br>            INSERT  <database>  FROM  TABLE  <itab>  [ACCEPTING DUPLICATE KEY]<br>            将 <itab>中非 NULL的资料加入 <database>中, 加上 [ACCEPTING DUPLICATE<br>            KEY]能检查不加入有重覆primary key, 若有重覆则 SY-SUBRC 会传回 4<br>            Example:<br>                     TABLES  SPFLI.<br>                     DATA  ITAB  LIKE  SPFLI  OCCURS  10  WITH  HEADER LINE.<br>                     ITAB-NO = '34051920'.<br>                     ITAB-COMPANY = 'DELTA'.<br>                     APPEND  ITAB.<br>                     ….<br>                     INSERT  SPFLI  FROM  TABLE  ITAB  <br>                              ACCEPTING  DUPLICATE  KEY.<br> *-------------------------------------------------------------------------------------*</p> <p>UPDATE 指令<br>    异动已存在的记录内容</p> <p>1.使用 Primary Key<br>   语法: <br>             UPDATE  <database>  FROM  <wa><br>             Example:<br>                      TABLES  SPFLI.<br>                      DATA  WA  LIKE  SPFLI.<br>                      WA-NO='34051920'.<br>                      WA-COMPANY='DELTA'.<br>                     UPDATE  SPFLI  FROM  WA.<br>                     如 SPFLI 的 Primary Key是 NO, 则会找到 NO='34051920'的记录, 将其 COMPANY栏位异动为 DELTA</p> <p>2.使用条件式<br>   语法:<br>         UPDATE  <database>  SET  < f1>=<values>…  WHERE  <condition><br>         根据条件式异动符合条件式的记录<br>         Example:<br>                  UPDATE  SPFLI  SET  NO ='34051920'<br>                                      COMPANY = 'DELTA'<br>                          WHERE  TEL = '4526107'.<br> *-------------------------------------------------------------------------------------*</p> <p>3.   MODIFY 语法<br>      MODIFY <internal table> [FROM <work area>].<br> 根据 Primary Key 寻找资料档中符合的记录, 若找到则更新异动, 若找不到则新增记录<br> 语法:<br>        MODIFY  <database>  FROM  <wa><br>        Example:<br>                 WA-NO='34051920'.<br>                 WA-COMPANY='DELTA'.<br>                 MODIFY  SPFLI  FROM  WA.<br>      <br> 4.   DELETE 语法<br>      DELETE <internal table> [FROM <work area>].<br>  或: DELETE <internal table> [WHERE <conditions>]<br>    删除资料档的记录</p> <p>1.使用 Primary Key<br>   语法: <br>             DELETE  <database>  FROM  <wa><br>             Example:<br>                      TABLES  SPFLI.<br>                      DATA  WA  LIKE  SPFLI.<br>                      WA-NO='34051920'.<br>                      WA-COMPANY='DELTA'.<br>                      DELETE  SPFLI  FROM  WA.<br>                      如 SPFLI 的 Primary Key是 NO, 则会找到 NO='34051920'的记录, 找到后将此笔删除</p> <p>2.使用条件式<br>   语法:<br>         DELETE  FROM  <database>  WHERE  <condition><br>         根据条件式删除符合条件式的记录<br>         Example:<br>                  DELETE  FROM  SPFLI  WHERE  AREA = 'AMERICAN'.<br>                                         <br> *-------------------------------------------------------------------------------------*</p> <p>5. DATABASE CURSOR<br>    Database Cursor是一个资料库暂存区, 将经SELECT指令读取的记录存放至此暂存区, 再由此暂存区放至Work Area中, 可减少资料库读取的次数.<br> 1.开启 Database Cursor<br>   语法:<br>         OPEN  CURSOR  <c>  FOR  SELECT …  WHERE <condition><br>         Example:<br>                 TABLES  SPFLI.<br>                 DATA:  WA  LIKE  SPFLI,<br>                         C1  TYPE  CURSOR.<br>                 OPEN  CURSOR  C1 FOR SELECT  *  FROM  SPFLI <br>                        WHERE  AREA ='TAIWAN'.<br>   2.读取 Database Cursor的资料存入 Work Area<br> 语法:<br>       FETCH  NEXT  CURSOR  <c>  INTO  <wa><br>           Example:<br>                    FETCH  NEXT  CURSOR  C1  INTO  WA.<br>   读取下一笔Cursor位置的资料存入WA, 如果已无资料可读, SY-SUBRC <>0. <br> 关闭 Database Cursor<br> 语法:<br>       CLOSE  CURSOR  <c><br>       Example:<br>                CLOSE  CURSOR  C1.</p> <p>*-------------------------------------------------------------------------------------*</p> <p>COMMIT WORK & ROLLBACK WORK<br> 要确定资料成功写入资料库,可使用COMMIT WORK指令,如: <br>    COMMIT  WORK.<br> 相反的,如果反悔要复原,可使用 ROLLBACK  WORK, 可复原在上个COMMIT WORK指令之后的资料, 如:<br>    ROLLBACK  WORK.<br> *-------------------------------------------------------------------------------------*<br> 使用NATIVE SQL指令<br> 语法格式:<br> EXEC SQL [PERFORMING <form>].<br>      <statements><br> ENDEXEC.<br> 举例一.<br> EXEC SQL.<br>   CREATE TABLE AVERI_CLNT (<br>          CLIENT   CHAR(3)  NOT NULL,<br>          ARG1     CHAR(3)  NOT NULL,<br>          ARG2     CHAR(3)  NOT NULL,<br>          FUNCTION CHAR(10) NOT NULL,<br>          PRIMARY KEY (CLIENT, ARG1, ARG2)<br>                           )<br> ENDEXEC.<br> 举例二.<br> DATA: F1(3), F2(3), F3(3).<br> F3 = ' 1 '<br> EXEC SQL.<br>   SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT<br>          WHERE ARG2 = :F3<br> ENDEXEC</p> <p>PERFORMING <form name>的使用:<br> 如果NATIVE SQL的SELECT命令执行结果是抓到多笔记录,我们想要逐笔记录处理时,就用PERFORMING 参数,这个FORM能被逐次调用。如果想中止调用,就用EXIT FORM SQL结束调用。<br> 例如:<br> DATA: F1(3), F2(3), F3(3).</p> <p>F3 = '010'<br> EXEC SQL PERFORMING WRITE_AVERI_CLNT.<br>   SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT<br>          WHERE ARG2 = :F3<br> ENDEXEC.<br> FORM WRITE_AVERI_CLNT.<br>   WRITE: / F1, F2.<br> ENDFORM.</p> <p>                 DATA: BEGIN  OF  WA,<br>                         NAME(8),<br>                         AGE  TYPE  I,<br>                         END   OF  WA.<br>                  DATA  F1  TYPE  I.<br>                  FI = 20.<br>                  EXEC  SQL  PERFORMING  OUTPUT.<br>                     SELECT  NAME,AGE  INTO  :WA  FROM  NAME_TABLE <br>                              WHERE  AGE >= :F1.<br>                  ENDEXEC..<br>                  FORM  OUTPUT.<br>                    WRITE:  /  WA-NAME,WA-AGE.<br>                  ENDFORM.</p> <p>注意:<br> a. NATIVE SQL把TABLE中的MANDT(client)栏位当作一般栏位使用,所以在抓取资料时必须指定特定的Client;<br> b. NATIVE SQL中的SELECT语句没有CHECK权限的功能;<br> c. 在登入SAP R/3系统时,我们已经自动与Database连接,所以在执行NATIVE SQL时并不需要CONNECT语句;<br> d. 一条NATIVE SQL语句可以以分号;结束,一般情况下是以句号.结束.<br> e. 某些数据库系统对TABLE名字和FIELD名字有大小写区别,要正确书写.<br> f. 在NATIVE SQL中,双引号"不表示注释.<br> *-------------------------------------------------------------------------------------*</p> <p>结果语句</p> <p>条件述叙<br>    1. IF 述叙<br>   语法:<br>         IF  <Condition1>.<br>           <Statement 1 ><br>         ELSEIF  <Condition2>.<br>           <Statement 2><br>         ELSEIF  <Condition3>.<br>           <Stetement 3><br>         …..<br>         ELSE.<br>           <else Statement ><br>         ENDIF.<br>         (1).在每个判断关键字之后要加上 .<br>         (2).在巢状循环之中无法使用 ELSE 关键字, ELSE 关键字属 IF 关键字<br>         Example:<br>                  IF  3 > 8.<br>                    WRITE / '3 is less than 8'.<br>                 ENDIF.<br>                  </p> <p>2. CASE 关键字<br>   语法:<br>        CASE  <变量f>.<br>          WHEN <Value1>.<br>             <Statement1><br>          WHEN <Value2>.<br>             <Statement2><br>          ….<br>          WHEN OTHERS.<br>             <others Statement><br>        ENDCASE.<br>        Example:<br>                  S = 'A'. <br>                  CASE  S.<br>                     WHEN  'X'.<br>                        WRITE / 'String is X'.<br>                     WHEN OTHERS.<br>                        WRITE / 'String is not X'.<br>                  ENDCASE.</p> <p>循环关键字<br> 1.计次循环<br>   语法:<br>        DO  [n TIMES]  [VARYING  <f>  FROM  <start>  TO  <end>.<br>           <loop block><br>        ENDDO.<br>        Example:<br>                 DO  2  TIMES.<br>                     WRITE /  'X'.<br>                 ENDDO.<br>                 执行结果:<br>                            X<br>                            X<br>                 DO  VARYING  I  FROM 1  TO  10.<br>                    S = S + I.<br>                 ENDDO.<br>                 WRITE: / ,'1+2+3+…+10=',S<br>                 执行结果:  1+2+3+…+10=55<br>   2.条件循环<br> 语法:<br>      WHILE  <Condition>.<br>         <Statement Block><br>      ENDWHILE<br>      Example:<br>               I = 1.<br>               S=0.<br>              WHILE  I <= 10.<br>                 S = S+I.<br>                 I=I+1.<br>              ENDWHILE.<br>              WRITE: / ' 1+2+3+…+10=',S.<br>              执行结果为: 1+2+3+…+10=55</p> <p>循环控制关键字<br> 1. CONTINUE<br> 跳至循环的下一次<br> Example:<br>         DO  3  TIMES.<br>            IF  SY-INDEX = 2.<br>              CONTINUE.<br>            WRITE / SY-INDEX.<br>         ENDDO.<br>         执行结果: <br>                   1<br>                   3<br> 2. CHECK <Condition><br> CHECK 之后条件成立才继续往下执行循环<br>   Example:<br>            DO  5  TIMES.<br>               CHECK  SY-INDEX  BETWEEN  2  AND  4.<br>               WRITE  /  SY-INDEX.<br>            ENDDO.<br>            执行结果:<br>                      2<br>                      3<br>                      4<br> 3. EXIT<br> 跳离循环关键字<br> Example:<br>          DO  10  TIMES.<br>             IF  SY-INDEX = 4.<br>               EXIT.<br>             ENDIF<br>             WRITE / SY-INDEX.<br>          ENDDO.<br>          执行结果:<br>                    1<br>                    2<br>                    3</p> <p>无穷循环<br>    DO .<br>      <Statement Block><br>    ENDDO.<br>    无穷循环必须配合 EXIT 关键字来执行<br> *-------------------------------------------------------------------------------------*</p> <p>搜索字符串</p> <p>要搜索特定模式的字符串,请使用 SEARCH 语句,用法如下:<br> 语法<br> SEARCH <c> FOR <str> <options>.<br> 该语句在字段 <c> 中搜索<str> 中的字符串。如果成功,则将 SY-SUBRC 的返回代码值设置为0并将 SY-FDPOS 设置为字段 <c> 中该字符串的偏移量。否则将 SY-SUBRC 设置为4。<br> 搜索串 <str> 可为下列格 之一:<br> <str> 目 的<br> <pattern> 搜索 <pattern>( 任何字符顺序)。忽略尾部空格。<br> .<pattern>. 搜索 <pattern> ,但是不忽略尾部空格 。<br> *<pattern> 搜索以 <pattern> 结尾的词。<br> <pattern>* 搜索以 <pattern> 开始的词。<br> 单词之间用空格、逗号、句号、分号、冒号、问号、叹号、括号、斜杠、加号和等号等分隔 。</p> <p>DATA STRING(30) VALUE 'This is a little sentence.'.<br> WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.<br> ULINE /1(26).<br> SEARCH STRING FOR 'X'.<br> WRITE: / 'X', SY-SUBRC UNDER 'SY-SUBRC',<br>                SY-FDPOS UNDER 'SY-FDPOS' <br> SEARCH STRING FOR 'itt   '.<br> WRITE: / 'itt   ', SY-SUBRC UNDER 'SY-SUBRC',<br>                    SY-FDPOS UNDER 'SY-FDPOS' <br> SEARCH STRING FOR '.e .'.<br> WRITE: / '.e .', SY-SUBRC UNDER 'SY-SUBRC',<br>                   SY-FDPOS UNDER 'SY-FDPOS'.<br> SEARCH STRING FOR '*e'.<br> WRITE: / '*e ', SY-SUBRC UNDER 'SY-SUBRC',<br>                 SY-FDPOS UNDER 'SY-FDPOS'.<br> SEARCH STRING FOR 's*'.<br> WRITE: / 's* ', SY-SUBRC UNDER 'SY-SUBRC',<br>                 SY-FDPOS UNDER 'SY-FDPOS'.<br> 该过程的输 出如下:<br> SEARCHED SY-SUBRC SY-FDPOS<br> X            4        0<br> itt          0       11<br> .e .         0       15<br> *e           0       10<br> s*           0       17</p> <p>搜索字符字段 <c> 的各种选项 (<options>)如下<br>    ABBREVIATED<br> 在字段 <c> 中搜索包含 <str> 中指定字符串的单词, 其中字符可能被其它字符隔开。单词和字符串的第一个字母必须相同 。<br>    STARTING AT <n1><br> 在字段 <c> 中搜索从 <n1> 开始的 <str>。结果 SY-FDPOS 参照相对于 <n1> 的偏移量而不是字段的开始。<br>    ENDING AT <n2> <br> 在字段 <c> 搜索 <str> 直到位置 <n2>。<br>    AND MARK<br> 如果找到搜索串,则将搜索串中的所有字符(和使用 ABBREVIATED 时的所有字符)转换为大写形式。</p> <p>DATA: STRING(30) VALUE 'This is a fast first example.',<br>       POS TYPE I,<br>       OFF TYPE I.<br> WRITE / STRING.<br> SEARCH STRING FOR 'ft' ABBREVIATED.<br> WRITE: / 'SY-FDPOS:', SY-FDPOS.<br> POS = SY-FDPOS + 2.<br> SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK.<br> WRITE / STRING.<br> WRITE: / 'SY-FDPOS:', SY-FDPOS.<br> OFF = POS + SY-FDPOS -1.<br> WRITE: / 'Off:', OFF.<br> 该过程的输 出如下:<br> This is a fast first example.<br> SY-FDPOS:    10<br> This is a fast FIRST example.<br> SY-FDPOS:    4<br> Off:        15<br> 请注意,在找到单词' fast' 之后,为了查找包含' ft'的第二个单词,必须在偏移量 SY-FDPOS 上加2,然后从位置 POS 开始查找。否则,会再次找到单词 'fast'。要获得' first' 相对于字段 STRING 开始的偏移量,从 POS 和 SY-FDPOS 计算。<br> 获得字符串长度</p> <p>要决定字符串到最后一个字符而不是 SPACE 的长度,请使用内部函数 STRLEN,用法如下:<br> 语法<br> [COMPUTE] <n> = STRLEN( <c> ).<br> STRLEN 将操作数 <c> 作为字符数据类型处理,而不考虑其实际类型。不进行转换。<br> 关键字 COMPUTE 可选。有关内部函数的详细信息,参见使用数学函数(页 49) 。</p> <p>DATA: INT TYPE I,<br>       WORD1(20) VALUE '12345'. <br>       WORD2(20).<br>       WORD3(20) VALUE '   4         '. <br> INT = STRLEN( WORD1 ). WRITE   INT.<br> INT = STRLEN( WORD2 ). WRITE / INT.<br> INT = STRLEN( WORD3 ). WRITE / INT.<br> 结果分别是 5,0 和 4。<br> *-------------------------------------------------------------------------------------*</p> <p>Standard Report <br>    一个典型的报表程序是由许多的程序区块(Code Block)所组成,在区块间最好能加上一些说明以利程序可读性,一个典型的报表程序格式如下:</p> <p>*  PROGRAM SOURCE HEADER  : 说明程序名称及目的<br> * Program Name: <br> * Description:<br> * Date/Author: <br> * Table Update:<br> * Special Logic:<br> * Include:<br> *-------------------------------------------------------------------------------------*<br> *  MODIFICATION LOG : 程序修改更新记录 <br> *-------------------------------------------------------------------------------------*<br> * ChangeDate Programmer    Request      Description<br> *-------------------------------------------------------------------------------------*<br> *                                       NEW PROGRAM<br> *-------------------------------------------------------------------------------------*<br> * REPORT NAME : 声明程序名称及报表格式, <br> *-------------------------------------------------------------------------------------*<br> REPORT Z_____<br>        NO STANDARD PAGE HEADING<br>           MESSAGE-ID __    " 所使用的MESSAGE<br>           LINE-COUNT ___   " 每页报表列数<br>           LINE-SIZE  ___.  " 每页报表宽度</p> <p>*  TABLE DESCRIPTION : 声明程序会使用的TABLE</p> <p>*-------------------------------------------------------------------------------------*<br> TABLES: <br>                 <br> * DATA : 声明程序所使用的变量及自定型态<br> *-------------------------------------------------------------------------------------*<br> TYPES:</p> <p>DATA: <br>      </p> <p>*  SELECTION SCREEN / OPTION / PARAMETER : 屏幕输入报表筛选条件<br> *-------------------------------------------------------------------------------------*</p> <p>  SELECTION-SCREEN BEGIN OF BLOCK ____<br>        SELECT-OPTIONS:</p> <p>  SELECTION-SCREEN END OF BLOCK ___</p> <p>* INITIALIZATION : 启动程序开始执行, 如SELECT-OPTION及PARAMETER<br> *-------------------------------------------------------------------------------------*<br> INITIALIZATION.</p> <p>INCLUDE ____.</p> <p>* AT START SELECTION : 输入结束后启动的区块, 如按下<F8><br> *-------------------------------------------------------------------------------------*<br> START-OF-SELECTION.<br>   SET PF-STATUS ____.  " 指定报表执行时所用的 GUI-STATUS名称</p> <p>  PERFORM READ_DATA.<br>   PERFORM PROCESS_DATA.<br>   PERFORM PRINT_DATA.<br>   PERFORM PRINT_SUMMARY.</p> <p>* AT USER Commaand : 执行在GUI-STATUS中自定的命令<br> *-------------------------------------------------------------------------------------*<br> AT USER_COMMAND.</p> <p>* AT LINE SELECTION : 由在报表中按下<F2>或Double-Click启动<br> *-------------------------------------------------------------------------------------*<br> AT LINE-SELECTION.</p> <p><br> * TOP OF PGAE : 每页开始列印时执行, 用于定义报表表头<br> *-------------------------------------------------------------------------------------*</p> <p>* END OF PAGE : 报表列印完最后一页后启动 <br> *-------------------------------------------------------------------------------------*<br> END-OF-PAGE</p> <p>* END OF SELECTION : 在结束列印资料后启动, 如可用来印出USER输入的条件<br> *-------------------------------------------------------------------------------------*<br> END-OF-SELECTION.<br> INCLUDE  _____<br> * FORM : 撰写程序中所使用到的副程序<br> *-------------------------------------------------------------------------------------*<br> * Read Data : 自TABLE读取资料放入Internal Table<br> *-------------------------------------------------------------------------------------*<br> FORM READ_DATA.<br>   SELECT * FROM ______<br>            INTO _______<br>            WHERE _______.<br>      IF SY-SUBRC = 0.</p> <p>     ENDIF.<br>      APPEND _____.  " 增加Internal Table元素<br>   ENDSELECT.</p> <p>ENDFORM.</p> <p>* Process Data : 处理Internal Table的资料, 如排序及汇总<br> *-------------------------------------------------------------------------------------*<br> FORM PROCESS_DATA.</p> <p>ENDFORM.</p> <p>* Print Data : 依序输出 Internal Table的资料<br> *-------------------------------------------------------------------------------------*<br> FORM PRINT_DATA.</p> <p>ENDFORM.</p> <p>* Print Summary : 印出数值资料加总<br> *-------------------------------------------------------------------------------------*<br> FORM PRINT_SUMMARY.</p> <p>ENDFORM.</p> <p>* Include Program : 列出所含入的其它程序source code, 如副程序<br> *-------------------------------------------------------------------------------------*<br> INCLUDE _____<br> INCLUDE _____</p> <p>*-------------------------------------------------------------------------------------*<br> *<br> REPORT rep. <br> Additions: <br> 1. ... NO STANDARD PAGE HEADING <br> 2. ... LINE-SIZE col <br> 3. ... LINE-COUNT n(m)<br>             表单输出每页由n行,其中的m行作为页脚; <br> 4. ... MESSAGE-ID mid         消息对象<br> 5.  ... DEFINING DATABASE ldb <br>        使用逻辑数据库,自动产生<br> *<br> 事件块<br> INITIALIZATION<br> AT SELECTION-SCREEN<br> START-OF-SELECTION<br> GET<br> END-OF-SELECTION<br> TOP-OF-PAGE<br> END-OF-PAGE<br> *<br> 事件块的简单处理过程:<br> *<br> ABAP程序运行的时候,INITIALIZATION首先被调用;<br> 经过初始化的输入屏幕会显示在表示服务器;<br> 用户离开输入屏幕的时候,START-OF-SELCTION事件会被自动调用;<br> 结果数据会以列表的形式显示在第二个屏幕上;<br> *<br> 源代码中的事件块顺序不影响它们的执行顺序<br> *<br> 事件块编码规则(1)<br> INITIALIZATION<br>     通常在此事件块中设定输入屏幕字段的初始值<br> *<br> 事件块编码规则(2)<br> AT SELECTION-SCREEN<br>     通常在此事件块中进行用户输入数据的合法性检查,发现错误则以消息的形式给出警示,直到用户输入正确的数值<br> 例如: AT SELECTION-SCREEN .<br>                     IF P_DATE = SPACE .<br>                         MESSAGE E001 .<br>                     ENDIF.<br>     效果:如果字段P_DATE为空,则程序会用消息001“日期字段不能为空!”来提示用户必须输入一个日期。而且输入屏幕会等待用户输入,知道该字段数值合法<br> *<br> 事件块编码规则(3)<br> START-OF-SELCTION<br>     通常在此事件中针对业务需求进行系统数据的查询<br> 例如:<br>      start-of-selection .<br>           perform get_data_for_oil .<br> 效果:<br>      在输入屏幕用户按下执行按钮后,子程序get_data_for_oil被执行,在其中获得业务相关的数据存放到内表或者其它变量,这些数据在END-OF-SELECTION事件块中被输出<br> *<br> 事件块编码规则(4)<br> END-OF-SELCTION<br>     通常在此事件中进行结果清单的输出<br> 例如:<br>     end-of-selection .<br>          write : 23(1) sy-vline,<br>            24(20) tab-gas_plan right-justified ,<br> 效果:<br>     数据以清单的形式输出<br> *<br> 事件块编码规则(5)<br> GET<br>     从逻辑数据库中得到数据(较少用)</p> <p>TOP-OF-PAGE<br>     在此事件块中设计输出清单的页头<br> TOP-OF-PAGE<br>                    write : /1(240) '汽柴油日出厂情况表' centered .<br>                    write : /20(8) '日期:' ,<br>                                29(10) s_date ,<br>                                180(6) '单位:' ,<br>                                190(10) '吨' .<br> *<br> 事件块编码规则(6)<br> END-OF-PAGE<br>     在此事件中设定输出清单的页脚<br> 例如:<br>     END-OF-PAGE .<br>         Write : ‘制作人’ ,  p_name .<br> *-------------------------------------------------------------------------------------*</p> <p>*<br> 比较所有的字段类型</p> <p>要比较所有的字段类型,可以在逻辑表达式中使用下列运算符:</p> <p><运算符> 含义<br> EQ 等于<br> = 等于<br> NE 不等于<br> <> 不等于<br> >< 不等于<br> LT 小于</p> <p> </p> <p>                                                           ------------------转自360文档</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1606210100790329344"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(SAP)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950232316974526464.htm" title="(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析" target="_blank">(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析</a> <span class="text-muted"></span> <div>数据如何从子公司流转到合并报表的全过程,即数据采集→合并引擎→报表输出,特别是HANA内存计算如何优化传统ETL瓶颈。SAPGroupReporting(GR)核心模块功能及数据流向的架构解析,涵盖核心组件、数据处理流程和关键集成点,适用于S/4HANA1809+版本:一、核心功能模块概览模块功能关键事务码/FioriApp数据采集(DataCollection)整合子公司财务数据(SAP/非SA</div> </li> <li><a href="/article/1950158347130957824.htm" title="iOS开发-一个App唤醒另外一个App" target="_blank">iOS开发-一个App唤醒另外一个App</a> <span class="text-muted">善良的皮蛋</span> <div>唤醒App前期准备唤醒App前言:工作中的需求要求在一个App内点击唤醒另外一个App类似很多App可以唤醒淘宝或者京东。1.准备工作1.新建两个App,MyAppOne(触发唤醒的App)、MyAppTow(要唤醒的App)2.iOS9之后要在info.plist中添加白名单,否则无法唤醒。设置白名单LSApplicationQueriesSchemesweixinURLScheme在MyApp</div> </li> <li><a href="/article/1950095270544994304.htm" title="从零入门:云迁移原理详解与华为Rainbow实战指南" target="_blank">从零入门:云迁移原理详解与华为Rainbow实战指南</a> <span class="text-muted">来自于狂人</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E8%AE%A1%E7%AE%97/1.htm">云计算</a> <div>(全文较长,建议收藏后分段阅读)一、云迁移基础:新手必懂的10个核心概念1.云迁移的定义与战略价值权威定义:Gartner将云迁移定义为"将企业IT资产、应用和工作负载从传统本地环境(物理服务器、私有数据中心)迁移到云平台(公有云/混合云)的过程"。其本质是通过云技术实现资源弹性扩展、成本优化和业务创新。典型应用场景:业务系统上云:ERP(如SAP)、CRM(如Salesforce)等核心系统迁移</div> </li> <li><a href="/article/1950002983613820928.htm" title="前端基础知识Vue3系列 - 04(Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同)" target="_blank">前端基础知识Vue3系列 - 04(Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同)</a> <span class="text-muted"></span> <div>开始之前CompositionAPI可以说是Vue3的最大特点,那么为什么要推出CompositionApi,解决了什么问题?通常使用Vue2开发的项目,普遍会存在以下问题:代码的可读性随着组件变大而变差每一种代码复用的方式,都存在缺点TypeScript支持有限以上通过使用CompositionApi都能迎刃而解正文一、OptionsApiOptionsAPI,即大家常说的选项API,即以vue</div> </li> <li><a href="/article/1949958340201213952.htm" title="SAP BW数据仓库总览" target="_blank">SAP BW数据仓库总览</a> <span class="text-muted">weixin_42559081</span> <div>[分享]SAPBW数据仓库简介本文从一个简单的业务场景-销售分析入手,介绍SAPBW(BusinessInfomationWarehouse)实现多维分析的基本方案与实现技术;结合销售分析的实际需求,给出了销售分析管理数据仓库在SAPBW(业务信息仓库)模块中的实现过程描述。1、数据仓库的基本理论1.1数据仓库数据仓库是对数据进行提炼、加工和集成含有一定量商务信息和意义的信息。数据仓库不是为了存储</div> </li> <li><a href="/article/1949957206216601600.htm" title="SAP模块介绍" target="_blank">SAP模块介绍</a> <span class="text-muted">wai631</span> <a class="tag" taget="_blank" href="/search/Enterprise/1.htm">Enterprise</a><a class="tag" taget="_blank" href="/search/Resource/1.htm">Resource</a><a class="tag" taget="_blank" href="/search/Planning%28ERP%29/1.htm">Planning(ERP)</a><a class="tag" taget="_blank" href="/search/sap/1.htm">sap</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E6%8B%9B%E8%81%98/1.htm">招聘</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%A1%A3/1.htm">文档</a><a class="tag" taget="_blank" href="/search/%E7%89%A9%E6%B5%81/1.htm">物流</a> <div>SAP系统包含大量模块,这些模块共同发挥作用来执行公司的业务管理任务。简单的说是将企业的三大流:物流,资金流,信息流进行全面一体化管理的管理信息系统。在企业中,这三大系统本身就是集成体,它们互相之间有相应的接口,能够很好的整合在一起来对企业进行管理。在管理功能上,它共有12个系统模块:(1)财务会计模块(FI),它可提供应收、应付、总账、合并、投资、基金、现金管理等功能,这些功能可以根据各分支机构</div> </li> <li><a href="/article/1949850760732798976.htm" title="SAP FICO基础知识解析" target="_blank">SAP FICO基础知识解析</a> <span class="text-muted">金融业务专家</span> <a class="tag" taget="_blank" href="/search/SAP/1.htm">SAP</a> <div>SAPFICO基础知识解析SAPFICO是SAP系统的核心财务模块,由财务会计(FI)和管理会计(CO)两大模块组成,覆盖企业从日常账务处理到战略成本控制的全流程管理。以下从模块组成、核心功能、组织架构、集成及学习路径等方面梳理其核心要点:一、模块组成与核心功能FI(财务会计)定位:面向外部合规需求,按会计准则(如IFRS、中国会计准则)记录企业经济活动,生成法定财务报表。核心子模块:总账(GL)</div> </li> <li><a href="/article/1949777736079831040.htm" title="音视频流媒体开发【七十二】- RTSP流媒体7-SDP协议分析" target="_blank">音视频流媒体开发【七十二】- RTSP流媒体7-SDP协议分析</a> <span class="text-muted">AlanGe</span> <div>音视频流媒体开发-目录iOS知识点-目录Android-目录Flutter-目录数据结构与算法-目录uni-pp-目录SDP(SessionDescriptionProtocol)完全是⼀种会话描述格式―它不属于传输协议―它只使⽤不同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP)、MIME扩展协议的电⼦邮件以及超⽂本传输协议(HTTP)。SDP协议是也</div> </li> <li><a href="/article/1949649045467230208.htm" title="28、深入了解Kubernetes对象与EKS集群部署" target="_blank">28、深入了解Kubernetes对象与EKS集群部署</a> <span class="text-muted">week9</span> <a class="tag" taget="_blank" href="/search/AWS%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98%EF%BC%9A%E4%BB%8E%E7%90%86%E8%AE%BA%E5%88%B0%E5%AE%9E%E8%B7%B5/1.htm">AWS微服务实战:从理论到实践</a><a class="tag" taget="_blank" href="/search/Kubernetes/1.htm">Kubernetes</a><a class="tag" taget="_blank" href="/search/EKS/1.htm">EKS</a><a class="tag" taget="_blank" href="/search/Ingress/1.htm">Ingress</a> <div>深入了解Kubernetes对象与EKS集群部署1.Kubernetes对象概述Kubernetes中有多种重要对象,它们在集群的运行和管理中发挥着关键作用。-Ingress:Ingress是一个KubernetesAPI对象,用于管理集群中服务的外部HTTP/HTTPS流量。它通过Ingress配置中定义的规则,将集群外部的流量路由暴露给服务。Deployment用于创建Pod,ReplicaS</div> </li> <li><a href="/article/1949559654753300480.htm" title="SAP全自动化工具开发:Excel自动上传与邮件通知系统" target="_blank">SAP全自动化工具开发:Excel自动上传与邮件通知系统</a> <span class="text-muted">pk_xz123456</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a><a class="tag" taget="_blank" href="/search/excel/1.htm">excel</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E7%B1%BB/1.htm">分类</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>SAP全自动化工具开发:Excel自动上传与邮件通知系统前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,觉得好请收藏。点击跳转到网站。1.项目概述在现代企业资源规划(ERP)系统中,SAP作为行业领先的解决方案,其自动化处理能力对企业运营效率至关重要。本文将详细介绍如何使用Python开发一个全自动化工具,实现Excel数据自动上传至SAP系统,并在操作完成后发送</div> </li> <li><a href="/article/1949554233095286784.htm" title="【vue-8】Vue3 Options API 生命周期函数全面解析" target="_blank">【vue-8】Vue3 Options API 生命周期函数全面解析</a> <span class="text-muted">AllenBright</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>在Vue.js开发中,理解组件的生命周期是构建健壮应用程序的关键。虽然Vue3引入了CompositionAPI,但OptionsAPI仍然是许多开发者的首选,特别是对于从Vue2迁移的项目或更喜欢基于选项的代码组织的团队。本文将深入探讨Vue3中OptionsAPI的生命周期函数,帮助您掌握组件从创建到销毁的完整过程。1.生命周期概览Vue3的生命周期与Vue2相比有一些变化,主要是为了更好的支</div> </li> <li><a href="/article/1949512612643401728.htm" title="50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | NotesApp(便签笔记组件)" target="_blank">50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | NotesApp(便签笔记组件)</a> <span class="text-muted">sunbyte</span> <a class="tag" taget="_blank" href="/search/TailiwindCSS/1.htm">TailiwindCSS</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/1.htm">实战指南</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/tailwindcss/1.htm">tailwindcss</a> <div>我们继续50个小项目挑战!——NotesApp组件仓库地址:https://github.com/SunACong/50-vue-projects项目预览地址:https://50-vue-projects.vercel.app/。使用Vue3的CompositionAPI搭配TailwindCSS和marked库,构建一个支持Markdown渲染的笔记应用。该应用允许用户添加、编辑、删除笔记,并</div> </li> <li><a href="/article/1949417803450740736.htm" title="使用python调用DeepSeek接口的几种方法" target="_blank">使用python调用DeepSeek接口的几种方法</a> <span class="text-muted">xiekj</span> <a class="tag" taget="_blank" href="/search/%E7%A0%94%E5%8F%91%E7%AE%A1%E7%90%86/1.htm">研发管理</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a> <div>一、调用DeepSeekText模型的方式DeepSeek提供了多种方式来调用其文本模型,以下是主要的调用方式:1.API调用(推荐)importrequestsAPI_URL="https://api.deepseek.com/v1/chat/completions"API_KEY="your_api_key_here"headers={"Authorization":f"Bearer{API_</div> </li> <li><a href="/article/1949302559814512640.htm" title="解密 SAP CRM WebUI 内容管理集成:SMCCMBO 与 SMCOV 组件的导航链路全流程解析" target="_blank">解密 SAP CRM WebUI 内容管理集成:SMCCMBO 与 SMCOV 组件的导航链路全流程解析</a> <span class="text-muted">汪子熙</span> <a class="tag" taget="_blank" href="/search/ABAP/1.htm">ABAP</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E7%A7%91%E5%85%A8%E4%B9%A6/1.htm">百科全书</a><a class="tag" taget="_blank" href="/search/sap/1.htm">sap</a><a class="tag" taget="_blank" href="/search/abap/1.htm">abap</a><a class="tag" taget="_blank" href="/search/NetWeaver/1.htm">NetWeaver</a><a class="tag" taget="_blank" href="/search/%E6%80%9D%E7%88%B1%E6%99%AE/1.htm">思爱普</a> <div>在许多实施项目中,需要把SAPCRM的内容管理系统(ContentManagement,简称CM)无缝嵌入到业务对象的UI逻辑里,而官方提供的SMCCMBO与SMCOV这对“包装组件+概览页面组件”正是连接业务视图与AttachmentProperty高级附件界面的桥梁。本文基于官方帮助文档与社区经验,总结了Advanced按钮点击后从SMCOV到CM高级页面的四级导航链路实现细节,并给出可复用的</div> </li> <li><a href="/article/1949300540689149952.htm" title="SAP-ABAP:SAP的MIGO增强IF_EX_MB_MIGO_BADI~CHECK_ITEM方法深度解析" target="_blank">SAP-ABAP:SAP的MIGO增强IF_EX_MB_MIGO_BADI~CHECK_ITEM方法深度解析</a> <span class="text-muted"></span> <div>SAP的MIGO增强IF_EX_MB_MIGO_BADI~CHECK_ITEM方法深度解析一、核心功能与触发机制关键特性详细说明核心作用对MIGO行项目执行自定义业务校验(字段规则/业务逻辑/数据一致性)触发时机用户点击保存按钮时,系统生成物料凭证前执行粒度逐行项目执行(需全局缓存实现跨行校验)必备依赖必须结合LINE_MODIFY方法缓存行项目数据二、关键技术实现1.行项目数据缓存(跨行校验基础</div> </li> <li><a href="/article/1949300414323159040.htm" title="SAP-ABAP:SAP中工单号(生产订单号,Order Number)、预留号(Reservation Number)、凭证号(Material Document Number)三者的关系详解" target="_blank">SAP-ABAP:SAP中工单号(生产订单号,Order Number)、预留号(Reservation Number)、凭证号(Material Document Number)三者的关系详解</a> <span class="text-muted">爱喝水的鱼丶</span> <a class="tag" taget="_blank" href="/search/vip/1.htm">vip</a><a class="tag" taget="_blank" href="/search/SAP/1.htm">SAP</a><a class="tag" taget="_blank" href="/search/ABAP/1.htm">ABAP</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在SAP系统中,工单号(生产订单号,OrderNumber)、预留号(ReservationNumber)和凭证号(MaterialDocumentNumber)三者之间的关联关系贯穿于生产、物料管理和库存操作的全流程。以下是它们的逻辑关系及对应数据库表:1.核心关系流程图工单号(AUFNR)→预留号(RSNUM)→凭证号(MBLNR)工单号驱动预留号的生成(如生产领料需求)。预留号被消耗时生成凭</div> </li> <li><a href="/article/1949293860446334976.htm" title="SAP-ABAP:SAP DMS(文档管理系统)的详细说明,涵盖其核心功能、架构、配置及实际应用" target="_blank">SAP-ABAP:SAP DMS(文档管理系统)的详细说明,涵盖其核心功能、架构、配置及实际应用</a> <span class="text-muted">爱喝水的鱼丶</span> <a class="tag" taget="_blank" href="/search/vip/1.htm">vip</a><a class="tag" taget="_blank" href="/search/SAP/1.htm">SAP</a><a class="tag" taget="_blank" href="/search/ABAP/1.htm">ABAP</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/DMS/1.htm">DMS</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%A1%A3%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/1.htm">文档管理系统</a> <div>1.DMS概述SAPDMS(DocumentManagementSystem)是SAP系统中用于管理企业文档的核心模块,支持文档的全生命周期管理(创建、存储、版本控制、审批、归档)。它与其他模块(如物料管理MM、生产计划PP、设备维护PM)深度集成,确保文档与业务对象的无缝关联。2.DMS核心功能文档存储:支持多种格式(PDF、CAD、图像、Office文档等)。版本控制:跟踪文档变更历史,支持回</div> </li> <li><a href="/article/1949207927952830464.htm" title="微信小程序打夯之旅(六):支付流程" target="_blank">微信小程序打夯之旅(六):支付流程</a> <span class="text-muted">But昊</span> <div>支付流程示意图预支付(请求后台,后台请求微信服务获取支付信息)调用API发起支付:wx.requestPayment({})imagejsAPI、jsSDK、小程序支付的对比(开发步骤)对比栏目JSAPIJSSDK小程序统一下单都需要先获取到Openid,调用相同的API同同调起数据签名五个字段参与签名(区分大小写):appId,nonceStr,package,signType,timeStam</div> </li> <li><a href="/article/1949153682725597184.htm" title="别人否定你的时候更要相信自己" target="_blank">别人否定你的时候更要相信自己</a> <span class="text-muted">快乐有你_1ec8</span> <div>多年之后我才明白这个道理。Ittookmewaytoolongtolearnthis.我意识到自己被不怀好意的人包围,当然他们的目标是困住我的手脚,让我飞不起来。IrealizeIwasjustsurroundedbytoxicpeople,ofcoursetheirobjectivewastocutmedown.嫉妒是一种毒药。Jealousyisapoison.直到最后,我从这些人的恶意中脱身</div> </li> <li><a href="/article/1949088692467462144.htm" title="学习日记-机器学习2-线性回归/成本函数" target="_blank">学习日记-机器学习2-线性回归/成本函数</a> <span class="text-muted"></span> <div>目录4LinerRegressionModel线性回归模型5costFunction成本函数4LinerRegressionModel线性回归模型Thelinearregressionmodelisaparticulartypeofsupervisedlearningmodel.TerminologyTrainingset(训练集):DatausedtotrainthemodelNotationx</div> </li> <li><a href="/article/1948940689140150272.htm" title="WS APP机器人源码搭建全攻略:部署步骤详解" target="_blank">WS APP机器人源码搭建全攻略:部署步骤详解</a> <span class="text-muted">fhdjhjlk</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">机器人</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>一、明确需求,选择工具首先,你需要明确你的WSAPP机器人需要实现哪些功能,比如自动回复、消息推送、数据分析等。由于WSAPP官方并未直接提供机器人开发接口,你需要借助第三方服务如Twilio、Infobip等,它们提供了丰富的API和文档支持,是搭建WSAPP机器人的理想选择。二、注册账号,获取权限在选定平台后,前往其官网注册账号并完成必要的认证流程。这通常包括填写基本信息、验证手机号码等步骤。</div> </li> <li><a href="/article/1948901475648335872.htm" title="Spark核心--RDD介绍" target="_blank">Spark核心--RDD介绍</a> <span class="text-muted">陆水A</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>一、RDD的介绍rdd弹性分布式数据集是spark框架自己封装的数据类型,用来管理内存数据数据集:rdd数据的格式类似Python中[]。hive中的该结构[]叫数组rdd提供算子(方法)方便开发人员进行调用计算数据在pysaprk中本质是定义一个rdd类型用来管理和计算内存数据分布式:rdd可以时使用多台机器的内存资源完成计算弹性:可以通过分区将数据分成多份234,每份数据对应一个task线程处</div> </li> <li><a href="/article/1948894291036270592.htm" title="iOS 审核 4.3(a) 【一切源于机审】" target="_blank">iOS 审核 4.3(a) 【一切源于机审】</a> <span class="text-muted">xsooop</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/flutter/1.htm">flutter</a><a class="tag" taget="_blank" href="/search/cocos2d/1.htm">cocos2d</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a> <div>你最近提审iOSAPP是否最近遇到了4.3a?还在分析判断是否是机审打回还是人工打回?答案:这一切都源于机审这篇文章对你来说可能非常重要,记得收藏回家慢慢看,有问题直接联系我我们来根据审核时长分析几种情况:1:你的APP审核不到十分钟被打回4.3a审核时长极短,基本可以认为是机审直接打回,但也不完全确定,(因为遇到有十分钟打回并附有截图,这种带截图的可以断定是人工.不过这种情况较少,比较特殊),十</div> </li> <li><a href="/article/1948883950952837120.htm" title="chatgpt API绘图 —— gpt-image-1" target="_blank">chatgpt API绘图 —— gpt-image-1</a> <span class="text-muted">外星人AI</span> <a class="tag" taget="_blank" href="/search/AI%E7%BB%98%E7%94%BB%E7%BC%96%E7%A8%8B/1.htm">AI绘画编程</a><a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/gpt/1.htm">gpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/gpt-image-1/1.htm">gpt-image-1</a><a class="tag" taget="_blank" href="/search/ai%E7%BB%98%E7%94%BB/1.htm">ai绘画</a> <div>官方API文档:https://platform.openai.com/docs/guides/image-generation?image-generation-model=gpt-image-1概述OpenAIAPI允许您使用GPTImage或DALL·E模型根据文本提示生成和编辑图像。目前,图片生成功能仅支持通过ImageAPI实现。我们正在积极扩展对ResponsesAPI的支持。["Im</div> </li> <li><a href="/article/1948853456009752576.htm" title="Complete Guide to Integrating Live Chat Support on Your Website" target="_blank">Complete Guide to Integrating Live Chat Support on Your Website</a> <span class="text-muted">adminwolf</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91/1.htm">个人开发</a> <div>Integratinglivechatfunctionalityintoyourwebsiteisapowerfulwaytoenhanceuserexperienceanddrivebusinessconversions.Thisguideprovidesstep-by-stepinstructionsonhowtoseamlesslyembedanonlineconsultationfeatu</div> </li> <li><a href="/article/1948754727160311808.htm" title="微信收款如何避免风控,怎样收款不被大数据监控" target="_blank">微信收款如何避免风控,怎样收款不被大数据监控</a> <span class="text-muted">神州网络公司</span> <div>想必现在很多做线上生意的大老板一定很头疼,是不是收几笔就风控限制了,严重的账号直接封禁,按照规定,静态收款码原则上是禁止用于远程非面对面收款。这也是为什么很多人异地收款会被限制的原因!那怎么破?最直接的方法就是搭建系统,对接微信公众号或者小程序,使用微信支付商户号JSAPI支付进行收款,就可以解决远程异地收款限制问题了!很多商家都遇到过这种问题,收款过程中被弹出风险提醒,或者有人会被直接限制了收款</div> </li> <li><a href="/article/1948740610856906752.htm" title="C# + Windows API:内存操作的黑科技实战指南" target="_blank">C# + Windows API:内存操作的黑科技实战指南</a> <span class="text-muted"></span> <div>你是否遇到过这些场景?想调试一个不支持调试器的游戏,却只能对着一片黑暗的内存地址发呆?想实现跨进程通信,却发现MemoryStream和Socket都不够“暴力”?想分析程序崩溃时的堆栈,却发现Exception类永远“捕不到真相”?今天,我们就用C#+WindowsAPI的组合拳,教你如何:读写任意进程的内存(比如修改游戏金币)。创建共享内存(实现跨进程的“心灵感应”)。安全地操作内存(避开“段</div> </li> <li><a href="/article/1948667996000022528.htm" title="vue 中什么场景使用 export default 和setup()" target="_blank">vue 中什么场景使用 export default 和setup()</a> <span class="text-muted"></span> <div>在Vue3中,exportdefault和setup()的使用场景主要取决于你采用的组件开发模式(OptionsAPI或CompositionAPI)。以下是具体场景和用法:1.使用exportdefault的场景场景1:OptionsAPI组件传统开发模式:如果你使用Vue2风格的OptionsAPI(基于对象配置),组件的所有逻辑都通过data、methods、computed等选项定义。如何</div> </li> <li><a href="/article/1948614926872408064.htm" title="黑客如何定位服务器真实IP?3种技术手段解析" target="_blank">黑客如何定位服务器真实IP?3种技术手段解析</a> <span class="text-muted">群联云防护小杜</span> <a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB/1.htm">安全问题汇总</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/ddos/1.htm">ddos</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a> <div>一、黑客常用定位技术DNS历史记录查询通过查询域名的历史解析记录获取原始IP:importdns.resolverimportrequestsdefcheck_dns_history(domain):#使用SecurityTrailsAPI查询历史DNS记录api_key="YOUR_API_KEY"url=f"https://api.securitytrails.com/v1/history/{</div> </li> <li><a href="/article/1948614673926516736.htm" title="springboot 启动读取配置" target="_blank">springboot 启动读取配置</a> <span class="text-muted">MuYan~</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>@Slf4j@ComponentpublicclassBaseConfigimplementsApplicationRunner{  @Autowired  privateEnvironmentenvironment;     publicstaticStringpro1;  publicstaticStringpro2;  publicstaticStringpro3;    @Override</div> </li> <li><a href="/article/101.htm" title="数据采集高并发的架构应用" target="_blank">数据采集高并发的架构应用</a> <span class="text-muted">3golden</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a> <div>问题的出发点:          最近公司为了发展需要,要扩大对用户的信息采集,每个用户的采集量估计约2W。如果用户量增加的话,将会大量照成采集量成3W倍的增长,但是又要满足日常业务需要,特别是指令要及时得到响应的频率次数远大于预期。       &n</div> </li> <li><a href="/article/228.htm" title="不停止 MySQL 服务增加从库的两种方式" target="_blank">不停止 MySQL 服务增加从库的两种方式</a> <span class="text-muted">brotherlamp</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux%E8%A7%86%E9%A2%91/1.htm">linux视频</a><a class="tag" taget="_blank" href="/search/linux%E8%B5%84%E6%96%99/1.htm">linux资料</a><a class="tag" taget="_blank" href="/search/linux%E6%95%99%E7%A8%8B/1.htm">linux教程</a><a class="tag" taget="_blank" href="/search/linux%E8%87%AA%E5%AD%A6/1.htm">linux自学</a> <div>现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库。前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作。  一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabacku</div> </li> <li><a href="/article/355.htm" title="Quartz——SimpleTrigger触发器" target="_blank">Quartz——SimpleTrigger触发器</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/SimpleTrigger/1.htm">SimpleTrigger</a><a class="tag" taget="_blank" href="/search/TriggerUtils/1.htm">TriggerUtils</a><a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2208166 一.概述 SimpleTrigger触发器,当且仅需触发一次或者以固定时间间隔周期触发执行;   二.SimpleTrigger的构造函数 SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称; Simpl</div> </li> <li><a href="/article/482.htm" title="Informatica应用(1)" target="_blank">Informatica应用(1)</a> <span class="text-muted">18289753290</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/lookup/1.htm">lookup</a><a class="tag" taget="_blank" href="/search/%E7%BB%84%E4%BB%B6/1.htm">组件</a><a class="tag" taget="_blank" href="/search/Informatica/1.htm">Informatica</a> <div>1.如果要在workflow中调用shell脚本有一个command组件,在里面设置shell的路径;调度wf可以右键出现schedule,现在用的是HP的tidal调度wf的执行。 2.designer里面的router类似于SSIS中的broadcast(多播组件);Reset_Workflow_Var:参数重置 (比如说我这个参数初始是1在workflow跑得过程中变成了3我要在结束时还要</div> </li> <li><a href="/article/609.htm" title="python 获取图片验证码中文字" target="_blank">python 获取图片验证码中文字</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>根据现成的开源项目 http://code.google.com/p/pytesser/改写 在window上用easy_install安装不上  看了下源码发现代码很少  于是就想自己改写一下   添加支持网络图片的直接解析   #coding:utf-8 #import sys #reload(sys) #sys.s</div> </li> <li><a href="/article/736.htm" title="AJAX" target="_blank">AJAX</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>1.AJAX功能:动态更新页面,减少流量消耗,减轻服务器负担   2.代码结构:    <html> <head> <script type="text/javascript"> function loadXMLDoc() { .... AJAX script goes here ... </div> </li> <li><a href="/article/863.htm" title="创业OR读研" target="_blank">创业OR读研</a> <span class="text-muted">随便小屋</span> <a class="tag" taget="_blank" href="/search/%E5%88%9B%E4%B8%9A/1.htm">创业</a> <div>        现在研一,有种想创业的想法,不知道该不该去实施。因为对于的我情况这两者是矛盾的,可能就是鱼与熊掌不能兼得。                研一的生活刚刚过去两个月,我们学校主要的是</div> </li> <li><a href="/article/990.htm" title="需求做得好与坏直接关系着程序员生活质量" target="_blank">需求做得好与坏直接关系着程序员生活质量</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/IT+%E7%94%9F%E6%B4%BB/1.htm">IT 生活</a> <div>         这个故事还得从去年换工作的事情说起,由于自己不太喜欢第一家公司的环境我选择了换一份工作。去年九月份我入职现在的这家公司,专门从事金融业内软件的开发。十一月份我们整个项目组前往北京做现场开发,从此苦逼的日子开始了。        系统背景:五月份就有同事前往甲方了解需求一直到6月份,后续几个月也完</div> </li> <li><a href="/article/1117.htm" title="如何定义和区分高级软件开发工程师" target="_blank">如何定义和区分高级软件开发工程师</a> <span class="text-muted">aoyouzi</span> <div>在软件开发领域,高级开发工程师通常是指那些编写代码超过 3 年的人。这些人可能会被放到领导的位置,但经常会产生非常糟糕的结果。Matt Briggs 是一名高级开发工程师兼 Scrum 管理员。他认为,单纯使用年限来划分开发人员存在问题,两个同样具有 10 年开发经验的开发人员可能大不相同。近日,他发表了一篇博文,根据开发者所能发挥的作用划分软件开发工程师的成长阶段。   初</div> </li> <li><a href="/article/1244.htm" title="Servlet的请求与响应" target="_blank">Servlet的请求与响应</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/get%E6%8F%90%E4%BA%A4/1.htm">get提交</a><a class="tag" taget="_blank" href="/search/java%E5%A4%84%E7%90%86post%E6%8F%90%E4%BA%A4/1.htm">java处理post提交</a> <div>  Servlet是tomcat中的一个重要组成,也是负责客户端和服务端的中介     1,Http的请求方式(get  ,post);   客户端的请求一般都会都是Servlet来接受的,在接收之前怎么来确定是那种方式提交的,以及如何反馈,Servlet中有相应的方法,  http的get方式 servlet就是都doGet(</div> </li> <li><a href="/article/1371.htm" title="web.xml配置详解之listener" target="_blank">web.xml配置详解之listener</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/listener/1.htm">listener</a> <div>一.定义 <listener> <listen-class>com.myapp.MyListener</listen-class> </listener>   二.作用        该元素用来注册一个监听器类。可以收到事件什么时候发生以及用什么作为响</div> </li> <li><a href="/article/1498.htm" title="Web页面性能优化(yahoo技术)" target="_blank">Web页面性能优化(yahoo技术)</a> <span class="text-muted">Bill_chen</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/Yahoo/1.htm">Yahoo</a> <div>1.尽可能的减少HTTP请求数 content 2.使用CDN server 3.添加Expires头(或者 Cache-control) server 4.Gzip 组件 server 5.把CSS样式放在页面的上方。 css 6.将脚本放在底部(包括内联的) javascript 7.避免在CSS中使用Expressions css 8.将javascript和css独立成外部文</div> </li> <li><a href="/article/1625.htm" title="【MongoDB学习笔记八】MongoDB游标、分页查询、查询结果排序" target="_blank">【MongoDB学习笔记八】MongoDB游标、分页查询、查询结果排序</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>游标   游标,简单的说就是一个查询结果的指针。游标作为数据库的一个对象,使用它是包括 声明 打开 循环抓去一定数目的文档直到结果集中的所有文档已经抓取完 关闭游标   游标的基本用法,类似于JDBC的ResultSet(hasNext判断是否抓去完,next移动游标到下一条文档),在获取一个文档集时,可以提供一个类似JDBC的FetchSize</div> </li> <li><a href="/article/1752.htm" title="ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法" target="_blank">ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/ORA-12514/1.htm">ORA-12514</a> <div> 今天通过Oracle SQL*Plus连接远端服务器的时候提示“监听程序当前无法识别连接描述符中请求服务”,遂在网上找到了解决方案: ①打开Oracle服务器安装目录\NETWORK\ADMIN\listener.ora文件,你会看到如下信息:   # listener.ora Network Configuration File: D:\database\Oracle\net</div> </li> <li><a href="/article/1879.htm" title="Eclipse 问题 A resource exists with a different case" target="_blank">Eclipse 问题 A resource exists with a different case</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a> <div>在使用Eclipse进行开发的时候,出现了如下的问题: Description Resource Path Location TypeThe project was not built due to "A resource exists with a different case: '/SeenTaoImp_zhV2/bin/seentao'.&</div> </li> <li><a href="/article/2006.htm" title="编程之美-小飞的电梯调度算法" target="_blank">编程之美-小飞的电梯调度算法</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> public class AptElevator { /** * 编程之美 小飞 电梯调度算法 * 在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。 * 所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。 * 在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。 * 问:电梯停在哪</div> </li> <li><a href="/article/2133.htm" title="SQL注入相关概念" target="_blank">SQL注入相关概念</a> <span class="text-muted">chenbowen00</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 首先让我们了解什么时候可能发生SQ</div> </li> <li><a href="/article/2260.htm" title="[光与电]光子信号战防御原理" target="_blank">[光与电]光子信号战防御原理</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%8E%9F%E7%90%86/1.htm">原理</a> <div>       无论是在战场上,还是在后方,敌人都有可能用光子信号对人体进行控制和攻击,那么采取什么样的防御方法,最简单,最有效呢?       我们这里有几个山寨的办法,可能有些作用,大家如果有兴趣可以去实验一下       根据光</div> </li> <li><a href="/article/2387.htm" title="oracle 11g新特性:Pending Statistics" target="_blank">oracle 11g新特性:Pending Statistics</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/dbms_stats/1.htm">dbms_stats</a> <div>oracle 11g新特性:Pending Statistics 转 从11g开始,表与索引的统计信息收集完毕后,可以选择收集的统信息立即发布,也可以选择使新收集的统计信息处于pending状态,待确定处于pending状态的统计信息是安全的,再使处于pending状态的统计信息发布,这样就会避免一些因为收集统计信息立即发布而导致SQL执行计划走错的灾难。 在 11g 之前的版本中,D</div> </li> <li><a href="/article/2514.htm" title="快速理解RequireJs" target="_blank">快速理解RequireJs</a> <span class="text-muted">dengkane</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/requirejs/1.htm">requirejs</a> <div>RequireJs已经流行很久了,我们在项目中也打算使用它。它提供了以下功能: 声明不同js文件之间的依赖 可以按需、并行、延时载入js库 可以让我们的代码以模块化的方式组织 初看起来并不复杂。 在html中引入requirejs 在HTML中,添加这样的 <script> 标签: <script src="/path/to</div> </li> <li><a href="/article/2641.htm" title="C语言学习四流程控制if条件选择、for循环和强制类型转换" target="_blank">C语言学习四流程控制if条件选择、for循环和强制类型转换</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div># include <stdio.h> int main(void) { int i, j; scanf("%d %d", &i, &j); if (i > j) printf("i大于j\n"); else printf("i小于j\n"); retu</div> </li> <li><a href="/article/2768.htm" title="dictionary的使用要注意" target="_blank">dictionary的使用要注意</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/IO/1.htm">IO</a> <div>NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: user.user_id , @"id", user.username , @"username", </div> </li> <li><a href="/article/2895.htm" title="Android 中的资源访问(Resource)" target="_blank">Android 中的资源访问(Resource)</a> <span class="text-muted">finally_m</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/String/1.htm">String</a><a class="tag" taget="_blank" href="/search/drawable/1.htm">drawable</a><a class="tag" taget="_blank" href="/search/color/1.htm">color</a> <div> 简单的说,Android中的资源是指非代码部分。例如,在我们的Android程序中要使用一些图片来设置界面,要使用一些音频文件来设置铃声,要使用一些动画来显示特效,要使用一些字符串来显示提示信息。那么,这些图片、音频、动画和字符串等叫做Android中的资源文件。 在Eclipse创建的工程中,我们可以看到res和assets两个文件夹,是用来保存资源文件的,在assets中保存的一般是原生</div> </li> <li><a href="/article/3022.htm" title="Spring使用Cache、整合Ehcache" target="_blank">Spring使用Cache、整合Ehcache</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a><a class="tag" taget="_blank" href="/search/ehcache/1.htm">ehcache</a><a class="tag" taget="_blank" href="/search/%40Cacheable/1.htm">@Cacheable</a> <div>Spring使用Cache            从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的</div> </li> <li><a href="/article/3149.htm" title="当druid遇上oracle blob(clob)" target="_blank">当druid遇上oracle blob(clob)</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>http://blog.csdn.net/renfufei/article/details/44887371 众所周知,Oracle有很多坑, 所以才有了去IOE。 在使用Druid做数据库连接池后,其实偶尔也会碰到小坑,这就是使用开源项目所必须去填平的。【如果使用不开源的产品,那就不是坑,而是陷阱了,你都不知道怎么去填坑】 用Druid连接池,通过JDBC往Oracle数据库的</div> </li> <li><a href="/article/3276.htm" title="easyui datagrid pagination获得分页页码、总页数等信息" target="_blank">easyui datagrid pagination获得分页页码、总页数等信息</a> <span class="text-muted">ldzyz007</span> <div>var grid = $('#datagrid');  var options = grid.datagrid('getPager').data("pagination").options;  var curr = options.pageNumber;  var total = options.total;  var max =</div> </li> <li><a href="/article/3403.htm" title="浅析awk里的数组" target="_blank">浅析awk里的数组</a> <span class="text-muted">nigelzeng</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a><a class="tag" taget="_blank" href="/search/array/1.htm">array</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/awk/1.htm">awk</a> <div>awk绝对是文本处理中的神器,它本身也是一门编程语言,还有许多功能本人没有使用到。这篇文章就单单针对awk里的数组来进行讨论,如何利用数组来帮助完成文本分析。   有这么一组数据:   abcd,91#31#2012-12-31 11:24:00 case_a,136#19#2012-12-31 11:24:00 case_a,136#23#2012-12-31 1</div> </li> <li><a href="/article/3530.htm" title="搭建 CentOS 6 服务器(6) - TigerVNC" target="_blank">搭建 CentOS 6 服务器(6) - TigerVNC</a> <span class="text-muted">rensanning</span> <a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a> <div>安装GNOME桌面环境 # yum groupinstall "X Window System" "Desktop" 安装TigerVNC # yum -y install tigervnc-server tigervnc 启动VNC服务 # /etc/init.d/vncserver restart # vncser</div> </li> <li><a href="/article/3657.htm" title="Spring 数据库连接整理" target="_blank">Spring 数据库连接整理</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a> <div>1、数据库连接jdbc.properties配置详解   jdbc.url=jdbc:hsqldb:hsql://localhost/xdb   jdbc.username=sa   jdbc.password=   jdbc.driver=不同的数据库厂商驱动,此处不一一列举   接下来,详细配置代码如下:    Spring连接池    </div> </li> <li><a href="/article/3784.htm" title="Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常" target="_blank">Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常</a> <span class="text-muted">xp9802</span> <div>用Dom4J解析xml,以前没注意,今天使用dom4j包解析xml时在xpath使用处报错      异常栈:java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常       导入包 jaxen-1.1-beta-6.jar 解决; &nb</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>