XML’de metin değiştirmek
Merhaba
Ax ta E-Fatura süreçleriyle uğraşmayan yoktur. Biz SimpleUBL adında bir eklentiyle hem XML hemde UBL oluşturuyoruz. Şöyle bir ihtiyaç oldu bazı durumlarda bir alanın verisinin değiştirilmesi gerekiyor. Örneğin matbu irsaliye numarası. Bunun için gerekli tablolarda veriyi güncelleyip sonra E-Fatura UBL ini oluşturan kodu tekrar çağırınca direk güncelliyor. Ancak bu işlem biraz yavaş çok fazla kontrol ve işlem yapıyor. Bense çok basit sadece bir alanı değiştirmek istiyorum ve çok hızlı olması gerekiyor. Bunu için str fonksiyonlarından faydalanarak bir metot yazdım. Umarım işinize yarar.
Örnek UBL in bir parçası şöyle:
<?xml version="1.0" encoding="utf-8"?> <cbc:UBLVersionID>2.1</cbc:UBLVersionID> <cbc:CustomizationID>TR1.2</cbc:CustomizationID> <cbc:ProfileID>TEMELFATURA</cbc:ProfileID> <cbc:ID>YTD20182222225</cbc:ID> <cbc:CopyIndicator>false</cbc:CopyIndicator> <cbc:UUID>E01C17F9-B13B-4Df5E-BB5A-92F52E17ff3AB0</cbc:UUID> <cbc:IssueDate>2018-09-01</cbc:IssueDate> <cbc:IssueTime>06:43:11.0000000+03:00</cbc:IssueTime> <cbc:InvoiceTypeCode>ISTISNA</cbc:InvoiceTypeCode> <cbc:Note>Yazıyla : TRY TRY</cbc:Note> <cbc:Note>TOPLAMADET: 1 / 22,00 </cbc:Note> <cbc:LineCountNumeric>1</cbc:LineCountNumeric> <cac:OrderReference> <cbc:ID>YKS022222222</cbc:ID> <cbc:IssueDate>2018-08-08</cbc:IssueDate> <cbc:IssueTime>07:25:31.0000000+03:00</cbc:IssueTime> </cac:OrderReference> <cac:DespatchDocumentReference> <cbc:ID>SVK000343433</cbc:ID> <cbc:IssueDate>2018-09-01</cbc:IssueDate> </cac:DespatchDocumentReference> <cac:Signature> <cbc:ID schemeID="VKN_TCKN">11111111</cbc:ID> <cac:SignatoryParty>
Ben ‘cbc:id SVK000343433 cbc:id’ buradaki SVK000343433 bu numarayı değiştirmek istiyorum.
Bir kaç zorluk var. Birincisi bu numaranın uzunluğu sabit değil.
İkincisi Her bir satır yeni satir karakteriyle ayrılmış durumda.
static void FD_UpdateXml(Args _args) { EInvoiceTable eInvoiceTable; str str1; str str2; str str3; int i ,j; num packingSlipId = "FD000002"; ; ttsBegin; select forUpdate eInvoiceTable where eInvoiceTable.RecId == 5637292931; str3 = strFmt("<cbc:ID>%1</cbc:ID>" , DmrPackipackingSlipIdngSlipId ); // Değiştireceğim metin i = strScan( eInvoiceTable.InvoiceXml , // İrsaliye numrasının başladığı yeri tespit ediyorum. "<cac:DespatchDocumentReference>" , 0, strLen(eInvoiceTable.InvoiceXml)); str1 = subStr( eInvoiceTable.InvoiceXml , i +31 , 50); // Karakteri sayip ilerletiyorum ve 50 karakterlik bir parçayı alıyorum //str1 böyle bir string oluyor <cbc:ID>YKS000017102</cbc:ID> <cbc:IssueDa j = strScan( str1 ,"</cbc:ID>" , 0, strLen(str1)); // Numaranın bitişini tespit ediyorum. str2 = subStr( eInvoiceTable.InvoiceXml , i +31 ,j+8); // Değiştirmek istediğim metne ulaşıyorun // str2 <cbc:ID>YKS000017102</cbc:ID> bu oldu eInvoiceTable.InvoiceXml = strReplace(eInvoiceTable.InvoiceXml ,str2 ,str3); // str2 yi str3 ile değiştiriyorum. eInvoiceTable.update(); ttsCommit; }
Selamlar.