2007年4月29日 #
Archetype | Command |
---|---|
JSF Basic | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf -DremoteRepositories=http://static.appfuse.org/releases![]() |
Spring MVC Basic | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/releases![]() |
Struts 2 Basic | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/releases![]() |
Tapestry Basic | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-tapestry -DremoteRepositories=http://static.appfuse.org/releases![]() |
JSF Modular | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-jsf -DremoteRepositories=http://static.appfuse.org/releases![]() |
Spring MVC Modular | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-spring -DremoteRepositories=http://static.appfuse.org/releases![]() |
Struts 2 Modular | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-struts -DremoteRepositories=http://static.appfuse.org/releases![]() |
Tapestry Modular | mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-tapestry -DremoteRepositories=http://static.appfuse.org/releases![]() |
Core
(backend only) |
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-core -DremoteRepositories=http://static.appfuse.org/releases![]() |
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.
- 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.
- 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.
- 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. - 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
原因:?? url中有些字符被轉(zhuǎn)義,比如空格被編碼成加號(hào),于是傳的參數(shù)明明是加號(hào),獲取的值卻成了空格。如何解決呢?如果是通過url傳遞參數(shù),應(yīng)該對(duì)其進(jìn)行必要的編碼。
解決辦法:
???????? 在javascript中加入?? function URLencode(sStr)
{
??? return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');
}
對(duì)字符串進(jìn)行處理.如:var str=URLencode("abc+")
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
所謂排序,就是要整理文件中的記錄,使之按關(guān)鍵字遞增(或遞減)次序排列起來(lái)。其確切定義如下:
輸入:n個(gè)記錄R1,R2,…,Rn,其相應(yīng)的關(guān)鍵字分別為K1,K2,…,Kn。
輸出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。
??? 這里,我們簡(jiǎn)單介紹幾種排序方法,直接插入排序、希兒排序、冒泡排序、快速排序、直接選擇排序,文中所提及的代碼在IE6下測(cè)試通過。
直接插入排序基本思想
??? 假設(shè)待排序的記錄存放在數(shù)組R[1..n]中。初始時(shí),R[1]自成1個(gè)有序區(qū),無(wú)序區(qū)為R[2..n]。從i=2起直至i=n為止,依次將R[i]插入當(dāng)前的有序區(qū)R[1..i-1]中,生成含n個(gè)記錄的有序區(qū)。
??? 算法描述
??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;
?}
希爾排序基本思想
??先取一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,把文件的全部記錄分成d1個(gè)組。所有距離為dl的倍數(shù)的記錄放在同一個(gè)組中。先在各組內(nèi)進(jìn)行直接插人排序;然后,取第二個(gè)增量d2<d1重復(fù)上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?br />? 該方法實(shí)質(zhì)上是一種分組插入方法。
??? 算法描述 ?
??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)?{?//希兒排序分段執(zhí)行函數(shù)
??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;
?}
冒泡排序基本思想
???
將被排序的記錄數(shù)組R[1..n]垂直排列,每個(gè)記錄R[i]看作是重量為R[i].key的氣泡。根據(jù)輕氣泡不能在重氣泡之下的原則,從下往上掃描數(shù)組
R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復(fù)進(jìn)行,直到最后任何兩個(gè)氣泡都是輕者在上,重者在下為止。
??? 算法描述
?
??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;
?}
快速排序基本思想
??? 將原問題分解為若干個(gè)規(guī)模更小但結(jié)構(gòu)與原問題相似的子問題。遞歸地解這些子問題,然后將這些子問題的解組合為原問題的解。
???
在R[low..high]中任選一個(gè)記錄作為基準(zhǔn)(Pivot),以此基準(zhǔn)將當(dāng)前無(wú)序區(qū)劃分為左、右兩個(gè)較小的子區(qū)間R[low..pivotpos-
1)和R[pivotpos+1..high],并使左邊子區(qū)間中所有記錄的關(guān)鍵字均小于等于基準(zhǔn)記錄(不妨記為pivot)的關(guān)鍵字
pivot.key,右邊的子區(qū)間中所有記錄的關(guān)鍵字均大于等于pivot.key,而基準(zhǔn)記錄pivot則位于正確的位置(pivotpos)上,它無(wú)
須參加后續(xù)的排序。
??? 算法描述
?
??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<j?&&?arr[j]>=pivot)
?????j--;
????if(i<j)
?????arr[i++]?=?arr[j];
????while(i<j?&&?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個(gè)記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果:
?①初始狀態(tài):無(wú)序區(qū)為R[1..n],有序區(qū)為空。
?②第1趟排序
????在無(wú)序區(qū)R[1..n]中選出關(guān)鍵字最小的記錄R[k],將它與無(wú)序區(qū)的第1個(gè)記錄R[1]交換,使R[1..1]和R[2..n]分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無(wú)序區(qū)。
……
?③第i趟排序
第i趟排序開始時(shí),當(dāng)前有序區(qū)和無(wú)序區(qū)分別為R[1..i-1]和R[i..n](1≤i≤n-1)。該趟排序從當(dāng)前無(wú)序區(qū)中選出關(guān)鍵字最小的記錄R?[k],將它與無(wú)序區(qū)的第1個(gè)記錄R[i]交換,使R[1..i]和R[i+1..n]分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無(wú)序區(qū)。
????這樣,n個(gè)記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。
????算法描述
?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;
?}
Dom + Javascript 在本機(jī)瀏覽器中對(duì)的表格數(shù)據(jù)進(jìn)行排序
在本機(jī)瀏覽器中對(duì)的表格數(shù)據(jù)進(jìn)行排序
在Web應(yīng)用中,數(shù)據(jù)從服務(wù)器端返回到客戶端,以表格形式表現(xiàn)出來(lái)。如果要對(duì)數(shù)據(jù)集按指定的列排序顯示,常規(guī)做法都是向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器端程序重新從數(shù)據(jù)庫(kù)中取出按指定列排序的數(shù)據(jù),返回給客戶端,頁(yè)面重新顯示排序后數(shù)據(jù)。
?
采用這種方式有如下缺點(diǎn):
1- 響應(yīng)時(shí)間延遲,每次排序都要向服務(wù)器端發(fā)送請(qǐng)求,等待結(jié)果返回,同時(shí)增加網(wǎng)絡(luò)負(fù)載。
2- 編程復(fù)雜,可維護(hù)性差,而且客戶端和服務(wù)器端代碼耦合度很高,客戶端和服務(wù)器端都要處理排序涉及的列名、排序方式,如果有分頁(yè)和查詢條件,都需要在客戶端頁(yè)面中保留,排序請(qǐng)求時(shí)重新傳遞到服務(wù)器端,當(dāng)參數(shù)數(shù)量很多時(shí)極易出錯(cuò)。
3- 重用度很低,針對(duì)不同表格,很難抽象出一個(gè)公共程序來(lái)共用,需要逐個(gè)編寫代碼實(shí)現(xiàn),增加工作量。
?
現(xiàn)在換一個(gè)角度考慮,數(shù)據(jù)既然已下載到了客戶端,在重新排序時(shí)沒有必要再重服務(wù)器端獲取,只要對(duì)瀏覽器中的數(shù)據(jù)重新排序顯示就可以了。要實(shí)現(xiàn)該目標(biāo),需要做到以下幾點(diǎn):
1 - 獲得表格中要排序的數(shù)據(jù),將其放入一個(gè)2維數(shù)組中。
2 - 對(duì)2維數(shù)組排序。
3 - 用排序后的數(shù)據(jù)重新更新表格。
?
利用瀏覽器支持的DOM(Document Object Model)和JavaScript即可實(shí)現(xiàn)上述目標(biāo)。
?
通常頁(yè)面中會(huì)很多的<table>,要獲得需要排序數(shù)據(jù)所在的table,需要在<table>中增加一個(gè)id屬性,便于document對(duì)象用getElementById得到該表格對(duì)象,例如要排序的表格定義如下:
?<table id="st" >
??? <tr>
??????? <td>1</td>
??????? <td>2</td>
??? </tr>
</table>
?
在javascript中,用var objTable = document.getElementById("st")就可得到表格對(duì)象,該對(duì)象在DOM中定義為一個(gè)Element。
?
然
后用 var objRows =
objTable.getElementsByTagName("tr")得到該表格中全部的行對(duì)象,ObjRows.length返回該表格行數(shù);
var rowi =
objRows[i].getElementsByTagName("td")得到第i行的全部<td>節(jié)點(diǎn),i從0開始計(jì)數(shù),
rowi.item(j)則可得到第i行,第j列的節(jié)點(diǎn),該節(jié)點(diǎn)的innerHTML為該節(jié)點(diǎn)<td></td>之間的內(nèi)容。
?
獲取表格數(shù)據(jù)到2維數(shù)組的代碼見源代碼,此處略。
?
下面說(shuō)明在javascript中2維數(shù)組的構(gòu)造和排序。
javascript不支持2維數(shù)組,因此需要用數(shù)組的數(shù)組來(lái)模擬一個(gè)2維數(shù)組,其方法是先定義一個(gè)1維數(shù)組,元素個(gè)數(shù)為2維數(shù)組的行數(shù),然后對(duì)每個(gè)元素賦一個(gè)值,值為一個(gè)數(shù)組,其元素個(gè)數(shù)為2維數(shù)組的列數(shù)。構(gòu)造代碼如下:
?
var rows = new Array(R);? //R為行數(shù)
for(var i = 0; i < rows.length; i++){
??? rows[i] = new Array(C);??? //C為列數(shù)
}
?
?
利用javascript中的Array.sort(comparer)對(duì)rows中的元素排序,比較方式由重新定義的比較函數(shù)得到。要根據(jù)第j列元素的大小排序,只要定義如下函數(shù)即可:
?
function compareCol(a,b){
???
??? if (a[j] < b[j])
??????? return -1;
?
??? if (a[j] > b[j])
??????? return 1;
?
?? return 0;
?
}
?
因?yàn)閏ompareCol只能有兩個(gè)參數(shù),因此j要定義為全局變量。
?
用rows.sort
(compareCol)就可實(shí)現(xiàn)根據(jù)j列值的大小對(duì)行進(jìn)行排序。根據(jù)javascript文檔,字符串比較大小是按照其Unicode編碼的大小來(lái)比
較,對(duì)英文排序沒有問題,對(duì)中文排序時(shí)就不是按通常的拼音排序,那需要javascript提供本地化支持,目前沒有發(fā)現(xiàn)javascript此功能。該
功能在java中可用java.text.Collator實(shí)現(xiàn)。
?
?
?以上介紹了在本地對(duì)瀏覽器中的數(shù)據(jù)進(jìn)行排序的主要思想,
為方便使用,將這些功能進(jìn)行了封裝,以javascript函數(shù)的提供,存放在sorttable.js文件中,在需要的頁(yè)面中用<script
type=text/javascript src='sorttable.js'></script>引入。
?
?
?下面說(shuō)明排序函數(shù)原型和使用方法。
?
函數(shù)1 function sortTable(tableId,sortCol,compareType)
對(duì)頁(yè)面中指定表格中的數(shù)據(jù)進(jìn)行排序,通常第一行為標(biāo)題行,排序時(shí)從第二行開始,第一次調(diào)用為升序排列,第二次為降序排列,依次輪換。
tableId??? 為<table id=''>中id的值,在同一個(gè)頁(yè)面中要唯一。
sortCol??? 排序時(shí)用來(lái)比較大小的數(shù)據(jù)所在的列,從1開始計(jì)數(shù)。
compareType 排序時(shí)比較大小的方式,s-按字符串比較大小,n-按數(shù)字比較大小。
?
?
?
?函數(shù)2 function sortTableInRange(tableId,sortCol,compareType,startRow,endRow,startCol,endCol)
?
??????? 對(duì)表格中指定的區(qū)域數(shù)據(jù)排序,有時(shí)數(shù)據(jù)第一列為流水號(hào),最后一行為合計(jì),這些數(shù)據(jù)不需要參與排序,可用此函數(shù)來(lái)對(duì)部分?jǐn)?shù)據(jù)排序。
???????
??????? tableId??? 為<table id=''>中id的值,在同一個(gè)頁(yè)面中要唯一。
??????? sortCol??? 排序時(shí)用來(lái)比較大小的數(shù)據(jù)所在的列,從1開始計(jì)數(shù)。
??????? compareType 排序時(shí)比較大小的方式,s-按字符串比較大小,n-按數(shù)字比較大小。
??????? startRow,endRow 要排序區(qū)域開始和結(jié)束行號(hào),從1開始計(jì)數(shù)。例如對(duì)第2行到第7行排序,startRow=2,endRow=7
??????? startCol,endCol? 要排序區(qū)域開始和結(jié)束列號(hào),從1開始計(jì)數(shù)。
?
?
?
?
?
存在的問題:
1- 中文不能按拼音排序。
?
?
要注意的問題:
要排序的table必須用ID標(biāo)示,并要作為參數(shù)傳給排序函數(shù),表格中的數(shù)據(jù)應(yīng)該是可以排序的,否則結(jié)果不可預(yù)知;要排序的表格不能有嵌套表,否則排序出錯(cuò)。
?
?
本函數(shù)已在IE6.0 ,FireFox1.01中運(yùn)行通過。源代碼和例子代碼見后。
?
?
?
?
參考資料:
?
Danny Goodman with Michael Morrison?? JavaScript Bible 5th? ,John Wiley and Sons? 2004
?
David Flanagan? JavaScript The Definitive Guide 4th ,? O'Reilly? 2001
?
?
?
?
?
?附源代碼:要運(yùn)行例子,需要將javascript代碼保存到sorttable.js文件中,html部分代碼保存到同一目錄下另一文件中即可。
?
?
sorttable.js
?
?
?2??//
?3??//??在本機(jī)對(duì)瀏覽器頁(yè)面表格中的數(shù)據(jù)行進(jìn)行排序的javascript函數(shù)
?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??//比較函數(shù),用于Array.sort()排序時(shí)比較用。
13??//本函數(shù)比較數(shù)組元素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??//比較數(shù)組元素array1[indexCol]和元素array2[indexCol]的數(shù)值大小
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???}
?
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);
}
出處: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)
{
?// 錯(cuò)誤字符串
?this.ErrorStr ??= null;
?// 錯(cuò)誤事件驅(qū)動(dòng),當(dāng)發(fā)生錯(cuò)誤時(shí)觸發(fā)
?this.OnError ??= OnError;
?// 狀態(tài)事件驅(qū)動(dòng),當(dāng)狀態(tài)改變時(shí)觸發(fā)
?this.OnState ??= OnState;
?// 完成事件驅(qū)動(dòng),當(dāng)類操作完成時(shí)觸發(fā)
?this.OnDownloadEnd ?= OnDownloadEnd;
?// XMLHTTP 發(fā)送數(shù)據(jù)類型 GET 或 POST
?this.method??= "GET";
?// 將要獲取的URL地址
?this.URL??= null;
?// 指定同步或異步讀取方式(true 為異步,false 為同步)
?this.sync??= true;
?// 當(dāng)method 為 POST 時(shí) 所要發(fā)送的數(shù)據(jù)
?this.PostData??= null
?// 返回讀取完成后的數(shù)據(jù)
?this.RetData ??= null;
?// 創(chuàng)建XMLHTTP對(duì)像
?this.HttpObj ??= this.createXMLHttpRequest();
?if(this.HttpObj == null)
?{
??// 對(duì)像創(chuàng)建失敗時(shí)中止運(yùn)行
??return;
?}
?var Obj = this;
?// 調(diào)用事件檢測(cè)
?this.HttpObj.onreadystatechange = function()
?{
??Ajax.handleStateChange(Obj);
?}
}
// UTF 轉(zhuǎn)入 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);
}
// 創(chuàng)建XMLHTTP對(duì)像
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對(duì)象."
?if(this.OnError)
?{
??this.OnError(this.ErrorStr);
?}
??? ?return null;
}
// 發(fā)送HTTP請(qǐng)求
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 = "錯(cuò)誤的[method]命令."
???if(this.OnError)
???{
????this.OnError(this.ErrorStr);
???}
???return;
??}
??if (this.HttpObj.readyState == 4)
??{
???// 判斷對(duì)象狀態(tài)
??????????? ??if (this.HttpObj.status == 200)
??????????????? ?{
????this.RetData = this.UTFTOGB(this.HttpObj.responseBody);
????if(this.OnDownloadEnd)
????{
?????this.OnDownloadEnd(this.RetData);
????}
??????????????????????? ?return;
??????????????? ?}
???else
???{
????this.ErrorStr = "您所請(qǐng)求的頁(yè)面有異常."
????if(this.OnError)
????{
?????this.OnError(this.ErrorStr);
????}
????return;
???}
??}
?}
}
// 事件檢測(cè)
Ajax.handleStateChange = function(Obj)
{
?if(Obj.OnState)
?{
??Obj.OnState(Obj.HttpObj.readyState);
?}
?if (Obj.HttpObj.readyState == 4)
?{
??// 判斷對(duì)象狀態(tài)
??????????? ?if (Obj.HttpObj.status == 200)
??????????????? {
???Obj.RetData = Obj.UTFTOGB(Obj.HttpObj.responseBody);
???if(Obj.OnDownloadEnd)
???{
????Obj.OnDownloadEnd(Obj.RetData);
???}
??????????????????????? return;
??????????????? }
??else
??{
???Obj.ErrorStr = "您所請(qǐng)求的頁(yè)面有異常."
???if(Obj.OnError)
???{
????Obj.OnError(Obj.ErrorStr);
???}
???return;
??}
?}
}
// 錯(cuò)誤回調(diào)事件函數(shù)
function EventError(strValue)
{
?document.getElementById("Error").innerHTML = strValue;
}
// 狀態(tài)回調(diào)事件函數(shù)
function EventState(strValue)
{
?var strState = null;
?switch (strValue)
?{
?? ??case 0:
??strState = "未初始化...";
??break;
?? ??case 1:
??strState = "開始讀取數(shù)據(jù)...";
??break;
?? ??case 2:
??strState = "讀取數(shù)據(jù)...";
??break;
?? ??case 3:
??strState = "讀取數(shù)據(jù)中...";
??break;
?? ??case 4:
??strState = "讀取完成...";
??break;
?? ??default:
??strState = "未初始化...";
??break;
?}
?document.getElementById("State").innerHTML = strState;
}
// 完成回調(diào)事件函數(shù)
function EventDownloadEnd(strValue)
{
?document.getElementById("DownloadEnd").innerHTML = strValue;
}
// 初始化Ajax對(duì)像,引入事件回調(diào)函數(shù)
var A1 = new Ajax(EventError,EventState,EventDownloadEnd);
// 指定method數(shù)據(jù)發(fā)送類型
A1.method = "GET";
// 指定URL地址
A1.URL = "// 指定為異步處理
A1.sync = true;
//發(fā)送請(qǐng)求
A1.send();
//-->
</Script>?
作者:llinzzi 時(shí)間: 2006-03-16 文檔類型:原創(chuàng) 來(lái)自:藍(lán)色理想
|
![]() |
由于ajax在跨域的訪問上有問題,目前最好的方法是做代理.寫了個(gè)代理程序和心得. 為了做ajax的代理,研究了下服務(wù)器端的xmlhttp并和客戶端的ajax中的xmlhttp做了個(gè)比較,后臺(tái)代碼是asp的. 服務(wù)器端的xmlhttp也就是asp小偷程序,我把代碼改成了javascript. 1.在服務(wù)器端的xmlhttp.Open("GET",url,false)異步必須是關(guān)閉的,而客戶端的異步是打開的,這個(gè)很好理解. ajax的asp代理函數(shù)介紹: 服務(wù)器端代碼如下帶自動(dòng)判斷所有字符編碼,已測(cè)試 日語(yǔ) 韓語(yǔ) 繁體: <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
"http://www.w3.org/TR/html4/loose.dtd"> ? Server.ScriptTimeout=9999999; function bytesToBSTR(body,Cset){ %> |
一. Input和Output 1. stream代表的是任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源,或是任何有能力接收數(shù)據(jù)的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括兩種類型: 1.1 以字節(jié)為導(dǎo)向的stream 以字節(jié)為導(dǎo)向的stream,表示以字節(jié)為單位從stream中讀取或往stream中寫入信息。以字節(jié)為導(dǎo)向的stream包括下面幾種類型: 1) input stream: 1) ByteArrayInputStream:把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用 2) StringBufferInputStream:把一個(gè)String對(duì)象作為InputStream 3) FileInputStream:把一個(gè)文件作為InputStream,實(shí)現(xiàn)對(duì)文件的讀取操作 4) PipedInputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用 5) SequenceInputStream:把多個(gè)InputStream合并為一個(gè)InputStream 2) Out stream 1) ByteArrayOutputStream:把信息存入內(nèi)存中的一個(gè)緩沖區(qū)中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用 4) SequenceOutputStream:把多個(gè)OutStream合并為一個(gè)OutStream 1.2 以Unicode字符為導(dǎo)向的stream 以Unicode字符為導(dǎo)向的stream,表示以Unicode字符為單位從stream中讀取或往stream中寫入信息。以Unicode字符為導(dǎo)向的stream包括下面幾種類型: 1) Input Stream 1) CharArrayReader:與ByteArrayInputStream對(duì)應(yīng) 2) StringReader:與StringBufferInputStream對(duì)應(yīng) 3) FileReader:與FileInputStream對(duì)應(yīng) 4) PipedReader:與PipedInputStream對(duì)應(yīng) 2) Out Stream 1) CharArrayWrite:與ByteArrayOutputStream對(duì)應(yīng) 2) StringWrite:無(wú)與之對(duì)應(yīng)的以字節(jié)為導(dǎo)向的stream 3) FileWrite:與FileOutputStream對(duì)應(yīng) 4) PipedWrite:與PipedOutputStream對(duì)應(yīng) 以字符為導(dǎo)向的stream基本上對(duì)有與之相對(duì)應(yīng)的以字節(jié)為導(dǎo)向的stream。兩個(gè)對(duì)應(yīng)類實(shí)現(xiàn)的功能相同,字是在操作時(shí)的導(dǎo)向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用,所不同的是前者每次從內(nèi)存中讀取一個(gè)字節(jié)的信息,而后者每次從內(nèi)存中讀取一個(gè)字符。 1.3 兩種不現(xiàn)導(dǎo)向的stream之間的轉(zhuǎn)換 InputStreamReader和OutputStreamReader:把一個(gè)以字節(jié)為導(dǎo)向的stream轉(zhuǎn)換成一個(gè)以字符為導(dǎo)向的stream。 2. stream添加屬性 2.1 “為stream添加屬性”的作用 運(yùn)用上面介紹的Java中操作IO的API,我們就可完成我們想完成的任何操作了。但通過FilterInputStream和FilterOutStream的子類,我們可以為stream添加屬性。下面以一個(gè)例子來(lái)說(shuō)明這種功能的作用。 如果我們要往一個(gè)文件中寫入數(shù)據(jù),我們可以這樣操作: FileOutStream fs = new FileOutStream(“test.txt”); 然后就可以通過產(chǎn)生的fs對(duì)象調(diào)用write()函數(shù)來(lái)往test.txt文件中寫入數(shù)據(jù)了。但是,如果我們想實(shí)現(xiàn)“先把要寫入文件的數(shù)據(jù)先緩存到內(nèi)存中,再把緩存中的數(shù)據(jù)寫入文件中”的功能時(shí),上面的API就沒有一個(gè)能滿足我們的需求了。但是通過FilterInputStream和FilterOutStream的子類,為FileOutStream添加我們所需要的功能。 2.2 FilterInputStream的各種類型 2.2.1 用于封裝以字節(jié)為導(dǎo)向的InputStream 1) DataInputStream:從stream中讀取基本類型(int、char等)數(shù)據(jù)。 2) BufferedInputStream:使用緩沖區(qū) 3) LineNumberInputStream:會(huì)記錄input stream內(nèi)的行數(shù),然后可以調(diào)用getLineNumber()和setLineNumber(int) 4) PushbackInputStream:很少用到,一般用于編譯器開發(fā) 2.2.2 用于封裝以字符為導(dǎo)向的InputStream 1) 沒有與DataInputStream對(duì)應(yīng)的類。除非在要使用readLine()時(shí)改用BufferedReader,否則使用DataInputStream 2) BufferedReader:與BufferedInputStream對(duì)應(yīng) 3) LineNumberReader:與LineNumberInputStream對(duì)應(yīng) 4) PushBackReader:與PushbackInputStream對(duì)應(yīng) 2.3 FilterOutStream的各種類型 2.2.3 用于封裝以字節(jié)為導(dǎo)向的OutputStream 1) DataIOutStream:往stream中輸出基本類型(int、char等)數(shù)據(jù)。 2) BufferedOutStream:使用緩沖區(qū) 3) PrintStream:產(chǎn)生格式化輸出 2.2.4 用于封裝以字符為導(dǎo)向的OutputStream 1) BufferedWrite:與對(duì)應(yīng) 2) PrintWrite:與對(duì)應(yīng) 3. RandomAccessFile 1) 可通過RandomAccessFile對(duì)象完成對(duì)文件的讀寫操作 2) 在產(chǎn)生一個(gè)對(duì)象時(shí),可指明要打開的文件的性質(zhì):r,只讀;w,只寫;rw可讀寫 3) 可以直接跳到文件中指定的位置 4. I/O應(yīng)用的一個(gè)例子 import java.io.*; public class TestIO{ public static void main(String[] args) throws IOException{ //1.以行為單位從一個(gè)文件讀取數(shù)據(jù) 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. 從一個(gè)String對(duì)象中讀取數(shù)據(jù) StringReader in2 = new StringReader(s2); int c; while((c = in2.read()) != -1) System.out.println((char)c); in2.close(); //3. 從內(nèi)存取出格式化輸入 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. 數(shù)據(jù)的存儲(chǔ)和恢復(fù) 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(); } } 關(guān)于代碼的解釋(以區(qū)為單位): 1區(qū)中,當(dāng)讀取文件時(shí),先把文件內(nèi)容讀到緩存中,當(dāng)調(diào)用in.readLine()時(shí),再?gòu)木彺嬷幸宰址姆绞阶x取數(shù)據(jù)(以下簡(jiǎn)稱“緩存字節(jié)讀取方式”)。 1b區(qū)中,由于想以緩存字節(jié)讀取方式從標(biāo)準(zhǔn)IO(鍵盤)中讀取數(shù)據(jù),所以要先把標(biāo)準(zhǔn)IO(System.in)轉(zhuǎn)換成字符導(dǎo)向的stream,再進(jìn)行BufferedReader封裝。 2區(qū)中,要以字符的形式從一個(gè)String對(duì)象中讀取數(shù)據(jù),所以要產(chǎn)生一個(gè)StringReader類型的stream。 4區(qū)中,對(duì)String對(duì)象s2讀取數(shù)據(jù)時(shí),先把對(duì)象中的數(shù)據(jù)存入緩存中,再?gòu)木彌_中進(jìn)行讀取;對(duì)TestIO.out文件進(jìn)行操作時(shí),先把格式化后的信息輸出到緩存中,再把緩存中的信息輸出到文件中。 5區(qū)中,對(duì)Data.txt文件進(jìn)行輸出時(shí),是先把基本類型的數(shù)據(jù)輸出屋緩存中,再把緩存中的數(shù)據(jù)輸出到文件中;對(duì)文件進(jìn)行讀取操作時(shí),先把文件中的數(shù)據(jù)讀取到緩存中,再?gòu)木彺嬷幸曰绢愋偷男问竭M(jìn)行讀取。注意in5.readDouble()這一行。因?yàn)閷懭氲谝粋€(gè)writeDouble(),所以為了正確顯示。也要以基本類型的形式進(jìn)行讀取。 6區(qū)是通過RandomAccessFile類對(duì)文件進(jìn)行操作。 |
組織結(jié)構(gòu) 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.
SD?和 MM?模塊的業(yè)務(wù)集成:
1. 當(dāng)你創(chuàng)建銷售訂單(SO),所有的項(xiàng)目將從MM模塊拷貝物料主數(shù)據(jù).
2. MRP和可用性檢查也從MM模塊讀取相關(guān)數(shù)據(jù).
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模塊的業(yè)務(wù)集成 :-
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 與其他模塊的集成點(diǎn)列表
銷售訂單 –?
Integration Points????????????????????? Module
?Availability Check??????????????? -?????? MM
?Credit Check??????????????????????? -?????? FI
?Costing?????????????????????????????????-?????? CO/ MM
?Tax Determination????????????? -?????? FI
?Transfer of Requirements?-?????? PP/ MM
發(fā)貨和過賬 –?
Integration Points????????????????????? Module
?Availability Check???????? ?????? ?-?????? MM
?Credit Check????????????????????? ? ?-?????? FI
?Reduces stock??????????????????? ?-?????? MM
?Reduces Inventory $???????????-?????? FI/ CO
?Requirement Eliminated???-?????? PP/ MM
發(fā)票?-
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?
? 個(gè)人收集的業(yè)務(wù)重要函數(shù)
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
|
|
|
|
|
|
|
|
出庫(kù)單-》財(cái)務(wù)憑證
|
||||
WS_REVERSE_GOODS_ISSUE
|
Goods Mvmnts and Goods Mvments Reversals
|
V51W
|
|
RVV50L09
|
MB_CREATE_GOODS_MOVEMENT
|
為交貨的發(fā)貨
|
MBWL
|
|
|
MB_CANCEL_GOODS_MOVEMENT
|
為交貨的發(fā)貨
|
MBWL
|
|
|
訂單
/
出庫(kù)單-》發(fā)票
|
||||
RV_INVOICE_CREATE
|
出具發(fā)票(新建)
|
V60A??????????????????????
|
|
|
RV_INVOICE_DOCUMENT_ADD
|
(保存)其中 SLL_DOCUMENT_TRANSFER單元的調(diào)用可作發(fā)票出口
|
|
|
|
|
||||
|
||||
發(fā)票-》財(cái)務(wù)憑證
|
||||
RV_ACCOUNTING_DOCULIST_CREATE
|
|
V60B??????????????????????
|
RV-RF
接口
|
|
RV_ACCOUNTING_DOCUMENT_CREATE
|
發(fā)票-》憑證
|
V60B??????????????????????
|
RV-RF
接口
|
VF02
(過帳)
|
FI_PERIOD_CHECK
|
財(cái)務(wù)會(huì)計(jì)-》憑證-》過帳期間-》未清和關(guān)帳過帳期間(表t001b)
|
FACS
|
FI/CO
接口的
FI
服務(wù)
|
很多的檢查函數(shù)
|
sd_invoice_release_to_account
|
釋放發(fā)票-》憑證
調(diào)用 RV_INVOICE_DOCUMENT_ADD |
V60A????????????????????
|
RV-RF
接口
|
VFX3
|
RV_INVOICE_LIST_DOCUMENT_ADD
|
|
V60A
|
|
VF02
|
RV_INVOICE_DOCUMENT_ADD
|
根據(jù)
RFBFK
決定是否調(diào)用(
591
行)
RV_ACCOUNTING_DOCUMENT_CREATE
|
V60A
|
|
VF02
(保存)
|
|
|
|
|
|
|
||||
AC_DOCUMENT_CREATE
|
|
RWCL
|
會(huì)計(jì)合算接口
|
|
AC_DOCUMENT_REVERSE
|
|
RWCL
|
會(huì)計(jì)合算接口
|
|
|
|
|
|
|
|
||||
RV_MISSING_DOCUMENT_DATA
|
確定不完整的銷售憑證
|
VO5M
|
|
RVAUFERR
|
|
|
|
|
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
||||
NUMBER_CHECK
|
檢查號(hào)碼是否在號(hào)碼區(qū)間內(nèi)
|
|
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 |
型。舉個(gè)例,如果您已經(jīng)就所交付的貨物向買主開具了100元的發(fā)票,可是由于貨物質(zhì)量的瑕疵,
買主主張“貨接受但必須削價(jià)10元”,如果您接受了這個(gè)主張,那您就得開具10元的credit memo
(即實(shí)際業(yè)務(wù)中的所謂“紅字發(fā)票”)。總之,與原始invoice的價(jià)值相比,增價(jià)用debit memo,
降價(jià)用credit memo,兩者都是billing document type。
credit memo request 和debit memo request都是sales document type,其原理與一般的銷售訂
單類型并無(wú)質(zhì)的區(qū)別。只是,兩個(gè)memo request的下游transaction都是直接參照訂單創(chuàng)建
billing document,而不需要有delivery。
credit memo request --> credit memo, debit memo request --> debit memo,這就是它們的
流程。
1.????? 內(nèi)表的類型及定義:
( 1 ) .ANY TABLE :即任意表類型,此種定義方式只能在傳遞參數(shù)的時(shí)候定義。
?????
例如:
FORM XXX USING/CHANGING
( 2 ) .ANY TABLE 包括了兩種類型: INDEX TABLE 和 HASHED TABLE 。
?? 《 1 》 .INDEX TABLE :包括了 STANDARD TABLE 和 SORTED TABLE
A.????? STANDARD TABLE :其實(shí)就是一個(gè)線性表,通過 key 訪問內(nèi)表是線性查找的,也就是說(shuō),隨著表中記錄的增加,對(duì)表的操作的時(shí)間開銷也相應(yīng)的增加。
定義方法:
TYPES/DATA
:
B.????? SORTED TABLE: 顧名思義,表中的記錄是按照一定的順序排列的。訪問表的主要方式是表中定義的 key ,如果 key 不唯一,則選擇 index 最小的那個(gè)。也可以通過 index 來(lái)訪問排序表,如果你想通過 index 插入一條記錄,系統(tǒng)會(huì)自動(dòng)檢查你插入的位置是否正確。所以,如果插入的時(shí)間比插入到標(biāo)準(zhǔn)表的時(shí)間會(huì)長(zhǎng)。因此,盡量選擇 key 來(lái)對(duì)排序表進(jìn)行操作。
定義方法:
TYPES/DATA
:
《 2 》 .HASHED TABLE :對(duì)哈希表只能用你定義的 key 進(jìn)行操作,而不能使用 index 進(jìn)行操作。因此,定義哈希表必須定義 unique key 。注意:所有關(guān)于使用 index 操作表的語(yǔ)句都不能用于操作哈希表。例如: sort , loop 等。
????????
定義方法:
TYPES/DATA
:
2.????? 內(nèi)表的操作:
( 1 ) . 創(chuàng)建:
????? A. 定義一個(gè)結(jié)構(gòu),然后 type/like 這個(gè)結(jié)構(gòu)
???????? 例如:
TYPES: BEGIN OF
?????????...
?????????
?????????...
???????END OF
DATA
?????????????????WITH NON-UNIQUE DEFAULT KEY
???????????????? INITIAL SIZE
???????????????? WITH HEADER LINE.
????? B. type/like 系統(tǒng)表或者數(shù)據(jù)庫(kù)表或者結(jié)構(gòu)
DATA
???????????????? INITIAL SIZE
???????????????? WITH HEADER LINE.
( 2 ) . 添加數(shù)據(jù):
????? A . APPEND :直接向表中添加數(shù)據(jù)
1.
APPEND [wa TO|INITIAL LINE TO] itab[ASSIGNING
2. APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2.
3.
APPEND [wa TO] itab SORTED BY f [ASSIGNING
????? B .向表中插入數(shù)據(jù):
1.
INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX
idx] [ASSIGNING
2.
INSERT [wa INTO|INITIAL LINE INTO] TABLE itab
[ASSIGNING
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 ) . 刪除數(shù)據(jù):
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 ) . 修改數(shù)據(jù):
1.
MODIFY itab [FROM wa] [INDEX idx] [ASSIGNING
2.
MODIFY TABLE itab [FROM wa] [ASSIGNING
一,? 首先介紹一下 ABAP 的程序的類型:
Program type (程序類型)
|
Introductory statement (類型描述)
|
1
|
REPORT (報(bào)表)
|
M
|
PROGRAM (屏幕程序)
|
F
|
FUNCTION-POOL (函數(shù)組)
|
K
|
CLASS-POOL (類組)
|
J
|
CLASS-POOL (接口組)
|
T
|
TYPE-POOL (類型池)
|
二,? 下面介紹報(bào)表中用到的事件以及作用 :
1.????? LOAD-OF-PROGRAM :程序開始執(zhí)行時(shí)候自動(dòng)調(diào)用
這個(gè)事件在 SUBMIT , CALL TRANSACTION , PERFORM 等執(zhí)行的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用這個(gè)事件。所以無(wú)需聲明即可。
2.????? INITIALIZATION
( 1 ) . 只能用于報(bào)表程序
( 2 ) . 在選擇屏幕出現(xiàn)之前執(zhí)行,如果用邏輯數(shù)據(jù)庫(kù)的話,這個(gè)是唯一能夠修改選擇屏幕初始值的地方。
( 3 ) . 通常的用法是在這里給選擇屏幕中的字段賦值。
3.????? AT SELECTION-SCREEN
( 1 ) . 其實(shí)就像一個(gè) FORM ,所以在這個(gè)事件里聲明的變量都是局部變量。
( 2 ) . 根據(jù) SY-UCOMM 這個(gè)系統(tǒng)變量可以判斷用戶的命令
( 3 ) . 在這個(gè)事件里響應(yīng)的是屏幕上選擇條件中的事件,例如 CHECKBOX 的選擇與否, RADIOBUTTON 的選擇, LISTBOX 的選擇等等。所以分為以下幾個(gè)方面:
1. ... ON psel :在 PARAMETER 變化是觸發(fā)的事件
2. ... ON END OF sel : SELECT-OPTION 觸發(fā)的事件
3. ... ON VALUE-REQUEST FOR psel_low_high :選擇的幫助 (F4)
4. ... ON HELP-REQUEST FOR psel_low_high :選擇的幫助 (F1)
5. ... ON RADIOBUTTON GROUP radi :?jiǎn)芜x按鈕事件
6. ... ON BLOCK block :框架的觸發(fā)事件
7. ... OUTPUT :響應(yīng)屏幕上的事件,修改選擇屏幕的唯一方法
4.????? START-OF-SELECTION
報(bào)表程序必須執(zhí)行的事件,在進(jìn)入第二屏幕之前觸發(fā)。
5.????? GET
獲得邏輯數(shù)據(jù)庫(kù)的值。前提是必須首先聲明邏輯數(shù)據(jù)庫(kù)。
6.????? END-OF-SELECTION
第二屏幕顯示完畢,結(jié)束處理。
7.????? MODULE
這個(gè)是當(dāng)你調(diào)用自己定義的屏幕時(shí),響應(yīng)屏幕事件的方法。
8.????? ENDMODULE
9.????? CHECK
只對(duì)邏輯數(shù)據(jù)庫(kù)使用,檢查是否取得數(shù)據(jù)。
10.?? REJECT
同樣只對(duì)邏輯數(shù)據(jù)庫(kù)使用,退出。
11.?? STOP
結(jié)束一個(gè)處理塊。
12.?? RETURN
返回一個(gè)處理塊。
三,? 附加說(shuō)明:
1.????? SET PF-STATUS :
基本語(yǔ)法格式: SET PF-STATUS pfstat.
擴(kuò)展:
1. ... EXCLUDING f oder ... EXCLUDING itab
????? 這個(gè)是設(shè)置屏幕菜單,命令行等的命令,詳細(xì)地信息我會(huì)在后面關(guān)于菜單設(shè)計(jì)的時(shí)候說(shuō)明。
2.????? SET TITLEBAR :
設(shè)置屏幕標(biāo)題,在屏幕顯示之前調(diào)用。
1、在SE38環(huán)境下的程序名輸入欄輸入'DEMO*'后按F4,你可以查到SAP所有的DEMO示例程序,好好看看,你會(huì)學(xué)到很多ABAP功能的實(shí)現(xiàn)方法。
2、運(yùn)行“ABAPDOCU”T-cdoe,你可以看到ABAP DOCUMENT及示例程序。
3、想提高ALV的編程水平嗎?
在SE38環(huán)境下的程序名輸入欄輸入'BCALV*'后按F4,你可以查到很多ALV示例程序,慢慢看吧。

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
條件是:預(yù)先給業(yè)務(wù)伙伴設(shè)定價(jià)格清單 a ,里面有物料 a1 ,價(jià)格為 600 , a1 物料屬于 CPU 物料組。
1 、如果業(yè)務(wù)伙伴設(shè)定了特殊價(jià)格為 500 ,在做 a1 的銷售訂單時(shí),則銷售訂單中的價(jià)格會(huì)采用 500 。
2 、如果沒有為業(yè)務(wù)伙伴設(shè)定特殊價(jià)格,則系統(tǒng)會(huì)看是否有為業(yè)務(wù)伙伴設(shè)置折扣組,如果為此業(yè)務(wù)伙伴下面的 CPU 物料組設(shè)置了 10%, 則銷售訂單中的價(jià)格為 600× ( 1 - 10%)=540 。
3 、如果以上都沒有為業(yè)務(wù)伙伴設(shè)置特殊價(jià)格及折扣組,則系統(tǒng)再會(huì)判斷業(yè)務(wù)伙伴預(yù)先設(shè)定的價(jià)格清單有無(wú)做清單擴(kuò)展,比如價(jià)格清單 a 中的物料 a1 在國(guó)慶期間打 8 折,則銷售訂單中的價(jià)格為 600×0.8=480 。
4 、如果以上都未設(shè)置,則系統(tǒng)會(huì)直接采用預(yù)先給業(yè)務(wù)伙伴設(shè)定的價(jià)格清單 a 中 a1 物料的價(jià)格 600 。
|
|
成品進(jìn)倉(cāng)管理流程 :
1、倉(cāng)庫(kù)根據(jù)已審核《采購(gòu)訂單》內(nèi)容準(zhǔn)備成品收貨。
?2、廠家送貨到達(dá)后,廠家提供《送貨清單》給收貨倉(cāng)管員,《送貨清單》應(yīng)清晰顯示送貨單位名稱、送貨單位印章或經(jīng)手人簽名、貨品的名稱、規(guī)格、數(shù)量、采購(gòu)訂單號(hào)。收貨倉(cāng)管員將《送貨清單》和對(duì)應(yīng)的《采購(gòu)訂單》相核對(duì)。相核不符者拒收。相符者倉(cāng)管員以《送貨清單》和《采購(gòu)訂單》驗(yàn)收貨品,收貨量大于定購(gòu)量時(shí),倉(cāng)庫(kù)主管要通過營(yíng)銷部同意和取得營(yíng)銷部有權(quán)人的書面通知后才能超量收貨。
?3、倉(cāng)管員收貨無(wú)誤后,在《送貨清單》上簽收,并加蓋收貨專用章,一聯(lián)自留,一聯(lián)交對(duì)方。
?4、倉(cāng)管員在電腦上開具《采購(gòu)單》,并由倉(cāng)庫(kù)主管審核生效。將《采購(gòu)單》打印一式三聯(lián),經(jīng)倉(cāng)庫(kù)主管和倉(cāng)管員簽字加蓋收貨專用章后,第一聯(lián)存根自留,第二聯(lián)財(cái)務(wù)聯(lián)連同送貨單位的《送貨清單》交財(cái)務(wù),第三聯(lián)對(duì)方聯(lián)同時(shí)交財(cái)務(wù)。
5、返修品回倉(cāng),以對(duì)應(yīng)的《采購(gòu)?fù)素泦巍窞橐罁?jù)收貨,倉(cāng)管員核實(shí)貨單無(wú)誤后在電腦上開具《采購(gòu)?fù)朔祮巍罚⒚髟恫少?gòu)?fù)素泦巍诽?hào),并經(jīng)倉(cāng)庫(kù)主管審核生效。
?成品出倉(cāng)管理流程:
?1、倉(cāng)庫(kù)主管根據(jù)營(yíng)銷部傳來(lái)的《銷售訂單》備貨并作好記載,將配好之貨品清單交質(zhì)檢部驗(yàn)貨。質(zhì)檢部將合格成品裝箱并在電腦上填制《裝箱單》,審核裝箱單。在每個(gè)包裝箱內(nèi)放置一張裝箱單。包裝好的成品分類放到相應(yīng)的倉(cāng)庫(kù)存放區(qū)域。
?2、質(zhì)檢部將《裝箱單》匯總導(dǎo)出為未審核《銷售單》,等待營(yíng)銷部總監(jiān)審核發(fā)貨。
?3、倉(cāng)管員根據(jù)客戶持有的已蓋章《銷售單》和電腦里對(duì)應(yīng)的《出倉(cāng)單》(對(duì)于批發(fā)商)或《轉(zhuǎn)倉(cāng)單》(對(duì)于加盟商)發(fā)貨。打印《出倉(cāng)單》或《轉(zhuǎn)倉(cāng)單》一式二份,由倉(cāng)管員、倉(cāng)庫(kù)主管和客戶簽字,一份交客戶,一份倉(cāng)庫(kù)自留。
4、 營(yíng)銷部業(yè)務(wù)流程 :
1、營(yíng)銷部將客戶傳真來(lái)的《銷售訂單》輸入電腦,并由營(yíng)銷部總監(jiān)審核。查詢當(dāng)前倉(cāng)庫(kù)庫(kù)存情況。若需要向廠家訂貨的,將《銷售訂單》導(dǎo)出為《采購(gòu)訂單》并審核。若倉(cāng)庫(kù)有貨不需要向廠家訂貨,就將《銷售訂單》傳給倉(cāng)庫(kù),由倉(cāng)庫(kù)撿貨裝箱。
?2、收到倉(cāng)庫(kù)傳來(lái)的未審核《銷售單》后(由《裝箱單》匯總而成),由營(yíng)銷部總監(jiān)確認(rèn)客戶貨款余額的狀況。若客戶有足夠的貨款余額,則審核此《銷售單》(已審核《銷售單》會(huì)自動(dòng)生成《出倉(cāng)單》(對(duì)于批發(fā)客戶)或《轉(zhuǎn)倉(cāng)單》(對(duì)于加盟商)傳給倉(cāng)庫(kù),倉(cāng)庫(kù)憑此《出倉(cāng)單》或《轉(zhuǎn)倉(cāng)單》發(fā)貨。)。若客戶貨款余額不足,則等待客戶貨款到帳后再審核《銷售單》。
?3、已審核《銷售單》打印一式三聯(lián),并簽名蓋章。第一聯(lián)存根自留,第二聯(lián)財(cái)務(wù)聯(lián)交財(cái)務(wù),第三聯(lián)對(duì)方聯(lián)交客戶。
?4、營(yíng)銷部分析加盟商及其專賣店的庫(kù)存狀況,并向加盟商提出補(bǔ)貨、調(diào)撥等建議。
?5、分析分公司和自營(yíng)專賣店的庫(kù)存和銷售情況,若需要補(bǔ)貨,則開具《轉(zhuǎn)倉(cāng)單》,將總公司倉(cāng)庫(kù)的貨品調(diào)撥到分公司和專賣店。若需要在分公司或?qū)Yu店之間調(diào)撥貨品,開具《調(diào)撥單》。營(yíng)銷部總監(jiān)審核《調(diào)撥單》。經(jīng)審核后的《調(diào)撥單》自動(dòng)生成一張《進(jìn)倉(cāng)單》和一張《出倉(cāng)單》并傳給相關(guān)倉(cāng)庫(kù)。由相關(guān)倉(cāng)庫(kù)收貨、發(fā)貨。
?6、營(yíng)銷部審核分公司和專賣店傳回的銷售單,沖減相應(yīng)的庫(kù)存和增加應(yīng)收款。
?7、營(yíng)銷部審核加盟商傳回的銷售《出倉(cāng)單》,沖減加盟商庫(kù)存。
?8、營(yíng)銷部審核分公司和加盟商傳回的《轉(zhuǎn)倉(cāng)單》,調(diào)整分公司和加盟商的倉(cāng)庫(kù)庫(kù)存。
?9、營(yíng)銷部審核分公司和加盟商傳回的《盤點(diǎn)單》,調(diào)整分公司和加盟商的倉(cāng)庫(kù)庫(kù)存。
10、營(yíng)銷部將貨品資料傳給各個(gè)分公司和加盟商。
?倉(cāng)庫(kù)盤點(diǎn)流程:
?1、盤點(diǎn)準(zhǔn)備 倉(cāng)庫(kù)主管將還未有自編碼的存貨通知支援中心補(bǔ)編編碼,并通知有關(guān)部門填制相關(guān)單據(jù)處理帳外物資。 營(yíng)銷部、鞋業(yè)部和服裝部通知廠家和客戶在盤點(diǎn)日期間停止送收貨品。 財(cái)務(wù)部將盤點(diǎn)日前已經(jīng)審核生效的單據(jù)記帳。 倉(cāng)庫(kù)主管組織倉(cāng)庫(kù)人員對(duì)貨品進(jìn)行分區(qū)擺放,存貨以成品區(qū)、輔料區(qū)、成品待檢區(qū)、次品區(qū)、臺(tái)面輔料區(qū)、樣板鞋區(qū)分成六大區(qū)域分別得出存貨實(shí)存情況。
?2、盤點(diǎn)進(jìn)行 倉(cāng)庫(kù)主管組織倉(cāng)庫(kù)人員初盤存貨,對(duì)存貨六大區(qū)域各指派1人擔(dān)任組長(zhǎng),2人配合。以盤點(diǎn)表記錄初盤結(jié)果。倉(cāng)庫(kù)主管連同另外4名員工組成復(fù)盤小組,對(duì)初盤結(jié)果進(jìn)行復(fù)盤,出現(xiàn)差異倉(cāng)庫(kù)自查原因。 倉(cāng)庫(kù)主管將初盤數(shù)據(jù)輸入電腦,將《盤點(diǎn)單》打印提供給財(cái)務(wù)部,財(cái)務(wù)部組織公司人員組成抽盤小組,以2人為1組對(duì)各大區(qū)域進(jìn)行抽盤工作。抽盤人員從實(shí)物中抽取20%復(fù)核初盤資料,從初盤資料中抽取30%對(duì)實(shí)物進(jìn)行抽盤。抽盤量要求占總庫(kù)存的50%。發(fā)現(xiàn)差異由倉(cāng)庫(kù)主管重新盤點(diǎn)更正初盤資料。差錯(cuò)率高于1%,倉(cāng)庫(kù)主管對(duì)該區(qū)域貨品進(jìn)行重新全盤。經(jīng)復(fù)盤通過的《盤點(diǎn)單》由財(cái)務(wù)部審核,并打印一式二份,由倉(cāng)庫(kù)主管、財(cái)務(wù)主管簽字,各持1份。
?3、盤點(diǎn)后期工作 倉(cāng)庫(kù)主管將已審核《盤點(diǎn)單》導(dǎo)出為進(jìn)、出倉(cāng)單,電腦自動(dòng)生成《盤盈單》和《盤虧單》。倉(cāng)庫(kù)主管查找盤盈盤虧的原因,并將《庫(kù)存盤點(diǎn)匯總表》和差異原因查找報(bào)告交財(cái)務(wù)主管復(fù)核上交總經(jīng)理審批后。財(cái)務(wù)部據(jù)審批結(jié)果審核《盤盈單》和《盤虧單》調(diào)整庫(kù)存帳。
4、盤點(diǎn)其他規(guī)定 盤點(diǎn)工作規(guī)定每月進(jìn)行一次,時(shí)間為月末最后2天。頭天晚上8時(shí)開始至次日中午完成初盤和復(fù)盤工作,下午進(jìn)行抽盤工作。 參加盤點(diǎn)工作的人員必須認(rèn)真負(fù)責(zé),貨品磅碼、單位必須規(guī)范統(tǒng)一;名稱、貨號(hào)、規(guī)格必須明確;數(shù)量一定是實(shí)物數(shù)量,真實(shí)準(zhǔn)確;絕對(duì)不允許重盤和漏盤。由于人為過失造成盤點(diǎn)數(shù)據(jù)不真實(shí),責(zé)任人要負(fù)過失責(zé)任。 對(duì)于盤點(diǎn)結(jié)果發(fā)現(xiàn)屬于實(shí)物責(zé)任人不按貨品要求收發(fā)及保管財(cái)物造成損失,實(shí)物責(zé)任人要承擔(dān)經(jīng)濟(jì)賠償責(zé)任。