new to apex and visualforce. I am trying to create a visualforce page that displays selected products and their locations for an order. Currently I am able to display the products selected for the order, however I can not figure out how to filter my query down to display only the product locations specific to the current order. I added the Shipment__c query to help look for products that are in shipments however I am getting the following error:

Error: Compile Error: Invalid bind expression type of Shipment__c for Id field of SObject Product2 at line 8 column 17

Any help would be appreciated.

My class is as follows:

public with sharing class ProductMovements {

Shipment__c[] sp = [Select (Select Project_Task__r.GMBLASERP__Product__r.Id From Shipment_Lines__r) From Shipment__c ];

Product2[] pp = [SELECT Id FROM Product2 WHERE Id IN :sp];

     public AggregateResult[] gim {
        get {
            return [SELECT GMBLASERP__Product__r.name name, GMBLASERP__Location__r.name location, SUM(GMBLASERP__Quantity__c) sum
                                                    FROM GMBLASERP__Inventory_Movement_Cube__c
                                                    WHERE GMBLASERP__Product__c IN :pp
                                                    GROUP BY GMBLASERP__Product__r.name, GMBLASERP__Location__r.name];
  • It's only dynamic soql if you build out query strings and use Database.query. You do none of that here, using only static queries. As such, I have removed the [dynamic-soql] tag.
    – Adrian Larson
    Jul 11, 2018 at 22:04

1 Answer 1


You will need to unpack the Product2Ids from the first SOQL query to then use them in a binding expression.


Set<Id> product2Ids = new Set<Id>();
for(Shipment__c sp : [Select (Select Project_Task__r.GMBLASERP__Product__r.Id From Shipment_Lines__r) From Shipment__c ]) {
Product2[] pp = [SELECT Id FROM Product2 WHERE Id IN :product2Ids];

That said, you could probably completely skip the Shipment__c records and go straight to the Shipment_Lines__c records with:

Select Project_Task__r.GMBLASERP__Product__r.Id From Shipment_Lines__c

If you can get it all the way down to whatever GMBLASERP__Product__c is it could make the query much simpler. You will likely need to add a where clause, but it should be much more efficient.

You must log in to answer this question.

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