Get Inspire insights from former attendees in our AMA discussion thread on Inspire Buzz. ACEs and other community members are on call all week to answer!
The Product Idea boards have gotten an update to better integrate them within our Product team's idea cycle! However this update does have a few unique behaviors, if you have any questions about them check out our FAQ.

Alteryx Designer Desktop Ideas

Share your Designer Desktop product ideas - we're listening!
Submitting an Idea?

Be sure to review our Idea Submission Guidelines for more information!

Submission Guidelines

Featured Ideas

I love the new Custom Format option with the DateTime tool in Alteryx 11.0, this makes working with dates SO MUCH easier... BUT it would be great if you could update an existing field rather than having to create a new column (e.g. DateTime_Out) and then use a select to put this back to the original Date field.

 

 

Datetime.png

I've been dealing with JSON since day one, and to be honest it isn't the best experience I've had.

Converting a hierarchical schema into a tabular one is't a straight forward process, but doing that everyday the old way is time and processing consuming.

 

What I'm proposing is a tool that can read JSON as input, then display a structural skeleton for the user, or the user can provide such skeleton for the tool, say let's say we have the following input:

 

 

{"menu": [{
  "id": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "action": "CreateNewDoc", "icons": ["SAVE", "FLOPPY"]},
      {"value": "Open", "action": "OpenDoc"},
      {"value": "Close", "action": "CloseDoc", "conditions": [11,8,4]}
    ]
  }
},
{
  "id": "Edit",
  "popup": {
    "menuitem": [
      {"value": "Cut", "action": "TextCut", icons: ["CUT", "SCISSORS"]},
      {"value": "Copy", "action": "OpenDoc"},
      {"value": "Paste", "action": "CloseDoc", "conditions": [5,17]}
    ]
  }
}
],
"error": false
}

 

 

 

now to parse this into a table of menuitems we need to use:

  • JSON Parse: convert JSON into one long key:value table
  • TextToColumns: split key into multiple columns
  • Filter: make sure we only get one level from the tree
  • CrossTab: Convert it back into a column based key values.

clipboard_image_0.png

All of this will give us the most primitive table we can have as:

25actionconditionsiconsvalue
00CreateNewDoc SAVE,FLOPPYNew
01OpenDoc  Open
02CloseDoc11,8,4 Close
10TextCut CUT,SCISSORSCut
11OpenDoc  Copy
12CloseDoc5,17 Paste

 

and now if we want to have the parent menu id along side with the menuitems, we will do that again as:

  • Filter: for parent values only
  • CrossTab: for parent values into a table
  • Join: to join Parents with Sub items and add the Parent.Id

 

clipboard_image_1.png

 

Now all of this is done with Concatenating of child items, as cross tab will allow us to only do Concat/First/Last for items with the same grouping values.


And now if we want to process children, count them, or extract their data into another table, we have to add more Filters, more CrossTab and more Joining to get parent IDs for future linking.

 

So what's I'm proposing?

 

I'm thinking of a Tool with an interface that give me the ability to choose:

  • Target Branch: which is the main table to be extracted from the branches, in this case it would be menu->popup->menuitem.
  • Parent Values: what values to be appended from parents of the previous table, just like menu->Id and others if exist.
  • Children Data types: selecting the proper and expected data type for children instead of using strings or the existing different columns way.
  • Children Arrays Process: what to do with children branches? either stopping their process and return them as is (Stringify), exclude or do other process like count.

 

the tool may extract the structure or let the user input such config as the following:

clipboard_image_3.png

 

Or Input the Structure as a YAML formatted config or any other way.

 

This will allow the user to have a quick native tool that does what he wants as it should, and user can use it as much as he want for children and nested values. you just Stringify and repeat and only parse what you need every time.

 

I hope you consider this for me to replace tens of macros and tools into single tools such so.

 

Thanks for your help and time and all the best!

 

Quick and (hopefully) simple one here.  Many times when I use the Text To Columns tool, there is still leading whitespace from comma separated lists with spaces.  It would save from the minor inconvenience of putting a Data Cleansing tool after each of these tools to include an Advanced Option to trim whitespace from the results.  I tried some workarounds using the empty fields and including spaces in the delimiters box, but this results in unwanted behavior.

 

Capture.PNG

A problem I'm currently trying to solve and feel like I'm spending way too much time on it..

 

I have a data set which has some data in it from multiple languages, and I only want English values.  I was able to get rid of the words with non English letters with a little regular expression and filtering.  However, there's some words that do contain all English letters but aren't English.  What I'm trying to do is bring in an English dictionary to compare words and see which rows have non English words according to the dictionary.  However, this is proving to be a bit harder than I thought.  I think I can do it, but it feels like this should be much simpler than it is.

 

It would be great to have a tool that would run a "spell check" on fields (almost all dictionaries for all languages are available free online).  This could also be useful also just for cleaning up open text types of data where people type stuff in quickly and don't re-read it! 🙂

Idea removed, regex will do the job. 

We frequently report on our data by week. However, the DateTimeTrim function (in the Formula Tool and others) does not support this trim type.

 

Some workarounds have been posted that involve calculating the day of the week and then subtracting it out:

 

http://community.alteryx.com/t5/Data-Preparation-Blending/Summarize-data-by-the-week/td-p/6002

 

It would be very helpful to update DateTimeTrim as follows:

 

  • Add a <trim type> of 'week' 
  • Add an optional parameter for <start of week>
    • Default value: 0 (Week beginning Sunday)
    • Other values: 1 (Week beginning Monday), 2 (Week beginning Tuesday), etc.

 

 

 

If Alteryx encounters an error in a RegEx tool - it throws an error:

 RegEx (9) The field "Field1_Matched" is not contained in the record.

 

This is a somewhat confusing and misleading error message because the input data and the regex configuration have no "Field1" at all, so the error message does not assist with resolving the issue.

 

Could you please re-look at the error messaging on the RegExt tool to see if we can make RegEx errors easier to resolve by giving a self-descriptive error message?

 

Example below:

Here I was trying to tokenize by using the . to represent any character - however Alteryx is struggling with this.

Annotation 2019-05-20 223352.png

Hi there,
 
In working with dates in strings, we have an option to use the DateTime tool to convert from string to DateTime, or to use a formula with DateTimeParse.
The DateTime tool is limited in the number of formats possible - and even if you edit the XML directly, you often can't get exactly the format that you are looking for (e.g. 01-sep-1975 - dd/mmm/yyyy) because it's not in the predefined list of "Format of Input String".
 
The DateTimeParse is similarly painful because it requires you to go and look up a set of arcane %b or %y characters on the Alteryx Help screen.
 
Would it be possible to change the treatment of dates so that:
- DateTime tool can take any format that you need - and includes a simple format builder tool so that people don't need to remember the codes
- The DateTimeParse function also uses the same format codes as the DateTime tool, and also includes a simple formula/format builder so that people don't need to remember the codes.
- When you point a DateTime tool to a column in a data-stream - it can read the data to determine the best format to suggest
- Finally - if you could profile the data, and clean it up visually (like the new release of Tableau; or like Cognos) where you can see the values on screen and apply a transformation to them in-situ, which then translates into Alteryx Formulas - it would be even more useful and rapid.
 
Cleaning up date handling would speed up date processing tremendously. 

It would be a handy feature if it were possible to choose a data type for an input tool to read the data in as. For example, if a dataset has multiple fields with different data types, it would be handy to be able to make the Input Tool read and output them all as a string, if needed. This would also make a handy tool, a sort of blanket data conversion to convert all fields to the specified type.

Hi, I've noted that there is not url-decode function in Alteryx. I guess I'm the first one to need that, so I'm posting this idea here. I think it would not be a big deal to do so if there's a url-encode function. 

 

Thanks. 

It would be great if there was a way for the Text to Columns tool did not drop the last empty when using Split to Rows.

 

For example, if I had the data:

RecordIDString
11,2,3
21,2,
31,,

 

Notice that each value has two commas (representing three values per cell), and If I configure to split into rows on the comma character, what would you expect the result to be:

 

Result A:

RecordIDString
11
12
13
21
22
31
3 


OR

 

Result B:

RecordIDString
11
12
13
21
22
2 
31
3 
3 


OR

 

Result C:

RecordIDString
11
12
13
21
22
31



I would expect Result C if I selected "Skip Empty Fileds", and that is what happens if I select that option.

 

But If I do not want to skip empty fields, I would expect Result B, but what I get is Result A where the last value/field is dropped/skipped.

 

What would it take to Result B as the output from the Text to Columns tool?

Hello

 

My problem: I've used the download-tool to download a 40mb XML. Parsing the DonwloadData-field containing this XML results in about 6600 records. The XML-Parse Tool passes the orginal DownloadData field to each record, resulting in quite a bit of memory usage:

 

 

XML-Parsing ProblemXML-Parsing Problem

 

Suggestion: An option in the XML-parse Tool to not pass the parsed field in its output. 

 

Marco

*This is an idea from @fmvizcaino  from the Portuguese Community*

 

  • Global DateTime support

Hi there,

Could we please add a simple date function which allows you to construct a date from the basic inputs (rather than having to go through date-time-parse).

Example:

Function CreateDate(Year as integer; optional month as integer; optional day as integer; optional hour as integer; optional minute as optional; optional second as integer) as DateTime

 

 

Examples:

  • CreateDate(2017) = 2017-01-01 00:00:00
  • CreateDate(2017, 4) = 2017-04-01 00:00:00
  • CreateDate(2017,04,05) = 2017-04-05 00:00:00

 

 

Hi all,

Just to give you some context, we have a customer that requires that for every Tableau workbook we deliver, we must add extra documentation, as for instance, for every calculated field, in which views it's used, and the formula of that field (yes, I know exactly what you're thinking right now :P)

So I decided to take a shortcut and do a workflow that extracts the basic (I mean VERY basic) data from the .twb file, so I can save a lot of time. 

 

Then I came with this idea...

 

Having a lot of Tableau's under the hood experts in this Community, It would be great to gather some of them and create a Tableau Documenter Macro.

 

I'd love tho hear what you think, and who's being able to help.

 

I suppose I could just bookmark this page, but that wouldn't help others.  I frequently forget (I'm getting old) the format strings while creating custom datetime formulas.  Is there a quick way to get to these format strings when in the context of creating a datetimeparse/datetimeformat formula?

 

Cheers,

Mark

Access to only MD5 hashes via MD5_ASCII(String) and MD5_UNICODE(String) found under string functions is limiting.  Is there a way to access other hashing algorithms, ideally via the crypto algorithms from OpenSSL or the .NET framework? 

 

  - https://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm(v=vs.110).aspx
  - https://wiki.openssl.org/index.php/Command_Line_Utilities#Signing_.2F_Digest 

 

Hashing functions are a very useful tool to have. There are many different types of hashes and each one has tradeoffs for different uses. This can range from error checking, privacy shielding, password protection, forensic analysis, message authentication (HMAC) and much more. See: http://stackoverflow.com/questions/800685/which-cryptographic-hash-function-should-i-choose 

 

- For workflows with data containing existing hashes, being able to consistently create hashes from non-hashed data for comparison is useful.
- Hashes are also useful because they are the same outside the Alteryx environment. They can be used to confirm correct operation of a production system or a third party's external process.

 

Access to only MD5 hashes via MD5_ASCII(String) and MD5_UNICODE(String) found under string functions in the formula tool is a start, but quite limiting. 

 

Further, the ability to use non-cryptographic hashes and checksums would be useful, such as MurmurHash or CRC.  https://en.wikipedia.org/wiki/List_of_hash_functions

Having the implementation benefit from hardware acceleration (AES-NI / CUDA) would be a great plus for high volume applications. 

 

For reference, these are some hash algorithms that could be useful in workflows:

SHA-1

SHA-256

Whirlpool

xxHash

MurmurHash
SpookyHash
CityHash

Checksum
CRC-16
CRC-32
CRC-32 MPEG-2
CRC-64

BLAKE-256
BLAKE-512
BLAKE2s
BLAKE2b
ECOH
FSB
GOST
Grøstl
HAS-160
HAVAL
JH
MD2
MD4
MD6
RadioGatún
RIPEMD
RIPEMD-128
RIPEMD-160
RIPEMD-320
SHA-224
SHA-256
SHA-384
SHA-512
SHA-3 (originally known as Keccak)
Skein
Snefru
Spectral Hash
Streebog
SWIFFT
Tiger

The XML Parse tool has a checkbox to ignore errors and continue.  This idea works for all options that allow you to ignore errors.  It would be great if XML Parse had 2 outputs, 1 for successful records and another for the errored records.  This would make it much easier to identify and update (if necessary) errored records.

In my view this would make it more similar to other tools like Filter or Spatial Match where records that don't fit your criteria follow a different flow.

 

Thanks for considering

I'd like to see the DateTimeLastOfMonth and DateTimeFirstOfMonth functions be more flexible then just getting the first or last date of the current month. It would be great if you could point to a date field and have it give the first or last date of that month. i.e  DateTimeLastOfMonth([randomdate]) and if the [randomdate] = December 3rd, 1981, the result would bring back 1981-12-31

How about turning this;

SELECT * 
FROM Employee
ORDER BY First_name ASC

into this automatically

Picture1.png

and a more complex one

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID; 

into this

Picture2.png

basically it's a parser;

 

1) First check if it's a MS SQL, PL/SQL or T/SQL

2) Then figure out join relationships

3) Convert each subset SQL into function nodes

4) Convert function nodes to Alteryx yxmd (xml)

 

Creates the following for the first workflow

<?xml version="1.0"?>
<AlteryxDocument yxmdVer="10.5">
  <Nodes>
    <Node ToolID="1">
      <GuiSettings Plugin="AlteryxBasePluginsGui.AlteryxSelect.AlteryxSelect">
        <Position x="174" y="90" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <OrderChanged value="False" />
          <SelectFields>
            <SelectField field="*Unknown" selected="True" />
          </SelectFields>
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSelect" />
    </Node>
    <Node ToolID="2">
      <GuiSettings Plugin="AlteryxBasePluginsGui.Sort.Sort">
        <Position x="246" y="90" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <SortInfo locale="0">
            <Field field="FIRST_NAME" order="Ascending" />
          </SortInfo>
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText>FIRST_NAME - Ascending</DefaultAnnotationText>
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSort" />
    </Node>
    <Node ToolID="4">
      <GuiSettings Plugin="AlteryxBasePluginsGui.TextInput.TextInput">
        <Position x="90" y="90" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <NumRows value="0" />
          <Fields>
            <Field name="FIRST_NAME" />
          </Fields>
          <Data />
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxTextInput" />
    </Node>
    <Node ToolID="13">
      <GuiSettings Plugin="AlteryxBasePluginsGui.BrowseV2.BrowseV2">
        <Position x="330" y="90" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <Layout>
            <View1>
              <Hints>
                <Table />
              </Hints>
            </View1>
          </Layout>
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxBrowseV2" />
    </Node>
  </Nodes>
  <Connections>
    <Connection>
      <Origin ToolID="1" Connection="Output" />
      <Destination ToolID="2" Connection="Input" />
    </Connection>
    <Connection>
      <Origin ToolID="2" Connection="Output" />
      <Destination ToolID="13" Connection="Input" />
    </Connection>
    <Connection>
      <Origin ToolID="4" Connection="Output" />
      <Destination ToolID="1" Connection="Input" />
    </Connection>
  </Connections>
  <Properties>
    <Memory default="True" />
    <GlobalRecordLimit value="0" />
    <TempFiles default="True" />
    <Annotation on="True" includeToolName="False" />
    <ConvErrorLimit value="10" />
    <ConvErrorLimit_Stop value="False" />
    <CancelOnError value="False" />
    <DisableBrowse value="False" />
    <EnablePerformanceProfiling value="False" />
    <DisableAllOutput value="False" />
    <ShowAllMacroMessages value="False" />
    <ShowConnectionStatusIsOn value="True" />
    <ShowConnectionStatusOnlyWhenRunning value="True" />
    <ZoomLevel value="0" />
    <LayoutType>Horizontal</LayoutType>
    <MetaInfo>
      <NameIsFileName value="True" />
      <Name>New Workflow1</Name>
      <Description />
      <RootToolName />
      <ToolVersion />
      <ToolInDb value="False" />
      <CategoryName />
      <SearchTags />
      <Author />
      <Company />
      <Copyright />
      <DescriptionLink actual="" displayed="" />
    </MetaInfo>
    <Events>
      <Enabled value="True" />
    </Events>
  </Properties>
</AlteryxDocument>

and for the second example with joins...

<?xml version="1.0"?>
<AlteryxDocument yxmdVer="10.5">
  <Nodes>
    <Node ToolID="1">
      <GuiSettings Plugin="AlteryxBasePluginsGui.AlteryxSelect.AlteryxSelect">
        <Position x="126" y="54" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <OrderChanged value="False" />
          <SelectFields>
            <SelectField field="*Unknown" selected="True" />
          </SelectFields>
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSelect" />
    </Node>
    <Node ToolID="2">
      <GuiSettings Plugin="AlteryxBasePluginsGui.TextInput.TextInput">
        <Position x="54" y="54" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <NumRows value="0" />
          <Fields>
            <Field name="CustomerID" />
            <Field name="OrderID" />
            <Field name="CustomerName" />
            <Field name="OrderDate" />
          </Fields>
          <Data />
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxTextInput" />
    </Node>
    <Node ToolID="3">
      <GuiSettings Plugin="AlteryxBasePluginsGui.AlteryxSelect.AlteryxSelect">
        <Position x="126" y="198" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <OrderChanged value="False" />
          <SelectFields>
            <SelectField field="*Unknown" selected="True" />
          </SelectFields>
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSelect" />
    </Node>
    <Node ToolID="4">
      <GuiSettings Plugin="AlteryxBasePluginsGui.TextInput.TextInput">
        <Position x="54" y="198" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <NumRows value="0" />
          <Fields>
            <Field name="CustomerID" />
          </Fields>
          <Data />
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxTextInput" />
    </Node>
    <Node ToolID="5">
      <GuiSettings Plugin="AlteryxBasePluginsGui.Join.Join">
        <Position x="222" y="126" />
      </GuiSettings>
      <Properties>
        <Configuration joinByRecordPos="False">
          <JoinInfo connection="Left">
            <Field field="CustomerID" />
          </JoinInfo>
          <JoinInfo connection="Right">
            <Field field="CustomerID" />
          </JoinInfo>
          <SelectConfiguration>
            <Configuration outputConnection="Join">
              <OrderChanged value="False" />
              <SelectFields>
                <SelectField field="Right_CustomerID" selected="True" rename="Right_CustomerID" />
                <SelectField field="*Unknown" selected="True" />
              </SelectFields>
            </Configuration>
          </SelectConfiguration>
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxJoin" />
    </Node>
    <Node ToolID="6">
      <GuiSettings Plugin="AlteryxBasePluginsGui.BrowseV2.BrowseV2">
        <Position x="294" y="126" />
      </GuiSettings>
      <Properties>
        <Configuration>
          <Layout>
            <View1>
              <Hints>
                <Table />
              </Hints>
            </View1>
          </Layout>
        </Configuration>
        <Annotation DisplayMode="0">
          <Name />
          <DefaultAnnotationText />
          <Left value="False" />
        </Annotation>
      </Properties>
      <EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxBrowseV2" />
    </Node>
  </Nodes>
  <Connections>
    <Connection>
      <Origin ToolID="1" Connection="Output" />
      <Destination ToolID="5" Connection="Left" />
    </Connection>
    <Connection>
      <Origin ToolID="3" Connection="Output" />
      <Destination ToolID="5" Connection="Right" />
    </Connection>
    <Connection>
      <Origin ToolID="2" Connection="Output" />
      <Destination ToolID="1" Connection="Input" />
    </Connection>
    <Connection>
      <Origin ToolID="4" Connection="Output" />
      <Destination ToolID="3" Connection="Input" />
    </Connection>
    <Connection>
      <Origin ToolID="5" Connection="Join" />
      <Destination ToolID="6" Connection="Input" />
    </Connection>
  </Connections>
  <Properties>
    <Memory default="True" />
    <GlobalRecordLimit value="0" />
    <TempFiles default="True" />
    <Annotation on="True" includeToolName="False" />
    <ConvErrorLimit value="10" />
    <ConvErrorLimit_Stop value="False" />
    <CancelOnError value="False" />
    <DisableBrowse value="False" />
    <EnablePerformanceProfiling value="False" />
    <DisableAllOutput value="False" />
    <ShowAllMacroMessages value="False" />
    <ShowConnectionStatusIsOn value="True" />
    <ShowConnectionStatusOnlyWhenRunning value="True" />
    <ZoomLevel value="0" />
    <LayoutType>Horizontal</LayoutType>
    <MetaInfo>
      <NameIsFileName value="True" />
      <Name>New Workflow1</Name>
      <Description />
      <RootToolName />
      <ToolVersion />
      <ToolInDb value="False" />
      <CategoryName />
      <SearchTags />
      <Author />
      <Company />
      <Copyright />
      <DescriptionLink actual="" displayed="" />
    </MetaInfo>
    <Events>
      <Enabled value="True" />
    </Events>
  </Properties>
</AlteryxDocument>
Top Liked Authors