# Welcome to nedyx

nedyx is the modern low code platform for rapid business app building with an intuitive, easy-to-learn user interface and the ability to cover requirements of any complexity.

![](/files/zkXqXWrOykJgBOS8neve)

nedyx allows you to easily create and customize professional business apps in a fast-changing world – even without prior programming experience.

With its new approach, nedyx offers a flexibility you won’t find in any other low-code product. The self-explanatory interface, a simple language, team-based creation – collaborative and simultaneous – as well as the possibility to operate in the cloud or in your own network make our low code platform your optimal choice.

## Online help

The nedyx online help supports you during the creation of business apps. Here you can look up all questions and aspects that may arise while working with nedyx. If a question is not answered, you can always take a look in the [nedyx Community](https://nedyx.invisionservice.com/) and post a question there yourself if needed.

<figure><img src="/files/GcTw2kThgixmhEFPiZY9" alt=""><figcaption></figcaption></figure>


# Getting started

In this tutorial you will learn the first steps to create apps with nedyx.

The result is an investment calculator that calculates the development of an investment over the years, and will look like that:

<div align="left"><img src="/files/auE8h4EsoGPiFsTIns7y" alt=""></div>

In the field **Starting Amount,** the user can enter the amount of the first investment, in the field **Period / Years** the number of years over which the investment is to run, with a given **Growth Rate** and an **Additional Rate per Year**.

The development of the investment, based on the entered values, is then displayed in a table and in a chart.

Click on **Next** to start creating your calculator.


# Preparation

We start with creating a copy of a template for the Investment Calculator.

1. Login to nedyx. This will take you to the **My Apps** page.
2. Duplicate the app *Getting started* by clicking on **Duplicate App** in the three dots menu:

![](/files/DFvjNBZYKanpqrRJ6BZv)

3\. On the duplicated app, click on **Edit App** in the three dots menu. In the following dialog **Edit App** you can rename the app, add a description or an image according to your preferences. Then click on **Update** to save the changes. \\

![](/files/CaTWJFCbosCUSdzzEigo)

**Note**: You can type in whatever you like, nobody else is able to see or open your app until you share it with others.

4\. Now click on the app tile to open the app. This opens the app in Live mode, the standard usage mode of nedyx apps.

<figure><img src="/files/mXXiGIs3T6Jdgl5DSFkb" alt=""><figcaption></figcaption></figure>

In the left **Navigation** area, you see the pages of your app. Currently the app contains only one page named *Calculator*.

5\. Click on the Edit mode button. ![](/files/eU3gArcczlgi2IXxa5uA)

During the next chapters you will learn about the single areas of the nedyx Edit mode step-by-step.


# Basic widget formatting

Now we continue with applying helpful styles and formats to some of the widgets.

**Note**: nedyx pages are filled with *widgets, which are* of different types. There are cell widgets, table widgets, button widgets, chart widgets, etc.

1. Click on the cell widget with the content **Annual Schedule**. This opens all available styles for this widget type in the **Style** tab on the right.

<figure><img src="/files/C60cQwxLJ1L1GRtH5JaE" alt=""><figcaption></figcaption></figure>

2\. In the **Style** tab, switch on the **Border** for the selected widget and switch off the **Shadow** style.

**Note**: If you like, you can select e.g. a different border color by clicking on the circle below **Border**, or change the font, or whatever style you like, according to your preferences.

3\. Click on the cell widget below the text **Growth Rate**, containing the value 0.07.

4\. On the right, click on the **Content** tab and switch on the setting **In percent**. Now the value 0.07 is displayed as 7%.


# The first formula

1. Click on the widget below the text *Year*.

**Note**: Every widget has a name, which is unique per page. You can see in the field left above the page area that the currently selected widget is named *year*.

<figure><img src="/files/UoKHXfPyNq17JyebH0UD" alt=""><figcaption></figcaption></figure>

We will now assign a formula to this widget that will display all years, from 1 to the number of years which are defined in the widget below *Period / Years*.

2\. Click with the mouse into the formula editor. You find this editor above the page, right beside **Content**.

<figure><img src="/files/wB9eSTjAKt3y3hyftrWT" alt=""><figcaption></figcaption></figure>

3\. Now enter this formula into the formula editor:\
**SEQUENCE**(<mark style="color:blue;">#period; 1</mark>)\
and type on the *Return* key afterwards. The *year* widget is now filled with the numbers from 1 to 8.

<figure><img src="/files/JrlLO0Mer0LYlgBovCi6" alt=""><figcaption></figcaption></figure>

**Note 1**: You might recognize the autocomplete window during typing content into the formula window. The suggested entries can be inserted by typing the *Return* or *Tab* key.

**Note 2**: The function **SEQUENCE**(<mark style="color:blue;">#period</mark>; 1) returns all integer numbers from 1 to the defined parameter in one column. If you want to learn more about the **SEQUENCE** function, you find a description of all nedyx functions in the navigation on the left under [ClearLines Functions](/nedyx/clearlines-functions), or click directly on this link: [SEQUENCE](/nedyx/clearlines-functions/range-functions/sequence).

**Note 3**: There is an easy syntax used to access the content of widgets: a hash followed by the name of the widget. So <mark style="color:blue;">#period</mark> returns the current content of the widget *period*, in this case the number 8.

4\. In the formula window, click on any letter of the widget reference <mark style="color:blue;">#period</mark>.

Now you see that the according widget *period* is identified with a blue dotted, marching border. This is helpful to easily read and understand a nedyx formula.

5\. With the *CTRL* key pressed, click on the widget below *Additional Rate / Year* (containing the value 2,000). Type on the *Return* key.

This is another very helpful way to insert or exchange widget references in a formula. Now the *year* widget contains all numbers from 1 to 2,000. Of course that was just for fun, and we have to revert it now.

6\. Repeat steps 4 and 5 to again insert <mark style="color:blue;">#period</mark> into the formula.

Note 4: You can also undo changes using the **Undo** / **Redo** buttons in the header or by pressing CTRL+z / CTRL+y.

<figure><img src="/files/aJQMufKlGTGuOTGrb2Sd" alt=""><figcaption></figcaption></figure>

In the next step, we fill the other table widgets with formula content.


# More formulas

1. Click on the widget below *Contribution*, and enter this formula, either manually or by copy & paste:

<mark style="color:blue;">#startAmount</mark> + (<mark style="color:blue;">#year</mark> \* <mark style="color:blue;">#addRate</mark>)

2. Type the *Return* key or just click outside of the formula editor afterwards. You see now the total contribution you willl add to the investment over the years.

<figure><img src="/files/PbMBJ5geLeCujylP1POI" alt=""><figcaption></figcaption></figure>

3. Click on the widget below *Total Value*, and enter this formula:

<mark style="color:blue;">#startAmount</mark> \* ((1+<mark style="color:blue;">#growthRate</mark>)^<mark style="color:blue;">#year</mark>)+<mark style="color:blue;">#addRate</mark>\*((1+<mark style="color:blue;">#growthRate</mark>)^<mark style="color:blue;">#year</mark>-1)/<mark style="color:blue;">#growthRate</mark>

4. Type the *Return* key or just click outside of the formula editor afterwards. You see now the total value of the investment over the years.

**Note**: This is a more complicated financial function (called "NVP formula"), using all available arithmetical functions in nedyx, including the exponential operator "^".

5. Click on the widget below *Growth*, and enter this formula, either manually or by copy & paste:

<mark style="color:blue;">#totalValue</mark> - <mark style="color:blue;">#contribution</mark>

Now all calculation formulas are defined. You can check the result by changing the values in the four cell widgets. The content of the table widgets adjusts automatically.


# Combine several tables

Now it's time to create a first new widget.

1. Click on the **Add table widget** button in the widget toolbar, left to the page. \\

![](/files/nKH73mq1rRBminAOJrqI)

This adds a new table widget in the middle of the page. Now you can use your skills from other products like Microsoft PowerPoint or Google Present to position the table widget in the free area of the page.

2\. Reposition the widget by using the following options:

* Use the left mouse key to move the whole widget or resize the widgets border
* Use the arrow keys for more detailed adjustments
* Align it with other widget with using the red alignment lines
* Enter new values in the **Position / Size** fields in the **Styles** tab

<figure><img src="/files/KzturpqlNLdFq18kY6al" alt=""><figcaption></figcaption></figure>

**Note**: If you want to move all widgets within a page, type CTRL+a to select all widgets, and use the mouse or cursor keys to reposition them.

3\. To combine the content of the other table widgets, select the new widget and insert the formula:

**COMBINE**(<mark style="color:blue;">#year</mark>; <mark style="color:blue;">#contribution</mark>; <mark style="color:blue;">#totalValue</mark>; <mark style="color:blue;">#growth</mark>; *<mark style="color:orange;">horizontal</mark>*)

4\. In the **Style** tab, select **Right alignment** ![](/files/rSFz4KZZ1EcVei2UrMHY)

**Note**: If you like, you can adjust the number format of the new table widget in the **Content** tab on the right, like for **Digits** or **Grouping**.


# Add a new page

We create a new page now to move the calculation widgets aside from the calculator page.

1. Drag a selection frame (with the mouse button pressed) around the five table widgets left below **Annual Schedule**, to select these widgets.

![](/files/iSqSsTH9eQmO9Enu7NTj)

2. Type *CTRL+c* to copy these widgets into the Clipboard.
3. Move the mouse over the "Calculator" entry in the left **Navigation** tab and click on the "+" icon to add a new page.
4. Click anywhere inside this new page, and type *CTRL+v* to paste the five widgets from the Clipboard into the page.

Now you have created a complete copy of these widgets, where all widget references are automatically adjusted in a way that all functionality is preserved.

If you like, you can use your learned nedyx skills now to add a cell widget with content "Background calculation" as a header, style it and reposition the pasted widgets to your preference.

![](/files/D6oaA0uxKv1osjPppx1K)

In the next step, we delete the copied widgets from the original page.


# Widget references across pages

1. Open the page *Calculator*.
2. Select the four table widgets on the left, e.g. by clicking on the widgets with holding the *Shift* key pressed.

![](/files/66FoQdcy1NdoG9vFeBuG)

3\. Type on the *Del* key to delete these widgets.

Now the remaining table widget displays the error *!REFERENCE*, because its Content formula still contains references to the deleted widgets. For this widget, if you click on the "Execute formula" button ![](/files/J48fNU01PsJPSvpLzDBr) , the incorrect position is also indicated in the formula editor by a red underline and a tooltip:

<figure><img src="/files/6hqnFkC75AmdVMQlBIWf" alt=""><figcaption></figcaption></figure>

4. Replace the current formula of the table widget with this formula:

**COMBINE**(<mark style="color:blue;">#Page1.year</mark>; <mark style="color:blue;">#Page1.contribution</mark>; <mark style="color:blue;">#Page1.totalValue</mark>; <mark style="color:blue;">#Page1.growth</mark>; *<mark style="color:orange;">horizontal</mark>*)

**Note**: The new formula uses now the widget content of the other page. For this, the page name is inserted before the widget name, separated with a dot "."

5. Select the table widget and its heading widget by clicking on them, holding down the *CTRL* key.
6. Press the *Tab* key, so that the 3-dot menu for the heading widget is displayed.

<figure><img src="/files/Z7j4lVNFZ3QxUIk5l8uH" alt=""><figcaption></figcaption></figure>

7. Click on the 3-dot menu and select **Size / Apply same width**, **Align / Align to left** and **Align / Align column widths** one after the other.

The two widgets are now aligned with each other.

In the next step, we display the data in a chart widget.


# Add a chart widget

1. In the widget toolbar, click on **Add chart widget**.

![](/files/MvFMgddJlVJw0TrcVJnO)

2\. Position the new chart widget in the free area of the page (see image below).

3\. To fill the chart with the data of the table widget, select the chart, add <mark style="color:blue;">#table2</mark> as Content formula and type on **Return**.

**Congratulations!** Your Investment Calculator is ready to go!

![](/files/DMvrYqpwYJ1iaDI78Brm)

To see how the app is running in production, click on the **Live mode** button ![](/files/iagGf5WipMyrENt6APWy) in the header bar.


# Further adjustments

Now that you learned about the main nedyx principles, this chapter provides a more playfully, less guided way to become more familiar about nedyx.

We will apply some changes now to our calculator. For this, first switch back to Edit mode by clicking on the Edit mode button <img src="/files/jU4UtBUPcJEDP4GFSr7Z" alt="" data-size="line">.

1. For the chart widget,
   * change the type from line chart to area chart
   * change the line thickness to 0
   * display only horizontal grid lines

![](/files/InuFNFn6jyDazOIJS2ho)

2\. Change the name of the table widget from *table2* to *dataTable*.

**Note**: If widgets are used in formula, it is always helpful if they have spelling names.\
You can always easily rename your widgets. So the chart widget formula uses now the new name of the table widget.

3\. Change the name of page *Page1*, which you have previously created, to *CalcPage*.

**Note**: If you change the name of a page, all formulas that use that page are also automatically adjusted. You can check this in the Content formula of the data table:

**COMBINE**(<mark style="color:blue;">#CalcPage.year</mark>; <mark style="color:blue;">#CalcPage.contribution</mark>; <mark style="color:blue;">#CalcPage.totalValue</mark>; <mark style="color:blue;">#CalcPage.growth</mark>; *<mark style="color:orange;">horizontal</mark>*)

This completes the *Getting started* chapter. Feel free to learn more about nedyx, by creating your first own app, or extending an existing app. Use this online documentation to learn more about available functions and options in nedyx.


# Working with nedyx


# Apps

The starting point in nedyx is the **My Apps** screen. Here all apps are listed which are shared with you.

![My Apps screen](/files/K0oaQcj4nvXltrgXVA3T)

Depending on your permission role, you have different options here.

* If you are a *Standard* user, you are able to open apps.
* If you are a *Contributor*, you can in addition create new apps, edit app properties, duplicate and delete apps.
* If you are an *Admin*, you can in addition see all apps in your workspace.

### Options

#### Add new app ![](/files/UgDby4wYP40YEfYnT0qh)

This adds a new app to your workspace. By default, you have *Editor* permissions on this app, so you can e.g. edit this app and share it with others.

**Note**: If the user does not share the app, there is no way for another user to open this app, not even for *Admins*.

#### Import app ![](/files/vt6Gj733XKGhc3nDMgyH)

You can create a new app by clicking on **Import app**. This lets you upload an app file from your local machine which has been previously created from an existing app.

If an app with the same name already exists, you can decide to replace the existing app, or to create a new app instead.

![](/files/oQxuV1qqirGh5n0ThvtU)

After the app import, the current user is the only shared user of the app.

#### Open app

An app can be opened by clicking on it.

### Further options

If you hover over an app, you see a three dots menu, which provides additional options.

<div align="left"><figure><img src="/files/bnRzsqXC01AwXhUeFXq9" alt=""><figcaption></figcaption></figure></div>

#### Edit app

In the **Edit App** dialog, you can define and change properties of your app, like the name and a description. In addition, you can upload an image which will be displayed for the app.

![](/files/uGU8JoKVFR6ooeyRwwNk)

#### Move to top

This command moves the app to the top of the app list.

In addition, the position of apps can be changed by drag & drop.

#### Duplicate app

This command creates an exact duplicate of your app.

#### Delete app

Deletes the app. A confirmation dialog is displayed to ensure that you really want to delete the app.

![](/files/4gv7iNTwNXTbTQc82w6X)

If you are unsure, it is recommended to export an app file before deleting an app.

#### Show all apps <img src="/files/wjgdvQPF69fQLrQybJ3m" alt="" data-size="original">

This option is only available for *Admins*. It is for example helpful in the case that the last editor of an app is no longer available. Then it provides the admin of the workspace the ability to delete this app.

Apps, which can not be opened by the admin, are marked with a lock symbol. ![](/files/d0r7HgjrNSRNgQwQsCLN)


# Live and Edit mode

When an app is opened for the first time by a user, it starts in Live mode, which is the mode of the productive usage of the app. Here the user has all the interaction options with the app that the editor of the app has provided.

**Remarks**

* In Live mode, every user has a separate "session". Meaning that if a user switches a menu or enters data into table or cell widget, this change has no impact on the sessions of other users.
* It is possible to close a running app and open it afterwards, to continue using the app at the same state when it has been left.
* A session ends automatically if it has not been used for a certain time (60 minutes). Afterwards, opening the app again starts with all default settings like widget content or menu settings.

If the app has been opened by a user who has Edit permissions on the app (see chapter [App Roles](/nedyx/security/user-management/app-roles)), the Edit mode can be entered by clicking on the "Edit mode" button <img src="/files/zuMChXIVTvhfQ03kc8yb" alt="" data-size="line"> in the header bar.

The Edit mode is the environment where apps are built. Pages can be created, widgets can be added to pages, it is possible to change widget positions and styles, define database connection and much more.

**Remarks**

* In Edit mode, all changes are auto-saved and are immediately available for all other users of the app.
* It is possible that multiple editors apply changes on the same app. These changes are available for the other editors immediately as well, so it is recommended to coordinate such a multi-editor development. In the future, nedyx will provide enhanced options to automatically inform editors about changes of other editors.


# The Header bar

In the header bar, the following elements are provided:

* The **Collapse Navigation** button <img src="/files/dU5qxF9VJdEoqPtyYIvQ" alt="" data-size="line">\
  Hides or opens the Navigation tab. Please note that the navigation bar is automatically hidden on smaller browser pages.\\
* The **nedyx logo** <img src="/files/bcSVBBV8TnIbg20cXLnk" alt="" data-size="line">\
  Clicking on the nedyx logo navigates back to "My Apps".\\
* The **Autosave** icon <img src="/files/bNakEut2DuMmBbvGfe4D" alt="" data-size="line">\
  This icon indicates that the last changes have been saved automatically. During the autosave, this icon is displayed: <img src="/files/5MtYGQcTaYo8N5tBtBd5" alt="" data-size="line">\\
* The **App menu** <img src="/files/iN1MpFW42WIlhLbh4H4q" alt="" data-size="line">\
  Displays the name of the current app, with the option to switch directly to another app. \\
* The **Export app** button <img src="/files/mkV3EogsiLgvKgkuoyA9" alt="" data-size="line">\
  Downloads a zip file containing the whole app, so that it can be imported later on the same or another nedyx workspace. For security reasons, passwords for database access are not included. \\
* The **Live mode** button <img src="/files/t4UcWPIEbcNqQN9DS8Io" alt="" data-size="line">\
  Starts the Live mode, the productive environment to use the app. \\
* The **Edit mode** button ![](/files/PUtvfaiijVUgxboietKL)\
  Starts the Edit mode, where the app can be modified by the Editor.\\
* The **Share** button <img src="/files/MP2mNTqegl2PiKRU6cq7" alt="" data-size="line">\
  Opens the "Share app" dialog, where the app can be shared with other users. For more details, see [Share an App with Other Users](/nedyx/security/user-management/share-an-app-with-other-users).\\
* The **User profile** menu <img src="/files/GK4jdUc23EGp6zZr4rkc" alt="" data-size="line">\
  Opens the User profile menu. It contains the following entries:
  * The name of the current user
  * The "Feature preview" switch, see chapter [Feature preview](/nedyx/appendix/feature-preview).
  * The "Change password" option, see chapter [Change password](/nedyx/security/user-management/change-password).
  * The "Manage users" option, see chapter [Adding Users to a Workspace](/nedyx/security/user-management/adding-users-to-a-workspace).
  * The "Logout" option, to leave the nedyx workspace.

#### Remark

* The header bar can be hidden by default by adding the parameter hideHeader to the url.\
  E.g. <https://app.nedyx.com/myworkspace/app/26462/page/245869?mode=edi&#x74;**\\&hideHeader>\*\*


# The Navigation tab

nedyx apps consist of pages. The list of pages is displayed in the **Navigation** tab.

<div align="left"><figure><img src="/files/AOynH82nUhOXUuEpkWTu" alt=""><figcaption></figcaption></figure></div>

### Page management

There are several options to change the structure of the Navigation tab.

#### Add page button ![](/files/GaN8OUGwf7hZ4UVb9dCK)

This adds a new page into the Navigation list, right behind the currently selected page.

### The three dots menu

The three dots menu can be opened by hovering over any page, and clicking on the three dots.

<div align="left"><figure><img src="/files/ry3RsdD3qgeT3ADCx6oc" alt="" width="238"><figcaption></figcaption></figure></div>

#### Add subpage

Adds a subpage to the page.

#### Rename

Renames the page.

Another option to rename a page is to double-click on its name in the **Navigation** tab, or by a single click into the name field (if no widget is selected on the page).

![](/files/Ck1T7c6vKfLePJwonbin)

#### Duplicate

Creates a complete duplicate of the page.

#### Delete

Deletes the page. You can delete a page as well with the DEL key.

#### Change page order

It is possible to order the pages in a hierarchical structure, by dragging & dropping pages into a new position.

If a page should be inserted as a child of a page, drag the page over its parent so that a rectangle appears before dropping it.

<div align="left"><figure><img src="/files/G8NrMYFjusZEb62rzSND" alt="" width="230"><figcaption></figcaption></figure></div>

#### Copying pages

Complete pages including all subpages can be copied within the same app and also from one app to another app. This is done as follows:

1. Click on the page to be copied in the navigation tab.
2. Press **CTRL+c** to copy the page (including all subpages) to the clipboard.
3. Click on the page (in the same or another app) after which the copied pages are to be pasted.
4. Press **CTRL+v** to paste the page(s) from the clipboard behind the page.

#### Remarks

* Pages can only be pasted at the top level of the navigation tree. You can then simply drag and drop the page(s) to another level.
* All widget references within the copied pages are preserved.
* The navigation bar can be hidden by default by adding the parameter hideNav to the url.\
  E.g. <https://app.nedyx.com/myworkspace/app/26462/page/245869?mode=edi&#x74;**\\&hideNav**\\\\>


# Other areas

#### The "Add widget" toolbar

Widgets can be added to a page via the “Add widget” toolbar. Further information can be found in the [Adding widgets](/nedyx/working-with-nedyx/widgets/adding-widgets) chapter.

<div align="left"><figure><img src="/files/tkVLaQM7ht3bjnNVvSsc" alt=""><figcaption></figcaption></figure></div>

#### The "Name" Field (for Pages and Widgets)

The name of the currently selected widget is displayed in the “Name” field and can be changed.

<div align="left"><figure><img src="/files/t2r5i6779SNfY8tKzQTj" alt=""><figcaption></figcaption></figure></div>

#### The Search Dialog

The search dialog allows you to search for widgets on all pages of the app.\
It is available in Edit Mode and can be opened using the shortcut CTRL+f.

<div align="left"><figure><img src="/files/t50SAlNUNapNvHV2Ab0M" alt="" width="375"><figcaption></figcaption></figure></div>

Based on the search text entered, all pages and widgets (in the current or previously selected page) are listed and can be opened by clicking on them.


# Pages

### Page styles

The properties of a page can be changed in the **Page Style** tab.

#### ![](/files/uh1I68hDxDPUfzStWCHk)

#### Page size

Defines the width and height of the page. Pages can never be smaller than the area occupied by the including widgets.

#### Visible in navigation

If switched on, the page is visible in the navigation tab in Live mode.

*Please note*

* In Edit mode, all pages are always visible.
* With the OPEN function, it is possible to open all pages, regardless of whether they have the property "Visible in navigation" turned on or not.
* Pages can only be opened by their url if they have the property "Visible in navigation" switched on.

#### Display name

The name that is displayed for the page in live mode.

#### Background

The background color which is displayed for the page.

#### Border

The border which is displayed around the page.


# Widgets

The visual elements of a page are called Widgets. There are different widget types and sub-types:

* Table widget
  * Column
  * Row
  * Hierarchy
* Cell widget
  * Password
  * QR code
* Text widget
* Button widget
* Menu widget
  * Hierarchy menu
* Chart widget
* Image widget

Widgets are added to a page via the widget toolbar.

<div align="center"><figure><img src="/files/evQJrrvZYMF4NZDZMiPt" alt=""><figcaption></figcaption></figure></div>

A single click places a new widget of the selected type into the middle of the current page. Alternatively, a widget can be dragged to a position on the page by drag\&drop on the widget icon.

The sub-types "Hierarchy" (for table widgets) and "Hierarchy menu" (for menu widgets) can be selected in the Styles tab:

<figure><img src="/files/iq0Oppot9khq6H6po6QC" alt=""><figcaption></figcaption></figure>


# Widget types

There are different types and subtypes of widgets.

#### Table widget

Table widgets display their content in several cells. The following subtypes are available:

* **Table**\
  The widget contains any number of columns and rows.
* **Column**\
  The widget contains only a single column.
* **Row**\
  The widget contains only a single row.

<div align="left"><figure><img src="/files/IT24KYuhwjBn0wzGkypn" alt=""><figcaption></figcaption></figure></div>

* **Hierarchy**\
  The widget is displayed in a hierarchical structure. To do this, it must contain the level in the first column and the display text in the second column.\
  \
  **Note**: If the level is negative, the corresponding row in the hierarchy is collapsed (see the following example, the row for *Texas* has a negative level, therefore *Texas* is collapsed)

<div align="left"><figure><img src="/files/FbqpTzxULdM373OZh0p8" alt=""><figcaption></figcaption></figure></div>

#### Cell widget

Cell widgets display their content in a single cell. There are also subtypes here.

* **Cell**\
  The content of the widget is displayed within the cell. Depending on the value type of the content, it is formatted accordingly, e.g. a number can be displayed with grouping or decimal places, and a date in the date format of the browser.
* **Password**\
  The content of the widget is displayed masked. With the option to make the entered text visible and support for the browser's password manager.

<div align="left"><figure><img src="/files/NKnSivp1xZcoozPKOlUw" alt=""><figcaption></figcaption></figure></div>

* **QR code**\
  The content of the widget is displayed as a QR code. A maximum of approx. 2,000 characters can be packed as a QR code.

<div align="left"><figure><img src="/files/EM5X4FwXFF9AmPjvJrIK" alt=""><figcaption></figcaption></figure></div>

#### Text widget

Text widgets offer the option of formatted text input and display. A toolbar is displayed after activating the widget.

<div align="left"><figure><img src="/files/LvqPMDmdekkJWhGhWxIi" alt=""><figcaption></figcaption></figure></div>

#### Button widget

With a button widget, you can perform an action by clicking on it, e.g. navigating to another page or updating the information which is currently displayed in the page. The corresponding formula is stored in the *On click* action.

<div align="left"><figure><img src="/files/u40NjroVAase8MPtacRs" alt="" width="375"><figcaption><p>After clicking on the Next button, the Overview page opens</p></figcaption></figure></div>

#### Menu widget

Menu widgets allow you to select an element from a list. The following two subtypes are offered:

* **Menu**\
  The menu widget contains a flat list of elements.

<div align="left"><figure><img src="/files/6Bt9kub3otFNINWfhlNB" alt="" width="563"><figcaption></figcaption></figure></div>

* **Hierarchy menu**\
  The hierarchy menu widget is filled with a hierarchical arrangement of elements. It is filled and displayed in the same way as described above for the Hierarchy table subtype.

<div align="left"><figure><img src="/files/vX4xRHCVX0qLXguvWlMp" alt="" width="563"><figcaption></figcaption></figure></div>

#### Chart widget

In chart widgets, the data is displayed in various chart options. Further information can be found in the [Chart content](/nedyx/working-with-nedyx/widgets/chart-content) section.

<figure><img src="/files/ETLAo1vGPhmGu8UoTRaQ" alt=""><figcaption></figcaption></figure>

#### Image widget

Images can be displayed in image widgets. The following image formats are currently supported: jpeg, jpg, png, svg

<div align="left"><figure><img src="/files/NML6D7jhf0cFOOjYlccn" alt="" width="375"><figcaption></figcaption></figure></div>


# Adding widgets

#### Add a widget to a page

From the "Add widget" toolbar, widgets can be added to a page. This can be done

* by a single click on the widget icon. This adds the widget to the center of the visible page area.
* by drag & drop of the widget icon to the position on the page, where it should be inserted.

<figure><img src="/files/H8OGapAlUCTHUH2XJkc5" alt=""><figcaption><p>The "Add widget" toolbar</p></figcaption></figure>

#### Other options to create widgets

* by executing the "Duplicate" command from the widget toolbar. This duplicates all currently selected widgets, and inserts them on the same page with a shift of 10 pixels to the right and to the bottom.
* By copy & paste widgets from the same page, or any other page into the current page, by typing CTRL+c and CTRL+v for the selected widgets to copy.

**Remarks**

* If the name of the widget is already used in the current page by another widget, a new available name is created by adding a numerical appendix to the widget name, like "username2".
* If multiple widgets are copied, their internal formula references are preserved. That means, if the name of the inserted widget changes, the new name is applied in all formulas of the copied widgets.
* If widgets are copied from another app to the current app, it could happen that widgets which are used in formulas are not available in the new app. These formulas must be adjusted before the widgets can be used with their full previous functionality.
* Copy & paste of widgets between different versions of nedyx is not supported.

#### Change the name of a widget

The Name field displays the name of the currently selected widget, which can be changed there as well.

<div align="left"><figure><img src="/files/t2r5i6779SNfY8tKzQTj" alt=""><figcaption><p>Rename a widget</p></figcaption></figure></div>

**Remarks**

* There are some restrictions to widget names:
  * must contain at least 3 letters
  * only these characters are allowed: a-z, A-Z, 0-9, \_ (underscore)
* It is not possible to change the name of a widget to a name which is already used by another widget in the same page.
* When the name of a widget is changed, all formula references in the app are automatically adjusted to the new name. So it is very easy to change widget names at any time.


# Widget selection

#### General

In Edit mode, widget properties can be changed in the tabs on the right or by the widget toolbar.\ <img src="/files/r9fz2gJnzlWbXV4d4yp0" alt="" data-size="original">

It is possible to select multiple widgets at once. Only one of these widgets is the *main selected widget*, identified by resize circles at the four corners.

<img src="/files/hOq1bikNHvK4TvtQ0L5i" alt="" data-size="original">

The main selected widget has some specific characteristics, e.g. only this widget can be resized.

#### Widget selection

Single widgets are selected by just clicking on them.

Multiple widgets can be selected by

* holding the **Shift** or the **CTRL** key pressed during the selection process. An additional click deselects a selected widget.
* dragging a rectangle around widgets by using drag & drop within the page.
* **CTRL**+**a** selects all widgets of a page.

Within a selection of multiple widgets, the main selected widget can be changed by

* clicking two times on a selected widget with holding the **Shift** or **CTRL** key pressed.
* typing on tab or **Shift**+**tab**. This changes the main selected widget within the selection to one or the opposite direction.


# Widget positioning

#### Changing widget position and size

For the current main selected widget, the position and size can be changed by

* drag & drop of the whole widget - changes the position.
* typing on one of the cursor keys (up, down, left, right) - changes the position by one pixel.
* drag & drop on the edges of the widget - changes the size in this direction.

#### Alignment of multiple widgets

For the alignment of multiple widgets, several options are available:

* red dotted lines identify if edges or the middle of widgets are aligned.\
  ![](/files/mrLRmlL394J2pEB0RrK7)
* in the **Style** tab, the properties **Position / size** can be used to manually set position or size parameters on the same value.\
  ![](/files/S3R4AisHVRtLdbXlHoXb)
* The three dot menu of the widget toolbar provides some additional options:
  * Align to top / left / bottom / right
  * Apply same width / height
  * Distribute horizontally / vertically

![](/files/2seb6fBJ4QM6dNW9s1Dr)


# Style tab

### Overview

Widget styles like background, border, font, etc. can be changed for a single and for multiple selected widgets.

If multiple widgets are selected, the properties of the main selected widget are displayed. If any of these properties are changed, these changes are applied to all other selected widgets as well.

<figure><img src="/files/ioAwM3zhS591WSHsuhC7" alt=""><figcaption></figcaption></figure>

#### Position / size

See chapter [Widget positioning](/nedyx/working-with-nedyx/widgets/widget-positioning)

#### Live mode

Specifies the widget properties *Visible,* *Enabled and Editable* in Live mode.

**Remarks**

* In Edit mode, invisible widgets are visible as well by default (so that their properties can be changed easily). To hide invisible widgets in Edit mode as well, click on the button "Show invisible widgets in Edit mode" ![](/files/fry0SHXOCTNFxYLSzwD6) at the bottom of the widgets toolbar.
* If a table widget is disabled, cells can only be selected if they are editable. The "On click" action is in addition still active for all cells.

#### Type

Specifies the type of widget. In addition to the standard types Cell, Table and Menu, the following additional types are offered for these widgets:

* **Password** (for cell widgets)\
  With this type, the content of the field is hidden. With the option to make the entered text visible and support for the browser's password manager.

<div align="left" data-full-width="false"><figure><img src="/files/odGA0gOkFt3yxcWHpNf1" alt=""><figcaption></figcaption></figure></div>

* **QR code** (for cell widgets)\
  The content of the cell widget is displayed as a QR code. A maximum of approx. 2,000 characters can be packed as a QR code.

<figure><img src="/files/EM5X4FwXFF9AmPjvJrIK" alt=""><figcaption></figcaption></figure>

* **Column** (for table widgets)\
  The table widget only contains a single column for this type.
* **Row** (for table widgets)\
  The table widget only contains a single row for this type..

<div align="left"><figure><img src="/files/IT24KYuhwjBn0wzGkypn" alt=""><figcaption></figcaption></figure></div>

Chart widget types are described in the chapter [Chart properties](/nedyx/working-with-nedyx/widgets/chart-properties#chart-type).

#### Background

Specifies the background of the widget, by a hexadecimal value representation. Clicking on the drop down icon opens a color picker for the background, with several options to select the desired color.

<div align="left"><figure><img src="/files/IVLqdKImoJe7soStR5eR" alt=""><figcaption></figcaption></figure></div>

If the background is switched off, the widget becomes transparent, meaning widgets behind it become visible.

If the property **Striped** is switched on, the background color is drawn in stripes. The sub-property **Pattern** then specifies the direction of the stripes. The color between the stripes is white.

<div align="left"><figure><img src="/files/AMgX6AHk2iSyB8c7SFHC" alt=""><figcaption></figcaption></figure></div>

For table widgets, it is possible to assign the background color for the currently selected table cells.

<div align="left"><figure><img src="/files/ZpoWT180SF17UfKit9IZ" alt=""><figcaption></figcaption></figure></div>

#### Border

Specifies the border of the widget, including the border color, position and size.

![](/files/hZmHtYE6dxFlMs21vZwT)

#### Rounded

Specifies if the corners of the widget are rounded. The number defines the radius of the rounding in pixel.

#### Shadow

Specifies if the widget is surrounded by a shadow.

#### Grid

(available only for table and chart widgets)

Specifies if gridlines are displayed. With the options to display horizontal, vertical or both lines, a color and the size of the grid lines.

#### Font

Defines the font of the widget. The font type can be selected from a list of fonts in the menu, with a defined size, color and type (bold, italic, underlined).

#### Alignment

Defines the alignment of the widget content within the widget. Alignment can be defined horizontally and vertically.

#### Word wrap

(available only for table, cell, menu and button widgets)

If *word wrap* is switched on, words which cannot be displayed in a line are wrapped to the next line.

#### Clear formatting

The *Clear formatting* option can be used to reset the formatting of a widget. The following options are available:

* **Clear all** - Deletes all properties from the styles and settings tab of the widget.
* **Clear styles** - Deletes all properties from the widget's Styles tab, including all cell styles of table and chart widgets.
* **Clear settings** - Deletes all properties from the widget's Settings tab.


# Settings tab

### Overview

In the *Settings* tab, the general properties for widgets can be specified.

<figure><img src="/files/yTyQXQoZmrinQxCV9J6q" alt=""><figcaption></figcaption></figure>

#### Digits

Defines how many digits should be displayed for decimal numbers. If automatic is selected, all ending zeros are truncated.

#### In percent

Displays the current number in its percentage representation, with an ending "%".

**Grouping**

Displays a grouping character for separating thousands, millions, etc. in a number. This option is not available if "In percent" is selected.

#### Date / time

Defines the format in which a date with time is to be displayed. Possible options are Date, Time and Date Time.

**Show seconds**

If the time is displayed for a date, you can use the Show seconds property to specify whether the seconds should be displayed.

**Show milliseconds**

If the time is displayed for a date, you can use the Show milliseconds property to specify whether the milliseconds should be displayed in addition to the seconds.

**Local time**

Defines whether the time should be displayed in the time zone selected for the current browser. If this property is not selected, the time is displayed in UTC time.

#### Tab order

Specifies which widget is to be accessed after pressing the Tab key. This widget is selected in the Next widget sub-property.

**Remark**

* Pressing the Tab key while simultaneously pressing the Shift key navigates back to the previous widget.

#### Vertical & horizontal binding

(This option is only available for table widgets.)

Here you can select another table within the same page that defines the vertical and horizontal scroll position of the current widget.

#### Remarks

* It is possible to define the binding between several widgets. You should only ever specify the same table.\
  **Example**: table1, table2 and table3 should scroll together vertically. Here it is best to enter table3 under *Vertical binding* for table1 and table2.\
  (Alternatively, you could also enter table2 for table1 and table3 for table 2, but this would result in unwanted effects).
* If a table has a vertical binding assigned, its scrollbar is only displayed when the mouse hovers over it.

#### Default item

(This option is only available for menu widgets.)

If this property is switched on, a default item name can be entered which is always displayed as top entry in the menu popup.

![](/files/mFIzmh6Hp2d3q65qkAy4)

**Remarks**

* If the default item for a menu is selected, the GETSELECTION function returns 0 as position and the name of the default item as value.
* Calling the SETSELECTION function switches to the default item, if 0 is used as position or the name of the default item is used as value.
* The default item is not part of the Content of a menu widget, it is a separate widget property. So if the content of the menu is referenced by another wigdet, the default item is not included.\
  \\

  <div align="left"><figure><img src="/files/NyfuINvWCXwWlS3SdeMq" alt=""><figcaption></figcaption></figure></div>

#### Show tooltips

(This option is only available for table and menu widgets.)

This property specifies if the values of the widget should show tooltips.

<div align="left"><figure><img src="/files/QMXCZqa5goib9HJVKrVF" alt=""><figcaption></figcaption></figure></div>


# Cell styles

### Overview

For table widgets, it is possible to assign different styles for different cells. This is possible by selecting one or multiple cells, and select the cell styles in the Style tab.

<figure><img src="/files/ZpoWT180SF17UfKit9IZ" alt=""><figcaption></figcaption></figure>

Currently, the following styles can be assigned:

* Background color
* Border color, position and size
* Font color, size, type and style
* Vertical and horizontal alignment

All these cell styles can be switched on and off. If switched off, the style which is defined for the table widget is used as cell style.

To remove all style types of a table widget, select all cells with CTRL+a, and switch the according style off in the Styles tab.


# Chart content

The content of a chart widget must be provided in a specific format. By default, the first column of the data contains the x-axis lables, and the other columns contain the single datasets of the values.

In this example, the chart retrieves its content directly from a table widget. But the content can as well be defined with any formula returning a range of data.

![](/files/4InoJX88CYE42lLpOhrE)

In many cases, datasets are available in a horizontal orientation. Here the option *Data in rows* can be used to define that the underlying data is oriented in rows instead of columns.

<figure><img src="/files/7R9RIBDxVCB1xmgfxPpG" alt=""><figcaption><p>"Data in Rows" switched on, if the datasets are aligned in rows.</p></figcaption></figure>

If the first row contains the names of the dataset, the option "Dataset names in first row" must be switched on. Then the dataset name is displayed in the tooltip.

<figure><img src="/files/Mo85cRNvSaanoiFRpdXg" alt=""><figcaption></figcaption></figure>

If the first column contains the names of the dataset, the option "Dataset names in first column" must be switched on.

<figure><img src="/files/FMhUsPsxtPjMVMUabUyY" alt=""><figcaption></figcaption></figure>


# Chart properties

Chart widgets have some specific properties. These properties can be configured in the **Chart Style** tab.

Please note that for each chart type only the properties that are relevant for it are offered.

![](/files/tZNPqKBvWUCeomcG6RWY)

#### Chart type

Defines the type of the chart.

![](/files/IsGSsjIjBeUWRqjU1nXO)

Current options for the chart type are:

* Line
* Vertical line
* Area
* Vertical area
* Column
* Waterfall
* Vertical waterfall
* Bar
* Polar area
* Radar
* Pie

#### Data in rows

See [Chart content](/nedyx/working-with-nedyx/widgets/chart-content)

#### Dataset names in first row / column

See [Chart content](/nedyx/working-with-nedyx/widgets/chart-content)

#### Stacked

Specifies if the included datasets should be stacked in the chart.

#### Center datasets

Specifies if the chart segments should be centered. This allows e.g. to position a line chart above a column chart.

**Legend**

Specifies if a legend should be displayed for the chart. If switched on, the sub-property **Position** specifies if the legend should be display on the *top*, on the *bottom*, to the *left* or the *right* of the chart.

<figure><img src="/files/tDekjVjn7EMWHuO8Saya" alt=""><figcaption></figcaption></figure>

#### Display values

Specifies if labels should be displayed for the elements of the chart. This property has the following sub-properties:

* **Position** - specifies if the value should be displayed around the start, the center or the end of the chart segment.
* **Alignment** - specifies how the value is to be displayed in the environment of *position*. Possible values are *start*, *center*, *end*, *left*, *right*, *top*, *bottom*.
* **Offset** - specifies the distance from the value from the point defined by *position*. Please note that negative values are allowed as well.

<figure><img src="/files/oKlgfA4pGwbkJSCD5rmC" alt=""><figcaption><p>A column chart using value position at the end of the column, with "end" as alignment and a distance of 2 pixel from position.</p></figcaption></figure>

#### Line type

Specifies if lines should be drawn *smooth* or *straight* between chart elements.

#### Line style

Specifies if lines should be drawn *solid*, *dashed* or *dotted* between chart elements.

#### Line thickness

Specifies the thickness of the lines between chart elements.

#### Point shape

Specifies if chart elements are displayed as *circle*, *disc* or *square*.

#### Point size

Specifies the size of the chart element in pixel.

#### Transparency

Specifies the transparency of the background of chart segments. 0 means no transparency, 100 means full transparency.

**Zero line**

Specifies if a line should be displayed at the position of the 0-axis. If switched on, the color and size of the line can be specified.

**Horizontal axis**

Specifies if the labels for the horizontal axis should be displayed.

#### Rotate labels

Specifies if the chart labels of the horizontal axis are to be rotated. Setting auto means automatic rotation, depending on the length of the labels. In the popup menu, the value of the clock-wise rotation in degrees can be selected.

**Vertical axis**

Specifies if the labels for the vertical axes should be displayed.

**Min value**

Specifies the minimum value of the chart.

**Max value**

Specifies the maximum value of the chart.

**Auto-adjust**

Specifies if the defined **Min value** and **Max value** should be applied exactly, or in a way that the entire chart content fits comfortably in the chart area, including evenly distributed grid lines between the min and max value.


# Undo / redo

Undo and redo is available in the Edit mode of nedyx apps.

For any changes in a page, these options for undo / redo are provided:

* undo: by typing CTRL+z or the undo button in the header bar
* redo: by typing CTRL+y or the redo button in the header bar

#### Remarks

* The undo list is maintained per page. If changes of another page should be reverted, this page must be opened manually.
* Changes of complete pages, like create, duplicate, rename, or delete a page cannot be undone.
* The undo list contains a maximum of 100 entries.
* When a session ends, the undo list is deleted.


# Databases


# Connect to a database

You can connect your application to an external data source, by following these steps:

1. Create a table, button or a menu widget on your page.
2. Select the widget, and open the **Connection** tab on the right.

<div align="left" data-full-width="false"><figure><img src="/files/gTbT137GDtDl4IaHYyRy" alt=""><figcaption></figcaption></figure></div>

3\. Enter the following information about the connection:

#### Type

The type of the connection. Supported connection types are *ODBC, OData, Essbase MDX, SAP MDX, Microsoft Analysis Services (SSAS), Smartbooks AI* and *Google Sheets.*

#### Driver

The driver type of the connection. For ODBC connections, *PostgreSQL* and *Microsoft SQL Server are available options*.

#### Service root url

The url of the service root of OData services. E.g. <https://services.odata.org/V4/northwind/northwind.svc/>

#### **Server**

The name of the database server. This can be an IP address or a DNS name.

#### Authentication

The authentication option to connect to the database. Depending on the connection type, the following options are provided:

* ***Basic*** - The current user logs in with username and password.
* **Basic** with the option **Technical user** - The database credentials are stored in the app and automatically applied in Live mode when a user logs in to the database.
* **Bearer token (REST only)** - When connecting to a REST api that supports authentication via a bearer token, the corresponding bearer token for communication can be saved in the "Token" field.
* **Logon ticket (SAP MDX only)** - If nedyx is running in an environment in which a logon ticket (or "MYSAPSSO2" cookie) is issued via SAP authentication, this is used to log the current user on to the SAP MDX connection.
* **EntraID** - The user is redirected to the authentication process which is specified for getting access to the database.

#### Port

The port of the database server.

#### **DB name**

The name of the database.

#### SSL (PostgreSQL only)

Specifies whether the database connection should use SSL encryption.

#### Username

The name of the technical user you want to use for the connection.

#### Password

The technical users password.

**Note**: Your password is secure. It is stored in an encrypted way on the nedyx server. After is has been entered and saved in the Database tab, nobody is able to access the password.

#### Reference

If the widgets uses the connection from another widget, the name of this widget is displayed here. See chapter [Connection](/nedyx/clearlines-functions/general-aspects/calculated-widget-properties/connection)for more information.

4\. Click on **Connect** to connect to the database.

After a successful connection, the status changes to *Connected*. If the connection was not successful, please check the connection parameters.

**Note**: Usually connections to a cloud database like Azure SQL Server are restricted by firewall rules. Please use the ip address from the nedyx server 164.30.23.90 as client address, so that nedyx can access your database server.


# Get external data

#### Overview

Once a database connection has been established, there are different options available for ODBC, SSAS and OData to retrieve data.

#### Schema

In the Schema menu, you can select the schema of an ODBC data source from which the database tables are to be read.

#### DB Table / Cube

In the DB table menu you can select the database table, view or cube whose content should be displayed in the widget. To retrieve the content, use the function GETDATA() with no parameter in the Content formula. \\

<div align="left"><figure><img src="/files/K0EUFPfIUxB1R6oV4eY1" alt="" width="563"><figcaption></figcaption></figure></div>

#### DB columns

In DB columns, the database columns can be selected from which the content for the table widget should be retrieved. Click on "Add column" to add an additional column to the list.

For each column, the "..." menu provides options to

* handle the db column as key column (see function [INSERTDATA ](/nedyx/clearlines-functions/database-functions/insertdata)for more information)
* move or delete the db column
* sort up or down by the db column

<div align="left"><figure><img src="/files/yor5Evk7uEDZqZpPwgju" alt="" width="241"><figcaption></figcaption></figure></div>

In addition, the order of the columns can be changed by drag and drop using the drag icon to the left of the db column name.

#### Menu widget filters

Defines menu widgets, which are used as filter for the database request.

<figure><img src="/files/3AcNVK1mtIsZanypsoun" alt=""><figcaption></figcaption></figure>

**Remarks**

* The specified menu widgets must contain a database request as well, including one db column, as described above.
* If is possible to manually enter a widget reference to a menu on another page, in the usual syntax #pageName.menuWidgetName

#### **Aggregate**

For ODBC connections, the *Aggregate* property defines if single datasets should be returned or an aggregation over all numeric database columns.

If a numeric column in the database table is used as a key column, you should set the *Key column* property (see above) for it so that it is excluded from the aggregation.

#### **Top n rows**

Specifies the number of rows which should be returned by the database request in Edit mode.

#### Only in Edit mode

If this property is activated, the top n restriction only applies in Edit mode. In Live mode, all data sets are queried.

#### **Suppress empty rows**

For SSAS connections, the Suppress empty rows property specifies if all rows should be returned by the database request, or only the rows which contain values (measures) for the selected db columns.

#### Number of levels

For hierarchy and hierarchy menu widgets, the property "Number of levels" specifies the number of columns which define the hierarchy. If the setting *automatic* is selected, the number of non-numeric columns define the hierarchy.

<div align="left"><figure><img src="/files/1jXieetqh5uJu9I1KwnN" alt="" width="563"><figcaption></figcaption></figure></div>


# File management

nedyx offers a range of functionalities for uploading files from the local device to the nedyx server and processing them there.

This means that documents such as invoices, damage reports, terms of use and similar can be stored in the desired format such as pdf, doc, xls, zip, ... and made available for download or e-mail delivery.

The various options and functions are described below. The detailed use of the individual functions can be found in their function descriptions.

**Remarks**

* The nedyx server offers the available S3 file system for storing the files (e.g. AWS S3 in the Amazon AWS Cloud or OpenIO for on-premises installations).
* The files are stored under a random name in the file system on the nedyx server. However, the UPLOADFILE and DOWNLOADFILE functions offer the option to use the original file name.
* The files are available for all apps in the current workspace. It is not possible to access the files from another workspace.
* The files remain in the file system until they are deleted using the DELETEFILE function. It is recommended to delete files after usage by the DELETEFILE function to prevent permanent occupation of unnecessary storage space.

#### File management functions

**UPLOADFILE** - opens an Open file dialog in the browser, which can be used to upload a file from the local device (desktop, tablet, smartphone, etc.) to the nedyx server.

The function returns the newly created name, under which the file is stored on the nedyx server, as well as the original name.

**PDFCREATE** - creates a PDF file that contains one or more pages of a nedyx app. The function returns the name of the created PDF file.

**DOWNLOADFILE** - downloads files, which have been created on the nedyx server, to the local device.

**SENDEMAIL** - sends files, which have been created on the nedyx server, to be sent by e-mail.

**DELETEFILE** - deletes a file from the nedyx server,


# ClearLines Functions

ClearLines is the name of the language which is used by nedyx to define data calculations, navigation, import / export, database access, and others, following Low Code principles.

Here is a complete alphabetical list of all ClearLines functions.

* [ABS](/nedyx/clearlines-functions/mathematical-functions/abs)
* [ACTIONCOLUMN](/nedyx/clearlines-functions/action-functions/actioncolumn)
* [ACTIONCONTENT](/nedyx/clearlines-functions/action-functions/actioncontent)
* [ACTIONROW](/nedyx/clearlines-functions/action-functions/actionrow)
* [ADDUSER](/nedyx/clearlines-functions/user-management-functions/adduser)
* [AGGREGATE](/nedyx/clearlines-functions/range-functions/aggregate)
* [AND](/nedyx/clearlines-functions/logical-functions/and)
* [APPLIST](/nedyx/clearlines-functions/user-management-functions/applist)
* [APPMODE](/nedyx/clearlines-functions/navigation-functions/appmode)
* [APPNAME](/nedyx/clearlines-functions/navigation-functions/appname)
* [APPSHARELIST](/nedyx/clearlines-functions/user-management-functions/appsharelist)
* [BINTODEC](/nedyx/clearlines-functions/mathematical-functions/bintodec)
* [BINTOHEX](/nedyx/clearlines-functions/mathematical-functions/bintohex)
* [CALLURL](/nedyx/clearlines-functions/database-functions/callurl)
* [CELL](/nedyx/clearlines-functions/range-functions/cell)
* [CELLREF](/nedyx/clearlines-functions/widget-functions/cellref)
* [CHAR](/nedyx/clearlines-functions/text-functions/char)
* [CLEAR](/nedyx/clearlines-functions/range-functions/clear)
* [CLICK](/nedyx/clearlines-functions/action-functions/click)
* [CLOSE](/nedyx/clearlines-functions/navigation-functions/close)
* [CODE](/nedyx/clearlines-functions/text-functions/code)
* [COLUMN](/nedyx/clearlines-functions/range-functions/column)
* [COLUMNS](/nedyx/clearlines-functions/range-functions/columns)
* [COMBINE](/nedyx/clearlines-functions/range-functions/combine)
* [CONVERT](/nedyx/clearlines-functions/range-functions/convert)
* [COPY](/nedyx/clearlines-functions/widget-functions/copy)
* [COS](/nedyx/clearlines-functions/mathematical-functions/cos)
* [COT](/nedyx/clearlines-functions/mathematical-functions/cot)
* [COUNT](/nedyx/clearlines-functions/range-functions/count)
* [CREATEDATE](/nedyx/clearlines-functions/date-functions/createdate)
* [CREATEMEMBER](/nedyx/clearlines-functions/text-functions/createmember)
* [CROSSJOIN](/nedyx/clearlines-functions/range-functions/crossjoin)
* [CSVTORANGE](/nedyx/clearlines-functions/range-functions/csvtorange)
* [CUMULATE](/nedyx/clearlines-functions/range-functions/cumulate)
* [DATE](/nedyx/clearlines-functions/date-functions/date)
* [DATETOTEXT](/nedyx/clearlines-functions/date-functions/datetotext)
* [DAY](/nedyx/clearlines-functions/date-functions/day)
* [DECTOBIN](/nedyx/clearlines-functions/mathematical-functions/dectobin)
* [DECTOHEX](/nedyx/clearlines-functions/mathematical-functions/dectohex)
* [DELETEFILE](/nedyx/clearlines-functions/import-export-functions/deletefile)
* [DIFF](/nedyx/clearlines-functions/range-functions/diff)
* [DOWNLOAD](/nedyx/clearlines-functions/import-export-functions/download)
* [DOWNLOADEXCEL](/nedyx/clearlines-functions/import-export-functions/downloadexcel)
* [DOWNLOADFILE](/nedyx/clearlines-functions/import-export-functions/downloadfile)
* [DOWNLOADPDF](/nedyx/clearlines-functions/import-export-functions/downloadpdf)
* [EMPTY](/nedyx/clearlines-functions/range-functions/empty)
* [EXCELCREATE](/nedyx/clearlines-functions/import-export-functions/excelcreate)
* [EXECUTE](/nedyx/clearlines-functions/database-functions/execute)
* [EXP](/nedyx/clearlines-functions/mathematical-functions/exp)
* [FILTER](/nedyx/clearlines-functions/range-functions/filter)
* [FIND](/nedyx/clearlines-functions/text-functions/find)
* [FLIPCELLS](/nedyx/clearlines-functions/range-functions/flipcells)
* [GETDATA](/nedyx/clearlines-functions/database-functions/getdata)
* [GETDBCOLUMNNAMES](/nedyx/clearlines-functions/database-functions/getdbcolumnnames)
* [GETFILELIST](/nedyx/clearlines-functions/import-export-functions/getfilelist)
* [GETPAGES](/nedyx/clearlines-functions/navigation-functions/getpages)
* [GETSELECTION](/nedyx/clearlines-functions/widget-functions/getselection)
* [GETSTATEMENT](/nedyx/clearlines-functions/database-functions/getstatement)
* [GETTIMEZONEOFFSET](/nedyx/clearlines-functions/date-functions/gettimezoneoffset)
* [GETTYPE](/nedyx/clearlines-functions/range-functions/gettype)
* [GETURLPARAM](/nedyx/clearlines-functions/navigation-functions/geturlparam)
* [HASH](/nedyx/clearlines-functions/text-functions/hash)
* [HEXTOBIN](/nedyx/clearlines-functions/mathematical-functions/hextobin)
* [HEXTODEC](/nedyx/clearlines-functions/mathematical-functions/hextodec)
* [HIDDENTEXT](/nedyx/clearlines-functions/text-functions/hiddentext)
* [HOUR](/nedyx/clearlines-functions/date-functions/hour)
* [HTMLTOJSONTEXT](/nedyx/clearlines-functions/text-functions/htmltojsontext)
* [IF](/nedyx/clearlines-functions/logical-functions/if)
* [INSERTDATA](/nedyx/clearlines-functions/database-functions/insertdata)
* [INSERTRANGE](/nedyx/clearlines-functions/range-functions/insertrange)
* [INTERSECTION](/nedyx/clearlines-functions/range-functions/intersection)
* [ISEMPTY](/nedyx/clearlines-functions/logical-functions/isempty)
* [ISUSERACTION](/nedyx/clearlines-functions/logical-functions/isuseraction)
* [JSONTEXTTOHTML](/nedyx/clearlines-functions/text-functions/jsontexttohtml)
* [JSONTORANGE](/nedyx/clearlines-functions/range-functions/jsontorange)
* [LEFT](/nedyx/clearlines-functions/text-functions/left)
* [LEN](/nedyx/clearlines-functions/text-functions/len)
* [LEVEL](/nedyx/clearlines-functions/range-functions/level)
* [LN](/nedyx/clearlines-functions/mathematical-functions/ln)
* [LOADWIDGETCONTENT](/nedyx/clearlines-functions/widget-functions/loadwidgetcontent)
* [LOG](/nedyx/clearlines-functions/mathematical-functions/log)
* [LOOKUP](/nedyx/clearlines-functions/range-functions/lookup)
* [LOOP](/nedyx/clearlines-functions/logical-functions/loop)
* [LOWER](/nedyx/clearlines-functions/text-functions/lower)
* [MAX](/nedyx/clearlines-functions/mathematical-functions/max)
* [MESSAGE](/nedyx/clearlines-functions/navigation-functions/message)
* [MID](/nedyx/clearlines-functions/text-functions/mid)
* [MILLISECOND](/nedyx/clearlines-functions/date-functions/millisecond)
* [MIN](/nedyx/clearlines-functions/mathematical-functions/min)
* [MINUTE](/nedyx/clearlines-functions/date-functions/minute)
* [MOD](/nedyx/clearlines-functions/mathematical-functions/mod)
* [MONTH](/nedyx/clearlines-functions/date-functions/month)
* [MOVECELLS](/nedyx/clearlines-functions/range-functions/movecells)
* [MROUND](/nedyx/clearlines-functions/mathematical-functions/mround)
* [NAME](/nedyx/clearlines-functions/widget-functions/name)
* [NOT](/nedyx/clearlines-functions/logical-functions/not)
* [NOW](/nedyx/clearlines-functions/date-functions/now)
* [NUMBER](/nedyx/clearlines-functions/mathematical-functions/number)
* [OPEN](/nedyx/clearlines-functions/navigation-functions/open)
* [OPENWEBPAGE](/nedyx/clearlines-functions/navigation-functions/openwebpage)
* [OR](/nedyx/clearlines-functions/logical-functions/or)
* [PAGE](/nedyx/clearlines-functions/navigation-functions/page)
* [PDFCREATE](/nedyx/clearlines-functions/import-export-functions/pdfcreate)
* [PI](/nedyx/clearlines-functions/mathematical-functions/pi)
* [PIVOT](/nedyx/clearlines-functions/range-functions/pivot)
* [POSTMESSAGE](/nedyx/clearlines-functions/import-export-functions/postmessage)
* [QUESTION](/nedyx/clearlines-functions/navigation-functions/question)
* [RAND](/nedyx/clearlines-functions/mathematical-functions/rand)
* [RANGE](/nedyx/clearlines-functions/range-functions/range)
* [RANGETOCSV](/nedyx/clearlines-functions/range-functions/rangetocsv)
* [RANGETOHIERARCHY](/nedyx/clearlines-functions/range-functions/rangetohierarchy)
* [RANGETOJSON](/nedyx/clearlines-functions/range-functions/rangetojson)
* [RANGETOROW](/nedyx/clearlines-functions/range-functions/rangetorow)
* [REMOVEUSER](/nedyx/clearlines-functions/user-management-functions/removeuser)
* [RIGHT](/nedyx/clearlines-functions/text-functions/right)
* [ROUND](/nedyx/clearlines-functions/mathematical-functions/round)
* [ROW](/nedyx/clearlines-functions/range-functions/row)
* [ROWS](/nedyx/clearlines-functions/range-functions/rows)
* [ROWTORANGE](/nedyx/clearlines-functions/range-functions/rowtorange)
* [SCANCODE](/nedyx/clearlines-functions/import-export-functions/scancode)
* [SECOND](/nedyx/clearlines-functions/date-functions/second)
* [SENDEMAIL](/nedyx/clearlines-functions/import-export-functions/sendemail)
* [SEQUENCE](/nedyx/clearlines-functions/range-functions/sequence)
* [SETSCROLLPOSITION](/nedyx/clearlines-functions/widget-functions/setscrollposition)
* [SHAREAPP](/nedyx/clearlines-functions/user-management-functions/shareapp)
* [SIN](/nedyx/clearlines-functions/mathematical-functions/sin)
* [SORT](/nedyx/clearlines-functions/range-functions/sort)
* [SQRT](/nedyx/clearlines-functions/mathematical-functions/sqrt)
* [STARTTIMER](/nedyx/clearlines-functions/navigation-functions/starttimer)
* [STOPTIMER](/nedyx/clearlines-functions/navigation-functions/stoptimer)
* [STOREWIDGETCONTENT](/nedyx/clearlines-functions/widget-functions/storewidgetcontent)
* [SUBSTITUTE](/nedyx/clearlines-functions/text-functions/substitute)
* [SUM](/nedyx/clearlines-functions/mathematical-functions/sum)
* [SWITCH](/nedyx/clearlines-functions/widget-functions/switch)
* [TAN](/nedyx/clearlines-functions/mathematical-functions/tan)
* [TEXT](/nedyx/clearlines-functions/text-functions/text)
* [TIMERLIST](/nedyx/clearlines-functions/navigation-functions/timerlist)
* [TODAY](/nedyx/clearlines-functions/date-functions/today)
* [TRANSPOSE](/nedyx/clearlines-functions/range-functions/transpose)
* [TRIM](/nedyx/clearlines-functions/text-functions/trim)
* [TRIMCELLS](/nedyx/clearlines-functions/range-functions/trimcells)
* [UNIQUE](/nedyx/clearlines-functions/range-functions/unique)
* [UNPIVOT](/nedyx/clearlines-functions/range-functions/unpivot)
* [UPDATE](/nedyx/clearlines-functions/widget-functions/update)
* [UPDATEUSER](/nedyx/clearlines-functions/user-management-functions/updateuser)
* [UPLOAD](/nedyx/clearlines-functions/import-export-functions/upload)
* [UPLOADFILE](/nedyx/clearlines-functions/import-export-functions/uploadfile)
* [UPPER](/nedyx/clearlines-functions/text-functions/upper)
* [USERLIST](/nedyx/clearlines-functions/user-management-functions/userlist)
* [USERNAME](/nedyx/clearlines-functions/user-management-functions/username)
* [VISIBLEHIERARCHY](/nedyx/clearlines-functions/range-functions/visiblehierarchy)
* [WEEKDAY](/nedyx/clearlines-functions/date-functions/weekday)
* [YEAR](/nedyx/clearlines-functions/date-functions/year)


# General Aspects


# Formula structure

ClearLines formulas consist of the following elements.

* **Operators**
  * **Arithmetic:** +, -, \*, /, ^
  * **Conditions:** <, <=, ==, <>, >=, >
  * **Text concatenation**: &
  * **Widget assignment:** =
* **Functions** - like **ABS**, **IF**, **OPEN**, **SUM**, ...
  * **Parameters** - used within functions
* **Widget content references** - like <mark style="color:blue;">#cell1</mark> - accessing widgets content
* **Values** - like texts, numbers, dates, images, ...

![](/files/g2dSkYwvo1ONOGsYRrrD)

#### Remarks <a href="#remarks" id="remarks"></a>

* It is possible to nest multiple functions as function parameters.\
  **Example**
  * **AND**(**OR**(**NOT**(<mark style="color:blue;">#cell1</mark> > 5); <mark style="color:blue;">#cell2</mark> < 5); ...
* Before a parameter is used for a function, it is completely evaluated.
* The widget assignment operator (=) returns the assigned value.


# The formula editor

With the formula editor, the editor can define the properties of widgets, or specify which action should be taken if e.g. a button is pressed or a menu is switched.

<figure><img src="/files/5zJJemkL9DcTyIvwpJ2g" alt=""><figcaption></figcaption></figure>

The formula editor consists of the following elements:

**"Execute formula" button**

The "Execute formula" button ![](/files/DvhwCaxoRfbPz90PyZkG) executes the current formula.

**Property menu**

In the property menu, the current action or the property can be selected, for which the formula is displayed.

![](/files/ascu57qBXU57FkdAl026)

#### Remarks

* The "=" between the property menu and the formula editor is displayed for properties. This emphasizes that the result of the formula is assigned to the currently selected property. For actions, there is no result returned, so the "=" is not displayed.
* The properties menu button has a turquoise background if at least one formula is defined for the selected widget. Otherwise it is gray.\
  In this way, you can check whether a widget has a formula stored somewhere by clicking on it.\
  ![](/files/ZgiqiQc7RteP5tjnytHZ)
* In addition, the “Execute formula” button (to the left of the properties menu) has a turquoise background if the currently selected property or action has a formula. Otherwise it is gray.

Translated with [www.DeepL.com/Translator](http://www.DeepL.com/Translator) (free version)

**The formula editor**

In the formula editor, all nedyx formula can be entered. There are many options to simplify the creation of formulas:

* **Autocomplete** - provided by a menu during typing. Autocomplete is provided for formulas and widget references. \\

  <figure><img src="/files/87Q1qO3Rv0Vun8WMH6nw" alt=""><figcaption></figcaption></figure>

  The following options are provided during autocomplete mode:

  * Type on the Return or Tab key to insert the currently selected function or widget reference into the formula editor.
  * Click on the "...info" tag behind the function to open the online help for the function
  * At the right side you find information about the type of the autocomplete entry, if is is a function, a widget, a page, a constant or a property.
* **Widget identification** - After clicking on the reference of a widget in the formula editor, the widget is marked with a dotted frame.\ <img src="/files/yForOh7pLZGkezKfSbKc" alt="" data-size="original">
* **Widget insertion** - By clicking on a widget with the CTRL key pressed, a reference of the widget is inserted at the current position in the formula editor. If the cursor is already on a widget reference, this reference is exchanged with the reference of the clicked widget.
* **Error tooltips** - If a formula contains an error, this is identified right beside the formula editor ![](/files/HXu4J7OpCaXY04Fqono5) and by a red underline below the erroneous formula segment. After hovering over the underline, the according error is displayed. \\

  <div align="left"><figure><img src="/files/8bw4MjfQEU6oDF62gNdV" alt="" width="563"><figcaption></figcaption></figure></div>

**The "Delete formula" button**

With the "Delete formula" button ![](/files/wwzYITxtG3xYoWRzhyPY), the current formula can be deleted. If multiple widgets are selected, this formula type can be deleted either only for the main selected widget, or for all selected widgets. A corresponding selection then appears as a dialogue.

**The "Collapse" / "Expand" button**

With the "Collapse" / "Expand" button <img src="/files/6YUebniLs3mVTKVe7bQG" alt="" data-size="original">, the formula editor can be switched from single line to multi line. If the button is colored blue <img src="/files/qtmr9xYnj6rSXk0YAwUz" alt="" data-size="original">, the formula contains multiple lines.


# Actions

Formulas are assigned to actions like *On click, On switch* or *On input*. If a user performs an action, the according formula is executed.

The available actions depend on the widget type. So an *On click* action is available for a button widget, but not for a menu widget. The following actions are available:

* **On open** - executed when a page is opened.
* **On close** - executed when a page is closed.
* **On click** - executed after the user clicks on the widget, e.g. a button, a table cell or an element of a chart. This action is executed as well if the selection of a table cell is changed with cursor keys.
* **On input** - executed after the user enters a new value into a cell widget or a table cell.
* **On switch** - executed after the user switches a menu.


# Calculated widget properties

Properties can be used to define and change the appearance and behavior of widgets.

Some widget properties can be defined by formula. Here, the most important property is the content of a widget, which can be either entered manually during the Edit mode, or can be calculated by a formula.

<figure><img src="/files/VxdEJmAVINRZ6KuyjXWu" alt=""><figcaption><p>The content of the cell widget is calculated by the RAND function.</p></figcaption></figure>

Besides the content, there are several other properties which can be calculated during a session, like Visible, Style or Connection. This provides the Editor with enhanced capabilities to dynamically customize the user interface and functionality of an app.

If a property of a widget is calculated, the following principles are followed:

* A new calculation of a property replaces the previous value(s) of the property completely.
* If the calculation formula of a property returns *empty*, the property value(s) are not changed.
* When a value of a widget on which the property directly or indirectly depends changes, the formula of the property is recalculated.
* Calculated properties have different dimensionality. There are properties like *Content* or Editable, which can be a multi-cell range, or a property *Visible* or *Style*, containing always only one cell.

**Please note:** the maximum number of cells for all calculations is 500,000. If the calculation retrieves more than 500,000 cells, it returns the error !LIMIT instead. If this happens, please adjust the calculation so that fewer cells are processed and returned.

In the following chapters, these properties are described in detail.


# Content

The content property defines the content of a widget.

#### Examples

<figure><img src="/files/NXg224pVaFsxwBuwmiC6" alt=""><figcaption><p>The content of this cell widget is calculated by the RAND function.</p></figcaption></figure>

<figure><img src="/files/qG44jtezO7ghc6oEKkZe" alt=""><figcaption><p>The date texts from the right table are converted to dates for the left table.</p></figcaption></figure>


# Chart labels

The Chart labels property defines which labels are displayed for chart elements.

#### Value type

**Chart labels** are of value type *text*. If another value type such as number or date is specified, it is converted into a text.

If a chart label value is empty, no label is displayed for this data set.

#### Example

In this example, only the value of the largest bar is to be displayed for the bar chart. For this purpose, a table widget is specified which has empty cells except at the position assigned to the corresponding data record in the table.

<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfbOCUUb6T1dpTR0J2vfH%2Fuploads%2FsbKDc6vchkBgCVPwkrg7%2Fimage.png?alt=media&#x26;token=a4b9062d-efb6-431d-a81b-bb0aa3132df7" alt=""><figcaption></figcaption></figure>


# Column widths and Row heights

The *Column widths* and *Row heights* properties define the column widths and row heights of a table widget.

#### Syntax

* For the *Column widths* property, a row widget with numbers is specified. The numbers define the column width of the table widget in pixels.
* For the *Row heights* property, a column widget with numbers is specified. The numbers define the row heights of the table widget in pixels.

#### Example

In this table widget, the column widths and row heights are specified by the two other widgets:

<div align="left"><figure><img src="/files/Ir8ifNozwOHH701R8K3B" alt=""><figcaption></figcaption></figure></div>


# Connection

The Connection property defines if another widget should be used for the database connection.

#### Syntax

To use the connection of another widget, the standard widget reference syntax is used within the Connection formula:

<mark style="color:blue;">#widgetName</mark>

or (if the widget is on another page):

<mark style="color:blue;">#pageName.widgetName</mark>

#### Remarks

* With the connection property it is possible to use the same database connection from many other widgets.
* If a widget uses the connection of another widget, the adopted connection properties are displayed as read-only in the connection tab. Only the table menu is available, to select the database table or view from which the data is displayed.

#### Examples

The table uses the connection, which is defined in the "WinesDB" button.\
Only the table menu is available in the Connection tab, all other parameters can only be changed in the "WinesDB" button widget.

<figure><img src="/files/Ofbfn7JmNgdJe9ue3Vyc" alt=""><figcaption></figcaption></figure>


# Editable

The "Editable" property defines if the cells of a widget are editable.

#### Value

The Editable property is defined by boolean values. If the Editable formula returns true, the cell is editable, if it returns false, it is not editable.

#### Remarks

* This property is only applied in Live mode. In Edit mode, all cells of a widget are always editable.
* For table widgets, a range of boolean values can be used to define the Editable property for each cell. In that case,
  * if a single cell is used, it defines the Editable properties of all cells
  * if a row is used, the values define the Editable property for each according column
  * if a column is used, the values define the Editable property for each according row
  * if a range is used, the values define the Editable property for each according cell

#### Examples

The selected cell is editable, because the Editable formula returns *<mark style="color:red;">true</mark>* as value.

<figure><img src="/files/FMr0c6GurkpoPutkFEro" alt=""><figcaption></figcaption></figure>

In this example, only the numbers of the continents should be editable, not the total number. Please note that instead of boolean value (true or false), the numbers 1 and 0 can be used instead.

<figure><img src="/files/2sAeJ1W3c3GZhN4LFUH5" alt=""><figcaption></figcaption></figure>

The column "isEditable2" defines that all cells in the rows of the continents are editable, but not the cells in the "Total" row.

<figure><img src="/files/eO75yWF0uLqN4rxaYaoa" alt=""><figcaption></figcaption></figure>

The row "isEditable3" defines that all cells in the continent column are not editable, but the values in the other columns.

<figure><img src="/files/nVEZIAhCRESk7XUOtlP7" alt=""><figcaption></figcaption></figure>

The range "isEditable4" defines that only the values of the continents are editable.

<figure><img src="/files/WaDHO6sNORwmEgRRm93l" alt=""><figcaption></figcaption></figure>


# MinY and MaxY

The MinY and MaxY properties define the minimum and maximum values of the y axes of a chart widget.

#### Value

The MinY and MaxY properties are defined by numeric values. The calculation of these values replace any value which is previously entered in the Style tab of the chart widget.

#### Examples

In this example, an additional buffer of 15 pixels is added to the MaxY value of the line chart.

<figure><img src="/files/G3cG9B14KvhkK1IN3TUS" alt=""><figcaption></figcaption></figure>


# Style

The style property defines the style with which the widget or the cells of a widget are displayed.

#### Syntax

To retrieve the style of another widget, the standard widget reference syntax is used within the Style formula:

<mark style="color:blue;">#widgetName</mark>

or (if the widget is on another page):

<mark style="color:blue;">#pageName.widgetName</mark>

#### Remarks

* For table and chart widgets, the style is not applied to the widget, but to its cells or chart elements.
* The following formats are supported by the style property:
  * Background color
  * Border color, size and position
  * Font color, size, type and style
  * Vertical and horizontal alignment

#### Examples

**Example 1**

The left button "My Button" retrieves its style from the right button "buttonStyle". If the style of the right button changes, the style of the left button is changed as well.

<div align="left"><figure><img src="/files/NIiBXKUXJ6N2BpTdOj16" alt=""><figcaption></figcaption></figure></div>

**Example 2**

If the content of the left cell is "available", it uses the style of the widget with name "availableStyle". If not, the style of the reservedStyle widget is used.

<div align="left"><figure><img src="/files/qYC9OYJKINh7Hz7q01jg" alt=""><figcaption></figcaption></figure></div>

**Example 3**

In this table widget, the cells with negative numbers are displayed with the style of the "negative" cell widget, and the cells with positive numbers are displayed in the style of the "positive" cell widget.

<div align="left"><figure><img src="/files/GHKdbaZhCdiwM2IxpgaU" alt=""><figcaption></figcaption></figure></div>


# Tooltips

The Tooltips property defines which tooltips are displayed for widgets, the cells of a table widget, the entries in a menu widget or elements of a chart widget.

#### Value type

Tooltips are of the value type *text*. If other value types such as numbers or dates are specified, these are converted to text.

If a tooltip value is empty, no tooltip is displayed for this element.

#### Remarks

* If only one tooltip value is specified for a menu widget, this is displayed for the menu button. If a list of tooltip values is specified, these tooltips are displayed for the individual entries of the menu pop-up.
* It is possible to format the tooltips using HTML markup (see example 2 below).

#### Examples

Example 1: In this example, the exact day of the order is displayed as a tooltip for the year.

<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfbOCUUb6T1dpTR0J2vfH%2Fuploads%2Fx6TlLnTIe2qpFW7X3rXq%2Fimage.png?alt=media&#x26;token=1ed3fe28-9661-405a-b822-1f7d6d52ee04" alt=""><figcaption></figcaption></figure>

Example 2: In this example, the tooltip is formatted using HTML markup:

<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfbOCUUb6T1dpTR0J2vfH%2Fuploads%2FJdIvJWu97Zb8janccJlW%2Fimage.png?alt=media&#x26;token=e17f3429-7c01-417c-a43d-ef16cfd14994" alt=""><figcaption></figcaption></figure>


# Visible

The "Visible" property defines if a widget is visible in Live mode.

#### Value

The Visible property is defined by a boolean value. If the Visible formula returns true, the widget is visible, if it returns false, it is not visible.

<figure><img src="/files/7V87Mhre1zHFTQRM3KD4" alt=""><figcaption></figcaption></figure>

#### Remark

* This property is only applied in Live mode. In Edit mode, all widgets are always visible.

#### Examples

The "Submit" button is only visible if the "value" cell contains a value.

<figure><img src="/files/0v0AAZRJB6HdcEV4JRBV" alt=""><figcaption></figcaption></figure>


# Calculated page properties

Currently pages have only "Visible" as the only calculated property.


# Visible (for pages)

The "Visible" property defines if a page is visible in Live mode.

#### Value

The Visible property is defined by a boolean value. If the Visible formula returns true, the widget is visible, if it returns false, it is not visible.

<figure><img src="/files/7V87Mhre1zHFTQRM3KD4" alt=""><figcaption></figcaption></figure>

#### Remark

* This property is only applied in Live mode. In Edit mode, all widgets are always visible.

#### Examples

The "Submit" button is only visible if the "value" cell contains a value.

<figure><img src="/files/0v0AAZRJB6HdcEV4JRBV" alt=""><figcaption></figcaption></figure>


# Ranges

Widget contain data as ranges, a collection of cells in rows and columns. Depending on the widget type, ranges have different dimensions:

* **Cell, Text, Button, Image widget**: range with only a single cell
* **Menu widget**: range with a single column
* **Table, Chart widget**: range with rows and columns\\

**Example**

![](/files/ZS3j0PcuJSVnSXjjLhqx)


# Widget references

In formulas, widget references are used to access the content of a widget.

**Syntax:** <mark style="color:blue;">#page.widget</mark>

with

* <mark style="color:blue;">page</mark> - name of the page of the referenced widget *- optional*
* <mark style="color:blue;">widget</mark> - name of the referenced widget

**Remark**

* An alternative syntax is just using <mark style="color:blue;">#me</mark>. In this case the widget that executes the current formula is returned.

**Examples**

* <mark style="color:blue;">#page1.cell1</mark> - returns the content of the widget with the name *cell1* in page *page1*
* <mark style="color:blue;">#table1</mark> - returns the content of the widget with the name *text1* in the current page
* <mark style="color:blue;">#me</mark> - returns the content of the widget that executes the current formula.


# Menu selection references

Menu selection references can be used in formulas to access the selected entry of a menu widget.

Syntax:

<mark style="color:blue;">#page.widget!selection</mark>

with

* <mark style="color:blue;">page</mark> - Name of the page containing the menu widget *- optional*
* <mark style="color:blue;">widget</mark> - Name of the referenced menu widget
* <mark style="color:blue;">!selection</mark> - Appendix, to access the selected menu entry

#### Remark

* If the !selection appendix is specified, the reference returns the currently selected menu entry. This applies to menus and hierarchy menus.
* The !selection appendix is automatically added to a menu widget reference if you click on the menu widget while holding down the CTRL key. Multiple clicks then switch between the reference with and without the appendix.

#### Examples

* <mark style="color:blue;">menu1!selection</mark> - returns the currently selected entry of the menu1 widget in the current page
* <mark style="color:blue;">#page1.menu1!selection</mark> - returns the currently selected entry of the menu1 widget in the page page1


# Cell references

As an extension to widget references, widget cell references are used in formula to retrieve the content of certain widget cells.

**Syntax**: <mark style="color:blue;">#page.widget!A1:B2</mark>

with

* <mark style="color:blue;">#page.name</mark> - Reference of the widget (see previous chapters)
* <mark style="color:blue;">A1</mark> - starting cell of the cell range, with
  * <mark style="color:blue;">A</mark>: column 1, <mark style="color:blue;">B</mark>: column 2, ...
  * <mark style="color:blue;">1</mark>: row 1, <mark style="color:blue;">2</mark>: row 2, ...
* <mark style="color:blue;">B2</mark> - ending cell of the cell range

**Selecting cell references in the formula editor**

While holding down the CTRL key, either a reference to a widget or to cells of a table widget can be inserted into the formula editor:

<figure><img src="/files/lK4pPDQYBqdLFH3Sdkmg" alt=""><figcaption></figcaption></figure>

#### Remarks

* Single cells can be referenced by a single click on an already selected widget reference (identified by a dotted frame).
* Multiple cells can be referenced by drag & drop across multiple cells.
* After clicking on a widget reference in the formula editor, the corresponding widget or widget cell(s) is marked by a dotted marching frame.

**Examples**

* <mark style="color:blue;">#table1!B3</mark> - returns the cell content of column 2 and row 3, of the widget with name table1
* <mark style="color:blue;">#table1!E</mark> - returns the content of the whole column 5
* <mark style="color:blue;">#table1!3</mark> - returns the content of the whole row 3
* <mark style="color:blue;">#table1!B3:D5</mark> - returns the cell range between column 2, row 3 and column 4, row 5.
* <mark style="color:blue;">#H5</mark> - returns the content of column 8, row 5 of the widget that executes the current formula.
* <mark style="color:blue;">#me!H5</mark> - returns the same as the previous example


# Menu widget synchronization

Often it is necessary to have menu widgets with the same content in different pages. In this case nedyx offers an automatic synchronization, with which all menus always have the same setting.

In the simplest case, only two menus are synchronized with each other. Then one menu is filled with the desired content, e.g. from a database query or from another formula filling. The other menu must then simply reference this menu in the content formula:

<figure><img src="/files/VBM2CCBG74uWUrBrOJhZ" alt=""><figcaption><p>The right menu contains a direct reference to the left menu. Then both menus are synchronized.</p></figcaption></figure>

In this case, switching one menu automatically switches the other menu as well.

#### Remarks

* The synchronization only works if a direct reference to another menu is used. As soon as e.g. a formula is used, like TEXT(#menu1), the synchronization is lost.
* It is possible to reference many menu widgets with each other. The synchronization then continues to work in both directions.


# Action functions


# ACTIONCOLUMN

Returns the index of the column, which was selected before or after the current action.

#### Syntax

**ACTIONCOLUMN**(*pointInTime*)

* *pointInTime* - defines if the index of the selected column *before* or *after* the current action should be returned - ***Value type**: constant (optional, default value: <mark style="color:red;">after</mark>)*\
  Possible values are:
  * *<mark style="color:red;">before</mark>* - returns the index of the selected column *before* the action
  * *<mark style="color:red;">after</mark>* - returns the index of selected column *after* the action

#### Remarks

* If there is no selected column, e.g. if the function is called during an Fx action, the function returns 0.

#### Example

![](/files/wCzYEyh2c8n2TkAPNdQJ)


# ACTIONCONTENT

Returns the content of the cell, which was selected before or after the current action.

#### Syntax

**ACTIONCONTENT**(*pointInTime*)

* *pointInTime* - defines if the content of the selected cell *before* or *after* the current action should be returned - ***Value type**: constant (optional, default value: <mark style="color:red;">after</mark>)*\
  Possible values are:
  * *<mark style="color:red;">before</mark>* - returns the content of the selected cell *before* the action
  * *<mark style="color:red;">after</mark>* - returns the content of the selected cell *after* the action

#### Remarks

* If there is no selected cell, e.g. if the function is called during an Fx action, the function returns 0.

#### Example

![](/files/krFT4vz3vphb2sADMYAu)


# ACTIONROW

Returns the index of the row, which was selected before or after the current action.

#### Syntax

**ACTIONROW**(*pointInTime*)

* *pointInTime* - defines if the index of the selected row *before* or *after* the current action should be returned - ***Value type**: constant (optional, default value: <mark style="color:red;">after</mark>)*\
  Possible values are:
  * *<mark style="color:red;">before</mark>* - returns the index of the selected row *before* the action
  * *<mark style="color:red;">after</mark>* - returns the index of selected row *after* the action

#### Remarks

* If there is no selected row, e.g. if the function is called during an Fx action, the function returns 0.

#### Example

![](/files/od5ME6BbNW2eDpBtHTZd)


# CLICK

Executes the Click action of a button widget.

#### Syntax

**CLICK**(*widget*)

* *widget* - a reference to a button widget, for which the Click action should be executed - ***Value type**: widget reference*

#### *Example*

*A click on the orange button calls the **CLICK** function, which then calls an "On click" on the "Increment" button, which would then increment the value of the cell widget.*

<figure><img src="/files/vP1X2Q1nRXZR9wa015Dm" alt=""><figcaption></figcaption></figure>


# Database functions


# CALLURL

Returns the result of an http-based url request.

#### Syntax

**CALLURL**(url; *method*; *body*; *header*)

* *url* - the url to which the request is sent - ***Value type**: text*
* *method* - the http request method ("GET", "POST", "DELETE", ...) - ***Value type**: text (optional, default: "GET")*
* *body* - the body data of the http request - ***Value type**: text (optional, default: empty)*
* *header* - the header of the http request - ***Value type**: text (optional, default: empty)*

#### Remarks

* The function returns the result of the http request as text.
* If the url request returns any mime type other than text/…, application/javascript, application/json, application/xml, the function returns !ERROR.

#### Linking the CALLURL function with a database widget

It is possible to use an authentication for the CALLURL function that is stored in a REST or Essbase connection. This allows requests to be sent directly to a REST api with corresponding authentication or to the REST api of an Essbase server, for example.

The widget for which the connection is defined is stored as a reference in the connection formula.

#### Example 1

After clicking on the CallURL button, the url from the top cell widget is sent, and the result is assigned to the bottom cell.

<figure><img src="/files/jXT1PuSoHPLu3MfJnWYT" alt=""><figcaption></figcaption></figure>

In this example, a post request is sent to a url, including body and header information.

<figure><img src="/files/0vCwYWuxC40IqZ3slMeb" alt=""><figcaption></figcaption></figure>

#### Example 2 - ChatGPT Communication

The "CALLURL" button uses the "REST api" button as a reference in the connection formula. When a request is sent with the CALLURL function, the authentication of the connection is used, in this case a bearer token (which is required by ChatGPT).

<figure><img src="/files/qmZMQBIUXGmiygM5UGBe" alt=""><figcaption><p>The CALLURL button references the REST api button in its Connection formula</p></figcaption></figure>

<figure><img src="/files/JvJrc3zYlDL2qjGLJNqL" alt=""><figcaption><p>The query can then be sent using the CALLURL function</p></figcaption></figure>


# EXECUTE

Executes a statement for a data connector.

#### Syntax <a href="#syntax.19" id="syntax.19"></a>

**EXECUTE**(*executeString*)

* *executeString* - statement which is sent to the database - ***Value type**: text*

#### Return <a href="#return.1" id="return.1"></a>

The function returns a range, which contains the response of the data connector to the *executeString*.

#### Remarks <a href="#remarks.16" id="remarks.16"></a>

* This function can only be executed by a widget which has a database connection assigned (e.g. a button widget)
* The query string could contain INSERT, UPDATE, DELETE and EXEC statements.


# GETDATA

Retrieves data from a data connector.

#### Syntax <a href="#syntax.22" id="syntax.22"></a>

**GETDATA**(*statement*)

* *statement* - the statement which is sent to the database to retrieve the data - ***Value type**: text (optional)*

#### Remarks <a href="#remarks.19" id="remarks.19"></a>

* This function can only be executed by a widget which has a database connection assigned (a button, menu or a table widget), either directly in its Connection tab, or by a reference to another widget (see chapter [Connection property](/nedyx/clearlines-functions/general-aspects/calculated-widget-properties/connection)).
* If GETDATA is called without a parameter, the function returns the content of the database table which is defined in the Connection tab.

<figure><img src="/files/2KtVGiTNSBxTiIbTIu7l" alt=""><figcaption></figcaption></figure>

* If GETDATA is called with the parameter *statement*, the string defined by statement is sent to the database instead of the settings in the Connection tab.

<figure><img src="/files/NYGNZUwZPgGcsfDp3WSU" alt=""><figcaption></figcaption></figure>

* If GETDATA is called for a hierarchy or a hierarchy menu widget, it returns the data in a hierarchical structure:

<figure><img src="/files/CHEc1sQJlK5b8qz99rBa" alt=""><figcaption><p>The left selected widget is a hierarchy widget, the right widget a table widget. Depending on the widget type, the GETDATA function returns the content in a hierarchical structure.</p></figcaption></figure>

For these widget types, the property "Number of levels" in the Connection tab specifies how many of the first columns define the hierarchy:

<div align="left"><figure><img src="/files/PHGqI6ljxBtTsiEcUze5" alt=""><figcaption></figcaption></figure></div>


# GETDBCOLUMNNAMES

Returns the names of db columns from a widget.

#### Syntax <a href="#syntax.22" id="syntax.22"></a>

**GETDBCOLUMNNAMES**(*widget*)

1. *widget* - a reference to the widget from which the db column names should be returned - ***Value type**: widget reference*

#### Remarks

* The function returns a range of rows containing the DB column names, with the same text that is displayed in the db column list in the Connection tab.
* If GETDATA is called with a parameter, i.e. a self-defined statement, the function does not return values for all connector types. This functionality is offered step-by-step.

#### Example

The row widget is filled with the db column names which are specified for the table widget in the Connection tab.

<figure><img src="/files/Kte4vo0z3Psp7nDvOAoY" alt=""><figcaption></figcaption></figure>


# GETSTATEMENT

Returns the statement (SQL, MDX or REST URI) as defined in the Connection tab.

#### Syntax <a href="#syntax.22" id="syntax.22"></a>

**GETSTATEMENT**(*widget*)

1. *widget* - a reference to the widget from which the current statement should be returned - ***Value type**: widget reference (optional; default: current widget)*

#### Remarks

* Returns a string containing the statement which is created by nedyx based on the current settings in the Connection tab. So the same statement which is sent to the database if GETDATA is called without parameters. Depending on the connection type, the statement is
  * SQL for ODBC connection type
  * MDX for Analysis Services (SSAS) connection type
  * REST URI for OData or Google Sheets connection type

#### Example

The cell at the bottom is filled with the SELECT statement which has been auto-generated for the table on the top.

<figure><img src="/files/voF4UxIB5NQuoC40ffiK" alt=""><figcaption></figcaption></figure>


# INSERTDATA

Writes data back to a data source.

#### Syntax <a href="#syntax.22" id="syntax.22"></a>

**INSERTDATA**(*table*)

* *table* - a table widget which contains the datasets which should be inserted into the data source - ***Value type**: table widget*

#### Remarks

* *table* must be a table widget which has a database connection assigned, including:
  * a connnection to a relational database
  * (optional) a specified database schema
  * a specified database table
  * specified database columns
    * with specified key columns (“Key” property) - optional
    * If columns are not specified, they are added with a null value.
* The logic of the insertion is as follows:
  * If there is already a dataset with the specified key column values in the db table, the exisiting dataset will be overwritten.
  * If not, the dataset is added as new dataset.
  * If no key column is specified, all datasets are added.
* The widget which calls the INSERTDATA function does not need to be connected to the data source.

#### Examples

*Example 1 - Change the whole database table*

The WineList table is filled with the function GETDATA, showing the data from the WineList database table. The column Name has the property "Key column".

<figure><img src="/files/8Zkz3wipaiXe8gHogun7" alt=""><figcaption></figcaption></figure>

If the content of this table should be changed, a single call of the INSERTDATA function is sufficient, using the table as parameter.

<figure><img src="/files/hhGo9OByfIFbA1nE0eR3" alt=""><figcaption></figcaption></figure>

*Example 2 - Add a single row*

The content of the database table from example 1 can be changed by another table as well. Here a single new dataset should be added. For this, the settings in the Connection tab should be the same as for the *WineList* table.

<figure><img src="/files/oo7q0EnqTvF9vWnf38VX" alt=""><figcaption></figcaption></figure>

Please note that the second table is not filled with the GETDATA function. Instead, it can be filled with any dataset content, e.g. manually or using other formulas.

Now any single or multiple datasets can be added or changed, by clicking on the *AddWine* button.

<figure><img src="/files/w6yajwHHeSkDEHCOhJAx" alt=""><figcaption></figcaption></figure>

*Example 3 - Add single values*

If only a single value should be added or changed for a dataset, the other database columns do not to be specified.

<figure><img src="/files/2nPBaKzImBl1YSbFNur9" alt=""><figcaption></figcaption></figure>


# Date functions


# CREATEDATE

Returns a date, defined by year, month and day.

#### Syntax <a href="#syntax.14" id="syntax.14"></a>

**CREATEDATE**(*year;* *month;* *day*)

* *year* - the year of the returned date - ***Value type**: number*
* *month* - the month of the returned date - ***Value type**: number*
* *day* - the day of the returned date - ***Value type**: number*

#### Remarks <a href="#remarks.11" id="remarks.11"></a>

* nedyx uses the 1900 date system, meaning the first possible date is 1/1/1900.
* The three parameters allow the following values
  * *year*
    * if *year* is < 1900 or > 9999, !VALUE is returned
  * *month*
    * if *month* is < 1 or > 12, !VALUE is returned
  * *day*
    * *day* is always added as amount of days (-1) to the first day of the defined month, even if the resulting day is then in another month.

#### Examples

<figure><img src="/files/PPLuMHfwmlgeAM9OFf1a" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/5k3lFz3suGDwcjI8UsIb" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/fGZ1jj1fEyDyP4JQUtmr" alt=""><figcaption></figcaption></figure>


# DATE

Converts a value into value type “date”.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**DATE**(*value*)

* *value* - the value which should be converted - ***Value type**: text or number*

#### Remarks <a href="#examples.1" id="examples.1"></a>

* For converting numbers to date, nedyx uses the 1900 date system, so a number represents the number of days since 01/01/1900.

#### Example <a href="#examples.1" id="examples.1"></a>

The left table contains the date values, which have been converted from the values in table1.

<figure><img src="/files/NstJgttMpyFQwmquIhsc" alt=""><figcaption></figcaption></figure>


# DATETOTEXT

Converts a datetime value into a text with a user-defined format.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**DATETOTEXT**(*datetime, formatstring*)

* *datetime* - the datetime value to be converted into a text - ***Value type**: datetime*
* *formatstring* - the format string for the conversion of *datetime* - ***Value type**: text*

The conversion by *formatstring* follows these rules (case-sensitive):

1. yyyy - is replaced by the year in 4 digits (e.g. 2024)
2. yy - is replaced by the year in 2 digits (the last two digits of the year, e.g. 24)
3. mm - is replaced by the month in 2 digits (e.g. 01, 02, 12)
4. m - is replaced by the month in 1-2 digits (e.g.1, 2, 12)
5. dd - is replaced by the day in 2 digits (e.g. 01, 02, 27)
6. d - is replaced by the day in 1-2 digits (e.g.1, 2, 27)
7. HH - is replaced by the hour in 2 digits (e.g. 01, 02, 15)
8. H - is replaced by the hour in 1-2 digits (e.g.1, 2, 15)
9. MM - is replaced by the minute in 2 digits (e.g. 01, 02, 45)
10. M - is replaced by the minute in 1-2 digits (e.g. 01, 02, 45)
11. SS - is replaced by the seconds in 2 digits (e.g. 01, 02, 23)
12. S - is replaced by the seconds in 1-2 digits (e.g. 01, 02, 23)

#### Remark

* *datetime* is always in UTC time. If the text is to be converted to local time, *datetime* must be adjusted using the GETTIMEZONEOFFSET function.

#### Example

DATETOTEXT with one value:

<div align="left"><figure><img src="/files/nidsW2DgH0nPJDiUWZll" alt=""><figcaption></figcaption></figure></div>


# DAY

Returns the day of a date.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

DAY(*date*)

* *date* - the date from which the day should be returned *- **Value type**: date*

#### Examples <a href="#examples.1" id="examples.1"></a>

<div align="left"><figure><img src="/files/YzqbZSVud93AkRpoRRNi" alt=""><figcaption><p>DAY of a single value</p></figcaption></figure></div>

<div align="left"><figure><img src="/files/kE5lG01PSBYJkKV3aW4e" alt=""><figcaption><p>DAY of multiple values</p></figcaption></figure></div>


# GETTIMEZONEOFFSET

Returns the difference in hours between the local and the UTC time.

#### Syntax

**GETTIMEZONEOFFSET**()

#### Example

In this example, the difference in hours between CET and UTC is returned:

<div align="left"><figure><img src="/files/m11wCNDfzhVTKjC262xw" alt=""><figcaption></figcaption></figure></div>


# HOUR

Returns the hour of a datetime value.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

HOUR(*datetime*)

* *datetime* - the datetime value from which the hour should be returned *- **Value type**: date*

#### Examples <a href="#examples.1" id="examples.1"></a>

<div align="left"><figure><img src="/files/IBnPEiPjd7FuhxN8eVsR" alt=""><figcaption></figcaption></figure></div>


# MILLISECOND

Returns the millisecond of a datetime value.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

MILLISECOND(*datetime*)

* *datetime* - the datetime value from which the millisecond should be returned *- **Value type**: date*

#### Examples <a href="#examples.1" id="examples.1"></a>

<div align="left"><figure><img src="/files/yn0OzUx8o6oDhWNNSAdl" alt=""><figcaption></figcaption></figure></div>


# MINUTE

Returns the minute of a datetime value.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

MINUTE(*datetime*)

* *datetime* - the datetime value from which the minute should be returned *- **Value type**: date*

#### Examples <a href="#examples.1" id="examples.1"></a>

<div align="left"><figure><img src="/files/hvgdObTnN83IyVCvjYwq" alt=""><figcaption></figcaption></figure></div>


# MONTH

Returns the month of a date.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**MONTH**(*date*)

* *date* - the date from which the month should be returned *- **Value type**: date*

#### Examples <a href="#examples.1" id="examples.1"></a>

<div align="left"><figure><img src="/files/yzgtXI3xcs3SiPmy8J13" alt=""><figcaption><p>MONTH of a single value</p></figcaption></figure></div>

<div align="left"><figure><img src="/files/uxzzweADVYeIpHC6geGx" alt=""><figcaption><p>MONTH of multiple values</p></figcaption></figure></div>


# NOW

Returns the current date and time.

#### Syntax <a href="#syntax.54" id="syntax.54"></a>

**NOW**()

#### Remarks

* The format of the returned datetime structure can be specified in the **Settings** tab.
* Cell widgets, which are editable, provide a calendar icon, so that the time can be changed by a calendar and time popup.

#### Example

<figure><img src="/files/GECVGGKJlFkOgZfVJH7Y" alt=""><figcaption></figcaption></figure>


# SECOND

Returns the second of a datetime value.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

SECOND(*datetime*)

* *datetime* - the datetime value from which the second should be returned *- **Value type**: date*

#### Examples <a href="#examples.1" id="examples.1"></a>

<div align="left"><figure><img src="/files/rmzHyWGURczEfQdKB5Tf" alt=""><figcaption></figcaption></figure></div>


# TODAY

Returns the date of the current day.

#### Syntax <a href="#syntax.54" id="syntax.54"></a>

**TODAY**()

Returns the current day as value type date.

#### Example

<figure><img src="/files/SgPX0uan8YWO3wh9KqNP" alt=""><figcaption></figcaption></figure>


# WEEKDAY

Returns the weekday of a date as a number.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**WEEKDAY**(date)

* *date* - the date from which the weekday should be returned *- **Value type**: date*

#### Remarks <a href="#examples.1" id="examples.1"></a>

* The function returns
  * 1 for Sunday
  * 2 for Monday
  * 3 for Tuesday
  * 4 for Wednesday
  * 5 for Thursday
  * 6 for Friday
  * 7 for Saturday
* To convert the weekday numbers into weekday names, the function LOOKUP can be used (see example below).

#### Example <a href="#examples.1" id="examples.1"></a>

<figure><img src="/files/AivEPE4N5j0seladU4ws" alt=""><figcaption></figcaption></figure>

Any value which can be converted to a date can be used as parameter for the WEEKDAY function, e.g. simple numbers.

<figure><img src="/files/GUVeMp3DkyxP8ecmht6B" alt=""><figcaption></figcaption></figure>

The LOOKUP function can be used to retrieve the names of the weekdays, by using a conversion table (colored in green).

<figure><img src="/files/caAJOkZLkJY441ZU8RNY" alt=""><figcaption></figcaption></figure>


# YEAR

Returns the year of a date.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**YEAR**(*date*)

* *date* - the date from which the year should be returned *- **Value type**: date*

#### Examples <a href="#examples.1" id="examples.1"></a>

<div align="left"><figure><img src="/files/mZqIGsr0Q8TKLGIKFlBR" alt=""><figcaption><p>YEAR of a single value</p></figcaption></figure></div>

<div align="left"><figure><img src="/files/h1SJ6bejrURtePp2bykr" alt=""><figcaption><p>YEAR of multiple values</p></figcaption></figure></div>


# Import / export functions


# DOWNLOAD

Downloads a text as a file to the local client computer.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**DOWNLOAD**(*text*; *fileName*)

* *text* - non-formatted text, as content of the file to be downloaded - ***Value type**: text*
* *fileName* - the name of the file to be downloaded - ***Value type**: text*

#### Remarks <a href="#examples.1" id="examples.1"></a>

* Calling this function uses the standard download processing of the browser to store the file on the local computer.
* The function returns !ERROR in case that any error occurs (e.g. the maximum allowed file size is exceeded, or *fileName* is not a valid file name).
* In the combination with RANGETOCSV, the DOWNLOAD function can be used to store the content of any table widget on the client computer.

#### Examples <a href="#examples.1" id="examples.1"></a>

Clicking on the "Download" button saves the file with name "myFile.txt" and the text content "Lorem ipsum..." on the client computer.

<figure><img src="/files/h7k7bcsGpPdBa9B5vS8j" alt=""><figcaption></figcaption></figure>

In combination with RANGETOCSV, the DOWNLOAD function can be used to store the content of any table widget on the client computer. The formula of the "Download" button is here analogue to the previous example: DOWNLOAD(#cell2; "myFile.txt")

<figure><img src="/files/DXhuOPamJMETQAdGujMr" alt=""><figcaption></figcaption></figure>

**Note**: With the functions UPLOAD and CSVTORANGE, this file can used to restore the content of this or another table widget at a later time.


# DELETEFILE

Deletes a file on the nedyx server.

#### Syntax

**DELETEFILE**(*internalFileName*)

* *internalFileName* - the name of the file to be deleted - ***Value type**: Text*

**Remarks**

* A list of file names can also be specified as *internalFileName*. These files are then deleted one after the other on the nedyx server.
* The function returns !ERROR if there is no file with the name *internalFileName*.

#### Examples

Here, the "Delete file" button deletes the file with the internal file name from the internalFileName field on the nedyx server:

<div align="left"><figure><img src="/files/lS8nMwTjKi0H2EqckA44" alt=""><figcaption></figcaption></figure></div>


# DOWNLOADEXCEL

Creates an Excel file with the content of a table widget and downloads it.

#### Syntax

**DOWNLOADEXCEL**(*widget*; *fileName*)

1. *widget* - the table widget whose content is to be used as an Excel file - ***Value type**: table widget*
2. *fileName* - the name under which the Excel file is downloaded - ***Value type**: text (optional, default value: the name of the current page)*

#### Example

Clicking on the "Download Excel" button creates an Excel file with the content of the *wineList* table widget and then downloads it with the file name "Winelist.xlsx".

<div align="left"><figure><img src="/files/QNdfqwFKVPdh2Hfw66Tm" alt=""><figcaption></figcaption></figure></div>


# DOWNLOADFILE

Downloads a file to the local client computer.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**DOWNLOADFILE**(*fileName*)

* *internalFileName* - the name under which the file is stored on the nedyx server - ***Value type**: text*
* *fileName* - the name of the downloaded file - ***Value type**: text*

#### Remarks <a href="#examples.1" id="examples.1"></a>

* Calling this function uses the standard download processing of the browser to store the file on the local computer.

#### Example <a href="#examples.1" id="examples.1"></a>

Clicking on the DOWNLOADFILE button downloads the file which is stored on the nedyx server with the name *internalFileName*. The file is saved on the local machine with the name *fileName*.

<div align="left"><figure><img src="/files/cecxVRBJjOSFlNePp7sY" alt="" width="561"><figcaption></figcaption></figure></div>


# DOWNLOADPDF

Creates and downloads a pdf file with a selection of app pages.

#### Syntax

**DOWNLOADPDF**(*pageInfo*; *fileName*)

1. *pageInfo* - the name of the page which should be added to the pdf file, or a json text containing a list of pages to be exported - ***Value type**: text (optional, default value: current page name)*

   Possible values:

   * *text* - the name of the page which should be downloaded as pdf file
   * *json -* see the function [PDFCREATE ](/nedyx/clearlines-functions/import-export-functions/pdfcreate)for a detailed description of this option
2. *fileName* - the name under which the pdf file is downloaded - ***Value type**: text (optional, default value: the name of the current page or the first page name in the json text)*

#### Remark

* *fileName* can only be specified if *pageInfo* is specified as well.

#### Examples

**Example 1**

A click on the "Download PDF" button downloads the current page as a PDF file.

<figure><img src="/files/DxlxBhVZKmmZ2diWNZoa" alt=""><figcaption></figcaption></figure>

**Example 2**

A click on the "Download PDF" button downloads the page "Dashboard" as a PDF file with the file name "MyDashboard.pdf".

<figure><img src="/files/YOFXsbh3Ym05ea6UMmwf" alt=""><figcaption></figcaption></figure>


# EXCELCREATE

Creates an Excel file on the nedyx server with the content of a table widget.

#### Syntax

**EXCELCREATE**(*widget*)

* *widget* - The table widget from which the Excel file is to be generated - ***Value type**: Table widget*

#### Remark

* The function returns the internal file name of the Excel file created. This name can then be used to download the file to the local computer, send it by email and delete it later.

#### Example

Here, the EXCELCREATE function stores an Excel sheet with the content of the wineList widget on the nedyx server, and the internal file name is stored in the cell widget. The created file can then be further processed using the DOWNLOADFILE or SENDEMAIL functions.

<figure><img src="/files/BUnOrYaRhx1U9Pb8pI7a" alt=""><figcaption></figcaption></figure>


# GETFILELIST

Returns a range containing all files which have been uploaded or created in the current nedyx workspace.

#### Syntax

**GETFILELIST**()

The function returns a range containing all files which have been uploaded or created in the current nedyx workspace, with the following columns:

1. **Hashed internal file name** - a hash of the internal file name, including the original file extension.
2. **Type** - The type of the file. Possible values are: “image” and “file”
3. **File size** - the size of the file in bytes
4. **App name** - the name of the app from which the file has been uploaded or created
5. **User name** - the email of the user which has uploaded the file
6. **Upload time**
7. **Last access time** - for "file" type only

#### Remarks

The main purpose of this function is to provide Admin users an overview of all stored files and images of a workspace, to be able to clean it up from time to time. On the other hand, it should not be possible to open these files, because they could contain sensible information.

To enable this, file names are only returned in hashed format. So it is possible to delete the files (by using the DELETEFILE function), but not to download or send them by email.

#### Example

<figure><img src="/files/TKnmrmqoKoDdQlfqKPrc" alt=""><figcaption></figcaption></figure>


# PDFCREATE

Creates a pdf file with a selection of app pages.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**PDFCREATE**(*page*)

* *page* - the name of the page which should be added to the pdf file, or a json text containing a list of pages to be exported - ***Value type**: text (optional, default value: current page name)*

  Possible value types:

  * *text* - the name of the page which should be downloaded as pdf file
  * *json - see below under "Remarks"*

The function returns the name under which the pdf file is stored on the nedyx server. This name can then be used with the DOWNLOADFILE or SENDEMAIL functions to download the file to the local computer or send it by e-mail.

You can find more information about nedyx file management in the [File management](/nedyx/working-with-nedyx/file-management) chapter.

#### Remarks <a href="#examples.1" id="examples.1"></a>

* If page is specified as a json text, it must follow this syntax:\
  \[\
  \[*pageTitle1*, widgetName1, *actiontype1*, *actiondata1* ],\
  \[pageTitle2, widgetName2, actiontype2, actiondata2 ],\
  \[pageTitle3]\
  ]\
  with
  * *pageTitle* - the technical name of the page which should be added to the pdf file.
  * *widgetName* - the name of the widget (without “#”). The widget must be on the page *pageTitle,* so that is can be executed in the browser page.
  * *actionType* - the type of action which should be executed on the page before it is added to the pdf. Possible values are: “click” and “switch”.
  * *actionData* - for actionType “switch”, the position or the value of the new setting can be specified. If this parameter is a number, it specifies the new position of the menu, if it is a text, it specifies the new selected value of the menu.
* The parameters *widgetName*, *actionType* and *actionData* are optional. If specified, these actions are performed before the page is added to the pdf file.

#### Examples <a href="#examples.1" id="examples.1"></a>

**Example 1**

A click on the "PDFExport" button creates a pdf file containing the current page. This is then downloaded to the local computer using the DOWNLOADFILE function and then deleted using the DELETEFILE function.

<div align="left"><figure><img src="/files/gMUpg4NyH2LGcLSD1s4T" alt=""><figcaption></figcaption></figure></div>

**Example 2**

A click on the "SendEmail" button creates a PDF file that contains the "SalesDashboard" page twice. On the first page, the menu widget with the name "Region" is switched to "USA", on the second page to "Germany". The generated pdf file is then sent as an email attachment by calling the SENDEMAIL function and deleted using the DELETEFILE function.

<div align="left"><figure><img src="/files/IiHJPBzxaLOzjQFfUqxM" alt=""><figcaption></figcaption></figure></div>


# POSTMESSAGE

Sends a message to current browser page.

#### Syntax

**POSTMESSAGE**(*message*)

* *message* - the text message which should be sent to the browser page - ***Value type**: text*

#### Remark

* The message is sent to the browser page after the current formula evaluation has been completed.
* The parent page should have a windows.addEventListener function to receive this message (see example below).

#### Example

Add this script tag to your parent page to receive the message which has been sent by the POSTMESSAGE function:

```
<script >
      function handleMessage(event) {
      // Log the received message
      console.log('Received message:', event.data);
    }
    window.addEventListener('message', handleMessage);
</script>

```

Instead of the console.log function you could add any custom code to process *message* in the expected way.


# SCANCODE

Scans a QR or bar code and returns its content as a text.

#### Syntax

**SCANCODE**()

#### Remarks

* When the function is called, a popup window is opened in the app. In the popup, the QR or bar code can either be uploaded, added as an image by drag\&drop, or scanned by using the device camera.
* After a successful scan, the function returns the content of the code as a text.
* For a list of all supported codes, please open this [link](https://github.com/mebjas/html5-qrcode?tab=readme-ov-file#supported-code-formats).

#### Example

After a click on the SCANCODE button:

<div align="left"><figure><img src="/files/9l4bxudNR5HrTM3CGZG0" alt=""><figcaption></figcaption></figure></div>

This popup window is opened:

<div align="left"><figure><img src="/files/6fsojSXFoMN76pBFkl8U" alt=""><figcaption></figcaption></figure></div>

After a successful scan, the Result widget above is filled with the scanned code.


# SENDEMAIL

Sends an email to one or more recipients.

#### Syntax

**SENDEMAIL**(*to*; *replyTo*; *subject*; *body*; *attachment;attachmentFileName*)

* *to* - address of the recipient - ***Value type**: text*
* *replyTo* - the reply-to address - ***Value type**: text*
* *subject* - the subject line of the email - ***Value type**: text*
* *body* - the body of the email - ***Value type**: text*
* *attachment -* the internal name of the file which should be attached to the email - ***Value type**: text (optional, default: empty - no file is attached)*
* *attachmentFileName -* the assigned name of the attached file - ***Value type**: text (optional, default: attachment, i.e. the internal file name is used as name of the attachment)*

#### Remarks

* The parameter *to* can be a column range containing a list of recipients.
* The parameter *attachment* must be the name of a file which has been generated on the nedyx server, including its extension (e.g. .pdf, .zip, ....
* The parameter *attachment* can be a column range containing a list of internal names of the files, which should be attached to the email.
* The parameter *attachmentFileName* can be a column range containing a list of names, which should be used for the according *attachment*.

#### Examples

*Example 1* - SENDEMAIL without an attachment

<figure><img src="/files/4LlCtRSUJn3vhfZQOPYX" alt=""><figcaption></figcaption></figure>

*Example 2* - SENDEMAIL with one attachment

In the next example, clicking the **Send Email** button below creates a pdf file containing the page "SalesDashboard".

Afterwards, the generated PDF file is sent as an email attachment by calling the SENDEMAIL function.

<figure><img src="/files/gQwKQ3px15soTmjwpcMf" alt=""><figcaption></figcaption></figure>

*Example 3* - As in example 2, but with four attachments to which suitable file names are assigned.

<figure><img src="/files/onSkhuXj3OrhbAkUK6XX" alt=""><figcaption></figcaption></figure>


# UPLOAD

Uploads the content of a file from the local client computer into a widget.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**UPLOAD**()

#### Remarks <a href="#examples.1" id="examples.1"></a>

* Calling this function uses the standard upload processing of the browser to store the file on the local computer.
* The function returns the content of the uploaded file as unformatted text.
* In case that any error occurs, !ERROR is returned.
* In the combination with CSVTORANGE, the UPLOAD function can be used to restore the content of any table widget from a file located on the client computer.

#### Examples <a href="#examples.1" id="examples.1"></a>

Clicking on the "Upload" button opens the "Open file" dialog in the browser. After the user has selected the file to upload, the text content is copied to cell1.

<figure><img src="/files/RhNbK2DAz93BmTCEhYif" alt=""><figcaption></figcaption></figure>

In combination with CSVTORANGE, the UPLOAD function can be used to fill the content of a table widget with the content of a csv file on the client computer. The formula of the "Upload" button is here analogue to the previous example: #cell2 = UPLOAD()

<figure><img src="/files/hvlbuwaIGQFQ5J7gZoax" alt=""><figcaption></figcaption></figure>


# UPLOADFILE

Uploads a file from the local client computer to the nedyx server.

#### Syntax <a href="#syntax.15" id="syntax.15"></a>

**UPLOADFILE**()

#### Remarks <a href="#examples.1" id="examples.1"></a>

* When this function is called, the standard upload of the browser is used to upload the file from the local computer.
* The function returns a row area with two cells with the following content:
  * Cell 1 - the internal name under which the file is stored on the nedyx server
  * Cell 2 - the original file name of the uploaded file.
* If an error occurs, !ERROR is returned.

#### Examples <a href="#examples.1" id="examples.1"></a>

Clicking on the UPLOADFILE button opens the "Open file" dialog in the browser. After uploading the file, the returned row contains the internal name, under which the file is stored on the nedyx server, and the original name of the file:

<div align="left"><figure><img src="/files/GmnUEQyVIOEAmYolGyS2" alt=""><figcaption></figcaption></figure></div>


# Logical functions


# AND

Returns true, if all parameters are true, otherwise false.

#### Syntax <a href="#syntax.3" id="syntax.3"></a>

**AND**(*condition1;* *condition2;* …; *conditionN*)

* *condition1-N* - the condition which is evaluated - ***Value type**: boolean*

#### Example

<figure><img src="/files/aL9lmKVOb1N0upAasd0Q" alt=""><figcaption></figcaption></figure>


# IF

Evaluates an expression if a corresponding condition is true.

#### Syntax <a href="#syntax.23" id="syntax.23"></a>

**IF**(*condition; thenExpression; elseExpression*)

* *condition* - the condition which is evaluated *- **Value type**: boolean*
* *thenExpression* - expression which is evaluated if *condition* is *true* - ***Value type**: any*
* *elseExpression* - expression which is evaluated if *condition* is *false - **Value type**: any (optional, default: empty)*

#### Return <a href="#return.2" id="return.2"></a>

The function returns the result of the evaluated *then*- or *elseExpression*.

#### Remarks <a href="#remarks.20" id="remarks.20"></a>

* The function can be called with multiple *condition*/*thenExpression* parameter pairs as well. In this case, the evaluation of the functions stops after the first condition which is *true*.\
  If none of the conditions is true, *elseExpression* is evaluated.

#### Examples

<figure><img src="/files/UhwmR4iw7DUXY9G5kpu3" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/6YkMMQVBdmm9BqOzwtc8" alt=""><figcaption></figcaption></figure>

In this case, after clicking on the button, table3 is filled with the information if the values of table4 are positive, negative or zero.\
The IF function is used here with 5 parameter, and the result is used to fill a table widget.

<figure><img src="/files/lnoHNbTFi5v6hFkzY5lI" alt=""><figcaption></figcaption></figure>


# ISEMPTY

Returns true if a value is of type empty or an empty text (““) , otherwise false.

#### Syntax <a href="#syntax.24" id="syntax.24"></a>

**ISEMPTY**(*value*)

* *value* - the value to check *- **Value type**: any*

#### Example

<figure><img src="/files/q21fnW2G42fFPJXpVM47" alt=""><figcaption></figcaption></figure>




---

[Next Page](/llms-full.txt/1)

