茶与咖啡同杯飘香

交朋识友,共同分享
posts - 44, comments - 11, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

置顶随笔

     摘要: 打开 Visual C++并创建一个新工程 在文件菜单下选择 New → Project (Ctrl+Shift+N). 选择Win32 Project, 输入工程名字, 然后点击OK. 在工程创建向导里点击 Next, 然后选择Empty Project, 点击 Finish. 给新建的工程中添加一个代码文件: 在工程菜单下选择 Add New Item (Ctrl+Shift+A)... 阅读全文

posted @ 2008-05-11 22:51 haohello 阅读(123) | 评论 (0)编辑


  DNN皮肤一直披着神秘的面纱,其实它的制作并不复杂,当然前提是你对制作网页有一定的了解。简单而言,DNN的皮肤制作就是普通网页+DNN标签(也被翻译为标志,中文暂无统一的译法)。
  
  由于制作DNN皮肤要求对网页制作有一定了解,所以本文假定读者已经具备读懂本文涉及的网页制作知识。如果对本文提到的网页知识有不明白的地方,请参阅相关的网站或访问www.dnngo.com,推荐阅读WEB 2.0的知识。

DNN皮肤知识速览(更详细资料,请阅读相关文章或访问www.dnngo.com,推荐阅读“DNN皮肤生成机制剖析”和“DNN皮肤应用与制作常见问题”)

  制作皮肤之前,首先了解一下一个皮肤包通常包括什么?一个皮肤包(广义)包括一个皮肤包(狭义)和一个容器包。
  什么叫皮肤包(狭义)呢?简单来说,就是由一系列“定义一个网站的页面版面布局文件”构成的包。
  什么叫容器包呢?简单来说,就是由一系列“定义一个放置DNN模块的各种标签的版面布局文件”构成的包。
  
  一个皮肤包(狭义)包括什么呢?通常会包括以下文件,*.htm(或*.html),*.ascx,图片文件,skin.css,skin.xml。
  一个容器包包括什么呢?通常会包括以下文件,*.htm(或*.html),*.ascx,图片文件,container.css,container.xml。
  上述包中的*.htm,*.html,*.ascx是皮肤的“排版”文件,图片文件主要包括2种,一种是皮肤和容器所需要用到的图片,另一种是同名皮肤和容器的预览图片,*.css是皮肤或容器的样式定义文件,*.xml是皮肤或容器的标签属性定义文件。

DNN皮肤制作详细步骤(以下步骤顺序仅供参考,可根据个人爱好调整先后):

  1、规划网页布局。
  2、根据规划撰写*.css样式表(对此有困难,请阅读WEB2相关知识)
  3、根据规划编写*.xml,为相应的标志指定属性值。(对此有困难,请阅读www.dnngo.com Betty 翻译的4.0.2版本DNN文档皮肤白皮书,属性值的设置参考附录B)
  4、编写皮肤文件
  5、打包,生成皮肤包。

  我们今天讨论的重点是第4步:如何编写皮肤文件?好,我们开始吧!
  1、打开你的DreamWeaver,设置编码为UTF-8(理由:HTML皮肤格式转换为ASCX皮肤格式时,如果编码不是UTF-8的话,其中的中文会被丢失,所以此步不能省略。)具体操作如下:点菜单“编辑”-“首先参数”-“新建文档”-“默认编码”==》改为UTF-8。

    


  2、新建一个静态网页。

  3、点击CSS操作面板,点右键,点“附加样式表”,把skin.css附加到当前网页中。

  

  4、根据构思,把版面布局完成。其中需要放入DNN内容的地方,放入相应的标签。

 1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2<html xmlns="http://www.w3.org/1999/xhtml">
 3<head>
 4<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
 5<title>皮肤制作示例</title>
 6<link href="skin.css" rel="stylesheet" type="text/css" />
 7</head>
 8
 9<body>
10<!--定义外层 -->
11<center>
12<div class="pagemaster">
13
14<!--定义控制栏 -->
15<div class="skinmaster">
16    <div id="ControlPanel" runat="server" class="contentpane" ></div>
17</div>
18
19<!--定义Logo和Banner -->
20<div class="skinmain">
21<div class="skinheader">
22    <div class="skinlogo" >[LOGO]</div>
23    <div class="skinbanner" >[BANNER]</div>
24</div>
25
26<!--定义Menu -->
27<div class="skingradient" align="left">[MENU]</div>
28
29<!--定义导航 -->
30<div class="sitemap" align="left">
31    <div class="skinuser"> [USER]&nbsp;&nbsp;[LOGIN]</div>
32    <div class="skinbreadcrumb">SiteMap-->[BREADCRUMB]</div>
33</div>
34
35<!--下面进行模块区的定义 -->
36
37<!--定义模块区顶层 -->
38<div class="toppane" id="TopPane" runat="server" valign="top" align="center"></div>
39
40<!--定义模块区中间层,根据需要,本层分成了三个列 -->
41<div class="main" >
42    <div class="leftpane" id="LeftPane" runat="server" valign="top" align="center"></div>
43    <div class="rightpane" id="RightPane" runat="server" valign="top" align="center"></div>
44    <div class="contentpane" id="ContentPane" runat="server" valign="top" align="center"></div>
45</div>
46
47<!--定义模块区底层 -->
48<div class="bottompane" id="BottomPane" runat="server"></div>
49
50<!--定义版权声明 -->
51<div class="copyright">
52<div class="copyrightline"></div>
53[COPYRIGHT]
54</div>
55</div>
56</div>
57</center>
58</body>
59</html>
60

   5、完成设计,确认版面预览正确后,把body标签内的东西保留,其它的去掉。上例处理后,结果如下:

<!--定义外层 -->
<center>
<div class="pagemaster">

<!--定义控制栏 -->
<div class="skinmaster">
    
<div id="ControlPanel" runat="server" class="contentpane" ></div>
</div>

<!--定义Logo和Banner -->
<div class="skinmain">
<div class="skinheader">
    
<div class="skinlogo" >[LOGO]</div>
    
<div class="skinbanner" >[BANNER]</div>
</div>

<!--定义Menu -->
<div class="skingradient" align="left">[MENU]</div>

<!--定义导航 -->
<div class="sitemap" align="left">
    
<div class="skinuser"> [USER]&nbsp;&nbsp;[LOGIN]</div>
    
<div class="skinbreadcrumb">SiteMap-->[BREADCRUMB]</div>
</div>

<!--下面进行模块区的定义 -->

<!--定义模块区顶层 -->
<div class="toppane" id="TopPane" runat="server" valign="top" align="center"></div>

<!--定义模块区中间层,根据需要,本层分成了三个列 -->
<div class="main" >
    
<div class="leftpane" id="LeftPane" runat="server" valign="top" align="center"></div>
    
<div class="rightpane" id="RightPane" runat="server" valign="top" align="center"></div>
    
<div class="contentpane" id="ContentPane" runat="server" valign="top" align="center"></div>
</div>

<!--定义模块区底层 -->
<div class="bottompane" id="BottomPane" runat="server"></div>

<!--定义版权声明 -->
<div class="copyright">
<div class="copyrightline"></div>
[COPYRIGHT]
</div>
</div>
</div>
</center>

  6、保存。(暂定为 myskin.html)

  7、把skin.xml,skin.css,用到的图片,myskin.html打包,格式为ZIP包,压缩率为标准。

  8、上传、预览本皮肤,预览正确的话,请截屏,把图片放在皮肤所在目录,文件名与皮肤相同,在本例文件名应为:myskin.jpg。

  9、重新生成皮肤包,包含如下文件:skin.xml,skin.css,用到的图片,myskin.html,myskin.jpg,格式为ZIP包,压缩率为标准。

  OK,到此,一个五脏俱全的皮肤包宣布完成,嘿嘿,简单吧?

  容器的制作方式与皮肤相同,不再赘述!

<

posted @ 2007-12-17 10:13 haohello 阅读(25) | 评论 (0)编辑

DotNetNuke预先配置了一些标准模块。还有很多别的模块可以通过免费和商业付费的方式得到。下面的列表简要描述了预先配置的模块。
Account LogIn 允许用户登录到你的门户站点。
Announcements 由标题和简要描述组成的简单的文字公告。
Banners 提供网站广告。可以选择广告的数量及广告类型。
Blog 为用户提供网络博客的功能。
Contacts 显示一组人员的联系信息,比如项目组。
Discussion 列出某种主题的一组消息。
Documents 显示一列文档,包括浏览或下载的链接。
Events 显示一列即将发生的事件,包括事件和地点。事件列表可以被选择陈列在日历模式中。
FAQs 允许你管理一组常见的问题和它们的答案。
Feedback 允许访问客给网站管理员发消息。如果访问客已经登录,他的名字会自动地列在表格上。
Forum 能够管理主题的讨论和回复的社团工具。支持肖像,表情符,邮件提示的功能。
Gallery 显示图册和多媒体文件。
IFrame 具有网络浏览器的风格,允许你在一个模块或你的站点里显示其他站点的内容。
Image 显示指定的图片。这个模块简单的指向页面的相对或绝对URL路径,所以不需要将图片文件存放在站点上。
Links 显示一列指向任何站点页面,图片或文件的超链接。
News Feed (RSS) 在你的站点上显示新闻聚合。新闻聚合提供你的访问客最新,最全的主题信息。
Search Input 可以显示在任何页面上。
Search Results可以显示在任何页面上。
Text/HTML 允许你用可视编辑器来设计内容或加Html。包括你上传图片的图片画廊。
User Account 模块允许注册用户增加,编辑和更新他们的用户明细信息。成员资格服务也可以在这里管理。
User Defined Table 允许你新增自定义数据表格来管理表格信息。通过点击列标题来按照A-Z或Z-A重新排序数据。
XML/XSL 显示XML/XSL的转换结果。XML和XSL文件通过他们模块中的xmlsrc 和xslsrc属性的UNC路径来确定。

posted @ 2007-12-16 19:55 haohello 阅读(16) | 评论 (0)编辑

 


1. 数字类型(numeric types)
(1).类型
   Abap支持三种数字类型:
    I:整型
      范围:-2147483648 to 2147483647
    P:16位
      范围:取决于小数位的长度
      注意事项:为了确保计算正确,必须在程序属性中把fixed point arithmetic选中,参考图1。
    F:浮点类型
      范围:+/- 2.2250738585072014E-308 to 1.7976931348623157E+308
      注意事项:因为长度的关系,所以尽量不要用两个该类型的数据相等作为判断条件
(2).定义方法
    [f1] type I.
    [f1] type P decimals [num].
    [f1] type F.
(3).使用
    I类型:
      主要是用于计数器,数量,索引,偏移量等等
      例如:
         *取得内表行数
         DATA: V_COUNTER TYPE I.
         V_COUNTER = LINES( I_TAB ).
         *根据索引读取内表中的数据
         DATA: V_INDEX TYPE I.
         READ TABLE I_TAB INDEX V_INDEX.
         *截取字符串
         DATA: V_OFFSET_START TYPE I,
               V_OFFSET_LENGTH   TYPE I,
               V_C(10) TYPE C,
                L_C(3)  TYPE C.
         V_C = ‘ABCDEFGHIJ’.
         V_OFFSET_START = 3.
         V_OFFSET_LENGTH   = 5
         L_C = V_C+V_OFFSET_START(V_OFFSET_LENGTH).
         RESULT:
           L_C = ‘DEFGH’.
    P类型:
      主要和数据库中的QUAN类型关联;
      常用场合:大小,长度,重量,货币等有单位的场合
      *根据单位把数量写入字符型变量中
      WRITE:[数量] to [字符型变量] unit [单位].
    F类型:
       常用场合:计算

字符类型:
   一.包括:
         C:字符
         N:应该算是字符型的数字
         D:日期类型,标准长度8(YYYYMMDD),注意其初期值的判断,不是space,而是'00000000',判断语句可以使用is initial or not。
         T:时间类型,标准长度6(HHMMSS)
   二.具体使用:
     1.对字符串的操作
       1).SHIFT:截断字符串
         SHIFT {c} [BY {n} PLACES] [{mode}].:
            作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变。如果n超出字符串的长度,则字符串变空,所以在做此操作的时候要注意n的指定。可以首先获得该字符串的长度,方法:len=STRLEN(C)。
                Mode:指定字符串截断的方向。
                  LEFT:从左边截断
                  RIGHT:从右边截断
                  CIRCULAR:把左边的字符放到右边。
          SHIFT {c} UP TO {str} {mode}.:
             作用:把字符串中在str以前的字符都去掉,同样可以指定mode,原理同上。
          SHIFT {c} LEFT DELETING LEADING {str}.
          SHIFT {c} RIGHT DELETING TRAILING {str}.:
             作用:这两个语句就是把字符串c中前的(LEFT)或者后的(RIGHT)的字符str都去掉。
          以上语句常用的场合:
            A.去掉字符串中的前导字符。例如:如果alv中定一了一个字段是10位的字符,里面放的是so,po等number,而你不想显示前面的0,那么就可以这样做:SHIFT {c} LEFT DELETING LEADING 0.
            B.已知某个字符串中包含固定的字符,想把这个固定字符前面的字符删掉,那么可以使用:SHIFT {c} UP TO {str}。例如:某个物料,通过增强mga00002和mga00003对其加了前缀,这个前缀部分是在某固定值表中取得的数据,在具体显示中,要把其前缀去掉。如TE-MRP-MAT1中想把te去掉,mrp表示该物料是跑mrp的,需求要求把te-去掉,mrp可以在固定值表中取得,则可以使用SHIFT {c} UP TO 'MRP'.
       2).REPLACE:替换字符串
         REPLACE {str1} WITH {str2} INTO {c} [LENGTH {l}].:
            作用:把字符串c中的str1替换成str2,如果指定l,就是指定了替换的长度。如果替换成功,则SY-SUBRC设置成0。
            常用场合:
                字符串的替换操作比较常用,需要注意的是l的指定长度。
       3). TRANSLATE:转换字符串
          TRANSLATE {c} TO UPPER CASE.
          TRANSLATE {c} TO LOWER CASE.:
            作用:字符串的大小写的转换
          TRANSLATE {c} USING {r}. :
            作用:根据规则r转换字符串c
          常用场合:
             Sap系统一般都是使用大写字母的,但是某些特定的字段却是用小写字母来标记的,在操作这些字段的时候就需要注意大小写的转换了。转换规则倒是不太常用,到现在我还没有遇到过。
       4). SEARCH:查找字符串
          SEARCH {c} FOR {str} {options}.:
             作用:在字符串c中查找str,如果找到了,SY-SUBRC为0,SY-FDPOS为找到字符串的具体位置。
             需要说明的地方:注意模式的使用
                指定str:查找str,str中后面的空格忽略
                指定.str.:查找str,包含了str中尾部的空格
                指定*str:查找以str结尾的字符串
                指定str*:查找以str开头的字符串
               {options}的指定:
                 主要用到的就是:STARTING AT {n1}指定开始位置
                                 ENDING AT {n2}指定结束位置
             常用场合:
                一般用来判断某个字符串是否符合条件。也可以结合其他语句对字符串进行操作。
       5).CONDENSE:去掉字符串中的空格
          CONDENSE {c} [NO-GAPS].:
             作用:去掉字符串中的前面和后面的空格,如果指定NO-GAPS,则去掉字符串中的所有空格。
             常用场合:获得字符串的精确长度,用于判断。
       6).SPLIT:拆分字符串
          SPLIT {c} AT {del} INTO {c1} ... {cn}.
             作用:按照分割字符del把字符串c分割成c1…cn。
          SPLIT {c} AT {del} INTO TABLE {itab}.
              作用:按照分割字符del把c分割,然后放到内表中的相应字段
           常用场合:
              文件名的分割,根据完整的文件路径加文件名把文件名分割出来。
              难点:无法确定要分割多少次.
              解决方法:两两分割,到最后的那个就是了。例如:str=c:\dir1\dir2\dir3\file
                 Split str at '\' into str1 str2.
                 Find str2 for '/'.
                 Check sy-subrc = 0.
                 Do.
                   Find str2 for '/'.
                   If sy-subrc = 0.
                     Split str2 into str1 str2.
                   Else.
                     Exit.
                   Endif.
                 Enddo.
              文件上传的类型是字符串,把其分割后放到内表中。例如上面的问题:
                data: begin of itab occurs 0 ,
                      col1(30) type c,
                    end of itab.
                Split str at '\' into table itab.
                describe table itab lines line.
                Read table itab index line.
                Itab-col1就是file
       7).CONCATENATE:连接字符串
          CONCATENATE {c1} ... {cn} INTO {c} [SEPARATED BY {s}].
             作用:把c1…cn用s分隔连接到c中
             常用场合:文件下载,对文件中的字段编辑。

posted @ 2007-12-15 11:09 haohello 阅读(625) | 评论 (0)编辑

ABAP/4 报表编程模板初学者必看
*&--------------------------------------------------------------*
*& Report  Z_X_XXXXX                                                
*& Module                   :  Module " SubModule                      
*&--------------------------------------------------------------*
*& Created                  :  author  (2003.10.09)                    
*& Modified                 :  author  (someday)                      
*  Intention                :  程序的详细说明                          
*  请用户在ABAP/4 REPORT编程时,参考本程序提供的编程框架              
*                        
*  在编码规范有出入时,以本程序为准
*  以下各事件可根据实际编程需要使用,对于需要处理的事件,可将该事
*  件后面的语句注释去掉,再编写相应的子程序代码。
*&--------------------------------------------------------------*

INCLUDE Z_X_XXXXXTOP .           " TOP 子程序,用来声明全局变量

*----以下三个子程序只有在多个程序调用同一逻辑时才建议使用-----*
*INCLUDE Z_X_XXXXXO01 .               " PBO 子程序
*INCLUDE Z_X_XXXXXI01 .               " PAI 子程序
*INCLUDE Z_X_XXXXXF01 .               " form 子程序

INITIALIZATION.
*  PERform  INI_SELECTION_SCREEN.       " 初始化选择屏上的变量

AT SELECTION-SCREEN.
*  PERform  INI_DATA.                   " 初始化全局变量

START-OF-SELECTION.
*  PERform  PRECESS_DATA.               " 主要数据处理逻辑

AT LINE-SELECTION.
*  PERform  PRECESS_LINE_SELECTED.      " 行选择时的处理

AT USER-COMMAND.
*  PERform  PRECESS_USER_COMMAND.      * 用自定义命令按钮时的处理

TOP-OF-PAGE.
*  PERform  PAGE_HEADER.                " 页眉

END-OF-PAGE.
*  PERform  PAGE_FOOT.                  " 页脚


*&--------------------------------------------------------------*
*&      form  PRECESS_DATA
*&--------------------------------------------------------------*
*       text
*---------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*---------------------------------------------------------------*

form PRECESS_DATA.
*如果逻辑简单, 则合并若干form为一个
 PERform  SEL_DBTAB_XXXXX.   " 从透明表中取数据赋给内表
 PERform  CMP_ITAB_XXXXX.    " 内表中数据计算处理
 PERform  WRT_ITAB_RESULT.   " 输出内表数据
ENDform.                    " PRECESS_DATA

*&--------------------------------------------------------------*
*&      form  SEL_DBTAB_XXXXX
*&--------------------------------------------------------------*
*       text
*---------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*---------------------------------------------------------------*
form SEL_DBTAB_XXXXX.
select * into corresponding fields of itab_sales
        from bsid
        where bukrs = s_bukrs.

    authority-check object 'Z:FI-00001'
       id 'ACTVT' field '03'
       id 'BUKRS' field itab_sales-bukrs
       id 'GSBER' field itab_sales-gsber.   "权限检查

if sy-subrc ne 0.                            "权限检查未通过
continue.
endif.
append itab_sales.
clear itab_sales.
endselect.
ENDform.                    " SEL_DBTAB_XXXXX

*&--------------------------------------------------------------*
*&      form  CMP_ITAB_XXXXX
*&--------------------------------------------------------------*
*       text
*---------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*---------------------------------------------------------------*

form CMP_ITAB_XXXXX.

ENDform.                    " CMP_ITAB_XXXXX

*&--------------------------------------------------------------*
*&      form  WRT_ITAB_RESULT
*&--------------------------------------------------------------*
*       text
*---------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*---------------------------------------------------------------*
form WRT_ITAB_RESULT.
*  PERform WRT_ITAB_SUB.
ENDform.                    " WRT_ITAB_RESULT

*&--------------------------------------------------------------*
*&      form  PAGE_HEADER
*&--------------------------------------------------------------*
*       text
*---------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*---------------------------------------------------------------*
form PAGE_HEADER.

posted @ 2007-12-15 10:38 haohello 阅读(163) | 评论 (0)编辑

历史

ABAP作为一种面向特定应用的第四代编程语言最早在20世纪80年代开发。它原本是作为一种报表语言应用在SAP R/2上,这是一个帮助大型公司在大型机上建立原材料管理和财务会计管理商务应用的平台。ABAP本来也是德语Allgemeiner Berichtsaufbereitungsprozessor的缩写,意思是“通用报表预处理器”。ABAP第一次引入了“逻辑数据库”的概念,它在基本的数据库层提供了更高级的抽象。

ABAP编程语言最初被SAP的开发者用于开发SAP R/3平台。但它也被设计让SAP的客户用于增强SAP的软件应用&ndash;客户可以用ABAP编程开发自定义的报表和界面。这个编程语言对于程序员来说很容易学习但并不是一个非程序设计人员可以直接使用的工具。编写ABAP程序需要良好的编程技巧和关系数据库方面的知识,如果知道面向对象设计的概念更好。

虽然SAP最早于1992年就发布了R/3,但ABAP现在仍可以用于为R/3系统编写程序。在20世纪90年代,随着计算机硬件的发展,越来越多的SAP的应用软件和系统都用ABAP来实现。一直到2001年,几乎所有的基本功能都是由ABAP编程实现的。在1999年,SAP在发布R/3 4.6版的同时也发布了一个对ABAP的面向对象扩展,叫做ABAP Objects。

SAP最新的开发平台NetWeaver同时支持ABAP和Java

[编辑] 实现

[编辑] ABAP程序运行在哪里?

所有的ABAP程序都驻留在SAP数据库里。他们不像Java或者C++程序那样存储在一个单独的外部文件里,在数据库里所有的ABAP代码都以两种形式存在:可以用ABAP workbench查看和编辑的源代码和由ABAP运行环境载入和解释的“编译”代码(技术上更精确的说是“产生”代码)。当一段ABAP源代码第一次被调用时会隐含的进行代码产生。如果稍后源代码改变了或者程序访问的对象改变了(比如数据库的表添加了新的字段),产生代码就会自动重新产生。

ABAP程序在运行时系统(SAP核心的一部分)的控制下运行在SAP应用服务器里.运行时系统负责处理ABAP语句,控制显示的逻辑序列和响应事件(比如,用户按一下屏幕上的一个按钮)。ABAP运行时系统的一个关键组件是数据库接口,它把ABAP的数据库无关语句(“开放SQL”)变成底层数据库管理系统可以理解的语句(“本地SQL”)。数据库接口处理ABAP程序和关系数据库之间所有的通信;它也有一些其他的作用,比如把经常访问的数据缓存到应用服务器本地的存储器里。

[编辑] SAP 系统和风景带

所有的SAP数据和软件都存在/运行于SAP系统的环境中。这个系统包括一个中心关系数据库和一个或多个访问该数据库里的数据和程序的应用服务器(“实例”)。一个SAP系统至少包括一个实例,但可以更多,主要看大小和性能上的需求。在一个多实例系统中,负载平衡机制来保证负载比较平均的分摊到各个可用的应用服务器上。
典型安装的Web应用服务器 (风景带)包括三个系统:一个用于开发,一个用于测试和质量保证,一个用于生产。这个风景带可以包含更多的系统,比如一个单独用于单元测试和产前测试的系统,或者也可以不完全包含这三个系统,比如只有开发和生产,没有单独的质量保证系统; 但三个是最常见的。 ABAP程序的创建和首次运行都在开发系统里。然后被分发到风景带的其他系统里。这些都是在变化和传输系统(CTS)的控制下进行的。CTS是一个负责并发控制(比如防止两个开发人员同时修改同一段代码),版本管理和在质量保证和产品系统上部署程序的系统。

Web应用服务器有三层组成:数据库层,应用层和表现层。这些层可以在同一台或不同的物理机器上运行。数据库层包括关系数据库及相关软件。应用层包括系统的实例。所有应用相关的过程,包括业务事务和ABAP开发,都运行在应用层。表现层处理和系统的用户之间的交互。对ABAP应用服务器的在线访问可以通过专用图形接口SAPGUI或者浏览器进行。

[编辑] ABAP程序的类型

ABAP有两种不同类型的程序:

[编辑] 报表程序

报表程序遵循一个相对简单的编程模型,用户可选的输入一系列参数(比如,在一个数据子集上的选择),然后程序根据输入的参数以一个交互式列表的形式产生一张报表。报表程序的输出之所以是交互式的是因为它不是一个被动的显示;它允许用户使用ABAP语言通过深入挖掘功能以获得某个数据更细节的视图,或者通过菜单命令触发更深入的处理,比如按不同的方式排序数据或者按某种选择条件过滤数据。这种表现报表的方法有很大的优势,特别是对于那些需要处理大量信息但又要以很灵活的方式来检查这些信息的用户,这样他们就不会再被限制到一种固定的显示形式或者大小上无法管理的列表形式的报表中了。这种方便的开发交互式报表的方式是ABAP语言的一大重要闪光点。
“报表”这个词有时会给人一种误解,其实创建数据可以在底层数据库修改而不仅仅是只读的报表程序是完全可以的。

[编辑] 在线程序

在线程序 (也叫模块池)不产生列表。这些程序使用一系列的屏幕来定义更复杂的用户交互模式。术语“屏幕”是指用户看到的实际的物理图像。每个屏幕还有一个“流逻辑”;这是指由屏幕触发的ABAP代码,比如初始化屏幕,响应用户请求的应答和控制模块池的屏幕之间的序列的逻辑。每个屏幕都有自己的流逻辑,每个流逻辑都分为“PBO” (输出前处理)和“PAI” (输入后处理)部分。在SAP的文档中,术语“dynpro” (动态程序)用来表示这种屏幕和流逻辑的结合。
在线程序并不是通过名字调用的,而是和一段事务代码联系在一起。用户可以通过自定义,角色依赖,事务菜单来触发它们。

除了报表和在线程序外,以类库,功能库和子程序池的形式开发共享代码段也是可以的。

[编辑] ABAP Workbench

ABAP Workbench有几个不同的工具用于编辑容器对象。这些工具可以为你提供涵盖整个软件开发周期各阶段的辅助。 创建和编辑容器对象的最重要的工具有:
ABAP Editer:编写程序代码
ABAP Dictionary:处理数据库表定义,检索全局类型
Menu Painter:设计用户界面(包括菜单栏,标准工具栏,应用栏,配置功能键)
Screen Painter:为用户对话框设计屏幕(动态程序)
Function Builder:显示和处理功能模块
Class Builder:显示和处理ABAP对象类

[编辑] The ABAP Dictionary

  • Enforces data integrity
  • Manages data definitions without redundancy
  • Is tightly integrated with the rest of the ABAP/4 Development Workbench.

Enforcing data integrity is the process of ensuring that data entered into the system is logical, complete, and consistent. When data integrity rules are defined in the ABAP/4 Dictionary, the system automatically prevents the entry of invalid data. Defining the data integrity rules at the dictionary level means they only have to be defined once, rather than in each program that accesses that data.
The following are examples of data lacking integrity:
A date field with a month value of 13
An order assigned to a customer number that doesn’t exist
An order not assigned to a customer
Managing data definitions without redundancy is the process of linking similar information to the same data definition. For example, a customer database is likely to contain a customer’s ID number in several places. The ABAP Dictionary provides the capability of defining the characteristics of a customer ID number in only one place. That central definition then can be used for each instance of a customer ID number.
The ABAP Dictionary’s integration with the rest of the development environment enables ABAP programs to automatically recognize the names and characteristics of dictionary objects.
Additionally, the system provides easy navigation between development objects and dictionary definitions. For example, as a programmer, you can double-click on the name of a dictionary object in your program code, and the system will take you directly to the definition of that object in the ABAP/4 Dictionary.
When a dictionary object is changed, a program that references the changed object will automatically reference the new version the next time the program runs. Because ABAP is interpreted, it is not necessary to recompile programs that reference changed dictionary objects.

[编辑] Defining data objects

There are various statements that you can use to define data objects.

The TABLES statement always refers to the global type of a flat structure that is defined in the ABAP Dictionary. The structure type for the data object in the program is taken from the Dictionary. The data object name is identical to the name of the structure type. They are normally used as an interface to the screen.
The DATA statement is usually used to define local data objects. The data object type is specified using the TYPE addition.
The PARAMETERS statement defines not only an elementary data object, but also an input field on the standard selection screen that is processed at the start of the program. When you activate a program, an internal load version is generated. A selection screen is generated from the PARAMETERS statement. When the program starts, memory areas are made available for the data objects. You can find further information on data objects in the unit entitled ABAP Statements and Data Declarations, or in the keyword documentation.
The SELECT statement ensures that data is read from the database. In order to read a record from a database table, the following information must be passed to the database: From which database table is the data read? (FROM clause) How many lines are read? The SINGLE addition shows that only one line is read. Which line is read? The WHERE clause shows which columns of the database table have which values.
For a SELECT SINGLE, the condition must be formulated so that one line is specified unambiguously.
Dialog programs are used for both reading from and writing to the database.

[编辑] Example(ABAP report)

REPORT  Zexmaple_report.
tables :vbrk,vbrp,kna1.
TYPE-POOLS : slis.
data:begin of itab_final occurs 0,
VKBUR like vbrp-VKBUR,
vbeln like vbrk-vbeln,
kunag like vbrk-kunag,
fkdat like vbrk-fkdat,
netwr like vbrk-netwr,
mwsbk like vbrk-mwsbk,
fkimg like vbrp-fkimg,
total like vbrk-netwr,
name1 like kna1-name1,
end of itab_final.
data:begin of itab occurs 0,
VKBUR like vbrp-VKBUR,
vbeln like vbrk-vbeln,
kunag like vbrk-kunag,
fkdat like vbrk-fkdat,
netwr like vbrk-netwr,
mwsbk like vbrk-mwsbk,
fkimg  like vbrp-fkimg,
end of itab.
data: begin of itab_name occurs 0,
name1 like kna1-name1,
erdat like kna1-erdat,
end of itab_name.
DATA: FIELDCATALOG TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
GD_LAYOUT    TYPE SLIS_LAYOUT_ALV,
GD_REPID     LIKE SY-REPID.
DATA : W_BUDAT LIKE EKBE-BUDAT.
datA:T TYPE T.
select-options: vbeln for vbrk-vbeln.
select-options: fkdat for vbrk-fkdat.
select-options: kunag for vbrk-kunag.
select
vbrk~vbeln
vbrk~fkdat
vbrk~netwr
vbrk~mwsbk
vbrk~kunag
vbrp~fkimg
vbrp~vkbur
INTO CORRESPONDING FIELDS OF TABLE itab
FROM VBRK INNER JOIN  VBRP ON VBRK~VBELN = VBRP~VBELN
WHERE  VBRK~FKDAT IN FKDAT AND VBRK~KUNAG IN KUNAG AND VBRK~VBELN IN VBELN.
select name1
erdat
from kna1 into table itab_name
for all entries in itab
where erdat = itab-fkdat.
*---------------------------------------------------------------------------------------------------------*
loop at itab.
itab_final = itab.
read table itab_name with key erdat =  itab-fkdat.
itab_final-name1 = itab_name-name1.
itab_final-total = itab-netwr + itab-mwsbk.
append itab_final.
clear itab_final.

[编辑] Example

From SAP NetWeaver:

*-----------------------------------------------------------------------
* set an exclusive lock at level object-type & object-id
*-----------------------------------------------------------------------
IF NOT lf_bapi_error = true.
IF ( NOT istourhd-doc_type IS INITIAL ) AND
( NOT istourhd-doc_id IS INITIAL )
CALL FUNCTION 'ENQUEUE_/DSD/E_HH_RAREF'
EXPORTING
obj_typ        = istourhd-doc_type
obj_id         = istourhd-doc_id
EXCEPTIONS
foreign_lock   = 1
system_failure = 2
OTHERS         = 3.
IF sy-subrc <> 0.
*       terminate processing...
lf_bapi_error = true.—
*       ...and add message to return table
PERFORM set_msg_to_bapiret2
USING    sy-msgid gc_abort sy-msgno
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
gc_istourhd gc_enqueue_refdoc space
CHANGING lt_return.
ENDIF.
ENDIF.
ENDIF.    " bapi error
HH

posted @ 2007-12-15 09:58 haohello 阅读(64) | 评论 (0)编辑


1、离散傅立叶变换与反变换

/************************************************************************
* 离散傅立叶变换与反变换
* 输入: x--要变换的数据的实部
* y--要变换的数据的虚部
*       a--变换结果的实部
*       b--变换结果的虚部
*       n--数据长度
*    sign--sign=1时,计算离散傅立叶正变换;sign=-1时;计算离散傅立叶反变换
************************************************************************/
void dft(double x[],double y[],double a[],double b[],int n,int sign)
{
int i,k;
double c,d,q,w,s;

q=6.28318530718/n;
for(k=0;k<n;k++)
{
w=k*q;
a[k]=b[k]=0.0;
for(i=0;i<n;i++)
{
d=i*w;
c=cos(d);
s=sin(d)*sign;
a[k]+=c*x
+s*y;
b[k]+=c*y
-s*x;
}
}
if(sign==-1)
{
c=1.0/n;
for(k=0;k<n;k++)
{
a[k]=c*a[k];
b[k]=c*b[k];
}
}
}

 

2四阶亚当姆斯预估计求解初值问题

/************************************************************************
* 用四阶亚当姆斯预估计求解初值问题,其中一阶微分方程未y'=f(x,y)
* 初始条件为x=x[0]时,y=y[0].
* 输入: f--函数f(x,y)的指针
*       x--自变量离散值数组(其中x[0]为初始条件)
*       y--对应于自变量离散值的函数值数组(其中y[0]为初始条件)
*       h--计算步长
*       n--步数
* 输出: x为说求解的自变量离散值数组
*       y为所求解对应于自变量离散值的函数值数组
************************************************************************/
double adams(double(*f)(double,double),double x[],
 double y[],double h,int n)
{
double dy[4],c,p,c1,p1,m;
int i,j;

runge_kuta(f,x,y,h,3);
for(i=0;i<4;i++)
dy
=(*f)(x,y);
c=0.0; p=0.0;
for(i=4;i<n+1;i++)
{
x
=x[i-1]+h;
p1=y[i-1]+h*(55*dy[3]-59*dy[2]+37*dy[1]-9*dy[0])/24;
m=p1+251*(c-p)/270;
c1=y[i-1]+h*(9*(*f)(x
,m)+19*dy[3]-5*dy[2]+dy[1])/24;
y
=c1-19*(c1-p1)/270;
c=c1; p=p1;
for(j=0;j<3;j++)
dy[j]=dy[j+1];
dy[3]=(*f)(x
,y);
}
return(0);
}

3、几种常见随机数的产生

#include "stdlib.h"
#include "stdio.h"
#include "math.h"



double uniform(double a,double b,long int* seed);
double gauss(double mean,double sigma,long int *seed);
double exponent(double beta,long int *seed);
double laplace(double beta,long int* seed);
double rayleigh(double sigma,long int *seed);
double weibull(double a,double b,long int*seed);
int bn(double p,long int*seed);
int bin(int n,double p,long int*seed);
int poisson(double lambda,long int *seed);



void main()
{
double a,b,x,mean;
int i,j;
long int s;

a=4;
b=0.7;
s=13579;
mean=0;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
x=poisson(a,&s);
mean+=x;
printf("%-13.7f",x);
}
printf("\n");
}
mean/=50;
printf("平均值为:%-13.7f\n",mean);
}




/*******************************************************************
* 求[a,b]上的均匀分布
* 输入: a--双精度实型变量,给出区间的下限
*       b--双精度实型变量,给出区间的上限
*    seed--长整型指针变量,*seed为随机数的种子  
********************************************************************/
double uniform(double a,double b,long int*seed)
{
double t;
*seed=2045*(*seed)+1;
*seed=*seed-(*seed/1048576)*1048576;
t=(*seed)/1048576.0;
t=a+(b-a)*t;

return(t);
}

/*******************************************************************
* 正态分布
* 输入: mean--双精度实型变量,正态分布的均值
*      sigma--双精度实型变量,正态分布的均方差
*       seed--长整型指针变量,*seed为随机数的种子  
********************************************************************/
double gauss(double mean,double sigma,long int*seed)
{
int i;
double x,y;
for(x=0,i=0;i<12;i++)
x+=uniform(0.0,1.0,seed);
x=x-6.0;
y=mean+x*sigma;

return(y);
}


/*******************************************************************
* 指数分布
* 输入: beta--指数分布均值
*       seed--种子
*******************************************************************/
double exponent(double beta,long int *seed)
{
double u,x;
u=uniform(0.0,1.0,seed);
x=-beta*log(u);

return(x);
}

/*******************************************************************
* 拉普拉斯随机分布
* beta--拉普拉斯分布的参数
* *seed--随机数种子
*******************************************************************/
double laplace(double beta,long int* seed)
{
double u1,u2,x;

u1=uniform(0.,1.,seed);
u2=uniform(0.,1.,seed);
if(u1<=0.5)
x=-beta*log(1.-u2);
else
x=beta*log(u2);

return(x);
}



/********************************************************************
* 瑞利分布
*
********************************************************************/
double rayleigh(double sigma,long int *seed)
{
double u,x;
u=uniform(0.,1.,seed);
x=-2.0*log(u);
x=sigma*sqrt(x);
return(x);
}

/************************************************************************/
/* 韦伯分布                                                                     */
/************************************************************************/
double weibull(double a,double b,long int*seed)
{
double u,x;

u=uniform(0.0,1.0,seed);
u=-log(u);
x=b*pow(u,1.0/a);

return(x);
}

/************************************************************************/
/* 贝努利分布                                                           */
/************************************************************************/
int bn(double p,long int*seed)
{
int x;
double u;
u=uniform(0.0,1.0,seed);
x=(u<=p)?1:0;
return(x);
}

/************************************************************************/
/* 二项式分布                                                           */
/************************************************************************/
int bin(int n,double p,long int*seed)
{
int i,x;
for(x=0,i=0;i<n;i++)
x+=bn(p,seed);
return(x);
}

/************************************************************************/
/* 泊松分布                                                             */
/************************************************************************/
int poisson(double lambda,long int *seed)
{
int i,x;
double a,b,u;

a=exp(-lambda);
i=0;
b=1.0;
do {
u=uniform(0.0,1.0,seed);
b*=u;
i++;
} while(b>=a);
x=i-1;
return(x);
}

4、指数平滑法预测数据

/************************************************************************
* 本算法用指数平滑法预测数据
* 输入: k--平滑周期
*       n--原始数据个数
*       m--预测步数
*       alfa--加权系数
*       x--指向原始数据数组指针
* 输出: s1--返回值为指向一次平滑结果数组指针
*       s2--返回值为指向二次指数平滑结果数组指针
*       s3--返回值为指向三次指数平滑结果数组指针
*       xx--返回值为指向预测结果数组指针
************************************************************************/
void phyc(int k,int n,int m,double alfa,double x[N_MAX],
 double s1[N_MAX],double s2[N_MAX],double s3[N_MAX],double xx[N_MAX])
{
double a,b,c,beta;
int i;

s1[k-1]=0;
for(i=0;i<k;k++)
s1[k-1]+=x
;
s1[k-1]/=k;
for(i=k;i<=n;i++)
s1
=alfa*x+(1-alfa)*s1[i-1];
s2[2*k-2]=0;
for(i=k-1;i<2*k-1;i++)
s2[2*k-2]+=s1
;
s2[2*k-2]/=k;
for(i=2*k-1;i<=n;i++)
s2
=alfa*s1+(1-alfa)*s2[i-1];
s3[3*k-3]=0;
for(i=2*k-2;i<3*k-2;i++)
s3[3*k-3]+=s2
;
s3[3*k-3]/=k;
for(i=3*k-2;i<=n;i++)
s3
=alfa*s2+(1-alfa)*s3[i-1];
beta=alfa/(2*(1-alfa)*(1-alfa));
for(i=3*k-3;i<=n;i++)
{
a=3*s1
-3*s2+s3;
b=beta*((6-5*alfa)*s1
-2*(5-4*alfa)*s2+(4-3*alfa)*s3);
c=beta*alfa*(s1
-2*s2+s3);
xx
=a+b*m+c*m*m;
}
}

5、四阶(定步长)龙格--库塔法求解微分初值问题

精度比欧拉方法高
但是感觉依然不理想