<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>article LET's Just Use One in Qlik Sense Documents</title>
    <link>https://community.qlik.com/t5/Qlik-Sense-Documents/LET-s-Just-Use-One/ta-p/1626020</link>
    <description>&lt;P&gt;There is a lot material on the community on explaining the difference between the functions&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;A href="https://help.qlik.com/en-US/sense/June2019/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Set.htm" target="_blank" rel="noopener"&gt;SET&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;FONT color="#0000FF"&gt;&lt;SPAN&gt;&lt;A href="https://help.qlik.com/en-US/sense/June2019/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Let.htm" target="_blank" rel="noopener"&gt;LET&lt;/A&gt;&lt;/SPAN&gt;.&lt;/FONT&gt; The gist of it is:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;FONT color="#0000FF"&gt;&lt;SPAN&gt;SET&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;stores the variable with the expression string and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;FONT color="#0000FF"&gt;&lt;SPAN&gt;LET&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;will evaluate the expression first.&lt;/P&gt;&lt;P&gt;I tend to think of them as:&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000FF"&gt;&lt;SPAN&gt;SET&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;the value in place.&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;FONT color="#0000FF"&gt;LET&lt;/FONT&gt;‘s&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;evaluate.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;But in reality, I hardly ever use SET. The whole difference of the them producing different results is on the premise that you don’t use quotes.&lt;/P&gt;&lt;P&gt;Take this example:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Set&lt;/SPAN&gt; vSetToday&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Today&lt;/SPAN&gt;();
&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vLetToday&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Today&lt;/SPAN&gt;();

&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ------------------------------- vSetToday: &lt;SPAN class="hljs-variable"&gt;$(vSetToday)&lt;/SPAN&gt;;
&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ------------------------------- vLetToday: &lt;SPAN class="hljs-variable"&gt;$(vLetToday)&lt;/SPAN&gt;;

&lt;/PRE&gt;&lt;P&gt;Which returns:&lt;/P&gt;&lt;P&gt;&lt;IMG src="https://community.qlik.com/t5/image/serverpage/image-id/19641i5BC71C5FA8483954/image-size/medium?v=1.0&amp;amp;px=-1" border="0" title="clipboard_image_0.jpeg" alt="clipboard_image_0.jpeg" /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, if you utilize quotes, the result is the exact same:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Set&lt;/SPAN&gt; vSetTodayQuote&lt;/SPAN&gt; = &lt;SPAN class="hljs-string"&gt;'Today()'&lt;/SPAN&gt;;
&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vLetTodayQuote&lt;/SPAN&gt; = &lt;SPAN class="hljs-string"&gt;'Today()'&lt;/SPAN&gt;;

&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ------------------------------- vSetTodayQuote: &lt;SPAN class="hljs-variable"&gt;$(vSetTodayQuote)&lt;/SPAN&gt;;
&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ------------------------------- vLetTodayQuote: &lt;SPAN class="hljs-variable"&gt;$(vLetTodayQuote)&lt;/SPAN&gt;;

&lt;/PRE&gt;&lt;P&gt;Which returns:&lt;/P&gt;&lt;P&gt;&lt;IMG src="https://community.qlik.com/t5/image/serverpage/image-id/19642i9C19330D3118853B/image-size/medium?v=1.0&amp;amp;px=-1" border="0" title="clipboard_image_1.jpeg" alt="clipboard_image_1.jpeg" /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;With that said, I argue that you should always use quotes. Using quotes is being explicit which I believe is tantamount in best practice coding. Also, you will notice Qlik’s generated variables&amp;nbsp; use quotes, so that’s another example straight from the source.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="5"&gt;So my first point is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;use quotes!&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So now that they are for the most part the same, is there even a reason to use SET? The only thing I could think of was performance reasons. To test this use case, I made a quick script to see if there was any tangible difference in using SET vs LET on setting a string variable.&lt;/P&gt;&lt;P&gt;This test does 5,000,001 iterations of setting a variable using each function and printing the result.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-comment"&gt;// SET Test&lt;/SPAN&gt;

&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vSetStart&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Now&lt;/SPAN&gt;();

&lt;SPAN class="hljs-keyword"&gt;For&lt;/SPAN&gt; s = 0 &lt;SPAN class="hljs-keyword"&gt;to&lt;/SPAN&gt; 5000000

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;SET&lt;/SPAN&gt; vSetTest&lt;/SPAN&gt; = &lt;SPAN class="hljs-string"&gt;'$(s)'&lt;/SPAN&gt;;

&lt;SPAN class="hljs-keyword"&gt;next&lt;/SPAN&gt; s

&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vSetEnd&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Now&lt;/SPAN&gt;();

&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vSetDuration&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Interval&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;'$(vSetEnd)'&lt;/SPAN&gt; - &lt;SPAN class="hljs-string"&gt;'$(vSetStart)'&lt;/SPAN&gt;,&lt;SPAN class="hljs-string"&gt;'hh:mm:ss'&lt;/SPAN&gt;);

&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vLetStart&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Now&lt;/SPAN&gt;();

&lt;SPAN class="hljs-comment"&gt;// LET Test&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;For&lt;/SPAN&gt; l = 0 &lt;SPAN class="hljs-keyword"&gt;to&lt;/SPAN&gt; 5000000

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;LET&lt;/SPAN&gt; vLetTest&lt;/SPAN&gt; = &lt;SPAN class="hljs-string"&gt;'$(l)'&lt;/SPAN&gt;;

&lt;SPAN class="hljs-keyword"&gt;next&lt;/SPAN&gt; l

&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vLetEnd&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Now&lt;/SPAN&gt;();

&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;Let&lt;/SPAN&gt; vLetDuration&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;Interval&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;'$(vLetEnd)'&lt;/SPAN&gt; - &lt;SPAN class="hljs-string"&gt;'$(vLetStart)'&lt;/SPAN&gt;,&lt;SPAN class="hljs-string"&gt;'hh:mm:ss'&lt;/SPAN&gt;);

&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ------------------------------- vSetDuration: &lt;SPAN class="hljs-variable"&gt;$(vSetDuration)&lt;/SPAN&gt;;
&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ------------------------------- vLetDuration: &lt;SPAN class="hljs-variable"&gt;$(vLetDuration)&lt;/SPAN&gt;;

&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This test returns…..&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;IMG src="https://community.qlik.com/t5/image/serverpage/image-id/19643iD6E36377A9D6F504/image-size/medium?v=1.0&amp;amp;px=-1" border="0" title="clipboard_image_2.jpeg" alt="clipboard_image_2.jpeg" /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;LET is potentially faster, though I would say that it is at an amount that it doesn’t matter. It’s also worth noting that tests of 5,001, 50,001, and 500,001 were the same. However what this does prove, is that the biggest potential reason to use SET over LET doesn’t exist.&amp;nbsp; So given all that, just use LET.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="6"&gt;&amp;nbsp; LET is all you need.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="4"&gt;…Except for Lists&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;At the moment I am aware of only one reason to use SET over LET and that is for building a list. You can create a list to iterate over using both, however using LET is much more painful. The LET statement you have to build in the quotes using Chr(39), which is not pretty and/or fun.&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Example:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;SET&lt;/SPAN&gt; vSetArray&lt;/SPAN&gt; = &lt;SPAN class="hljs-string"&gt;'One'&lt;/SPAN&gt;,&lt;SPAN class="hljs-string"&gt;'Two'&lt;/SPAN&gt;,&lt;SPAN class="hljs-string"&gt;'Three'&lt;/SPAN&gt;;
&lt;SPAN class="hljs-variable"&gt;&lt;SPAN class="hljs-keyword"&gt;LET&lt;/SPAN&gt; vLetArray&lt;/SPAN&gt; = &lt;SPAN class="hljs-built_in"&gt;chr&lt;/SPAN&gt;(39)&amp;amp;&lt;SPAN class="hljs-string"&gt;'Four'&lt;/SPAN&gt;&amp;amp;&lt;SPAN class="hljs-built_in"&gt;chr&lt;/SPAN&gt;(39)&amp;amp;&lt;SPAN class="hljs-string"&gt;','&lt;/SPAN&gt;&amp;amp;&lt;SPAN class="hljs-built_in"&gt;chr&lt;/SPAN&gt;(39)&amp;amp;&lt;SPAN class="hljs-string"&gt;'Five'&lt;/SPAN&gt;&amp;amp;&lt;SPAN class="hljs-built_in"&gt;chr&lt;/SPAN&gt;(39)&amp;amp;&lt;SPAN class="hljs-string"&gt;','&lt;/SPAN&gt;&amp;amp;&lt;SPAN class="hljs-built_in"&gt;chr&lt;/SPAN&gt;(39)&amp;amp;&lt;SPAN class="hljs-string"&gt;'Six'&lt;/SPAN&gt;&amp;amp;&lt;SPAN class="hljs-built_in"&gt;chr&lt;/SPAN&gt;(39);

&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ----------------- &lt;SPAN class="hljs-variable"&gt;$(vSetArray)&lt;/SPAN&gt;;

&lt;SPAN class="hljs-keyword"&gt;For&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;each&lt;/SPAN&gt; s &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; &lt;SPAN class="hljs-variable"&gt;$(vSetArray)&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ----------------- &lt;SPAN class="hljs-variable"&gt;$(s)&lt;/SPAN&gt;;

&lt;SPAN class="hljs-keyword"&gt;Next&lt;/SPAN&gt; s

&amp;nbsp;

&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ----------------- &lt;SPAN class="hljs-variable"&gt;$(vLetArray)&lt;/SPAN&gt;;

&lt;SPAN class="hljs-keyword"&gt;For&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;each&lt;/SPAN&gt; l &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; &lt;SPAN class="hljs-variable"&gt;$(vLetArray)&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN class="hljs-keyword"&gt;Trace&lt;/SPAN&gt; ----------------- &lt;SPAN class="hljs-variable"&gt;$(l)&lt;/SPAN&gt;;

&lt;SPAN class="hljs-keyword"&gt;Next&lt;/SPAN&gt; l

&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Tell me if there are if there are any other reasons for using SET over LET, because for now I think 99% of the time LET is all we need.&lt;/P&gt;</description>
    <pubDate>Fri, 20 Sep 2019 00:58:03 GMT</pubDate>
    <dc:creator>treysmithdev</dc:creator>
    <dc:date>2019-09-20T00:58:03Z</dc:date>
    <item>
      <title>LET's Just Use One</title>
      <link>https://community.qlik.com/t5/Qlik-Sense-Documents/LET-s-Just-Use-One/ta-p/1626020</link>
      <description>&lt;P&gt;LET vs SET: 99% of the time LET should be used and SET should just be set aside.&lt;/P&gt;</description>
      <pubDate>Fri, 20 Sep 2019 00:58:03 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Qlik-Sense-Documents/LET-s-Just-Use-One/ta-p/1626020</guid>
      <dc:creator>treysmithdev</dc:creator>
      <dc:date>2019-09-20T00:58:03Z</dc:date>
    </item>
  </channel>
</rss>

