pentaho/pentaho-kettle · error · KettleException

You must select at least on field!

Error message

You must select at least on field!

What it means

SetValueConstant.processRow() throws KettleException 'SetValueConstant.Log.SelectFieldsEmpty' when the step is configured with an empty fields list. With no fields to replace, the step considers its configuration invalid and aborts instead of silently passing rows.

Solutions

  1. Open the step dialog and add at least one field with its replacement value
  2. If fields should exist, verify the transformation loaded correctly (check for earlier read errors)
  3. Re-save the transformation after editing and re-run
  4. If a no-op pass-through is intended, remove the step entirely

Example fix

// before
<fields></fields>
// after
<fields><field><field_name>status</field_name><replace_value>ACTIVE</replace_value></field></fields>
Defensive patterns

Strategy: validation

Validate before calling

if (meta.getField() == null || meta.getField().isEmpty())
  throw new IllegalStateException("Set Value Constant step has no fields configured");

Try / catch

try { step.processRow(); } catch (KettleException e) { if (e.getMessage().contains("at least on field")) { /* configure fields */ } else throw e; }

Prevention

When it happens

Trigger: First row processing when the step's field list (meta.getFields()) is null or size 0 — no rows were entered in the Fields tab of the dialog.

Common situations: Step added to the transformation but never configured; fields grid accidentally cleared; transformation XML/repo load lost the fields due to an earlier read error.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/11ef7bba2b31f704. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/setvalueconstant/SetValueConstant.java:113

            logError( BaseMessages.getString( PKG, "SetValueConstant.Log.CanNotFindField", meta.getField( i ).getFieldName() ) );
            throw new KettleException( BaseMessages.getString( PKG, "SetValueConstant.Log.CanNotFindField", meta
              .getField( i ).getFieldName() ) );
          }

          if ( meta.getField( i ).isEmptyString() ) {
            // Just set empty string
            data.getRealReplaceByValues()[i] = StringUtil.EMPTY_STRING;
          } else {
            // set specified value
            if ( meta.isUseVars() ) {
              data.getRealReplaceByValues()[i] = environmentSubstitute( meta.getField( i ).getReplaceValue() );
            } else {
              data.getRealReplaceByValues()[i] = meta.getField( i ).getReplaceValue();
            }
          }
        }
      } else {
        throw new KettleException( BaseMessages.getString( PKG, "SetValueConstant.Log.SelectFieldsEmpty" ) );
      }

      data.setFieldnr( data.getFieldnrs().length );

    } // end if first

    try {
      updateField( r );
      putRow( data.getOutputRowMeta(), r ); // copy row to output rowset(s);
    } catch ( Exception e ) {
      if ( getStepMeta().isDoingErrorHandling() ) {
        // Simply add this row to the error row
        putError( data.getOutputRowMeta(), r, 1, e.toString(), null, "SVC001" );
      } else {
        logError( BaseMessages.getString( PKG, "SetValueConstant.Log.ErrorInStep", e.getMessage() ) );
        setErrors( 1 );
        stopAll();
        setOutputDone(); // signal end to receiver(s)

View on GitHub (pinned to f3058517a1)