Jimmy Graphic 招聘

Rocky 发表于 2008-06-19 22:18:53

职位描述(点击原文查看详情)

关于SAP的一些概念

Rocky 发表于 2008-02-05 13:41:16

SAP Business Suite
当前SAP公司的主力产品包,里面包含了mySAP ERP, mySAP CRM, mySAP SCM .... 几乎是SAP的所有东东。如果购买的是此种许可证,就意味着几乎可以用SAP的所有产品的功能--某些特定行业的特定引擎(Engine)除外。

mySAP ERP
主要就是以前的SAP R/3加上SAP最新的集成平台SAP Netweaver。

mySAP CRM
之所以叫mySAP CRM而不是SAP CRM,就是为了突出SAP的CRM产品是以客户为中心的、灵活可配置的……所以叫”my***“,mySAP CRM主要就是包括SAP的CRM产品功能包(Logic Box)再加上SAP最新的集成平台SAP Netweaver。

SAP Netweaver
是SAP 最新的集成应用平台,一方面SAP用这么一个平台来集成SAP与非SAP(Oracle, Siebel, ...)应用系统;另一方面SAP把一些各个系统都可以通用的功能放入此平台中,如SAP门户( SAP Portal)可以访问各种SAP应用系统(ERP, CRM...)及非SAP系统、SAP商务智能(SAP BI)可以对来自各种系统的数据进行分析……

mySAP.com
这是前几年SAP为了迎合网络风潮而给自己的产品包改的名字,它跟www.mySAP.com这个网站没有任何实质关...它就是现在的SAP Business Suite。

SAP R/3
以前SAP公司的主力产品,包括大家非常熟悉的SD, MM, FI, CO, PP..等模块。但从今年起SAP已经不再单独出售R/3的许可证,代之以mySAP ERP。也就意味着客户无论选择SAP的何种产品(mySAP ERP, mySAP CRM...)都会得到SAP Netweaver,其中包括了SAP Portal 与SAP BW的使用许可。

SAP All-in One (SAP A1)
在SAP R/3的基础上,SAP做了一些预配置,然后按不同行业交给咨询合作伙伴,由他们再加一些预配置,然后以咨询合作伙伴的名义将加了预配置的系统销售给用户。内含mySAP CRM的部分功能。

SAP Business One (SAP B1)
在SAP收购的另一家公司的产品基础上改造而成,优点是价格低廉,并且由于数据结构相同可以无缝地将系统升级至SAP A1, SAP Business Suite。SAP B1中有CRM功能,但远不及mySAP CRM系统中的那么强大。

SAP Release版本之间的差异和关系:
版本4.6C以前是所谓传统的R3系统,建立在SAP Basis的基础上;

版本4.70以后,改为R3 Enterprise,最大的变化是SAP WEB AS取代了传统的Basis,核心业务功能模块也作了划分;

R3 Enterprise之后改称为mySAP ERP2004,基础平台演变成SAP NetWeaver,并产生SAP ECC (ECC = ERP Central Component) ,作为Enterprise的替代,并集成了BW,SEM和ITS;

2005第4季度开始mySAP ERP2005的准备,最大的变化将是全面转向ESA体系(基于消息机制的企业应用体系),并引入了新的功能模块,比如PLM和SRM.

SPAM SAINT升级Patch/Addon失败了怎么办?

Rocky 发表于 2008-01-25 00:42:52

昨天安装BI 3.5 Business Content 的Addon补丁包,升级前系统自检所有依赖的补丁包都已经安装,结果升到一半显示错误,错误提示是“GETWA_NOT_ASSIGNED”,查了下资料,说要打SAP BW Patch 13补丁(怎么升级前不说清楚!)。

于是下了BW Patch 13的文件下来,发现Saint/Spam被锁住了。提示:“OCS locked by user XXX with transaction SAINT”,并且在SAINT里面不能Reset那个安装任务,无奈,这下SAINT和SPAM都不能用了。

记得sydongsun在他的一片博文中说过如何升级BI Addon(详见这里),里面详细说道如果碰到升级补丁、插件包发生错误后进退两难如何解决,用他的办法,在SE37中运行SPAM_RESET_STATUS,IV_FORCE设置为X,运行后,发现还是提示“OCS locked by user XXX with transaction SAINT”,于是从这个提示入手,Google了一下,终于找到解决方法:
原文如下:
In Se37,Use the function module OCS_RESET_QUEUE -> Single Test
with the parameters
IV_TOOL=SAINT, IV_FORCE=X

用这种方法,终于Reset了所有的OCS队列。

还有人提出另外一种解决方案,如下所示,我没有试过,不知道是否可以,大意就是删掉PAT01、PAT03、PAT10三个表里的和那个Patch相关的数据即可:

We were facing a problem in(Test Server) due to wrongly defined
queu. Basis Patches 32 and 33 were supposed to be applied
separately, but by mistake we defined a queue for Basis 32 to
Basis 41 and HR26 to HR40. Due to this que was stuck in
DDIC_IMPORT phase.

We solved this problem by deleting entries with status ='?' in
PAT01, PAT03 and PAT10 tables.
This way we were able to delete the particular queue and spam was
reset. This can be a last option to solve this problem..

关键词(Tag): sap 升级失败

SAP DOI调用Excel例子

rockTech 发表于 2008-01-22 03:26:09

DOI功能很强大,可以做到很多功能,而且可以使用VBA扩展新功能,可以做出如下效果:
DOI效果图

一个简单的DOI模板代码如下:

*&---------------------------------------------------------------------*
*& Report  Z_Rocky_TEST
*&
*&---------------------------------------------------------------------*
*& Rocky Wang
*& RockyTech (AT) 126.com
*& Blog : RockTech.yculblog.com
*&---------------------------------------------------------------------*

REPORT  z_rocky_test.
TABLES: makt.
***-----------------------------------***
***  excel related declaring
***-----------------------------------***
TYPE-POOLS: slis,vrm, sbdst, soi.
CONSTANTS document_name(30) VALUE 'TEST'.
CONSTANTS inplace VALUE 'X'.
DATA: flag .

DATA: container   TYPE REF TO cl_gui_custom_container,
      control     TYPE REF TO i_oi_container_control,
      document    TYPE REF TO i_oi_document_proxy,
      spreadsheet TYPE REF TO i_oi_spreadsheet,
      error       TYPE REF TO i_oi_error,
      errors TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.

CONTROLS:   exceldata TYPE TABLEVIEW USING SCREEN 0100.
DATA:       tablename(10), okcode(15),
            row(4), column(4), data(39).

* spreadsheet interface structures for Excel data input
DATA: rangeitem TYPE soi_range_item.
DATA: ranges TYPE soi_range_list.
DATA: excel_input TYPE soi_generic_table.
DATA: excel_input_wa TYPE soi_generic_item.
DATA: initialized(1), retcode TYPE soi_ret_string.
DATA: item_url(256), already_done, newname(40).
DATA  document_type(80).
DATA: app TYPE vrm_id, applist TYPE vrm_values.
DATA: excel(80) VALUE 'Excel.Sheet'.
DATA: line_count TYPE i,
      column_count TYPE i.

DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.

CLASS c_oi_errors DEFINITION LOAD.

DATA: BEGIN OF itab OCCURS 0.
        INCLUDE STRUCTURE makt.
DATA: END   OF itab.

SELECT-OPTIONS matnr FOR makt-matnr.

START-OF-SELECTION.
  PERFORM getdata.

  CALL SCREEN 100.


*&---------------------------------------------------------------------*
*&      Form  getdata
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM getdata .
  SELECT *
    FROM makt
    INTO TABLE itab
   WHERE makt~matnr IN matnr.
ENDFORM.                    " getdata
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'SA1'.
  IF flag = space .
    PERFORM create_basic_objects USING ''  '' '' '' document_name.
    PERFORM output_to_excel.
  ENDIF.
ENDMODULE.                    "STATUS_0100 OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  flag = 'X'.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'STOP' .
      IF NOT document IS INITIAL.
        CALL METHOD document->close_document.
        FREE document.
      ENDIF.
      IF NOT control IS INITIAL.
        CALL METHOD control->destroy_control.
        FREE control.
      ENDIF.
      LEAVE PROGRAM.
    WHEN 'BACK' .
      IF NOT document IS INITIAL.
        CALL METHOD document->close_document.
        FREE document.
      ENDIF.
      IF NOT control IS INITIAL.
        CALL METHOD control->destroy_control.
        FREE control.
      ENDIF.

      SET SCREEN 0.  " quit the program
      "set screen 1000.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Form  CREATE_BASIC_OBJECTS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_APP_NAME   text
*      -->P_CLASSNAME  text
*      -->P_CLASSTYPE  text
*      -->P_OBJ_KEY    text
*      -->P_DOCNAME    text
*----------------------------------------------------------------------*
FORM  create_basic_objects USING p_app_name
                                 p_classname
                                 p_classtype
                                 p_obj_key
                                 p_docname.

  CHECK initialized IS INITIAL.
* first get the SAP DOI i_oi_container_control interface
  CALL METHOD
    c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = control
      error   = error.
* check no errors occured
  CALL METHOD error->raise_message
    EXPORTING
      type = 'E'.
  CREATE OBJECT container
            EXPORTING container_name = 'CONTAINER'.
  DATA l_app_name(200).
  IF p_app_name IS INITIAL.
    l_app_name = 'TEST'.
  ELSE.
    l_app_name = p_app_name.
  ENDIF.
  CALL METHOD control->init_control
    EXPORTING
      r3_application_name      = l_app_name
      inplace_enabled          = inplace
      inplace_scroll_documents = 'X'
      parent                   = container
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      no_flush                 = 'X'
    IMPORTING
      error                    = errors.
* save error object in collection
  APPEND errors.
  CLEAR item_url.
  DATA: bds_instance TYPE REF TO cl_bds_document_set.
  DATA: doc_signature TYPE sbdst_signature,
        wa_doc_signature LIKE LINE OF doc_signature,
        doc_components TYPE sbdst_components,
        doc_uris TYPE sbdst_uri,
        wa_doc_uris LIKE LINE OF doc_uris.

*以下三个值为Tcode:OAOR里面新建模板文件的参数

  DATA: doc_classname TYPE sbdst_classname VALUE 'PICTURES',
        doc_classtype TYPE sbdst_classtype VALUE 'OT',
        doc_object_key TYPE sbdst_object_key VALUE 'ZEXCEL'.

  wa_doc_signature-prop_name = 'DESCRIPTION'.
  app = 'excel'.
  IF app = 'excel'.
    document_type = excel.
    wa_doc_signature-prop_value = p_docname.
  ELSE.
  ENDIF.
  APPEND wa_doc_signature TO doc_signature.
  CREATE OBJECT bds_instance.
  CALL METHOD bds_instance->get_info
    EXPORTING
      classname  = doc_classname
      classtype  = doc_classtype
      object_key = doc_object_key
    CHANGING
      components = doc_components
      signature  = doc_signature.

  CALL METHOD bds_instance->get_with_url
    EXPORTING
      classname  = doc_classname
      classtype  = doc_classtype
      object_key = doc_object_key
    CHANGING
      uris       = doc_uris
      signature  = doc_signature.

  FREE bds_instance.

  READ TABLE doc_uris INTO wa_doc_uris INDEX 1.

  item_url = wa_doc_uris-uri.

* ask the SAP DOI container for a i_oi_document_proxy for Excel
  CALL METHOD control->get_document_proxy
    EXPORTING
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
    IMPORTING
      document_proxy = document
      error          = errors.
  APPEND errors.

* open a document saved in business document service.
  CALL METHOD document->open_document
    EXPORTING
      open_inplace = inplace
      document_url = item_url.

  DATA: has TYPE i.
  CALL METHOD document->has_spreadsheet_interface
    EXPORTING
      no_flush     = ''
    IMPORTING
      is_available = has
      error        = errors.
  APPEND errors.

  CALL METHOD document->get_spreadsheet_interface
    EXPORTING
      no_flush        = ' '
    IMPORTING
      sheet_interface = spreadsheet
      error           = errors.
  APPEND errors.
* Activate  sheet 1
  CALL METHOD spreadsheet->select_sheet
    EXPORTING
      name     =  '表整理'
*    NO_FLUSH = ' '
    IMPORTING
      error    = errors.
*    RETCODE  =
  .
  APPEND errors.

  LOOP AT errors.
    CALL METHOD errors->raise_message
      EXPORTING
        type = 'E'.
  ENDLOOP.
  FREE errors.
  initialized = 'X'.
ENDFORM.                    "CREATE_BASIC_OBJECTS

*&---------------------------------------------------------------------*
*&      Form  output_to_excel
*&---------------------------------------------------------------------*
*       fill the EXCEL sheet
*----------------------------------------------------------------------*
FORM output_to_excel.
  DATA num TYPE i VALUE 1.
  LOOP AT itab.
    num = num + sy-tabix.
    PERFORM fill_cell USING num 1 itab-matnr.
    PERFORM fill_cell USING num 2 itab-spras.
    PERFORM fill_cell USING num 3 itab-maktx.
    PERFORM fill_cell USING num 4 itab-maktg.
    num = 1.
  ENDLOOP.
ENDFORM.                  "output_to_excel

*&---------------------------------------------------------------------*
*&      Form  FILL_CELL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->I          text
*      -->J          text
*      -->VAL        text
*----------------------------------------------------------------------*
FORM fill_cell  USING i j val.
  DATA: columns_number TYPE i,
        rows_number    TYPE i.

  columns_number = 1.
  rows_number = 1.

  CALL METHOD spreadsheet->insert_range_dim
    EXPORTING
      name     = 'cell'
      no_flush = 'X'
      top      = i
      left     = j
      rows     = rows_number
      columns  = columns_number
    IMPORTING
      error    = errors.
  APPEND errors.

  REFRESH: ranges, excel_input.
  rangeitem-name = 'cell'.
  rangeitem-columns = 1.
  rangeitem-rows = 1.
  APPEND rangeitem TO ranges.

  excel_input_wa-column = 1.
  excel_input_wa-row = 1.
  excel_input_wa-value = val.
  APPEND excel_input_wa TO excel_input.

* set data
  CALL METHOD spreadsheet->set_ranges_data
    EXPORTING
      ranges   = ranges
      contents = excel_input
      no_flush = 'X'
    IMPORTING
      error    = errors.
  APPEND errors.

  CALL METHOD spreadsheet->fit_widest
    EXPORTING
      name     = space
      no_flush = 'X'.

  REFRESH: ranges, excel_input.

ENDFORM.                    "fill_cell

关键词(Tag): abap doi

Component 0DAT (version A) does not exist in the database

rockTech 发表于 2008-01-06 01:08:07

注意:本文内容已过时,经后来查证,出现该错误是由于BW的BI Content没有安装。

我在新安装好的BW服务器(BW3.5)上做了一个Query,运行时却发现出错,提示如下:
Component 0DAT (version A) does not exist in the database

如下图所示:
Component 0DAT (version A) does not exist in the database

看描述应该是是0DAT这个变量没有激活或者不存在。查了下资料说0DAT是Calendar Day(0CALDAY)的变量。

一开始觉得可能是Business Content没有安装,于是到RSA1里面去找0DAT。在Business Content->Object Types->Query Elements->Variable->Select Objects 里面,找了半天,没有找到0DAT,可能我这个BW安装的有问题,SDN上有人说在这里有的,我到另一个BI 7.0系统里0DAT就在这里面,直接安装即可,可是我的BW 3.5 这里就是没0DAT这个变量。

没办法,在Query Designer里面想自己建一个0DAT,却发现不能新建以0开头的变量。于是Google了一下,发现一个Notes就是讲这个的,Notes编号828033。Notes里面讲到:

The variable 0DAT must be created in the system.
1) Switch transport/systemtype from CUSTOMER to SAP to access namespace
starting with 0.
2) Create variable 0DAT as time variable via BEx query analyzer.

要改系统参数了!这不是要重启SAP了嘛,还好我这个SAP是个IDES,无所谓了,于是到RZ11里面查看transport/systemtype这个参数,默认是Customer,再进RZ10,Profile选当前实例的配置文件,再选中Extended maintenance,进去修改。新建一个参数transport/systemtype,值为SAP,检查后报错,说这个参数不能手工改…...郁闷了。

没办法,既然在业务界面里面不能手工改,只能直接改服务器上的配置文件了。在RZ10里面选当前配置文件后,点Administration Data,再点Display进去后找到了配置文件的路径,于是远程桌面登录到IDES安装的系统,找到那个配置文件后,添加一句话:
transport/systemtype = SAP

然后重启SAP服务器,再进RZ11里面查看,transport/systemtype参数的值变成SAP了 :)
在Query Designer里面新建一个0DAT,参照BI 7.0下0DAT的属性新建一个,具体属性如下: 



有一点需要说明,Processing By 属性的SAP Exit 这个值是不会显示在下拉列表中供选择的,做成Customer Exit就可以了。(如果实在要做成SAP Exit,请继续看后文)

新建完后,记得要删掉在配置文件里面添加的那句 “transport/systemtype = SAP” 再重启服务器。

后来上网有查了点资料,发现了个更简单的办法:Info Object使用的变量都是在RSZGLOBV这个表里面定义好的,如果要新建,直接把内容插入这个表里就好了…...就没必要改什么参数再重启SAP了(那个Notes是谁写的?!)。

修改办法如下:进入RSZGLOBV这个表,添加下面选中的两行内容即可,没有显示的列均为默认参数,Processing Type选择4表示SAP Exit,3表示Customer Exit。 



至此,此问题完美解决。 

参考资料:https://www.sdn.sap.com/irj/sdn/thread?messageID=966023
关键词(Tag): error sap bw 0dat

ABAP中如何获得URL地址对应网页的HTML代码

rockTech 发表于 2007-11-06 17:34:21

      最近有一个朋友问我,在ABAP中如何获取一个URL地址所对应网页HTML代码的内容。

      在SAP R/3系统中有一个Function Module 叫 HTTP_GET ,使用该FM就能获得一个外网的URL内容

      需要注意的是, RFC_DESTINATION参数可以在SM59中定义,经常用的有SAPHTTPA和SAPHTTP。前者是从SAP服务器访问,后者是从客户端访问。如果SAP服务器不能访问外网,但是客户端可以,就要使用SAPHTTP。
关键词(Tag): html get sap abap

SAP中和计量单位有关的表

rockTech 发表于 2007-05-30 18:57:58

SAP中和计量单位有关的表

T006                           计量单位
T006_OIB                  计量单位,附加定义
T006A                         分配内部到语言相关单位
(内部单位转换到外部贸易、技术单位用T006A表,比如要显示CAR则把数据库中的KAR在次表中转换)
T006B                         贸易分配到内部测量单位   
( 外部贸易单位和转换到内部单位就是用T006B表,比如 PC转到ST,CAR转到KAR等)

T006C                         外部技术到内部测量单位的分配
T006D                         尺寸
T006D_OIB                 附加维数
T006E                          计量单位系统(组件,映射)
T006EE                        计量单位系统(实用程序)
T006ET                        计量单位系统(使用程序 -> 文
T006I                            计量单位的 ISO 代码
T006J                           ISO 测量文本单位码
T006M                          计量单位组
T006T                           维数文本

sap里部分函数说明

rockTech 发表于 2007-05-16 13:54:37

ABAP_DOCU_DOWNLOAD - Download ABAP documentationin HTML format.

ARFC_GET_TID - will return the IP addressof the terminal in hex.   

BAL_* -All function modules used for SAP's application logging can be found here.

BP_EVENT_RAISE -Trigger an event from ABAP/4 program

BP_JOBLOG_READ -Fetch job log executions
......

SAP 中的增强

rockTech 发表于 2007-05-15 12:04:20

sap的用户出口总共有三代:
1、第一代
sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。
示例:USEREXIT.. in SAPMV45A

2、第二代
sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。

3、第三代
sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),可以通过EXIT_HANDLER这个单词查找BADI。 

对于第一代增强,可以用以下方法查找增强:
打开欲增强的程序,点击工具栏上的“Display Object List”按钮,选择Subroutines,查找以“UserExit”开头的子程序,根据子程序前面的注释文档来查找用户出口

对于第二代增强,可以用以下方法查找增强

用户增强通常包括下面3类,顾名思义,就是增强SAP的可能没有提供的功能(通过后台配置也不能实现).
1.E Enhancement exits :就是常说User_exit (用户出口)
使用SE37搜索EXIT*的函数大都是做exit用的,通常里面预包含了一个Z开头
的程序. SE16查询TFDIR(函数表)输入EXIT*也可.
2.C GUI codes( GUI接口增强)
3. S Subscreens (屏幕增强)
Enhancement在表MODSAP可看到,而TFDIR字段 MAND(值为C表示此出口函数被激活).使用SMOD(CMOD)当然可激活exit function,有时候一时难以查询到相关Enhancement时可使用下面程序将出口函数激活. 

REPORT Zactexitfun .
data ztfdir like tfdir .
* select single * from tfdir into ztfdir
* where FUNCNAME =
* 'EXIT_SAPMM06E_013'.
* ztfdir-MAND = 'C' .
* update tfdir from ztfdir.
* 将EXIT_SAPMM06E_013换成实际所需exit函数名
update tfdir set MAND = 'C'.
where FUNcname = 'EXIT_SAPMM06E_013'. 

***当然也可SE16:MODSAP表enhancement输入EXIT_SAPMM06E_013然后得到enhancement name MM06E005后使用SMOD测试激活exit函数.
增强相关函数和表格
Function:
[1].DYNP_VALUES_READ
[2]. MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
由于读者可能接触user exit最多,除了附录光盘有个查找ZFINDEXIT的程序外(有些exit使用它并不能找到),另一个直接有效的方法就是使用这个函数,SE37设好断点后执行tcode如其有exit就会调用此函数.
[4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
[5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
Table:
[1]. TFDIR->function module table
[2]. MODSAP->sap enhancement table
[3]. TSDIR->Dynpro Areas CALL CUSTOMER SUBSCREEN(屏幕增强)
[4]. CUATEXTS-> GUI Interface: Menu Texts Changed(GUI 菜单文本增强)

***注意,为了确保一个出口被真正应用,必须同时激活相关程序(SE38)和出口函数(SMOD|CMOD,反正就是要保证tfdir-mandt=’C’,用程序也可.)


对于第三代增强,详见
http://blog.csdn.net/opparts/archive/2005/08/17/456467.aspx

如何删除 Outlook 中的重复邮件?

rockTech 发表于 2007-05-14 09:03:31

最近到旺旺集团做项目,所有的通知和文档都是通过Exchange服务器发送,于是我的邮件客户端从 Outlook Express 改到 Outlook 2003 但从 Outlook Express 导入邮件后 Outlook 又自作聪明地从 Pop3 邮件服务器下载了一遍所有的邮件,于是我的邮箱就混乱不堪,多出了几百封重复的邮件。本来想用邮件规则来删除重复的邮件,结果发现不行,上网查了查怎么删除 Outlook 中的重复邮件,原来有很多插件可以干这个事情:

For Outlook
Outlook Duplicate Items Remover 1.2  
英文版,我试了不错,不但可以删重复邮件,其他如会议、联系人、日程安排都能删除重复项,更关键的是这个软件是免费的。

Duplicate Email Remover
英文版,收费软件,试了下可以自己定义比较规则,但未注册只能删除10封邮件

Duplicates Remover for Outlook
英文版,收费软件,试了下可以自己定义比较规则,但未注册只能删除10封邮件,除了能删邮件还能删会议、联系人、日程安排等

NoMoreDupes for Outlook
英文版,收费软件,15天试用

RepMailDel110.lzh
免费,日文版,只能用于 Outlook 2003。虽然不能设置重复的判断条件,但缺省的判断比较确,而且比较删除的速度快。在中文环境下有些乱码,但功能正常。详细还可参看作者的Blog
(使用方法:打开 Outlook 2003 ,“工具”菜单-〉“选项”子菜单-〉“其他”标签-〉“高级选项”按钮-〉“COM 加载项”按钮-〉“添加”按钮,然后选中下载解压后得到的DLL文件即可。安装成功后在“工具”菜单里会多出一个“重複メール削除”子菜单。)

For Outlook Express
Remove Duplicates from Outlook Express
英文版,收费软件,没试过

Delete Duplicates for Outlook Express
免费且有汉化版,试了下还可以,能简单的定义比较规则,不过速度有些慢

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较 - MSSQL

rockTech 发表于 2007-04-29 19:53:16

SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。

假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。

@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。

而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后自增的值。

有人做了实验:40条本地线程,40+40条远程线程同时并发测试,插入1200W行 ,得出的结论是: 
1.在典型的级联应用中.不能用@@IDENTITY,在CII850,256M SD的机器上1W多行时就会并发冲突.在P42.8C,512M DDR上,才6000多行时就并发冲突. 
2.SCOPE_IDENTITY()是绝对可靠的,可以用在存储过程中,连触发器也不用建,没并发冲突 

原文:http://blog.joycode.com/ghj/archive/2004/03/21/16745.aspx

内表行数统计方法

rockTech 发表于 2007-04-27 13:48:47

以下是统计内表行数常用的三种方法,如下:

1.LOOP AT it_itab.

g_lines2 = g_lines2 + 1.

ENDLOOP.

该方法是通过循环内部表自己累加行数。

2.DESCRIBE TABLE it_itab LINES g_lines1 . 该语句通过获得内部表的属性,将内部表行数赋值给 g_lines1 , g_lines1 为I型变量。

3. g_lines3 = lines( it_itab ). 使用函数来计算内部表行数。

以上三种方法中,第一种方法不推荐使用,推荐使用后两种方法。 

代码示例:

REPORT zmauricetest.

TABLES vbak.
DATA: g_lines1 TYPE i,
g_lines2 TYPE i VALUE 0,
g_lines3 TYPE i,
g_date TYPE d VALUE '19970121',
g_tabix LIKE sy-tabix.

DATA it_tab LIKE vbak OCCURS 0 WITH HEADER LINE.

SELECT * FROM vbak INTO TABLE it_tab.

LOOP AT it_tab.
g_tabix = sy-tabix.

IF it_tab-audat <> g_date.
DELETE it_tab INDEX g_tabix.
CONTINUE.
ENDIF.

g_lines2 = g_lines2 + 1.
WRITE:/ it_tab-vbeln,it_tab-audat.

ENDLOOP.

DESCRIBE TABLE it_tab LINES g_lines1.

g_lines3 = LINES( it_tab ).

WRITE :/ g_lines1,g_lines2,g_lines3.