What this is, and who it is for
A table is one field that holds a grid: a list of concomitant medications, a set of vital signs at several time points, a laboratory panel with one row for each test. Use a table when the same few measurements repeat for many items; use separate fields when each stands alone. There is no separate "repeating group" type: a repeating set of fields is a dynamic table, and a form that repeats as a whole (an adverse event) is an event form.
Where to find it
Drag Table from the toolbox's Structure group. Select it: the Basic tab holds its label, variable name, description and the Dynamic rows switch, and the Table tab holds Table settings, Columns and Rows. Its Logic tab sets a visibility condition for the whole table, and CDMS tab its CDISC annotation and source-verification information. A new table starts with three columns (the first is the row identifier) and three rows.
What you can do
- Choose fixed rows (you list the rows, and every participant sees them) or dynamic rows (the person adds the rows they need, up to an optional maximum).
- Add columns and give each a header, a variable name, a kind and, for data columns, a type.
- For fixed rows, add rows in the Rows list and give each a label.
- For a column, set its edit checks, an N/A when condition, or (for a calculated column) a formula or value rules.
Every option
Table settings
| Setting | Meaning |
|---|---|
| Dynamic rows | Off: the rows are the ones you define. On: the person adds and removes rows when entering data. The Rows list is then not used |
| Max rows | Dynamic tables only. Blank means unlimited. The Add row button shows (n/max) and stops at the limit. One record may hold at most 5,000 values. Making the form active is refused (This form can produce up to n values in one record) when the form could exceed that; a dynamic table with no maximum is counted as 200 rows. Set a maximum if a table can grow |
Columns
Each column has a header (Column header…), a variable and a kind:
| Kind | Meaning | At data entry |
|---|---|---|
| Row ID | Names the row. The first column is always the Row ID, always frozen at the left, and cannot be deleted; no other column can be one | Shown as the row's label |
| Data entry | A value the person enters | Editable |
| Reference | A value shown with the row, not entered by the participant's data collector | Read-only. For fixed rows its value is set per row in the Rows list; for dynamic rows the person is asked for it when adding the row (Add row — reference values) |
| Calculated | Computed from other columns of the same row | Read-only, never typed |
A data entry column has a type: Text, Number, Textarea, Dropdown, Date, Checkbox or Range. A dropdown column lists its options (label and value) in the column. A calculated column has no type of its own; it shows what its formula or rules produce.
Edit checks of a data-entry column (a compact version of the field's Validation tab): Required (for a checkbox, must be ticked, not merely answered); for numbers Min value, Max value, Decimal places, Normal range low and high and an Auto-query when out of normal range switch; for text Min length, Max length and Pattern; for dates Allow future dates, Allow past dates, Earliest date, Latest date. Each check has a severity (Query, Block, Warn) as on a field (Validation, edit checks and their severities). A calculated column has no edit checks.
Not applicable (N/A) when (data-entry columns). A condition over the other columns of the same row; when it is true the cell shows N/A, cannot be entered, is not validated and is not required. The builder offers Add N/A condition, Edit and Remove.
Formula (calculated columns): Set formula opens a formula builder whose variables are the table's own columns, resolved in the same row (Formulas and calculations). Value assignment rules (Add value rule) set the cell from conditions over the same row's columns; they take precedence over the formula, and the first matching rule wins (Conditional logic).
Rows (fixed tables)
| Control | Meaning |
|---|---|
| Row label | The row's name, shown in the first column |
| Critical | Tints the row red as a visual cue. It changes nothing else |
| Preset values | A value for each Reference column of the row |
| Show this row when | A condition over other fields; the row is shown, validated and counted toward completion only when it is true |
At data entry
- A dynamic table shows an Add row button; adding opens a small dialog for the reference values, if the table has Reference columns. Each row has a Remove row button, which is absent from a row that already holds saved values: removing it would be changing it, and only a person who may correct that value can do so.
- The header stays in view while the table scrolls, the first column stays at the left, and a long table scrolls without slowing.
- Each cell can show the same marks as a field: an open query, a source-verification state, and a button to review them.
- Cells are validated one by one, and a problem is shown on the cell, not on the table.
What the system records
Each cell is saved as its own value (with the table's variable, the row and the column) and each change is an audit entry with the earlier value and the reason, exactly as for a field. Calculated cells are recalculated by the server on every save and the server's value is stored; a difference from what the browser sent is written to the audit trail as form.derived_value_overridden. Rows of a dynamic table exist because their cells exist; there is no separate list of rows to lose.
What you cannot do, and why
- Make any column but the first the row identifier, or delete the first column.
- Edit checks on a calculated or reference column. They are not entered.
- Nest a table in a table. A table can sit inside a section; a table cannot hold fields.
- Remove a row that holds saved values without the right to correct them.
- Use a table in place of an event form for adverse events: the logs of events read standard fields of an event form (Versions, reopening and publishing).
Compliance Q&A
Yes. Each cell is its own value with its own audit entries, checks (required, limits, pattern, dates, normal range) and severities. The server applies a column's checks to every row that exists, and recalculates calculated cells.
Evidence: client runtime/table/RuntimeTable.tsxcore/engine/validation-engine.ts (validateTableCell)server data-capture validation-engine.ts (column specs applied to every row)formula-recompute.ts (calculated cells)
Related
Field types · Field properties · Formulas and calculations · Conditional logic · Validation, edit checks and their severities