javaGrowing

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            92 隨筆 :: 33 文章 :: 49 評(píng)論 :: 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)具體說(shuō)明
          BSAD:應(yīng)收明細(xì)(已清帳)
          BSID:應(yīng)收明細(xì)(未清帳)
          BSAS:總帳明細(xì)(已清帳)
          BSIS:總帳明細(xì)(未清帳)
          BSAK:應(yīng)付明細(xì)(已清帳)
          BSIK:應(yīng)付明細(xì)(未清帳)
          BSEG主要通過(guò)“憑證號(hào)”“會(huì)計(jì)年度”“行號(hào)”和這六張表關(guān)聯(lián),BKPF 是財(cái)務(wù)憑證抬頭,BSEG 是財(cái)務(wù)憑證行項(xiàng)目。在財(cái)務(wù)憑證記賬的時(shí)候,數(shù)據(jù)被插入 BKPF 和 BSEG,如果有必要,數(shù)據(jù)同時(shí)插入以上六張表中的一個(gè)未清表。
          一般情況下一筆業(yè)務(wù)產(chǎn)生的憑證都是未清的,那么:
          ?? 如果該業(yè)務(wù)行是客戶相關(guān)的,則被記錄到BSID;
          ?? 如果該業(yè)務(wù)行是供應(yīng)商相關(guān)的,則被記錄到BSIK;
          ?? 無(wú)論和客戶相關(guān)還是和供應(yīng)商相關(guān),都是和總帳相關(guān),所以也會(huì)有記錄到BSIS;
          ?? 但是如果這筆業(yè)務(wù)被清帳了,則相應(yīng)的記錄會(huì)從BSI*轉(zhuǎn)移到BSA*

          一般情況下:
          ?? 應(yīng)收賬款、預(yù)收賬款、其他應(yīng)收款、應(yīng)收匯票等科目既和客戶相關(guān),又和未清項(xiàng)管理的總帳科目相關(guān);
          ?? 應(yīng)付賬款、預(yù)付賬款、其他應(yīng)付款、應(yīng)付匯票等科目既和供應(yīng)商相關(guān),又和未清項(xiàng)管理的總帳科目相關(guān);
          ?? 其他總帳科目一般不啟用未清項(xiàng)管理,所以記錄一般都放在BSIS中。

          5)未清項(xiàng)和已清項(xiàng)的概念
          清項(xiàng)(Open Item),表示財(cái)務(wù)憑證行項(xiàng)目的一種掛賬的狀態(tài),這種狀態(tài),提示該行項(xiàng)目需要被清帳(Clearing)。在 FS00 設(shè)置科目的時(shí)候,有一個(gè)選項(xiàng)是 'Open Item Mngment',該選項(xiàng)選中后,表示財(cái)務(wù)憑證行項(xiàng)目中記賬科目為此科目時(shí),該行項(xiàng)目有未清或者已清的狀態(tài)。
          已清項(xiàng)(Close Item),表示該行項(xiàng)目已經(jīng)被清帳。
          具體應(yīng)用中,'Open Item Mngment' 用得比較普遍的是應(yīng)收(客戶)和應(yīng)付(供應(yīng)商)的科目。
          此外,在總帳中,也有一些應(yīng)用,比如對(duì)于銀行的對(duì)賬單,也一般使用,這樣可以再對(duì)帳無(wú)誤后再做清帳。

          為什么需要使用到未清項(xiàng)管理?目的是為了記錄完整的業(yè)務(wù)交易。比如對(duì)客戶A有兩筆應(yīng)收款 A1 與 A2,A1 因?yàn)橛行┥虅?wù)糾紛,可能需要進(jìn)一步交涉,所以客戶先針對(duì) A2付款。如果沒(méi)有未清項(xiàng)管理,這一筆收款可能只能針對(duì)時(shí)間順序靠前的交易 A1 了,顯然,這樣是一種比較混亂的狀態(tài)。實(shí)際上,幾乎大部分科目理論上都可以進(jìn)行未清項(xiàng)管理,但是,有可能這樣做不能帶來(lái)顯著的效益反而帶來(lái)管理成本的增加。

          6)未清項(xiàng)和已清項(xiàng)sap提供的TCODE
          在 SAP R/3 中,使用 FBL1N , FBL3N, FBL5N 分別可以查看供應(yīng)商,總賬,客戶類型科目的未清已清項(xiàng)。

          posted @ 2007-04-18 14:16 javaGrowing 閱讀(800) | 評(píng)論 (0)編輯 收藏

          ?在 Strust 中,我們可能經(jīng)常要在 ActionForm 中使用其他 JavaBean 作為屬性類型,這里就存在著如何使用好這些屬性與 HTML Form 之間的數(shù)據(jù)交換,下面我們就這些問(wèn)題做一講解。

          如在用戶注冊(cè)界面中,我們通常會(huì)將用戶的聯(lián)系方式形成一個(gè)單獨(dú)的新的 Class ,如 Contact ,包含以下屬性:電話 (tel) ,手機(jī)(cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,這樣條理也比較清晰,以下是這個(gè)ActionForm 的部分代碼:

          public class RegisterForm extends ActionForm

          {

          private Integer id;

          private String logonName;

          private String realName;

          private Contact contact=new Contact();

          ………..

          }

          在這里我們需要將 Contact 實(shí)例化(在 reset 函數(shù)中需要重新實(shí)例化),這主要因?yàn)?Struts 的機(jī)制:如我們將 HTML 的Form 元素(如 email )值傳給 ActionForm , Struts 需要執(zhí)行的操作是getContact().setEmail(String email) ,如果這時(shí)返回的 contact 對(duì)象為空的話,那么賦值如何進(jìn)行,而且Struts 也不會(huì)知道如何去實(shí)例化 Contact ,有時(shí)這些 JavaBean 的類型有可能是接口,實(shí)例化更是未知,所以關(guān)于JavaBean 類型在 ActionForm 中的實(shí)例化,你需要自行完成,而且必須完成。至于在實(shí)際操作中判斷 JavaBean是否被進(jìn)行過(guò)相關(guān)操作(不再是初始狀態(tài)),你需要自行判斷,其實(shí)也很簡(jiǎn)單,如可在 Contact 類中編寫(xiě)一個(gè)函數(shù)檢驗(yàn)一下即可。

          ActionForm 創(chuàng)建完畢后,我們需要在 Jsp Form 中引用這些 JavaBean 類型的屬性值,那就很簡(jiǎn)單啦,只需采用“ Form 的屬性名稱”+“ . ”+“ JavaBean 中的屬性名稱”結(jié)構(gòu)構(gòu)成的名稱付給相關(guān)元素即可。如:

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

          通過(guò)這種方式我們就可以處理好 ActionForm 中的 JavaBean 類型的屬性值了。

          實(shí)際的情況可能更復(fù)雜些,我們有時(shí)可能要提交多行數(shù)據(jù)到后退,而且行內(nèi)的數(shù)據(jù)是相關(guān)的,如我們需要提交多個(gè)用戶的聯(lián)系方式,這些行內(nèi)的數(shù)據(jù),如email ,電話,手機(jī),這些數(shù)據(jù)都是和用戶編碼相關(guān)的,現(xiàn)在我們修改一下 Contact 類,添加一個(gè)用戶編碼 (userId)屬性,這時(shí)我們構(gòu)建的 ActionForm 中可能需要一個(gè)列表數(shù)據(jù)( List )類型來(lái)處理這種情況。以下是這個(gè) ActionForm的部分代碼:

          public class ModifyBatchContactForm extends ActionForm

          {

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

          …..

          }

          在以上代碼中,我們同樣處理了 List 類型數(shù)據(jù)的初始化。 Struts 在給 List 中的對(duì)象賦值時(shí),當(dāng)然需要先獲取 List數(shù)據(jù),然后在獲取 List 中某一個(gè)對(duì)象(通過(guò) Index),最后給對(duì)象賦值。在這里想我們可以更詳細(xì)點(diǎn)分析瀏覽器端傳過(guò)來(lái)數(shù)據(jù),字段值形式如下:contact[0].email= linux_china@hotmail.com , Struts 獲取 ActionForm 中的 List數(shù)據(jù)后,通過(guò) Index (此時(shí)為 0 )來(lái)獲取 List 中封裝的 JavaBean 對(duì)象,然而此時(shí) List是空的(盡管初始化了,但是沒(méi)有數(shù)據(jù)),是無(wú)法取得封裝的對(duì)象的,因此我們要在 Struts 獲取 List中封裝的對(duì)象的時(shí)候給它創(chuàng)建一個(gè),這樣就保證對(duì)象的獲取和賦值的成功進(jìn)行,所有我們新建一個(gè) AutoArrayList 類,繼承ArrayList ,只要重寫(xiě) get(int index) 方法即可,其實(shí)很簡(jiǎn)單,代碼如下:

          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);

          }

          }

          這樣我們就完成可以多行數(shù)據(jù)提交的 ActionForm設(shè)計(jì),這里還有點(diǎn)提醒,如果從瀏覽器端傳過(guò)來(lái)的行索引是跳躍是的,如缺少中間行,而你不想要這些數(shù)據(jù)的話,且首尾行 index相差很大的話,這種方式可能不太適合。這種多行提交形式比較適合對(duì)固定行的數(shù)據(jù)處理。如果行數(shù)不固定的話,你可以參考使用 MapForm 方式實(shí)現(xiàn)。

          下面我們就看看如何在 Jsp 中使用這個(gè) ActionForm ,其實(shí)只需要執(zhí)行一個(gè)循環(huán)即可:

          <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>

          這里我們?cè)僦v解一下,代碼中出現(xiàn)的“ contact ”(紅色)都是 ActionForm 中的 List數(shù)據(jù)類型變量名稱,請(qǐng)確保一致,請(qǐng)不要更改名稱,這也是方便提交到后臺(tái)的數(shù)據(jù)接收?!?FormName ”為在 struts-config中聲明的 ActionForm 名稱。 indexed="true" 可以確保生成的 html 元素的名稱唯一,不要缺少這個(gè)聲明。以上的Jsp 代碼,你也可以使用 JSTL 來(lái)完成,就看你習(xí)慣如何了。

          通過(guò)以上步驟,我們完成了多行數(shù)據(jù)的提交所有環(huán)節(jié),這樣 Struts 就會(huì)完成其他所有的事情,我們的代碼邏輯和實(shí)現(xiàn)也簡(jiǎn)單多了。

          總結(jié):通過(guò)以上兩個(gè)例子,相以信對(duì) ActionForm 中使用 JavaBean 和 List 類型數(shù)據(jù)不會(huì)再陌生,同時(shí)使用 Map類型,這樣可創(chuàng)建更好的 ActionForm 設(shè)計(jì),關(guān)于 MapForm ,請(qǐng)參考http://www.jetmaven.net/documents/j_mapformInStruts.php 。不過(guò)引入這種方式后,在Validator 方面你可能要花點(diǎn)腦筋啦(如通過(guò) XDoclet 生成 Validator文件可能功能不全),可能你需要手寫(xiě)一些代碼來(lái)完成相關(guān)工作</html:text></logic:iterate></html:text>
          posted @ 2006-12-14 09:28 javaGrowing 閱讀(625) | 評(píng)論 (0)編輯 收藏

          common.js


           //擴(kuò)展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

           //定義一個(gè)可靜態(tài)調(diào)用方法的js類
          function ChkUtil() { }
          //校驗(yàn)是否為空(先刪除二邊空格再驗(yàn)證)
          ChkUtil.isNull = function (str) {
          if (null == str ||??""== str.trim()) {
          ??return true;
          } else {
          ??return false;
          }
          };
          //校驗(yàn)是否全是數(shù)字
          ChkUtil.isDigit??= function (str) {
          var patrn=/^\d+$/;
          return patrn.test(str);
          };
          //校驗(yàn)是否是整數(shù)
          ChkUtil.isInteger = function (str) {
          var patrn=/^([+-]?)(\d+)$/;
          return patrn.test(str);
          };
          //校驗(yàn)是否為正整數(shù)
          ChkUtil.isPlusInteger = function (str) {
          var patrn=/^([+]?)(\d+)$/;
          return patrn.test(str);
          };
          //校驗(yàn)是否為負(fù)整數(shù)
          ChkUtil.isMinusInteger = function (str) {
          var patrn=/^-(\d+)$/;
          return patrn.test(str);
          };
          //校驗(yàn)是否為浮點(diǎn)數(shù)
          ChkUtil.isFloat=function(str){
          var patrn=/^([+-]?)\d*\.\d+$/;
          return patrn.test(str);
          };
          //校驗(yàn)是否為正浮點(diǎn)數(shù)
          ChkUtil.isPlusFloat=function(str){
          ??var patrn=/^([+]?)\d*\.\d+$/;
          ??return patrn.test(str);
          };
          //校驗(yàn)是否為負(fù)浮點(diǎn)數(shù)
          ChkUtil.isMinusFloat=function(str){
          ??var patrn=/^-\d*\.\d+$/;
          ??return patrn.test(str);
          };
          //校驗(yàn)是否僅中文
          ChkUtil.isChinese=function(str){
          var patrn=/[\u4E00-\u9FA5\uF900-\uFA2D]+$/;
          return patrn.test(str);
          };
          //校驗(yàn)是否僅ACSII字符
          ChkUtil.isAcsii=function(str){
          var patrn=/^[\x00-\xFF]+$/;
          return patrn.test(str);
          };
          //校驗(yàn)手機(jī)號(hào)碼
          ChkUtil.isMobile = function (str) {
          var patrn = /^0?1((3[0-9]{1})|(59)){1}[0-9]{8}$/;
          return patrn.test(str);
          };
          //校驗(yàn)電話號(hào)碼
          ChkUtil.isPhone = function (str) {
          var patrn = /^(0[\d]{2,3}-)?\d{6,8}(-\d{3,4})?$/;
          return patrn.test(str);
          };
          //校驗(yàn)URL地址
          ChkUtil.isUrl=function(str){
          var patrn= /^http[s]?:\/\/[\w-]+(\.[\w-]+)+([\w-\.\/?%&=]*)?$/;
          return patrn.test(str);
          };
          //校驗(yàn)電郵地址
          ChkUtil.isEmail = function (str) {
          var patrn = /^[\w-]+@[\w-]+(\.[\w-]+)+$/;
          return patrn.test(str);
          };
          //校驗(yàn)郵編
          ChkUtil.isZipCode = function (str) {
          var patrn = /^\d{6}$/;
          return patrn.test(str);
          };
          //校驗(yàn)合法時(shí)間
          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]);
          };
          //校驗(yàn)字符串:只能輸入6-20個(gè)字母、數(shù)字、下劃線(常用手校驗(yàn)用戶名和密碼)
          ChkUtil.isString6_20=function(str){
          var patrn=/^(\w){6,20}$/;
          return patrn.test(str);
          };

          ------------------------------------------------------------------
          調(diào)用示例

          ??<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("函數(shù)$F()的參數(shù)不能為空");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 閱讀(1709) | 評(píng)論 (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 閱讀(258) | 評(píng)論 (0)編輯 收藏

          一、采用RequestDispatcher的方式進(jìn)行

          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");//設(shè)置為下載application/x-download
          ????String?filenamedownload?=?"/系統(tǒng)解決方案.doc";//即將下載的文件的相對(duì)路徑
          ????String?filenamedisplay?=?"系統(tǒng)解決方案.doc";//下載文件時(shí)顯示的文件保存名稱
          ????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"%>
          <%

          //關(guān)于文件下載時(shí)采用文件流輸出的方式處理:
          ????
          //加上response.reset(),并且所有的%>后面不要換行,包括最后一個(gè);
          ????
          //因?yàn)锳pplication?Server在處理編譯jsp時(shí)對(duì)于%>和<%之間的內(nèi)容一般是原樣輸出,而且默認(rèn)是PrintWriter,
          ????
          //而你卻要進(jìn)行流輸出:ServletOutputStream,這樣做相當(dāng)于試圖在Servlet中使用兩種輸出機(jī)制,
          ????
          //就會(huì)發(fā)生:getOutputStream()?has?already?been?called?for?this?response的錯(cuò)誤
          ????
          //詳細(xì)請(qǐng)見(jiàn)《More?Java?Pitfill》一書(shū)的第二部分?Web層Item?33:試圖在Servlet中使用兩種輸出機(jī)制?270
          ????
          //而且如果有換行,對(duì)于文本文件沒(méi)有什么問(wèn)題,但是對(duì)于其它格式,比如AutoCAD、Word、Excel等文件
          ????
          //下載下來(lái)的文件中就會(huì)多出一些換行符0x0d和0x0a,這樣可能導(dǎo)致某些格式的文件無(wú)法打開(kāi),有些也可以正常打開(kāi)。

          ????response.reset();
          //可以加也可以不加
          ????response.setContentType("application/x-download");//設(shè)置為下載application/x-download
          ????
          //?/../../退WEB-INF/classes兩級(jí)到應(yīng)用的根目錄下去,注意Tomcat與WebLogic下面這一句得到的路徑不同,WebLogic中路徑最后沒(méi)有/
          ????System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
          ????String?filenamedownload?
          =?this.getClass().getClassLoader().getResource("/").getPath()?+?"/../../系統(tǒng)解決方案.doc";
          ????String?filenamedisplay?
          =?"系統(tǒng)解決方案.doc";//系統(tǒng)解決方案.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 閱讀(1778) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共19頁(yè): First 上一頁(yè) 2 3 4 5 6 7 8 9 10 下一頁(yè) Last 
          主站蜘蛛池模板: 冀州市| 志丹县| 眉山市| 平谷区| 灵丘县| 同江市| 沐川县| 昭苏县| 通江县| 页游| 临澧县| 宜宾市| 峨眉山市| 龙里县| 恩施市| 衡山县| 莲花县| 孙吴县| 朝阳市| 石景山区| 开阳县| 揭西县| 全椒县| 吐鲁番市| 宝应县| 碌曲县| 丽水市| 新平| 巩义市| 襄汾县| 衡阳市| 泾川县| 克山县| 大姚县| 巴林左旗| 溆浦县| 镇远县| 富川| 额尔古纳市| 南城县| 乐昌市|