return null != #ROW().store ? #MSG(customer, store) + ":" + #ROW().store.address.city.city + " - " + #ROW().store.address.city.country.country + " (" + #ROW().store.staff.lastName + ")" : "";                                           return null != #ROW().address ? #ROW().address.address + " - " + #ROW().address.city.city + " - " + #ROW().address.city.country.country : "";                                return !row.isActive() ? #COLOR(SWT.COLOR_YELLOW) : null;          return !row.isActive() ? #COLOR(SWT.COLOR_YELLOW) : null;                                          \\ **renders the following layout:**\\ {{tutorial:grid_controller.png?600 | Grid controller}}
Explanations:\\ * Line 3 - rowHeaderVisible="true": a row header continaing line number is visible on the left of the grid. * Line 10 - : Column can be grouped and a toggle gives a way to expand or to collapse group of columns. * Line 11 - : When collapses, this column is displayed. * Lines 12 and 15: Return computed value for store and address. * Lines 19 and 22: Background is **Yellow** when customer is not valid. \\ return null != #ROW().address ? #ROW().address.address + " - " + #ROW().address.city.city + " - " + #ROW().address.city.country.country : ""; is equivalent to if (null != customer.getAddress()) return customer.getAddress().getAddress() + " - " + customer.getAddress().getCity().getCity() + " - " + customer.getAddress().getCity().getCountry().getCountry(); else return ""; So, this grid controller works with query containing all needed jointures. E.g. use example query described in page [[complete_query#changed_query|complete query]].