Nhờ giúp lấy dữ liệu từ file xml

Liên hệ QC

vanlinh_2904

Thành viên hoạt động
Tham gia
20/10/12
Bài viết
105
Được thích
3
Chào các Anh Chị,
Em nhờ các Anh, Chị viết VBA giúp em trích xuất lấy mã tra cứu hóa đơn xml (file đính kèm) ở trường /DLHDon/TTKhac/TTin/DLieu sang excel, để kết quả là mã "L0IXU49XNNN"
Em cảm ơn các anh/chị trước nhé.
 

File đính kèm

  • invoice1.rar
    5.8 KB · Đọc: 19
Chào các Anh Chị,
Em nhờ các Anh, Chị viết VBA giúp em trích xuất lấy mã tra cứu hóa đơn xml (file đính kèm) ở trường /DLHDon/TTKhac/TTin/DLieu sang excel, để kết quả là mã "L0IXU49XNNN"
Em cảm ơn các anh/chị trước nhé.
Chắc chổ này nè bạn.
 
Upvote 0
Chắc chổ này nè bạn.
Mình có thấy mấy file ở đó nhưng chưa thấy có lấy được mã tra cứu hóa đơn xml như mình mong muốn đó bạn.
 
Upvote 0
Trong File XML không có hiển thị mã tra cứu đó bạn nhé, mã chỉ thể hiện ở File PDF thôi.
Thân !
Sao mình lại thấy trên xml lại có thông tin mã tra cứu đó bạn
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
 

File đính kèm

  • TT.jpg
    TT.jpg
    20.1 KB · Đọc: 8
Upvote 0
Đúng là những là cung cấp họ có mã tra cứu em nhé (Viettel), chẳng hạn như BKAV thì không có. Nên không thể nào làm được nhé, tránh bị lỗi, cái này đã trao đổi tác giả rồi. Thân!
Sao mình lại thấy trên xml lại có thông tin mã tra cứu đó bạn
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
 
Upvote 0
Sao mình lại thấy trên xml lại có thông tin mã tra cứu đó bạn
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
1. Cái mà bạn cần lấy theo như hình đính kèm nó nằm gần cuối tập tin. Nhưng ngay ở đầu tập tin tôi nhìn thấy

matc.png

Vậy chỗ tôi đánh dấu và chỗ bạn muốn lấy có chắc chắn luôn như nhau không? Nếu luôn như nhau thì lấy ngay ở đầu cho đơn giản.

2. Như các bài phản hồi thì có thể chỗ bạn cần lấy không có, tức có 2 loại hóa đơn: đã thanh toán và chưa thanh toán? Tôi không làm chuyên môn của bạn nên không biết. Nếu có 2 loại hóa đơn thì bạn phải đính kèm cả 2 tập tin XML và mô tả từ mỗi tập tin lấy gì từ chỗ nào.

Việc của bạn ngoài các phương pháp khác thì có thể đọc thuần túy tập tin XML rồi lấy ra thôi. Chả có gì bí hiểm ở đây.
 
Upvote 0
1. Cái mà bạn cần lấy theo như hình đính kèm nó nằm gần cuối tập tin. Nhưng ngay ở đầu tập tin tôi nhìn thấy

View attachment 279600

Vậy chỗ tôi đánh dấu và chỗ bạn muốn lấy có chắc chắn luôn như nhau không? Nếu luôn như nhau thì lấy ngay ở đầu cho đơn giản.

2. Như các bài phản hồi thì có thể chỗ bạn cần lấy không có, tức có 2 loại hóa đơn: đã thanh toán và chưa thanh toán? Tôi không làm chuyên môn của bạn nên không biết. Nếu có 2 loại hóa đơn thì bạn phải đính kèm cả 2 tập tin XML và mô tả từ mỗi tập tin lấy gì từ chỗ nào.

Việc của bạn ngoài các phương pháp khác thì có thể đọc thuần túy tập tin XML rồi lấy ra thôi. Chả có gì bí hiểm ở đây.
ID hóa đơn đó một số nhà cung cấp hóa đơn lại không phải là mã tra cứu như invoce2 này , mã tra cứu nằm thường ở /DLHDon/TTKhac/TTin/DLieu như 2 hóa đơn này bạn.
 

File đính kèm

  • invoice1.rar
    5.8 KB · Đọc: 6
  • invoice2.rar
    5.2 KB · Đọc: 10
Upvote 0
ID hóa đơn đó một số nhà cung cấp hóa đơn lại không phải là mã tra cứu như invoce2 này , mã tra cứu nằm thường ở /DLHDon/TTKhac/TTin/DLieu như 2 hóa đơn này bạn.
Tôi đã viết rõ rồi.

2. Như các bài phản hồi thì có thể chỗ bạn cần lấy không có, tức có 2 loại hóa đơn: đã thanh toán và chưa thanh toán? Tôi không làm chuyên môn của bạn nên không biết. Nếu có 2 loại hóa đơn thì bạn phải đính kèm cả 2 tập tin XML và mô tả từ mỗi tập tin lấy gì từ chỗ nào.

Trong tập tin thứ 2 bạn định lấy chỗ nào thì phải VIẾT RÕ. Tôi không có thời gian tìm kiếm đâu. Bạn biết mà quyết không nói, bắt tôi phải tìm?

Trong tập tin 2 DLHDon làm gì có con nào là TTKhac. TTKhac chỉ là con của DLHDon/TTChung hoặc con của DLHDon/DSHHDVu/HHDVu
 
Upvote 0
Tôi đã viết rõ rồi.



Trong tập tin thứ 2 bạn định lấy chỗ nào thì phải VIẾT RÕ. Tôi không có thời gian tìm kiếm đâu. Bạn biết mà quyết không nói, bắt tôi phải tìm?

Trong tập tin 2 DLHDon làm gì có con nào là TTKhac. TTKhac chỉ là con của DLHDon/TTChung hoặc con của DLHDon/DSHHDVu/HHDVu
À, mình xin lỗi bạn nhé. Mình không chú ý nên không kiểm tra kỹ, giờ mình nhìn lại tập tin thứ 2 nó lại ở đây /DLHDon/TTChung/TTKhac/TTin/DLieu với mã là 1A8C5AEF37
<TTin>
<TTruong>Mã TC</TTruong>
<KDLieu>string</KDLieu>
<DLieu>1A8C5AEF37</DLieu>
</TTin>
</TTKhac>
</TTChung>

Còn ở tập tin thứ nhất thì nằm ở /DLHDon/TTKhac/TTin/DLieu với mã L0IXU49XNNN
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
 
Upvote 0
À, mình xin lỗi bạn nhé. Mình không chú ý nên không kiểm tra kỹ, giờ mình nhìn lại tập tin thứ 2 nó lại ở đây /DLHDon/TTChung/TTKhac/TTin/DLieu với mã là 1A8C5AEF37
<TTin>
<TTruong>Mã TC</TTruong>
<KDLieu>string</KDLieu>
<DLieu>1A8C5AEF37</DLieu>
</TTin>
</TTKhac>
</TTChung>

Còn ở tập tin thứ nhất thì nằm ở /DLHDon/TTKhac/TTin/DLieu với mã L0IXU49XNNN
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
Tự viết để giết thời gian.

Nếu chỉ có 2 cấu trúc và 2 chỗ để tìm như bạn khẳng định thì code như sau. Nếu tập tin khác với lời của bạn thì kết quả sẽ là chuỗi rỗng.

Mã:
Function TransactionID(ByVal XMLfilename As String) As String
'    XMLfilename: duong dan toi tap tin XML
'    Doc truong DLieu cua DLHDon/TTKhac/TTKhac/TTin ma co truong TTruong = "TransactionID"
'    hoac DLHDon/TTChung/TTKhac/TTin ma co TTruong = "Mã TC"
Dim xmldoc As Object, ttkhac As Object, node As Object
    Set xmldoc = CreateObject("MSXML2.DOMDocument")
    xmldoc.async = False
    If xmldoc.Load(XMLfilename) Then
        Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTKhac")
        If Not ttkhac Is Nothing Then
            For Each node In ttkhac.ChildNodes
                If node.SelectSingleNode("TTruong").Text = "TransactionID" Then
                    TransactionID = node.SelectSingleNode("DLieu").Text
                    Exit For
                End If
            Next node
        End If
        If TransactionID = "" Then
            Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/TTKhac")
            If Not ttkhac Is Nothing Then
                For Each node In ttkhac.ChildNodes
                    If node.SelectSingleNode("TTruong").Text = "M" & ChrW(227) & " TC" Then
                        TransactionID = node.SelectSingleNode("DLieu").Text
                        Exit For
                    End If
                Next node
            End If
        End If
    End If
    Set xmldoc = Nothing
End Function

'  ví dụ để test hàm TransactionID
Sub test()
Dim XMLfilename, ma As String
    XMLfilename = Application.GetOpenFilename("XML files (*.xml), *.xml")
    If XMLfilename <> False Then
        ma = TransactionID(XMLfilename)
        MsgBox "Ma = " & ma
    End If
End Sub
 
Upvote 0
Tự viết để giết thời gian.

Nếu chỉ có 2 cấu trúc và 2 chỗ để tìm như bạn khẳng định thì code như sau. Nếu tập tin khác với lời của bạn thì kết quả sẽ là chuỗi rỗng.

Mã:
Function TransactionID(ByVal XMLfilename As String) As String
'    XMLfilename: duong dan toi tap tin XML
'    Doc truong DLieu cua DLHDon/TTKhac/TTKhac/TTin ma co truong TTruong = "TransactionID"
'    hoac DLHDon/TTChung/TTKhac/TTin ma co TTruong = "Mã TC"
Dim xmldoc As Object, ttkhac As Object, node As Object
    Set xmldoc = CreateObject("MSXML2.DOMDocument")
    xmldoc.async = False
    If xmldoc.Load(XMLfilename) Then
        Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTKhac")
        If Not ttkhac Is Nothing Then
            For Each node In ttkhac.ChildNodes
                If node.SelectSingleNode("TTruong").Text = "TransactionID" Then
                    TransactionID = node.SelectSingleNode("DLieu").Text
                    Exit For
                End If
            Next node
        End If
        If TransactionID = "" Then
            Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/TTKhac")
            If Not ttkhac Is Nothing Then
                For Each node In ttkhac.ChildNodes
                    If node.SelectSingleNode("TTruong").Text = "M" & ChrW(227) & " TC" Then
                        TransactionID = node.SelectSingleNode("DLieu").Text
                        Exit For
                    End If
                Next node
            End If
        End If
    End If
    Set xmldoc = Nothing
End Function

'  ví dụ để test hàm TransactionID
Sub test()
Dim XMLfilename, ma As String
    XMLfilename = Application.GetOpenFilename("XML files (*.xml), *.xml")
    If XMLfilename <> False Then
        ma = TransactionID(XMLfilename)
        MsgBox "Ma = " & ma
    End If
End Sub
Có thể lấy 2 tệp tin cùng lúc và kết quả được xuất excel được không bạn, kiểu như vậy
Số hóa đơn
221A8C5AEF37
1L0IXU49XNNN
 
Upvote 0
Có thể lấy 2 tệp tin cùng lúc và kết quả được xuất excel được không bạn, kiểu như vậy
Số hóa đơn
221A8C5AEF37
1L0IXU49XNNN
Số hóa đơn lấy ở đâu? Kết quả nhập vào đâu? Vào đâu cũng được? Nếu một lần nữa tôi phải nài nỉ giải thích thì tôi sẽ dừng.
 
Upvote 0
Số hóa đơn lấy ở đâu? Kết quả nhập vào đâu? Vào đâu cũng được? Nếu một lần nữa tôi phải nài nỉ giải thích thì tôi sẽ dừng.
Số hóa đơn ở cả 2 tệp đều có chung /DLHDon/TTChung/SHDon, còn kết quả kết xuất ra ở đâu trên file excel cũng được hết bạn. cảm ơn bạn nhiều.
 
Upvote 0
Chạy sub doc_Ma -> chọn 1 hoặc nhiều tập tin.

Kết quả được nhập vào Sheet1!A2 (A1, B1 chứa tiêu đề). Nếu muốn vị trí khác thì tự sửa.

Mã:
Function Shd_Ma(XMLfilename)
'    XMLfilename: mang 1 chieu chua cac duong dan toi tap tin XML
'    Doc truong DLieu cua DLHDon/TTKhac/TTKhac/TTin ma co truong TTruong = "TransactionID"
'    hoac DLHDon/TTChung/TTKhac/TTin ma co TTruong = "MaŢ TC"
'    ham tra ve mang 2 chieu: cot 1 la So Hoa Don, cot 2 la Ma
Dim k As Long, result(), xmldoc As Object, ttkhac As Object, node As Object
    Set xmldoc = CreateObject("MSXML2.DOMDocument")
    xmldoc.async = False
    ReDim result(1 To UBound(XMLfilename), 1 To 2)
    For k = 1 To UBound(XMLfilename)
        If xmldoc.Load(XMLfilename(k)) Then
            result(k, 1) = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/SHDon").Text
            Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTKhac")
            If Not ttkhac Is Nothing Then
                For Each node In ttkhac.ChildNodes
                    If node.SelectSingleNode("TTruong").Text = "TransactionID" Then
                        result(k, 2) = node.SelectSingleNode("DLieu").Text
                        Exit For
                    End If
                Next node
            End If
            If IsEmpty(result(k, 2)) Then
                Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/TTKhac")
                If Not ttkhac Is Nothing Then
                    For Each node In ttkhac.ChildNodes
                        If node.SelectSingleNode("TTruong").Text = "M" & ChrW(227) & " TC" Then
                            result(k, 2) = node.SelectSingleNode("DLieu").Text
                            Exit For
                        End If
                    Next node
                End If
            End If
        End If
    Next k
    Shd_Ma = result
    Set xmldoc = Nothing
End Function

Sub doc_Ma()
Dim k As Long, result, XMLfilename, kq()
    XMLfilename = Application.GetOpenFilename("XML files (*.xml), *.xml", Title:="Hay chon mot hoac nhieu tap tin", MultiSelect:=True)
    If IsArray(XMLfilename) Then
        result = Shd_Ma(XMLfilename)
        ThisWorkbook.Worksheets("Sheet1").Range("A2").Resize(UBound(result, 1), UBound(result, 2)).Value = result
    End If
End Sub
 
Upvote 0
lấy mã tra cứu hóa đơn

Bạn phải lấy địa chỉ tra cứu cái mã kia nữa chứ.

Một lúc nào đó người ta thay đổi địa chỉ tra cứu lại không biết tại sao không tìm thấy hóa đơn.
(Hoặc hóa đơn của một đơn vị dịch vụ khác... )
 
Upvote 0
Web KT

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

Back
Top Bottom