1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx

17 1,7K 44
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tiêu Chuẩn Viết Mã Chương Trình SAP Version 0.01
Tác giả Trần Quý Giáp
Người hướng dẫn Nguyễn Gia Khánh
Trường học Công Ty TNHH Hệ Thống Thông Tin FPT
Chuyên ngành Công Nghệ Thông Tin
Thể loại Tài liệu
Năm xuất bản 2009
Thành phố Hà Nội
Định dạng
Số trang 17
Dung lượng 194,38 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

12 II.3.4.6 Thêm chú thích vào phần header của chương trình chính hoặc function module 12 III Hướng dẫn đặt tên cho đối tượng... II Hướng dẫn lập trình cho Conversion Các hướng dẫn chính

Trang 1

TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP

VERSION 0.01

KIỂM SOÁT PHIÊN BẢN

T ng h ợ p b ở i Tr ầ n Quý Giáp

Ngày t ạ o: 13 / 04 / 2009

Xem l ạ i b ở i: Nguy ễ n Gia Khánh

Ngày xem: 15 / 04 / 2009

Xác nh ậ n b ở i: Nguy ễ n Gia Khánh

Ngày xác nh ậ n: 15 / 04 / 2009

BẢN GHI NHẬN THAY ĐỔI

Trang 2

MỤC LỤC

I Tổng quan 4

I.1 Mục đích 4

I.2 Phạm vi 4

I.3 Các thuật ngữ 4

II Hướng dẫn lập trình cho Conversion 5

II.1 Định dạng Source Code 5

II.1.1 Ký tự sử dụng trong môi trường code 5

II.1.2 Hiệu chỉnh source code 5

II.1.3 Các câu lệnh 5

II.1.4 Thiết lập môi trường code 5

II.2 Cách đặt tên biến trong chương trình 6

II.2.1 Tên biến trên màn hình Selection Screen 6

II.2.2 Tên biến trên màn hình nhập liệu (Screen) 7

II.2.3 Quy tắc đặt tên biến chung cho chương trình 7

II.2.4 Quy tắc đặt tên biến cho subroutine 8

II.2.5 Quy tắc đặt tên biến cho Function Module 8

II.3 Các chuẩn lập trình chung 8

II.3.1 Truy cập tập tin 8

II.3.2 Text element 8

II.3.2.1 Phân loại text element 8

II.3.3 Chú thích chương trình 9

II.3.3.1 Phương pháp chú thích chương trình 9

II.3.3.2 Khai báo biến 9

II.3.3.3 Câu lệnh INCLUDE 9

II.3.3.4 Khối xử lý 9

II.3.3.5 Gọi subroutine hoặc function module 10

II.3.3.6 Những chú thích khác 10

II.3.4 Header của chương trình 10

II.3.4.1 Header của chương trình chính 10

II.3.4.2 Header của chương trình INCLUDE 10

II.3.4.3 Header của Subroutine 11

II.3.4.4 Header của function module 11

II.3.4.5 Theo dõi sự thay đổi của source code 12

II.3.4.6 Thêm chú thích vào phần header của chương trình chính hoặc function module 12 III Hướng dẫn đặt tên cho đối tượng 13

III.1 CÁC QUY TẮC CHUNG 13

III.1.1 Quy tắc đặt tên của SAP 13

III.1.2 Đảm bảo việc phát triển và vận hành được thuận lợi 13

III.2 QUY TẮC ĐẶT TÊN 13

III.2.1 Quy tắc đặt tên chung 13

III.2.2 Tiền tố theo quy tắc của SAP(Kí hiệu <R>) 14

III.2.3 Tiền tố cho việc phát triển các đối tượng mới trong SAP(Kí hiệu <$>) 14

III.2.4 Phân loại đối tượng (Kí hiệu <PL>) 14

III.3 QUY TẮC TẠO CÁC ĐỐI TƯỢNG VÀ THÀNH PHẦN 16

III.3.1 Quy tắc tạo field của table, structure 16

III.3.2 Quy tắc tạo table type 16

Trang 3

III.3.3 Quy tắc tạo data element 17 III.3.4 Quy tắc tạo domain 17 III.3.5 Quy tắc tạo chương trình 17

Trang 4

I Tổng quan

I.1 M ụ c đ ích

• Quy chuẩn cách viết code trong chương trình SAP

I.2 Ph ạ m vi

Phạm vi của tài liệu áp dụng cho tất các dự án triển khai SAP trong trung tâm dịch vụ

FIS-ERP

I.3 Các thu ậ t ng ữ

Đố i t ượ ng Là các đố i t ượ ng c ầ n phát tri ể n trong SAP Bao g ồ m: Program (ch ươ ng

trình), Table (B ả ng d ữ li ệ u), Data Element (Thông tin nghi ệ p v ụ c ủ a ki ể u

d ữ li ệ u), Domain (Ki ể u d ữ li ệ u), Search Help (Danh sách giá tr ị h ướ ng

d n), v.v…

Package Package là m ộ t thành ph ầ n dùng để ch ứ a các đố i t ượ ng khác Th ườ ng

đượ c t ạ o ra lúc t ạ o m ớ i đố i t ượ ng và r ấ t ít khi ph ả i thay đổ i trong su ố t quá trình phát tri ể n

Request Dùng để qu ả n lý các đố i t ượ ng trong ABAP và qu ả n lý các l ậ p trình viên

theo các yêu c ầ u phát tri ể n Ngoài ra request còn đượ c dùng để chuy ể n giao mã ngu ồ n sang môi tr ườ ng khác

Object Editor Màn hình dùng để so ạ n th ả o các đố i t ượ ng

Trang 5

II Hướng dẫn lập trình cho Conversion

Các hướng dẫn chính từ việc thực hiện yêu cầu dạng Conversion sang mã nguồn

II.1 Đị nh d ạ ng Source Code

II.1.1 Ký t ự s ử d ụ ng trong môi tr ườ ng code

Các ký t ự s ử d ụ ng trong môi tr ườ ng code ph ả i là ch ữ hoa và dùng ngôn ng ữ là ti ế ng anh

II.1.2 Hi ệ u ch ỉ nh source code

Ph ả i đả m b ả o ch ạ y Pretty Printer sau khi code xong

II.1.3 Các câu l ệ nh

Mỗi dòng chỉ được viết một câu lệnh và một lệnh nên viết trên một dòng, trong trường hợp quá dài thì viết nhiều hơn một dòng code

II.1.4 Thi ế t l ậ p môi tr ườ ng code

Thi ế t l ậ p môi tr ườ ng code nh ư h ướ ng d ẫ n sau

T ừ màn hình ABAP Editor (SE38 ho ặ c SE80), ch ọ n Utilities->Settings

Chọn Tab Pretty Printer

Trang 6

II.2 Cách đặ t tên bi ế n trong ch ươ ng trình

Tên bi ế n s ử d ụ ng trong ch ươ ng trình ph ả i theo các quy t ắ c sau

• Không đượ c dùng d ấ u "-" trong tên bi ế n để tránh nh ầ m l ẫ n v ớ i vi ệ c tri ế t xu ấ t d ữ li ệ u

t ừ b ả ng

• Dùng d ấ u "_" để phân chia n ộ i dung c ủ a bi ế n trong tr ườ ng h ợ p tên bi ế n quá dài

• Các bi ế n s ử d ụ ng trong ch ươ ng trình ph ụ (subroutine, function module) đượ c g ọ i là

bi ế n c ụ c b ộ

II.2.1 Tên bi ế n trên màn hình Selection Screen

Toàn cục Cục bộ Biến đơn trị

Dùng để khai báo biến với một chọn lựa

Biến đa trị

Dùng để khai báo biến với nhiều chọn lựa

Block N/A BL_* Định nghĩa nhóm các trường

Radio button group N/A GRG_* Định nghĩa nhóm radio button

Tên bi ế n nên đặ t tên theo các tr ườ ng trong table ho ặ c theo data element c ủ a bi ế n đ ó

Ví d ụ : P_BUKRS TYPE BUKRS dùng để đị nh ngh ĩ a bi ế n company code

Trang 7

II.2.2 Tên bi ế n trên màn hình nh ậ p li ệ u (Screen)

Phân loại Quy tắc đặt

Nhóm các trường (Box) GRP*

Trong trường hợp tiêu đề của nhóm thay đổi động thì tên nhóm được đặt theo quy tắc đặt tên chung của chương trình (3.2.3)

Nút lệnh (Push Button) CMD*

Trong trường hợp Text hiển thị trên nút thay đổi động thì tên nút được đặt theo quy tắc đặt tên chung của chương trình (3.2.3)

Bảng dữ liệu (Table

Tab dữ liệu (Tab Control) TAB*

Các nút trên tab CMD*

Trong trường hợp Text hiển thị trên nút thay đổi động thì tên nút được đặt theo quy tắc đặt tên chung của chương trình (3.2.3)

Subscreen Area SUB*

Custom Control CUS*

Các trường * Các trường trên màn hình phải được thiết kế từ

structure, table hoặc view trong ABAP dictionary Combobox * Trường trên màn hình có thuộc tính list down Thuộc

tính này phải là Listbox with key

Thuộc tính group của các

* là các số để định nghĩa nhóm customize của các trường

II.2.3 Quy t ắ c đặ t tên bi ế n chung cho ch ươ ng trình

Work area GS_* LS_*

Structure type GTY_* LTY_*

Field symbol <GF_*> <LF_*>

Tên bi ế n nên đặ t tên theo các tr ườ ng trong table ho ặ c theo data element c ủ a bi ế n đ ó

Ví d ụ : GW_BUKRS TYPE BUKRS dùng để đị nh ngh ĩ a bi ế n company code

Trang 8

II.2.4 Quy t ắ c đặ t tên bi ế n cho subroutine

Structure (work area) LPS_*

Tên bi ế n nên đặ t tên theo các tr ườ ng trong table ho ặ c theo data element c ủ a bi ế n đ ó

Ví d ụ : LPW_BUKRS TYPE BUKRS dùng để đị nh ngh ĩ a bi ế n company code

II.2.5 Quy t ắ c đặ t tên bi ế n cho Function Module

Tên bi ế n nên đặ t tên theo các tr ườ ng trong table ho ặ c theo data element c ủ a bi ế n đ ó

Ví d ụ : I_BUKRS TYPE BUKRS dùng để đị nh ngh ĩ a bi ế n company code

II.3 Các chu ẩ n l ậ p trình chung

II.3.1 Truy c ậ p t ậ p tin

Khi làm vi ệ c v ớ i các t ậ p tin trên máy ch ủ ph ả i s ử d ụ ng đườ ng d ẫ n t ậ p tin lu ậ n lý để tránh

tr ườ ng h ợ p đườ ng d ẫ n t ậ p tin ph ụ thu ộ c vào h ệ đ i ề u hành và ph ụ thu ộ c vào t ừ ng h ệ th ố ng

II.3.2 Text element

Qu ả n lý text trong ch ươ ng trình nh ư sau

• N ế u text ph ụ thu ộ c vào ngôn ng ữ thì s ử d ụ ng text element thay cho vi ệ c hard code

Ví d ụ : Không s ử d ụ ng các lo ạ i v ă n b ả n nh ư 'Ch ươ ng trình k ế t thúc', 'Có l ỗ i x ả y ra' , v.v… mà ph ả i s ử d ụ ng TEXT-001, TEXT-002, v.v…

• Các text không phụ thuộc vào ngôn ngữ vẫn phải dùng text element để hiển thị, không được hard code

II.3.2.1 Phân loại text element

List Thiết lập tiêu đề của báo cáo và tiêu Không dùng chức năng này của SAP

Trang 9

header/row

header

đề của các cột trên báo cáo Thay vào đó sử dụng từ khóa WRITE và

các sự kiện TOP-OF-PAGE để thiết lập các tiêu đề này

Selection text Hiển thị ý nghĩa của các trường trên

màn hình Selection Screen

Dùng để giải thích ý nghĩa của các đối tượng trên màn hình selection screen Text symbol Không hard-code cho các text trong

chương trình Các text symbol chỉ có hiệu lực trong chương trình và được đăng ký tuần tự từ số 001

Dùng để xuất các thông điệp, hiển thị các tiêu đề của báo cáo thay cho việc hard-code…

II.3.3 Chú thích ch ươ ng trình

Chú thích dùng để gi ả i thích ch ứ c n ă ng, cách s ử d ụ ng và theo dõi nh ữ ng thay đổ i c ủ a

ch ươ ng trình Trong ph ạ m vi d ự án, chú thích c ầ n đượ c th ự c hi ệ n nh ư sau

• S ử d ụ ng ti ế ng anh để chú thích các đ o ạ n mã c ủ a ch ươ ng trình

• Dùng d ấ u * để chú thích cho toàn b ộ 1 dòng l ệ nh

• Dùng d ấ u “ để chú thích ở gi ữ a 1 dòng l ệ nh

Chú thích đượ c đặ t bên ph ả i c ủ a bi ế n đượ c khai báo Trong tr ườ ng h ợ p không đủ ch ỗ thì chú thích đượ c đặ t ở dòng l ệ nh tr ướ c dòng khai báo

Ví d ụ :

DATA:

LW_GPART_CNT TYPE I “ Number of Business Partner

DATA:

* Account Balance Of Business Partner

LT_BUT000 TYPE STANDARD TABLE OF BUT000

Dùng tiêu đề c ủ a INCLUDE để làm chú thích cho ch ươ ng trình Chú thích đượ c đặ t bên ph ả i

c ủ a câu l ệ nh INCLUDE Trong tr ườ ng h ợ p không đủ ch ỗ chú thích đượ c đặ t ở dòng l ệ nh

tr ướ c dòng s ử d ụ ng

Ví d ụ :

INCLUDE ZINRM01_TOP " Global data

INCLUDE ZINRM01_F01 " Subroutine

INCLUDE ZINRM01_O01 " Process before output

INCLUDE ZINRM01_I01 " Process After Input

Dùng đ ê miêu t ả ch ứ c n ă ng c ủ a kh ố i x ử lý

** -Select function -*

CASE OPT;

WHEN ‘DISP'

WHEN ‘EDIT'

END CASE

** -Select function -*

Trang 10

II.3.3.5 Gọi subroutine hoặc function module

Khi g ọ i m ộ t ch ươ ng trình ph ụ (subroutine) ho ặ c m ộ t ch ứ c n ă ng chung(function module), chú thích đượ c thêm vào tr ướ c dòng l ệ nh g ọ i để mô t ả n ộ i dung x ử lý c ủ a ch ứ c n ă ng đ ó

Ví d ụ : G ọ i m ộ t function module

* Open BDC session

CALL FUNCTION ‘BDC_OPEN_GROUP'

EXPORTING

Gọi một subroutine

* Open batch input session

PERFORM BDC_OPEN

Đố i v ớ i nh ữ ng câu l ệ nh đ i ề u ki ệ n, câu l ệ nh x ử lý khó hi ể u nên thêm chú thích vào để mô t ả

ch ứ c n ă ng x ử lý

Ví d ụ :

DATA GC_DISP(4) TYPE C VALUE ‘DISP’ “ Display mode

IF OPT = GC_DISP " when the option is a display mode

LW_CNT = LW_CNT + 1 " increase the counter

II.3.4 Header c ủ a ch ươ ng trình

Header c ủ a ch ươ ng trình chính ph ả i đượ c chú thích nh ư sau

*********************************************************************

**/

*Tên<Mã>: MF0102 – Báo cáo giá thành theo kho ả n m ụ

*/*******************************************************************

***/

*********************************************************************

****

*

*********************************************************************

**/

Header c ủ a ch ươ ng trình INCLUDE ph ả i đượ c chú thích nh ư sau

*& -*

* INCLUDE ZINRM01

*& -*

* <Content Explanation>

*& -*

Trang 11

II.3.4.3 Header của Subroutine

Header c ủ a subroutine ph ả i đượ c chú thích nh ư sau

*& -*

*& Form <SUBROUTINE NAME> (Ch ữ hoa)

*& -*

* <N ộ i dung x ử lý c ủ a subroutine>

* -*

* <-> LPT_TEXT : <Ý ngh ĩ a c ủ a thông s ố đầ u vào/ra>

* > LPW_IN : <Ý ngh ĩ a c ủ a thông s ố đầ u vào>

* < LPW_OUT : <Ý ngh ĩ a c ủ a thông s ố đầ u ra>

* -*

FORM <SUBROUTINE NAME>

Header c ủ a function module ph ả i đượ c chú thích nh ư sau

** -*

** Function ID: XXXXXX

** Function name: XXXXXXXXXXXXXXX

** RICEFW ID: RM1.2_001 (RICEFW chính c ủ a function module)

** Created by:

** Created date:

** Content explanation: (Mô t ả các n ộ i dung x ử lý chính c ủ a FM)

**

** -*

**< Modification tracking >

** Modification number: XXXXXXXXX

** Modification day:

** Modification reason: (Mô t ả lý do thay đổ i FM sau khi đ ã release sang môi tr ườ ng test)

**

** -*

Trang 12

II.3.4.5 Theo dõi sự thay đổi của source code

M ộ t ch ươ ng trình ho ặ c m ộ t Function Module sau khi đ ã đượ c chuy ể n sang môi tr ườ ng test

ho ặ c production có th ể phát sinh l ỗ i ho ặ c yêu c ầ u thay đổ i ch ươ ng trình Trong tình hu ố ng

nh ư v ậ y, c ầ n ph ả i ghi nh ậ n nh ữ ng thay đổ i đ ó trong source code để có th ể theo dõi Quy trình này đượ c th ự c hi ệ n nh ư sau

function module

Khi có s ự thay đổ i thì developer ph ả i thêm chú thích vào ch ươ ng trình chính ho ặ c function module nh ư sau

** -*

**< Modification tracking >

** Modification number: A00000001 (S ố BUG ho ặ c s ố thay đổ i yêu c ầ u)

** Modification day: 12/12/2009

** Modification reason: (Mô t ả lý do thay đổ i FM sau khi đ ã release sang môi tr ườ ng test)

**

** -*

**< Modification tracking >

** Modification number: A00000002 (S ố BUG ho ặ c s ố thay đổ i yêu c ầ u)

** Modification day: 15/12/2009

** Modification reason: (Mô t ả lý do thay đổ i FM sau khi đ ã release sang môi tr ườ ng test)

**

Trang 13

** -Thêm và thay đổi một dòng code

Khi có yêu c ầ u thêm hay thay đổ i m ộ t dòng code thì ph ả i chú thích nh ư sau

Ví d ụ :

Tr ướ c khi thay đổ i

WRITE :/01 TEXT-001

Sau khi thay đổi

* <Modification Number> <Modification Date> <Modification By> - START

* WRITE :/01 TEXT-001 DEL XXXXXXXX

WRITE :/01 TEXT-002 “ ADD XXXXXXXX

* <Modification Number> <Modification Date> <Modification By> - END

Tuyệt đối không xóa code cũ Trong trường hợp code mới phải xóa rất nhiều code cũ thì tạo phiên bản mới và xóa code cũ đi

III Hướng dẫn đặt tên cho đối tượng

III.1 CÁC QUY T Ắ C CHUNG

Quy tắc đặt tên của tài liệu này dựa vào một số tiêu chuẩn sau

III.1.1 Quy t ắ c đặ t tên c ủ a SAP

Công ty SAP đ ã đặ t ra m ộ t s ố quy t ắ c đặ t tên cho các đố i t ượ ng bên trong h ệ th ố ng SAP Trong đ ó bao g ồ m quy t ắ c đặ t tên cho các ch ươ ng trình chu ẩ n c ủ a SAP và các ch ươ ng trình

m ớ i c ủ a khách hàng Do đ ó khi đặ t tên cho các đố i t ượ ng m ớ i, chúng ta ph ả i đặ t bi ệ t chú ý

đế n quy t ắ c này Đ i ề u này là đặ c bi ệ t c ầ n thi ế t B ở i vì trong t ươ ng lai s ẽ có các yêu c ầ u v ề

nâng c ấ p h ệ th ố ng SAP ho ặ c c ậ p nh ậ t các gói h ỗ tr ợ c ủ a SAP N ế u không tuân th ủ thì các gói này s ẽ ả nh h ưở ng đế n các đố i t ượ ng mà chúng ta đ ã phát tri ể n thêm

III.1.2 Đả m b ả o vi ệ c phát tri ể n và v ậ n hành đượ c thu ậ n l ợ i

Tên nên đượ c phân chia theo đố i t ượ ng để khi nhìn vào tên có th ể bi ế t tên đ ó thu ộ c lo ạ i đố i

t ượ ng nào Ví d ụ ZDD cho data element, ZDO cho domain, v.v… Tên c ủ a đố i t ượ ng không

nh ấ t thi ế t bao hàm n ộ i dung c ủ a đố i t ượ ng đ ó

Nh ằ m tránh vi ệ c đụ ng độ ho ặ c chép đ è khi nâng c ấ p SAP, tên c ủ a các đố i t ượ ng phát tri ể n

m ớ i không nên n ằ m ngoài ph ạ vi mà SAP cho phép

III.2 QUY T Ắ C ĐẶ T TÊN

Các quy t ắ c sau đ ây đượ c dùng để đặ t tên cho các đố i t ượ ng trong quá trình phát tri ể n m ớ i các ứ ng d ụ ng SAP Các đố i t ượ ng không đượ c đề c ậ p đế n thì theo quy t ắ c đặ t tên chu ẩ n c ủ a SAP

III.2.1 Quy t ắ c đặ t tên chung

Tên c ủ a các đố i t ượ ng có đị nh d ạ ng nh ư sau

No Tên Thành Phần Kí hiệu Nội Dung

1 Tiền tố theo quy tắc của

SAP(1 ký tự) <R>

Tiền tố này có thể có hoặc không phụ thuộc vào yêu cầu của SAP Tham khảo

Ngày đăng: 24/02/2014, 16:20

HÌNH ẢNH LIÊN QUAN

Từ màn hình ABAP Editor (SE38 hoặc SE80), chọn Utilities-&gt;Settings... - Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx
m àn hình ABAP Editor (SE38 hoặc SE80), chọn Utilities-&gt;Settings (Trang 5)
II.2.1 Tên biến trên màn hình Selection Screen - Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx
2.1 Tên biến trên màn hình Selection Screen (Trang 6)
II.2 Cách đặt tên biến trong chương trình - Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx
2 Cách đặt tên biến trong chương trình (Trang 6)
Các trường * Các trường trên màn hình phải được thiết kế từ - Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx
c trường * Các trường trên màn hình phải được thiết kế từ (Trang 7)
EZLOBUT00 là tên một lock object của bảng BUT00. - Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx
00 là tên một lock object của bảng BUT00 (Trang 14)
III.2.2 Tiền tố theo quy tắc của SAP(Kí hiệu &lt;R&gt;) - Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx
2.2 Tiền tố theo quy tắc của SAP(Kí hiệu &lt;R&gt;) (Trang 14)
Tên field phải thống nhất với tên field của các bảng chuẩn và các table khác. Ví dụ BUKRS mô tả thông tin company code, GPART mô tả  thông tin của business partner - Tài liệu FIS-ERP TIÊU CHUẨN VIẾT MÃ CHƯƠNG TRÌNH SAP VERSION 0.01 docx
n field phải thống nhất với tên field của các bảng chuẩn và các table khác. Ví dụ BUKRS mô tả thông tin company code, GPART mô tả thông tin của business partner (Trang 16)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w