{"record":{"id":"84dc0479d8095751","repo":"pentaho/pentaho-kettle","slug":"salesforceinput-error-objectnotreplicateable","errorCode":"SalesforceInput.Error.ObjectNotReplicateable","errorMessage":"SalesforceInput.Error.ObjectNotReplicateable","messagePattern":"SalesforceInput\\.Error\\.ObjectNotReplicateable","errorType":"error_code","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforce/SalesforceConnection.java","lineNumber":402,"sourceCode":"      throw new KettleException( BaseMessages.getString( PKG, \"SalesforceInput.Exception.CanNotGetBiding\" ) );\n    }\n\n    try {\n      if ( !specifyQuery ) {\n        // check if we can query this Object\n        DescribeSObjectResult describeSObjectResult = getBinding().describeSObject( getModule() );\n        if ( describeSObjectResult == null ) {\n          throw new KettleException( BaseMessages.getString( PKG, \"SalesforceInput.ErrorGettingObject\" ) );\n        }\n        if ( !describeSObjectResult.isQueryable() ) {\n          throw new KettleException( BaseMessages.getString(\n            PKG, \"SalesforceInputDialog.ObjectNotQueryable\", module ) );\n        }\n        if ( this.recordsFilter == SalesforceConnectionUtils.RECORDS_FILTER_UPDATED\n          || this.recordsFilter == SalesforceConnectionUtils.RECORDS_FILTER_DELETED ) {\n          // The object must be replicateable\n          if ( !describeSObjectResult.isReplicateable() ) {\n            throw new KettleException( BaseMessages.getString(\n              PKG, \"SalesforceInput.Error.ObjectNotReplicateable\", getModule() ) );\n          }\n        }\n      }\n\n      if ( getSQL() != null && log.isDetailed() ) {\n        log.logDetailed( BaseMessages.getString( PKG, \"SalesforceInput.Log.SQLString\" ) + \" : \" + getSQL() );\n      }\n\n      switch ( this.recordsFilter ) {\n        case SalesforceConnectionUtils.RECORDS_FILTER_UPDATED:\n          // Updated records ...\n          GetUpdatedResult updatedRecords = getBinding().getUpdated( getModule(), this.startDate, this.endDate );\n\n          if ( updatedRecords.getIds() != null ) {\n            int nr = updatedRecords.getIds().length;\n            if ( nr > 0 ) {\n              String[] ids = updatedRecords.getIds();","sourceCodeStart":384,"sourceCodeEnd":420,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforce/SalesforceConnection.java#L384-L420","documentation":"In query(), when recordsFilter is RECORDS_FILTER_UPDATED or RECORDS_FILTER_DELETED, the object must be replicateable (support getUpdated/getDeleted). The wrapper throws this KettleException when describeSObjectResult.isReplicateable() is false. Replication-based filtering is simply not available for that object.","triggerScenarios":"query(specifyQuery=false) with recordsFilter set to updated or deleted against an object whose describe reports replicateable=false.","commonSituations":"Selecting 'Get updated'/'Get deleted' in the Salesforce Input step for objects that don't support replication (many custom/system objects); objects missing the change-data-capture/replication enablement; older API versions limiting replicateable flags.","solutions":["Switch the retrieval filter to a date-range or 'all records' filter instead of updated/deleted for this object.","Pick an object that is replicateable (check the replicateable flag via describe in Workbench).","Enable replication/change-tracking for the object in Salesforce if your edition supports it.","Implement your own delta logic by filtering on LastModifiedDate with the date-range filter instead."],"exampleFix":"// before\nconn.setRecordsFilter(SalesforceConnectionUtils.RECORDS_FILTER_UPDATED); // object not replicateable\n// after\nconn.setRecordsFilter(SalesforceConnectionUtils.RECORDS_FILTER_DATE_RANGE); // use date range instead","handlingStrategy":"validation","validationCode":"DescribeSObjectResult d = conn.getBinding().describeSObject(conn.getModule());\nboolean replicationPlanned = recordsFilter == SalesforceConnectionUtils.RECORDS_FILTER_UPDATED\n    || recordsFilter == SalesforceConnectionUtils.RECORDS_FILTER_DELETED;\nif (replicationPlanned && (d == null || !d.isReplicateable())) {\n  throw new IllegalArgumentException(conn.getModule() + \" is not replicateable; use a date-range filter\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  conn.query(false);\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"ObjectNotReplicateable\")) {\n    logError(\"getUpdated/getDeleted unsupported for \" + conn.getModule());\n  }\n  throw e;\n}","preventionTips":["Check replicateable flag before selecting updated/deleted filters.","Fall back to LastModifiedDate range filtering for non-replicateable objects.","Enable replication/change tracking where the edition allows."],"tags":["salesforce","replication","unsupported-operation","kettle"],"backgroundTag":"unsupported-operation","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"}