SAP Business One · SQL Server
Gọi stored procedure từ Query Manager để tái sử dụng logic báo cáo — nhưng phải kiểm soát quyền và tuyệt đối không cập nhật trực tiếp bảng hệ thống.
Query Manager là công cụ chuẩn của SAP Business One để lưu, phân nhóm, phân quyền và chạy các truy vấn do người dùng định nghĩa. Với báo cáo đơn giản, một câu SELECT thường là đủ. Khi logic gồm nhiều bước tổng hợp, bảng tạm hoặc được nhiều báo cáo cùng sử dụng, gọi một stored procedure từ SAP Business One Query Manager có thể giúp mã nguồn dễ quản lý hơn.
Tuy nhiên, đây không phải cách “mở đường” để ghi trực tiếp vào dữ liệu SAP. Bài hướng dẫn tập trung vào thủ tục chỉ đọc trên SAP Business One chạy Microsoft SQL Server. Bản SAP HANA sử dụng SQLScript và cú pháp CALL, vì vậy không thể sao chép nguyên ví dụ T-SQL dưới đây.
Query Manager làm được gì?
Trong SAP Business One desktop client, người dùng mở Tools → Queries → Query Manager để tìm và chạy saved query. Query có thể được tổ chức theo category; mỗi category được gắn với authorization group để giới hạn người được xem hoặc thực thi.
- Lưu truy vấn báo cáo và kiểm tra dữ liệu dùng nhiều lần.
- Nhận tham số
[%0],[%1]… khi chạy. - Phân nhóm truy vấn theo phòng ban hoặc mục đích nghiệp vụ.
- Liên kết query với layout hoặc lịch chạy trong các kịch bản được SAP B1 hỗ trợ.
Điểm cần phân biệt: Query Manager quản lý câu lệnh gọi; stored procedure là đối tượng cơ sở dữ liệu và phải được DBA/đối tác triển khai, kiểm thử, cấp quyền và quản lý phiên bản.
Khi nào nên dùng stored procedure?
Nên cân nhắc thủ tục lưu trữ khi báo cáo có logic phức tạp, cần tái sử dụng ở nhiều nơi hoặc cần tối ưu execution plan tập trung. Không nên dùng chỉ để bọc một câu SELECT ngắn, vì điều đó làm tăng thêm một lớp triển khai mà không tạo ra lợi ích rõ ràng.
| Tình huống | Saved query | Stored procedure |
|---|---|---|
| Tra cứu ít bảng, logic ngắn | Phù hợp | Thường chưa cần |
| Tổng hợp nhiều bước, dùng bảng tạm | Khó bảo trì | Phù hợp hơn |
| Dùng chung cho nhiều báo cáo | Dễ sao chép logic | Một nguồn logic |
| Thay đổi chứng từ SAP | Không nên | Không cập nhật trực tiếp bảng SAP |
Bước 1: Xác định hợp đồng đầu vào và kết quả
Ví dụ báo cáo doanh thu nhận mã nhóm hàng, ngày bắt đầu và ngày kết thúc. Đầu ra chỉ có một result set với các cột ổn định. Dùng mã nhóm thay vì tên nhóm giúp tránh trùng tên và thay đổi ngôn ngữ.
@ItmsGrpCod INT: mã nhóm hàng từ bảngOITB.@FromDate DATE: ngày bắt đầu, có tính vào báo cáo.@ToDate DATE: ngày kết thúc, có tính vào báo cáo.
Trước khi phát triển, cần thống nhất cách xử lý chứng từ hủy, credit memo, tiền tệ, thuế và ngày hạch toán. “Doanh thu” là một chỉ tiêu nghiệp vụ, không chỉ là phép cộng một cột.
Bước 2: Tạo thủ tục chỉ đọc trên SQL Server
CREATE OR ALTER PROCEDURE dbo.usp_PDH_SalesByItemGroup
@ItmsGrpCod INT,
@FromDate DATE,
@ToDate DATE
AS
BEGIN
SET NOCOUNT ON;
IF @ToDate < @FromDate
THROW 50001, 'ToDate must be greater than or equal to FromDate.', 1;
SELECT
T0.DocEntry,
T0.DocNum,
T0.DocDate,
T0.CardCode,
T0.CardName,
T1.ItemCode,
T1.Dscription,
T1.Quantity,
T1.LineTotal
FROM OINV AS T0
INNER JOIN INV1 AS T1
ON T1.DocEntry = T0.DocEntry
INNER JOIN OITM AS T2
ON T2.ItemCode = T1.ItemCode
WHERE T0.CANCELED = 'N'
AND T2.ItmsGrpCod = @ItmsGrpCod
AND T0.DocDate >= @FromDate
AND T0.DocDate < DATEADD(DAY, 1, @ToDate);
END;
Ví dụ minh họa dùng A/R Invoice (OINV/INV1) và chưa trừ A/R Credit Memo. Báo cáo doanh thu thực tế phải bổ sung quy tắc hoàn trả, chiết khấu, thuế và quy đổi tỷ giá theo định nghĩa đã được Finance phê duyệt.
Tên thủ tục dùng tiền tố usp_ thay vì sp_; trong SQL Server, sp_ thường gắn với system stored procedure và có thể tạo thêm chi phí phân giải tên. Với môi trường SAP, DBA cũng cần kiểm tra quy chuẩn nâng cấp, sao lưu và quyền sở hữu đối tượng trước khi đưa thủ tục vào company database.
Bước 3: Khai báo tham số trong Query Manager
Trong Query Generator hoặc phần chỉnh sửa query, dùng placeholder của SAP Business One. Các comment tham chiếu cột giúp client hiểu ngữ cảnh tham số và có thể hiển thị lựa chọn phù hợp.
DECLARE @ItmsGrpCod INT;
DECLARE @FromDate DATE;
DECLARE @ToDate DATE;
/* SELECT FROM OITB T0 WHERE T0.ItmsGrpCod = [%0] */
SET @ItmsGrpCod = [%0];
/* SELECT FROM OINV T1 WHERE T1.DocDate >= [%1] */
SET @FromDate = '[%1]';
/* SELECT FROM OINV T2 WHERE T2.DocDate <= [%2] */
SET @ToDate = '[%2]';
EXEC dbo.usp_PDH_SalesByItemGroup
@ItmsGrpCod = @ItmsGrpCod,
@FromDate = @FromDate,
@ToDate = @ToDate;
Cú pháp prompt có thể khác nhẹ theo phiên bản, localization và client patch level. Hãy thử trên sandbox bằng chính bản SAP Business One đang vận hành. Không nối trực tiếp giá trị người dùng vào dynamic SQL; nếu thủ tục thực sự cần dynamic SQL, sử dụng sp_executesql với tham số.
Bước 4: Lưu query và phân quyền theo nguyên tắc tối thiểu
Lưu câu lệnh vào category có tên rõ ràng, chẳng hạn PDH – Sales Reports. SAP Business One cho phép category liên kết với authorization group; người không có quyền với nhóm sẽ không xem hoặc chạy query tương ứng.
Ngoài quyền ở SAP Business One, tài khoản cơ sở dữ liệu mà client sử dụng cũng cần quyền thực thi thủ tục. Không cấp db_owner chỉ để một báo cáo chạy được. SAP Help còn tách quyền Execute Non-select SQL Statement và Modify SQL Statement; doanh nghiệp nên cấp đúng vai trò và kiểm tra trên môi trường thử nghiệm.
Bước 5: Kiểm thử cả số liệu lẫn hiệu năng
- Đối chiếu tổng tiền và số chứng từ với báo cáo chuẩn của SAP cho cùng kỳ.
- Thử ngày biên, nhóm hàng không có dữ liệu và khoảng ngày không hợp lệ.
- Kiểm tra chứng từ hủy, credit memo, nhiều tiền tệ và quyền người dùng.
- Đọc actual execution plan; đo logical reads và thời gian với dữ liệu đại diện.
- Xác nhận thủ tục chỉ trả về đúng một result set mà Query Manager cần.
Nếu kết quả chậm, không thêm index vào bảng SAP theo cảm tính. Trước hết kiểm tra điều kiện lọc, join, cardinality và index hiện có; mọi thay đổi vật lý trên company database phải đi qua DBA/đối tác triển khai và đánh giá ảnh hưởng nâng cấp.
Các lỗi thường gặp
| Hiện tượng | Nguyên nhân cần kiểm tra | Hướng xử lý |
|---|---|---|
| Query không chạy | Thiếu quyền EXECUTE hoặc quyền SAP B1 | Kiểm tra authorization và database principal |
| Prompt sai kiểu | Placeholder hoặc comment tham chiếu sai | Khai báo kiểu rõ ràng, thử trên đúng client |
| Sai số doanh thu | Thiếu credit memo, hủy hoặc tỷ giá | Chốt định nghĩa với Finance và đối soát |
| Chạy trên HANA bị lỗi | Dùng T-SQL cho SQLScript | Viết lại procedure và dùng CALL theo HANA |
Nguyên tắc an toàn không được bỏ qua
Không dùng stored procedure được gọi từ Query Manager để INSERT, UPDATE hoặc DELETE trực tiếp các bảng nghiệp vụ SAP Business One. Việc ghi dữ liệu cần đi qua cơ chế được SAP hỗ trợ như DI API, Service Layer hoặc chức năng chuẩn của ứng dụng để bảo toàn validation và tính nhất quán nghiệp vụ.
Không nhúng mật khẩu, connection string hoặc dữ liệu nhạy cảm trong query. Ghi nhận chủ sở hữu, phiên bản, mục đích, tham số, quyền và kế hoạch rollback của từng thủ tục. Đây là phần của quản trị thay đổi, không chỉ là kỹ thuật SQL.
Kết luận
Gọi stored procedure từ SAP Business One Query Manager phù hợp khi doanh nghiệp cần tái sử dụng logic báo cáo phức tạp trên SQL Server. Một triển khai tốt phải đồng thời đạt bốn điều kiện: thủ tục chỉ đọc, tham số được kiểm soát, quyền tối thiểu và số liệu đã đối soát với nghiệp vụ. Nếu thiếu một trong bốn, sự tiện lợi của Query Manager có thể nhanh chóng biến thành rủi ro vận hành.
Xem video minh họa trên YouTube
Tài liệu tham khảo
Tác giả: Nghĩa Nguyễn (Paul) – Tư vấn hệ thống & Phát triển giải pháp ERP - BI - Automation cho doanh nghiệp SME.
- 🌐 Website: Paul Digital Hub
- 📰 Blog: Hội nhập kỷ nguyên số
- 💼 LinkedIn: Paul Nguyen – Digital Consultant
- 📊 Kinh nghiệm: 10+ năm triển khai & tư vấn SAP Business One, CRM, Power BI, Microsoft 365
- 📞 Zalo: 0933 873 165
🚀 Paul Digital Consultant – Kết nối Công nghệ & Doanh nghiệp