{"record":{"id":"5fdfaeb4f9361c83","repo":"pentaho/pentaho-kettle","slug":"salesforceupsertdialog-fieldsmissing-dialogmessage","errorCode":null,"errorMessage":"SalesforceUpsertDialog.FieldsMissing.DialogMessage","messagePattern":"SalesforceUpsertDialog\\.FieldsMissing\\.DialogMessage","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupsert/SalesforceUpsert.java","lineNumber":89,"sourceCode":"        flushBuffers();\n      }\n      setOutputDone();\n      return false;\n    }\n\n    // If we haven't looked at a row before then do some basic setup.\n    if ( first ) {\n      first = false;\n\n      data.sfBuffer = new SObject[meta.getBatchSizeInt()];\n      data.outputBuffer = new Object[meta.getBatchSizeInt()][];\n\n      // get total fields in the grid\n      data.nrfields = meta.getUpdateLookup().length;\n\n      // Check if field list is filled\n      if ( data.nrfields == 0 ) {\n        throw new KettleException( BaseMessages.getString(\n          PKG, \"SalesforceUpsertDialog.FieldsMissing.DialogMessage\" ) );\n      }\n\n      // Create the output row meta-data\n      data.inputRowMeta = getInputRowMeta().clone();\n      data.outputRowMeta = data.inputRowMeta.clone();\n      meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,\n                      metaStore );\n\n      // Build the mapping of input position to field name\n      data.fieldnrs = new int[meta.getUpdateStream().length];\n      for ( int i = 0; i < meta.getUpdateStream().length; i++ ) {\n        data.fieldnrs[i] = getInputRowMeta().indexOfValue( meta.getUpdateStream()[i] );\n        if ( data.fieldnrs[i] < 0 ) {\n          throw new KettleException( BaseMessages.getString( PKG, \"SalesforceUpsert.FieldNotFound\", meta\n            .getUpdateStream()[i] ) );\n        }\n      }","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupsert/SalesforceUpsert.java#L71-L107","documentation":"Thrown in SalesforceUpsert.processRow when the step's update field mapping grid is empty — meta.getUpdateLookup().length is 0. An upsert step with nothing to update is treated as a configuration error and aborts the transformation rather than silently doing nothing.","triggerScenarios":"Running a Salesforce Upsert step whose 'Update fields' table has zero rows: the user never opened/configured the step, or the grid was cleared after editing the ktr XML.","commonSituations":"Transformation copied from a template where the upsert mapping was never filled in; settings lost after XML/repository edit; grid accidentally emptied in the dialog and saved.","solutions":["Open the Salesforce Upsert step dialog and populate the 'Update fields' table (field to update + stream field).","Verify the saved ktr contains the <updateLookup>/<updateStream> grid entries.","Re-enter external-ID and field mappings if a version upgrade dropped the grid contents."],"exampleFix":"// before (transformation XML)\n<fields/>\n// after\n<fields>\n  <field>\n    <lookup>Name</lookup>\n    <stream>name</stream>\n  </field>\n</fields>","handlingStrategy":"validation","validationCode":"if (meta.getUpdateLookup() == null || meta.getUpdateLookup().length == 0) {\n  throw new KettleException(\"Salesforce Upsert step has no update field mappings configured\");\n}","typeGuard":null,"tryCatchPattern":"try { return processRow(row); } catch (KettleException e) { if (e.getMessage().contains(\"FieldsMissing\")) { log.error(\"Configure the update field grid in the step dialog\"); } throw e; }","preventionTips":["Always fill the 'Update fields' grid before saving the step","Review mappings when copying/template transformations","Re-validate step configuration after manual ktr XML edits"],"tags":["pentaho","kettle","salesforce","configuration","upsert"],"backgroundTag":"empty-required-field","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}