




已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Chunguangz-技術(shù)人員參考 /pages/chunguangzBW提供了在R3端,自定義數(shù)據(jù)源的功能,與FILE和WEBSERVICE相比,可以方便ABAP人員開(kāi)發(fā)維護(hù),并且,輕松實(shí)現(xiàn)了DELTA的功能。自定義的數(shù)據(jù)源的數(shù)據(jù)提取方式分為3種:數(shù)據(jù)庫(kù)/視圖:SAP提供的這種提取方式,系統(tǒng)為你定義好了提取程序,通過(guò)在數(shù)據(jù)庫(kù)中,設(shè)置增量相關(guān)字段(如:時(shí)間戳、日期、數(shù)字),來(lái)輕松實(shí)現(xiàn)DELTA(增量)抽取,是BW中最常用的自定義數(shù)據(jù)源,一般是通過(guò)程序?qū)?shù)據(jù)寫(xiě)入表中。信息集:即:SAP QUERY。可以設(shè)置表間相關(guān)的邏輯,相當(dāng)于JOIN語(yǔ)句,把關(guān)聯(lián)的字段作為數(shù)據(jù)源。FUNCTION MODULE:通過(guò)程序控制數(shù)據(jù)的提取,可以設(shè)置增量字段,也可以不設(shè)置,通過(guò)一定邏輯將數(shù)據(jù)抽取,可以實(shí)現(xiàn)前兩種方式的自定義開(kāi)發(fā)。這是最靈活的自定義數(shù)據(jù)源。下面,我們以數(shù)據(jù)庫(kù)和FM的方式為例,介紹自定義數(shù)據(jù)源的應(yīng)用:數(shù)據(jù)庫(kù)/視圖:1. 創(chuàng)建用于數(shù)據(jù)源的數(shù)據(jù)表:(SE11將允許表維護(hù)勾選,方便測(cè)試)其中,UPT_TIMESTAMP是我們?cè)O(shè)置的增量相關(guān)字段:2. 創(chuàng)建自定義數(shù)據(jù)源:(RSO2)創(chuàng)建ZRSO01數(shù)據(jù)源,點(diǎn)擊“創(chuàng)建”:按以下參數(shù)輸入,提取結(jié)構(gòu)不允許輸入,激活后,系統(tǒng)會(huì)為數(shù)據(jù)源自動(dòng)創(chuàng)建,點(diǎn)擊“一般增量”按鈕:按以下屏幕輸入?yún)?shù),并保存:增量字段名:這個(gè)字段在數(shù)據(jù)庫(kù)中存放了錄入時(shí)間戳(或日期或數(shù)字),數(shù)據(jù)抽取程序會(huì)按照BW請(qǐng)求的時(shí)間參數(shù)從數(shù)據(jù)庫(kù)中抽取數(shù)據(jù)。時(shí)間標(biāo)記:通過(guò)時(shí)間戳方式實(shí)現(xiàn)增量,即:YYYYMMDDhhmmss格式。日歷天數(shù):按照天為單位實(shí)現(xiàn)增量。數(shù)字指針:按照數(shù)字增量抽取。安全間隔上限:如果“時(shí)間標(biāo)記”或“日歷天數(shù)”勾選,那么此次可以設(shè)置,表示將請(qǐng)求時(shí)間戳 減去 上限設(shè)置的間隔后的時(shí)間戳作為數(shù)據(jù)抽取條件。舉例如下:BW最后一個(gè)抽取時(shí)間戳為 20100101120000,下次抽取時(shí)間為20100101123000,用戶(hù)在12:25分做了一個(gè)記錄,直到12:35才保存。這樣,這個(gè)記錄將不被抽取到BW中。我們?cè)O(shè)置的間隔上限,就是為了防止這樣的情況,如我們?cè)O(shè)置3600,表示在123000抽取的時(shí)候,將1小時(shí)之前的記錄再次抽取一遍,這樣防止數(shù)據(jù)的遺漏。重復(fù)抽取的數(shù)據(jù)只能將對(duì)DELTA抽取有影響,我們只能使用通過(guò)DSO上載的方式才能保證上載的數(shù)據(jù)正確。具體的解釋將在DELTA抽取原理文章中介紹。同理,對(duì)于數(shù)據(jù)指針,我們不是設(shè)置上限,而是設(shè)置下限,請(qǐng)根據(jù)您的需求具體設(shè)置。實(shí)時(shí)的激活:SAP解釋是是否適用于RDA方式的數(shù)據(jù)源。更改記錄的新?tīng)顟B(tài)/附加增量:更改記錄的新?tīng)顟B(tài)即表示使用后鏡像(AIE)的方式上載數(shù)據(jù)。附加增量表示以ADD方式上載數(shù)據(jù)。也是DELTA原理的內(nèi)容,以后在介紹,我們這里選擇AIE的方式上載。(簡(jiǎn)單說(shuō)就是以最后更改的記錄為準(zhǔn)上載。ADD即將改變的差額上載)3. 執(zhí)行數(shù)據(jù)源:接下來(lái),我們要在BW數(shù)據(jù)源中復(fù)制目錄下的元數(shù)據(jù),并激活數(shù)據(jù)源,然后創(chuàng)建信息包,此處不再贅述。其中,初始化信息包公司代碼被限制為1003。向數(shù)據(jù)庫(kù)中手工添加數(shù)據(jù)(SE16):執(zhí)行初始化信息包:我們會(huì)在RSA7中,查看多了ZDSO01的初始化記錄和統(tǒng)計(jì)信息點(diǎn)擊,查看統(tǒng)計(jì)記錄:從中,我們可以看出BW系統(tǒng)請(qǐng)求的時(shí)間戳為20100318002659。查看數(shù)據(jù)源的請(qǐng)求記錄,生成以下記錄:表示數(shù)據(jù)源中,1003的4條記錄被抽取到BW中:接下來(lái),我們?cè)跀?shù)據(jù)庫(kù)中在錄入2條記錄,如下:然后執(zhí)行增量抽取信息包,結(jié)果如下,只將一條記錄上載我用的版本比較低,在這里,安全間隔沒(méi)有起作用。在上載前可以使用RSA3測(cè)試,可以在FM RSA3_GEN_GET_DATA上設(shè)置斷點(diǎn),查看SELECT語(yǔ)句:* Open Cursor for dynamical SELECT open cursor with hold g_cursor for select * from (g_s_oltpsource-extractor) where (l_t_dynamic_select). endif.* Fetch first data package fetch next cursor g_cursor appending corresponding fields of table e_t_data package size g_s_interface-maxsize.使用FM抽取數(shù)據(jù):基本與以上步驟相同,我們以提取上例中的表數(shù)據(jù)為例,在數(shù)據(jù)源設(shè)置FM:下面介紹FM的創(chuàng)建:到SE80中復(fù)制FUNCTION GROUP RSAX,到新的FG:選擇RSAX_BIW_GET_DATA_SIMPLE,選擇復(fù)制,復(fù)制到我們自己的FM Z_GET_DATA_FM對(duì)FM進(jìn)行修改,要點(diǎn)如下:1)將TABLES中的E_T_DATA的參考值,改為我們的數(shù)據(jù)源表。2)修改源程序:程序中,注明MY COMMENT的地方是需要我們修改的位置。大家可以通過(guò)RSA3測(cè)試跟蹤下效果,此處不再贅述,其他與數(shù)據(jù)庫(kù)數(shù)據(jù)源是一樣的。FUNCTION Z_GET_DATA_FM.*-*Local interface:* IMPORTING* VALUE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR* VALUE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL* VALUE(I_MAXSIZE) TYPE SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL* VALUE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL* VALUE(I_READ_ONLY) TYPE SRSC_S_IF_SIMPLE-READONLY OPTIONAL* VALUE(I_REMOTE_CALL) TYPE SBIWA_FLAG DEFAULT SBIWA_C_FLAG_OFF* TABLES* I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL* I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL* E_T_DATA STRUCTURE ZZC_TEST02 OPTIONAL* EXCEPTIONS* NO_MORE_DATA* ERROR_PASSED_TO_MESS_HANDLER*-* Example: DataSource for table SFLIGHT* tables: sflight. MY COMMNET TABLES: ZZC_TEST02.* Auxiliary Selection criteria structure DATA: L_S_SELECT TYPE SRSC_S_SELECT.* Maximum number of lines for DB table STATICS: S_S_IF TYPE SRSC_S_IF_SIMPLE,* counter S_COUNTER_DATAPAKID LIKE SY-TABIX,* cursor S_CURSOR TYPE CURSOR.* Select ranges* RANGES: L_R_CARRID FOR SFLIGHT-CARRID, MY COMMENT* L_R_CONNID FOR SFLIGHT-CONNID. MY COMMENTRANGES: L_R_BUKRS FOR T001-BUKRS.RANGES: L_R_TIMES FOR ZZC_TEST02-UPT_TIMESTAMP.* Initialization mode (first call by SAPI) or data transfer mode* (following calls) ? IF I_INITFLAG = SBIWA_C_FLAG_ON.* Initialization: check input parameters* buffer input parameters* prepare data selection* Check DataSource validity CASE I_DSOURCE.* when 0SAPI_SFLIGHT_SIMPLE. MY COMMENT WHEN ZRSO02. WHEN OTHERS. IF 1 = 2. MESSAGE E009(R3). ENDIF.* this is a typical log call. Please write every error message like this LOG_WRITE E message type R3 message class 009 message number I_DSOURCE message variable 1 . message variable 2 RAISE ERROR_PASSED_TO_MESS_HANDLER. ENDCASE. APPEND LINES OF I_T_SELECT TO S_S_IF-T_SELECT.* Fill parameter buffer for data extraction calls S_S_IF-REQUNR = I_REQUNR. S_S_IF-DSOURCE = I_DSOURCE. S_S_IF-MAXSIZE = I_MAXSIZE.* Fill field list table for an optimized select statement* (in case that there is no 1:1 relation between InfoSource fields* and database table fields this may be far from beeing trivial) APPEND LINES OF I_T_FIELDS TO S_S_IF-T_FIELDS. ELSE. Initialization mode or data extraction ?* Data transfer: First Call OPEN CURSOR + FETCH* Following Calls FETCH only* First data package - OPEN CURSOR IF S_COUNTER_DATAPAKID = 0.* Fill range tables BW will only pass down simple selection criteria* of the type SIGN = I and OPTION = EQ or OPTION = BT.* MY COMMENT* loop at s_s_if-t_select into l_s_select where fieldnm = CARRID.* move-corresponding l_s_select to l_r_carrid.* append l_r_carrid.* endloop.* loop at s_s_if-t_select into l_s_select where fieldnm = CONNID.* move-corresponding l_s_select to l_r_connid.* append l_r_connid.* endloop.* LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = BUKRS. MOVE-CORRESPONDING L_S_SELECT TO L_R_BUKRS. APPEND L_R_BUKRS. ENDLOOP. LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = UPT_TIMESTAMP. MOVE-CORRESPONDING L_S_SELECT TO L_R_TIMES. APPEND L_R_TIMES. ENDLOOP.* Determine number of database records to be read per FETCH statement* from input parameter I_MAXSIZE. If there is a one to one relation* between DataSource table lines and database entries, this is trivial.* In other cases, it may be impossible and some estimated value has to* be determined. OPEN CURSOR WITH HOLD S_CURSOR FOR* SELECT (S_S_IF-T_FIELDS) FROM SFLIGHT MY COMMENT* WHERE CARRID IN L_R_CARRID AND* CONNID IN L_R_CONNID. SELECT * FROM ZZC_TEST02 WHERE BUKRS IN L_R_BUKRS AND UPT_TIMESTAMP IN L_R_TIMES. ENDIF. First data package ?* Fetch records into interface table.* named E_T_Name of extract structure. FETCH NEXT CURSOR S_CURSOR APPENDING CORRESPONDING FIELDS OF TABLE E_T_DATA PACKAGE SIZE S_S_IF-MAXSIZE. IF SY-SUBRC 0. CLOSE CURSOR S_CURSOR. RAISE NO_MORE_DATA. ENDIF. S_COUNTER_DATAPAKID = S_COUNTER_DATAPAKID + 1. ENDIF. Initialization mode or data extraction ?ENDFUNCTION.SAP中的增量機(jī)制,可以有助系統(tǒng)提高數(shù)據(jù)抽取效率,在初始化執(zhí)行后,每天只更新新增和修改了的記錄。在我們正常的使用或開(kāi)發(fā)中,這些東西并不需要知道,只要數(shù)據(jù)正常上載,就好了,此處所介紹的內(nèi)容之為大家參考用。在介紹DELTA機(jī)制之前,先介紹下DSO和CUBE:DSO:一般DSO用來(lái)存儲(chǔ)明細(xì)數(shù)據(jù),其結(jié)構(gòu)比較簡(jiǎn)單。對(duì)于值的轉(zhuǎn)換(決定了可用的DELTA類(lèi)型),既可以使用合計(jì),也可以使用覆蓋的方式。激活DSO后,其在后臺(tái)對(duì)應(yīng)3個(gè)數(shù)據(jù)表:A表,存放了最后激活的數(shù)據(jù)。即存放了匯總后的數(shù)據(jù)。LOG表:存儲(chǔ)了數(shù)據(jù)變化的數(shù)據(jù)記錄N表,NEW表,臨時(shí)存放更新的數(shù)據(jù),待激活后,將數(shù)據(jù)轉(zhuǎn)入A表和LOG表以上數(shù)據(jù)表,可以通過(guò)在SE11中,描述中搜索DSO技術(shù)名稱(chēng)找到CUBE:典型的星型架構(gòu)。CUBE只支持?jǐn)?shù)據(jù)值的合計(jì)上載。建立了CUBE之后,可以到SE11中,通過(guò)在表名中搜索CUBE的名稱(chēng),找到對(duì)應(yīng)的維表和事實(shí)表。同樣都是數(shù)據(jù)模型,而DSO更多用于存儲(chǔ)明細(xì)數(shù)據(jù),星型架構(gòu)的CUBE更適合作為分析數(shù)據(jù)源。關(guān)于具體的DSO和CUBE,我們以后再介紹下面給大家介紹兩個(gè)表,是定義DELTA類(lèi)型的基本表,如下:ROOSOURCE:定義了每個(gè)數(shù)據(jù)源的屬性,大部分屬性我們?cè)趧?chuàng)建自定義數(shù)據(jù)源時(shí)已介紹,請(qǐng)參考/pages/chunguangz/blog/archive/2010/03/18/401671.aspx,其中,DP列定義了增量類(lèi)型。RODELTAM:定義了每種增量提取方式的方法,即:DP的屬性DP:增量處理名稱(chēng)T: 標(biāo)識(shí)是否為 僅全量更新NIM:標(biāo)識(shí)是否為傳輸 新鏡像(即:新數(shù)據(jù)的狀態(tài))BIM:標(biāo)識(shí)是否為傳輸 前鏡像(即:更新前的狀態(tài))AIM:標(biāo)識(shí)是否為傳輸 后鏡像(即:更新后的狀態(tài))ADD:標(biāo)識(shí)是否為傳輸 差額鏡像(即:更改的差額狀態(tài))DID:標(biāo)識(shí)是否為傳輸 刪除鏡像(即:刪除狀態(tài))RIM:標(biāo)識(shí)是否為傳輸 反轉(zhuǎn)鏡像(即:沖銷(xiāo)的狀態(tài))SER:標(biāo)識(shí)為 哪種序列化方式,即:數(shù)據(jù)的排序1.無(wú)所需序列化2.所需的請(qǐng)求序列化3.所需的數(shù)據(jù)包序列化類(lèi)型:DELTA處理的類(lèi)型。標(biāo)識(shí)何種數(shù)據(jù)抽取方式。BW中的增量機(jī)制就是圍繞RODELTAM表設(shè)置來(lái)進(jìn)行的,首先介紹增量類(lèi)型的定義,我們假設(shè)有一筆業(yè)務(wù)創(chuàng)建100,而后更改為80,然后刪除,對(duì)于以上設(shè)置,會(huì)產(chǎn)生什么樣的影響: ORDER NOSTATUSQTYRECODE TYPE創(chuàng)建訂單100000000CREATED100N將帶有記錄類(lèi)型為的新建記錄上載到BW,BW以N載入DSO更改 100-80100000000CHANGED-100X前鏡像生成100000000CHANGED80“”后鏡像生成100000000CHANGED-20A差額鏡像生成標(biāo)志刪除100000000DELETED0R反轉(zhuǎn)鏡像生成100000000D刪除鏡像生成創(chuàng)建100的業(yè)務(wù):此為創(chuàng)建操作,傳輸新鏡像,在R3端,以表示新鏡像更改100-80:如果前鏡像設(shè)置:以X表示前鏡像傳輸。如果后鏡像設(shè)置:以表示后鏡像傳輸如果差額鏡像設(shè)置:以A表示差額鏡像傳輸我們下面用兩種類(lèi)型來(lái)說(shuō)明DELTA在R3和BW端的處理步驟:ABR:MM中采購(gòu)用到這種類(lèi)型,我們可以看出ABR存在新鏡像、前鏡像、后鏡像和反轉(zhuǎn)鏡像,我們創(chuàng)建一采購(gòu)訂單,并查看,R3數(shù)據(jù)源給BW提供的數(shù)據(jù)。根據(jù)ABR的定義,對(duì)于采購(gòu)訂單操作,應(yīng)按以下順序傳輸數(shù)據(jù):ORDER NOSTATUSQTYRECODE TYPE創(chuàng)建訂單100000000CREATED100“”將帶有記錄類(lèi)型為的新建記錄上載到BW,BW以N載入DSO更改 100-80100000000CHANGED-100X前鏡像生成100000000CHANGED80“”后鏡像生成標(biāo)志刪除100000000DELETED0R反轉(zhuǎn)鏡像生成通過(guò)RSA7查看統(tǒng)計(jì)的待傳輸數(shù)據(jù):首先創(chuàng)建采購(gòu)訂單:訂單號(hào)為4510000010查看RSA7的統(tǒng)計(jì)數(shù)據(jù):將100改為80:將10項(xiàng)目標(biāo)志位刪除: 關(guān)于在BW中的數(shù)據(jù)上載步驟: 對(duì)于存在多種鏡像屬性的數(shù)據(jù)源,系統(tǒng)會(huì)自動(dòng)為其增加ROCANCEL字段,作為傳輸鏡像屬性值用。我們這里的采購(gòu)訂單數(shù)據(jù)源,就是這樣的類(lèi)型。我們知道,CUBE只能合計(jì)數(shù)據(jù),DSO既可以做合計(jì),也可以做覆蓋的匯總,所以,ABR的DELTA類(lèi)型是既適合CUBE又適合DSO直接更新的。用上面的數(shù)據(jù)說(shuō)明,訂單傳輸?shù)胶嫌?jì)的更新模式(CUBE或DSO),因?yàn)檫B帶著前鏡像一起傳輸,所以,匯總后的結(jié)果就是最后的結(jié)果0。如果為覆蓋的話(huà)(DSO),那么序列化后的最后狀態(tài)為“R”的記錄,這樣也實(shí)現(xiàn)數(shù)據(jù)的成功上載。這種方式需要數(shù)據(jù)源的序列化,對(duì)于ABR設(shè)置為2。因此,這種方式既可以直接上載到DSO也可以直接上載到CUBE。但我們一般都會(huì)經(jīng)過(guò)DSO,保證數(shù)據(jù)模型中,存儲(chǔ)了所有的明細(xì)數(shù)據(jù)。接下來(lái),我們?cè)賹?duì)FI的數(shù)據(jù)源和自定義的數(shù)據(jù)源做一下分析:首先說(shuō)明一下,自定義的數(shù)據(jù)源默認(rèn)都是AIE的增量處理方式,即:只提供后鏡像的數(shù)據(jù)源,而且沒(méi)有提供更改增量處理的方法。與FI的數(shù)據(jù)源相似。這樣就說(shuō)明,這些數(shù)據(jù)源只能首先上載到DSO,然后在進(jìn)行分析。以我們前面做的自定義的數(shù)據(jù)源為例:AIE只支持后鏡像,即:所有的新建或修改后,都只將最后的狀態(tài)傳輸?shù)紹W,并且只支持一種傳輸方式的數(shù)據(jù)源不建立ROCANCEL字段,默認(rèn)為空。執(zhí)行初始化,并將數(shù)據(jù)上載到DSO,不激活DSO數(shù)據(jù),我們?cè)诤笈_(tái)數(shù)據(jù)表中,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 車(chē)輛質(zhì)押貸款及汽車(chē)租賃及保養(yǎng)服務(wù)合同
- 產(chǎn)權(quán)式酒店租賃合同示范文本及經(jīng)營(yíng)風(fēng)險(xiǎn)控制
- 醫(yī)療健康園區(qū)場(chǎng)站委托運(yùn)營(yíng)管理協(xié)議
- 產(chǎn)業(yè)園區(qū)場(chǎng)地租賃合同行政備案及產(chǎn)業(yè)扶持政策
- 餐飲企業(yè)特色餐廳承包經(jīng)營(yíng)合同范本
- 茶葉原料種植基地合作合同樣本
- 柴油市場(chǎng)拓展與銷(xiāo)售獎(jiǎng)勵(lì)合同范本
- 草場(chǎng)租賃與水資源保護(hù)與利用協(xié)議
- 稅務(wù)籌劃與財(cái)務(wù)代理一體化服務(wù)合同
- 金融投資代理居間業(yè)務(wù)合同
- 孕期保健主題宣教培訓(xùn)課件
- 《高血壓健康教育規(guī)范》
- 骨科手術(shù)后的康復(fù)用具與輔助器具
- 小學(xué)特色課程《口風(fēng)琴課程》校本教材
- 電腦教室搬遷方案
- 《如何寫(xiě)文獻(xiàn)綜述》課件
- 汽車(chē)美容店計(jì)劃書(shū)案例
- 2023高教版中職中國(guó)特色社會(huì)主義基礎(chǔ)模塊課程標(biāo)準(zhǔn)
- 信息機(jī)房火災(zāi)事故應(yīng)急處置方案
- 火災(zāi)調(diào)查專(zhuān)業(yè)技能.全國(guó)比武單項(xiàng)科目解析
- 抑郁癥健康教育
評(píng)論
0/150
提交評(píng)論