У вас есть разные возможности сделать это. Одна из возможностей — сделать это на стороне клиента; это решение, которое я опишу здесь:
Создайте таблицу, содержащую эти строки:
- ID: длинный столбец
- Имя: Строковый столбец
- Фамилия: Строковый столбец
- Администратор: логический столбец (не отображается)
- Модератор: логический столбец (не отображается)
- Редактор: логический столбец (не отображается)
- Оператор: логический столбец (не отображается)
- Роли: Столбец String, Игнорируется из данных таблицы (в formData или в TablePageData)
В этом примере таблица находится в TableField, но она работает точно так же и для TablePage.
@Order(10.0)
@FormData(sdkCommand = FormData.SdkCommand.USE, value = AbstractTableFieldBeanData.class, defaultSubtypeSdkCommand = FormData.DefaultSubtypeSdkCommand.CREATE)
public class PersonsTableField extends AbstractTableField<PersonsTableField.Table> {
@Override
protected int getConfiguredGridH() {
return 5;
}
@Override
protected int getConfiguredGridW() {
return 2;
}
@Override
protected String getConfiguredLabel() {
return TEXTS.get("Persons");
}
@Order(10.0)
public class Table extends AbstractExtensibleTable {
public NameColumn getNameColumn() {
return getColumnSet().getColumnByClass(NameColumn.class);
}
public SurnameColumn getSurnameColumn() {
return getColumnSet().getColumnByClass(SurnameColumn.class);
}
public ModeratorColumn getModeratorColumn() {
return getColumnSet().getColumnByClass(ModeratorColumn.class);
}
public EditorColumn getEditorColumn() {
return getColumnSet().getColumnByClass(EditorColumn.class);
}
public OperatorColumn getOperatorColumn() {
return getColumnSet().getColumnByClass(OperatorColumn.class);
}
public RolesColumn getRolesColumn() {
return getColumnSet().getColumnByClass(RolesColumn.class);
}
public AdministratorColumn getAdministratorColumn() {
return getColumnSet().getColumnByClass(AdministratorColumn.class);
}
public IdColumn getIdColumn() {
return getColumnSet().getColumnByClass(IdColumn.class);
}
@Order(10.0)
public class IdColumn extends AbstractLongColumn {
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("id");
}
}
@Order(20.0)
public class NameColumn extends AbstractStringColumn {
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("Name");
}
}
@Order(30.0)
public class SurnameColumn extends AbstractStringColumn {
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("Surname");
}
}
@Order(40.0)
public class AdministratorColumn extends AbstractBooleanColumn {
@Override
protected boolean getConfiguredDisplayable() {
return false;
}
}
@Order(50.0)
public class ModeratorColumn extends AbstractBooleanColumn {
@Override
protected boolean getConfiguredDisplayable() {
return false;
}
}
@Order(60.0)
public class EditorColumn extends AbstractBooleanColumn {
@Override
protected boolean getConfiguredDisplayable() {
return false;
}
}
@Order(70.0)
public class OperatorColumn extends AbstractBooleanColumn {
@Override
protected boolean getConfiguredDisplayable() {
return false;
}
}
@Order(80.0)
@ColumnData(SdkColumnCommand.IGNORE)
public class RolesColumn extends AbstractStringColumn {
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("Roles");
}
@Override
protected void execDecorateCell(Cell cell, ITableRow row) throws ProcessingException {
cell.setText(StringUtility.join(", ",
BooleanUtility.nvl(getAdministratorColumn().getValue(row)) ? TEXTS.get("Administrator") : null,
BooleanUtility.nvl(getModeratorColumn().getValue(row)) ? TEXTS.get("Moderator") : null,
BooleanUtility.nvl(getEditorColumn().getValue(row)) ? TEXTS.get("Editor") : null,
BooleanUtility.nvl(getOperatorColumn().getValue(row)) ? TEXTS.get("Operator") : null
));
}
}
}
}
Обратите внимание на реализацию execDecorateCell
в файле RolesColumn
. Текст вычисляется в зависимости от значений, содержащихся в невидимых столбцах. Обратите также внимание на аннотацию ColumnData
в верхней части этого столбца.
4 невидимых столбца имеют свойство Displayable
, установленное на false
.
На сервере, если вы хотите разместить какие-то данные, вы можете сделать это так:
PersonsTable tableData = formData.getPersonsTable();
PersonsTableRowData rowData = tableData.addRow();
rowData.setId(42L);
rowData.setName("John");
rowData.setSurname("Johnny");
rowData.setAdministrator(Boolean.TRUE);
rowData.setModerator(Boolean.TRUE);
rowData.setEditor(Boolean.FALSE);
rowData.setOperator(Boolean.FALSE);
Обратите внимание, что нет rowData.setRoles(String)
или rowData.getRoles()
из-за @ColumnData(SdkColumnCommand.IGNORE)
в клиенте.
Конечно, я думаю, что вы хотите использовать оператор SQL, чтобы сделать это. Вы закончите что-то вроде этого:
SQL.selectInto("SELECT " +
" id, " +
" name, " +
" surname, " +
" administrator, " +
" moderator, " +
" editor, " +
" operator " +
" FROM persons " +
" INTO " +
" :{personsTable.id}, " +
" :{personsTable.name}, " +
" :{personsTable.surname}, " +
" :{personsTable.administrator}, " +
" :{personsTable.moderator}, " +
" :{personsTable.editor}, " +
" :{personsTable.operator}",
formData);
Вот мой результат:
person
Jmini
schedule
02.04.2015