T-SQL İle XML Okumak – Read XML With T-SQL yazım ile farklı farklı içeriklere devam ediyorum. Bu yazımda size son zamanlarda sürekli gördüğümüz elektronik belgelerden birisi olan satış e-irsaliyesindeki bilgileri okuyacağız. Yalnız burada tek bir irsaliye değil toplu irsaliyedir ve bu toplu e-irsaliye SAP yazılımından alınmıştır.
Bu okuma yöntemi de SAP için özel değildir. Bu yazının amacı T-SQL ile XML okuma yöntemidir.
NOT: Bu okuduğumuz dosya XML dosyasıdır. Tekli e-fatura, e-irsaliye gibi içerisinde tasarımlarını da içeren dosyalar değillerdir. Bunu netleştirmek istiyorum.
T-SQL İle XML Okumak – Read XML With T-SQL
SAP’den alınan bir satış irsaliye listesi var elimde ancak bu dosyayı maalesef paylaşamayacağım. Ancak burada dosyanın içerisindeki tagları (etiketleri) paylaşabilirim. Normal şartlarda xml dosyaları serialize ve deserialize işlemleri çevirebiliyoruz ancak bazı durumlarda bunu yapamıyoruz. En azından ben elimdeki dosya için bunu yapamadım. Bu sebeple farklı okuma yöntemleri denedim. Daha öncleri zaten bir çok farklı yöntemle denemiştim ancak her seferinde farklı şeyler denemiştim.
Bu yöntemi bulmadan önceki işimde biraz dar zamanım vardı ve daha hızlı bir çözüm bulmam gerekiyordu. Biraz araştırma yaparak, T-SQL ile okunabildiğini fark ettim. biraz uğraştım ve sonunda istediğimi çözebildim.
Buradan github paylaşımıma gidebilirsiniz. Şimdi anlatıma geçelim.
T-SQL Kullanarak XML Okumak
Burada maalesef kodları çok fazla açıklayamayacağım Kodları görelim.
Kodlarımıza biraz bakalım.
DECLARE @Xml TABLE ( Data XML ); INSERT INTO @Xml ( Data ) SELECT * FROM OPENROWSET(BULK N'C:\xmls\SALES_DISPATCHES.xml', SINGLE_BLOB) O; SELECT DISPATCH.[Row].value('TYPE[1]', 'NVARCHAR(50)') AS [TYPE] , DISPATCH.[Row].value('NUMBER[1]', 'NVARCHAR(50)') AS NUMBER , DISPATCH.[Row].value('DATE[1]', 'NVARCHAR(50)') AS DATE , DISPATCH.[Row].value('DOC_NUMBER[1]', 'NVARCHAR(50)') AS DOC_NUMBER , DISPATCH.[Row].value('ARP_CODE[1]', 'NVARCHAR(50)') AS ARP_CODE , [TRANSACTION].[Row].value('TYPE[1]', 'NVARCHAR(50)') AS [T_TYPE] , [TRANSACTION].[Row].value('MASTER_CODE[1]', 'NVARCHAR(50)') AS MASTER_CODE , [TRANSACTION].[Row].value('QUANTITY[1]', 'NVARCHAR(50)') AS QUANTITY , [TRANSACTION].[Row].value('UNIT_CODE[1]', 'NVARCHAR(50)') AS UNIT_CODE , [TRANSACTION].[Row].value('UNIT_CONV1[1]', 'NVARCHAR(50)') AS UNIT_CONV1 , [TRANSACTION].[Row].value('VAT_INCLUDED[1]', 'NVARCHAR(50)') AS VAT_INCLUDED , [TRANSACTION].[Row].value('VAT_RATE[1]', 'NVARCHAR(50)') AS VAT_RATE FROM @Xml X CROSS APPLY X.Data.nodes('/SALES_DISPATCHES/DISPATCH') DISPATCH ( [Row] ) CROSS APPLY DISPATCH.[Row].nodes('TRANSACTIONS/TRANSACTION') [TRANSACTION] ( [Row] )
SALES_DISPATCHES root node’dur. DISPATCH ise child node’dur.
SALES_DISPATCHES = Satış İrsaliyeleri
DISPATCH = İrsaliye
TRANSACTIONS = Satış İrsaliye Kalemleri
TRANSACTION = Satış İrsaliye Kalemi
Yani şöyle bir durum var.
SALES_DISPATCHES > DISPATCH > TRANSACTIONS > TRANSACTION – her bir node diğerinin altında yer alıyor. Örnek bir düzen vereyim.
- SALES_DISPATCHES (Satış İrsaliyeleri)
- DISPATCH (İrsaliye)
- TRANSACTIONS (İrsaliye Kalemleri)
- TRANSACTION (İrsaliye Kalemi)
- TRANSACTION (İrsaliye Kalemi)
- TRANSACTIONS
- DISPATCH
- DISPATCH
- TRANSACTIONS
- TRANSACTION
- TRANSACTION
- TRANSACTION
- TRANSACTION
- TRANSACTIONS
- DISPATCH
- DISPATCH
- TRANSACTIONS
- TRANSACTION
- TRANSACTION
- TRANSACTION
- TRANSACTIONS
- DISPATCH
- SALES_DISPATCHES
Kodlarda gördüğünüz Type, Numbe, Date gibi ifadeler ise verileri tutan sütunlarımızı temsil etmektedir.
Kodlarda gördüğünüz gibi değişken olarak tablo tanımladık ve xml’i olduğu gibi içe aktardık. Sonrasında bu tablo üzerinde bir select çalıştırıyoruz. From kısmına geldiğimizde DISPATCH ve TRANSACTION arasındaki bağlantıyı göstermek için CROSS APPLY kullanıyoruz.
Örnek çıktının nasıl göründüğünü github ‘da paylaştığım dosyada görebilirsiniz. Sizde kendi xml dosyalarınızı okuyabilmek için biraz uğraşarak çözebilirsiniz.
T-SQL İle XML Okumak – Read XML With T-SQL yazımda bu kadar arkadaşlar. Diğer derslerimizde görüşmek üzere.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Ayrıca bu projenin Github Sayfasına bağlantıya tıklayarak ulaşabilirsiniz.
Arkadaşlar ayrıca Telegram kanalıma abone olabilir ve yeni yazılardan anında haberdar olabilirisiniz. Discord’a katılmayı unutmayın.
Sağlıcakla ve kodla kalın….