版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Page15/22作業(yè)需求:編寫FI模塊應(yīng)收應(yīng)付的報表目錄:1. 作業(yè)目的和安排 12. 作業(yè)簡單需求 13. 作業(yè)要求 24. 作業(yè)過程 25. 時間統(tǒng)計 136.知識和經(jīng)驗總結(jié) 146.1 14作業(yè)目的和安排本作業(yè)的目的是:為了進(jìn)一步熟悉ABAP的編程技巧;更主要的目標(biāo)的:熟悉sapfi模塊的應(yīng)收和應(yīng)付業(yè)務(wù)場景;熟悉相關(guān)的表;作業(yè)簡單需求開發(fā)一個FI模塊的報表:輸入的條件是:供應(yīng)商(但是可以多選),公司代碼(必輸)賬齡計算日:報表輸出字段包括:公司代碼、供應(yīng)商(客戶),年度銷售總額、應(yīng)付(收)賬款總額、<0天金額1-30天,31-60天,61-90天,91-150天,150天以上數(shù)據(jù)結(jié)果需要和這個表進(jìn)行比對。作業(yè)要求時間要求:郭裕的要求2天左右開發(fā)完成報表;一般的項目要求給予4天左右。最低要求作業(yè)過程充分分析需求;對于復(fù)雜程序在編寫之前要畫流程圖;為了方便和加深對要編寫程序的理解,我們一般:步驟一:編寫字段來源輸入的條件是:公司代碼(必輸),供應(yīng)商(但是可以多選),賬齡計算日(默認(rèn)今天)報表輸出字段包括:公司代碼、供應(yīng)商,年度采購總額、應(yīng)付賬款總額、<=0天金額,1-30天,31-60天,61-90天,91-150天,150天以上需要的表字段:(具體見步驟2)BSIK(會計核算:供應(yīng)商的第二次索引(未結(jié)算項目)):公司代碼(bukrs),供應(yīng)商(lifnr),清帳日期(AUGDT)用于到期日計算的基準(zhǔn)日期(ZFBDT)BSAK(會計核算:供應(yīng)商的第二個索引(已結(jié)算項目)):公司代碼(bukrs),供應(yīng)商(lifnr),清帳日期(AUGDT)用于到期日計算的基準(zhǔn)日期(ZFBDT)要知道年度采購總額,必須知道年度已付賬款總額+年度應(yīng)付賬款總額,采購成立與否,是由收到發(fā)票與否來判斷的。每張發(fā)票都對應(yīng)一個會計憑證,此憑證分別在bsik和bsak中都可找到。經(jīng)se16n檢查,bsik中清算單據(jù)的單據(jù)號碼(AUGBL)全部為空,bsak中清算單據(jù)的單據(jù)號碼(AUGBL)全部不為空。這個字段表示對會計憑證編號(BELNR)的清算單據(jù)號,blart代表憑證類型。例子:用f-53實驗了2筆清帳憑證,2筆都是完全清帳了1個會計憑證,部分清帳了1個會計憑證。第1筆清帳憑證號是1500000005,我填的開始總清帳金額為1234元,完全清帳了5100000673的696元,部分清帳了1500000005的538元,一共就是1234元。第2筆清帳憑證號為1500000006,開始清帳總金額為2345元,完全清帳了5100000004的367.72元,部分清帳了1500000006的1977.28元,共2345元。在se11中查看bsak,可以分別看到2筆清帳憑證已經(jīng)完成的清帳,注意SHKZG是借貸標(biāo)記,DMBTR(按本位幣計的金額)和WRBTR(憑證貨幣金額),同樣在se11中查看bsik,可以分別看到2筆清帳憑證部分完成的清帳:年度采購總額可以通過發(fā)票金額總額來判斷,也就是bsik和bsak中憑證類型為RE的。應(yīng)付賬款總額,即bsik中所有憑證金額之和(正負(fù)沖銷,原因見下面)。上圖其實是已清的,為何在未清中呢?這很令人混淆,其實答案很簡單,它是正值!寫到那里就是為了沖銷用的,所有應(yīng)付的實質(zhì)是欠款,因此顯示都是負(fù)值,因此,它們還是顯示原來的值(負(fù)值),不管沖銷多少,只要沒沖銷完,就顯示原來的,比如下圖:已經(jīng)被沖銷了很多次了,可是沒有完,所以值不變。正負(fù)沖銷的判斷是借方或貸方科目,在字段借貸標(biāo)識(SHKZG)中。步驟二:畫數(shù)據(jù)來源表的邏輯關(guān)系本次表關(guān)系比較簡單,難在1.業(yè)務(wù)的理解和數(shù)據(jù)的尋找2.程序的統(tǒng)計功能上。還在艱難摸索中。步驟三:具體完整程序流程
"在bsik中累加得到發(fā)票總金額
select
bukrs
lifnr
sum(
dmbtr
)
into
table
git_bsik_sum
from
bsik
where
bukrs
=
s_bukrs
and
lifnr
in
s_lifnr
and
blart
=
'RE'
group
by
bukrs
lifnr.
"在bsak中累加得到發(fā)票總金額
select
bukrs
lifnr
sum(
dmbtr
)
into
table
git_bsak_sum
from
bsak
where
bukrs
=
s_bukrs
and
lifnr
in
s_lifnr
and
blart
=
'RE'
group
by
bukrs
lifnr.
"合并未結(jié)算發(fā)票總額表git_bsik_sum與已結(jié)算發(fā)票總額表git_bsak_sum,結(jié)果
"得到銷售總額表git_sum
git_sum[]
=
git_bsak_sum[].
"sort
git_sum
by
lifnr.
loop
at
git_bsik_sum.
loop
at
git_bsak_sum.
first_index
=
SY-TABIX.
check
=
0.
if
git_bsik_sum-lifnr
=
git_bsak_sum-lifnr.
clear
wa_sum.
wa_sum-bukrs
=
git_bsak_sum-bukrs.
wa_sum-lifnr
=
git_bsak_sum-lifnr.
wa_sum-dmbtr_sum
=
git_bsik_sum-dmbtr_sum
+
git_bsak_sum-dmbtr_sum.
modify
git_sum
from
wa_sum
index
first_index.
check
=
1.
exit.
endif.
endloop.
if
check
=
0.
clear
wa_sum.
wa_sum-bukrs
=
git_bsik_sum-bukrs.
wa_sum-lifnr
=
git_bsik_sum-lifnr.
wa_sum-dmbtr_sum
=
git_bsik_sum-dmbtr_sum.
append
wa_sum
to
git_sum.
endif.
endloop.
"對銷售總額表按公司與供應(yīng)商進(jìn)行排序
sort
git_sum
by
bukrs
lifnr.
"程序設(shè)計中的檢查功能
*
write:/
'銷售總額表git_sum'.
*
write:/
'#############################################'.
*
loop
at
git_sum.
*
write:
/
git_sum-bukrs,
git_sum-lifnr,
git_sum-dmbtr_sum.
*
endloop.
"在bsik中以公司供應(yīng)商與借貸標(biāo)識累加得到應(yīng)付賬款總額的分別借貸方
"得到處理前的應(yīng)付賬款總額表
select
bukrs
lifnr
SHKZG
sum(
dmbtr
)
into
table
git_bsik_yfze
from
bsik
where
bukrs
=
s_bukrs
and
lifnr
in
s_lifnr
group
by
bukrs
lifnr
shkzg.
(難點)計算應(yīng)付賬款總額:思路:設(shè)置check為s,開始循環(huán),done=0,檢查是否H,是上體是否h(由check判斷),1.是則上體寫入git,本體寫入wa,check設(shè)為h;2.否則本體寫入wa,check設(shè)為h。否本體減額寫入wa,寫入git,done=1,check設(shè)為s。判斷是否到了表尾,是則判斷done是否為0,是則本體寫入git,最后一次清空wa。
"對此處理前應(yīng)付總額表分別借貸方進(jìn)行升序排序,'S'在前,'H'在后
sort
git_bsik_yfze
by
bukrs
lifnr
SHKZG.
*
loop
at
git_bsik_yfze.
"程序設(shè)計中的檢查功能
*
write:
/
git_bsik_yfze-bukrs,
git_bsik_yfze-lifnr,
git_bsik_yfze-SHKZG,
git_bsik_yfze-dmbtr_sum.
*
endloop.
"得到合并借貸方后的處理后應(yīng)付賬款總額表git_bsik_yfzep
p代表process”已經(jīng)處理過的“
clear
git_bsik_yfzep[].
check_p
=
's'.
loop
at
git_bsik_yfze.
if
git_bsik_yfze-SHKZG
=
'H'.
if
check_p
=
'h'.
append
wa_bsik_yfzep
to
git_bsik_yfzep.
clear
wa_bsik_yfzep.
wa_bsik_yfzep-bukrs
=
git_bsik_yfze-bukrs.
wa_bsik_yfzep-lifnr
=
git_bsik_yfze-lifnr.
wa_bsik_yfzep-dmbtr_sum
=
git_bsik_yfze-dmbtr_sum.
check_p
=
'h'.
else.
clear
wa_bsik_yfzep.
wa_bsik_yfzep-bukrs
=
git_bsik_yfze-bukrs.
wa_bsik_yfzep-lifnr
=
git_bsik_yfze-lifnr.
wa_bsik_yfzep-dmbtr_sum
=
git_bsik_yfze-dmbtr_sum.
check_p
=
'h'.
endif.
else.
wa_bsik_yfzep-bukrs
=
git_bsik_yfze-bukrs.
wa_bsik_yfzep-lifnr
=
git_bsik_yfze-lifnr.
wa_bsik_yfzep-dmbtr_sum
=
wa_bsik_yfzep-dmbtr_sum
-
git_bsik_yfze-dmbtr_sum.
if
wa_bsik_yfzep-dmbtr_sum
<>
0.
append
wa_bsik_yfzep
to
git_bsik_yfzep.
endif.
check_p
=
's'.
"initial_yingfu
=
initial_yingfu
+
git_bsik_yfze-dmbtr.
endif.
endloop.
"對處理后應(yīng)付賬款總額表進(jìn)行排序
sort
git_bsik_yfzep
by
bukrs
lifnr.
*
write:/
'處理后應(yīng)付賬款總額表git_bsik_yfzep'.
*
write:/
'#############################################'.
*
loop
at
git_bsik_yfzep.
"程序設(shè)計中的檢查功能
*
write:
/
git_bsik_yfzep-bukrs,
git_bsik_yfzep-lifnr,
git_bsik_yfzep-dmbtr_sum.
*
endloop.
(難點)合并年度采購總額和應(yīng)付賬款總額表:思路:Loop年度采購總額表,在應(yīng)付賬款總額表中找公司號與供應(yīng)商號相同記錄,找到則將應(yīng)付賬款總額加入,否則為0。寫入git。Loop應(yīng)付賬款總額表,在年度采購總額表中找公司號與供應(yīng)商號不同記錄(因為上一步已經(jīng)找了相同記錄),如果是則將采購總額加入,否則為0。寫入git。
"合并銷售總額表git_sum與應(yīng)付賬款總額表git_bsik_yfzep
第一步
refresh
git_sumyfzep[].
loop
at
git_sum.
read
table
git_bsik_yfzep
with
key
bukrs
=
git_sum-bukrs
lifnr
=
git_sum-lifnr
binary
search.
if
sy-subrc
=
0.
clear
wa_sumyfzep.
wa_sumyfzep-bukrs
=
git_sum-bukrs.
wa_sumyfzep-lifnr
=
git_sum-lifnr.
wa_sumyfzep-dmbtr_gsum
=
git_sum-dmbtr_sum.
wa_sumyfzep-dmbtr_yfzep
=
git_bsik_yfzep-dmbtr_sum.
append
wa_sumyfzep
to
git_sumyfzep.
else.
clear
wa_sumyfzep.
wa_sumyfzep-bukrs
=
git_sum-bukrs.
wa_sumyfzep-lifnr
=
git_sum-lifnr.
wa_sumyfzep-dmbtr_gsum
=
git_sum-dmbtr_sum.
wa_sumyfzep-dmbtr_yfzep
=
0.
append
wa_sumyfzep
to
git_sumyfzep.
endif.
endloop.
"sort
git_sum
by
bukrs
lifnr.
前面已經(jīng)sort過了,且沒有改動表
"合并銷售總額表git_sum與應(yīng)付賬款總額表git_bsik_yfzep
第二步
loop
at
git_bsik_yfzep.
read
table
git_sum
with
key
bukrs
=
git_bsik_yfzep-bukrs
lifnr
=
git_bsik_yfzep-lifnr
binary
search.
if
sy-subrc
<>
0.
clear
wa_sumyfzep.
wa_sumyfzep-bukrs
=
git_bsik_yfzep-bukrs.
wa_sumyfzep-lifnr
=
git_bsik_yfzep-lifnr.
wa_sumyfzep-dmbtr_gsum
=
0.
wa_sumyfzep-dmbtr_yfzep
=
git_bsik_yfzep-dmbtr_sum.
append
wa_sumyfzep
to
git_sumyfzep.
endif.
endloop.
"將得到的銷售總額與應(yīng)付賬款總額表git_sumyfzep排序
sort
git_sumyfzep
by
bukrs
lifnr.
"程序設(shè)計中的檢查功能
*
write:/
'銷售總額與應(yīng)付賬款總額表git_sumyfzep'.
*
write:/
'#############################################'.
*
loop
at
git_sumyfzep.
*
write:
/
git_sumyfzep-bukrs,
git_sumyfzep-lifnr,
git_sumyfzep-dmbtr_gsum,
git_sumyfzep-dmbtr_yfzep.
*
endloop.
"內(nèi)表無法inner
join
*
select
*
a~bukrs
*
a~lifnr
*
a~dmbtr_sum
*
b~dmbtr_sum
*
into
table
git_sumyfzep
*
from
git_sum
as
a
left
join
git_bsik_yfzep
as
b
*
on
a~bukrs
=
b~bukrs
*
and
a~lifnr
=
b~lifnr.
*
loop
at
git_bsik_yfze.
"程序設(shè)計中的檢查功能
*
write:
/
git_bsik_yfze-bukrs,
git_bsik_yfze-lifnr,
git_bsik_yfze-SHKZG,
git_bsik_yfze-dmbtr_sum.
*
endloop.(難點)統(tǒng)計不同時間段的應(yīng)付賬款總額:Loopgit_bsik表,-1.賦值tmax_git_bsik=SY-TMAXL。0.如果為借方,則直接重新循環(huán)。(原因見4)如果SY-TABIX=1,記錄此供應(yīng)商號入wa,readme=1,check=0,然后進(jìn)入2;否則與上一供應(yīng)商號比,相等且check=0則重新循環(huán)。若不等且check=0則記錄此供應(yīng)商號入wa,readme=1,進(jìn)入下一步。若相等且check=1,進(jìn)入下一步。若不等且check=1,則通過wa直接根據(jù)tabix_sumyfzep來modifygit_sumyfzep表,清空wa,記錄供應(yīng)商號入wa,check=0,readme=1,進(jìn)入下一步。如果readme=0,直接進(jìn)入3;如果readme=1,讀表git_sumyfzep看有無記錄的供應(yīng)商號且應(yīng)付總額不為0,無則check=0,重新循環(huán)。有則check=1,readme=0,并記錄讀此表的sy-tabix(tabix_sumyfzep=sy-tabix)進(jìn)入下一步。判斷是否為貸方(原因見4),是則按賬齡計算日與付款基準(zhǔn)日ZFBDT對比,歸類于不同時間段來累加金額,重新循環(huán)。判斷是否到達(dá)表尾(此為最后一條記錄),也就是最外層sy-tabix是否等于tmax_git_bsik,是則通過wa直接根據(jù)tabix_sumyfzep來modifygit_sumyfzep表,最后一次清空wa,跳出。由于業(yè)務(wù)理解阻礙,程序無法完美實現(xiàn),因此只能做出半成品,可以知道應(yīng)付賬款各二階匯總原始總額(貸方數(shù)據(jù)),而無法知道其現(xiàn)實總額(被借方?jīng)_銷后剩余的貸方數(shù)據(jù))
"按公司與供應(yīng)商把所有借貸方金額與付款基準(zhǔn)日期選出,以備二階匯總
select
bukrs
lifnr
SHKZG
dmbtr
ZFBDT
into
corresponding
fields
of
table
git_bsik
from
bsik
where
bukrs
=
s_bukrs
and
lifnr
in
s_lifnr.
"將二階匯總備用表git_bsik按公司與供應(yīng)商排序
sort
git_bsik
by
bukrs
lifnr.
"將二階匯總應(yīng)付數(shù)據(jù)寫入銷售與應(yīng)付總額表,得到最終git_sumyfzep表
clear
wa_sumyfzep.
"重要?。?!我很容易就搞忘了
loop
at
git_bsik.
if
git_bsik-shkzg
=
'S'.
continue.
endif.
if
sy-tabix
=
1.
wa_sumyfzep-bukrs
=
git_bsik-bukrs.
wa_sumyfzep-lifnr
=
git_bsik-lifnr.
readme
=
1.
check
=
0.
else.
if
(
git_bsik-lifnr
=
wa_sumyfzep-lifnr
and
check
=
0
).
continue.
endif.
if
(
git_bsik-lifnr
<>
wa_sumyfzep-lifnr
and
check
=
0
).
wa_sumyfzep-bukrs
=
git_bsik-bukrs.
wa_sumyfzep-lifnr
=
git_bsik-lifnr.
readme
=
1.
endif.
if
(
git_bsik-lifnr
=
wa_sumyfzep-lifnr
and
check
=
1
).
"直接往下走
endif.
if
(
git_bsik-lifnr
<>
wa_sumyfzep-lifnr
and
check
=
1
).
modify
git_sumyfzep
from
wa_sumyfzep
index
tabix_sumyfzep.
clear
wa_sumyfzep.
wa_sumyfzep-bukrs
=
git_bsik-bukrs.
wa_sumyfzep-lifnr
=
git_bsik-lifnr.
check
=
0.
readme
=
1.
endif.
endif.
if
readme
=
0.
"直接往下走
endif.
if
readme
=
1.
"看此公司供應(yīng)商是否有應(yīng)付賬款,有的話肯定在git_sumyfzep中有記錄
read
table
git_sumyfzep
with
key
lifnr
=
wa_sumyfzep-lifnr
binary
search.
if
sy-subrc
<>
0.
continue.
else.
if
git_sumyfzep-dmbtr_yfzep
=
0.
continue.
endif.
endif.
check
=
1.
readme
=
0.
tabix_sumyfzep
=
sy-tabix.
wa_sumyfzep-dmbtr_gsum
=
git_sumyfzep-dmbtr_gsum.
wa_sumyfzep-dmbtr_yfzep
=
git_sumyfzep-dmbtr_yfzep.
endif.
if
git_bsik-shkzg
=
'H'.
if
s_budat
<=
git_bsik-ZFBDT.
wa_sumyfzep-sum_0
=
wa_sumyfzep-sum_0
+
git_bsik-dmbtr.
continue.
endif.
pay_day
=
s_budat
-
git_bsik-ZFBDT.
if
pay_day
<=
30.
wa_sumyfzep-sum_30
=
wa_sumyfzep-sum_30
+
git_bsik-dmbtr.
continue.
endif.
if
pay_day
<=
60.
wa_sumyfzep-sum_60
=
wa_sumyfzep-sum_60
+
git_bsik-dmbtr.
continue.
endif.
if
pay_day
<=
90.
wa_sumyfzep-sum_90
=
wa_sumyfzep-sum_90
+
git_bsik-dmbtr.
continue.
endif.
if
pay_day
<=
150.
wa_sumyfzep-sum_150
=
wa_sumyfzep-sum_150
+
git_bsik-dmbtr.
continue.
endif.
if
pay_day
>
150.
wa_sumyfzep-sum_end
=
wa_sumyfzep-sum_end
+
git_bsik-dmbtr.
continue.
endif.
endif.
endloop.
"將得到的銷售總額與應(yīng)付賬款總額表加二階匯總最終表git_sumyfzep排序
sort
git_sumyfzep
by
bukrs
lifnr.運(yùn)行結(jié)果:(總表–包含采購總額,所有應(yīng)付賬款總額,以及按不同日期統(tǒng)計的應(yīng)付賬款總額)調(diào)用外部程序顯示明細(xì):
if
R_UCOMM
=
'&IC1'.
"message
'a'
type
'I'.
FIELD-SYMBOLS
<LINE>
LIKE
LINE
OF
git_sumyfzep.
"GIT_RESULT代表
ALV顯示的內(nèi)表數(shù)據(jù)
IF
RS_SELFIELD-SEL_TAB_FIELD
=
'1-LIFNR'.
"點擊的ALV的列名,要加“1-”前綴
READ
TABLE
git_sumyfzep
INDEX
RS_SELFIELD-TABINDEX
ASSIGNING
<LINE>.
*
wa_sumyfzep-bukrs
=
git_sumyfzep-bukrs
.
"檢查是否定位git_sumyfzep表,答案為否。
*
wa_sumyfzep-lifnr
=
git_sumyfzep-lifnr
.
IF
SY-SUBRC
=
0.
CLEAR
RSPAR_LINE.
RSPAR_LINE-SELNAME
=
'S_BUKRSA'.
RSPAR_LINE-KIND
=
'P'.
RSPAR_LINE-SIGN
=
'I'.
RSPAR_LINE-OPTION
=
'EQ'.
*
RSPAR_LINE-LOW
=
S_BUKRS-LOW.
*
RSPAR_LINE-HIGH
=
S_BUKRS-HIGH.
APPEND
RSPAR_LINE
TO
RSPAR_TAB.
CLEAR
RSPAR_LINE.
RSPAR_LINE-SELNAME
=
'S_LIFNR'.
RSPAR_LINE-KIND
=
'P'.
RSPAR_LINE-SIGN
=
'I'.
RSPAR_LINE-OPTION
=
'EQ'.
RSPAR_LINE-LOW
=
S_LIFNR-LOW.
RSPAR_LINE-HIGH
=
S_LIFNR-HIGH.
APPEND
RSPAR_LINE
TO
RSPAR_TAB.
SUBMIT
zfxyfiwork_2
WITH
SELECTION-TABLE
RSPAR_TAB
WITH
s_bukrs
=
s_bukrs
WITH
s_lifnr
=
s_lifnr
AND
RETURN.
ENDIF.
ENDIF.
endif.運(yùn)行結(jié)果:(明細(xì)表)經(jīng)例子數(shù)據(jù)測試,除了上面所說的一個地方無法實現(xiàn)之外,程序基本正確無誤。時間統(tǒng)計完成該練習(xí)的學(xué)員:*號的時間是必須填寫的老師的時間統(tǒng)計這一項非常重要,我很理解到了,但這個程序?qū)τ谖椰F(xiàn)在水平而言的確比較艱難,三四天內(nèi)勉強(qiáng)做成已經(jīng)花了很大功夫,由于本身業(yè)務(wù)理解就難,加上程序設(shè)計本身的困難、還不熟練等等因素,幾天內(nèi)實在沒有時間去完全精確統(tǒng)計每一個流程的工作時間。而且很多時候是穿插進(jìn)行的,比如第2,3,5就是互相穿插,而且6很難獨(dú)立出來。因此只能寫個大概值。項目內(nèi)容工作時間1*業(yè)務(wù)需求理解和分析大概1天2*編寫程序前的邏輯圖(程序邏輯快劃分)大概1天3*編寫和調(diào)試程序下面4項總共大概1.5天4編寫程序后的總結(jié)的邏輯圖5*知識和經(jīng)驗總結(jié)6其他問題和難題的解決時間全部一起總共大概3.5天練習(xí)效果評估:結(jié)對評分,學(xué)員之間相互結(jié)成對子,彼此給對方評分。項目內(nèi)容分值學(xué)員自評結(jié)對評分老師評分1業(yè)務(wù)需求理解和分析302程序結(jié)果正確性70老師總體評價6.知識和經(jīng)驗總結(jié)6.11.intocorrespondingfieldof在大多數(shù)時候都很有用,但在用sum等求和函數(shù)的時候就不行,因為根本沒有一個字段名叫sum(X)的。2.在做dmbtr本幣金額累加時,語法奇怪地提示p類型數(shù)不能如此累加,結(jié)果弄了半天,才發(fā)現(xiàn)2個p類型累加的時候,+號不能和任何一個連在一起。3.后臺數(shù)據(jù)格式都一樣,程序里也都是lifnr(c10),但值卻隱式的不同,這造成了這2個數(shù)不相等!花費(fèi)了大量時間檢查。結(jié)論:萬分小心這種默認(rèn)很多位但前面都是0的數(shù)值,在程序中是不一樣的。!?。。簡栴}解決了!原來是select語句中bukrs和lifnr寫反了,這2個又都賦值1000,intotable語法上檢查不出來,程序運(yùn)行也可以過得去,純屬隱藏邏輯問題。因此把lifnr賦值成了bukrs的1000(本來是0000001000),而bukrs本來就只有4位,這時被賦lifnr的值(0000001000),當(dāng)然系統(tǒng)只取前4位,結(jié)果就是0000……好半天,從這里才發(fā)現(xiàn)原來錯誤的源頭。modify
git_sum
from
wa_sum.此語句報錯,說git_sum沒有光標(biāo)定位。原因是git_sum是內(nèi)表,不是真實數(shù)據(jù)表一樣有關(guān)鍵字,因此,真實表沒有光標(biāo)定位是可以用的,系統(tǒng)會根據(jù)關(guān)鍵字組合來修改,但內(nèi)表沒有光標(biāo)定位就會報錯。網(wǎng)上的資料多是copy來copy去,導(dǎo)致標(biāo)明loop次數(shù)的變量集體錯誤,這里花費(fèi)了大量時間!是SY-TABIX不是sy-index。網(wǎng)上有資料都表示index與tabix都是用來記錄循環(huán)的次數(shù),但是并不是這樣!index通常用于do循環(huán),記錄循環(huán)的次數(shù);tabix通常用于loop內(nèi)表的循環(huán),可以用來記錄循環(huán)的次數(shù),但是它本身并不是記錄循環(huán)次數(shù)的,而是記錄內(nèi)表的索引,對內(nèi)表的第N行進(jìn)行操作,相應(yīng)的tabix就是N,跟第幾次循環(huán)無關(guān)。仔細(xì)琢磨下面的程序,將有所斬獲:report
zrtctest
.
types:
begin
of
wa,
col1
type
i,
col2
type
i,
end
of
wa.
data
str
type
wa.
data
itab
type
standard
table
of
wa
with
header
line.
data
itab2
type
standard
table
of
wa
with
header
line.
do
3
times.
str-col1
=
sy-index.
str-col2
=
sy-index
*
2.
append
str
to
itab.
enddo.
loop
at
itab.
write:/
'SY-INDEX:',
sy-index,
'SY-TABIX:',
sy-tabix,
itab-col1,
itab-col2.
endloop.
uline.
skip.
clear
str.
do
3
times.
str-col1
=
sy-index.
str-col2
=
sy-index
**
2.
append
str
to
itab2.
enddo.
loop
at
itab2.
write:/
'SY-INDEX:',
sy-index,
'SY-TABIX:',
sy-tabix,
itab2-col1,
itab2-col2.
skip.
read
table
itab
with
key
col1
=
3.
write:/
'AFTER
READ
ITAB:',
sy-tabix.
skip.
endloop.輸出是:核心原因:loopitab2循環(huán)執(zhí)行第一次之后,讀取itab第三行,此時在itab的tabix輸出結(jié)果是3,itab2的tabix輸出結(jié)果是1,而且讀取itab之后對itab2的tabix不產(chǎn)生影響。工作區(qū)用了要及時清空,否則會出現(xiàn)這次某個字段賦值為空,但由于沒有清空上個工作區(qū),導(dǎo)致此字段體現(xiàn)的還是上個工作區(qū)的值。反之,將要用某個工作區(qū)或內(nèi)表做新的事情時(通常是用工作區(qū)),一定要先回憶和留神一下,是否以前某個地方用過沒有清空,還有殘余值在里面。雙loop時,注意力千萬要集中在邏輯上,否則很容易判斷反。內(nèi)表完全確定不用要清空,否則占用很多內(nèi)存,但一定要完全確定才行。內(nèi)表用innerjoin時報錯,因為內(nèi)表不能用innerjoin,類似的好像還有簇表,比如konv,也不能用innerjoin,因此這樣處理起來比較麻煩!只要有readtable+binarysearch,前面一定要記得用sort!!!否則會出現(xiàn)隱蔽的邏輯錯誤很久都發(fā)現(xiàn)不了!如果有abcd四個字段,要sum(b),groupby一定要包含剩下的acd三個字段才行,否則程序不允許你這么干。有時會犯低級錯誤:bukrs
=
1000lifnr
=
0000000111是錯誤寫法,這樣程序就會當(dāng)成數(shù)字類型i處理,應(yīng)該加上引號’’才是正確寫法,這樣才是字符類型。
read
table
git_bsik
with
key
bukrs
=
'1000'
lifnr
=
'0000000111'
binary
search.
clear
wa_bsik.
wa_bsik-dmbtr
=
9999.
write:
/
git_bsik-dmbtr.“原始值是4742.00
git_bsik-dmbtr
=
9999.
if
sy-subrc
=
0.
write:
/
git_bsik-bukrs,
git_bsik-lifnr,
git_bsik-SHKZG,
git_bsik-dmbtr.
endif.
"modify
git_bsik
from
wa_bsik.運(yùn)行顯示:可以看出,readtable是可以定位的,定位后可以直接改git_bsik,因為這時引用變量git_bsik就不是一個內(nèi)表,而是內(nèi)表中定位的記錄(這句話錯了!read
table
git_bsik其實是read
table
git_bsikintogit_bsik的簡寫形式,前一個git_bsik是內(nèi)表,后一個git_bsik是工作區(qū)!別忘了這個表定義是occurs0的!因此后面如果引用變量git_bsik的字段值,那么這個git_bsik就是工作區(qū),而不是定位到的記錄本身!或者說,是定位到的記錄拷貝到工作區(qū)里),對此工作區(qū)可以做工作區(qū)允許的操作。其實我們再仔細(xì)品味一下原來寫法就更明白了:read
table
git_bsikintogit_bsik是不斷把前面的內(nèi)表讀到后面的工作區(qū),以后引用當(dāng)然只能用工作區(qū)。這個問題就是這樣。下面,如果這時用modify語句改記錄(引號后),則會報錯,說:原因在于,modify是針對內(nèi)表的,這里用modify那么程序就把git_bsik看成內(nèi)表,而不是記錄,所以它找不到索引定位,因此不知道該modify哪條記錄,報錯。有了上面紅字的教訓(xùn),再加一個功能就能明白其中令人混淆之處了:
loop
at
git_bsik.
"程序設(shè)計中的檢查功能
write:
/
git_bsik-bukrs,
git_bsik-lifnr,
git_bsik-SHKZG,
git_bsik-dmbtr.
endloop.結(jié)果顯示:這看上去很奇怪,浪費(fèi)我大量時間!但其實現(xiàn)在很清楚了:write:
/
git_bsik-dmbtr.輸出的4742是工作區(qū)的字段值,9999是修改后的工作區(qū)字段值,但loopat是讀內(nèi)表的一條條記錄本身,記錄本身沒有做任何改變,因此當(dāng)然保持原樣不變!總結(jié):這里吃了很大的苦頭,以后寫程序遇到簡寫的時候,一定要當(dāng)心留意,到底是對內(nèi)表操作,還是對工作區(qū)操作!modifyitabformwa(也許還有update)用法有個很隱蔽容易忽略的地方,如果wa的某個字段為空,itab的相應(yīng)字段是有值的,那么modify后itab此字段會被空覆蓋,也就是變成空!這里很容易想當(dāng)然認(rèn)為:wa的空字段不起作用,itab相應(yīng)字段還是保留原來值,因為潛意識中不認(rèn)為“空”是一個值。但“空”恰恰就是一個實實在在的值!千萬注意。因為itab中需要改的字段一般不是全部,因此wa里常常只是部分字段的,這時一忽略,很容易出現(xiàn)把“空值”賦給原“有值”從而抹去原始值的情況發(fā)生。因此,如果要用wa來改itab,最好以前就loopatitabintowa或readtableitabintowa保險!又碰到2個想砸機(jī)器的錯誤,前后弄了我共4個小時,搞得頭昏腦脹,眼睛酸軟,郁悶得憋屈得緊,第1個見下圖:如果prg以前定義的時候只是dataprglikesy-repid(還是老師給的范本),則alv顯示是可行的,但F_USER_COMMAND沒有辦法響應(yīng),就是沒法進(jìn)到那個break-point。后來發(fā)現(xiàn),必須要切實給prg賦值才可以?。?!比如一開始就dataprglikesy-repidvaluesy-repid。才能觸發(fā)F_USER_COMMAND,這個問題相當(dāng)隱蔽!因為alv顯示可行,所以就理所當(dāng)然認(rèn)為前面的寫法肯定沒錯。這種問題是最讓人頭痛的問題之一,它和你的編程水平與努力程度幾乎無關(guān),如果無人教導(dǎo),發(fā)現(xiàn)之純粹靠運(yùn)氣?。?!所以從此老
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度家具家電全包帶家電家具裝修租賃合同
- 2025年度時尚潮流門面租賃管理服務(wù)合同
- 二零二五年度股權(quán)并購重組終止合同
- 單元排查落實練(十二)第12單元發(fā)展中國特色社會主義文化內(nèi)涵
- 安全生產(chǎn)法律法規(guī)體系方案
- 南京機(jī)電職業(yè)技術(shù)學(xué)院《公共部門人力資源管理實踐操作》2023-2024學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)職業(yè)技術(shù)大學(xué)《波斯語會話》2023-2024學(xué)年第一學(xué)期期末試卷
- 南昌師范學(xué)院《幼兒園教育環(huán)境創(chuàng)設(shè)》2023-2024學(xué)年第一學(xué)期期末試卷
- 教學(xué)課件-計算機(jī)網(wǎng)絡(luò)配置、管理與應(yīng)用(第3版)-吳怡
- 南昌航空大學(xué)《影視非線性編輯與合成》2023-2024學(xué)年第一學(xué)期期末試卷
- 部編新改版語文一年級下冊《語文園地四》教學(xué)設(shè)計
- 2025年北京鐵路局集團(tuán)招聘筆試參考題庫含答案解析
- 《藥品招商營銷概論》課件
- 曙光磁盤陣列DS800-G10售前培訓(xùn)資料V1.0
- 寺廟祈?;顒臃桨?共6篇)
- 2025年病案編碼員資格證試題庫(含答案)
- 企業(yè)財務(wù)三年戰(zhàn)略規(guī)劃
- 提高膿毒性休克患者1h集束化措施落實率
- 山東省濟(jì)南市天橋區(qū)2024-2025學(xué)年八年級數(shù)學(xué)上學(xué)期期中考試試題
- 主播mcn合同模板
- 2024測繪個人年終工作總結(jié)
評論
0/150
提交評論