> ## Documentation Index
> Fetch the complete documentation index at: https://learn.nextedy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Configure FMEA Workflows

> Set up a complete Failure Mode and Effects Analysis (FMEA) workflow in Nextedy RISKSHEET, including risk item types, Risk Priority Number (RPN) formulas, severity/occurrence/detection columns, and conditional formatting.

export const LastReviewed = ({date}) => {
  if (!date) return null;
  const formatted = new Date(`${date}T00:00:00Z`).toLocaleDateString("en-US", {
    year: "numeric",
    month: "long",
    day: "numeric",
    timeZone: "UTC"
  });
  return <p className="mt-10 text-sm text-gray-400 dark:text-zinc-500 not-prose">
      Last reviewed on {formatted}
    </p>;
};

## Prerequisites

Before starting, ensure you have:

* Risksheet installed and licensed in your Siemens Polarion ALM project
* Administrative access to edit the sheet configuration
* Custom work item types defined in Polarion for your FMEA structure (e.g., failure modes, risk items)
* Severity, occurrence, and detection enumerations defined in Polarion (**Administration > Enumerations**)
* Familiarity with the [configuration editor](/risksheet/guides/configuration/using-config-editor)

<Tip title="Start from a template, not from scratch">
  Do not build a Risksheet configuration from a blank file. Pick the closest solution template for your industry and methodology (Nextedy provides templates for FMEA, HARA, TARA, STRIDE, and CVSS), inspect its sheet configuration, then modify to match your process. The functional safety template is the simplest entry point for evaluation.
</Tip>

## FMEA Structure Overview

A typical FMEA Risksheet uses a multi-level visual hierarchy to organize failure modes, causes, effects, and mitigations. Note that Risksheet's data model has exactly two entity types — risk items and task items — and the hierarchy you see in the grid is created visually by merging cells that share the same control-column value.

<Frame>
  <img src="https://mintcdn.com/none-17b4493f/yWl5nA2D0IzEnZC1/risksheet/diagrams/guides/risk-management/fmea-configuration/diagram-1.svg?fit=max&auto=format&n=yWl5nA2D0IzEnZC1&q=85&s=bd6968782f19f9290699541dd03427cf" alt="diagram" style={{ maxWidth: "500px", width: "100%" }} width="500" height="240" data-path="risksheet/diagrams/guides/risk-management/fmea-configuration/diagram-1.svg" />
</Frame>

<Steps>
  <Step title="Define Data Types">
    Configure the risk and task work item types in the `dataTypes` section of the sheet configuration:

    ```yaml theme={null}
    dataTypes:
      risk:
        type: failureMode
        role: relates_to
        removeStrategy: delete
      task:
        type: mitigationAction
        role: mitigates
        name: Mitigation
        zoomColumn: taskDescription
    ```

    Replace `failureMode` and `mitigationAction` with your actual Polarion work item type IDs. The `name` property gives the task button a label in the toolbar, and `zoomColumn` specifies which column receives focus when a new task is created.

    <Warning title="Custom work item type IDs must match exactly">
      When using custom work item types (e.g., `wit_failureMode`, `wit_measure`), the `type` value must match the Polarion type ID precisely. A mismatch causes configuration errors such as `For input string: nice_to_have` when enum values cannot be resolved for the specified type.
    </Warning>
  </Step>

  <Step title="Configure Levels">
    Define the visual hierarchy that controls cell merging and row grouping. Every level entry needs three properties: `name` (the display name in the navigation menu), `controlColumn` (the column whose value drives cell merging), and `zoomColumn` (`zoomColumn`defines in which column a highlighted cell will appear).

    ```yaml theme={null}
    levels:
      - name: System element
        controlColumn: systemElement
        zoomColumn: systemElement
        showInMenu: true
      - name: Failure mode
        controlColumn: failureModeId
        zoomColumn: failureModeId
        showInMenu: true
    ```

    Columns with `level: 1` merge with the first entry, columns with `level: 2` merge with the second, and columns bound to task fields have no level. The visual hierarchy is purely a display effect — all rows remain individual Polarion work items of the same type.

    <Warning title="Column IDs in levels must match column definitions">
      The `controlColumn` and `zoomColumn` values must exactly match the `id` property of the corresponding column in your `columns` array. Mismatched IDs cause row duplication in the Risksheet display.
    </Warning>
  </Step>

  <Step title="Set Up RPN Formulas">
    Define Risk Priority Number formulas in the `formulas` section. A standard FMEA uses Severity × Occurrence × Detection:

    ```yaml theme={null}
    formulas:
      commonRpn: "function(info){ var value = info.item['occ']*info.item['det']*info.item['sev']; return value?value:null; }"
      commonRpnNew: "function(info){ var value = info.item['occNew']*info.item['detNew']*info.item['sevNew']; return value?value:null; }"
    ```

    The `commonRpn` formula calculates the initial RPN before mitigations. The `commonRpnNew` formula calculates the revised RPN after mitigations are applied. Reference these formulas in your column definitions using the `formula` property.

    For complex risk-matrix logic, define thin wrapper formulas here and externalize the calculation into the top panel configuration (`risksheetTopPanel.vm`). This separation keeps the sheet configuration declarative and auditable — important for regulated industries where the structural configuration and the calculation logic have different review gates.
  </Step>

  <Step title="Define Rating Scales as Polarion Enumerations">
    Rating scales for severity, occurrence, and detection are NOT defined inside the sheet configuration. They live in Polarion as standard enumerations, and Risksheet loads their values automatically.

    **To configure a rating scale:**

    1. In Polarion, navigate to **Administration > Enumerations** and create an enumeration (for example, `severityRating`) with the values you need (e.g., 1 — No Effect, 2 — Very Minor, 5 — Moderate, 8 — Very High, 10 — Hazardous).
    2. Add a custom field of type **Enum** on your risk work item type (e.g., `failureMode`) that references the enumeration.
    3. In the sheet configuration, declare a column that binds to the custom field and uses the `rating:<enumId>` type:

    ```yaml theme={null}
    columns:
      - id: sev
        bindings: severityRating
        header: S
        type: rating:severityRating
        width: 60
    ```

    The server resolves the enumeration values, presents them in the dropdown, and applies any numeric ordering defined in the enum. To restrict input to valid scale values (e.g., 1–10), simply maintain that constraint in the Polarion enumeration — Risksheet will enforce it through the binding.

    <Tip title="One enumeration per parameter">
      Define separate Polarion enumerations for severity, occurrence, and detection. This keeps the values, descriptions, and ordering manageable in one place (Administration) and lets multiple Risksheet documents reuse the same scales.
    </Tip>
  </Step>

  <Step title="Add Conditional Formatting for RPN">
    Apply color-coded risk thresholds using `cellDecorators` and `styles`. RPN thresholds vary per deployment — choose the bands that match your organization's risk acceptance criteria. A common AIAG/VDA-aligned choice is 150 and 250:

    ```yaml theme={null}
    cellDecorators:
      rpn: "function(info){ var val = info.value; $(info.cell).toggleClass('boldCol', true); $(info.cell).toggleClass('rpn1', val>0 && val<=150); $(info.cell).toggleClass('rpn2', val>150 && val<=250); $(info.cell).toggleClass('rpn3', val>250); }"
    styles:
      ".boldCol": "{font-weight: 600;}"
      ".rpn1": "{background-color: #eaf5e9 !important; color: #1d5f20 !important;}"
      ".rpn2": "{background-color: #fff3d2 !important; color: #735602 !important;}"
      ".rpn3": "{background-color: #f8eae7 !important; color: #ab1c00 !important;}"
    ```

    This creates three risk bands:

    | RPN Range | Color  | Risk Level |
    | --------- | ------ | ---------- |
    | 1–150     | Green  | Low        |
    | 151–250   | Yellow | Medium     |
    | > 250     | Red    | High       |

    Use `$(info.cell).toggleClass(...)` rather than inline styles — Risksheet reuses cells when scrolling, and direct style mutation would leave stale styling behind.

    Apply the same decorator to the row header for at-a-glance risk visibility by setting `headers.rowHeader.renderer` to `rowHeaderRpnNew`:

    ```yaml theme={null}
    headers:
      rowHeader:
        renderer: rowHeaderRpnNew
      columnHeader:
        height: 32
    cellDecorators:
      rowHeaderRpnNew: "function(info){ var val = info.item['rpnNew']; $(info.cell).toggleClass('rpn1', val>0 && val<=150); $(info.cell).toggleClass('rpn2', val>150 && val<=250); $(info.cell).toggleClass('rpn3', val>250); }"
    ```
  </Step>

  <Step title="Configure Before/After Mitigation Columns">
    FMEA methodology requires tracking risk before and after mitigation. Add a second set of rating columns with the `New` suffix for post-mitigation values. Note the `bindings` (plural) property — this is the Polarion field ID that the column reads from and writes to:

    ```yaml theme={null}
    columns:
      - id: sev
        bindings: customField_severity
        header: S
        type: rating:severityRating
        width: 60
      - id: occ
        bindings: customField_occurrence
        header: O
        type: rating:occurrenceRating
        width: 60
      - id: det
        bindings: customField_detection
        header: D
        type: rating:detectionRating
        width: 60
      - id: rpn
        header: RPN
        formula: commonRpn
        width: 80
      - id: sevNew
        bindings: customField_severityNew
        header: S (After)
        type: rating:severityRating
        width: 60
      - id: occNew
        bindings: customField_occurrenceNew
        header: O (After)
        type: rating:occurrenceRating
        width: 60
      - id: detNew
        bindings: customField_detectionNew
        header: D (After)
        type: rating:detectionRating
        width: 60
      - id: rpnNew
        header: RPN (After)
        formula: commonRpnNew
        width: 80
    ```
  </Step>
</Steps>

## DFMEA and SFMEA Variants

Risksheet is a generic risk analysis tool that supports any methodology. Common FMEA variants delivered as solution templates:

* **PFMEA (Process FMEA)** — Level 1 is Process Step, Level 2 is Failure Mode
* **DFMEA (Design FMEA)** — Level 1 is System Element or Function, Level 2 is Failure Mode / Potential Cause
* **SFMEA (Safety FMEA)** — Adapted for safety-critical analysis with ISO 26262 alignment

<Info title="Verify in application">
  Some DFMEA templates include built-in upstream linkages (e.g., Failure Mode to Potential Cause) that work automatically without explicit upstream-chain configuration. Test your specific template to determine which linkages require explicit configuration versus those handled automatically.
</Info>

For upstream traceability to design requirements, see [Configure Upstream Traceability Columns](/risksheet/guides/columns/upstream-traceability).

## Aggregating Data Across Rows

In FMEA workflows, you may need to aggregate values from child risk items into the parent process step row. Use the `getMasterRowsByColumnValue` formula function (available since v24.9.1):

```yaml theme={null}
formulas:
  aggregateChars: "function(info){ var rows = risksheet.ds.getMasterRowsByColumnValue('parentId', info.item['parentId']); var vals = []; for(var i=0; i<rows.length; i++){ var v = rows[i]['processCharacteristic']; if(v && vals.indexOf(v)===-1) vals.push(v); } return vals.length ? vals.join(', ') : null; }"
```

This collects unique values from child failure mode items and displays them in the parent row.

## Best Practices

* **Title generation** — use formulas to auto-generate risk item titles from related fields (e.g., hazardous situation + harm) to prevent linking errors with untitled items
* **Split large sheets** — separate Design FMEA and Process FMEA into dedicated Risksheets rather than combining all columns in one sheet to improve performance
* **Limit `multiItemLink` columns** — performance degrades primarily from the number of item-link columns, not row count
* **Externalize complex logic** — keep risk-matrix and conditional-formatting logic in the top panel configuration so that changes to calculation strategy do not require revalidating the sheet structure
* **Template inheritance** — store your FMEA configuration in a [global template](/risksheet/guides/configuration/global-templates) and override only per-document specifics

<Tip title="Preventing linking errors">
  Items without titles cause linking errors in Risksheet. Use formula-based title auto-generation from related fields to avoid this issue. This was resolved in Risksheet v24.10.1, but the auto-title pattern remains a recommended best practice.
</Tip>

## Troubleshooting

| Issue                          | Cause                                                              | Solution                                                                                                            |
| ------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| Duplicated rows in grid        | Column IDs in `levels` or `sortBy` do not match column definitions | Verify `controlColumn` and `zoomColumn` values match actual column `id` properties                                  |
| `For input string` error       | Enum values not properly mapped for custom work item type          | Verify work item type ID matches Polarion type exactly, and that the enumeration is bound to the right custom field |
| RPN shows null                 | Rating fields are empty or not numeric                             | Ensure formulas reference correct field IDs (`sev`, `occ`, `det`) and that the enum values are numeric              |
| Save error on custom fields    | Custom Polarion validation scripts conflict with Risksheet         | Review custom workflow scripts for save compatibility                                                               |
| Slow loading with many columns | Too many item-link columns in a single sheet                       | Split into dedicated sheets per FMEA type                                                                           |

## Verification

After saving your configuration:

1. Reload the Risksheet document in your browser
2. You should now see the multi-level FMEA structure with system elements at Level 1 and failure modes at Level 2
3. RPN columns should display calculated values with color-coded risk bands (green for 1–150, yellow for 151–250, red above 250)
4. Confirm you can create downstream mitigation tasks from the context menu

## See Also

* [Configure HARA Workflows](/risksheet/guides/risk-management/hara-configuration) — automotive hazard analysis setup
* [Set Up Risk Matrices](/risksheet/guides/risk-management/risk-matrices) — configure custom risk assessment matrices
* [Configure Downstream Tasks](/risksheet/guides/risk-management/downstream-tasks) — set up mitigation task tracking
* [Configure Multiple Risk Types](/risksheet/guides/risk-management/multiple-risk-types) — support multiple FMEA variants in one project
* [Configure Calculated Columns](/risksheet/guides/columns/calculated-columns) — advanced formula patterns
* [Apply Conditional Formatting](/risksheet/guides/styling/conditional-formatting) — additional cell styling options
* [FMEA Configuration Example](/risksheet/reference/examples/fmea-example) — complete annotated FMEA configuration with RPN formulas, Action Priority, and 10-step workflow views

<LastReviewed date="2026-06-24" />
