javaGrowing

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

#

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 阅读(791) | 评论 (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 阅读(1699) | 评论 (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 阅读(251) | 评论 (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 阅读(1764) | 评论 (0)编辑 收藏

仅列出标题
共19页: First 上一页 2 3 4 5 6 7 8 9 10 下一页 Last