1

Some questions on displaying on what I can show in querying the Process.

1 - I am running into limitations on pulling in more fields in my query.

public List<ProcessInstanceStep> getSteps() {
      return [select StepStatus,  ProcessInstance.targetObject.name from ProcessInstanceStep where ProcessInstance.TargetObjectId = :T.id ];
    }

The above successfully returns the name of the object under approval, but that isn't that helpful, since it's an auto number.

Trying to pull any other field provides errors. Example:

return [select StepStatus,  ProcessInstance.targetObject.Field__C from ProcessInstanceStep where ProcessInstance.TargetObjectId = :T.id ];  

Brings error:

No such column 'Field__c' on entity 'Name'. If you are attempting to use a custom field, be sure to append the '__c' after the custom field name. Please reference your WSDL or the describe call for the appropriate names.

Why is it referencing entity Name ? Have I reached the limit in relation query? thanks

  1. I am having a error trying to query on a field on the initial object

SObject row was retrieved via SOQL without querying the requested field: Custom_Object__c.Look_up__c

I want to query on an ID in a lookup field on the object. The below does not allow me to query on a custom field on T but I think illustrates what I want to do:

    Custom_Object__c T;
    public ID TID {get; set; }
    public TravelerApprovalExtension(ApexPages.StandardController controller) {

         T = (Custom_object__C) controller.getRecord(); 
         TID = t.Look_up__c;
    }

So I can use TID here:

public List<Look_up__c> getLups() {
      return [select name, ID, start_date__c, end_date__c , location__C  from Look_up__c where ID = :TID ];
    }

How can I efficiently get a field as a variable on the record to use as a query parameter? thanks! Also, more generally - on a getRecord(), does one return the ID, or the (whole) record? Can't quite understand why I can't use this in my instance if I actually got the record and not just the ID-

T = (Custom_object__C) controller.getRecord(); 
         TID = t.Look_up__c;

1 Answer 1

2

You have three options here:

  1. Query the target object record directly (if you have only one).
  2. Create a Map<Id, SObject> to hold your target object records.
  3. Use a TYPEOF query (must be enabled through support).

Take a look at Understanding Polymorphic Keys and Relationships for a little more information on #3.


Single Record

Since you only appear to need one record, you can actually just query for it. For instance if you were looking for approvals on a specific Case record. If you are writing an extension you can access the StandardController in your constructor:

public MyExtension(ApexPages.StandardController controller)
{
    List<String> fieldsToQuery = new List<String> { 'Field__c' };
    if (!Test.isRunningTest()) controller.addFields(fieldsToQuery);
    // above only needed for fields not referenced on the page
    Case record = (Case)controller.getRecord();
}

If for some other reason you know there will be a record corresponding to the Id, your query would simply look like:

Case record = [SELECT Field__c FROM Case WHERE Id = :targetId];

Otherwise, you can query for a list and pull in the record if it's not empty:

Case record;
List<Case> candidates = [SELECT Field__c FROM Case WHERE Id = :targetId LIMIT 1];
if (!candidates.isEmpty()) record = candidates[0];

Maps

If you have multiple target object records, you can use a map.

Map<Id, Case> targetRecords = new Map<Id, Case>([
    SELECT Field FROM Case WHERE Id IN :targetIds
]);

TYPEOF

Polymorphic query support must be enabled to use TYPEOF queries (reference), but they are pretty useful for you in this instance once they are enabled.

List<ProcessInstanceStep> steps = [
    SELECT StepStatus,  
        TYPEOF ProcessInstance.TargetObjectId
            WHEN Case THEN Field__c
        END
    FROM ProcessInstanceStep
    WHERE ProcessInstance.TargetObject.Type = 'Case'
];
6
  • I only need a single record - the parent of object I am using in the standard controller in the VF page, the parent of what is returned in my extension instance when I do -- T = (Custom_object__C) controller.getRecord();
    – jaw999
    Mar 7, 2016 at 14:31
  • @jaw999 So just make T a property (add { get; private set; }) and then reference that instead.
    – Adrian Larson
    Mar 7, 2016 at 14:34
  • I need to reference the field on T as the filter in my query and all my methods don't work. where ID =: t.lookup_field__c does nothing. Code compiles but page tells me i never returned that field. SO i guess getRecord doesn't get the record?
    – jaw999
    Mar 7, 2016 at 14:47
  • @jaw999 Did you call addFields with Lookup_Field__c?
    – Adrian Larson
    Mar 7, 2016 at 14:48
  • OK, progress. So I have to add fields? It is not intuitive that GetRecord doesn't return the record and its fields. It functions more like getId?
    – jaw999
    Mar 7, 2016 at 14:58

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .