<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rohith_Veerapalli</title>
    <description>The latest articles on DEV Community by Rohith_Veerapalli (@ni_klaus_4eb1581f851becee).</description>
    <link>https://dev.to/ni_klaus_4eb1581f851becee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3669234%2Fe69557f9-60ca-40fa-a9e7-8c78420322a8.png</url>
      <title>DEV Community: Rohith_Veerapalli</title>
      <link>https://dev.to/ni_klaus_4eb1581f851becee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ni_klaus_4eb1581f851becee"/>
    <language>en</language>
    <item>
      <title>Convert MT940 to xml in x++</title>
      <dc:creator>Rohith_Veerapalli</dc:creator>
      <pubDate>Tue, 04 Aug 2026 11:09:40 +0000</pubDate>
      <link>https://dev.to/ni_klaus_4eb1581f851becee/convert-mt940-to-xml-2d41</link>
      <guid>https://dev.to/ni_klaus_4eb1581f851becee/convert-mt940-to-xml-2d41</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// Process class to convert MT940 to XML
/// &amp;lt;/summary&amp;gt;
class ProcessMT940BankFiles
{
    /// &amp;lt;summary&amp;gt;
    /// Method to get the request and return response based on process
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name = "_xmlContent"&amp;gt;_xmlContent&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;xmlOutput&amp;lt;/returns&amp;gt;
    public static str getIncomingFileContent(Notes _xmlContent)
    {
        MT940Parameters    mt940Params;

        select firstonly * from mt940Params;


        str xmlOutput = ProcessMT940BankFiles::transformFile(_xmlContent, mt940Params.ESIncomingXSLTFormat);
        xmlOutput = ProcessMT940BankFiles::transformFile(xmlOutput, mt940Params.ESXML2Reconciliation);
        xmlOutput = ProcessMT940BankFiles::transformFile(xmlOutput, mt940Params.ESRecon2Composite);

        return xmlOutput;

    }

    ///// &amp;lt;summary&amp;gt;
    ///// Method to process the MT940 files and translate them accordingly
    ///// &amp;lt;/summary&amp;gt;
    ///// &amp;lt;param name = "_inputFileReader"&amp;gt;_inputFileReader&amp;lt;/param&amp;gt;
    ///// &amp;lt;param name = "_xslReader"&amp;gt;_xslReader&amp;lt;/param&amp;gt;
    ///// &amp;lt;returns&amp;gt;fileContent&amp;lt;/returns&amp;gt;
    static public str transformFile(Notes _inputFileReader, Notes _xslReader)
    {

        System.Xml.XmlUrlResolver               resolver;
        System.Xml.Xsl.XsltSettings             managedSettings;
        System.Xml.Xsl.XslCompiledTransform     managedTransform;

        managedSettings = new System.Xml.Xsl.XsltSettings(true, true);
        resolver = new System.Xml.XmlUrlResolver();
        str fileContent;
        managedTransform = new System.Xml.Xsl.XslCompiledTransform();
        System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.IgnoreComments = true;
        System.IO.Stream st = new System.IO.MemoryStream(System.Text.Encoding::UTF8.GetBytes(_xslReader));

        // Initialize reader for the xslt
        using(System.IO.StringReader xsltStringReader = new System.IO.StringReader(_xslReader))
        {
            using(System.Xml.XmlReader xsltXmlReader = System.Xml.XmlReader::Create(st,settings))
            {
                // Load xslt
                managedTransform.Load(xsltXmlReader, managedSettings, resolver);
                using(System.IO.StringReader xmlreader = new System.IO.StringReader(_inputFileReader))
                {
                    using(System.Xml.XmlReader inputFileXmlReader = System.Xml.XmlReader::Create(xmlreader))
                    {
                        using (var sw = new System.IO.StringWriter())
                        {
                            using (var xwo = System.Xml.XmlWriter::Create(sw, managedTransform.OutputSettings))
                            {
                                // Transform
                                managedTransform.Transform(inputFileXmlReader, xwo);
                                xwo.Flush();
                                fileContent = sw.ToString();
                                fileContent = strReplace(fileContent,"encoding=\"utf-16\"", '');
                            }
                        }
                    }
                }
            }
        }
        return fileContent;
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  here is the mt940 parameters table data
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Field - ESINCOMINGXSLTFORMAT
&lt;/h2&gt;

&lt;p&gt;Value-&lt;/p&gt;

&lt;p&gt;&amp;lt;!-- This stylesheet converts the root-tagged MT940 txt file into a flat XML file where each txt record line is converted to its corresponding XML record structure. That XML is then processed by another stylesheet to map to the AX Bank Statement Data Model (BankStmtISO* set of tables).  --&amp;gt;        &amp;lt;!-- This is the entry point to the transform --&amp;gt;               &amp;lt;!-- Select all the text you need to PreProcess and send it to the PreProcessor      The PreProcessor returns the value in 'txtToProcess' --&amp;gt;                                           &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;       &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;        &amp;lt;!-- Call the main template giving it the 'txtToProcess' as a parameter --&amp;gt;                       &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;        &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;    &amp;lt;!-- This template is similar to the 'main' function in X++. It partitions the file into records  and gives the record to the 'rowToFields' template which further partitions it into the corresponding   fields. Parameters:  1) rownum - to keep track of the rows parsed so far if required as part of some extension  2) txt    - the text that would be handled by this template  --&amp;gt;                         &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                          &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;     &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;    &amp;lt;!-- This template partitions each record into the corresponding fields based on the record type.  fields. It also keeps track of the structure of the bank statement by attaching the same 'accountGroup'   attribute to all accounts in that accountGroup and the same 'transactionGroup' attribute to all   transactions in the same Account. Parameters:    1) txt    - the text that would be handled by this template  2) rem    - to keep track of the text remaining after the current record  3) accountGroup - the current account group being traversed to poplate the 'accountGroup' attribute  4) transactionGroup - the current transaction group being traversed to poplate the 'transactionGroup' atribute  --&amp;gt;                                               &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;               &lt;a&gt;xsl:choose&lt;/a&gt;                &amp;lt;!-- Record Type '20' indicates Header Reference --&amp;gt;                                            &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;        &amp;lt;!-- Record Type '25' indicates Header Account Identification --&amp;gt;                                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                                   &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;        &amp;lt;!-- Record Type '28C' indicates Statement Identification --&amp;gt;                                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                                   &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                                  &amp;lt;!-- Record Type contains '60' indicates Statement Opening --&amp;gt;                                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                             &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;        &amp;lt;!-- Record Type contains '62' indicates Statement Closing --&amp;gt;                                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                             &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;        &amp;lt;!-- Record Type '61' indicates Transaction --&amp;gt;                                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                        &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;           &lt;a href="/xsl:attribute"&gt;/xsl:attribute&lt;/a&gt;                             &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;     &lt;a&gt;xsl:choose&lt;/a&gt;                &amp;lt;!-- call rowToFields recursively for the next record --&amp;gt;                                                                                          &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;         &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                &amp;lt;!-- call rowToFields recursively for the next record --&amp;gt;                                                                                          &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;         &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                      &lt;a&gt;xsl:otherwise&lt;/a&gt;         &amp;lt;!-- call rowToFields recursively for the next record --&amp;gt;                                                                                          &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;         &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;       &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                             &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;              &lt;a&gt;xsl:choose&lt;/a&gt;                                                                          &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                            &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                                &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       &lt;a&gt;xsl:otherwise&lt;/a&gt;                                    &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;        &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                                              &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                                                                                        &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;        &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                     &lt;a&gt;xsl:choose&lt;/a&gt;                             &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;         &lt;a&gt;xsl:otherwise&lt;/a&gt;                    &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;       &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;     &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                       &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                            &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                        &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                        &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                        &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                       &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                 &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                        &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                        &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                        &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                       &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                           &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;       &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;                           &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;       &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;                                                                                         &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;            &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;                                                                                           &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;                                                                                                                               &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                    &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;                                                                                            &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;         &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;       &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;     &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;        &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                &lt;a&gt;xsl:choose&lt;/a&gt;                                    &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                             &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;         &lt;a&gt;xsl:choose&lt;/a&gt;                                                    &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                            &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                                 &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                                                    &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                            &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                                 &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;         &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       &lt;a&gt;xsl:otherwise&lt;/a&gt;                                    &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                          &lt;a&gt;xsl:choose&lt;/a&gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       &amp;lt;!--                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       --&amp;gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;                                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;     &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;   &amp;lt;!-- This template PreProcesses the input. PreProcessing involves:  1) Ensuring that all continuation ('86') type records are correcly appended to their parent records  2) Ensuring that all records end with a consistent '/' as the end of record indicator--&amp;gt;                             &amp;lt;!-- Ensure that all extra redundant spaces are filtered off.--&amp;gt;                                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;     &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;     &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;     &amp;lt;!-- Any records of type ':86:' with previous record ending with 'CRLF' are a continuation of    the previous record--&amp;gt;                                              &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;     &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;     &amp;lt;!-- Ajust end--&amp;gt;                 &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;         &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;      &amp;lt;!-- Filter uncecessary characters around \n--&amp;gt;                  &lt;a&gt;xsl:choose&lt;/a&gt;                                               &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                        &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                       &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;    &amp;lt;!-- This is a simple string replacement helper template. It had to be written since AIF does not  support XSLT 2.0 and XSLT 1.0 does not have this function built in.  Parameters:  txt          = The text on which replacement is to be performed  strToBeReplaced = The string in 'txt' that needs replacement  strToReplace   = The string that replaces 'strToBeReplaced' in 'txt'--&amp;gt;                       &lt;a&gt;xsl:choose&lt;/a&gt;                                                                            &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       &lt;a&gt;xsl:otherwise&lt;/a&gt;                &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                                        &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;    &amp;lt;!-- This is a helper template that is used to skip records in a given line containing  comma seperated fields. The parameters are:  txt        = The text to skip records in  recordsToSkip = The number of records to be skipped  counter     = A counter variable to keep track of currently skipped records         in this recursive template. Helps us to get a base condition for recursion. --&amp;gt;                       &lt;a&gt;xsl:choose&lt;/a&gt;                                                          &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       &lt;a&gt;xsl:otherwise&lt;/a&gt;                &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;             &amp;lt;![CDATA[         public string isIdentificationCodeSupported(string input)         {           string isIdentificationCodeSupported = "No";            bool answer = input.Contains("?00")              || input.Contains("?31")             || input.Contains("?32")             || input.Contains("?33");            if (answer == true)           {             isIdentificationCodeSupported = "Yes";           }            return isIdentificationCodeSupported;         }                  public string lineExtensionSectionCount(string input)         {             int count;                          count = input.Split('?').Length - 1;                          return count.ToString();         }              public string splitNumberAndAlpha(string originalLine, string seperator)         {             //split the string by number and alpha, return them sepearted by seperator, and end with seperator             string result = string.Empty;             int i = 1;              if (originalLine == null || originalLine.Length == 0)             {                 return "";             }              bool isLetter = Char.IsLetter(originalLine[0]);              foreach (char c in originalLine)             {                 bool isLetterCurrent;                  isLetterCurrent = Char.IsLetter(c);                                  if (isLetterCurrent != isLetter)                 {                     result += (i++) + seperator;                     isLetter = isLetterCurrent;                 }                 result += c;             }             result += (i++) + seperator;              return result;         }                  public string splitMT940TransactionLine(string originalLine)         {             //split the string by number and alpha, return them sepearted by seperator, and end with seperator             string result = string.Empty;             int i = 1;             int count = 0;             bool isSkip = false;             string seperator = ";";              if (originalLine == null || originalLine.Length == 0)             {                 return "";             }              bool isLetter = Char.IsLetter(originalLine[0]);              foreach (char c in originalLine)             {                 isSkip = false;                  if (i &amp;lt;= 3)                 {                     bool isLetterCurrent;                      isLetterCurrent = Char.IsLetter(c);                      if (isLetterCurrent != isLetter)                     {                         result += (i++) + seperator;                         isLetter = isLetterCurrent;                     }                 }                 else if (i &amp;lt;= 4)                 {                     if (count == 0)                     {                         count = 1;                     }                     count++;                      if (count == 5)                     {                         result += (i++) + seperator;                         count = 0;                     }                 }                 else if (i&amp;lt;=5)                 {                      if (c == '/')                     {                         isSkip = true;                         count++;                     }                      if (count == 2)                     {                         result += (i++) + seperator;                         count = 0;                     }                  }                 else if (i &amp;lt;= 6)                 {                     if (c == '\n')                     {                         isSkip = true;                         result += (i++) + seperator;                     }                 }                 else if (i &amp;lt;= 8)                 {                     if (c == '/')                     {                         count++;                     }                      if (count == 4)                     {                         result += (i++) + seperator;                         count = 0;                     }                 }                                  if (!isSkip)                 {                     result += c;                 }             }             result += (i++) + seperator;              return result;         }                  public string addFileEnd(string lines)         {             int lastDataLine = lines.LastIndexOf("\n:");             if (lastDataLine &amp;gt; 0)             {                 int lastLine = lines.IndexOf("\n", lastDataLine + 1);                 if (lastLine &amp;gt; 0)                 {                     lines = lines.Substring(0, lastLine + 1) + ":" + lines.Substring(lastLine + 1);                 }                 else                 {                     lines = lines + "\n:";                 }             }              return lines;         }     ]]&amp;gt;   &lt;a href="/msxsl:script"&gt;/msxsl:script&lt;/a&gt;         &amp;lt;![CDATA[           public string splitBySpeartors(string originalLine, string seperator, string originalSeperator1, string originalSeperator2 = "", string originalSeperator3 = "")         {             string line = originalLine;             int i = 1;              if (originalSeperator1 != null &amp;amp;&amp;amp; originalSeperator1.Length &amp;gt; 0)             {                 line = line.Replace(originalSeperator1, seperator);             }             if (originalSeperator2 != null &amp;amp;&amp;amp; originalSeperator2.Length &amp;gt; 0)             {                 line = line.Replace(originalSeperator2, seperator);             }             if (originalSeperator3 != null &amp;amp;&amp;amp; originalSeperator3.Length &amp;gt; 0)             {                 line = line.Replace(originalSeperator3, seperator);             }              if (seperator.Length == 0)             {                 return line;             }              string result = string.Empty;             foreach (char c in line)             {                 if (c == seperator[0])                 {                     result += i++;                 }                  result += c;             }             result += i++;             result += seperator;              return result;         }              ]]&amp;gt;   &lt;a href="/msxsl:script"&gt;/msxsl:script&lt;/a&gt; &lt;a href="/xsl:stylesheet"&gt;/xsl:stylesheet&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Field
&lt;/h2&gt;

&lt;p&gt;ESXML2RECONCILIATION-&lt;/p&gt;

&lt;h2&gt;
  
  
  Value -
&lt;/h2&gt;

&lt;p&gt;&amp;lt;!-- This stylesheet converts the MT940 xml file to the schema of BankStmtISOService.  --&amp;gt;                                                  &lt;/p&gt;                     &lt;a href="http://tempuri.org/BankStmtService/create" rel="noopener noreferrer"&gt;http://tempuri.org/BankStmtService/create&lt;/a&gt;                                                                                &lt;a&gt;xsl:apply-templates/&lt;/a&gt;                                                                 &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;     &amp;lt;!-- This template populates the top level table 'Document' (BankStmtISODocument) --&amp;gt;                                            MT940                 1                 &amp;lt;!--The header is empty--&amp;gt;                                                                      &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;     &amp;lt;!-- This template populates the 'AccountStatement' table (BankStmtISOAccountStatement) --&amp;gt;                           &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                              &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                                                                                                                                                                                  &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;                                          Reconciliation                                                                                                                                                                                                                                                                                                                                                                                                                                       &amp;lt;!--Balance--&amp;gt;                                                           &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                                      &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                           &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                                      &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                     &amp;lt;!--Transactions--&amp;gt;                                                           &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                              &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;         &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;     &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;     &amp;lt;!-- This template populates the table 'CashBalance' BankStatementISOCashBalance --&amp;gt;                   &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;              &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;                                                            &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                 &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                                                                                            &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                           &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                   &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;                                                                                                                                                                 &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                                                &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                                                                                                                                                                                   &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                                                &lt;a&gt;xsl:choose&lt;/a&gt;                                                                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                             &lt;a&gt;xsl:otherwise&lt;/a&gt;                                                              &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;                         &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;                     &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                                                                                                                                                                                                                                          &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                     &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                                                                                             &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                         &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                                      &lt;a href="/xsl:if"&gt;/xsl:if&lt;/a&gt;                      &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;     &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;     &amp;lt;!-- This template populates the table 'PartyIdentification_*' (BankStatementISOPartyIdentification) --&amp;gt;                                                                                 &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                       &amp;lt;!--Reverse Debit Credit--&amp;gt;         &lt;a&gt;xsl:choose&lt;/a&gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;             &lt;a&gt;xsl:otherwise&lt;/a&gt;                              &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;         &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;     &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                       &lt;a&gt;xsl:choose&lt;/a&gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;             &lt;a&gt;xsl:otherwise&lt;/a&gt;                              &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;         &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;     &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                       &lt;a&gt;xsl:choose&lt;/a&gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;                                           &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;             &lt;a&gt;xsl:otherwise&lt;/a&gt;                              &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;         &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;     &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;              &amp;lt;![CDATA[   public string convertToDateTime(string strDate, string strTime)   {   if (strDate == "") return "1900-01-01T00:00:00Z";   if (strTime == "") strTime = "0000";   string stringToConvert = strDate + strTime;   DateTime dateTime = DateTime.ParseExact(stringToConvert, "yyMMddHHmm", System.Globalization.DateTimeFormatInfo.InvariantInfo);   return dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");   }           ]]&amp;gt;      &lt;a href="/msxsl:script"&gt;/msxsl:script&lt;/a&gt; &lt;a href="/xsl:stylesheet"&gt;/xsl:stylesheet&lt;/a&gt;

&lt;h2&gt;
  
  
  Field - ESRECON2COMPOSITE
&lt;/h2&gt;

&lt;p&gt;Value - &lt;/p&gt;

&lt;p&gt;                           &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;                                    &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;         &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                                                                                                                                                                                                                                                                                                                   &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;            &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;           &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;                     &lt;a href="/xsl:value-of"&gt;/xsl:value-of&lt;/a&gt;       &lt;a href="/xsl:variable"&gt;/xsl:variable&lt;/a&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;           &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;                    &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;           &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;            &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;         &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;                     &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;                                           &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;     &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;         &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;                         &lt;a&gt;xsl:choose&lt;/a&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       &lt;a&gt;xsl:otherwise&lt;/a&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 0                                                 &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;           &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;                     &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;         &lt;a href="/xsl:with-param"&gt;/xsl:with-param&lt;/a&gt;       &lt;a href="/xsl:call-template"&gt;/xsl:call-template&lt;/a&gt;     &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;         &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a href="/xsl:param"&gt;/xsl:param&lt;/a&gt;     &lt;a&gt;xsl:choose&lt;/a&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              &lt;a href="/xsl:for-each"&gt;/xsl:for-each&lt;/a&gt;       &lt;a href="/xsl:when"&gt;/xsl:when&lt;/a&gt;       &lt;a&gt;xsl:otherwise&lt;/a&gt;                                                                                                                                                                                                                                                                                                                                               0                                                 &lt;a href="/xsl:otherwise"&gt;/xsl:otherwise&lt;/a&gt;     &lt;a href="/xsl:choose"&gt;/xsl:choose&lt;/a&gt;   &lt;a href="/xsl:template"&gt;/xsl:template&lt;/a&gt;        &amp;lt;![CDATA[     public string trimDateTime(string strDate)      {         if (strDate == "") return "1900-01-01 00:00:00";         DateTime dateTime = DateTime.ParseExact(strDate, "yyyy-MM-ddTHH:mm:ssZ", System.Globalization.DateTimeFormatInfo.InvariantInfo);         return dateTime.ToString("yyyy-MM-dd HH:mm:ss");          }      ]]&amp;gt;   &lt;a href="/msxsl:script"&gt;/msxsl:script&lt;/a&gt; &lt;a href="/xsl:stylesheet"&gt;/xsl:stylesheet&lt;/a&gt;&lt;/p&gt;

</description>
      <category>code</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>software</category>
    </item>
    <item>
      <title>Fixing Unbalanced TTS Error in D365FO Excel Upload</title>
      <dc:creator>Rohith_Veerapalli</dc:creator>
      <pubDate>Sat, 27 Dec 2025 17:14:16 +0000</pubDate>
      <link>https://dev.to/ni_klaus_4eb1581f851becee/excel-upload-in-custom-script-5ec5</link>
      <guid>https://dev.to/ni_klaus_4eb1581f851becee/excel-upload-in-custom-script-5ec5</guid>
      <description>&lt;p&gt;When developing Excel upload in custom script functionality in Dynamics 365 Finance &amp;amp; Operations (D365FO) using X++, we commonly encounter the unbalanced X++ TTSBEGIN/TTSCOMMIT error. This guide shows you exactly how to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Error You'll Encounter
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n6ly4pxwip7pezn7uec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n6ly4pxwip7pezn7uec.png" alt=" " width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding How Custom Scripts Process Transactions
&lt;/h2&gt;

&lt;p&gt;Lets understand how custom script is processing, when we see the class AppConsistencyCustomScriptStateChange, &lt;br&gt;
when we do &lt;strong&gt;Run test&lt;/strong&gt; the operation runs under &lt;strong&gt;ttsbegin&lt;/strong&gt; and &lt;strong&gt;ttsabort&lt;/strong&gt;, when we do &lt;strong&gt;Run&lt;/strong&gt; operation, it process under &lt;strong&gt;ttsbegin&lt;/strong&gt;, &lt;strong&gt;ttscommit&lt;/strong&gt;.&lt;br&gt;
the process is already in transaction when we upload the package&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6brku9hs4xf4gluogjb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6brku9hs4xf4gluogjb.png" alt=" " width="774" height="631"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Error Occurs
&lt;/h2&gt;

&lt;p&gt;When you read an Excel file using classes like OfficeOpenXml.ExcelPackage or similar COM objects, these operations internally manage transactions. If your code already has an active TTS level, you'll get an unbalanced transaction error.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Solution: Abort Transactions Before Reading Excel
&lt;/h2&gt;

&lt;p&gt;The fix is simple but crucial: abort all existing transactions before reading the Excel file, then restore the TTS level afterward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight abap"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttsLevel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ttsAbort&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we are aborting the transaction, we need to add &lt;strong&gt;ttsBegin&lt;/strong&gt; transaction begin in the end of the process to not get Unbalanced transaction errors&lt;/p&gt;

&lt;h2&gt;
  
  
  Complete Working Code Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight abap"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IO&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;OfficeOpenXml&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;OfficeOpenXml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExcelPackage&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;OfficeOpenXml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExcelRange&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="n"&gt;ExcelReaderForCustomScript&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt;  &lt;span class="n"&gt;CustAccount&lt;/span&gt;      &lt;span class="n"&gt;accountNum&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;CCMNum_BR&lt;/span&gt;         &lt;span class="n"&gt;ccmNum&lt;/span&gt; &lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;///&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;///&lt;/span&gt; &lt;span class="k"&gt;Class&lt;/span&gt; &lt;span class="k"&gt;entry&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="k"&gt;method&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;designated&lt;/span&gt; &lt;span class="n"&gt;menu&lt;/span&gt;
    &lt;span class="o"&gt;///&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;selected&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;execution&lt;/span&gt; &lt;span class="n"&gt;starts&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;///&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;///&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt; &lt;span class="k"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;"_args"&amp;gt;The specified arguments.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Args&lt;/span&gt; &lt;span class="n"&gt;_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ExcelReaderForCustomScript&lt;/span&gt; &lt;span class="n"&gt;curentClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ExcelReaderForCustomScript&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;curentClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;importData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'script executed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;importData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stream&lt;/span&gt;                        &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DialogGroup&lt;/span&gt;                             &lt;span class="n"&gt;dlgUploadGroup&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;FileUploadBuild&lt;/span&gt;                         &lt;span class="n"&gt;fileUploadBuild&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;FormBuildControl&lt;/span&gt;                        &lt;span class="n"&gt;formBuildControl&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;list&lt;/span&gt; &lt;span class="k"&gt;List&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;types&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="k"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttsLevel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ttsAbort&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;Dialog&lt;/span&gt;           &lt;span class="k"&gt;dialog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;"Upload file");&lt;/span&gt;

        &lt;span class="n"&gt;dlgUploadGroup&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;"File");&lt;/span&gt;
        &lt;span class="n"&gt;formBuildControl&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;formBuildDesign&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dlgUploadGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;fileUploadBuild&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;formBuildControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addControlEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classstr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileUpload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'Upload'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;fileUploadBuild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileUploadStyle&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MinimalWithFilename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;fileUploadBuild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fileTypesAccepted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.xlsx'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;closedOk&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;FileUpload&lt;/span&gt; &lt;span class="n"&gt;fileUploadControl&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;formRun&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;formRun&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;controlId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Upload'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;FileUploadTemporaryStorageResult&lt;/span&gt; &lt;span class="n"&gt;fileUploadResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileUploadControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFileUploadResult&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;CustTable&lt;/span&gt;   &lt;span class="n"&gt;custTable&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileUploadResult&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;fileUploadResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getUploadStatus&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileUploadResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openResult&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExcelPackage&lt;/span&gt; &lt;span class="k"&gt;Package&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ExcelPackage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rowCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;columncount&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

                    &lt;span class="k"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;ExcelWorksheet&lt;/span&gt; &lt;span class="n"&gt;worksheet&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_Workbook&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;get_Worksheets&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;get_Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;OfficeOpenXml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExcelRange&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;worksheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cells&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

                    &lt;span class="n"&gt;rowCount&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;worksheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dimension&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;End&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;worksheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dimension&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;columncount&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;worksheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dimension&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;End&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

                    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="k"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rowCount&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="k"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;accountNum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                        &lt;span class="n"&gt;ccmNum&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                        &lt;span class="k"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accountNum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

                        &lt;span class="n"&gt;ttsbegin&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                        &lt;span class="n"&gt;update_recordset&lt;/span&gt; &lt;span class="n"&gt;custTable&lt;/span&gt; &lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="n"&gt;CCMNum_BR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ccmNum&lt;/span&gt;
                            &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;custTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccountNum&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;accountNum&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                        &lt;span class="n"&gt;ttscommit&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

                    &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strFmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AccountNum %1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;list&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
                    &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;ttsbegin&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Critical Implementation Note
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind, since we are aborting transaction, Run Test process will write the data to system. we dont have to process Run operation again.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>backend</category>
      <category>dotnet</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Computed columns in D365FO – Using Correlated Subqueries with Real SQL</title>
      <dc:creator>Rohith_Veerapalli</dc:creator>
      <pubDate>Thu, 18 Dec 2025 16:30:25 +0000</pubDate>
      <link>https://dev.to/ni_klaus_4eb1581f851becee/implementing-correlated-subqueries-in-d365fo-computed-columns-a-practical-guide-2672</link>
      <guid>https://dev.to/ni_klaus_4eb1581f851becee/implementing-correlated-subqueries-in-d365fo-computed-columns-a-practical-guide-2672</guid>
      <description>&lt;p&gt;When working in Dynamics 365 Finance &amp;amp; Operations, we often need to display or filter data that doesn’t physically exist in a table. Adding a new field and populating it with batch jobs or event handlers is sometimes overkill — and that’s where computed columns shine.&lt;/p&gt;

&lt;p&gt;In this post, I’ll explain computed columns in D365FO, when to use them, and a real-world SQL subquery pattern .&lt;/p&gt;

&lt;h2&gt;
  
  
  Computed Columns in D365FO
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Computed Column in D365FO x++?
&lt;/h2&gt;

&lt;p&gt;A computed column is a virtual field whose value is calculated at runtime using SQL, not stored in the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key points:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No physical column is created in SQL&lt;/p&gt;

&lt;p&gt;Logic is executed at query time&lt;/p&gt;

&lt;p&gt;Implemented using an X++ static method that returns an SQL expression&lt;/p&gt;

&lt;p&gt;Commonly used in views, data entities, and computed fields&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern Most People Use (and Its Limitation)
&lt;/h2&gt;

&lt;p&gt;Most examples online show simple patterns like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concatenating fields&lt;/li&gt;
&lt;li&gt;Simple CASE WHEN&lt;/li&gt;
&lt;li&gt;Basic SUM or COUNT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in real projects, we often need context-aware values, based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Date ranges&lt;/li&gt;
&lt;li&gt;Related transactions&lt;/li&gt;
&lt;li&gt;Conditional joins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where subqueries inside computed columns become powerful.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A Real-World Example: Fetching a Request ID Based on Transaction Date&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s look at a computed column that returns a Leave Request ID for a worker, based on whether a transaction date falls within a leave period.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static str requestId()
{
    str sqlQuery;

    sqlQuery = strFmt(
        "(SELECT TOP 1 LR.REQUESTID " +
        " FROM LeaveRequest LR " +
        " JOIN LeaveOfAbsenceRequestDetail LRD " +
        "   ON LRD.REQUEST = LR.RECID " +
        "  AND LRD.DATAAREAID = LR.DATAAREAID " +
        " WHERE LR.WORKER = T1.WORKER " +
        "   AND LRD.STARTDATE &amp;lt;= T1.TRANSACTIONDATE " +
        "   AND LRD.ENDDATE   &amp;gt;= T1.TRANSACTIONDATE " +
        "   AND LR.DATAAREAID = T1.DATAAREAID " +
        "   AND LR.PARTITION  = T1.PARTITION)"
    );

    return sqlQuery;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding What’s Happening&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why T1?
&lt;/h2&gt;

&lt;p&gt;T1 refers to the primary datasource of the view or entity where this computed column is defined.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;T1.WORKER&lt;/p&gt;

&lt;p&gt;T1.TRANSACTIONDATE&lt;/p&gt;

&lt;p&gt;These values come from the current record being queried.&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Why SELECT TOP 1?
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;Computed columns must return a single scalar value.&lt;br&gt;
If multiple records are possible, SQL must be constrained to one result.&lt;/p&gt;

&lt;p&gt;You can also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add ORDER BY&lt;/li&gt;
&lt;li&gt;Add additional filters&lt;/li&gt;
&lt;li&gt;Use MAX() or MIN() if appropriate&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  3. Why This Is Powerful
&lt;/h2&gt;

&lt;p&gt;This pattern allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamically resolve relationships&lt;/li&gt;
&lt;li&gt;Use date-effective logic&lt;/li&gt;
&lt;li&gt;Avoid storing derived data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use the field in:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filters&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Data entities&lt;/li&gt;
&lt;li&gt;Reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All without writing X++ loops.&lt;/p&gt;
&lt;h2&gt;
  
  
  More examples
&lt;/h2&gt;

&lt;p&gt;Lets say we have multiple approvers for single invoice, we can concatenate multiple pending approvers like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static str pendingApprovers()
{
    str sqlQuery;


    sqlQuery = strFmt( 
                     "STUFF((" +
                    " SELECT ', ' + USERINFO.Name" +
" FROM WORKFLOWWORKITEMTABLE WWI" +
" JOIN DIRPERSONUSER PU ON PU.USER_ = WWI.USERID" +
" JOIN HCMWORKER HW ON HW.PERSON = PU.PERSONPARTY" +
" join USERINFO ON USERINFO.ID = WWI.USERID"+
" WHERE WWI.PURCHINVOICE = T1.RECID" +
" AND WWI.STATUS  = 0"+
" AND WWI.PARTITION = T1.PARTITION" +
" FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')" +
", 1, 2, '')"
        );

        return sqlQuery;


}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here T1 is the primary data source table&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlntana5wvk9k1qtou1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlntana5wvk9k1qtou1k.png" alt=" " width="742" height="481"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;This is how the view design will be&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F406qexgu3xwcszkkxv1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F406qexgu3xwcszkkxv1u.png" alt=" " width="800" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and final result &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7d56g9sh111qiebdc8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7d56g9sh111qiebdc8s.png" alt=" " width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep experimenting 🚀&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>dynamics365fo</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
