🚀 Hiểu Biết Về Câu Lệnh SQL Trong Uniface 10.4: Hướng Dẫn Dành Cho Lập Trình Viên
Lưu ý: Bài viết này được tạo ra với sự hỗ trợ của AI, dựa trên tài liệu chính thức của Uniface 10.4.
Câu lệnh SQL trong Uniface 10.4 là một công cụ mạnh mẽ cho phép các lập trình viên thực thi các truy vấn cơ sở dữ liệu trực tiếp từ mã ProcScript. Dù bạn đang làm việc với Oracle, SQL Server, MySQL hay các cơ sở dữ liệu khác được hỗ trợ, câu lệnh này mang lại cho bạn sự linh hoạt để thực hiện các thao tác cơ sở dữ liệu phức tạp mà có thể khó thực hiện với các thành phần tiêu chuẩn của Uniface. 💪
🤔 Uniface Là Gì?
Trước khi tìm hiểu về câu lệnh SQL, hãy làm rõ Uniface là gì. Uniface là một nền tảng phát triển 4GL (Ngôn Ngữ Thế Hệ Thứ Tư) được tạo ra bởi Rocket Software. Nó được thiết kế để xây dựng các ứng dụng doanh nghiệp có thể chạy trên nền tảng web, desktop và di động. Nền tảng này sử dụng cách tiếp cận dựa trên mô hình và bao gồm ProcScript - ngôn ngữ kịch bản của Uniface cho hành vi ứng dụng.
📝 Cú Pháp Cơ Bản
Cú pháp cơ bản của câu lệnh SQL rất đơn giản:
sql{/data {/fieldname}} {/print} DMLStatement, "PathString"
Giải thích từng phần như sau:
- DMLStatement: Truy vấn SQL của bạn (tối đa 32KB)
- PathString: Tên kết nối cơ sở dữ liệu mà không có ký hiệu $
- Qualifiers: Các tùy chọn bổ sung thay đổi cách kết quả được trả về
🎯 Hiểu Về Các Qualifiers
Câu lệnh SQL đi kèm với ba qualifiers hữu ích kiểm soát cách thức kết quả được trả về:
/data - Lấy Kết Quả Có Cấu Trúc 📊
Qualifier /data trả về kết quả truy vấn hoàn chỉnh dưới dạng danh sách lồng nhau của Uniface. Mỗi hàng trở thành một mục trong danh sách, và mỗi cột trở thành một mục con. Điều này rất hoàn hảo cho việc xử lý dữ liệu theo chương trình:
sql/data "select customer_id, customer_name from customers", "ora"
; Kết quả hiện có trong $result dưới dạng danh sách có cấu trúc
/fieldname - Thêm Tiêu Đề Cột 📋
Khi kết hợp với /data, qualifier /fieldname thêm tên cột như mục đầu tiên trong danh sách kết quả của bạn:
sql/data/fieldname "select customer_id, customer_name from customers", "ora"
; Mục đầu tiên trong $result bây giờ chứa: customer_id, customer_name
/print - Đầu Ra Định Dạng 🖨️
Qualifier /print trả về kết quả ở định dạng dễ đọc với các cột và khoảng trắng, tương tự như những gì bạn thấy trong một bảng làm việc SQL:
sql/print "select * from customers where city = 'London'", "mssql"
putmess $result ; Hiển thị kết quả đã được định dạng
💡 Ví Dụ Thực Tế
Kiểm Tra Xác Thực Cơ Bản ✅
Dưới đây là một trường hợp sử dụng phổ biến - kiểm tra xem một giá trị đã tồn tại trong cơ sở dữ liệu hay chưa:
trigger loseFocus
if ($fieldendmod != 0)
sql "select invnum from invoices where invnum = '%%invnum%%%'", "ora"
if ($status > 0)
message "Số hóa đơn đã tồn tại!"
return (-1)
endif
endif
end
Danh Sách Giá Trị Động 📝
Bạn có thể sử dụng sql/data để điền danh sách thả xuống một cách động:
function getCountryList
sql/data "select country_code, country_name from countries order by country_name", "def"
forlist vRecord in $result
getitem vCode, vRecord, 1
getitem vName, vRecord, 2
putitem/id pCountryList, vCode, vName
endfor
end
⚠️ Hiểu Về Các Giá Trị Trả Về
Sau khi thực thi một câu lệnh SQL, Uniface cung cấp phản hồi thông qua các biến hệ thống:
Giá Trị $status 📊
- ≥ 0: Số lượng bản ghi tìm thấy/bị ảnh hưởng
- -1: Đường dẫn không hợp lệ hoặc thiếu
- -3: Lỗi I/O hoặc câu lệnh DML trống
- -9: Đã đạt đến giới hạn kết nối cơ sở dữ liệu tối đa
- -11: Bản ghi đã bị khóa
- -31: Câu lệnh SQL vượt quá giới hạn 32KB
Biến $result 💾
Biến $result chứa kết quả truy vấn của bạn. Đối với các truy vấn cơ bản, nó giữ cột đầu tiên của hàng đã chọn cuối cùng. Với các qualifiers, nó chứa dữ liệu đã được định dạng hoặc có cấu trúc như đã mô tả ở trên.
🔧 Thực Hành Tốt Nhất và Mẹo
Giữ Cho Nó Di Động 🌐
Mặc dù câu lệnh SQL rất mạnh mẽ, hãy cân nhắc sử dụng các thao tác I/O tiêu chuẩn của Uniface khi có thể. Điều này giữ cho ứng dụng của bạn di động hơn giữa các hệ thống cơ sở dữ liệu khác nhau và dễ dàng bảo trì.
Tránh Kiểm Soát Giao Dịch ❌
Không sử dụng các câu lệnh COMMIT hoặc ROLLBACK trong các lệnh SQL của bạn. Uniface quản lý các giao dịch một cách nội bộ, và việc kiểm soát giao dịch thủ công có thể làm gián đoạn tính nhất quán này.
Xử Lý Dữ Liệu Dài Một Cách Cẩn Thận 📏
Khi làm việc với các kiểu dữ liệu Long của Oracle, hãy lưu ý rằng câu lệnh SQL sẽ bị cắt ở 42 byte. Sử dụng việc truy xuất thực thể tiêu chuẩn của Uniface cho các trường Long thay vào đó.
Xử Lý Lỗi 🛡️
Luôn kiểm tra $status sau các thao tác SQL:
sql "update customers set status = 'ACTIVE' where customer_id = %%vCustomerId", "mssql"
if ($status < 0)
message "Cập nhật thất bại: %%$procerror"
return (-1)
endif
🎯 Khi Nào Sử Dụng SQL So Với I/O Tiêu Chuẩn Của Uniface
Sử dụng câu lệnh SQL khi bạn cần:
- Các phép nối phức tạp giữa nhiều bảng
- Các hàm tổng hợp (COUNT, SUM, AVG)
- Các hàm đặc thù cho cơ sở dữ liệu mà Uniface không hỗ trợ
- Các thao tác hàng loạt mà sẽ không hiệu quả với I/O tiêu chuẩn
Giữ lại các thao tác truy xuất/lưu trữ tiêu chuẩn của Uniface cho:
- Các thao tác CRUD đơn giản
- Nhập liệu dựa trên biểu mẫu
- Các ứng dụng cần tính di động cơ sở dữ liệu
🏁 Kết Luận
Câu lệnh SQL trong Uniface 10.4 là cầu nối giữa các thao tác dữ liệu cấp cao của Uniface và sức mạnh cơ sở dữ liệu thô. Mặc dù nó nên được sử dụng một cách thận trọng, nhưng đây là một công cụ thiết yếu cho các thao tác cơ sở dữ liệu phức tạp vượt quá thao tác dữ liệu dựa trên biểu mẫu tiêu chuẩn. Hãy nhớ luôn xử lý lỗi một cách chính xác và xem xét các tác động về tính di động của mã SQL của bạn! 🎉
Chúc bạn lập trình vui vẻ với Uniface! 👨💻👩💻