javaGrowing

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  92 随笔 :: 33 文章 :: 49 评论 :: 0 Trackbacks

2006年11月8日 #

单击“开始→运行”,在“打开”框中键入“MOUNTVOL   /E”,然后单击“确定”按钮,重新启动电脑。
posted @ 2008-11-01 15:19 javaGrowing 阅读(515) | 评论 (0)编辑 收藏

Archetype Command
JSF Basic mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
Spring MVC Basic mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
Struts 2 Basic mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
Tapestry Basic mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-tapestry -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
JSF Modular mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-jsf -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
Spring MVC Modular mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-spring -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
Struts 2 Modular mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-struts -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
Tapestry Modular mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-tapestry -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject
Core
(backend only)
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-core -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject

You should be able to run AppFuse immediately if you have a MySQL 5.x database installed and it's accessible to root using no password. If you'd prefer to use an embedded database, we've recently added Database Profiles for H2, HSQLDB, etc.

MySQL Security
Running MySQL using root with no password is not the most secure thing to do. Once your database is created, you can change the root password using the command below:
mysql --user=root --pass='' mysql -e "update user set password=password('newpw') where user='root'; flush privileges;"

AppFuse uses the username "root" and a blank password by default. To change these values, modify the <jdbc.username> and <jdbc.password> properties in your project's pom.xml (at the bottom).

Run your application

Running AppFuse is easy now. Once the archetype project is created, Maven will create and populate your database using the hibernate3 and dbunit plugins, respectively. All you have to do is use Maven to run the Jetty container and view your application.

  1. Check your new project into source control, unless you have a good reason not to. Google Code has free Subversion hosting, as do many others.
  2. From the command line, cd into your new project's directory and run mvn to download JARs, Tomcat and run the integration tests in your project. Now is a good time to take a coffee break or grab a beer - downloading everything and running the tests can take 5-10 minutes.
  3. To view your application run mvn jetty:run-war from your project's directory (for a modular project, you'll need to run mvn jetty:run-war from your project's web directory). Maven will start Jetty and you should be able to view your application in your browser at http://localhost:8080.
    The default username/password for an admin user is admin/admin. For a regular user, use user/user.
  4. To override files from AppFuse, run mvn war:inplace. This will extract the dependent WARs into src/main/webapp, where you can change files to your heart's content. When you have the war expanded in your source tree, you can run mvn jetty:run. This will allow you to change files on-the-fly and Jetty will reload them as needed. The only problem with this approach is you end up with an "exploded AppFuse" in your project, which won't bode well for upgrading. We recommend you check your project into source control before running mvn war:inplace. That way, it'll be easier for you to decide what needs to be checked in (over written) and what can be deleted.

If you receive OutOfMemory errors when using mvn jetty:run, see this mailing list thread.

You can change AppFuse from its "embedded mode" to full-source mode by running mvn appfuse:full-source from your project's root directory.

Bug with Ant 1.7.0
Local repositories and projects on Windows platforms are held in directories whose paths contain no spaces. To fix this issue, modify your $M2_HOME/conf/settings.xml and change your localRepository to something like the following:
<localRepository>c:\docume~1\username\.m2\repository</localRepository> 
Development Environment
See development environment for detailed instructions on how to setup your computer to develop AppFuse-based applications.
Changing database settings
To change your MySQL database settings, simply change the <jdbc.*> properties at the bottom of your pom.xml. See Database Profiles to use a database other than MySQL


set MAVEN_OPTS=-Xmx512m -Xms512m -XX:MaxPermSize=512m
posted @ 2008-09-03 18:07 javaGrowing 阅读(471) | 评论 (0)编辑 收藏

今天我在调程序时,遇到了见郁闷的事,我用ajax从前台显示页面传字符串变量给处理页面,出现了件怪事,我想传的内容是abc+,但接收以后用System.out.println()输出是abc空格。反复测试好几遍,都是这个结果,真是令人郁闷。在网上搜了搜,找到了原因。
原因:   url中有些字符被转义,比如空格被编码成加号,于是传的参数明明是加号,获取的值却成了空格。如何解决呢?如果是通过url传递参数,应该对其进行必要的编码。
解决办法:
         在javascript中加入   function URLencode(sStr)
{
    return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');
}
对字符串进行处理.如:var str=URLencode("abc+")
posted @ 2007-12-19 09:02 javaGrowing 阅读(11299) | 评论 (5)编辑 收藏

The following processes including SD,MM,PP,FI,CO .


SD Relevant Steps:
1.Check if all delivery in due list have been processedVL06G (Could set background jobs to automatically generate the billing due list for posting)
2.Check if all picking in due list have been processedVL06P
3.Check if all goods issue in due list have been processedVL04
4.Check if all billed AR has been release to accountingVFX3

PP Relevant Steps:
1.Check if all back flash error has been solved (COGI Check every day this kind of problem and solved on time)
2.Check if all production orders that will not be followed have been finally  confirmed or technically closed. Do final confirmation even small quantity  variance exist but we consider this order has finished
3.Do technical close at month end for the orders will not be followed in the future
4.Confirmation. Do not confirm any assembly scrap when do production order conf.

MM Relevant Steps
1.Check if all goods movement has been booked in SAP
2.GR/IR clearing accounts maintenance if needed
3.Open the MM period for movement posting when new period starts MMPV

FI Relevant Steps
1.Book all accounting entries for:
- Accrued expense
- Do recurring entry (prepayment, accrued expense, amortization)
- Process G/L, vendor, customer balance & open items
- Cost allocations by FI
2.AM Fixed asset depreciation run and period postingAFAB
3.AM Periodic posting ASKB
4.G/L,AR,AP balance check & Open item clearing
5.Foreign currency revaluation for bank/cash & AR AP open items
Bank/cash revaluation: F.06
AR AP open items: F.05
6.GR/IR clearing account regrouping process F.19
7.Automatic clearing for G/L accounts, vendor and customer F.13

CO Relevant Steps
1.Release standard cost estimate
CK24Only when there are costing run to be released.
2.Cost reallocation according to activity
Distribution: CKV5
Assessment: KSU5
3.Cost splitting among activity KSS2
4.Actual activity price calculation KSII
5.Production order revaluation with actual activity price CON2
6.WIP calculationfor the production orders KKAO
7.Variance calculation for the production orders KKS1
8.Production / Costing orders settlement CO88/KO88
9.Material ledger closing > MMPV first
a.Create costing runCKRU00
b.Allow settlementCKMF_RUN
c.Allow closing entriesCKMG_RUN
d.Material selectionCKMB_RUN
e.Determine costing sequenceCKMC_RUN
f.Settle single levelCKMH_RUN
g.Settle multi levelCKMM_RUN
h.Post closingCKMI
posted @ 2007-12-18 16:03 javaGrowing 阅读(895) | 评论 (0)编辑 收藏

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:
  输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn
  输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。

    这里,我们简单介绍几种排序方法,直接插入排序、希儿排序、冒泡排序、快速排序、直接选择排序,文中所提及的代码在IE6下测试通过。

直接插入排序基本思想
    假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

    算法描述

 function InsertSort(arr) { //插入排序->直接插入法排序
  var st = new Date();
  
var temp, j;
  
for(var i=1; i<arr.length; i++) {
   
if((arr[i]) < (arr[i-1])) {
    temp 
= arr[i];
    j 
= i-1;
    
do {
     arr[j
+1= arr[j];
     j
--;
    }
    
while (j>-1 && (temp) < (arr[j]));
    arr[j
+1= temp;
   }
//endif
  }
  status 
= (new Date() - st) + ' ms';
  
return arr;
 }

希尔排序基本思想
   先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
   该方法实质上是一种分组插入方法。

    算法描述

 

function ShellSort(arr) { //插入排序->希儿排序
  var st = new Date();
  
var increment = arr.length;
  
do {
   increment 
= (increment/3|0+ 1;
   arr 
= ShellPass(arr, increment);
  }
  
while (increment > 1)

  status 
= (new Date() - st) + ' ms';
  
return arr;
 }
 
function ShellPass(arr, d) { //希儿排序分段执行函数
  var temp, j;
  
for(var i=d; i<arr.length; i++) {
   
if((arr[i]) < (arr[i-d])) {
    temp 
= arr[i]; j = i-d;
    
do {
     arr[j
+d] = arr[j];
     j 
= j-d;
    }
    
while (j>-1 && (temp) < (arr[j]));
    arr[j
+d] = temp;
   }
//endif
  }
  
return arr;
 }

冒泡排序基本思想
    将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组 R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

    算法描述
 

function BubbleSort(arr) { //交换排序->冒泡排序
  var st = new Date();
  
var temp;
  
var exchange;
  
for(var i=0; i<arr.length; i++) {
   exchange 
= false;
   
for(var j=arr.length-2; j>=i; j--) {
    
if((arr[j+1]) < (arr[j])) {
     temp 
= arr[j+1];
     arr[j
+1= arr[j];
     arr[j] 
= temp;
     exchange 
= true;
    }
   }
   
if(!exchange) break;
  }
  status 
= (new Date() - st) + ' ms';
  
return arr;
 }

快速排序基本思想
    将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
    在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos- 1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字 pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无 须参加后续的排序。

    算法描述
 

function QuickSort(arr) { //交换排序->快速排序
  if (arguments.length>1) {
   
var low = arguments[1];
   
var high = arguments[2];
  } 
else {
   
var low = 0;
   
var high = arr.length-1;
  }
  
if(low < high){
   
// function Partition
   var i = low;
   
var j = high;
   
var pivot = arr[i];
   
while(i<j) {
    
while(i<&& arr[j]>=pivot)
     j
--;
    
if(i<j)
     arr[i
++= arr[j];
    
while(i<&& arr[i]<=pivot)
     i
++;
    
if(i<j)
     arr[j
--= arr[i];
   }
//endwhile
   arr[i] = pivot;
   
// end function
   var pivotpos = i; //Partition(arr,low,high);
   QuickSort(arr, low, pivotpos-1);
   QuickSort(arr, pivotpos
+1, high);
  } 
else
   
return;
   
return arr;
 }

直接选择排序基本思想
   n个记录的文件的直接选择排序可经过n
-1趟直接选择排序得到有序结果:
 ①初始状态:无序区为R[
1..n],有序区为空。
 ②第1趟排序
    在无序区R[
1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
  ……
 ③第i趟排序
  第i趟排序开始时,当前有序区和无序区分别为R[
1..i-1]和R[i..n](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R [k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
    这样,n个记录的文件的直接选择排序可经过n
-1趟直接选择排序得到有序结果。

    算法描述
 
function SelectSort(arr) { //选择排序->直接选择排序
  var st = new Date();
  
var temp;
  
for(var i=0; i<arr.length; i++) {
   
var k = i;
   
for(var j=i+1; j<arr.length; j++) {
    
if((arr[j]) < (arr[k]))
     k 
= j;
   }
   
if (k != i){
    temp 
= arr[i];
    arr[i] 
= arr[k];
    arr[k] 
= temp;
   }
  }
  status 
= (new Date() - st) + ' ms';
  
return arr;
 }

posted @ 2007-07-23 16:23 javaGrowing 阅读(491) | 评论 (0)编辑 收藏

Dom + Javascript 在本机浏览器中对的表格数据进行排序

在本机浏览器中对的表格数据进行排序
在Web应用中,数据从服务器端返回到客户端,以表格形式表现出来。如果要对数据集按指定的列排序显示,常规做法都是向服务器发出请求,服务器端程序重新从数据库中取出按指定列排序的数据,返回给客户端,页面重新显示排序后数据。
 
采用这种方式有如下缺点:
1- 响应时间延迟,每次排序都要向服务器端发送请求,等待结果返回,同时增加网络负载。
2- 编程复杂,可维护性差,而且客户端和服务器端代码耦合度很高,客户端和服务器端都要处理排序涉及的列名、排序方式,如果有分页和查询条件,都需要在客户端页面中保留,排序请求时重新传递到服务器端,当参数数量很多时极易出错。
3- 重用度很低,针对不同表格,很难抽象出一个公共程序来共用,需要逐个编写代码实现,增加工作量。
 
现在换一个角度考虑,数据既然已下载到了客户端,在重新排序时没有必要再重服务器端获取,只要对浏览器中的数据重新排序显示就可以了。要实现该目标,需要做到以下几点:
1 - 获得表格中要排序的数据,将其放入一个2维数组中。
2 - 对2维数组排序。
3 - 用排序后的数据重新更新表格。
 
利用浏览器支持的DOM(Document Object Model)和JavaScript即可实现上述目标。
 
通常页面中会很多的<table>,要获得需要排序数据所在的table,需要在<table>中增加一个id属性,便于document对象用getElementById得到该表格对象,例如要排序的表格定义如下:
 <table id="st" >
    <tr>
        <td>1</td>
        <td>2</td>
    </tr>
</table>
 
在javascript中,用var objTable = document.getElementById("st")就可得到表格对象,该对象在DOM中定义为一个Element。
 
然 后用 var objRows = objTable.getElementsByTagName("tr")得到该表格中全部的行对象,ObjRows.length返回该表格行数; var rowi = objRows[i].getElementsByTagName("td")得到第i行的全部<td>节点,i从0开始计数, rowi.item(j)则可得到第i行,第j列的节点,该节点的innerHTML为该节点<td></td>之间的内容。
 
获取表格数据到2维数组的代码见源代码,此处略。
 
下面说明在javascript中2维数组的构造和排序。
javascript不支持2维数组,因此需要用数组的数组来模拟一个2维数组,其方法是先定义一个1维数组,元素个数为2维数组的行数,然后对每个元素赋一个值,值为一个数组,其元素个数为2维数组的列数。构造代码如下:
 
var rows = new Array(R);  //R为行数
for(var i = 0; i < rows.length; i++){
    rows[i] = new Array(C);    //C为列数
}
 
 
利用javascript中的Array.sort(comparer)对rows中的元素排序,比较方式由重新定义的比较函数得到。要根据第j列元素的大小排序,只要定义如下函数即可:
 
function compareCol(a,b){
   
    if (a[j] < b[j])
        return -1;
 
    if (a[j] > b[j])
        return 1;
 
   return 0;
 
}
 
因为compareCol只能有两个参数,因此j要定义为全局变量。
 
用rows.sort (compareCol)就可实现根据j列值的大小对行进行排序。根据javascript文档,字符串比较大小是按照其Unicode编码的大小来比 较,对英文排序没有问题,对中文排序时就不是按通常的拼音排序,那需要javascript提供本地化支持,目前没有发现javascript此功能。该 功能在java中可用java.text.Collator实现。
 
 
 以上介绍了在本地对浏览器中的数据进行排序的主要思想, 为方便使用,将这些功能进行了封装,以javascript函数的提供,存放在sorttable.js文件中,在需要的页面中用<script type=text/javascript src='sorttable.js'></script>引入。
 
 
 下面说明排序函数原型和使用方法。
 
函数1 function sortTable(tableId,sortCol,compareType)
对页面中指定表格中的数据进行排序,通常第一行为标题行,排序时从第二行开始,第一次调用为升序排列,第二次为降序排列,依次轮换。
tableId    为<table id=''>中id的值,在同一个页面中要唯一。
sortCol    排序时用来比较大小的数据所在的列,从1开始计数。
compareType 排序时比较大小的方式,s-按字符串比较大小,n-按数字比较大小。
 
 
 
 函数2 function sortTableInRange(tableId,sortCol,compareType,startRow,endRow,startCol,endCol)
 
        对表格中指定的区域数据排序,有时数据第一列为流水号,最后一行为合计,这些数据不需要参与排序,可用此函数来对部分数据排序。
       
        tableId    为<table id=''>中id的值,在同一个页面中要唯一。
        sortCol    排序时用来比较大小的数据所在的列,从1开始计数。
        compareType 排序时比较大小的方式,s-按字符串比较大小,n-按数字比较大小。
        startRow,endRow 要排序区域开始和结束行号,从1开始计数。例如对第2行到第7行排序,startRow=2,endRow=7
        startCol,endCol  要排序区域开始和结束列号,从1开始计数。
 
 
 
 
 
存在的问题:
1- 中文不能按拼音排序。
 
 
要注意的问题:
要排序的table必须用ID标示,并要作为参数传给排序函数,表格中的数据应该是可以排序的,否则结果不可预知;要排序的表格不能有嵌套表,否则排序出错。
 
 
本函数已在IE6.0 ,FireFox1.01中运行通过。源代码和例子代码见后。
 
 
 
 
参考资料:
 
Danny Goodman with Michael Morrison   JavaScript Bible 5th  ,John Wiley and Sons  2004
 
David Flanagan  JavaScript The Definitive Guide 4th ,  O'Reilly  2001
 
 
 
 
 
 附源代码:要运行例子,需要将javascript代码保存到sorttable.js文件中,html部分代码保存到同一目录下另一文件中即可。
 
 
sorttable.js
 
 

 1 //=========================================================
 2  //
 3  //  在本机对浏览器页面表格中的数据行进行排序的javascript函数
 4  // 
 5  //  author William  QQ: 22967225
 6 //  create date 2005-12-2
 7  //  version 1.0
 8  //=========================================================
 9 
10  //column index for sort
11  var indexCol;
12  //比较函数,用于Array.sort()排序时比较用。
13  //本函数比较数组元素array1[indexCol]和元素array2[indexCol]Unicode值的大小
14  function arrayCompare(array1,array2){
15   //alert(array1.length+"--"+array1[indexCol]);
16   if (array1[indexCol] < array2[indexCol])
17    return -1;
18   if (array1[indexCol] > array2[indexCol])
19    return 1;
20  
21   return 0;
22  
23  }
24  //比较数组元素array1[indexCol]和元素array2[indexCol]的数值大小
25  function arrayCompareNumber(array1,array2){
26  
27   if (parseInt(array1[indexCol]) < parseInt(array2[indexCol]))
28    return -1;
29   if (parseInt(array1[indexCol]) > parseInt(array2[indexCol]))
30    return 1;
31  
32   return 0;
33  }
34  //与arrayCompare相反方式比较大小,用于倒序使用
35  function arrayCompareRev(array1,array2){
36  
37   if (array1[indexCol] < array2[indexCol])
38    return 1;
39   if (array1[indexCol] > array2[indexCol])
40    return -1;
41  
42   return 0;
43  
44  }
45  //与arrayCompareNumber相反方式比较大小,用于倒序使用
46  function arrayCompareNumberRev(array1,array2){
47   if (parseInt(array1[indexCol]) < parseInt(array2[indexCol]))
48    return 1;
49   if (parseInt(array1[indexCol]) > parseInt(array2[indexCol]))
50    return -1;
51  
52   return 0;
53  }
54  
55  //define a 2-dimension array
56  function BiArray(rows,cols){
57  
58   //simulate multidimension array
59   this.rows = rows;
60   this.cols = cols;
61  
62   //construct array
63   var lines = new Array(rows);
64   for(var i = 0;i < lines.length; i++){
65    lines[i] = new Array(cols);
66   }

 
posted @ 2007-07-23 16:20 javaGrowing 阅读(430) | 评论 (0)编辑 收藏

function toHtml(strBody,cset)
{
 var Rec=new ActiveXObject("ADODB.RecordSet");
 Rec.Fields.Append("DDD",201,1);
 Rec.Open();
 Rec.AddNew();

 Rec(0).AppendChunk(strBody);

 Rec.Update();
 var HTML=Rec(0).Value;
 Rec.Close();
 delete Rec;
 document.charset=cset;
 return(HTML);
}

posted @ 2007-05-26 01:07 javaGrowing 阅读(994) | 评论 (0)编辑 收藏

出处:http://www.smallrain.net/study_show.asp?id=703

<div id="Error"></div>
<div id="State"></div>
<div id="DownloadEnd"></div>
<Script Language="JavaScript">
<!--
// more javascript from http://www.smallrain.net

function Ajax(OnError,OnState,OnDownloadEnd)
{
 // 错误字符串
 this.ErrorStr   = null;
 // 错误事件驱动,当发生错误时触发
 this.OnError   = OnError;
 // 状态事件驱动,当状态改变时触发
 this.OnState   = OnState;
 // 完成事件驱动,当类操作完成时触发
 this.OnDownloadEnd  = OnDownloadEnd;

 // XMLHTTP 发送数据类型 GET 或 POST
 this.method  = "GET";
 // 将要获取的URL地址
 this.URL  = null;
 // 指定同步或异步读取方式(true 为异步,false 为同步)
 this.sync  = true;
 // 当method 为 POST 时 所要发送的数据
 this.PostData  = null
 // 返回读取完成后的数据
 this.RetData   = null;

 // 创建XMLHTTP对像
 this.HttpObj   = this.createXMLHttpRequest();
 if(this.HttpObj == null)
 {
  // 对像创建失败时中止运行
  return;
 }

 var Obj = this;
 // 调用事件检测
 this.HttpObj.onreadystatechange = function()
 {
  Ajax.handleStateChange(Obj);
 }
}

// UTF 转入 GB (by:Rimifon)
Ajax.prototype.UTFTOGB = function(strBody)
{
 var Rec=new ActiveXObject("ADODB.RecordSet");
 Rec.Fields.Append("DDD",201,1);
 Rec.Open();
 Rec.AddNew();
 Rec(0).AppendChunk(strBody);
 Rec.Update();
 var HTML=Rec(0).Value;
 Rec.Close();
 delete Rec;
 return(HTML);
}

// 创建XMLHTTP对像
Ajax.prototype.createXMLHttpRequest = function()
{
 if (window.XMLHttpRequest)
 {
  //Mozilla 浏览器
  return new XMLHttpRequest();
 }
 else if (window.ActiveXObject)
 {
         var msxmls = new Array('Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0','Msxml2.XMLHTTP','Microsoft.XMLHTTP');
         for (var i = 0; i < msxmls.length; i++)
         {
                 try
                 {
                         return new ActiveXObject(msxmls[i]);
                 }catch (e){}

  }
 }
 this.ErrorStr = "你的浏览器不支持XMLHttpRequest对象."
 if(this.OnError)
 {
  this.OnError(this.ErrorStr);
 }
     return null;
}

// 发送HTTP请求
Ajax.prototype.send = function()
{

 if (this.HttpObj !== null)
 {
  this.URL = this.URL + "?t=" + new Date().getTime();
  this.HttpObj.open(this.method, this.URL, this.sync);
  if(this.method.toLocaleUpperCase() == "GET")
  {
   this.HttpObj.send(null);
  }
  else if(this.method.toLocaleUpperCase() == "POST")
  {
   this.HttpObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
   this.HttpObj.send(this.PostData);
  }
  else
  {
   this.ErrorStr = "错误的[method]命令."
   if(this.OnError)
   {
    this.OnError(this.ErrorStr);
   }
   return;
  }

  if (this.HttpObj.readyState == 4)
  {
   // 判断对象状态
              if (this.HttpObj.status == 200)
                 {
    this.RetData = this.UTFTOGB(this.HttpObj.responseBody);
    if(this.OnDownloadEnd)
    {
     this.OnDownloadEnd(this.RetData);
    }
                         return;
                 }
   else
   {
    this.ErrorStr = "您所请求的页面有异常."
    if(this.OnError)
    {
     this.OnError(this.ErrorStr);
    }
    return;
   }
  }

 }

}

// 事件检测
Ajax.handleStateChange = function(Obj)
{
 if(Obj.OnState)
 {
  Obj.OnState(Obj.HttpObj.readyState);
 }

 if (Obj.HttpObj.readyState == 4)
 {
  // 判断对象状态
             if (Obj.HttpObj.status == 200)
                {
   Obj.RetData = Obj.UTFTOGB(Obj.HttpObj.responseBody);
   if(Obj.OnDownloadEnd)
   {
    Obj.OnDownloadEnd(Obj.RetData);
   }
                        return;
                }
  else
  {
   Obj.ErrorStr = "您所请求的页面有异常."
   if(Obj.OnError)
   {
    Obj.OnError(Obj.ErrorStr);
   }
   return;
  }
 }
}


// 错误回调事件函数
function EventError(strValue)
{
 document.getElementById("Error").innerHTML = strValue;
}

// 状态回调事件函数
function EventState(strValue)
{
 var strState = null;
 switch (strValue)
 {
     case 0:
  strState = "未初始化...";
  break;

     case 1:
  strState = "开始读取数据...";
  break;

     case 2:
  strState = "读取数据...";
  break;

     case 3:
  strState = "读取数据中...";
  break;

     case 4:
  strState = "读取完成...";
  break;

     default:
  strState = "未初始化...";
  break;
 }
 document.getElementById("State").innerHTML = strState;
}

// 完成回调事件函数
function EventDownloadEnd(strValue)
{
 document.getElementById("DownloadEnd").innerHTML = strValue;
}


// 初始化Ajax对像,引入事件回调函数
var A1 = new Ajax(EventError,EventState,EventDownloadEnd);
// 指定method数据发送类型
A1.method = "GET";
// 指定URL地址
A1.URL = "http://www.smallrain.net/help.htm"
// 指定为异步处理
A1.sync = true;
//发送请求
A1.send();
//-->
</Script> 

posted @ 2007-05-26 00:37 javaGrowing 阅读(645) | 评论 (0)编辑 收藏

ajax代理程序自动判断字符编码

作者:llinzzi 时间: 2006-03-16 文档类型:原创 来自:蓝色理想
浏览统计 total:6402 | year:1609 | Quarter:376 | Month:132 | Week:26 | today:2

由于ajax在跨域的访问上有问题,目前最好的方法是做代理.写了个代理程序和心得.

为了做ajax的代理,研究了下服务器端的xmlhttp并和客户端的ajax中的xmlhttp做了个比较,后台代码是asp的.

服务器端的xmlhttp也就是asp小偷程序,我把代码改成了javascript.

1.在服务器端的xmlhttp.Open("GET",url,false)异步必须是关闭的,而客户端的异步是打开的,这个很好理解.
2.在服务器端的xmlhttp.Responsebody 这里用的是Responsebody而不是ResponseText或ResponseXml,一开始我是用ResponseText,但在函数bytesToBSTR转换编码的时候提示错误,经过比较发现其他的asp小偷程序里的代码都是Responsebody,分析后,发现body返回来的是二进制数据而不是像ResponseText或ResponseXml那样返回字符或dom对象.

ajax的asp代理函数介绍:
send_request(url) ,url为地址

服务器端代码如下带自动判断所有字符编码,已测试 日语 韩语 繁体:

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>XMLHTTP</title>
</head>
<%

 

Server.ScriptTimeout=9999999;
function send_request(url) {
 var codedtext;
 http_request = Server.CreateObject("Microsoft.XMLHTTP");
 http_request.Open("GET",url,false);
 http_request.Send(null);
 if (http_request.ReadyState == 4){
  //自动判断编码开始
  var charresult = http_request.ResponseText.match(/CharSet=(\S+)\">/i);
  if (charresult != null){
  var Cset = charresult[1];
  }else{Cset = "gb2312"}//对获取不到的网站采用gb2312编码,可自行更改
  
//自动判断编码结束
  codedtext = bytesToBSTR(http_request.Responsebody,Cset);
  }else{
  codedtext = "Erro";
  }
 return(codedtext);
}

function bytesToBSTR(body,Cset){
var objstream;
objstream = Server.CreateObject("Adodb.Stream");
objstream.Type = 1;
objstream.Mode = 3;
objstream.Open();
objstream.Write(body);
objstream.Position = 0;
objstream.Type = 2;
objstream.Charset = Cset;
bytesToBSTR = objstream.Readtext;
objstream.Close;
return(bytesToBSTR);
}

%>
<body>
<% Response.Write(send_request("http://www.daum.net")) %>
</body>
</html>

posted @ 2007-05-26 00:31 javaGrowing 阅读(423) | 评论 (0)编辑 收藏

一. Input和Output
1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:
1.1 以字节为导向的stream
以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:
1) input stream:
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream:把一个String对象作为InputStream
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream:把多个InputStream合并为一个InputStream
2) Out stream
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
4) SequenceOutputStream:把多个OutStream合并为一个OutStream
1.2 以Unicode字符为导向的stream
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:
1) Input Stream
1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应
2) Out Stream
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。
1.3 两种不现导向的stream之间的转换
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
2. stream添加属性
2.1 “为stream添加属性”的作用
运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。
如果我们要往一个文件中写入数据,我们可以这样操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类,为FileOutStream添加我们所需要的功能。
2.2 FilterInputStream的各种类型
2.2.1 用于封装以字节为导向的InputStream
1) DataInputStream:从stream中读取基本类型(int、char等)数据。
2) BufferedInputStream:使用缓冲区
3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)
4) PushbackInputStream:很少用到,一般用于编译器开发
2.2.2 用于封装以字符为导向的InputStream
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
2) BufferedReader:与BufferedInputStream对应
3) LineNumberReader:与LineNumberInputStream对应
4) PushBackReader:与PushbackInputStream对应
2.3 FilterOutStream的各种类型
2.2.3 用于封装以字节为导向的OutputStream
1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
2) BufferedOutStream:使用缓冲区
3) PrintStream:产生格式化输出
2.2.4 用于封装以字符为导向的OutputStream
1) BufferedWrite:与对应
2) PrintWrite:与对应
3. RandomAccessFile
1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置
4. I/O应用的一个例子
import java.io.*;
public class TestIO{
public static void main(String[] args)
throws IOException{
//1.以行为单位从一个文件读取数据
BufferedReader in =
new BufferedReader(
new FileReader("F:\\nepalon\\TestIO.java"));
String s, s2 = new String();
while((s = in.readLine()) != null)
s2 += s + "\n";
in.close();

//1b. 接收键盘的输入
BufferedReader stdin =
new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Enter a line:");
System.out.println(stdin.readLine());

//2. 从一个String对象中读取数据
StringReader in2 = new StringReader(s2);
int c;
while((c = in2.read()) != -1)
System.out.println((char)c);
in2.close();

//3. 从内存取出格式化输入
try{
DataInputStream in3 =
new DataInputStream(
new ByteArrayInputStream(s2.getBytes()));
while(true)
System.out.println((char)in3.readByte());
}
catch(EOFException e){
System.out.println("End of stream");
}

//4. 输出到文件
try{
BufferedReader in4 =
new BufferedReader(
new StringReader(s2));
PrintWriter out1 =
new PrintWriter(
new BufferedWriter(
new FileWriter("F:\\nepalon\\ TestIO.out")));
int lineCount = 1;
while((s = in4.readLine()) != null)
out1.println(lineCount++ + ":" + s);
out1.close();
in4.close();
}
catch(EOFException ex){
System.out.println("End of stream");
}

//5. 数据的存储和恢复
try{
DataOutputStream out2 =
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("F:\\nepalon\\ Data.txt")));
out2.writeDouble(3.1415926);
out2.writeChars("\nThas was pi:writeChars\n");
out2.writeBytes("Thas was pi:writeByte\n");
out2.close();
DataInputStream in5 =
new DataInputStream(
new BufferedInputStream(
new FileInputStream("F:\\nepalon\\ Data.txt")));
BufferedReader in5br =
new BufferedReader(
new InputStreamReader(in5));
System.out.println(in5.readDouble());
System.out.println(in5br.readLine());
System.out.println(in5br.readLine());
}
catch(EOFException e){
System.out.println("End of stream");
}

//6. 通过RandomAccessFile操作文件
RandomAccessFile rf =
new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
for(int i=0; i<10; i++)
rf.writeDouble(i*1.414);
rf.close();

rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();

rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
rf.seek(5*8);
rf.writeDouble(47.0001);
rf.close();

rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();
}
}
关于代码的解释(以区为单位):
1区中,当读取文件时,先把文件内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。
1b区中,由于想以缓存字节读取方式从标准IO(键盘)中读取数据,所以要先把标准IO(System.in)转换成字符导向的stream,再进行BufferedReader封装。
2区中,要以字符的形式从一个String对象中读取数据,所以要产生一个StringReader类型的stream。
4区中,对String对象s2读取数据时,先把对象中的数据存入缓存中,再从缓冲中进行读取;对TestIO.out文件进行操作时,先把格式化后的信息输出到缓存中,再把缓存中的信息输出到文件中。
5区中,对Data.txt文件进行输出时,是先把基本类型的数据输出屋缓存中,再把缓存中的数据输出到文件中;对文件进行读取操作时,先把文件中的数据读取到缓存中,再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble(),所以为了正确显示。也要以基本类型的形式进行读取。
6区是通过RandomAccessFile类对文件进行操作。

posted @ 2007-05-19 20:11 javaGrowing 阅读(325) | 评论 (0)编辑 收藏

  表     说明
组织结构             T001  Company Code
TVKO Sales Organization
TSPA DIvision
TVTW Distribution Channel
TVTA Sales Area
TVBUR Sales Office
TVGRP Sales Person Group
T001W Plant
TVST Shipping Point
TVLA Loading Point
T014 Credit Control Area
客户         KNA1   General Data                  KNB1   Customer Master – Co.
posted @ 2007-05-17 09:30 javaGrowing 阅读(418) | 评论 (0)编辑 收藏

SD 和 MM 模块的业务集成:

1. 当你创建销售订单(SO),所有的项目将从MM模块拷贝物料主数据.

2. MRP和可用性检查也从MM模块读取相关数据.

3. While you create inbound/outbound delivery with reference to a sales order,the shipping point determination takes place with the help of the loading group, plant data, shipping conditions etc. This also refers to Material Master.

4. The material which you are entering in a sales order must be extended to the sales area of your sales order/customer otherwise you cannot transact with this material.

SD 和 FI模块的业务集成 :-

1. Whenever you create a delivery with reference to a sales order, goods movement takes place in the bacgground. eg. In case of standard sales order, you create an outbound goods delivery to the customer.
Here movement 601 takes place. This movement is configured in MM. Also, this movement hits some G/L account in FI. Every such movement of good s hits some G/L account.

2. The accounts posting in FI is done with reference to the billing documents (invoice, debit note, credit note etc) created in SD. Thus this is a link between SD and FI

3. Tax determination: In case of a tax determination also, there is a direct link between SD and MM

SD 与其他模块的集成点列表

销售订单 – 
Integration Points                      Module
•Availability Check                -       MM
•Credit Check                        -       FI
•Costing                                 -       CO/ MM
•Tax Determination              -       FI
•Transfer of Requirements -       PP/ MM

发货和过账 – 
Integration Points                      Module
•Availability Check                 -       MM
•Credit Check                         -       FI
•Reduces stock                     -       MM
•Reduces Inventory $           -       FI/ CO
•Requirement Eliminated   -       PP/ MM

发票 -
Integration Points                      Module
•Debit A/R                              -       FI/ CO
•Credit Revenue                   -       FI/ CO
•Updates G/ L                       -       FI/ CO
  (Tax, discounts, surcharges, etc.)
•Milestone Billing                 -       PS

退货 & Credit Memo -
Integration Points                      Module
•Increases Inventory               -       MM
•Updates G/ L                          -       FI
•Credit Memo                           -       FI
•Adjustment to A/R                  -       FI
•Reduces Revenue                -       FI 

  个人收集的业务重要函数

Function Name
Function Description
Function Pool
Function Pool Description
示例程序
 
SD_SALEDOCUMENT_CREATE
 
 
 
 
SD_ORDER_CREDIT_RELEASE
SD 信用管理
VKMP
 
 
RV_AVAILABILITY_CHECK
RV 可用量和需求
V03V
 
 
RV_REQUIREMENT_GENERATE
RV 可用量和需求
V03V
 
 
RV_DELIVERY_CREATE
SD 交货汇总处理
V50S
 
 
 
 
 
 
 
出库单-》财务凭证
WS_REVERSE_GOODS_ISSUE
Goods Mvmnts and Goods Mvments Reversals
V51W
 
RVV50L09
MB_CREATE_GOODS_MOVEMENT
为交货的发货
MBWL
 
 
MB_CANCEL_GOODS_MOVEMENT
为交货的发货
MBWL
 
 
订单 / 出库单-》发票
RV_INVOICE_CREATE
出具发票(新建)
V60A                      
 
 
RV_INVOICE_DOCUMENT_ADD
 (保存)其中 SLL_DOCUMENT_TRANSFER单元的调用可作发票出口
 
 
 
 
 
发票-》财务凭证
RV_ACCOUNTING_DOCULIST_CREATE
 
V60B                      
RV-RF 接口
 
RV_ACCOUNTING_DOCUMENT_CREATE
发票-》凭证
V60B                      
RV-RF 接口
VF02 (过帐)
FI_PERIOD_CHECK
财务会计-》凭证-》过帐期间-》未清和关帐过帐期间(表t001b
FACS
FI/CO 接口的 FI 服务
很多的检查函数
sd_invoice_release_to_account
释放发票-》凭证
调用
RV_INVOICE_DOCUMENT_ADD
V60A                    
RV-RF 接口
VFX3
RV_INVOICE_LIST_DOCUMENT_ADD
 
V60A
 
VF02
RV_INVOICE_DOCUMENT_ADD
根据 RFBFK 决定是否调用( 591 行) RV_ACCOUNTING_DOCUMENT_CREATE
V60A
 
VF02 (保存)
 
 
 
 
 
 
AC_DOCUMENT_CREATE
 
RWCL
会计合算接口
 
AC_DOCUMENT_REVERSE
 
RWCL
会计合算接口
 
 
 
 
 
 
 
RV_MISSING_DOCUMENT_DATA
确定不完整的销售凭证
VO5M
 
RVAUFERR
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
NUMBER_CHECK
检查号码是否在号码区间内
 
R/3 Central Basis Development: Number Ranges
 
BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 182pt; PADDING-TOP
posted @ 2007-05-17 09:29 javaGrowing 阅读(2320) | 评论 (0)编辑 收藏

总的说来,credit memo和debit memo是对企业向顾客已经交付的货物的价值进行调整的单据类
型。举个例,如果您已经就所交付的货物向买主开具了100元的发票,可是由于货物质量的瑕疵,
买主主张“货接受但必须削价10元”,如果您接受了这个主张,那您就得开具10元的credit memo
(即实际业务中的所谓“红字发票”)。总之,与原始invoice的价值相比,增价用debit memo,
降价用credit memo,两者都是billing document type。
credit memo request 和debit memo request都是sales document type,其原理与一般的销售订
单类型并无质的区别。只是,两个memo request的下游transaction都是直接参照订单创建
billing document,而不需要有delivery。
credit memo request --> credit memo, debit memo request --> debit memo,这就是它们的
流程。
posted @ 2007-05-17 09:22 javaGrowing 阅读(607) | 评论 (0)编辑 收藏

1.      内表的类型及定义:

1 .ANY TABLE :即任意表类型,此种定义方式只能在传递参数的时候定义。

      例如: FORM XXX USING/CHANGING TYPE ANY TABLE .

2 .ANY TABLE 包括了两种类型: INDEX TABLE HASHED TABLE

   1 .INDEX TABLE :包括了 STANDARD TABLE SORTED TABLE

A.      STANDARD TABLE :其实就是一个线性表,通过 key 访问内表是线性查找的,也就是说,随着表中记录的增加,对表的操作的时间开销也相应的增加。

定义方法: TYPES/DATA LIKE/TYPE STANDARD TABLE OF .

B.      SORTED TABLE: 顾名思义,表中的记录是按照一定的顺序排列的。访问表的主要方式是表中定义的 key ,如果 key 不唯一,则选择 index 最小的那个。也可以通过 index 来访问排序表,如果你想通过 index 插入一条记录,系统会自动检查你插入的位置是否正确。所以,如果插入的时间比插入到标准表的时间会长。因此,尽量选择 key 来对排序表进行操作。

定义方法: TYPES/DATA LIKE/TYPE SORTED TABLE OF .

2 .HASHED TABLE :对哈希表只能用你定义的 key 进行操作,而不能使用 index 进行操作。因此,定义哈希表必须定义 unique key 。注意:所有关于使用 index 操作表的语句都不能用于操作哈希表。例如: sort loop 等。

         定义方法: TYPES/DATA LIKE/TYPE HASHED TABLE OF .

2.      内表的操作:

1 . 创建:

      A. 定义一个结构,然后 type/like 这个结构

         例如:

TYPES: BEGIN OF ,
         ...
         igt; ...,
         ...
       END OF .

DATA  TYPE STANDARD TABLE OF
                 WITH NON-UNIQUE DEFAULT KEY
                 INITIAL SIZE
                 WITH HEADER LINE.

      B. type/like 系统表或者数据库表或者结构

DATA  TYPE STANDARD TABLE OF < 系统表名 >
                 INITIAL SIZE
                 WITH HEADER LINE.

2 . 添加数据:

      A APPEND :直接向表中添加数据

1. APPEND [wa TO|INITIAL LINE TO] itab[ASSIGNING |REFERENCE INTO dref].

2. APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2.

3. APPEND [wa TO] itab SORTED BY f [ASSIGNING

      B .向表中插入数据:

1. INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx] [ASSIGNING |REFERENCE INTO dref].

2. INSERT [wa INTO|INITIAL LINE INTO] TABLE itab [ASSIGNING |REFERENCE INTO dref].

3. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2 [INDEX idx3].

4. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO TABLE itab2.

      C .相同字段求和向表里添加:

Basic form

COLLECT [wa INTO] itab.

Extras:

1. ... ASSIGNING
2. ... REFERENCE INTO dref
3. ... SORTED BY f

3 . 删除数据:

1. DELETE itab.
2. DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn.
3. DELETE TABLE itab [FROM wa].
4. DELETE itab INDEX idx.
5. DELETE itab FROM idx1 TO idx2.
6. DELETE itab WHERE logexp.
7. DELETE ADJACENT DUPLICATES FROM itab.

4 . 修改数据:

1. MODIFY itab [FROM wa] [INDEX idx] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn].

2. MODIFY TABLE itab [FROM wa] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn].

3. MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond.

posted @ 2007-04-30 09:22 javaGrowing 阅读(730) | 评论 (0)编辑 收藏

一,  首先介绍一下 ABAP 的程序的类型:

Program type (程序类型)

Introductory statement (类型描述)

1

REPORT (报表)

M

PROGRAM (屏幕程序)

F

FUNCTION-POOL (函数组)

K

CLASS-POOL (类组)

J

CLASS-POOL (接口组)

T

TYPE-POOL (类型池)

二,  下面介绍报表中用到的事件以及作用 :

1.      LOAD-OF-PROGRAM :程序开始执行时候自动调用

这个事件在 SUBMIT CALL TRANSACTION PERFORM 等执行的时候系统会自动调用这个事件。所以无需声明即可。

2.      INITIALIZATION

1 . 只能用于报表程序

2 . 在选择屏幕出现之前执行,如果用逻辑数据库的话,这个是唯一能够修改选择屏幕初始值的地方。

3 . 通常的用法是在这里给选择屏幕中的字段赋值。

3.      AT SELECTION-SCREEN

1 . 其实就像一个 FORM ,所以在这个事件里声明的变量都是局部变量。

2 . 根据 SY-UCOMM 这个系统变量可以判断用户的命令

3 . 在这个事件里响应的是屏幕上选择条件中的事件,例如 CHECKBOX 的选择与否, RADIOBUTTON 的选择, LISTBOX 的选择等等。所以分为以下几个方面:

1. ... ON psel :在 PARAMETER 变化是触发的事件

2. ... ON END OF sel SELECT-OPTION 触发的事件

3. ... ON VALUE-REQUEST FOR psel_low_high :选择的帮助 (F4)

4. ... ON HELP-REQUEST FOR psel_low_high :选择的帮助 (F1)

5. ... ON RADIOBUTTON GROUP radi :单选按钮事件

6. ... ON BLOCK block :框架的触发事件

7. ... OUTPUT :响应屏幕上的事件,修改选择屏幕的唯一方法

4.      START-OF-SELECTION

报表程序必须执行的事件,在进入第二屏幕之前触发。

5.      GET

获得逻辑数据库的值。前提是必须首先声明逻辑数据库。

6.      END-OF-SELECTION

第二屏幕显示完毕,结束处理。

7.      MODULE

这个是当你调用自己定义的屏幕时,响应屏幕事件的方法。

8.      ENDMODULE

9.      CHECK

只对逻辑数据库使用,检查是否取得数据。

10.   REJECT

同样只对逻辑数据库使用,退出。

11.   STOP

结束一个处理块。

12.   RETURN

返回一个处理块。

三,  附加说明:

1.      SET PF-STATUS

基本语法格式: SET PF-STATUS pfstat.

扩展:

1. ... EXCLUDING f oder ... EXCLUDING itab

2. ... IMMEDIATELY

3. ... OF PROGRAM progname

      这个是设置屏幕菜单,命令行等的命令,详细地信息我会在后面关于菜单设计的时候说明。

2.      SET TITLEBAR

设置屏幕标题,在屏幕显示之前调用。

posted @ 2007-04-30 09:21 javaGrowing 阅读(1182) | 评论 (0)编辑 收藏

 (转贴,希望给和我一样在“黑暗”中摸索的ABAP初学者一点指引)

1、在SE38环境下的程序名输入栏输入'DEMO*'后按F4,你可以查到SAP所有的DEMO示例程序,好好看看,你会学到很多ABAP功能的实现方法。

2、运行“ABAPDOCU”T-cdoe,你可以看到ABAP DOCUMENT及示例程序。

3、想提高ALV的编程水平吗?

在SE38环境下的程序名输入栏输入'BCALV*'后按F4,你可以查到很多ALV示例程序,慢慢看吧。

posted @ 2007-04-30 09:07 javaGrowing 阅读(847) | 评论 (0)编辑 收藏

AR Processing for FINIParadise
1. Create Customer
2. Create Sales Organization view for Customer
3. Check material Master ( Finished goods)
T-code: MM03
4. Create sales order T-code: VA01
5. Make delivery Note  T-code: VL01N
6. Post Good issue  T-code: VL02N
7. Check Material document and accounting document
8. Billing from SD 
T-code: VF01
9. Check Open item for the Customer  T-code:FBL5N
10. Manual incoming  payment  T-code:F-28
11. Check Open Item again
12. Check Sales and COGS in DC-SOI reports  
T-code: KE30
posted @ 2007-04-30 08:59 javaGrowing 阅读(341) | 评论 (0)编辑 收藏

  SBO 中销售订单的价格是按照此优先级进行定价的:业务伙伴的特殊价格 > 业务伙伴的折扣组 > 价格清单的层次展开 > 价格清单。
条件是:预先给业务伙伴设定价格清单 a ,里面有物料 a1 ,价格为 600 a1 物料属于 CPU 物料组。
1
、如果业务伙伴设定了特殊价格为 500 ,在做 a1 的销售订单时,则销售订单中的价格会采用 500
2
、如果没有为业务伙伴设定特殊价格,则系统会看是否有为业务伙伴设置折扣组,如果为此业务伙伴下面的 CPU 物料组设置了 10%, 则销售订单中的价格为 600× 1 10%)=540
3
、如果以上都没有为业务伙伴设置特殊价格及折扣组,则系统再会判断业务伙伴预先设定的价格清单有无做清单扩展,比如价格清单 a 中的物料 a1 在国庆期间打 8 折,则销售订单中的价格为 600×0.8=480
4
、如果以上都未设置,则系统会直接采用预先给业务伙伴设定的价格清单 a a1 物料的价格 600
posted @ 2007-04-30 08:52 javaGrowing 阅读(508) | 评论 (0)编辑 收藏

SD Relevant Steps:
1.Check if all delivery in due list have been processedVL06G
(Could set background jobs to automatically generate the billing due list for posting)
2.Check if all picking in due list have been processedVL06P
3.Check if all goods issue in due list have been processedVL04
4.Check if all billed AR has been release to accountingVFX3

posted @ 2007-04-30 08:48 javaGrowing 阅读(448) | 评论 (0)编辑 收藏

成品进仓管理流程 :

1、仓库根据已审核《采购订单》内容准备成品收货。

 2、厂家送货到达后,厂家提供《送货清单》给收货仓管员,《送货清单》应清晰显示送货单位名称、送货单位印章或经手人签名、货品的名称、规格、数量、采购订单号。收货仓管员将《送货清单》和对应的《采购订单》相核对。相核不符者拒收。相符者仓管员以《送货清单》和《采购订单》验收货品,收货量大于定购量时,仓库主管要通过营销部同意和取得营销部有权人的书面通知后才能超量收货。

 3、仓管员收货无误后,在《送货清单》上签收,并加盖收货专用章,一联自留,一联交对方。

 4、仓管员在电脑上开具《采购单》,并由仓库主管审核生效。将《采购单》打印一式三联,经仓库主管和仓管员签字加盖收货专用章后,第一联存根自留,第二联财务联连同送货单位的《送货清单》交财务,第三联对方联同时交财务。

5、返修品回仓,以对应的《采购退货单》为依据收货,仓管员核实货单无误后在电脑上开具《采购退返单》,注明原《采购退货单》号,并经仓库主管审核生效。

 成品出仓管理流程:

 1、仓库主管根据营销部传来的《销售订单》备货并作好记载,将配好之货品清单交质检部验货。质检部将合格成品装箱并在电脑上填制《装箱单》,审核装箱单。在每个包装箱内放置一张装箱单。包装好的成品分类放到相应的仓库存放区域。

 2、质检部将《装箱单》汇总导出为未审核《销售单》,等待营销部总监审核发货。

 3、仓管员根据客户持有的已盖章《销售单》和电脑里对应的《出仓单》(对于批发商)或《转仓单》(对于加盟商)发货。打印《出仓单》或《转仓单》一式二份,由仓管员、仓库主管和客户签字,一份交客户,一份仓库自留。

4、 营销部业务流程 :

1、营销部将客户传真来的《销售订单》输入电脑,并由营销部总监审核。查询当前仓库库存情况。若需要向厂家订货的,将《销售订单》导出为《采购订单》并审核。若仓库有货不需要向厂家订货,就将《销售订单》传给仓库,由仓库捡货装箱。

 2、收到仓库传来的未审核《销售单》后(由《装箱单》汇总而成),由营销部总监确认客户货款余额的状况。若客户有足够的货款余额,则审核此《销售单》(已审核《销售单》会自动生成《出仓单》(对于批发客户)或《转仓单》(对于加盟商)传给仓库,仓库凭此《出仓单》或《转仓单》发货。)。若客户货款余额不足,则等待客户货款到帐后再审核《销售单》。

 3、已审核《销售单》打印一式三联,并签名盖章。第一联存根自留,第二联财务联交财务,第三联对方联交客户。

 4、营销部分析加盟商及其专卖店的库存状况,并向加盟商提出补货、调拨等建议。

 5、分析分公司和自营专卖店的库存和销售情况,若需要补货,则开具《转仓单》,将总公司仓库的货品调拨到分公司和专卖店。若需要在分公司或专卖店之间调拨货品,开具《调拨单》。营销部总监审核《调拨单》。经审核后的《调拨单》自动生成一张《进仓单》和一张《出仓单》并传给相关仓库。由相关仓库收货、发货。

 6、营销部审核分公司和专卖店传回的销售单,冲减相应的库存和增加应收款。

 7、营销部审核加盟商传回的销售《出仓单》,冲减加盟商库存。

 8、营销部审核分公司和加盟商传回的《转仓单》,调整分公司和加盟商的仓库库存。

 9、营销部审核分公司和加盟商传回的《盘点单》,调整分公司和加盟商的仓库库存。

10、营销部将货品资料传给各个分公司和加盟商。

 仓库盘点流程:

 1、盘点准备 仓库主管将还未有自编码的存货通知支援中心补编编码,并通知有关部门填制相关单据处理帐外物资。 营销部、鞋业部和服装部通知厂家和客户在盘点日期间停止送收货品。 财务部将盘点日前已经审核生效的单据记帐。 仓库主管组织仓库人员对货品进行分区摆放,存货以成品区、辅料区、成品待检区、次品区、台面辅料区、样板鞋区分成六大区域分别得出存货实存情况。

 2、盘点进行 仓库主管组织仓库人员初盘存货,对存货六大区域各指派1人担任组长,2人配合。以盘点表记录初盘结果。仓库主管连同另外4名员工组成复盘小组,对初盘结果进行复盘,出现差异仓库自查原因。 仓库主管将初盘数据输入电脑,将《盘点单》打印提供给财务部,财务部组织公司人员组成抽盘小组,以2人为1组对各大区域进行抽盘工作。抽盘人员从实物中抽取20%复核初盘资料,从初盘资料中抽取30%对实物进行抽盘。抽盘量要求占总库存的50%。发现差异由仓库主管重新盘点更正初盘资料。差错率高于1%,仓库主管对该区域货品进行重新全盘。经复盘通过的《盘点单》由财务部审核,并打印一式二份,由仓库主管、财务主管签字,各持1份。

 3、盘点后期工作 仓库主管将已审核《盘点单》导出为进、出仓单,电脑自动生成《盘盈单》和《盘亏单》。仓库主管查找盘盈盘亏的原因,并将《库存盘点汇总表》和差异原因查找报告交财务主管复核上交总经理审批后。财务部据审批结果审核《盘盈单》和《盘亏单》调整库存帐。

4、盘点其他规定 盘点工作规定每月进行一次,时间为月末最后2天。头天晚上8时开始至次日中午完成初盘和复盘工作,下午进行抽盘工作。 参加盘点工作的人员必须认真负责,货品磅码、单位必须规范统一;名称、货号、规格必须明确;数量一定是实物数量,真实准确;绝对不允许重盘和漏盘。由于人为过失造成盘点数据不真实,责任人要负过失责任。 对于盘点结果发现属于实物责任人不按货品要求收发及保管财物造成损失,实物责任人要承担经济赔偿责任。

posted @ 2007-04-29 14:15 javaGrowing 阅读(1949) | 评论 (0)编辑 收藏

作者:张小虎


<
> GR/IR (分为购销与代销) SAP 里,当货到票未到或票到货未到也得到了及时的处理。在传统的会计核算中,当企业购入存货时,若未能及时收至货物的发票,此时是不做任何帐务处理的,若至月末仍未能收到,会采用一种估价入帐的方法进行会计处理,而后月初红字冲回。但在 SAP 里,若继续采用这种核算方法,将会使 SAP 所倡导的信息即时性反映得不到实现。因此,在 SAP 的帐务体系里出现了一个新的科目: GR/IR ,英文全称为 GOODSRECEIPTSORINVOICERECEIPTS ,中文译为货到票未到或票到货未到。如当仓库进货时,即使未收到发票, SAP 能自动产生借:存货,贷: GR/IR GOODSRECEIPTSORINVOICERECEIPTS , 此时是以采购单上的采购价(不含税④)作为入帐金额。发票到时,通过发票校验程序,系统会自动产生借: GR/IR 贷:供应商。此时的供应商是根据采购单上标明供应商自动过入。若发生发票上金额与采购单的金额不一致的情况,系统会根据该笔采购当时的库存情况自动分配该差额的去向,如转入存货成本或销售成本或在二者之间分配。至月末,若仍有未到的发票,由于在报表层次是不能反映 GR/IR 的,因此系统会有一个程序将未结清的 GR/IR 转入应付帐款 票到货未到或应付帐款 货到票未到反映(该二科目非统驭科目,但前四位编码与正常的统驭科目一致),至第二个月初,系统会自动将未结清的 GR/IR 冲回,等待结清。对于代销商品的 GR/IR ,系统会在报表将其与存货项目一并反映。 购销的 GR/IR 与代销的 GR/IR 区别是通过商品的主数据中设置得以实现的。当创建一个商品主数据时,必须设置该商品是属于购销或代销商品,若是购销商品,则当该商品入库时,系统会产生借:存货贷:(购销) GR/IR ;若是代销商品,则当该商品入库时,系统会产生借:存货贷:(代销) GR/IR ;当然代销的 GR/IR 必须等到产生销售清单时,才能在收到供应商发票时转入应付某供应商的明细帐内。
<
> 、重要的几类凭证的产生

1
MM materialmanagement, 物料管理模块)、 SD(salesanddistribution ,销售与分销模块 ) 模块产生 这里指的集成,是指与 MM 模块及 SD 模块有关的帐务集成。

A
、与 MM 模块有关的帐务集成: 第一步:当 MM 模块收到货物时 借:存货(或受托代销商品) 贷: GR/IR (或代销商品款)(该分录是系统自动产生的,无须手工) 入帐金额为采购单是采购单上所列金额,采购单上金额则来自于商品主数据中维护的金额,若采购前已知某商品价格上涨(或下降),则需在该主数据内预先维护,以便采购单引用(在采购单上也可直接更改采购价)。 第二步:收到供应商送来的发票时,有一个发票校验( invoiceverification )动作 , 该动作可由 MM 模块的人员进行,也可由财务组的人员进行,但考虑到内部控制的要求,多数公司安排由财务部门执行。 借: GR/IR (或代销 GR/IR 应交税金 增值税 - 进项税 贷:供应商(为一个系统自动产生的号码)(该分录由手工输入) 注:若为代销的 GR/IR ,应为代销商品清单已产生,供应商按供销商品清单所列物品开出的发票。 供应商开来的发票可能会出现比采购单金额小或大于 1 元内的情况,系统会自动将差额过入至营业费用 四舍五入差异。若开来的发票金额比采购单金额大于一元以上的情况时,可能是商品主数据中维护的金额不及时所致,此时可手工更改采购单金额,系统过入后,会自动将发票校验凭证锁死,相应产生的应付帐款 --- 供应商的该笔交易也被锁死,只有在有权限人批准后,才能支付。过入的大于采购单的差额会由系统自动在存货成本与销售成本之间分配。若发票金额小于 1 元以上,则仍需手工更改采购采购订单使金额与发票金额一致,这样系统就会将差额自动在存货成本与销售成本之间进行分配,但些时系统不会有锁死该笔交易(因为已不必要)。 当存在退货给供应商的情况时,系统仍要求按上述顺序做相反的动作,此后结清 GR/IR 的发票校验用的供应商发票就是红字发票了(系统称之为货方凭证)。

B
、与 SD (销售)模块有关的帐务 第一步,当 MM 模块对外发货时,填好外向发货单,发货过帐后,则 借:商品销售成本(购销或代销) 贷:存货(受托代销商品)(此为系统自动产生的分录!) 第二步,当向顾客开出销售清单时(即 BILLING ),此非通常所说的开正式税务发票! 借:顾客(为系统产生的 10 位数号码,会自动过入至应收帐款的统驭科目,原理前述) 贷:商品销售收入 应交税金 增值税 - 销项税(此为系统自动产生的分录!) 若货物售出后,顾客退货,则需做一个上述的反向动作!收到顾客退货时,称为反向发货。开出的销售清单为红字(称为贷方凭证)。系统同样会产生上述相反的分录。

<
> SAP 零售模块存在的问题

1
、代销的结算 对于代销的业务, SAP 是按照 GAAP generallyacceptedaccountingprinciple )来进行设计的,相关原文如下: becausetitletothemerchandiseisheldbyconsignorbutphysicalpossessionisheldbytheconsignee……..theconsigneedoesnotmakeanentryforreceiptoftheinventoryinthegeneralledger;however,memorandumcontrolrecordsusuallyarekept. ②。即,对于代销商品,受托人是不进行会计处理的,只在备查帐进行记录,以便于数量的控制。 SAP 的零售系统完全是按照此思路进行设计的。但中国的企业会计制度对于受托代销商品的核算且全然不是如此(具体参见《企业会计制度》说明)。因此,两者的差异较大,完全不适合中国的企业会计制度核算的要求,同时在税务上也存在一定的问题。为此,必须对代销的有核算尤其是结算应进行客户化的开发。一般在对于代销商品的核算进行设置时,在商品主数据中的评估组中设计了两个评估码,即前述的 3100 (购销)与 3400 (代销)。代码的不同,只是确定了不同的会计科目如库存商品、受托代销商品、 GR/IR 及代销 GR/IR ,但在与供应商的结算上,二者却是大不相同的。购销的结算是供应商直接与经销商的交易额进行结算,而代销的结算则是根据代销商的商品代销清单来进行的,这样系统中的每一张采购单都不可能是立即结清的,而且对于数量众多的代销商品,系统如何选择未结清的采购单及单价,这些都是客户化开发中应当考虑及困难之处。

2
、退货单价的确定(退还供应商) 这问题与上述相关,即对于代销商品退回给供应商时,系统应选用什么单价。如某些公司的蓝图设计,为所有未结清采购订单中的最早价。这是考虑到近年来,商品的采购价都呈下降之趋势。但系统客户化开发的过程中显示,对于最早价的选择,需用手工的方式进行。这样,当交易量大时,会降低作业效率,同时,手工操作难以确保有些标准是否会得到一致的执行。

3
、分录借贷顺序 SAP 系统中,对于会计分录的顺序,不是完全按照借贷的顺序来显示,有时可能是贷借,虽然不会影响到整个分录的准确性,但似乎不符合会计核算的要求。希望将来的版本在这方面能有所改进。

4
、收入的提早确认 从前述,我们可以看到,当存货发出时,系统就自动产生借:销售成本贷:存货。在做 BILLING 动作时,才产生借:客户贷:销售收入贷:应交税金。这种作法表明, SAP 对于收入的确认是以发货为时点的,意味着发货就一定代表客户对货物的接受。虽然在现实交易中 ( 零售业 ) 确实有 90% 的可能在发货时就代表客户对该货物的接受。但更符合会计收入确认的作法是,应设置诸如 发出商品 的科目用于核算当对发出货物的客户接受性没有把握时的情景,待客户接受后,再将 发出商品 转为销售成本。另外, BILLING 的动作在后也有可能为用户有意迟延确认收入留下空间。

5
、特殊期间较难与资产负债表日后事项协调 在前述中说及,在 SAP 中会计期间可划为 16 个,即有 4 个特殊的会计期间用于对已结帐的总帐进行调整,基本上资产负债表日后事项的情况都能在 4 个特殊的会计期间处理,但对于退货的会计处理较难与会计准则要求的相吻合。因为,对于商品每到月末都要有一个关帐动作,即表明关帐后就不能对已关帐的前两个期间的存货业务进行调整。会计准则要求,对于上年度销售,会计报表发出之前发生的退货,应以 以前年度损益调整 作为过渡科目,然后再将 以前年度损益调整 结转至 未分配利润 ,再对当年度的资产负债表的年初数重新计算调整,并在会计报表附注中说明③。但由于 SAP 的商品月度间关帐已不可能将退货在以前月份调整,同时,退货时,当收至客户的退货, MM 模块有个反向发货动作将产生,借:存货贷:销售成本(入帐价值为退货时的商品移动平均价),而不是贷:以前年度损益调整,对顾客开出红字发票时,借:销售收入应交税金 增值税贷:客户(以当时的销售价),而不是借:以前年度损益调整。因此,在这一点, SAP 较难与会计准则的有关要求相一致。

6
、利用利润中心产生负债表
SAP
的成本中心与利润中心使财务会计与管理会计得以有机结合!在每一个独立核算的会计主体中,每一个职能部门都是一个成本中心,如 5 个职能部门,则可以将其分为 5 个成本中心或 2 个成本中心,这可按管理部门的管理需求进行确定,但只可能有一个利润中心,即这个独立核算的会计主体。在 SAP 中,成本中心与利润中心是事先必须设定的。即,当我们在输入一个与费用有关的总帐分录时,如借:管理费用 --- 工资贷:现金时, SAP 就要求必须再对费用的所属部门进行再输入,如必须输入一个成本中心;对现金则必须输入一个利润中心。这是因为,当输入一个成本中心后,所有与该成本中心有关的金额都会得以汇集,然后这个成本中心会被分配至一个利润中心(成本中心的主数据中设定),从而能从利润中心自动地产生管理用的某个独立核算会计主体的损益表。上述现金也被要求输入一个利润中心,是为了能产生一个与独立核算主体的资产负债表。当一个独立法人有二个以上的独立会计核算主体时,此功能就变得非常之好用!即该二个独立核算的会计主体不须再进行独立的会计核算了,只须分配好各自的成本中心与利润中心即可!在 SAP 中,独立会计核算的损益表是容易产生的,但要产生一个具有平衡关系的资产负债表较有一个难度!上述所说的要做到如现金,这可自动产生,但与总部之间的往来,就要通过月末手的方式输入部份分录以产生资产负债表。假设某法人有二个独立核算的门店,在传统的会计体系中,该法人的资产负债表上应有 拨付所属资金 的科目用以核算对两个门店之间的资金拨付关系,门店的资产负债表上应有 上级拨入资金 的科目与法人资负表相对应,当每月发生往来时,可通过该二科目进行核算或再加一个内部往来科目进行核算。月末时,法人报表应汇总再抵消 拨付所属资金 上级拨入资金 及相关的内部往来科目。但在 SAP 中,此时已不用如上所述进行核算了!如将某门店的装修费拨付门店时,原来的做法是:借:拨付所属资金贷:长期待摊费用,而 SAP 直接在长期待摊费用下输入一个利润中心即能产生相应的某门店的会计报表。当然,对于一些往来及月末(或年末)实现的利润,则必须通过手工输入调整的分录以使门店产生资产负债表。但这样做法也有一个缺点:由于减少了传统会计的抵消内部往来的做法,当总部与门店之间的存货调拨在不加价的情况下,通过月末手工调整的方式是能实现门店的资产负债表。但总部对门店的货物调拨有加价的情况下⑤,就显得较难处理了。

7
、现金流量表的编制 SAP 中,对于现金流量表的编制是采用公式的方式计算而出的。如经营活动产生的现金流量是通过当年销售收入 + 应收帐款的期初数 应收帐款的期末数 + 预收帐款的期末数 预收帐款的期初数等公式计算而出,但是我们知道该公司对于企业的正常业务来说是有效的,但现代社会中,非货币性交易及债务重组的业务时有发生,这部份交易是不与现金流转有关的,但同样在减少诸如应收帐款的金额,故在利用公式来推导现金流量表时,尚需加入某些因素,即经营活动产生的现金流量应为当年度产生的销售收入 + 应收帐款的期初数 -- 应收帐款的期末数 + 预收帐款的期末数 预收帐款的期初数 + 当期收回前期核销的坏帐 以非现金资产抵偿债务而减少的应收帐款 当期核销的坏帐,由于新增的因素在报表层次是如无法体现的(报表的应收帐款期末数是结果),故利用未调整前的公式计算出的现金流量表是不准确的。尚有现金流量表的某些项目是不能用公司来计算的,如购建固定资产、无形资产和其他长期资产支付的现金需根据有关科目分析确定等。因此,我们希望利用控制模块的某些道理来完成现金流量表的编制。比如,在输入凭证时,初级成本要素被要求分配一个成本中心,实际上这成本中心是在归集有关初级成本要素及金额。那能不能在凭证输入时,凡与现金流动有关的金额都被分配一个现金流量表中的项目,如当借:现金 1000 贷:客户 1000 时,在行项目中现金应分配给 销售商品、提供劳务产生的现金 ,又如当借:费用 2000 贷:现金 2000 ,则在行项目中这 2000 元就应分配至 支付职工以及为职工支付现金 等,这样产生出来的现金流量将非常之准确,可信性将极高。
posted @ 2007-04-26 09:48 javaGrowing 阅读(873) | 评论 (0)编辑 收藏

作者:张小虎

ERP 是英文 Enterprise resources planning 的缩写,意思为企业资源计划。在企业中,存在各种各样的资源,如财务资源、人力资源、信息资源、供应商资源、客户资源等等,如何将这些资源进行合理规划,实现资源的最优化的配置,从而提高企业整体的经营能力与经营效率是企业管理者孜孜以求的目标。经济学上有一个著名理论:短边效应。也就是说,有长短不一的木块 ( 表示各种各样的资源 ) ,做成一个木桶,其装水容量的多寡不是由最长木块决定的,而是由最短的木块决定的。过去几十年来,由于电信技术、计算机技术及应用软件开发的滞后,大型企业为提高管理效率而进行的各种各样探索都难以得到最终的实现,其重要原因就在于信息的不能及时传递。人们通常所说的企业内部各个部门都是一个“信息孤岛”,指的就是信息 ( 包括财务、人力等方面 ) 的不能及时传递与处理,由此带来管理上的效率损失及机会成本的上升。随着我们国家市场化改革进程的不断加快及全球经济的一体化,各个行业内部的竞争加剧是不可避免的一个趋势,竞争的加剧对企业管理提出了更高的要求,正如莎士比亚所说的,“是生存还是死亡,这真是一个问题”。要提高企业管理水平,首先必须突破信息传递及处理这个“瓶颈”。 70 年代以来,国外企业为突破这个“瓶颈”,就陆续开始了企业资源计划的尝试。

90 年代初期,已经获得很大的成功,这主要应归功于相关技术,如电信、计算机及应用软件等得到了空前的发展。实施 ERP ,至少有三个方面的好处: 1 .各种信息能够得到即时的处理与传递。如有非常及时性的财务数据及库存数据,这对于大型企业是非常必要的。 2 .可以打破企业管理者的管理边界,同时不会造成效率上的损失。传统的分工理论形成的每个管理人员的管理边界,超出此边界将是不经济的,但实施 ERP ,如上问题可以轻松得以解决,因为 ERP 的精髓就是要信息的及时处理与传递。信息的及时传递及处理可以使管理的边界得以突破。正如和光商务股份有限公司的总经理刘铁所说:实旌 ERP 可以将管理的需求“一竿子捅到底” 1 3 .可以降低企业内部的交易费用,同时也有利于企业组织结构的再造。实施了 ERP ,各项交易、业务流程都变得透明,信息也得到了及时的处理与传递,带来的结果是内部交易费用的降低,机构的设置也将变的简单、高效,原来“金字塔型”的组织结构变成了“扁平型”的组织结构。

毫无疑问,如上种种好处,将会使成功实施 ERP 的企业在激烈的市场竞争中获得极大的优势,具体地说,将会使企业降低费用、提高资金的运用效率,提供决策的准确数据、降低机会成本等。

支持实施 ERP 的管理软件有非常之多,如 SAP R 3 Oracle PeopleSoft 等。本文着重介绍 SAP R 3 软件就是其中集成性最好、功能最强的管理软件。为什么 SAPR 3 软件集成性最好并且能够及时处理并传递信息,主要是有赖于主数据的有关设置。以下开始本文有关 SAPR 3 软件中与财务有关的介绍。
主数据 ( 主记录 )

第一次接触 SAP R 3 软件的人,当看到主数据这样的字眼时,肯定不知所云。在 SAPR 3 软件中,主数据相当是该软件的识别及自动后续处理系统。比如人的大脑,当我们见到资产负债表中的有关科目时,如长期投资,我们的大脑马上就会这样的反应:它是属于资产类的科目,期末应将余额予以结转;核算时,当其投资对被投资单位有控制、共同控制或重大影响时,应采用权益法进行核算,否则应采用成本法核算等。又如对于销售收入,我们马上就知道这是损益类科目,期末应将其结转至本年利润,而后转至未分配利润等。我们的大脑为什么有这些知识,就是因为我们经过了长期的财务知识方面的训练,所以就会有这样的识别及核算能力。对于软件系统,它不具有像人类一样的大脑,所以软件开发人员就开发了一套适合系统并使其能够像人脑一样的识别及处理财务数据。这就是 SAPR 3 软件的主数据。

因此,当我们要做各项交易之前,必须到相应的主数据中去创建它 ( 当然这个创建是按照主数据中的固有格式进行的 ) ,这样系统才能认可它、自动处理它。通常我们叫这个过程为“去报个到,取个号”。与财务有关的主数据包括有总账主数据、供应商主数据、客户主数据、商品主数据、固定资产主数据、成本及利润中心主数据等六大类。下面分别阐述。

( ) 总账主数据

总账主数据,它起到统驭整个财务的作用。不同的会计科目在总账主数据中创建会应用到不同的“字段” ( 英文单词为 field) ,通过这些不同“字段”的组合,就会形成系统能够识别并能够为我们现行会计核算所接受的会计科目。如下例举几个重要的科目予以说明。

号码 10010101 10030101 10040101
公司代码 KHl0 KHl0 KHlO
类别 资产负债表科目 资产负债表科目 资产负债表科目
账户组 现金/银行类 其他资产类 其他资产类
描述 现金 应收账款一国内贸易款 库存商品
统驭科目类型 X D X
未清项目管理 X X X
行项目显示 X X
字段状态组 G001 G067 G001
号码 10050101 20010101 20020101
公司代码 KHl0 KHl0 KHl0
类别 资产负债表科目 资产负债表科目 资产负债表科目
账户组 固定资产类 负债权益类 负债权益类
描述 固定资产一房屋建筑物 短期借款 应付账款一国内贸易款
统驭科目类型 A K K
未清项目管理 X X X
行项目显示 X X X
字段状态组 G007 G001 G067
号码 20060101 20070101 20080101
公司代码 KHl0 KHl0 KHl0
类别 资产负债表科目 资产负债表科目 资产负债表科目
账户组 负债权益类 负债权益类 负债权益类
描述 购销 GR IR 代销 GR IR 实收资本
统驭科目类型 X X X
未清项目管 X
行项目显示
字段状态组 G001 G001 G001
号码 50010101 50020101 50040101
公司代码 KHl0 KHl0 KHl0
类别 损益表科目 损益表科目 损益表科目
账户组 损益类 损益类 损益类
描述 销售收入 - 购销 销售成本一购销 管理费用一电费
统驭科目类型 X X X
未清项目管理 X X X
行项目显示
字段状态组 G029 G030 G004
仅允许自动记账

几个重要的会计科目,其余科目即可举一反三,知其所以然。在所列示的科目中,科目号码是根据《企业会计制度一会计科目名称和编号》规定的前四位数加上后四位而成,在创建时须手工填入 ( 即非系统产生 ) 。科目类别仅分成两类:即为资产负债表科目或为损益表科目。账户组分为六项:现金/银行类、固定资产类、其他资产类、负债/权益类、损益类、转移数据类。描述项既可按需创建的科目进行字面的描述,又可分为长文本与短文本描述。统驭科目类型分为三类:供应商类别 (K) 、客户类别 (D) 、固定资产类别 (A) ,主要是针对应收账款、应付账款、固定资产等模块过入的金额,他们的交易是不通过总账模块进行的,但在各自模块完成的同时,会将相应的金额过入总账。未清项目管理主要是用于须清账的科目,如 GR IR ,银行的过渡科目、工资的清算等。激活了未清项目管理,必须同时激活行项目显示的功能,但在总账主数据的设置中,应收、应付、固定资产等是不能激活未清项目管理及行项目显示功能。行项目显示即表示,设置此项时,系统会有向下挖掘 (Drilldown) 的功能,当我们在查看总账的某个科目时,若对某金额有怀疑,可将鼠标对准该金额连续点击两下,系统可显示明细账的金额,再对准明细账的金额连续点击两下,系统会显示某凭证的金额。字段状态组,表示若某个总帐科目选用了不同的字段状态组,其将来在凭证输入时,需要填入不同的字段,如对于其他业务收入科目,其选用的字段状态组为 G029 ,当我们输入一个分录借:现金贷:其他业务收入时,系统会要求再输入一个利润中心的字段,否则该张凭证不能够产生。又如当我们输入一个分录借:管理费用一电费贷:现金时,系统会要求我们输入一个成本中心的字段。仅允许自动记账表示,该总账科目必须由其他模块自动过入,不用手工输入凭证,如销售收入一购销,因为该总账科目是在销售及分销模块完成“出具发票”功能时自动产生的,所以仅允许自动过账。

创建完总账的主数据后,手工输入的总账科目将得到系统的确认与认可。如传统的分录录入方式为借:现金贷:其他业务收入,在系统中将变成:借: 10010101 贷: 50100101( 假设为其他业务收入 ) 。系统在总账分录输入后,将会自动将相关金额过入至总账及更新会计报表。

( ) 供应商主数据

当我们与一个供应商发生交易之前,应当在供应商主数据内创建该供应商,以使系统能够识别它并处理它。这仍然是“去报个到,取个号 " ,但这是到供应商主数据中去报到并取号。下面将创建供应商的有关过程做一个介绍。

供应商编号:除地点类别是以手工方式输入号码外,其余皆为系统自动生成的号码。
供应商类别:包括有国内贸易供应商、进口贸易供应商、关联供应商、一次性供应商、无库存供应审、招商供应商、地点等。在创建供应商时,只须在其中选择一项即可。
描述:与供应商有关的信息如公司名称、地址等输入相应的字段即可。
购货方号码:若某一供应商既是供应商又是客户,须做自动清账账务时,应在此处填写在客户主数据中生成的号码。
会计信息:此处应填的是统驭科目,该统驭科目首先应在总账主数据中创建好。
检查双重发票:此处是指检查收货凭证与发票的校验,为必输的字段。打勾√即可。
付款条件:指的是付款的期限,系统已设定好各种类型的付款期限,选择即可。选择好后,该系统会自动计算对该供应商的欠款是否已到期,有利于资金周转的筹划。
付款方式:如现金、支票、银行转账等。也是在系统内选择即可。将来做自动付款业务时,系统会根据自动付款方式的参数选择是否支付该款项。
结算客户:此处是与购货方号码相关联的,欲做自动清账账务,必须在此处打勾√。

如上主数据的内容填写完毕后,系统即会自动产生一个供应商的编号 ( 除地点的类别是手工方式输入外 ) ,如 10100001 ,该编号代表了与供应商有关的各种信息及后续处理的功能。并且在分录的输入上也与传统的有所不同了。如传统的分录方式为:借:营业费用一电费 贷:应付账款一 XX 供应商,但在系统中的分录录入方式变为:借:营业费用一电费 ( 这将也有一个总科目号码 ) 贷: 1010000l( 与该供应商有关的交易金额将会由系统自动过入至创建该供应商主数据选定的统驭科目,同时在总账层次中的该统驭科目也得到了自动的更新 )

另外,对于不同类别的供应商,创建完毕后,会产生不同号码范围段的编号。如国内供应商的号码范围段为 101 开头的 8 位数,国外供应商其号码范围段为 18 开头的 8 位数。熟悉后,看着供应商的编码范围即可知道,该供应商是属于何一类型的供应商。

( ) 客户主数据
与供应商主数据一样,有新的客户与我们发生交易时,应当创建客户主数据。

客户编号:除类别为“地点”客户编号须手工输入外,其余类别的客户编号皆由系统自动产生。
客户类别:有国内个人客户、国内批发客户、关联客户、租赁客户、地点、其他等六大类。
描述:即为对客户的一般情况进行描述,如公司名称、地址、邮编、联系人等。
统驭科目:此处输入在总账主数据中已创建好的应收账款统驭科目,如应收账款一国内个人客户
(11310101) ,应收账款一国内批发客户 (11310201) 等。零售企业的大部分客户都是个人客户,因此只须创建一个一次性的客户,而后通过修改有关描述性的字段即可。
付款期限:此处是指客户付款给单位的付款期限,由于主要以零售为主,付款期限定为立即付款,但可针对个别客户 ( 如在合同中规定的收款期限 ) 另行设定。系统已设置各种的付款期限。通过此处的设置,将来做催款程序时,系统会根据设置的参数自动计算应收账款的账龄及打印催款函。
付款方式:可以有现金、支票等方式。
催款程序:选择催款程序,可以产生催款函件。
与创建供应商主数据一样,当创建完毕客户主数据时,系统会自动产生一个客户的编号 ( 500000001) ,该编号代表了该供应商的相关信息及后续功能。凭证输入方式上,将与传统的手工方式有很大的不同。如传统的凭证为借:应收账款一 XX 客户贷:其他业务收入一租金,在系统中将变为借: 500000001 贷:其他业务收入一租金 ( 这将也有一个总科目号码 ) ,交易金额自动会过入统驭科目如 11310101 的应收账款一国内个人客户,同时也即时更新总账中的统驭科目。
同样,不同类别的客户,其创建完主数据后产生的编号是不一样的,如国内个人客户,其编号范围为 500000000-599999999 ,国内批发客户其编号范围为 3 10000000-3 19999999 等。这将便于我们区分不同类别的客户。

( ) 商品主数据
商品数据的内容较为复杂,主要由主数据组负责创建,对于财务人员需要了解的内容主要有以下几项:

描述:即对商品一般性的描述,如品名、类别、供应商等。
评估类:主要有两类 3100 3600 ,其中 3100 代表该商品为购销类商品,决定了系统自动生成的 GR IR 为购销类的 GR IR 3600 代表该商品为代销的商品,决定了系统自动生成的 GR IR 为代销类的 GR IR
价格控制类型: SAP 中有两种价格控制类型,一为标准成本法,二为加权移动平均法,该两种方法用于存货的发出时结转销售成本用。
移动平均价:由系统自动计算得出。系统会根据每批次的采购单价及数量对目前的库存商品发出单价进行移动平均计算出作为结转销售成本用的单价。
总库存量:是指目前的库存总量。
销售价格:由系统根据一定的毛利要求并结合有关细节得出。此销售单价将成为创建销售订单时的单价,若有打折,系统会根据打折比例算出最终销售价,这也将成为计算销售收入的单价 ( 系统会自动将增值税计出后并从收入中剔除 )
利润中心:主要是为创建利润中心的损益表而用。若该商品维护的层次到某个门店,则将来销售确立时,收入与成本将为转入总账层次与利润中心层次。
商品主数据创建完毕后,系统会产生一个商品号,该号码代表了如上有关的信息及计入某个总账科目如库存商品、受托代销商品的要求。

( ) 固定资产主数据

同样的,当财务上要做一件与固定资产有关的交易,如购置,首先必须在固定资产主数据中去创建它,然后才能在财务上开始与之相关的业务。如下是创建固定主数据的一些重要内容。在系统中,对于固定资产的大部分业务是系统自动完成的,所以如下的内容是有必要的。

类别:在传统的会计核算中,通常可以将一个企业的固定资产分为几大类:房屋建筑物、机械设备、交通工具、办公设备、其他等。在系统中,也是遵循这样一种分类方法,但为了便于系统区分固定资产折旧时所应计入的科目,如管理用的固定资产折旧费用应计入管理费用一折旧科目及营业或生产用固定资产折旧费用应计入营业费用 ---q~ 旧或制造费用一折旧,在系统中,将固定资产的分类进一步细分,分成房屋建筑物 ( 总部 ) 、房屋建筑物 ( 门店 ) 、机械设备 ( 总部 ) 、机械设备 ( 门店 ) 、交通工具 ( 总部 ) 、交通工具 ( 门店 ) 、办公设备 ( 总部 ) 、办公设备 ( 门店 ) 、其他 ( 总部 ) 、其他 ( 门店 ) 等,同时在 SAP 系统中,在建工程、无形资产 ( 商标、土地使用权、著作权、商誉等 ) 也属于固定资产模块的核算范畴。因此,当我们欲创建某个固定资产的主数据时,如总部用的服务器,就应选择总部办公设备这一类型,随后系统会自动确定相应的科目定位码。
描述:即对应创建的固定资产进行如名称类别等描述。
科目定位码:是与系统设定的固定资产类别紧密地联系在一起的。该科目定位码实际上起到了统驭科目的功能。如在本次设定中,总部的房屋建筑物的科目定位码为 1010 ,门店的房屋建筑物的科目定位码为 1020 ,但这两定位码同时会与总账科目固定资产——房屋建筑物联系起来,如当财务增加一个固定资产时,就会通过科目定位码使总账科目固定资产 _ 谤屋建筑物金额相应增加。
成本中心:这是与控制模块有关的设置。如总部用的服务器,就应选择与总部某个部门有关的成本中心。
若该服务器的折旧费用应由不同的成本中心分担,可以该成本中心为基础,在控制模块内采用分摊或分配的功能进行划分。
分析用途:分为一次性或分期购入、是否抵押、是否保险四类,这是为区分各个不同固定资产的状态而设的。如若想了解有多少固定资产已经被抵押,则可以在查看报表时,选择是否抵押的功能,系统就会将所有已抵押的固定资产列示出来。
折旧年限:分为账面折旧与税务折旧,账面的折旧年限与折旧率会计入总账,税务的折旧年限与折旧率则会作为调整递延税款所用。如某固定资产的账面折旧年限为 3 年,年折旧额为 lO 000 元,税务折旧年限为 5 年,年折旧额为 8 000 元,则系统会将 10 000 元作为总账的折旧金额并计入相关费用,但系统也会算出税务的折旧额为 8 000 元,但这 8 000 元只是便于我们做递延税款的手工调整。
创建完某个固定资产的主数据后,系统会自动产生一个该固定资产的号码,如 11 11 11 11 11 ,我们在财务输入分录时,借: 1111111111 贷: 10010101( 现金 ) ,交易金额会自动过入至总账层次。

在固定资产模块中,折旧是系统自动运行的,不需手工计算。并会过入相应的总账科目。

利润中心主数据、成本中心主数据的内容应属于控制模块中的主要功能,在建立主数据方面相对而言较为简单,关键在于企业内部对于利润中心及成本中心的如何划分,也就是说对管理深度要求到什么水平。
posted @ 2007-04-26 09:47 javaGrowing 阅读(756) | 评论 (0)编辑 收藏

作者:张小虎

1 ,科目表的建立及分配 SAP 中,科目表的层次较公司代码高,也就是说先创建好科目表,然后可以分配给不同的公司使用。在同一集团范围内,为了使各个集团范围内的公司使用的科目表都能一致,通常是先创建一个虚拟的公司及科目表,然后集团范围内公司都可从其拷贝。科目表中的科目就是在总帐的主数据中分别创建的。这里值得一提是,在 SAP 中的科目表与传统的手工方式在科目体系中有了很大的不同。传统的帐务体系将会计科目分为 1 级科目、 2 级科目、 3 级科目等。但在 SAP 已没有这样分法了。除了应收、应付、固定资产等统驭科目外,所有的明细或 2 3 科目上升为总帐科目(当然在使用之前,应进行有关主数据的设置),如传统的银行存款 工商银行 XX 支行 XX 帐号,这只是银行存款的一个子科目,但在 SAP 中,此时已设置为一个总帐科目了,科目代码是根据企业会计制度中的有关编码扩充至 8 位编码,如一个企业有许多银行存款,在 SAP 中就变成了有许多总帐科目。在总帐层次显示时,是分别显示的,但到报表层次时,则根据所有银行科目中的前四位代码汇集成一个科目银行存款进行披露。管理费用也一样,在 SAP 中有非常多管理费用的总帐科目(如工资、奖金、津贴等)。但在总帐还包含有从其他模块中过入的金额,如统驭科目,统驭如应付 / 收及固定资产的明细科目,因此在 SAP 的总帐科目表中,我们看到的就不是目前的五、六十个科目,而是将近五百个的总帐科目。由于应收、应付、固定资产有各自独立的模块,所以有各自的明细帐。但反映在总帐及报表层次时,分别为细分的统驭科目(如应收帐款可根据企业管理的需要分为应收国内的款项与应收国外的款项等)。 SAP 所有的财务信息都是即时的,当记录一笔总帐分录时,相应的总帐、报表都已生成,当应收明细帐生成时,通过统驭科目就可即时过入总帐与报表。也就是说,在 SAP 的帐务里,任何时点都会产生新的总帐与新的报表(注意该总帐与报表并不完全体现法人的资产负债损益情况,尚有折旧、预提待摊因素要考虑)。

2
,统驭科目的概念及分类,统驭科目的变更 统驭科目( reconciliation account )指的就是将明细科目归集起来的意思。前面我们说到,系统总帐科目表中包括统驭科目,该统驭科目是与应收模块、应付模块、固定资产模块有关的,其中长、短期借款运用了应付模块的功能,也成为了统驭科目。在实际业务过程,我们可能会发生统驭科目选用错误,此时就要用到统驭科目的变更功能。如客户 A 的统驭科目被误选为 11310101 ,并有一笔分录输入,假设为 1000 元,此时的总帐科目 11310101 就有 1000 元余额,事后发现用错统驭科目,为此在此客房的主数据中更改统驭科目假设为 113102101 (注意这并不会更改已过入 11310101 1000 元),更改完毕后,至月末(假设本月只有一笔分录及余额为 1000 元)运行客户重组程序,系统会产生借: 11310299 (系 11310201 的调整科目,但非统驭科目) 1000 贷: 11310199 (系 11310101 的调整科目,但非统驭科目) 1000 ,在报表层次上 11310101 11310199 被安排在一行后余额变为 0 11310201 11310299 被安排在一行后余额变为 1000 ,这样在报表层次就将由于选错统驭科目而产生的错误纠正了。第二个月初,系统会自动运行相反的调整分录,借: 11310199 (系 11310101 的调整科目,但非统驭科目) 1000 贷: 11310299 (系 11310201 的调整科目,但非统驭科目) 1000. 直到选错统驭科目的金额被支付出去后,才不需运行上述程序。

3
,凭证的输入规则 SAP 中,总帐科目在输入分录是需要遵循传统的记帐方法, 有借必有贷,借贷必相等 。但对于应收、应付的发票输入(即作会计分录)单边则可,如在应付模块作发票输入,填入供应商的号码,日期、金额后,其次填写行项目,此时的行项目的字段中已经默认了借方,用户只需选择适当的总帐科目(如管理费用 —XX )、金额、成本中心即可。产生的分录即为借贷皆具的双边分录了。应收模块的发票输入也同样。在应收、应付模块中除了后勤模块的 发票校验程序 及销售模块的 出具发票程序 自动过入应付、应收帐款外,尚有许多处如 过帐 清帐 也具有半自动生成会计分录的功能。另外,在 SAP 中,凭证具有较宽泛的意义,如后勤模块的产生的收货单据,在 SAP 中也称为凭证,发票也称凭证,因此财务人员在实际操作中应注意区别。

4
,凭证的类别 传统的会计核算中,将凭证的类别分为收、付、转三类或直接就是一类记帐凭证。 SAP 对凭证的分类基本上也遵循收、付、转三类的原则,即总帐凭证(类似转帐凭证) SA ,与供应商有关的凭证(类似于付款凭证): KR (应付供应商的凭证)、 KG (供应商转来的红字发票, SAP 称为贷记凭证)、 KZ (付款给供应商的凭证),与客户有关的凭证(类似于收款凭证): DR (开具发票给顾客的凭证)、 DG (开具红字发票给顾客的凭证)、 DZ (向顾客收款的凭证),与固定资产交易有关的凭证 AA 等。

5
,记帐码 在手工的会计核算过程中,我们通过用记帐符号 来描述资产、负债的增、减。但在 SAP 中,却变得有些复杂了,比如,对于总帐科目的凭证,用符号 40 来表示总帐的借方,用 50 来表示总帐的贷方,分录例示如下: 40 10010101 (现金) 50 50150101 (营业外收入);对于与供应商发票有关的凭证输入,主要与应付帐款有关的借贷方就比较复杂了,如贷方用 31 32 33 34 35 36 37 38 39 ,借方用 21 22 23 24 25 26 27 28 29 ,如供应商发票输入分录为: 40 50100101 (营业费用 - 电费) 31 10100037 (表示通过主数据创建的供应商编号)。对于与应收帐款有关的,其应收帐款的借贷方所用的记帐码:用 01 02 03 04 05 06 07 08 09 表示借方,用 11 12 13 14 15 16 17 18 19 表示贷方,如输入一笔与客户发票有关的分录: 01 :客户有关的号码 50 :其他业务收入。与固定资产有关的业务,用 70 表示借方,用 75 表示贷方,假设通过应付模块采购固定资产, 70 :固定资产号码 31 10100037. 与存货有关的业务,用 89 表示借方,用 99 表示贷方,如 89 :存货贷: 50 GR/IR ,退货时, 40 GR/IR 99 :存货(与存货有关的会计业务,大部分是系统自动产生的,因此少了一道麻烦!)。 记帐码在 SAP 中实际上起到如下的作用:在行项目中决定可输入的科目的类别;行项目是以借方或贷输入;决定其他字段的状态。

6
,凭证号码的产生 SAP 中,凭证号码可以由系统产生也可由手工产生,但系统产生的凭证号是连续的,手工产生的号码难免会产生跳号等失误,因此对系统设置时采用的凭证号码是由系统自动产生的。同时,对不同类别的凭证,系统对其产生的号码的范围不尽一致,如输入供应商发票产生的凭证号在 1900000000-1999999999 之间,付款给供应商的的凭证产生的凭证号在 1500000000-1599999999 ,与固定资产有关的凭证产生的凭证号在 0100000000-0199999999 之间,开具发票给客户产生的凭证号在 1600000000-1699999999 之间等等!尚有其他号码范围,可参照总帐蓝图中的有关叙述。当然,号码范围是与年度有关的,即开始新一个会计年度时,号码区间又会被重新选用,从而避免号码被用尽的可能。

7
,记帐期间变式,会计年度与特殊期间 记帐期间变式是较难理解的一个内容。通过手工的做法是,在某一期间内所有交易都必须在同一时点结帐,以便总帐及财务报表的生成。但在系统中,由于每一时点都可以产生一个即时会计报表,因此某些类型的凭证可以在期间结束时予以关帐,而某些却又可以继续开着,即某些类型凭证可在 8 月份入七月份的帐。当然从严格的角度说,这是不合适的。这就是记帐期间变式。特殊会计期间,在系统中,会计期间基本上分为 12 个期间,这与正常手工核算无二,但由于在年度的会计期间结束后(此时 12 31 会计报表已产生),仍然存在应当调整的事项,如审计时发现有些费用的确认不尽合理,有些交易金额必须重新确认(如某些资产负债表日后事项),这时的调整就在特殊期间进行。 SAP 的特殊会计期间分为 4 个,即 13-16 期间。但有些资产负债表业务却又难以在特殊期间实现,如资产负债后日后发生的上一年度的退货,由于这涉及到集成的业务,所以在 SAP 较难实现(具体参见后述)。

8
,初级成本要素与次级成本要素 初级成本要素与次级成本要素。 SAP 除总帐的及时集成外,它的另一个特点是与控制模块的及时集成。在 SAP 中所有的总帐中的费用科目都被要求创建成为初级成本要素。这样,当输入一个总帐的费用分录时,系统会要求输入一个成本中心,即表示此时系统已将该初级成本要素分配给了某一成本中心。即通过一个分录就将总帐与控制模块的要求同时满足,这就是 SAP 的无缝集成。当然控制模块中只有该要素的金额,而不是像总帐的记录是通过双边分录来实现的,因此某成本心的费用报表是各个初级成本要素总汇。次级成本要素是指,某一成本中心的费用要素可整理成为次级的费用要素(项目),并将其通过一定的比例分摊给不同的成本中心。控制模块就是通过这两个要素反映了企业内外部间的资金流动情况。在 SAP 中,初级成本要素就类似于科目表,它可以分配给任何一个成本中心,包括法人间的成本中心,即不同的成本中心可能包括的初级成本要素是一模一样的,但金额却不尽相同。

9
,分配与分摊 分配与分摊对于成本要素的来说是一个很重要的功能。并且这功能就类似于固定资产折旧一样,一月只能执行一次。分配的功能是与初级成本要素相关的,分摊的功能是与次级成本要素的功能相关的。这两个功能同样都可用到计划(预算)与实际发生额中。如可创建一个循环,将某成本中心(可超过一个以上)的初级成本要素(可超过一个以上),按一定的比例分配给其他成本中心(可超过一个以上),当然也将这循环分为几个段,各段间相应的要求可以不一样,这样每月末执行时,就可以很好地反映初级成本要素的流向情况。同样的,也可创建一个分摊循环,将某成本中心(可超过一个以上)的初级成本要素(可超过一个以上)重新组合成为一个次级成本要素,然后再将其按一定的比例分配给其他成本中心(可超过一个以上),当然也将这循环分为几个段,各段间相应的要求可以不一样,这样每月末执行时,就可以很好地反映次级成本要素的流向情况。分配与分摊的区别在于,分配是将某一成本中心的初级成本要素分给另一成本心,被分配的初级成本要素会与被分配的成本中心的相同的初级成本要素一并反映,而分摊则是将次级成本要素分摊到另一成本中心,与被分摊的成本中心的初级成本要素一同反映,这样有利于区分本成本中心的发生的费用与分摊过来的费用的界限。需要说明的是,同一利润中心下的成本中心的分配或分摊,并不影响该利润中心的利润额,但跨利润中心进行分配或分摊,则影响了不同利润中心的利润额,两种方法产生(分配或分摊的规则相同时)的影响一致。
posted @ 2007-04-26 09:47 javaGrowing 阅读(502) | 评论 (0)编辑 收藏

作者:不详


SAP R/3
是德国思爱普公司( System Application Products SAP )推出的企业资源计划( Enterprise Resources Planning ERP )大型系统集成管理软件。企业经营管理的全球化和多元化推动了世界范围内企业结构的变化,并且使业务流程日益复杂。这种趋势推动了产品和业务流程的革新和信息高速公路的应用。所有这些都要求以更短的反应时间来进行更多的协调与控制工作。时效性的决策必须基于不断地提供实时的信息。 SAP R/3 系统提供包括所有业务领域的业务处理流程的集成的解决方案,它是基于三层(可扩至多层)的客户机 / 服务器系统结构,支持多币种(可同时使用多达三种货币作为记帐和结算的本位币)多语言( 15 种国家语言)的完整的企业管理解决方案。

SAP R/3
主要由财务会计( FI )、财务控制( CO )、资产管理( AM )、销售与分销( SD )、物料管理( MM )、生产计划( PP )、质量管理( QM )、工厂维护( PM )、人力资源管理( HR )、项目管理( PS )、工作流程管理( WF )、行业解决方案( IS )等功能模块组成。而财务会计、金库、管理会计、投资管理和资产管理等构成了整个 SAP R3 集成系统的核心部分 —— 财会子系统( FI & CO )。 SAP 产品以其强大功能、高度集成性、实时性、灵活性、开放性、可靠性以及国际普遍适用性得到了业界的广泛赞誉并占有了包括中国在内的广阔的 ERP 软件市场。包括长虹、康佳、海尔空调、李宁公司、小天鹅、联想集团、中化、中航油在内的数十家企业先后采纳了 SAP 公司的 R/3 产品作为企业的应用解决方案。 1999 年, SAP 公司其 ERP/MRP Ⅱ的软件销售收入达到了 24.35 亿美元,荣获当年 ERP 软件销售市场第一名。 1. SAP R/3 系统的集成性

SAP R/3
系统具有高度的集成性,它不仅在财务会计与管理会计内部集成,同时也在系统内的所有模块之间集成。在物料( MM )、销售( SD )等模块进行业务操作的同时,系统自动同步生成财务凭证。这样省去了传统的大量的收集、整理、制单的基础工作,减少了不必要的重复工作与由此而产生的差错,并且提高了工作效率,使财务人员可腾出更多的时间来处理与分析数据。 由于系统高度集成性,数据实时更新、共享,横向上,企业管理分析所需的大量数据信息都可由系统中方便的取得。而且只要权限许可,原则上任何人在任何位置任何时间都可得到所需要的最新信息和数据,而不再需要专人整理汇总上报工作;纵向上,对一个集团来说,可随时随地获得跨公司、跨区域、跨部门的最新管理分析数据,减少信息传递的中间环节,提高信息利用率,方便快捷地进行分析决策。与传统的专用财务软件不同, R/3 系统不仅能对已发生的业务进行事后的核算,更重要的是能对实际业务进行事前计划和事中控制及事后分析评估。 2. SAP R/3 系统的财务和管理控制组织架构 组织结构的确定,需要从对外法定报表和内部管理角度详细加以考虑。哪个层次上产生对外或对内的报表,是由组织结构定义决定的。 SAP R/3 系统可以定制用户自己的组织结构。对于一个大型的跨地域的集团性公司来说,通常在 SAP R/3 系统中可定义包括集团公司、公司代码、业务范围、成本控制范围、业务关联区和成本中心等组织结构元素。 2.1 集团公司( Company 复杂的组织日益需要一个全景式的会计报表,这种趋势在当今竞争日趋激烈的经济全球化进程中显得越来越重要。 SAP R/3 系统中定义的集团公司的组织结构元素,可以是实际的或虚拟存在的集团公司,主要用以合并会计报表。一个集团公司可包含一个或一个以上的公司代码,通常是在集团公司层次上出具合并财务报表。 2.2 公司代码( Company Code 公司代码代表一个独立的会计实体,拥有完整的会计帐套。是对外报送法定资产负债表和损益表的最小单位,所有的凭证都将过帐在公司代码层次上。一个公司(分公司)虽然不是法人,但是如果需要单独核算,对外出具资产负债表和损益表,也可以设置成单独的公司代码。 2.3 业务范围( Business Area 主要用于企业内部管理,是创建内部资产负债表和损益表的组织结构。可以按照不同的部门或业务种类等多种方式在 SAP R/3 系统中来设置业务范围。 2.4 成本控制范围( Controlling Area 成本控制范围是管理会计的组织结构单元,用来核算企业的收益及费用支出使用情况。在成本控制范围下可建立成本中心(组)或内部定单等成本控制对象。一个成本控制范围可包含多个公司代码,但一个公司代码只能分配给一个成本控制范围。所有的成本中心(即费用发生单位)都将包括在此成本控制范围中。因此,对公司外部运营情况的考核需要通过每个公司代码的资产负债表和损益表来揭示,而内部管理的考核可以跨整个集团公司的范围。 2.5 业务关联区( Operating Concern 业务关联区也是管理会计的组织结构单元,一个业务关联区可有多个成本控制范围,一个成本控制范围只能指派给一个业务关联区。业务关联区是获利能力分析中的核心组织结构,用来监控及分析该业务关联区内各 获利段 的运作情况和获利能力。 获利段 可以是销售地区、产品、客户等属性的灵活组合。因此可以按照各获利段为依据生成获利分析报表,考核其获利能力。 2.6 成本中心( Cost Center 成本中心是管理会计中的最小职责单位,是每一笔费用的具体接收者。成本中心建立后需要将每个成本中心分配给标准成本中心组。这样才能保证费用记帐在成本中心及部门上。成本中心的标准层次结构反映了成本中心与成本中心、成本中心与成本中心组、成本中心组与成本中心组之间的关系。标准层次结构中的每个节点代表一个成本中心组,当然除了标准层次结构中的成本中心组之外,还可根据业务需求在标准层次之外自己定义需要的成本中心组。 3. SAP R/3 系统的财务会计( FI

SAP R/3
系统对会计信息的公开性,依据有关各国会计法规进行了相应的定义,同时也适用于国际性的企业。其财会子系统符合 40 多个主要工业国,也包括中国的相关会计法规。 SAP R/3 系统的集成性确保了会计信息能够满足自动更新的要求。当用户在后勤模块处理业务时,这些业务所引起的财务上的变动将自动记入会计系统。此外,对系统外部数据, SAP R/3 系统还为其用户提供了电子化处理同业务伙伴间的数据交换的功能。

R/3
系统的财务会计应用模块由总分类帐、应收帐款和应付帐款、固定资产、法定合并以及特殊统计会计功能等组合而成。 3.1 总分类帐( G/L

3.1.1
会计科目表 SAP R/3 系统提供了定义不同会计科目表的功能,使灵活多变的评估成为可能。作为经营用的会计科目表,包含了日常经营管理所需要的科目,也允许进行特殊的,在公司范围内的业务处理,财务会计和成本核算都使用同一个会计科目表;作为地区性的会计科目表,包含了为满足当地法规而设的科目。记帐的数据是基于政府的规定和预先定义的一些规则而处理的,其项目和经营用的会计科目表有所区别;作为集团公司的会计科目表,包含了在集团公司内所有公司代码使用的所有科目,其记帐数据是基于外部集团公司会计的要求,其项目和经营用的会计科目表不同。日常的凭证是记帐到经营用的会计科目表中的,但用户也可以按照某一个国家的特定要求或集团进行会计评估。

3.1.2
货币为了满足许多国家对货币的法规要求, SAP R/3 系统支持用户同时使用多达三种货币作为记帐和结算的本位币。而且所有的业务处理均能以记帐本位币、集团公司货币以及客户自定义的硬通货记帐。另外, SAP R/3 系统还支持自动处理有关外币评估、信息分类以及应收帐款的到期处理。

3.1.3
会计期间 SAP R/3 系统提供最多十六个的记帐会计期间。十二个正常的会计期间另有可自定义的一至四个特别记帐期间。会计年度也可以与日历年度相同或不同,同时还可定义缩短的会计年度(少于十二个会计期间)。

3.1.4
财务报表 SAP R/3 系统提供了丰富的报表功能。从法定的会计报表到自定义的各种内部管理报表都可方便获得。由于系统是高度集成的,所有的业务发生时系统都会同步更新各种财务报表的余额。因此,如果需要且权限许可,任何人在任何时间、任何地方均可获得所需财务报表。原则上,只要有一项业务发生,系统就可以提供更新的财务报表,甚至是对外的资产负债表、损益表等。

3.1.5
总分类帐概述 SAP R/3 系统的总分类帐与目前国内所说的总分类帐其会计概念并不完全一样。 SAP R/3 系统中的总分类帐科目包括除核算应收帐款和应付帐款科目外的所有科目。除了总帐科目中的统驭科目外,所有的总分类帐科目都是可以直接记帐的,并且对于所有总分类帐科目都可以使用未清项管理。 总分类帐科目的主记录数据结构可分为会计科目表层数据和公司代码层数据。会计科目表层数据用于整个主记录,如总帐科目代码,名称,是资产负债表科目还是损益表科目;公司代码层数据包含了如何控制业务数据的输入与记帐的参数,如何管理科目的数据,以及与其它公司代码相关的数据,如货币、税码、统驭科目和未清项管理等。 总分类帐的记帐数据来源于以下方面:后勤等功能模块的集成自动记帐到总分类帐;明细分类帐(如应收帐款 / 应付帐款)中的记帐相应自动更新总分类帐;在总分类帐中的直接记帐。 3.2 应收帐款( A/R 应收帐款模块是 SAP R/3 系统的财会子系统中对客户进行监测与控制的模块。在此模块中,帐户分析、示警报告逾期清单以及灵活的催款功能,都使用户可以方便地处理客户未清项。系统为应收帐款设置明细分类帐,并为其设置统驭帐户。每一笔应收帐款都按未清项进行管理, SAP R/3 系统的应收帐款模块提供一对一的清帐方式,同时也支持按余额总数进行清帐的方式。如果条件许可,系统与电子银行联网,还可实现自动处理进帐业务并提供电子对帐单。系统可以随时从系统中得到每个客户的帐龄分析报告,还可以对已逾期的应收款进行催款。根据未清项目的欠款天数以及对客户信用管理策略设置不同的催款等级进行催款管理。 集成地使用 SAP R/3 的销售及财务会计模块,在销售模块业务发生时,系统自动生成会计凭证,应收帐款明细帐自动更新,同时统驭帐户总帐余额也同步更新,并保持数据的一致性。当然,系统也支持手动输入记帐。 3.3 应付帐款( A/P 应付帐款的核算与应收帐款相似,不再赘述。 3.4 特殊分类帐 另外, SAP R/3 财会子系统提供了特殊分类帐模块,可为用户提供特殊的计算功能。在此模块中,一个特殊分类帐可以通过对科目的设置(如成本中心、产品等),从不同的视角来反映科目的余额。用户可以对每一个分类帐进行计划、分配和货币转换处理。当实际业务发生时,这些特殊分类帐也能自动地更新。这能满足不同的厂商对报表的要求。 3.5 固定资产

SAP R/3
系统的固定资产模块涵盖了所有主要工业国家在法定报表和资产价值地评估方面的要求。能处理包括资产购置、折旧、转移、报废等业务。除了法定的对资产价值评估,可自定义许多折旧和评估的方法。 固定资产的核算和管理是财务会计的重要组成部分。无论是出于外部或内部的会计核算的要求,对固定资产进行计划和监控也显得更加重要。对固定资产的管理,系统主要是通过资产的分类来实现的,这样可以在系统中定义任意多个帐户分配以及相应的统驭科目。资产分类,在 SAP R/3 资产管理应用程序中占据核心的位置。 高度集成使用 SAP R/3 系统使用户能应用高效率的功能。这对于资产管理模块中的资产购置尤其明显。与其相关技术 / 作业部门(应用程序)主要有:财务会计模块 —— 应付帐款,物料模块 —— 收货及发票校验和库存管理,项目管理模块 —— 项目结算,工厂维护模块 —— 后资本化等。对于折旧,系统支持使用多种不同的折旧方法并提供了综合模拟及资产负债表优化的功能,这样就可以通过模拟折旧方法中的更改来执行报表,将优化的折旧结果转帐到报表中。这种模拟的功能为用户提供了对资产价值的不同视角,并且能处理计划和实际的投资。同样,系统支持固定资产的报废和部分报废并自动计算所有待结算的金额。 3.6 法定合并与单独的企业财务报表相比,合并财务报表已经显得日益重要。

SAP R/3
系统允许用户能够选择多种方式对集团公司下属的子公司的业绩进行评估。合并财务报表不是简单地将子公司会计报表进行简单地相加,而是对资产、应收 / 应付帐款、债务、利润、销售收入等进行重新分类、评估、合并及内部抵销。所有地合并业务都是由系统自动完成。除了法定合并以外,系统还允许用户在计划值地基础上经常地结算和作合并会计报表,如汇总的财务报表。 3.7 财务会计信息系统

SAP R/3
的财务会计信息系统( FIS )是基于 SAP 的综合数据信息仓库( EIS )的交互式信息系统。它使用户可以在指定的数据参数的基础上对相应的财会数据作评估。财务会计信息系统对不同币种的分析、总分类帐科目分析、资产负债表和损益表的分析等领域的经营管理提供有效和综合的支持。用户可以对所有的组织结构单元(如公司代码、公司和业务部门)和各种会计期间(会计年度和会计期间)进行评估。报表既可以用公司代码的货币,也可以用其它平行使用的货币 —— 如集团公司货币、硬通货等。功能强大的信息查询功能是 SAP 产品的另一突出特点。
posted @ 2007-04-26 09:46 javaGrowing 阅读(559) | 评论 (0)编辑 收藏

1 FI/SD 借口配置
FI/SD通过tcode VKOA为billing设置过帐科目,用户可以创建自己的科目定义数据表。 科目是做到COA级的,通过KOFI/KOFK这两个condition type确定分别过帐到FI和CO凭证中。 由于PricingProc.是同SalesOrg.相关联的,所以科目在Organization上首先要做到SalesOrg. 级,其后的AccountKey是在PricingProc.中和不同的PriceConditionType相关联的,决定着最终销售收入、折扣、附加费用、预提等过到不同科目上。

2 FI/MM 借口配置
FI/MM通过tcode OBYC为所有的库存移动设置过帐科目,系统用不同的TransactionKey决定了不同的移动类型/业务类型,对于这些TK的含义,SAPLIB中有较为详细的解释,可参阅。
科目的配置可以按照需要做在ValuationArea(Plant)和ValuationClass层。 特别是我认为FI/MM AccountDetermination中最有意思的就是TK为GBB的科目定义,其中有一个东东叫做GeneralModificationKey,这个GMK是同MovementType直接相连的;除了很多标准的GMK之外,用户也可以自定义,并将它们同自定义的MovementType相关联,以决定不同的MT连接 到不同的过帐科目上。

3 实例说明
可以按照资料到系统中配置一下,并做一些例子,有助于理解这些科目配置
3.1、对于收货(特别是来自采购的收货)和发票录入IV/LIV,常用的TransactionKey为:
BSX 同ValuationClass相关联的所有基于存货科目的过帐
FR1、FR3 运费和关税的清帐科目(需要通过IV/LIV做Clear,类似GR/IR科目)
FR2、FR4 运费和关税预提科目(无需Clear)
WRX 存货GR/IR科目
DIF SmallDifference(小金额差异),未超过发票价差容限的金额过到此科目(OMR6中定义ToleranceLimit)
KDM 处理收货同收发票汇率不一致造成的差异过帐
KDR 处理收外币发票时,由于四舍五入的原因造成的本币金额同GRIR本币金额不一致的差异过帐
UPF 处理UnplannedDeliveryCost(计划外运费)是否单独过到某个制定科目而不是过到存货或价差科目
PRD 标准成本法下处理PPV的科目,即采购价差科目

3.2、对于发货和其他库存移动,常用的TransactionKey通常只需要关注GBB,即所谓库存移动的抵减或对应科目,其中比较重要的一个概念就是GeneralModificationKey,这个东东是同MovemtType关联的, 较常用的有:
AUF : 无Acct.Assignmt的PP/CO订单的收货和结算
BSA : 通过561/562做库存初始化的过帐科目
INV : 库存差异导致的收入和费用科目,一般为P+L科目
VAX/VAY: 销售订单的发货成本科目
VBO : 委托加工业务,提供给供应商的库存出货科目
VBR : 处理内部发货业务,如直接消耗到成本中心、资产或内部订单等
VKA : 基于Acct.Assignmt的销售订单业务,如BTO、MTO业务等
VKP : 基于Acct.Assignmt的项目业务,如BTP、MTP业务等
ZOB : 无PO收退货,如501/502
ZOF : 无PP订单收退货,如521/522
同样,你可以基于自定义的MovemtType,设置相关联的自定义的GMK,并在GBB中指定科目。 此外,如果启用MaterialLedger、标准成本法核算货ProductCostbyPeriod等,相关的LKW,PRV, PRP,PRQ和PRY等也需要做相关设置,详见帮助。

3.3 对于收货科目设置,举个稍复杂的例子:
A000工厂下的物料A,ValuationClass为V000;拟在MM/InfoRecord中定价2%的采购运费,不需要通过IV/LIV清帐;价差容限定义1元以下为SmallDifference;在采购过程中发生了计划外运费,并希望过到制定科目上;收发票时的汇率同收货时不同,有差异。
示例会计科目如下:
1401 原材料存货科目
2181 预提运费
5121 计划外运费
5122 SmallDifference
5151 汇率差异
6000 存货GR/IR

可通过OBYC配置为:
库存过帐 BSX A000 V000 1401
预提运费 FR2 A000 V000 2181
小额价差 DIF 5122
计划外运 UPF 5121
汇率差异 KDM A000 V000 5151
GR/IR WRX A000 V000 6000

收货时的分录为(MAP计价方式,忽略VAT):
Dr. 1401 1020.00
Cr. 6000 1000.00
2181 20.00
收采购发票时的分录为:
Dr. 6000 1000.00
5121 100.00
5122 0.80
5151 1.20
Cr. A/P 1102.00
收运费发票的分录:
Dr. 2181 20.00
Cr. A/P 20.00



比如你用MB1A通过201做PGI,在OMJJ中你可以看到有一个Account Grouping,双击进去后有如下一条String: 201 K X X WA03 2 GBB VBR。其中K表示Consumption Posting,而GBB VBR是连接Account的关键。用OBYC,选择GBB(指库存抵减过帐)双击,里面比较复杂的设置有可能是:Valuation Modif.(a Plant) > General Modif.(VBR) > VC > Account!。
这样,201就通过GBB,VBR同相关科目联到了一起。
当然,这是个很简单的例子,SAP对于不同的Special Stock,数量、金额是否更新,都会在OMJJ 中引用不同的所谓(Value String),这个东东比较复杂,我是做FICO的,了解得不多,不过很值得研究啊.

101是针对采购、生产和成本控制订单收货的MT,在OMJJ>Account Groupg. 中你可以看到常用的Movemt. Indicator是B(采购订单)和F(生产订单),请特别注意看Consumption Posting(A,V,E,P...)字段有值的那些行,他们链接的Transaction Key是KBS,这个KBS叫做Account Assigned Purchase-Order,在OBYC中是无法手工配置科目的。SAP在Movement Type的Post String/Value String中处理这种KBS时,会直接指向库存科目,即在BYC中,Transaction Key为BSX库存科目定义。

刚才提到在OMJJ>Account Grouping中的101那些行,它们的Value String是WE06,你可以用t-code SE16看一个表叫做T156W,查看WE06的那些行,你会发现:
WE06 01 KBS
WE06 02 WRX
这KBS刚才说过了,那么这个WRX你会在OBYC中发现,它定义的是GR/IR的科目,即收货时
Dr. Inventory (KBS/BSX)
Cr. GR/IR (WRX)

用这种方法,你就可以分析其他的MT了,如同101类似的105/106,122/123等,蛮复杂的。
另外,在SAP Library中的相关IMG配置解释得也不完整,有很多Transaction Key在4.6C 的Library都没有说明,只能自己研究了。
我们曾经用过的方法,就是用不同的MT做库存移动,然后在程序中设动态断点,依据那些 Value String,跟踪它到底用的是那些Transaction Key和科目定义。
posted @ 2007-04-26 09:43 javaGrowing 阅读(527) | 评论 (0)编辑 收藏

The FI-GL table BSEG, which is one of our biggest PR1 tables, is an example of a clustered table. At the database-level, there is no table called BSEG, but instead RFBLG is being used for the BSEG data. Most of the fields known in BSEG are not known in the database table RFBLG, but are compressed in a VARDATA field of RFBLG. So tests in the WHERE clause of SELECTs agains BSEG are not used by the database (e.g. lifnr = vendor account number, hkont = G/L account, kostl = cost center). As a consequence, these tests are done after the facts similar to using the CHECK statement, and as already said in tip 1, CHECK statements are worse than tests in the WHERE-clause.

Check this link also.
https://forums.sdn.sap.com/thread.jspa?forumID=50&threadID=38572&messageID=373481#373481
1) select with header information from bkpf
2) use secondary index tables
http://forums.sdn.sap.com/jive3/thread.jspa?forumID=50&threadID=14280&messageID=105504#105504
1.BSAK Accounting: Secondary Index for Vendors
2.BSAS Accounting: Secondary Index for G/L Accounts
3.BSIK Accounting: Secondary Index for Vendors
4.BSID Accounting: Secondary Index for Customers
5.BSIM Secondary Index, Documents for Material
6.BSAD Accounting: Secondary index for customers
7.BSIS Accounting: Secondary Index for G/L Accounts
3) use logical data base e.g.: BRF
4)具体说明
BSAD:应收明细(已清帐)
BSID:应收明细(未清帐)
BSAS:总帐明细(已清帐)
BSIS:总帐明细(未清帐)
BSAK:应付明细(已清帐)
BSIK:应付明细(未清帐)
BSEG主要通过“凭证号”“会计年度”“行号”和这六张表关联,BKPF 是财务凭证抬头,BSEG 是财务凭证行项目。在财务凭证记账的时候,数据被插入 BKPF 和 BSEG,如果有必要,数据同时插入以上六张表中的一个未清表。
一般情况下一笔业务产生的凭证都是未清的,那么:
   如果该业务行是客户相关的,则被记录到BSID;
   如果该业务行是供应商相关的,则被记录到BSIK;
   无论和客户相关还是和供应商相关,都是和总帐相关,所以也会有记录到BSIS;
   但是如果这笔业务被清帐了,则相应的记录会从BSI*转移到BSA*

一般情况下:
   应收账款、预收账款、其他应收款、应收汇票等科目既和客户相关,又和未清项管理的总帐科目相关;
   应付账款、预付账款、其他应付款、应付汇票等科目既和供应商相关,又和未清项管理的总帐科目相关;
   其他总帐科目一般不启用未清项管理,所以记录一般都放在BSIS中。

5)未清项和已清项的概念
清项(Open Item),表示财务凭证行项目的一种挂账的状态,这种状态,提示该行项目需要被清帐(Clearing)。在 FS00 设置科目的时候,有一个选项是 'Open Item Mngment',该选项选中后,表示财务凭证行项目中记账科目为此科目时,该行项目有未清或者已清的状态。
已清项(Close Item),表示该行项目已经被清帐。
具体应用中,'Open Item Mngment' 用得比较普遍的是应收(客户)和应付(供应商)的科目。
此外,在总帐中,也有一些应用,比如对于银行的对账单,也一般使用,这样可以再对帐无误后再做清帐。

为什么需要使用到未清项管理?目的是为了记录完整的业务交易。比如对客户A有两笔应收款 A1 与 A2,A1 因为有些商务纠纷,可能需要进一步交涉,所以客户先针对 A2付款。如果没有未清项管理,这一笔收款可能只能针对时间顺序靠前的交易 A1 了,显然,这样是一种比较混乱的状态。实际上,几乎大部分科目理论上都可以进行未清项管理,但是,有可能这样做不能带来显著的效益反而带来管理成本的增加。

6)未清项和已清项sap提供的TCODE
在 SAP R/3 中,使用 FBL1N , FBL3N, FBL5N 分别可以查看供应商,总账,客户类型科目的未清已清项。

posted @ 2007-04-18 14:16 javaGrowing 阅读(792) | 评论 (0)编辑 收藏

 在 Strust 中,我们可能经常要在 ActionForm 中使用其他 JavaBean 作为属性类型,这里就存在着如何使用好这些属性与 HTML Form 之间的数据交换,下面我们就这些问题做一讲解。

如在用户注册界面中,我们通常会将用户的联系方式形成一个单独的新的 Class ,如 Contact ,包含以下属性:电话 (tel) ,手机(cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,这样条理也比较清晰,以下是这个ActionForm 的部分代码:

public class RegisterForm extends ActionForm

{

private Integer id;

private String logonName;

private String realName;

private Contact contact=new Contact();

………..

}

在这里我们需要将 Contact 实例化(在 reset 函数中需要重新实例化),这主要因为 Struts 的机制:如我们将 HTML 的Form 元素(如 email )值传给 ActionForm , Struts 需要执行的操作是getContact().setEmail(String email) ,如果这时返回的 contact 对象为空的话,那么赋值如何进行,而且Struts 也不会知道如何去实例化 Contact ,有时这些 JavaBean 的类型有可能是接口,实例化更是未知,所以关于JavaBean 类型在 ActionForm 中的实例化,你需要自行完成,而且必须完成。至于在实际操作中判断 JavaBean是否被进行过相关操作(不再是初始状态),你需要自行判断,其实也很简单,如可在 Contact 类中编写一个函数检验一下即可。

ActionForm 创建完毕后,我们需要在 Jsp Form 中引用这些 JavaBean 类型的属性值,那就很简单啦,只需采用“ Form 的属性名称”+“ . ”+“ JavaBean 中的属性名称”结构构成的名称付给相关元素即可。如:

<html:text property="contact.email">

通过这种方式我们就可以处理好 ActionForm 中的 JavaBean 类型的属性值了。

实际的情况可能更复杂些,我们有时可能要提交多行数据到后退,而且行内的数据是相关的,如我们需要提交多个用户的联系方式,这些行内的数据,如email ,电话,手机,这些数据都是和用户编码相关的,现在我们修改一下 Contact 类,添加一个用户编码 (userId)属性,这时我们构建的 ActionForm 中可能需要一个列表数据( List )类型来处理这种情况。以下是这个 ActionForm的部分代码:

public class ModifyBatchContactForm extends ActionForm

{

private List contact =new AutoArrayList (Contact.class);

…..

}

在以上代码中,我们同样处理了 List 类型数据的初始化。 Struts 在给 List 中的对象赋值时,当然需要先获取 List数据,然后在获取 List 中某一个对象(通过 Index),最后给对象赋值。在这里想我们可以更详细点分析浏览器端传过来数据,字段值形式如下:contact[0].email= linux_china@hotmail.com , Struts 获取 ActionForm 中的 List数据后,通过 Index (此时为 0 )来获取 List 中封装的 JavaBean 对象,然而此时 List是空的(尽管初始化了,但是没有数据),是无法取得封装的对象的,因此我们要在 Struts 获取 List中封装的对象的时候给它创建一个,这样就保证对象的获取和赋值的成功进行,所有我们新建一个 AutoArrayList 类,继承ArrayList ,只要重写 get(int index) 方法即可,其实很简单,代码如下:

public class AutoArrayList extends ArrayList {

private Class itemClass;

public AutoArrayList(Class itemClass) {

this.itemClass = itemClass;

}

public Object get(int index) {

try {

while (index &gt;= size()) {

add( itemClass.newInstance());

}

} catch (Exception e) {

e.printStackTrace();

}

return super.get(index);

}

}

这样我们就完成可以多行数据提交的 ActionForm设计,这里还有点提醒,如果从浏览器端传过来的行索引是跳跃是的,如缺少中间行,而你不想要这些数据的话,且首尾行 index相差很大的话,这种方式可能不太适合。这种多行提交形式比较适合对固定行的数据处理。如果行数不固定的话,你可以参考使用 MapForm 方式实现。

下面我们就看看如何在 Jsp 中使用这个 ActionForm ,其实只需要执行一个循环即可:

<logic:iterate id=" contact " name=" FormName " property=" contact " indexid="index">

<html:text name=" contact " property="userId" indexed="true">

<html:text name=" contact " property="email" indexed="true">

</html:text>

这里我们再讲解一下,代码中出现的“ contact ”(红色)都是 ActionForm 中的 List数据类型变量名称,请确保一致,请不要更改名称,这也是方便提交到后台的数据接收。“ FormName ”为在 struts-config中声明的 ActionForm 名称。 indexed="true" 可以确保生成的 html 元素的名称唯一,不要缺少这个声明。以上的Jsp 代码,你也可以使用 JSTL 来完成,就看你习惯如何了。

通过以上步骤,我们完成了多行数据的提交所有环节,这样 Struts 就会完成其他所有的事情,我们的代码逻辑和实现也简单多了。

总结:通过以上两个例子,相以信对 ActionForm 中使用 JavaBean 和 List 类型数据不会再陌生,同时使用 Map类型,这样可创建更好的 ActionForm 设计,关于 MapForm ,请参考http://www.jetmaven.net/documents/j_mapformInStruts.php 。不过引入这种方式后,在Validator 方面你可能要花点脑筋啦(如通过 XDoclet 生成 Validator文件可能功能不全),可能你需要手写一些代码来完成相关工作</html:text></logic:iterate></html:text>
posted @ 2006-12-14 09:28 javaGrowing 阅读(616) | 评论 (0)编辑 收藏

common.js


 //扩展String类功能
//删除字符串二边空格
   String.prototype.trim = function()
   {
    return this.replace(/(^[\s]*)|([\s]*$)/g, "");
   };
   //删除字符串左边空格
   String.prototype.lTrim = function()
   {
    return this.replace(/(^[\s]*)/g, "");
   };
   //删除字符串右边空格
   String.prototype.rTrim = function()
   {
    return this.replace(/([\s]*$)/g, "");
   };

---------------------------------------------------------------------
chkUtil.js

 //定义一个可静态调用方法的js类
function ChkUtil() { }
//校验是否为空(先删除二边空格再验证)
ChkUtil.isNull = function (str) {
if (null == str ||  ""== str.trim()) {
  return true;
} else {
  return false;
}
};
//校验是否全是数字
ChkUtil.isDigit  = function (str) {
var patrn=/^\d+$/;
return patrn.test(str);
};
//校验是否是整数
ChkUtil.isInteger = function (str) {
var patrn=/^([+-]?)(\d+)$/;
return patrn.test(str);
};
//校验是否为正整数
ChkUtil.isPlusInteger = function (str) {
var patrn=/^([+]?)(\d+)$/;
return patrn.test(str);
};
//校验是否为负整数
ChkUtil.isMinusInteger = function (str) {
var patrn=/^-(\d+)$/;
return patrn.test(str);
};
//校验是否为浮点数
ChkUtil.isFloat=function(str){
var patrn=/^([+-]?)\d*\.\d+$/;
return patrn.test(str);
};
//校验是否为正浮点数
ChkUtil.isPlusFloat=function(str){
  var patrn=/^([+]?)\d*\.\d+$/;
  return patrn.test(str);
};
//校验是否为负浮点数
ChkUtil.isMinusFloat=function(str){
  var patrn=/^-\d*\.\d+$/;
  return patrn.test(str);
};
//校验是否仅中文
ChkUtil.isChinese=function(str){
var patrn=/[\u4E00-\u9FA5\uF900-\uFA2D]+$/;
return patrn.test(str);
};
//校验是否仅ACSII字符
ChkUtil.isAcsii=function(str){
var patrn=/^[\x00-\xFF]+$/;
return patrn.test(str);
};
//校验手机号码
ChkUtil.isMobile = function (str) {
var patrn = /^0?1((3[0-9]{1})|(59)){1}[0-9]{8}$/;
return patrn.test(str);
};
//校验电话号码
ChkUtil.isPhone = function (str) {
var patrn = /^(0[\d]{2,3}-)?\d{6,8}(-\d{3,4})?$/;
return patrn.test(str);
};
//校验URL地址
ChkUtil.isUrl=function(str){
var patrn= /^http[s]?:\/\/[\w-]+(\.[\w-]+)+([\w-\.\/?%&=]*)?$/;
return patrn.test(str);
};
//校验电邮地址
ChkUtil.isEmail = function (str) {
var patrn = /^[\w-]+@[\w-]+(\.[\w-]+)+$/;
return patrn.test(str);
};
//校验邮编
ChkUtil.isZipCode = function (str) {
var patrn = /^\d{6}$/;
return patrn.test(str);
};
//校验合法时间
ChkUtil.isDate = function (str) {
  if(!/\d{4}(\.|\/|\-)\d{1,2}(\.|\/|\-)\d{1,2}/.test(str)){
    return false;
  }
  var r = str.match(/\d{1,4}/g);
  if(r==null){return false;};
  var d= new Date(r[0], r[1]-1, r[2]);
  return (d.getFullYear()==r[0]&&(d.getMonth()+1)==r[1]&&d.getDate()==r[2]);
};
//校验字符串:只能输入6-20个字母、数字、下划线(常用手校验用户名和密码)
ChkUtil.isString6_20=function(str){
var patrn=/^(\w){6,20}$/;
return patrn.test(str);
};

------------------------------------------------------------------
调用示例

  <script type='text/javascript' src='./common.js'></script>
  <script type='text/javascript' src='./chkUtil.js'></script>
  <script type='text/javascript'>
   function $F(id){
      if(ChkUtil.isNull(id)){alert("函数$F()的参数不能为空");return false;}
      return document.getElementById(id).value;
   }
   function test(){
    var area=$F("area");
    if(area==false)return;
    alert(ChkUtil.isDate(area));//判断是否是合法日期
   }

    
posted @ 2006-11-15 13:50 javaGrowing 阅读(1700) | 评论 (0)编辑 收藏

<span style="border:1px solid green; position:absolute; overflow:hidden"><select style="margin:-2px">
<option>1111</option>
<option>11111111111111</option>
<option>111111111</option>
</select></span>
posted @ 2006-11-12 00:17 javaGrowing 阅读(252) | 评论 (0)编辑 收藏

一、采用RequestDispatcher的方式进行

1、web.xml文件中增加
  <mime-mapping>
    
<extension>doc</extension>
    
<mime-type>application/vnd.ms-word</mime-type>
  
</mime-mapping>



2、程序如下:

   
<%@page language="java" import="java.net.*" pageEncoding="gb2312"%>
<%
 
response.setContentType(
"application/x-download");//设置为下载application/x-download
    String filenamedownload = "/系统解决方案.doc";//即将下载的文件的相对路径
    String filenamedisplay = "系统解决方案.doc";//下载文件时显示的文件保存名称
    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
    response.addHeader(
"Content-Disposition","attachment;filename=" + filenamedisplay);
    
    
try
    
{
        RequestDispatcher dispatcher 
= application.getRequestDispatcher(filenamedownload);
        
if(dispatcher != null)
        
{
            dispatcher.forward(request,response);
        }

        response.flushBuffer();
    }

    
catch(Exception e)
    
{
        e.printStackTrace();
    }

    
finally
    
{
    
    }

%>



二、采用文件流输出的方式下载

1、web.xml文件中增加
  <mime-mapping>
    
<extension>doc</extension>
    
<mime-type>application/vnd.ms-word</mime-type>
  
</mime-mapping>



2、程序如下:

   
<%@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*" pageEncoding="gb2312"%>
<%

//关于文件下载时采用文件流输出的方式处理:
    
//加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
    
//因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,
    
//而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,
    
//就会发生:getOutputStream() has already been called for this response的错误
    
//详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270
    
//而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件
    
//下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。

    response.reset();
//可以加也可以不加
    response.setContentType("application/x-download");//设置为下载application/x-download
    
// /../../退WEB-INF/classes两级到应用的根目录下去,注意Tomcat与WebLogic下面这一句得到的路径不同,WebLogic中路径最后没有/
    System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
    String filenamedownload 
= this.getClass().getClassLoader().getResource("/").getPath() + "/../../系统解决方案.doc";
    String filenamedisplay 
= "系统解决方案.doc";//系统解决方案.txt
    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
    response.addHeader(
"Content-Disposition","attachment;filename=" + filenamedisplay);

    OutputStream output 
= null;
    FileInputStream fis 
= null;
    
try
    
{
        output  
= response.getOutputStream();
        fis 
= new FileInputStream(filenamedownload);

        
byte[] b = new byte[1024];
        
int i = 0;

        
while((i = fis.read(b)) > 0)
        
{
            output.write(b, 
0, i);
        }

        output.flush();
    }

    
catch(Exception e)
    
{
        System.out.println(
"Error!");
        e.printStackTrace();
    }

    
finally
    
{
        
if(fis != null)
        
{
            fis.close();
            fis 
= null;
        }

        
if(output != null)
        
{
            output.close();
            output 
= null;
        }

    }

%>

posted @ 2006-11-10 14:25 javaGrowing 阅读(1765) | 评论 (0)编辑 收藏

function MakeExcel(){
var i,j;
   try {
     var xls    = new ActiveXObject ( "Excel.Application" );
    }
   catch(e) {
        alert( "要打印该表,您必须安装Excel电子表格软件,同时浏览器须使用“ActiveX 控件”,您的浏览器须允许执行控件。 请点击【帮助】了解浏览器设置方法!");
             return "";
    }

   xls.visible =true;  //设置excel为可见

   var xlBook = xls.Workbooks.Add;
   var xlsheet = xlBook.Worksheets(1);
   
     xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,7)).mergecells=true;
     xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,7)).value="发卡记录";
    //  xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,6)).Interior.ColorIndex=5;//设置底色为蓝色
               //   xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,6)).Font.ColorIndex=4;//设置字体色        
  // xlsheet.Rows(1). Interior .ColorIndex = 5 ;//设置底色为蓝色  设置背景色 Rows(1).Font.ColorIndex=4  

   
   xlsheet.Rows(1).RowHeight = 25;
   
   xlsheet.Rows(1).Font.Size=14;
   
   xlsheet.Rows(1).Font.Name="黑体";
   

   xlsheet.Columns("A:D").ColumnWidth =18;
   
   xlsheet.Columns(2).NumberFormatLocal="@";
   xlsheet.Columns(7).NumberFormatLocal="@";


    //设置单元格内容自动换行 range.WrapText  =  true  ;
    //设置单元格内容水平对齐方式 range.HorizontalAlignment  =  Excel.XlHAlign.xlHAlignCenter;//设置单元格内容竖直堆砌方式
     //range.VerticalAlignment=Excel.XlVAlign.xlVAlignCenter
   //range.WrapText  =  true;  xlsheet.Rows(3).WrapText=true  自动换行
 
   //设置标题栏

    xlsheet.Cells(2,1).Value="卡号";
    xlsheet.Cells(2,2).Value="密码";
    xlsheet.Cells(2,3).Value="计费方式";
    xlsheet.Cells(2,4).Value="有效天数";
    xlsheet.Cells(2,5).Value="金额";
    xlsheet.Cells(2,6).Value="所属服务项目";
      xlsheet.Cells(2,7).Value="发卡时间";

    var oTable=document.all['fors:data'];
    var rowNum=oTable.rows.length;
    for(i=2;i<=rowNum;i++){
    for (j=1;j<=7;j++){
//html table类容写到excel

      xlsheet.Cells(i+1,j).Value=oTable.rows(i-1).cells(j-1).innerHTML;
           }


   }
   
   // xlsheet.Range(xlsheet.Cells(i, 4), xlsheet.Cells(i-1, 6)).BorderAround , 4
    // for(mn=1,mn<=6;mn++) .     xlsheet.Range(xlsheet.Cells(1, mn), xlsheet.Cells(i1, j)).Columns.AutoFit;
     xlsheet.Columns.AutoFit;
                xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(rowNum+1,7)).HorizontalAlignment =-4108;//居中
                  xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(1,7)).VerticalAlignment =-4108;
                xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Font.Size=10;

     xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(3).Weight = 2; //设置左边距
      xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(4).Weight = 2;//设置右边距
            xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(1).Weight = 2;//设置顶边距
      xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(2).Weight = 2;//设置底边距
xls.UserControl = true;  //很重要,不能省略,不然会出问题 意思是excel交由用户控制
      xls=null;
      xlBook=null;
      xlsheet=null;

}
posted @ 2006-11-09 21:24 javaGrowing 阅读(629) | 评论 (0)编辑 收藏

问题:
 1、同时安装Desktop、Engine,Engine部分控件不能用,老是提示要授权。
 2、将Desktop卸载,Engine大多数控件能用,少部分不能用。

问题关键:
 Engine授权文件有问题。现在网上Engine9.0的授权文件版本太多了,但有些可以,有些是不能用的。其实我就是被这个问题所困,迟迟不能解决,现将可用的Engine9.0授权文件公布如下(绝对可用):
3dengine,9,ecp379783729,none,D7MGJE2110L5J9HSX169
designer,9,ecp240010879,none,GB20C3RM03HXNTNE9005
gdbedit,9,ecp180013971,none,PMYP34S0PBAM2T8AG239
spatialengine,9,ecp339810398,none,8SJA84S0PDJ94P7EJ048
standardengine,9,ecp100001222,none,6PC42XLJH4C5LMZ59217
streetmapengine,9,ecp299948323,none,1JHDJK988L2MC2EN0146 

解决方法:
 1、安装Desktop,配置License Manager,过程我就不说了吧;
 2、安装Engine,用以上授权文件注册。
 3、此时部分控件仍然不能用。
 4、请将license.dat中的Feature Designe项删除并保存,重启License Manager;
 5、问题解决。

2006/10/24

解决Oracle 9i和Tomcat端口冲突(转载)

方案一:
    新装了系统后,发现在调试程序时TOMCAT提示8080端口已被占用,于是运行NETSTAT -ANO查看端口使用情况,发现8080端口被ORACLE的监听器给占用了,于是结合上网查到方法,将ORACLE XDB的HTTP服务端口改成8081,问题解决。
 
总结一下可解决的方法:
一、更改TOMCAT的默认端口
     相关文件:"TOMCAT ROOT"\conf\server.xml
 
二、使用sys登录Oracle,利用dbms_xdb修改端口设置
SQL> call dbms_xdb.cfg_update(updateXML(
    2        dbms_xdb.cfg_get()
    3      , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
    4      , 8081))
    5  /
    运行完后提示:Call completed.
接着
SQL> COMMIT;
    提示:Commit complete.
SQL> EXEC dbms_xdb.cfg_refresh;
    提示:PL/SQL procedure successfully completed.
三、使用Enterprise Manager Console,选择数据库——XML 数据库——配置,更改http-port的默认值为8081。

方案二:
    安装Oracle数据库后,当我们访问8080端口时,会弹出一个XDB窗口,要求输入用户名和密码。这样将和我们本地一些使用该端口的应用冲突,比如tomcat、jboss等,虽然这些端口是可以修改的,但总是不爽oracle一直占用这个端口。
    Oracle数据库可以使用TCP协议通过8080端口进行连接,所以占用了8080端口。
要取消占用,可以打开Oracle安装目录下的database目录内的SPFILE[SID名].ORA文件进行修改。这个文件是Oracle的启动配置文件。
把其中的*.dispatchers='(PROTOCOL=TCP) (SERVICE=or9iXDB)'这一行去掉即可。
然后重启计算机,或者在服务中重启OracleService[SID名]这个服务。重启后可能无法使用Enterprise Manager Console和其他客户端连接,这时请使用Oracle的Configuration and Migration Tools/Net Configuration Assistant工具删除监听器,然后新建一个监听器,重启监听器。
使用Configuration and Migration Tools/Net Manager工具,将服务命名删除,然后新建一个。
现在Oracle应该就可以正常使用,8080也不会占用了。
补充:
其实这与服务的启动顺序有关,可以先把oracle监听器服务设为手动,tomcat设为自动,重启电脑,测试http://localhost:8080,这时可以看到大猫了,哈哈...然后再把oracle监听器启动,就不会冲突了。
posted @ 2006-11-09 09:13 javaGrowing 阅读(597) | 评论 (1)编辑 收藏

response.setHeader("Cache-Control","no-cache"); //HTTP 1.1

 response.setHeader("Pragma","no-cache"); //HTTP 1.0

 response.setDateHeader ("Expires", 0); //prevents caching at the proxy server

posted @ 2006-11-08 14:42 javaGrowing 阅读(1291) | 评论 (0)编辑 收藏

我的数据库结构是这样的:

首先一开始我可以获得一个频道的channelId,我根据这个channelId得到一个首页区块的List,我在hibernate中配置homepagearea的加载方式,这样就可以通过homepage的到关联的栏目column(多对一关系),然后我还是使用hibernate的自动加载,取到column关联的专题subject(一对多关系)。
这时候问题出来了,由于column到subject的关联没有带channel信息,所以,我取到的subject实际上是一个column下所有的subject,而我期望的是要得到,一个homepagearea下根据channelId和columnId取得的subject.

解决思路:
希望通过hibernate直接建立homepage和subject的1对多关联关系

解决方法
首先我改变原来利用工具生成的hibernate配置文件和entitybean
先列出原来的homepagearea的配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
<class
    name="com.easou.wapsearch.channel.entity.CsHomepageArea"
    table="CS_HOMEPAGE_AREA"
    schema="WAPUSER"
    lazy="true"
>
    <id
        name="id"
        type="long"
        column="ID"
        length="22"
    >
     <generator class="assigned">
      
     </generator>
    </id>
    <property
        name="createdBy"
        type="long"
        column="CREATED_BY"
        length="22"
    />
    <property
        name="createdDate"
        type="timestamp"
        column="CREATED_DATE"
        length="7"
    />
    <property
        name="isMore"
        type="long"
        column="IS_MORE"
        length="22"
    />
    <property
        name="name"
        type="string"
        column="NAME"
        length="50"
    />
    <property
        name="rowCount"
        type="long"
        column="ROW_COUNT"
        length="22"
    />
    <property
        name="showCount"
        type="long"
        column="SHOW_COUNT"
        length="22"
    />
    <property
        name="theOrder"
        type="long"
        column="THE_ORDER"
        length="22"
    />
    <property
        name="updateBy"
        type="long"
        column="UPDATE_BY"
        length="22"
    />
    <property
        name="updateDate"
        type="timestamp"
        column="UPDATE_DATE"
        length="7"
    />

    <!-- Associations -->
    <!-- bi-directional many-to-one association to CsChannel -->
    <many-to-one
        name="csChannel"       
    >
        <column name="CHANNEL_ID" length="22"/>
    </many-to-one>
    <!-- bi-directional many-to-one association to CsColumn -->
    <many-to-one
        name="csColumn"       
    >
        <column name="COLUMN_ID" length="22"/>
    </many-to-one>

</class>
</hibernate-mapping>

为了让homepagearea和subject形成一种一对多的关系,我增加的一个
<set name="csSubjects" inverse="true" cascade="save-update"
   lazy="false" order-by="THE_ORDER" table="CS_SUBJECT"
   outer-join="true">
   <key>
    <column name="CHANNEL_ID" index="CHANNEL_ID" />
    <column name="COLUMN_ID" index="COLUMN_ID" />
   </key>
   <one-to-many
    class="com.easou.wapsearch.channel.entity.CsSubject" />
</set>
但是由于hibernate一对多映射的一端必须是主键,而且我这里需要关联的还是2列信息,所以我还必须要修改配置文件的主键设置
<composite-id mapped="false" unsaved-value="none">
      <key-many-to-one name="csChannel" column="CHANNEL_ID"></key-many-to-one>
   <key-many-to-one name="csColumn" column="COLUMN_ID"></key-many-to-one>
</composite-id>
并且遮蔽掉原有的channel和column多对一关联关系,否则会报告重复错误
<!-- Associations
   bi-directional many-to-one association to CsChannel
  <many-to-one name="csChannel" lazy="true">
   <column name="CHANNEL_ID" length="22" />
  </many-to-one>
   bi-directional many-to-one association to CsColumn
  <many-to-one name="csColumn" lazy="true">
   <column name="COLUMN_ID" length="22" />
  </many-to-one>

  -->
这样hibernate才会在加载homepagearea时自动把subject的关联信息也加载进来了


最后的homepagearea配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
 <class name="com.easou.wapsearch.channel.entity.CsHomepageArea"
  table="CS_HOMEPAGE_AREA" schema="WAPUSER" lazy="true">
  <composite-id mapped="false" unsaved-value="none">
      <key-many-to-one name="csChannel" column="CHANNEL_ID"></key-many-to-one>
   <key-many-to-one name="csColumn" column="COLUMN_ID"></key-many-to-one>
  </composite-id>
  <property name="createdBy" type="long" column="CREATED_BY"
   length="22" />
  <property name="createdDate" type="timestamp"
   column="CREATED_DATE" length="7" />
  <property name="isMore" type="long" column="IS_MORE"
   length="22" />
  <property name="name" type="string" column="NAME" length="50" />
  <property name="rowCount" type="long" column="ROW_COUNT"
   length="22" />
  <property name="showCount" type="long" column="SHOW_COUNT"
   length="22" />
  <property name="theOrder" type="long" column="THE_ORDER"
   length="22" />
  <property name="updateBy" type="long" column="UPDATE_BY"
   length="22" />
  <property name="updateDate" type="timestamp"
   column="UPDATE_DATE" length="7" />

  <!-- Associations
   bi-directional many-to-one association to CsChannel
  <many-to-one name="csChannel" lazy="true">
   <column name="CHANNEL_ID" length="22" />
  </many-to-one>
   bi-directional many-to-one association to CsColumn
  <many-to-one name="csColumn" lazy="true">
   <column name="COLUMN_ID" length="22" />
  </many-to-one>

  -->
  <set name="csSubjects" inverse="true" cascade="save-update"
   lazy="false" order-by="THE_ORDER" table="CS_SUBJECT"
   outer-join="true">
   <key>
    <column name="CHANNEL_ID" index="CHANNEL_ID" />
    <column name="COLUMN_ID" index="COLUMN_ID" />
   </key>
   <one-to-many
    class="com.easou.wapsearch.channel.entity.CsSubject" />

  </set>


 </class>

</hibernate-mapping>

经验总结:
1、本来使用hibernate的加载策略就是为了把一些业务逻辑直接融合在数据库关系当中,但是由于自己逻辑没有考虑清楚造成了加载时信息的丢失(而且我觉得我的表结构有问题,不知有有没有dba给我指点一下问题)。
2、hibernate的一对多关联关系多端是1端是针对主键的,所以不论你是关联的是1列2列还是3列,它们都应该是你的1端的主键或者联合主键(其实一对一,多对一,多对多的原理也是相似的)。

参考资料:hibernate_reference(3.2)

posted @ 2006-11-08 11:50 javaGrowing 阅读(375) | 评论 (0)编辑 收藏