Archive for Ekim 15th, 2018

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.