You are on page 1of 138

1 LỊCH SỬ

Ngày Người cập nhật Phiên Thay đổi


bản
10-jan-19 Nguyễn Văn Biên 1.0 Tạo mới
15-jan-19 Nguyễn Văn Biên 1.1 Total commander
9-mar-19 Nguyễn Văn Biên 1.3 BI Publisher 12
15-mar-19 Nguyễn Văn Biên 1.4 Đặt phím tắt cho WinSCP
8. File .bat hay dùng
9. Start file cùng windows và auto hotkey
2 GIỚI THIỆU
 Tài liệu này hướng dẫn sử dụng các công cụ của kỹ thuật và một số câu lệnh hữu ích
cho cả kỹ thuật và nghiệp vụ
o Winscp
o Notepad++
o Plsql developer
o Totalcommand
o BI Publisher

723226984.doc Trang 2 / 138


3 WINSCP
 Là công cụ để remote vào server linux

3.1 Lưu trữ cấu hình ra file .ini


 Mục đích để nếu có cài đặt lại OS (hệ điều hành) thì không phải cấu hình lại, cách
làm như sau:
o Chọn Tools\preferences

Hình 1
o Chọn storage\ Configuration storage \ chọn INI file

Hình 2

723226984.doc Trang 3 / 138


3.2 Tách việc lưu đường dẫn server cho từng môi trường trên cùng 1 server
để tránh việc copy nhầm file
 Trên 1 server có môi trường test và prod rất dễ nhầm đường dẫn, nhiều khi đường
dẫn lại đặt sai ý nghĩa hoặc không rõ ràng
 Nguyên tắc lưu đường dẫn của winscp theo host name, do đó nếu hostname dùng
chung IP sẽ bị lưu đường dẫn lẫn vào nhau

Hình 3
 Cách làm như sau:
o Thêm hostname vào file host của window (c:\Windows\System32\drivers\etc\
hosts)
o Tạo site mới của winscp theo hostname
o Chi tiết hình ảnh:

Hình 4 Thêm hostname

723226984.doc Trang 4 / 138


Hình 5 Tạo site mới

3.3 Đặt phím tắt


Hình 6

723226984.doc Trang 5 / 138


Hình 7

723226984.doc Trang 6 / 138


4 Toltal commander
 Là công cụ để quản lý thư mục:
o Mở cùng lúc nhiều thư mục
o Lưu đánh dấu (bookmark)
o Copy tên file hoặc tên file cùng đường dẫn của nó
o Lưu danh sách các file đã chọn để lần tới có thể chọn lại đúng các file đó
o Tìm kiếm file nhanh chóng, tìm được cả theo text trong những
file .fmb, .rdf, .doc, .docx, .xls, .xlsx, .txt, ...
o ....
 Giao diện toltal commander 9.0

Hình 8

4.1 Cấu hình hay dùng

Hình 9 vào phần cấu hình

723226984.doc Trang 7 / 138


Hình 10 Chọn thao tác chuột giống chuẩn window

723226984.doc Trang 8 / 138


Hình 11 Chọn tìm kiếm nhanh với cách gõ ký tự

723226984.doc Trang 9 / 138


4.2 Thực hiện tìm kiếm nhanh file, thư mục trong thư mục hiện hành

Hình 12 Thực hiện tìm kiếm nhanh bằng cách gõ chữ (m)
 Thực hiện tìm kiếm với tùy chọn filter để lọc kết quả tìm kiếm, nếu muốn hiển thị
lại hết thì xóa ký tự đang tìm kiếm đi

723226984.doc Trang 10 / 138


Hình 13 Thực hiện tìm kiếm với filter
 Chú ý biểu tượng ở hình dưới là thư mục đang filter kết quả tìm kiếm

Hình 14

723226984.doc Trang 11 / 138


 Muốn hiển thị lại toàn bộ file và thư mục thì gõ 1 ký tự bất kỳ để bật hộp thoại quick
search và xóa hết ký tự đi

Hình 15

4.3 Mở thêm thư mục


 Mỗi 1 tab là 1 thư mục

723226984.doc Trang 12 / 138


Hình 16

723226984.doc Trang 13 / 138


4.4 Ý nghĩa một số thao tác với tab

Hình 17
 Duplicate this tab: mở thêm 1 tab là thư mục như tab hiện tại
 Rename/Lock tab: cho phép đổi tên tab cho dễ nhớ và có thể lock lại

723226984.doc Trang 14 / 138


Hình 18
 Save tabs to file: lưu lại các tab ở phía được lựa chọn
 Save tabs on both sides to file: lưu lại các tab ở cả 2 phía
 Load tabs from file, keep current: mở lại danh sách các tab từ những file đã lưu và
giữ lại tab hiện hành
 Load tabs from file, replace tabs: mở lại danh sách tab từ những file đã lưu, thay thế
hết những tab đang có
o Việc này có ích đối với người có nhiều nhóm công việc khác nhau, với mỗi
nhóm công việc cần mở nhiều thư mục khác nhau
o Ví dụ dưới lưu các thư mục cho việc cấu hình các công cụ phát triển

Hình 19
 Close this tab (ctrl + W): đóng tab hiện thời
 Close all tab (ctrl + shift + W): đóng tất cả tab trừ tab hiện thời

723226984.doc Trang 15 / 138


4.5 Lưu đánh dấu (bookmark)

Hình 20

Hình 21
 Từ 1 tab bất kỳ gọi tới thư mục đã đánh dấu từ trước

Hình 22
 Kết quả sau khi chọn

Hình 23

723226984.doc Trang 16 / 138


4.6 Copy tên file, tên file cùng đường dẫn

Hình 24 Copy tên file --> kết quả khi paste: tnsnames.ora

Hình 25 Copy tên file cùng đường dẫn --> kết quả khi paste: c:\ora_soft\dev\dev10gr2\NETWORK\
ADMIN\tnsnames.ora

4.7 Lưu danh sách các file đã chọn


 ví dụ trong thư mục Perp_Scripts có các file check dữ liệu của rất nhiều các phân hệ,
giờ chỉ muốn chọn các file check phần INV để chạy (chọn file rồi kéo thả sang plsql
developer), nhưng lần sau muốn check lại phải đi chọn lại --> có nhu cầu lưu lại
danh sách các file đã chọn

723226984.doc Trang 17 / 138


 Chọn nơi lưu file, nhập tên file và lưu lại

723226984.doc Trang 18 / 138


 Lần tới muốn chọn lại, đầu tiên chuyển tới thư mục PERP_Scripts

723226984.doc Trang 19 / 138


723226984.doc Trang 20 / 138
4.8 Tìm kiếm file
 Chuyển tới thư mục muốn tìm kiếm, rồi thao tác

 Ở đây có 2 lựa chọn


o Search...: Trong lúc tìm kiếm thì không thao tác được total commander, khi tìm
xong không lưu lại được danh sách kết quả

723226984.doc Trang 21 / 138


o Search in seperate process...: Trong lúc tìm kiếm vẫn thao tác được total
commander --> nên sử dụng cách này

723226984.doc Trang 22 / 138


4.9 Backup file lưu cấu hình wincmd.ini
 Mặc định file lưu cấu hình để trong thư mục users của OS (hệ điều hành – windows)
nên khi cài lại OS sẽ bị mất file này --> tạo lại rất mất công, do đó cần phải backup

 tìm file lưu cấu hình

723226984.doc Trang 23 / 138


 Thỉnh thoảng vào đó copy lại file wincmd.ini

4.10 Đặt phím tắt


 ví dụ đặt phím tắt F3 để copy Fullname with path
 B1

 B2

723226984.doc Trang 24 / 138


 B3

723226984.doc Trang 25 / 138


 B4

723226984.doc Trang 26 / 138


 Muốn làm cho command khác thì lặp lại từ bước B2 đến B4

4.11 Một số phím tắt mặc định


 Ctrl + phím mũi tên phải: hiển thị nội dung thư mục con của thư mục đang chọn tab
bên trái vào tab bên phải
 Ctrl + phím mũi tên trái: ngược với bên trên, hiển thị nội dung thư mục con của thư
mục đang chọn tab bên phải vào tab bên trái
 Cltr + U: đổi chỗ 2 tab hiện thời của 2 bên

723226984.doc Trang 27 / 138


5 Tortoise SVN client
 Là công cụ để kiểm soát version

5.1 Cấu hình context menu để tiện chọn khi chuột phải
 context menu là vùng như hình dưới khi chuột phải

 các bước cấu hình:

723226984.doc Trang 28 / 138


723226984.doc Trang 29 / 138
723226984.doc Trang 30 / 138
5.2 Cấu hình để lấy thời gian last commit date cho file

723226984.doc Trang 31 / 138


5.3 Check lock

723226984.doc Trang 32 / 138


Hình 26
 Đầu tiên nó sẽ hiển thị mặc định những gì mà PC này đang lock, muốn hiển thị tất
cả những module mà người khác lock nhấn button check repository

723226984.doc Trang 33 / 138


Hình 27

Hình 28
 Để bẻ khóa trong trường hợp bắt buộc (người lock nghỉ rồi, ...), hạn chế việc này để
tránh mất source

Hình 29

723226984.doc Trang 34 / 138


6 Dev12c (Fusion Middleware 12c)
 Là công cụ form builder 12c để phát triển ứng dụng

6.1 Hướng dẫn cài đặt


 Bắt đầu cài đặt, chạy file setup_fmw_12.2.1.1.0_fr_win64.exe

723226984.doc Trang 35 / 138


723226984.doc Trang 36 / 138
723226984.doc Trang 37 / 138
723226984.doc Trang 38 / 138
723226984.doc Trang 39 / 138

Hình 30 Khả năng nếu không check chọn cái ở trên thì chạy file “c:\ora_soft\dev\dev12c\
forms\common\bin\config_builder.cmd” chắc cũng ok

723226984.doc Trang 40 / 138


c:\ora_soft\dev\dev12c\forms-ins\

723226984.doc Trang 41 / 138


6.2 Hướng dẫn cấu hình
 tns_names: nằm trong thư mục c:\ora_soft\dev\dev12c\forms-ins\
 mặc định khi cài đặt dev12c không tạo ra FORMS_PATH và NLS_LANG trong
registry do đó phải tự thêm thủ công (Bước này vẫn cần thiết kể cả khi gọi dev12c từ
file .bat, xem cách tạo file .bat ở dưới)
 Gọi cửa sổ Run: phím cửa sổ + phím R

Hình 31 nhập vào regedit


723226984.doc Trang 42 / 138


Hình 32

Hình 33
 Điền đường dẫn phù hợp

Hình 34

723226984.doc Trang 43 / 138


 Tương tự tạo ra string value “NLS_LANG” có giá trị là
“AMERICAN_AMERICA.UTF8”
 Gọi dev12c: <HOME Dev12c>\bin\frmbld.exe

6.3 Hướng dẫn gỡ


 Tham khảo: https://www.youtube.com/watch?v=sU7R-8lpgrY
 Chạy file “c:\ora_soft\dev\dev12c\oui\bin\deinstall.cmd” với quyền administrator

723226984.doc Trang 44 / 138


723226984.doc Trang 45 / 138
7 BI PUBLISHER 12
 Là công cụ phát triển báo cáo
 Lưu ý: nó khác logic của BI pulisher 10

7.1 Hướng dẫn cài đặt BI Desktop để lập trình template layout (.rtf)

7.1.1 Kiểm tra phiên bản word trên máy là 32bit hay 64bit để cài đặt đúng
version BI desktop
 word 2010

 word 2016

723226984.doc Trang 46 / 138


7.1.2 Cài đặt Version 64bit

7.1.2.1 Hướng dẫn cài đặt


 Đóng tất cả các chương trình của microsoft như: outlook, excel, word, ... (Nếu đang
xem file hướng dẫn bằng word thì save as file sang định dạng .pdf rồi đóng word lại)
 Chạy file “BIPublisherDesktop64_12c_64bit.exe” (có thể download tại link:
https://drive.google.com/open?id=1_qBikfMoS2hjkiwYq-G5hZ5h3vwHCq12)

723226984.doc Trang 47 / 138


Hình 35

Hình 36

Hình 37

723226984.doc Trang 48 / 138


Hình 38

Hình 39
 Nếu cài đặt thành công thì mở word lên sẽ có add-ins như hình dưới

723226984.doc Trang 49 / 138


Hình 40
 Để tránh một số lỗi không mong muốn cần thêm cấu hình sau (Nếu 32bit không có
mục cấu hình này thì bỏ qua)

723226984.doc Trang 50 / 138


7.1.2.2 Hướng dẫn gỡ
 Đóng tất cả các chương trình của microsoft như: outlook, excel, word, ... (Nếu đang
xem file hướng dẫn bằng word thì save as file sang định dạng .pdf rồi đóng word lại)
 Phím cửa sổ + phím R

723226984.doc Trang 51 / 138


7.1.3 Cài đặt Version 32bit

7.1.3.1 Hướng dẫn cài đặt


 Đóng tất cả các chương trình của microsoft như: outlook, excel, word, ... (Nếu đang
xem file hướng dẫn bằng word thì save as file sang định dạng .pdf rồi đóng word lại)
 Chạy file “BIPublisherDesktop.exe” (có thể download tại link:
https://drive.google.com/open?id=1c1e8spU931c9vMOiJIp5DuLYvjZPY9-X)

723226984.doc Trang 52 / 138


 Tương tự cài version 64bit

7.1.3.2 Hướng dẫn gỡ


 Tương tự gỡ cài đặt version 64bit

7.1.4 Xử lý lỗi cài xong không hiển thị được add-ins


 xxx

Hình 41

723226984.doc Trang 53 / 138


 Chưa có kiểm chứng

Hình 42

 xxx

7.2 Hướng dẫn lập trình


 Các bước thực hiện
o Tạo package trong DB
o Tạo folder để chứa báo cáo
o Tạo data model để select dữ liệu cho báo cáo (cái này có thể dùng chung cho
nhiều báo cáo
o Tạo report từ dữ liệu (có thể từ các nguồn dữ liệu khác nhau, ở đây chỉ hướng
dẫn nguồn từ data model) và layout (file template - .rtf).
o Khai báo báo cáo trên ứng dụng

723226984.doc Trang 54 / 138


7.2.1 Tạo package
 Nếu Data model không sử dụng package thì bỏ qua bước này
 Nếu sử dụng package thì chú ý:
o Data model có bao nhiêu tham số thì phải khai hết xuống package phần spec
o Tạo package ở userdb perp5 và grant cho userdb apps rồi sang userdb apps tạo
synonym
o Data model chỉ thấy được các function mà không thấy được procedure của
package gắn với nó
o Trigger before và after data của Data model chỉ thấy function dạng boolean
 Các bước tạo package
o vào plsql và tạo thử (có “create” mà không có “or replace”) để xem package đã
có chưa, nếu có rồi sẽ gặp thông báo sau

o Nếu thành công

723226984.doc Trang 55 / 138


o Tạo tiếp package body

o Chỉnh sửa package mới

723226984.doc Trang 56 / 138


o Lưu lại package

o Khai báo đầy đủ tham số của báo cáo, viết các function cần dùng của báo cáo
rồi compile package (F8) và lưu lại

723226984.doc Trang 57 / 138


o Gán quyền chạy package cho user apps
grant execute on Test_Inv to apps; -- package

o Kết nối sang user apps và tạo synonym


create synonym Test_Inv for PERP5.Test_Inv;

7.2.2 Tạo folder


 Đăng nhập bi publisher server: Link (Đường dẫn) và username/password do hệ
thống cung cấp

723226984.doc Trang 58 / 138


 Tìm thư mục dự án

 Thường là cấp thư mục ngay dưới My Folders sẽ là thư mục của từng môi trường, Ở
đây hướng dẫn làm báo cáo cho môi trường DEV của DMC --> chọn thư mục
DMC_DEV

723226984.doc Trang 59 / 138


 Tạo thư mục phân hệ INV (do chưa có, nếu có rồi thì không phải tạo nữa)

 Tạo folder cho báo cáo TEST_INV

723226984.doc Trang 60 / 138


7.2.3 Tạo Data model
 Tham khảo:
o https://docs.oracle.com/cd/E29542_01/bi.1111/e22258/
struct_data.htm#BIPDM264
o https://docs.oracle.com/middleware/12212/bip/BIPDM/GUID-487E1181-
DC7B-4845-A2F9-A384A9C316E5.htm#BIPDM513

 Tạo nguồn là SQL

723226984.doc Trang 61 / 138


723226984.doc Trang 62 / 138
 Lưu ý tham số:

 Lưu lại Data model

723226984.doc Trang 63 / 138


 Điền package sử dụng cho Data model và lưu lại

7.2.3.1 Tạo Diagram


 Tạo nhóm hàng gồm Mã nhóm hàng và tên nhóm hàng.

723226984.doc Trang 64 / 138


 Sau khi có các nhóm rồi thì có thể kéo thả các trường (field, item) từ group này qua
group khác
 Tạo trường tổng số lượng Item trong mỗi nhóm hàng

 Chỉnh sửa thuộc cho cột

723226984.doc Trang 65 / 138


 Tạo trường tổng số lượng tất cả mặt hàng của báo cáo

723226984.doc Trang 66 / 138


723226984.doc Trang 67 / 138
 Thêm 1 trường sử dụng function trong package DB

723226984.doc Trang 68 / 138


 Lưu ý:
o Ở đây nếu gọi sai function của package phải xóa cả trường đó đi và tạo lại
(không sửa được - lỗi của BI publisher)
o Chỉ gọi được function của package gắn với data model
o Chỉ làm được bước này ở mức report (Global level functions)
o Nếu pl/sql lỗi thì không sinh ra thẻ xml, để xem nguyên nhân lỗi chọn view
engine log xxx

723226984.doc Trang 69 / 138


 Thêm trường tính toán dựa trên các trường khác

723226984.doc Trang 70 / 138


723226984.doc Trang 71 / 138
723226984.doc Trang 72 / 138
7.2.3.2 Xem dữ liệu

 Khi chạy ra được kết quả Cần phải Savas Sample Data để làm báo cáo

723226984.doc Trang 73 / 138


 Lấy dữ liệu ra file data xml để lập trình layout template

 Xem code BI publisher sinh ra

723226984.doc Trang 74 / 138


7.2.4 Tạo layout template bằng microsoft word
 Cần phải cài add-ins cho mircrosoft word (bước hướng dẫn cài đặt BI Desktop ở
trên)
 Tạo file word mới và lưu lại định dạng là .rtf
 Tham khảo ví dụ:
https://docs.oracle.com/cd/E10415_01/doc/bi.1013/e12187/T421739T481157.htm#4
535352

723226984.doc Trang 75 / 138


 Tải dữ liệu data xml ở bước trên vào đây để tạo template layout

 Lấy các trường vào layout

723226984.doc Trang 76 / 138


 font chữ báo cáo thường là “time new roman”, mỗi dự án sẽ có những yêu cầu cụ thể

 Lề của layout template

723226984.doc Trang 77 / 138


 Mỗi dự án sẽ có chuẩn riêng mục này và sẽ tùy thuộc vào số lượng cột trên báo cáo
mà tùy chỉnh cho hợp lý

723226984.doc Trang 78 / 138


 Nên chọn paragraph của cả báo cáo như dưới đây

723226984.doc Trang 79 / 138


 View kết quả: vào add-ins chọn preview ra định dạng mong muốn

723226984.doc Trang 80 / 138


Hình 43
 Các thao tác thêm bớt dòng của bảng, ... là thao tác của word

 Chỉnh sửa field

723226984.doc Trang 81 / 138


o Tên hiển thị nên để tối thiểu 3 ký tự để dễ đúp chuột chỉnh sửa sau này (nếu để
1 ký tự sau này phải cố gắng chọn rồi chuột phải chọn property)
o Nên hight màu đỏ các field: for-each và end for-each, if, end if

 Lưu ý:
o không nên merge dòng, cột trên layout vì khi xuất ra định dạng excel có thể sẽ
bị merge lung tung
o Nếu trên layout cần có nhiều bảng thì số cột trong các bảng nên bằng nhau và
kéo thẳng hàng các cột ở bảng dưới so với bảng trên để khi xuất excel không bị
merge cột

723226984.doc Trang 82 / 138


 Thêm STT cho báo cáo:
o Thêm 1 field vào layout (có thể copy từ field khác) và sửa nội dung là: <?
position()?>

7.2.5 Tạo report


 xxx

 xxx

723226984.doc Trang 83 / 138


 xxx

723226984.doc Trang 84 / 138


 xxx

723226984.doc Trang 85 / 138


 xxx

723226984.doc Trang 86 / 138


 xxx

723226984.doc Trang 87 / 138


 xxx

 Tiến hành upload layout tạo ở bước trên cho báo cáo

 Xóa template cũ

723226984.doc Trang 88 / 138


Hình 44
 xxx

 Tạo template mới

 xxx

723226984.doc Trang 89 / 138


 xxx

 xxx

723226984.doc Trang 90 / 138


 View kết quả

 Nếu không lỗi sẽ được báo cáo mong muốn

7.2.6 Khai báo báo cáo trên ứng dụng


 Khai báo nguồn báo cáo

723226984.doc Trang 91 / 138


 Định nghĩa báo cáo

 Nếu có form tham số gọi báo cáo thì đến đây là xong, ngược lại chạy theo
concurrent thì làm tiếp
 Chọn thêm chế độ chạy và kết xuất

723226984.doc Trang 92 / 138


Hình 45
 xxx

Hình 46
 Khai báo đủ các tham số như trên data model

723226984.doc Trang 93 / 138


Hình 47
 Khai danh sách giá trị
o Một số danh sách đã có:

Hình 48

o Mã quản lý gồm X_Y trong đó


- X là OD nếu kiểu danh sách là Object Database
- X là TY nếu kiểu danh sách là TY
- X là AL nếu kiểu danh sách là Array list
- Y nên là Alias có nghĩa
o Danh sách hiển thị gồm 2 cột là Cột giá trị và Cột mô tả
o Nếu item Trả về giá trị ID không khai báo sẽ trả về giá trị của item “cột giá trị”

Hình 49

723226984.doc Trang 94 / 138


7.3 Layout Template matrix (New Skool Crosstabbing) – Làm pivot table
 Tham khảo: https://blogs.oracle.com/xmlpublisher/new-skool-crosstabbing
A while back I spoke about having to go back to BIP's original crosstabbing solution to achieve a
certain layout. Hok Min has provided a 'man' page for the new crosstab/pivot builder for
10.1.3.4.1 users. This will make the documentation drop but for now, get it here!
The old, hand method is still available but this new approach, is more efficient and flexible. That
said you may need to get into the crosstab code to tweak it where the crosstab dialog can not help.
I had to do this, this week but more on that later.
The following explains how the crosstab wizard builds the crosstab and what the fields inside the
resulting template structure are there for.
To create the crosstab a new XDO command "<?crosstab:...?>" has been created.

XDO Command: <?crosstab: ctvarname; data-element; rows; columns; measures; aggregation?>

Parameter Description Example

Crosstab variable name. This is


Ctvarname C123
automatically generated by the Add-in.

data- This is the XML data element that contains


"//ROW"
element the data.

This contains a list of XML elements for row


headers. The ordering information is
specified within "{" and "}". The first
attribute is the sort element. Leaving it blank
means the sort element is the same as the "Region{,o=a,t=t}, District{,o=a,t=t}"
row header element. The attribute "o" means
order. Its value can be "a" for ascending, or In the example, the first row header is
Rows "d" for descending. The attribute "t" means "Region". It is sort by "Region", order is
type. Its value can be "t" for text, and "n" for ascending, and type is text. The second
numeric. row header is "District". It is sort by
"District", order is ascending, and type
There can be more than one sort elements, is text.
example: "emp-full-name {emp-
lastname,o=a,t=n}{emp-firstname,o=a,t=n}.
This will sort employee by last name and
first name.

Columns This contains a list of XML elements for "ProductsBrand{,o=a,t=t},

723226984.doc Trang 95 / 138


XDO Command: <?crosstab: ctvarname; data-element; rows; columns; measures; aggregation?>

Parameter Description Example

columns headers. The ordering information


is specified within "{" and "}". The first
attribute is the sort element. Leaving it blank
means the sort element is the same as the PeriodYear{,o=a,t=t}"
column header element. The attribute "o"
means order. Its value can be "a" for In the example, the first column header
ascending, or "d" for descending. The is "ProductsBrand". It is sort by
attribute "t" means type. Its value can be "t" "ProductsBrand", order is ascending,
for text, and "n" for numeric. and type is text. The second column
header is "PeriodYear". It is sort by
There can be more than one sort elements, "District", order is ascending, and type
example: "emp-full-name {emp- is text.
lastname,o=a,t=n}{emp-firstname,o=a,t=n}.
This will sort employee by last name and
first name.

This contains a list of XML elements for


Measures "Revenue, PrevRevenue"
measures.

The aggregation function name. Currently,


Aggregation "sum"
we only support "sum".

Using the Oracle BI Publisher Template Builder for Word add-in, we are able to construct the
following Pivot Table:

723226984.doc Trang 96 / 138


The generated XDO command for this Pivot Table is as follow:
<?crosstab:c547; "//ROW";"Region{,o=a,t=t}, District{,o=a,t=t}";
"ProductsBrand{,o=a,t=t},PeriodYear{,o=a,t=t}";
"Revenue, PrevRevenue";"sum"?>
Running the command on the give XML data files generates this XML file "cttree.xml". Each
XPath in the "cttree.xml" is described in the following table.

Element XPath Count Description

This contains elements which are related to


C0 /cttree/C0 1
column.

The first level column "ProductsBrand". There


C1 /cttree/C0/C1 4 are four distinct values. They are shown in the
label H element.

The column-span value. It is used to format the


CS /cttree/C0/C1/CS 4
crosstab table.

The column header label. There are four


H /cttree/C0/C1/H 4 distinct values "Enterprise", "Magicolor",
"McCloskey" and "Valspar".

T1 /cttree/C0/C1/T1 4 The sum for measure 1, which is Revenue.

723226984.doc Trang 97 / 138


T2 /cttree/C0/C1/T2 4 The sum for measure 2, which is PrevRevenue.

The first level column "PeriodYear", which is


C2 /cttree/C0/C1/C2 8 the second group-by key. There are two distinct
values "2001" and "2002".

The column header label. There are two distinct


values "2001" and "2002". Since it is under C1,
H /cttree/C0/C1/C2/H 8
therefore the total number of entries is 4 x 2 =>
8.

T1 /cttree/C0/C1/C2/T1 8 The sum for measure 1 "Revenue".

T2 /cttree/C0/C1/C2/T2 8 The sum for measure 2 "PrevRevenue".

This contains elements which are related to


M0 /cttree/M0 1
measures.

M1 /cttree/M0/M1 1 This contains summary for measure 1.

H /cttree/M0/M1/H 1 The measure 1 label, which is "Revenue".

The sum of measure 1 for the entire xpath from


T /cttree/M0/M1/T 1
"//ROW".

M2 /cttree/M0/M2 1 This contains summary for measure 2.

H /cttree/M0/M2/H 1 The measure 2 label, which is "PrevRevenue".

The sum of measure 2 for the entire xpath from


T /cttree/M0/M2/T 1
"//ROW".

This contains elements which are related to


R0 /cttree/R0 1
row.

R1 /cttree/R0/R1 4 The first level row "Region". There are four


distinct values, they are shown in the label H

723226984.doc Trang 98 / 138


element.

This is row header label for "Region". There


are four distinct values "CENTRAL REGION",
H /cttree/R0/R1/H 4
"EASTERN REGION", "SOUTHERN
REGION" and "WESTERN REGION".

The row-span value. It is used to format the


RS /cttree/R0/R1/RS 4
crosstab table.

The sum of measure 1 "Revenue" for each


T1 /cttree/R0/R1/T1 4
distinct "Region" value.

The sum of measure 1 "Revenue" for each


T2 /cttree/R0/R1/T2 4
distinct "Region" value.

This contains elements from combining R1 and


C1. There are 4 distinct values for "Region",
R1C1 /cttree/R0/R1/R1C1 16
and four distinct values for "ProductsBrand".
Therefore, the combination is 4 X 4 è 16.

The sum of measure 1 "Revenue" for each


T1 /cttree/R0/R1/R1C1/T1 16
combination of "Region" and "ProductsBrand".

The sum of measure 2 "PrevRevenue" for each


T2 /cttree/R0/R1/R1C1/T2 16
combination of "Region" and "ProductsBrand".

This contains elements from combining R1, C1


and C2. There are 4 distinct values for
"Region", and four distinct values for
R1C2 /cttree/R0/R1/R1C1/R1C2 32
"ProductsBrand", and two distinct values of
"PeriodYear". Therefore, the combination is 4
X 4 X 2 è 32.

The sum of measure 1 "Revenue" for each


T1 /cttree/R0/R1/R1C1/R1C2/T1 32 combination of "Region", "ProductsBrand" and
"PeriodYear".

T2 /cttree/R0/R1/R1C1/R1C2/T2 32 The sum of measure 2 "PrevRevenue" for each


combination of "Region", "ProductsBrand" and

723226984.doc Trang 99 / 138


"PeriodYear".

This contains elements from combining R1


"Region" and R2 "District". Since the list of
R2 /cttree/R0/R1/R2 18 values in R2 has dependency on R1, therefore
the number of entries is not just a simple
multiplication.

H /cttree/R0/R1/R2/H 18 The row header label for R2 "District".

The R2 position number within R1. This is


R1N /cttree/R0/R1/R2/R1N 18 used to check if it is the last row, and draw
table border accordingly.

The sum of measure 1 "Revenue" for each


T1 /cttree/R0/R1/R2/T1 18
combination "Region" and "District".

The sum of measure 2 "PrevRevenue" for each


T2 /cttree/R0/R1/R2/T2 18
combination of "Region" and "District".

This contains elements from combining R1, R2


R2C1 /cttree/R0/R1/R2/R2C1 72
and C1.

The sum of measure 1 "Revenue" for each


T1 /cttree/R0/R1/R2/R2C1/T1 72 combination of "Region", "District" and
"ProductsBrand".

The sum of measure 2 "PrevRevenue" for each


T2 /cttree/R0/R1/R2/R2C1/T2 72 combination of "Region", "District" and
"ProductsBrand".

This contains elements from combining R1,


R2C2 /cttree/R0/R1/R2/R2C1/R2C2 144 R2, C1 and C2, which gives the finest level of
details.

M1 /cttree/R0/R1/R2/R2C1/R2C2/M1 144 The sum of measure 1 "Revenue".

M2 /cttree/R0/R1/R2/R2C1/R2C2/M2 144 The sum of measure 2 "PrevRevenue".

723226984.doc Trang 100 / 138


Lots to read and digest I know!
Customization
One new feature I discovered this week is the ability to show one column and sort by another. I
had a data set that was extracting month abbreviations, we wanted to show the months across the
top and some row headers to the side. As you may know XSL is not great with dates, especially
recognising month names. It just wants to sort them alphabetically, so Apr comes before Jan, etc.

A way around this is to generate a month number alongside the month and use that to sort. We
can do that in the crosstab, sadly its not exposed in the UI yet but its doable.
Go back up and take a look a the initial crosstab command. especially the Rows and Columns
entries. In there you will find the sort criteria.
"ProductsBrand{,o=a,t=t}, PeriodYear{,o=a,t=t}"
Notice those leading commas inside the curly braces? Because there is no field preceding them it
means that the crosstab should sort on the column before the brace ie PeriodYear. But you can
insert another column in the data set to sort by. To get my sort working how I needed.
<?crosstab:c794;"current-
group()";"_Fund_Type_._Fund_Type_Display_{_Fund_Type_._Fund_Type_Sort_,o=a,t=n}";"
_Fiscal_Period__Amount__._Amt_Fm_Disp_Abbr_{_Fiscal_Period__Amount__._Amt_Fiscal
_Month_Sort_,o=a,t=n}";"_Execution_Facts_._Amt_";"sum"?>
Excuse the horribly verbose XML tags, good ol BIEE :0) The emboldened columns are not in the
crosstab but are in the data set. I just opened up the field, dropped them in and changed the type(t)
value to be 'n', for number, instead of the default 'a' and my crosstab started sorting how I wanted
it.
 If you find other tips and tricks, please share in the comments.

Hình 50

7.4 Hiển thị logo công ty

7.4.1 Tham khảo:


 https://support.oracle.com/epmos/faces/DocumentDisplay?
_afrLoop=271853139036689&parent=EXTERNAL_SEARCH&sourceId=HOWTO
&id=550627.1&_afrWindowMode=0&_adf.ctrl-state=t8d9ogypk_4
 How To Insert Images and Logo in the XML Publisher Reports and Documents?
(Doc ID 550627.1)

723226984.doc Trang 101 / 138


 Applies to:
o BI Publisher (formerly XML Publisher) - Version 5.6.3 to 5.6.3 [Release 5]
o Information in this document applies to any platform.
o Oracle XML Publisher - Version: 5.6.1 through 5.6.3.
 Goal
o This document describes about how to insert JPG, GIF, or PNG images in the
XML/BI Publisher report / document
 Solution
o XML/BI Publisher supports several methods for including images in published
documents.
o Please perform any of the following methods:
- 1) URL Reference
+ * Insert a dummy image in the template.
+ * In the Format Picture dialog box select the Web tab.
+ * Enter the following syntax in the Alternative text region to reference
the image URL:
+ * url:{'http://image location'}
+ e.g.: url:{'http://www.oracle.com/images/ora_log.gif'}
- 2) OA Media Directory Reference
+ * Insert a dummy image in the template.
+ * In the Format Picture dialog box select the Web tab.
+ * Enter the following syntax in the Alternative text region to reference
the OA_MEDIA directory:
+ url:{'{OA_MEDIA}/IMAGE_FILE'}
+ e.g: url:{{OA_MEDIA}/ORACLE_LOGO.gif'}
- 3) Element Reference from XML File
+ * Insert a dummy image in the template.
+ * In the Format Picture dialog box select the Web tab.
+ * Enter the following syntax in the Alternative text region to reference
the image URL:
+ url:{IMAGE_LOCATION}
+ where IMAGE_LOCATION is an element from the XML file that
holds the full URL to the image.
+ * Another option is to build a URL based on multiple elements at
runtime. Just use the concat function to build the URL string.
+ e.g.: Syntax: url:{concat('$[OA_MEDIA]/',.//IMAGE_FILE)}
+ * This method can also be used with the OA_MEDIA reference as
follows:
+ url:{concat('$[OA_MEDIA]/',.//IMAGE_FILE)}
- 4) Rendering an Image Retrieved from BLOB Data

723226984.doc Trang 102 / 138


+ If the data source is an XML/BI Publisher Data Template and the
resulting XML contains image data that had been stored as a BLOB in
the database, use the following
+ syntax in a form field inserted in your template where you want the
image to render at runtime:
<fo:instream-foreign-object content-type="image/jpg">
<xsl:value-of select="IMAGE_ELEMENT"/>
</fo:instram-foreign-object>
+ where image/jpg is the MIME type of the image (other options might
be: image/gif and image/png) and IMAGE_ELEMENT is the element
name of the BLOB in your XML data.
+ Note: Height and width attributes can be specified for the image to set
its size in the published report. XML/BI Publisher will scale the image
to fit the box size defined.
 For Example: To set the size of the example above to three inches by four inches,
enter the following:
<fo:instream-foreign-object content-type="image/jpg"
height="3 in" width="4 in">
<xsl:value-of select="IMAGE_ELEMENT"/>
</fo:instram-foreign-object>
 Specify in pixels as follows:
<fo:instream-foreign-object content-type="image/jpg" height="300 px"
width="4 px">
 or in centimeters:
<fo:instream-foreign-object content-type="image/jpg" height="3 cm"
width="4 cm">
 or as a percentage of the original dimensions:
<fo:instream-foreign-object content-type="image/jpg" height="300%"
width="300%">
- 5) Biên tìm được giải pháp ảnh động và chỉ định được chiều cao hoặc chiều
rộng còn chiều còn lại tự động giãn theo (kết hợp 3, 4)
+ https://blogs.oracle.com/xmlpublisher/media-images-can-cause-hair-
loss
<fo:external-graphic src="url:{./URL_EIM}" height="100px" />

7.4.2 Dùng giải pháp thứ 4 - Ảnh lưu trong cột Blob
 Sử dụng thủ tục Pkg_Perp_Bi_Logo.Get_Bi_Logo_File để lấy ra file ảnh cho báo
cáo

Hình 51

723226984.doc Trang 103 / 138


8 FILE .BAT HAY DÙNG

8.1 Hướng dẫn tạo file và chỉnh sửa file .bat


 Tham khảo: https://quantrimang.com/huong-dan-tao-va-su-dung-file-bat-tren-
windows-83390
 Quản Trị Mạng - Tập tin Batch (.bat) là cách để thực thi các công việc trên máy tính
một cách tự động. Bạn có thể tự động hóa các tác vụ hàng ngày, rút ngắn thời gian
cần thiết khi làm việc nào đó, và biến một quá trình phức tạp thành điều gì đó mà bất
cứ ai cũng có thể làm được. Từ khi chương trình như AutoHotkey ra đời, nhiều
người đã không muốn mất thời gian để viết hay tìm hiểu về tập tin .bat, thậm chí họ
không biết những gì mà nó có thể làm. Nhưng lợi ích mà những tập tin .bat mang lại
thì vẫn rất to lớn.
 Giả sử bạn thường xuyên gặp các vấn đề về mạng, và luôn phải mở hộp thoại
command prompt để nhập vào các lệnh như ipconfig, hay Ping tới Google để kiểm
tra sự cố. Trong khi đó, chỉ cần một file BAT đơn giản sẽ giúp công việc này hiệu
quả hơn, bạn còn có thể dùng file này cho tất cả các máy tính khác nếu muốn.
 Trong bài viết này Quản Trị Mạng sẽ hướng dẫn các bạn cách tạo một file batch đơn
giản và một số điều cơ bản về nó. Đồng thời bạn sẽ được cung cấp một số nguồn tài
nguyên cho việc học và viết những tập tin batch. Mời bạn tham khảo nhé!
 Tóm tắt nội dung bài viết Hướng dẫn tạo và sử dụng file BAT trên Windows:
o Bước 1: Tạo file BAT
o Bước 2: Một số code cơ bản
o Bước 3: Một số logic
o Bước 4: Viết nội dung cho file BAT
o Bước 5: Chạy file BAT vừa tạo
 Bước 1: Tạo file BAT
o Đầu tiên bạn tạo một text document mới trên desktop của mình (chuột phải chọn
New > text document). Kích đúp chuột để mở file này, vào menu File > Save
As..., tại cửa sổ Save As bạn nhập tên cho tập tin và thêm đuôi ".bat" (không có
dấu nháy kép). Ví dụ chúng tôi đặt tên là testBAT.bat.
o Tiếp theo, tại phần Save as Type chọn All Files (thay cho Text Document
(*.txt)), kích Save để lưu lại.
 Bước 2: Một số code cơ bản
o Nếu bạn đã biết cách chạy những dòng lệnh trong command prompt, bạn sẽ có
một Wiz cho việc tạo file BAT bởi chúng có cùng một thứ ngôn ngữ. Tất cả
những gì bạn cần làm là "nói" cho command prompt biết rằng bạn muốn đặt các

723226984.doc Trang 104 / 138


lệnh trong cùng một file, thay vì gõ chúng mỗi khi chạy command prompt. Điều
này không những giúp bạn tiết kiệm thời gian và công sức mà còn cho phép đưa
vào một số logic (như vòng lặp đơn giản, câu lệnh có điều kiện...) đó là những
thủ tục có khả năng lập trình về mặt khái niệm.
o Sau đây là 7 lệnh đơn giản mà bạn nên biết:
- TITLE: tên cửa sổ cho tập tin BAT.
- ECHO: lệnh in của file BAT. Bất cứ điều gì sau ECHO sẽ được hiển thị
trong command prompt (như văn bản) trên từng dòng.
- ECHO OFF: lệnh này thường được đặt trên đầu của file BAT. Khi chạy
file BAT có lệnh này, các lệnh phía dưới ECHO OFF sẽ không được hiển
thị (tức là chỉ có nội dung, không cho biết lệnh nào được dùng).
- PAUSE: khi sử dụng lệnh này, một thông báo “press any key to
continue…” sẽ hiển thị trên màn hình, toàn bộ lệnh trong file BAT sẽ tạm
dừng cho đến khi bạn nhấn phím bất kỳ để khởi động lại. Bằng cách này
bạn sẽ có cơ hội nhìn thấy những gì đang diễn ra trên màn hình.
- CLS: làm sạch màn hình cửa sổ DOS (rất hữu ích khi chúng trở nên dày
đặc và lộn xộn).
- IPCONFIG: thông tin về mạng hiển thị trên DOS (rất hữu ích đối với các
nhà quản trị mạng).
- PING: ping đến địa chỉ IP, cho biết bạn có thể liên hệ với máy tính đó hay
không. Lệnh này cũng trả về độ trễ (ping time) và mặc định sẽ ping 3 lần.
 Bước 3: Một số logic
o Chúng ta cần lập kế hoạch cho chương trình của mình. Bất kỳ một nhà lập trình
giỏi nào cũng suy nghĩ về khuôn khổ chung của công việc trước khi tiến hành
đánh dấu gạch ngang vào những gì cần làm. Điều này giúp ngăn ngừa những sai
lầm logic rất khó thực hiện lại.
o Đối với chương trình trong bài viết này, chúng ta cần kiểm tra hệ thống mạng
máy tính và những thiết lập internet với lệnh “ipconfig /all”, sau đó rà soát
thông tin. Cuối cùng ping tới google.com để tìm hiểu xem chúng ta thực sự có
quyền truy cập internet. Nếu mọi thứ đều tốt đẹp, ta sẽ cho tạm dừng chương
trình.
 Bước 4: Viết nội dung cho file BAT
o Để chỉnh sửa nội dung cho tập tin .bat, kích chuột phải vào đó chọn “edit”. File
BAT sẽ được mở bằng trình soạn thảo Notepad, ở đây bạn sẽ thấy một trang
trống và sẵn sàng cho chúng ta nhập nội dung vào đó.
o (Mỗi lệnh sẽ có dòng chú thích dạng CODE ::Comment, với phần in đậm là câu
lệnh mà ta sử dụng).

ECHO OFF

723226984.doc Trang 105 / 138


::CMD se khong hien thi lenh nao duoc thuc thi phia duoi.
ECHO QuanTriMang: Demo tao file BAT
:: In ra dong van ban
IPCONFIG /ALL
:: Hien thi thong tin ve mang tren cua so command prompt
PAUSE
:: Tam dung thuc thi cac lenh khac de nguoi dung xem cac thong tin
quan trong.
PING www.google.com
:: Ping toi trang Google.com
ECHO Toan bo thong tin ve Google Ping duoc.
::In ra dong van ban
PAUSE
:: Cho phep nguoi dung xem ket qua. Boi vi day la dong lenh cuoi
cung nen sau khi nhan phim bat ky, cua so command se duoc dong lai.
 Bước 5: Chạy file BAT vừa tạo
o Sau khi chèn nội cung cho file BAT, bạn lưu lại rồi kích đúp chuột vào đó để
chạy file bat. Màn hình sẽ hiển thị kết quả như sau:

 Vậy là bạn đã thành công!


 Nếu muốn chỉnh sửa file BAT hãy mở file BAT bằng Notepad bằng cách chuột phải
lên file BAT, chọn Open with > Notepad là được.

8.2 Một số file bat hay dùng

 Gọi công cụ form builder

723226984.doc Trang 106 / 138


 Nhu cầu:
o 1 Người có thể làm cùng lúc nhiều dự án
o Mỗi dự án lại có các thư viện khác nhau (nằm trong thư mục SVN khác nhau),
do đó mỗi dự án thì forms_path là khác nhau
o Có thể sửa đổi forms_path trong registry trước khi gọi form builder trong mục
start của windows
o Có thể sửa forms_path bằng lệnh và gọi form builder từ dòng lệnh
 Các file .bat của các dự án:
o DMC dùng dev12c
Set FORMS_PATH=d:\svn\PERP\PERP_DOM_001\Development\Trunk\
perp5\6.0.0.0\resource\perp51
Set FORMS_PATH=%FORMS_PATH%;d:\svn\PERP\PERP_DOM_001\Development\
Trunk\perp5\6.0.0.0\resource\perp52
Set FORMS_PATH=%FORMS_PATH%;d:\svn\PERP\PERP_DOM_001\Development\
Trunk\perp5\6.0.0.0\resource\perp53
Set FORMS_PATH=%FORMS_PATH%;d:\svn\PERP\PERP_DOM_001\Development\
Trunk\perp5\6.0.0.0\forms
Set FORMS_PATH=%FORMS_PATH%;d:\svn\PERP\PERP_DOM_001\Development\
Trunk\adm\6.0.0.0\resource
Set FORMS_PATH=%FORMS_PATH%;d:\svn\PERP\PERP_DOM_001\Development\
Trunk\libs\6.0.0.0\forms
Set FORMS_PATH=%FORMS_PATH%;d:\svn\PERP\PERP_DOM_001\Development\
Trunk\libs\6.0.0.0\resource\ebs
Set FORMS_PATH=%FORMS_PATH%;d:\svn\PERP\PERP_DOM_001\Development\
Trunk\libs\6.0.0.0\resource
Set FORMS_PATH=%FORMS_PATH%;C:\ora_soft\dev\dev12c\forms
set NLS_LANG=AMERICAN_AMERICA.UTF8
C:\ora_soft\dev\dev12c\bin\frmbld.exe
 JPA dùng dev10gr2
set FORMS_PATH=e:\svn\PERP\PERP_JPA_001\Development\Trunk\DEV\
libs;c:\ora_soft\dev\dev10gr2\cgenf61\admin;c:\ora_soft\dev\
dev10gr2\forms
c:\ora_soft\dev\dev10gr2\BIN\frmbld.exe

8.2.1 Update SVN


 Nhu cầu:
o Mỗi dự án có 1 đường dẫn SVN riêng
o Hàng ngày cần phải update tất cả SVN
o Cần phải nhớ các thư mục SVN và vào từng thư mục cập nhật SVN sẽ rất mất
thời gian
 Cách làm
o Tạo file .bat để chạy (sửa đường dẫn SVN ở dưới cho đúng trên máy mình)

723226984.doc Trang 107 / 138


CD C:\Program Files\TortoiseSVN\bin\
START TortoiseProc.exe /command:update /path:"e:\svn\PERP\
PERP_JPA_001" /closeonend:1

723226984.doc Trang 108 / 138


9 Start file cùng windows hoặc Auto hotkey

9.1 Start cùng windows


 Nhu cầu
o Nhiều công việc lặp đi lặp lại khi bật máy tính: mở outlook để check mail, mở
trình duyệt firefox để vào hệ thống, ...
 Cách thực hiện
o Tạo file .bat để gọi các chương trình mong muốn
o Tạo shortcut cho file .bat

o Cấu hình chạy cùng startup windows


- Mở cửa sổ Run của window: phím cửa sổ + R
- Nhập vào shell:startup rồi enter

723226984.doc Trang 109 / 138


- Nó mở ra thư mục startup

- Cắt file shortcut tạo ra ở trên và dán vào thư mục startup

723226984.doc Trang 110 / 138


Hình 52

9.2 Auto Hotkey


 Tham khảo: https://vi.wikipedia.org/wiki/AutoHotkey
 AutoHotkey là một ngôn ngữ kịch bản tùy biến miễn phí, nguồn mở cho Microsoft
Windows, bàn đầu nhằm cung cấp các phím tắt hay phím nóng dễ dàng, tạo macro
nhanh và tự động hóa phần mềm để cho phép người dùng máy tính ở cấp độ nào
cũng có thể tự động hóa các tác vụ lặp lại ở bất kì ứng dụng Windows nào. Giao
diện ngườ dùng cũng có thể dễ dàng được mở rộng hay sửa đổi bởi AutoHotkey (ví
dụ, ghi đè lệnh phím Control mặc định của Windows bằng phím tương tự của
Emacs). Cài đặt AutoHotkey bao gồm tập tin giúp đỡ của nó với phiên bản luôn
được cập nhật trên web.

9.2.1 Cài đặt


 Download chương trình auto hotkey trên google
 https://www.autohotkey.com/

723226984.doc Trang 111 / 138


Hình 53

Hình 54

723226984.doc Trang 112 / 138


Hình 55

723226984.doc Trang 113 / 138


Hình 56

Hình 57

723226984.doc Trang 114 / 138


Hình 58

9.2.2 Cách tạo file .ahk


 Mở chương trình notepad (hoặc notepad++)
 Tạo nội dung file như mong muốn
 Lưu lại file với đuôi .ahk

9.2.3 Cách chạy file .ahk với auto hotkey


 Nếu là lần đầu chạy file .ahk thì làm như sau (sau lần này đã có check vào cứ .ahk sẽ
mở bằng auto hotkey nên lần sau chỉ cần đúp chuột vào file .ahk cần chạy thôi)

723226984.doc Trang 115 / 138


Hình 59

723226984.doc Trang 116 / 138


Hình 60

723226984.doc Trang 117 / 138


Hình 61

723226984.doc Trang 118 / 138


Hình 62
 Kiểm tra xem có file .ahk nào đang chạy không?

Hình 63
 Cách chỉnh sửa file .ahk
o Chuột phải vào file và open with bằng notepad++ hoặc notepad

723226984.doc Trang 119 / 138


Hình 64
o Sửa xong đúp chuột để chạy lại, nếu file này đã chạy thì sẽ xuất hiện thông báo
như hình dưới

Hình 65

9.2.4 Một số file .ahk hay dùng


 Phím tắt viết comment code
::--bt::
Send, -- Biennv them ngay{SPACE}

723226984.doc Trang 120 / 138


FormatTime, CurrentDateTime,, dd-MMM-yy
SendInput %CurrentDateTime%
Return
::--bs::
Send, -- Biennv sua ngay{SPACE}
FormatTime, CurrentDateTime,, dd-MMM-yy
SendInput %CurrentDateTime%
Return
::--br::
Send, -- Biennv rao ngay{SPACE}
FormatTime, CurrentDateTime,, dd-MMM-yy
SendInput %CurrentDateTime%
Return
::--et::
Send, -- Biennv them ngay{SPACE}
FormatTime, CurrentDateTime,, dd-MMM-yy
SendInput %CurrentDateTime%
Return
::--es::
Send, -- Biennv sua ngay{SPACE}
FormatTime, CurrentDateTime,, dd-MMM-yy
SendInput %CurrentDateTime%
Return
::--er::
Send, -- Biennv rao ngay{SPACE}
FormatTime, CurrentDateTime,, dd-MMM-yy
SendInput %CurrentDateTime%
Return
o Thử test: mở notepad gõ “--bt" + phím cách hoặc phím enter sẽ được kết quả “--
Biennv them ngay 15-Mar-19”
o Các phím tắt ở trên là: --bt, --bs, --br, --et, --es, --er
 Phím tắt gọi một số chương trình
#`::Run notepad D:\Hotkey.ahk
#n::Run Notepad++
#3::Run Outlook
#4::Run C:\Program Files (x86)\WinSCP\WinSCP.exe
#h::Run notepad C:\Windows\System32\drivers\etc\hosts
#5::Run C:\totalcmd\TOTALCMD64.EXE
o Các phím tắt ở trên:
- Phím cửa sổ + ~ (bên trái phím 1): gọi cửa sổ Run và nhập vào “notepad
D:\hotkey.ahk” rồi enter ý nghĩa là gọi chương trình notepad và open file
D:\hotkey.ahk
- Phím cửa sổ + n: gọi cửa sổ Run và nhập vào “Notepad++” rồi enter
- ...

723226984.doc Trang 121 / 138


 Lấy chuỗi ngày tháng giờ hiện tại
#1::
FormatTime, CurrentDateTime,, yyMMdd'_'HH'h'mm
SendInput _%CurrentDateTime%
Return
o Nếu ngày giờ hiện tại là 18/03/2019 09h00 thì kết quả khi nhập phím tắt “phím
cửa sổ + phím 1” sẽ được kết quả: 190318_09h00

723226984.doc Trang 122 / 138


10 Không hiển thị lại cảnh báo block hoặc don’t block khi chạy ứng
dụng perp
 Nhiều khi vào hệ thống cứ hiển thị warning này mà bắt buộc chọn don’t block thì
mới dùng được ứng dụng (nếu chọn block thì sẽ mất hết icon trên thanh toolbar)

Hình 66
 Các bước cấu hình:
o Tham khảo: https://www.java.com/en/download/help/error_mixedcode.xml
o Vào control panel: nhấn tổ hợp phím tắt: phím cửa sổ + R, nhập vào control và
chọn OK

Hình 67
o Đúp chuột vào Java (32-bit)

723226984.doc Trang 123 / 138


Hình 68
o Cấu hình tab advanced mục Mixed code

723226984.doc Trang 124 / 138


Hình 69
o Sau khi chọn apply kiểm tra lại xem chắc chắn đã là Enable – hide warning and
run with protections chưa?

723226984.doc Trang 125 / 138


Hình 70
o Nếu không được thì cần phải đóng hết trình duyệt và java runtime lại rồi cấu
hình lại
o Khi nào ngon lành chọn OK để kết thúc

723226984.doc Trang 126 / 138


11 MỘT SỐ CÂU LỆNH SQL

11.1 Câu lệnh check số liệu


 <server SVN>/PERP_SCRIPTS

11.2 Biến một chuỗi cách nhau bởi dấu phẩy thành các dòng (String to rows)

11.2.1 Cách 1
With t As
(Select 'abc,fdsa,fds' Txt From Dual)
Select Regexp_Substr(Txt, '[^,]+', 1, Level) Data From t Connect By
Level <= Length(Txt) - Length(Replace(Txt, ',')) + 1

11.2.2 Cách 2
Select Regexp_Substr(:Process_Of_Works.Attribute1, '[^#]+', 1, Rn)
As S1
From Dual
,(Select Rownum As Rn From Dual Connect By Level
<= (Select Regexp_Count(:Process_Of_Works.Attribute1, '#', 1, 'i')
From Dual));

11.3 Nối các dòng thành một chuỗi (Rows to String)

11.3.1 Cách 1
Select Ltrim(Sys_Connect_By_Path(Myvalues, ','), ',') Catvalues
From (Select Myvalues
,Row_Number() Over(Order By Myvalues) Rn
,Count(*) Over() Cnt
From (Select t.State Myvalues From Evn.Evn_Report_Setup
t Where t.Report_Code = 'EVN_GL_027')) Data
Where Rn = Cnt
Start With Rn = 1
Connect By Prior Rn = Rn - 1;

723226984.doc Trang 127 / 138


11.3.2 Cách 2
Select Aip.Check_Id
,Rtrim(Xmlagg(Xmlelement(a, Aip.Attribute2 || ' -
').Extract('//text()')), ' - ') a
From Ap_Invoice_Payments_All Aip
Where 1 = 1
Group By Aip.Check_Id

11.3.3 Cách 3
select d.dname department,
listagg(e.ename, ', ') within group (order by e.ename)
dept_employee_list
from eba_demo_ir_emp e,
eba_demo_ir_dept d
where d.deptno = e.deptno
group by d.DNAME

11.4 Sử dụng keep dense_rank

Select Id
,min(Diem) Keep(Dense_Rank last Order By Stt) min_last
,max(Diem) Keep(Dense_Rank last Order By Stt) max_lats
,min(Diem) Keep(Dense_Rank first Order By Stt) min_fir
,max(Diem) Keep(Dense_Rank first Order By Stt) max_fir
From (Select 1 Id
,10 Diem
,9 Stt
,'a' Ten
From Dual
Union All
Select 1 Id
,9 Diem
,9 Stt
,'b'
From Dual
Union All
Select 1 Id
,8 Diem
,8 Stt
,'c'
From Dual)
Group By Id

723226984.doc Trang 128 / 138


11.5 Tìm Domain có chứa các giá trị
 Nhiều khi biết 1 poplist trạng thái có giá trị O, F, ... mà biết nó sử dụng domain thì
có thể tìm domain đó bằng câu lệnh mà không cần mở form
With t As
(Select
-- dien ds gia tri kiem tra o day
'A,P'
--
Txt
From Dual),
Lst_Val As
(Select Regexp_Substr(Txt, '[^,]+', 1, Level) Data From t Connect
By Level <= Length(Txt) - Length(Replace(Txt, ',')) + 1)
-- Select domain
Select Crc.Rv_Domain
From Cg_Ref_Codes Crc
,Lst_Val
Where Crc.Rv_Low_Value = Lst_Val.Data
Group By Crc.Rv_Domain
Having Count (*) = (Select Count(*) From Lst_Val)

11.6 Tạo transaction độc lập với transaction chính

 Tham khảo:
https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/13_elems002.htm
 pragma autonomous_transaction

11.7 Xác định dòng sinh lỗi trong các thủ tục của DB

 Dùng Dbms_Utility.Format_Error_Backtrace bắt lỗi


c_Mess := '500';
Exception
When Others Then
Dbms_Output.Put_Line('Loi: ' || c_Mess || Chr(10) || Sqlerrm
|| Chr(10) || Dbms_Utility.Format_Error_Backtrace);
End;

11.8 Lấy dữ liệu từ dòng n trở đi và lấy m giá trị

 https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html
 Syntax
OFFSET { integer-literal | ? } {ROW | ROWS}

723226984.doc Trang 129 / 138


FETCH { FIRST | NEXT } [integer-literal | ? ] {ROW | ROWS} ONLY

ROW is synonymous with ROWS and FIRST is synonymous with NEXT.


For the result offset clause, the value of the integer literal (or the dynamic parameter ?) must be
equal to 0 (default if the clause is not given), or positive. If it is larger than the number of rows in
the underlying result set, no rows are returned.
For the fetch first clause, the value of the literal (or the dynamic parameter ?) must be 1 or higher.
The literal can be omitted, in which case it defaults to 1. If the clause is omitted entirely, all rows
(or those rows remaining if a result offset clause is also given) will be returned.

11.8.1 Sum lũy kế các dòng, có theo cả đk nhóm


 https://www.dba-oracle.com/t_advanced_sql_windowing_clause.htm
 Có thể dùng cả Partition by: đã viết và hướng dẫn báo cáo của Trinhdp

11.9 Đẩy dữ liệu từ file xlsx vào 1 bảng

11.9.1 Nhu cầu:


 Đầu dự án ace nghiệp vụ thường chuẩn hóa dữ liệu vào file excel dạng xlsx, sau đó
copy dữ liệu từ excel và paste trực tiếp vào 1 bảng trong database qua công cụ pl/sql
developer rồi post và commit  nếu nhiều dữ liệu (vài nghìn dòng) thì chạy rất lâu
(Biên đoán do mỗi dòng pl/sql developer tạo ra 1 câu lệnh insert into vào bảng) 
cần giải pháp khác để chạy nhanh hơn

11.9.2 Các bước chạy theo giải pháp mới

11.9.2.1 Giải pháp 1: Đẩy file vào DB và thực hiện insert thông qua lệnh select
 Thêm 1 vài thao tác chuẩn hóa file excel như cách cũ:
o Chỉ để 1 sheet duy nhất chứa dữ liệu cần đưa vào bảng
o Xóa tất cả dòng trống (không có tí dữ liệu trên bất kỳ cột nào), cột trống (không
có tí dữ liệu trên bất kỳ dòng nào).
o Thêm 1 dòng trên cùng và đặt công thức để lấy được STT cột.
o Hiện tại chưa xử lý được cột kiểu date do đó đối với cột kiểu date thì để định
dạng thông thường là kiểu text theo định dạng MM-DD-YYYY và khi insert thì
to_date

723226984.doc Trang 130 / 138


 Gọi trang apex để upload file excel ở trên vào DB
o Cách 1:
- Hiện tại chưa khai báo thành chức năng  có thể sửa trực tiếp link apex

- Tìm theo tên bảng dữ liệu cần insert, nếu có thì update, ngược lại thì thêm
mới

o Cách 2: thực hiện up file excel bằng pl/sql developer


- Thực hiện select để update (có thể sang môi trường DMC copy về và chỉnh
sửa)
select t.*, t.rowid from Import_xlsx t
- Sửa các thông tin: tăng ID, Name, Filename, created_on, create_date

723226984.doc Trang 131 / 138


- Tiến hành up file

723226984.doc Trang 132 / 138


- Thực hiện post  commit  yes để hoàn thành

 Thêm vào bảng cần insert dữ liệu cột line# kiểu số liệu number

723226984.doc Trang 133 / 138


 Tạo câu lệnh insert dữ liệu vào bảng từ file xlsx đã upload vào DB ở trên


insert into customers
Select
Col002,Col003,Col004,Col005,Col006,Col007,Col008,Col009,Col010,Col01
1,Col012,Col013,Col014,Col015,Col016,Col017,Col018,Col019,Col020
,Col021,Col022,Col023,Col024,Col025,sysdate,Col027,sysdate,Col029,Co
l030,Col031,Col032,Col033,Col034,Col035,Col036,Col037,Col038,Col039,
Col040
,Col041,Col042,Col043,Col044,Col045,Col046,Col047,Col048,Col049,Col0
50,Col051,Col052,Col053,Col054,Col055,Col056,Col057,Col058,Col059,Co
l060
,Col061,Col062,Col063,Col064,Col065,Col066,Col067,Col068,Col069,Col0
70,Col071,Col072,Col073,Col074,Col075,Col076,Col077,Col078,Col079,Co
l080
,Col081,Col082,Col083,Col084,Col085,Col086,Col087,Col088,Col089,Col0
90,Col091,Col092,Col093,Col094,Col095,Col096,Col097,Col098,Col099,Co

723226984.doc Trang 134 / 138


l100
,Col101,Col102,Col103,Col104,Col105,Col106,Col107,Col108,Col109,Col1
10,Col111,Col112,Col113,Col114,Col115,Col116,Col117,Col118,Col119,Co
l120
,Col121,Col122,Col123,Col124,Col125,Col126,Col127,Col128,Col129,Col1
30,Col131,Col132,Col133,Col134,Col135,Col136,Col137,Col138,Col139,Co
l140
,Line#
From Table(d_Pkg_Xlsx_Parser.Parse(p_Xlsx_id => 12,
p_Worksheet_Name => 'sheet1')) t
Where 1 = 1
And t.Line# between 3 and 7000
Log Errors Into Err$_import_xlsx ('CUSTOMERS') Reject Limit
Unlimited;
 Câu lệnh hỗ trợ sinh select
Declare
n_s_Cot Number;
n_Start Number;
c_Lst_Col_Date Varchar2(32767);
c_Lst_Col_Dung_Sysdate Varchar2(32767);
c_Format_Date_Co Constant Varchar2(100) := 'MM-DD-YYYY';
n_So_Cot_Tren_1dong Number;
c_Tab_Ins Varchar2(1000);
n_Id_File_Xlsx Number;
n_Do_Tu_Dong Number;
n_Do_Den_Dong Number;
Begin
-- Tham so
n_s_Cot := 141; -- Tong so cot co du lieu trong
file excel
n_Start := 2; -- cot bat dau
c_Lst_Col_Date := '3'; -- Co
c_Lst_Col_Dung_Sysdate := '26,28';
n_So_Cot_Tren_1dong := 15; --
c_Tab_Ins := 'SALES_INVOICES';
n_Id_File_Xlsx := 1;
n_Do_Tu_Dong := 3;
n_Do_Den_Dong := 7000;
--
Dbms_Output.Put_Line('Insert Into ' || c_Tab_Ins || '
Select ');
For i In n_Start .. n_s_Cot Loop
If Instr(',' || c_Lst_Col_Date || ',', ',' || i || ',') > 0
Then
Dbms_Output.Put('To_Date(Col' || Lpad(i, 3, '0') ||
',''' || c_Format_Date_Co || '''),');

723226984.doc Trang 135 / 138


Elsif Instr(',' || c_Lst_Col_Dung_Sysdate || ',', ',' || i
|| ',') > 0 Then
Dbms_Output.Put('sysdate,');
Else
Dbms_Output.Put('Col' || Lpad(i, 3, '0') || ',');
End If;
If Mod(i, n_So_Cot_Tren_1dong) = 0 Then
Dbms_Output.Put_Line('');
End If;
End Loop;
Dbms_Output.Put_Line('Line#
From Table(d_Pkg_Xlsx_Parser.Parse(p_Xlsx_id => ' ||
n_Id_File_Xlsx || ', p_Worksheet_Name => ''sheet1'')) t
Where 1 = 1
And t.Line# between ' || n_Do_Tu_Dong || ' and ' || n_Do_Den_Dong
|| '
Log Errors Into Err$_import_xlsx (''' || c_Tab_Ins || ''') Reject
Limit Unlimited;
-- Delete from err$_import_xlsx err where err.ora_err_tag$ = ''' ||
c_Tab_Ins || ''';
-- select * from err$_import_xlsx err where err.ora_err_tag$ = '''
|| c_Tab_Ins || ''';
');
End;
 Câu lệnh xem log những dòng không insert được


-- Delete from err$_import_xlsx err where err.ora_err_tag$ =
'CUSTOMERS';
-- select * from err$_import_xlsx err where err.ora_err_tag$ =
'CUSTOMERS';

11.9.2.2 Giải pháp 2: Chạy file bằng lệnh command window của pl/sql developer
 Mỗi dòng tạo 1 câu lệnh insert bằng công thức của excel
 Copy lệnh insert ra file notepad, thêm begin end và exception backtrace để bắt lỗi tại
dòng nào xảy ra lỗi.

723226984.doc Trang 136 / 138


 Lưu file định dạng UTF8 để giữ được ký tự unicode tiếng việt
 Mở màn hình command window của pl/sql developer và gọi lệnh chạy file:
@”đường_dẫn_file”
 Nếu trong file chưa có lệnh commit thì chạy xong nhớ commit

723226984.doc Trang 137 / 138


12 Mẫu viết tài liệu

Hình 71

723226984.doc Trang 138 / 138

You might also like