Enquiry PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 26

TÀI LIỆU ENQUIRY

I. Enquiry desktop

1. Giới thiệu về ENQUIRY


Enquiry là một công cụ phát triển trong T24 cho phép lấy ra các thông
tin có trong T24 để xây dựng các báo.

2. Tạo ENQUIRY đơn giản

· Để tạo một vấn tin ta dung một trong 2 cách sau:


+ Tại dòng lệnh, gõ ENQUIRY,DESIGNER

+ Click vào tool/Enquiry Designer

1
· Ý nghĩa một số trường chính :
+ ID : Tên Enquiry
+ File Name: Tên bảng cần lấy dữ liệu ra
+Predfined Selection: Điều kiện tìm kiếm cố định
+ Predefined Sort: Sắp xếp theo trường
+ Selection field : Danh sách các trường dung cho điều kiện lọc
+ Name: tên cột do bạn tự định nghĩa, có thể trùng với tên
trường
+ Headding: tiêu đề cho cột, Nếu trường này để trống thì hệ
thống lấy trường Name làm tiêu đề
+ operation: Tên trường hoặc các lệnh tính toán
+ Col: Dòng và cột thể hiện dữ liệu.
+ Attributes:Gồm các giá trị
· để trống: Dữ liệu hiển thị dạng lưới và theo từng trang ( có
thể xuất ra file excel )
· ALL DATA: Dữ liệu hiển thị theo dạng lưới và load luôn
toàn bộ dữ liệu( có thể xuất ra file excel )
· PAGE : dũ liệu hiển thị theo dạng trang ( không thể xuất
ra file excel )
+ Header: Dùng cho tiêu đề của vấn tin hoạc tiêu đề của cột.
Định dạng: @(cot,hang) text.
Ví dụ 1: Viết một vấn tin hiển thị các thông tin sau: Mã khách hàng, tên
khách hàng, địa chỉ, Thông tin hiển thị dưới dạng lưới.

2
LG:

Ví dụ 2: Phát triển thêm ở ví dụ 1, thêm yêu cầu phải lọc dữ lieu


theo mã khách hàng với hai toán tử là EQ và NE

LG:

3
Ví dụ 3: Tương tự ví dụ 1 nhưng hiển thị dữ liệu dưới dạng sau:

NGAN HANG THUONG MAI CO PHAN AN BINH

Mã khách hàng tên khách hàng địa chỉ


Xxxxxxxxxxxx xxxxxxxxxxxxx xxxxxx
. . .
. . .
. . .
Xxxxxxxxxxxxx xxxxxxxxxxxxx xxxxxxx

LG:

4
5
6
Kết quả hiển thị :

3. Lấy dữ liệu từ ứng dụng khác


Để lấy được dữ liệu thì bảng chính phải chứa trường làm ID của
ứng dụng cần liên kết để lấy dữ liệu.
Cài đặt:
Trường operation đặt là trường trên bảng chính mà là ID
của ứng dụng cần liên kết để lấy dữ liệu
Trường conversion: định dạng LINK ( hoặc L) X Y với X
là tên bảng cần liên kết để lấy dữ liệu, Y là tên trường hoặc số
hiệu của trường cần lấy dữ liệu ra trên bảng X.
Ví dụ 4: Viết vấn tin lấy ra các thông tin sau: Số tài khoản khách hàng, mã
khách hàng, số chứng minh thư nhân dân, số dư working.balance.
LG:

7
4. Liên kết (DrillDown)
Dữ liệu của một vấn tin có thể được sử dụng như đièu kiện lọc
cho vấn tin khác. Bằng cách click đúp vào trường được chọn, bạn có
thể gọi được vấn tin con liên kết với vấn tin đó thông qua trường liên
kết.
Cài đặt:

Ví dụ 5: Tạo một vấn tin hiển thị các thông tin sau: số tài khoản,mã khách
hàng,số dư working.balance sao cho khi click đúp vào mã khách hàng thì hệ
thống gọi vấn tin ở ví dụ 1.
8
LG:

9
10
5. Ngắt trang, nhóm và Tính toán
- Ngắt trang: Vấn tin có thể ngắt trang với mỗi lần giá trị của trường
thay đổi ( ví dụ mỗi khi đồng ngoại tệ thay đổi )
Để có thể ngắt trang thì ta cần định nghĩa các trường sau:
+ Trường dữ liệu sẽ ngắt tại đó ( cần phải được sắp xếp ). Ví dụ
CURRENCY
+ Trường ngắt trang liên kết với trường dữ liệu B C
CURRENCY
+ Trường hiển thị giá trị ngắt
- Tính toán : Enquiry cho phép sử dụng hàm sau trong trường
operation
· CALC X + ( -,*,/,: ) Y : trả về kết quả cộng ( trừ, nhân, chia,
nối ) X với
Y. Với X và Y là tên trường do người dùng định nghĩa.
· IF X EQ ( NE,LE,GT,…) Y A B: Nếu thỏa mãn điều kiện X
bằng Y (hoặc khác hoặc lớn hơn…) thì trả về A, ngược lại thì trả
về B.
- Nhóm: Để nhóm một trường ta dùng cấu trúc B C XXX (với XXX
là tên trường ) trong trường operation . Ví dụ nhóm tất cảc các
trường có cùng currency trong bảng Account : B C CURRENCY
- Tính tổng: Để tính tổng trước hết ta cần nhóm các trường cần tính
tổng vào một nhóm sau đó dùng cấu trúc TOTAL XXX ( với XXX
là trường cần tính tổng )

11
Ví dụ 6: Viết một vấn tin thể hiện các thông tin sau: số tài khoản,
working.balance,loại ngoại tệ. Sau đó tính tổng của từng loại ngoại tệ một.

LG:

12
II. Enquiry Routine

Bao gồm 2 loại : CONVERSION ROUTINES VÀ BUILD ROUTINES


1. CONVERSION ROUTINES
- Loại này giúp thao tác dữ liệu trước khi trả về cho một trường.
- Mỗi trường có thể gắn với một ROUTINE
Thư viện và các biến quan trọng:
- Thư viện I_ENQUIRY.COMMON
- Biến O.DATA: Biến này được định nghĩa trong
I_ENQUIRY.COMMON, biến này nhận giá trị của trường được
13
gắn ROUTINE khi bắt đầu triệu gọi và trả về giá trị cho trường đó
khi kết thúc ROUTINE.
- Biến R.RECORD: Biến này được định nghĩa trong
I_ENQUIRY.COMMON, biến này là mảng lưu trữ dữ liệu của bản
ghi gắn liền với ID được trả về. Như vậy, có bao nhiêu bản ghi
được trả về thì giá trị của mảng sẽ thay đổi bấy nhiêu lần.
Cách lấy dữ liệu: Gọi n là số hiệu trường, m là số hiệu trường
multi value, l là số hiệu trường subvalue, cách truy nhập như sau
+ R.RECORD<n>
+ R.RECORD<n,m>
+ R.RECORD<n,m,l>

Cách gắn ROUTINE vào ENQUIRY:


- Gắn vào ENQ: trường CONVERSION, định dạng:@ tên routine

Ví dụ 7: Tạo một vấn tin liệt kê ra các giá trị sau:


- Mã khách hàng
- Số tài khoản
- Tên khách hàng
- Working balance
- Type ( type=’TAI KHOAN THANH TOAN’ nếu category=1001,
category=6001 thì type=’TAI KHOAN TIET KIEM’ ngược lại thì
hiển thị ‘TAI KHOAN KHAC’

LG: Các thông tin yêu cầu nằm trong bảng ACCOUNT.
Viết Routine gắn vào cột Type vói nội dung như sau:
SUBROUTINE AC.RTN.TYPE
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_ENQUIRY.COMMON
$INSERT I_F.ACCOUNT

Y.CATE=R.RECORD<AC.CATEGORY>
BEGIN CASE
CASE Y.CATE EQ 1001
O.DATA='TAI KHOAN THANH TOAN'
CASE Y.CATE EQ 6001
O.DATA='TAI KHOAN TIET KIEM'

14
CASE 1
O.DATA='TAI KHOAN KHAC'
END CASE
RETURN
END

Thiết kế Enquiry như hình dưới

Ví dụ 8: Viết một vấn tin lấy ra các thông tin sau: Số tài khoản, tên khách
hàng, loaij tiền tệ, số tiền Working Balance,số tiền chuyên đổi nếu là ngoại tệ

15
( với nhứng tài khoản ngoại tệ thì chuyển đổi về số tiền nội tệ sau đó hiển thị
ra, với đồng nội tệ thì giữ nguyên )
LG:
Phân tích: Bảng ACCOUNT có trường CURRENCY thể hiện loại tiền tệ. Từ
đó có thể xác đinh được đó là nội tệ hay ngoại tệ. Nếu là ngoại tệ thì link đến
bảng CURRENCY để lấy ra tỉ giá.

Viết và biên dịch ROUTINE sau:

SUBROUTINE AC.RTN.BALANCE
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_ENQUIRY.COMMON
$INSERT I_F.ACCOUNT
$INSERT I_F.CURRENCY

FN.CCY='F.CURRENCY'
F.CCY=''
CALL OPF(FN.CCY,F.CCY)

Y.CCY=R.RECORD<AC.CURRENCY>
IF Y.CCY NE 'VND' THEN
CALL F.READ(FN.CCY,Y.CCY,R.CCY,F.CCY,ERR.CCY)
Y.MID.RATE=R.CCY<EB.CUR.MID.REVAL.RATE,1>
O.DATA=R.RECORD<AC.WORKING.BALANCE>*Y.MID.RATE
END

RETURN
END

Thiết kế ENQ

16
2. BUILD ROUTINE

- Dùng để can thiệp vào điều kiện tìm kiếm


- Routine được gọi sau khi điều kiện tìm kiếm cố định được thực hiện
và trước khi điều kiện tìm kiếm động được gọi đến.

17
( Bảng điều kiện tìm kiếm)
- ROUTINE phải có một tham số truyền vào là ENQ.DATA, đây là
một mảng động được khai báo trong I_ENQUIRY.COMMON. Các
giá trị của biến này có ý nghĩa như sau:
ENQ.DATA<1,i> : Tên của Enq
ENQ.DATA<2,i> : Trường được lựa chọn để tìm kiếm
ENQ.DATA<3,i> : Toán tử tìm kiếm
ENQ.DATA<4,i> : giá trị tìm kiếm
(i=1,2,3… tương ứng với thứ tự hàng trong bảng điều kiện )
- Như vậy, khi điều kiện tìm kiếm được người dùng nhập vào và phát
lênh thực hiện thì các giá trị nhập vào đó sẽ được truyền vào mảng
ENQ.DATA. Trong ROUTINE ta sẽ thực hiện lệnh gán điều kiện
động vào tiếp sau hàng các điều kiện tĩnh.
- ROUTINE được gắn vào trường 12.1
Ví dụ 9: Tạo một vấn tin hiển thị thông tin số tài khoản, category và số dư
thực tương ứng , sau khi người sử dụng nhập category vào
Với category 1001- Lọc các tài khoản có số dư lớn hơn 0 và nhỏ hơn 100
triệu
Với category 6001 – Lọc các tài khoản có số dư lớn hơn 200 triệu

18
Với các category khác- Lọc lấy các tài khoản có số dư nhỏ hơn 0
LG:
Viết và biên dịch ROUTINE sau:
SUBROUTINE AC.RTN.BUILD.1(ENQ.DATA)
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_ENQUIRY.COMMON

LOCATE "CATEGORY" IN ENQ.DATA<2> SETTING Y.CAT.POS


Y.CATEGORY = ENQ.DATA<4,Y.CAT.POS>

Y.FIELDS.COUNT = DCOUNT(ENQ.DATA<2>,VM) +1

ENQ.DATA<2,Y.FIELDS.COUNT> = "WORKING.BALANCE"
BEGIN CASE
CASE Y.CATEGORY = 1001
ENQ.DATA<3,Y.FIELDS.COUNT> = "RG"
ENQ.DATA<4,Y.FIELDS.COUNT> = "0 100000000"

CASE Y.CATEGORY = 6001


ENQ.DATA<3,Y.FIELDS.COUNT> = "GT"
ENQ.DATA<4,Y.FIELDS.COUNT> = "200000000"

CASE 1
ENQ.DATA<3,Y.FIELDS.COUNT> = "LE"
ENQ.DATA<4,Y.FIELDS.COUNT> = "0"
END CASE

RETURN
END
Thiết kế ENQ:

19
20
III. Enquiry nofile
- Sử dụng NOFILE để tạo vấn tin phức tạp yêu cầu phải lấy dữ liệu từ
nhiều bảng mà có thể không có các trường liên kết với nhau.
- Tất cả dữ liệu cần hiển thị đều lấy ra từ ROUTINES

Các bước thực hiện:


- Viết ROUTINES :
+ ROUTINE cần có một biến trả về, biến này là một mảng động.
Mảng trả về này sẽ lưu trữ các thông tin cần hiển thị trên
ENQUIRY.
+ Mỗi phần tử của một mảng sẽ tương đương với một hàng trên
ENQUIRY, thông tin giữa các cột cần phân tách nhau với một ký tự (Hoặc
một chuỗi) nào đó mà khó có khả năng trùng lặp ở dữ liệu ( ví dụ : #, *,$,|…)
+ Để them dữ liệu vào một mảng động ta có thể dùng cấu trúc:
ARR_VAR<-1>=data. Khi đó data sẽ được chèn vào phần tử tiếp theo của
mảng ARR_VAR.
+ Biến D.FIELDS là mảng lưu trữ tên các trường chọn trong truy
vấn
+ Biến D.RANGE.AND.VALUE là mảng lưu trữ giá trị được
gán cho trường lựa chọn.
- Đăng ký trong STANDAR.SELECTION:

21
ID của bản ghi phải có dạng NOFILE.XXXXX
Sử dụng các trường sau:
15 - Usr Field Name :Tên trường ROUTINE hoặc trường lựa
chọn.
16- Usr Type: R – nếu là ROUTINE, S – nếu là trường chọn
trong hộp điều kiện
17- Usr Field No: Tên của ROUTINE nếu là trường loại R, để
trống nếu là trường loại S.
20- Usr Display Fmt: Định dạng dữ liệu hiển thị
24- Usr Single Mult: S- trường single value, M- trường Multi
value
Ví dụ:

- Thiết kế ENQUIRY
+ Trường File Name: Tên đăng ký trong
STANDAR.SELECTION
+ Predfined Selection: Tên trường ROUTINE trong
STANDAR.SELECTION ( trường 15.1 )
+ Selection field: Các trường cần lọc dữ liệu ( các trương
15.1,15.2,… trong STANDAR.SELECTION)
+ Operation: 0
+ Conversion: có dạng F limitStr,colNum,numCol
limitStr: ký tự phân cách giữa các trường (thường là #,*,…)
colNum:phần tử thứ colNum

22
numCol: lấy numCol phần tử tính từ phần tử colNum( thường
là 1)

Ví dụ 10: Viết một vấn tin lấy ra tất cả giao dịch của một tài khoản trong
ngày hôm nay và ngày hôm qua, Các thông tin đưa ra bao gồm: Số tài khoản,
số giao dịch, số tiền, ngày hạch toán. Biết các thông tin sau:
Các giao dịch của ngày hôm nay được lưu trong bảng ACCT.ENT.TODAY,
còn các giao dịch của ngày hôm qua được lưu trong bảng
ACCT.ENT.LWORK.DAY

LG:
Viết ROUTINE:
SUBROUTINE AC.RTN.NOFILE.1(Y.DATA)
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_ENQUIRY.COMMON
$INSERT I_F.STMT.ENTRY

FN.ACCT.TODAY='F.ACCT.ENT.TODAY'
F.ACCT.TODAY=''
CALL OPF(FN.ACCT.TODAY,F.ACCT.TODAY)

FN.ACCT.LAST='F.ACCT.ENT.LWORK.DAY'
F.ACCT.LAST=''

CALL OPF(FN.ACCT.LAST,F.ACCT.LAST)
FN.STMT='F.STMT.ENTRY'
F.STMT=''
CALL OPF(FN.STMT,F.STMT)

Y.ACCT.ID=''
LOCATE "ACCOUNT" IN D.FIELDS SETTING CUS.POS THEN
Y.ACCT.ID = D.RANGE.AND.VALUE<CUS.POS>
END

23
CALL
F.READ(FN.ACCT.TODAY,Y.ACCT.ID,R.ACCT.TODAY,F.ACCT.TOD
AY,ERR.TODAY)
LOOP
REMOVE Y.STMT.ID FROM R.ACCT.TODAY SETTING POS1
WHILE Y.STMT.ID:POS1
GOSUB LOAD.DATA
REPEAT

CALL
F.READ(FN.ACCT.LAST,Y.ACCT.ID,R.ACCT.LAST,F.ACCT.LAST,ER
R.LAST)
LOOP
REMOVE Y.STMT.ID FROM R.ACCT.LAST SETTING POS2
WHILE Y.STMT.ID:POS2
GOSUB LOAD.DATA
REPEAT

RETURN

LOAD.DATA:
CALL F.READ(FN.STMT,Y.STMT.ID,R.STMT,F.STMT,ERR.STMT)
Y.AC=R.STMT<AC.STE.ACCOUNT.NUMBER>
Y.TRAN.REF=R.STMT<AC.STE.OUR.REFERENCE>
Y.AMT=R.STMT<AC.STE.AMOUNT.LCY>
Y.DATE=R.STMT<AC.STE.BOOKING.DATE>
Y.DATA<-1>=Y.AC:'#':Y.TRAN.REF:'#':Y.AMT:'#':Y.DATE
RETURN
END

Đăng ký trong STANDAR.SELECTION

24
Thiết kế trong ENQUIRY:

25
26

You might also like