Mã nguồn Visual C++ lấy thông tin hóa đơn dạng XML từ trang web Bkav eHoaDon (2 người xem)

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

nguyendang95

Thành viên hoạt động
Tham gia
25/5/22
Bài viết
170
Được thích
160
Đính kèm theo bài viết này là mã nguồn Visual C++ giúp lấy thông tin hóa đơn dạng XML từ trang web Bkav eHoaDon.
Để gọn nhẹ nhất có thể, code sử dụng thư viện "cây nhà lá vườn có sẵn của Windows", như WinHTTP API để kết nối với máy chủ, Microsoft XML, v6.0 để phân tích cú pháp XML, Microsoft HTML Object Library để đọc tập tin HTML và Microsoft VBScript Regular Expression 5.5 để trích xuất chuỗi bằng phương pháp Biểu thức Chính quy.

1760098738603.png
1760098798447.png

Sử dụng trong VBA:
Mã:
Option Explicit

Private Sub LookupInvoice()
    Dim objInvoiceManager As InvoiceManagerLib.BkavEHoaDon
    Dim objInvoiceInfo As InvoiceManagerLib.BkavEHoaDonInvoiceInfo
    Set objInvoiceManager = New InvoiceManagerLib.BkavEHoaDon
    Set objInvoiceInfo = objInvoiceManager.Lookup("Ma_hoa_don")
    Debug.Print objInvoiceInfo.PBan
End Sub

Lưu ý: Cần phải cài đặt thành phần ATL Project trước khi chỉnh sửa code.
 

File đính kèm

Lần chỉnh sửa cuối:
Cho hỏi cái "Ma_hoa_don" này là mã gì bạn? Mã tra cứu?
Chính là mã hóa đơn dùng để tra cứu trên trang web đó bạn.
Bài đã được tự động gộp:

Cập nhật: Sửa một số lỗi tiềm tàng gây rò rỉ bộ nhớ và tối ưu tốc độ xử lý khi làm việc với bộ đệm trong WinHTTP API.
 
Chính là mã hóa đơn dùng để tra cứu trên trang web đó bạn.
:) Tính ra để muốn có cái mã tra cứu đó là phải tải file hoá đơn PDF về rồi mới có mã, chứ file xml, html là không có mã rồi.

Screenshot 2025-10-11 at 11.34.21.png

File XML thì đã có thể tải ngay từ trang: https://hoadondientu.gdt.gov.vn/ rồi. Nó cũng giống y như cái file XML tải từ trang hoá đơn gốc.
Cách tôi làm là tải luôn từ cái link tra cứu trích xuất ra từ file XML hoặc file json lấy từ trang hddt và chỉ tải file PDF. Ngặt nỗi là mỗi nhà cung cấp giải pháp lại có một cách tải hoá đơn gốc khác nhau nên tôi cũng làm biếng làm cho từng nhà.

Đính kèm là file tôi làm lúc trước để tải hoá đơn gốc nhưng chỉ mới làm được cho BKAV.
 

File đính kèm

:) Tính ra để muốn có cái mã tra cứu đó là phải tải file hoá đơn PDF về rồi mới có mã, chứ file xml, html là không có mã rồi.

View attachment 310022

File XML thì đã có thể tải ngay từ trang: https://hoadondientu.gdt.gov.vn/ rồi. Nó cũng giống y như cái file XML tải từ trang hoá đơn gốc.
Cách tôi làm là tải luôn từ cái link tra cứu trích xuất ra từ file XML hoặc file json lấy từ trang hddt và chỉ tải file PDF. Ngặt nỗi là mỗi nhà cung cấp giải pháp lại có một cách tải hoá đơn gốc khác nhau nên tôi cũng làm biếng làm cho từng nhà.

Đính kèm là file tôi làm lúc trước để tải hoá đơn gốc nhưng chỉ mới làm được cho BKAV.
Cái này cách đây mấy năm tôi làm công cụ tải hóa đơn dạng PDF theo mã hóa đơn mà họ cung cấp do một khách hàng yêu cầu, tất nhiên là sẽ có nhiều cách.
 
:) Tính ra để muốn có cái mã tra cứu đó là phải tải file hoá đơn PDF về rồi mới có mã, chứ file xml, html là không có mã rồi.

View attachment 310022

File XML thì đã có thể tải ngay từ trang: https://hoadondientu.gdt.gov.vn/ rồi. Nó cũng giống y như cái file XML tải từ trang hoá đơn gốc.
Cách tôi làm là tải luôn từ cái link tra cứu trích xuất ra từ file XML hoặc file json lấy từ trang hddt và chỉ tải file PDF. Ngặt nỗi là mỗi nhà cung cấp giải pháp lại có một cách tải hoá đơn gốc khác nhau nên tôi cũng làm biếng làm cho từng nhà.

Đính kèm là file tôi làm lúc trước để tải hoá đơn gốc nhưng chỉ mới làm được cho BKAV.
Cái này chỉ đơn thuần là tải hóa đơn dạng PDF thì nên viết bằng ngôn ngữ khác cho tiện, vừa nhanh vừa hiệu quả, không bị trói buộc với những hạn chế của VBA.
Viết một ứng dụng Console Application bằng .NET (vd: Visual C#) chẳng hạn, sau đó sử dụng những class có hỗ trợ phương thức bất đồng bộ thì sẽ hiệu quả hơn so với code VBA kia, nếu tải hóa đơn dạng PDF số lượng lớn là biết ngay. (vd: HttpClient, StreamReader, FileStream, System.Xml chưa kể nếu tận dụng thêm LINQ to XML thì càng tốt nữa).
Với Python thì đồ chơi có sẵn hết, hỗ trợ tận răng, quan trọng là khả năng lập trình viên "xào nấu" code như thế nào thôi.
Với C++ thì quản lý bộ nhớ sẽ vất vả hơn, nhưng mà nếu dùng hàng "cây nhà lá vườn" có sẵn của Windows thì cũng được, như WinHTTP API và một số hàm Win32 API để đọc/ghi nội dung nhị phân kết hợp với I/O Completion Ports hoặc OVERLAPPED.
 
Lần chỉnh sửa cuối:

Bài viết mới nhất

Back
Top Bottom