Gọi Stored Procedure từ SAP Business One Query Manager: Hướng dẫn an toàn

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.

Giao diện Query Manager trong SAP Business One

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ảng OITB.
  • @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ố.

Hộp thoại nhập tham số của Query Manager trong SAP Business One

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 StatementModify 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.

🚀 Paul Digital Consultant – Kết nối Công nghệ & Doanh nghiệp

Viết một bình luận

📊 Thống kê lượt xem

• Hôm nay: 284 • Hôm qua: 60 • Tháng này: 948 • Tháng trước: 1990 Tổng: 21737