Возникла необходимость сделать серию из трёх зависимых полей, выбор значения в одном из них фильтрует значения во втором, выбор второго фильтрует третий. Азбучный пример из книги (перекрытие метода lookup) отлично подходит для поля StringEdit, но отказывается работать на ReferenceGroup. Для последнего необходимо перекрывать lookupReference.
public void lookup() //для StringEdit
{
Query query = new Query();
QueryBuildDataSource qbds;
QueryBuildRange qbr;
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(MyTable), this);
sysTableLookup.addLookupfield(fieldNum(MyTable, Name));
qbds = query.addDataSource(tableNum(MyTable));
qbds.addRange(fieldNum(MyTable, Country)).value(MyGroup_Country.valueStr());
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
//super();
}
public Common lookupReference()
{
SysReferenceTableLookup sysTableLookup = SysReferenceTableLookup::newParameters(tableNum(CityTable), this);
Query query;
QueryBuildDataSource qbds;
QueryBuildRange qbr;
CityTable selectedRecord;
sysTableLookup.addLookupfield(fieldNum(CityTable, Name));
sysTableLookup.addLookupfield(fieldNum(CityTable, Item));
query= new Query();
qbds = query.addDataSource(tableNum(CityTable));
qbr = qbds.addRange(fieldNum(CityTable, Item));
if (MyGroup_Item.valueStr())
qbr.value(MyGroup_Item.valueStr());
sysTableLookup.parmQuery(query);
selectedRecord = sysTableLookup.performFormLookup();
return selectedRecord;
}
Выбор третьего лукапа должен автоматически заполнять первые два. Поскольку эта логика применяется для модели, а не только для отображения, перекрываем метод не на форме и не на датасорсе, а непосредственно на таблице:
public void modifiedField(FieldId _fieldId)
{
MyTable myTable;
CityTable cityTable;
;
super(_fieldId);
switch (_fieldId)
{
case fieldNum(CustomTable, Field1):
select firstOnly myTable where myTable.RecId == this.Field1;
select firstOnly cityTable where cityTable.Name == myTable.Item;
if (this.Field1) {
this.Field2 = myTable.Item;
this.Field3 = cityTable.Item2;
}
break;
….. }
}
public void lookup() //для StringEdit
{
Query query = new Query();
QueryBuildDataSource qbds;
QueryBuildRange qbr;
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(MyTable), this);
sysTableLookup.addLookupfield(fieldNum(MyTable, Name));
qbds = query.addDataSource(tableNum(MyTable));
qbds.addRange(fieldNum(MyTable, Country)).value(MyGroup_Country.valueStr());
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
//super();
}
public Common lookupReference()
{
SysReferenceTableLookup sysTableLookup = SysReferenceTableLookup::newParameters(tableNum(CityTable), this);
Query query;
QueryBuildDataSource qbds;
QueryBuildRange qbr;
CityTable selectedRecord;
sysTableLookup.addLookupfield(fieldNum(CityTable, Name));
sysTableLookup.addLookupfield(fieldNum(CityTable, Item));
query= new Query();
qbds = query.addDataSource(tableNum(CityTable));
qbr = qbds.addRange(fieldNum(CityTable, Item));
if (MyGroup_Item.valueStr())
qbr.value(MyGroup_Item.valueStr());
sysTableLookup.parmQuery(query);
selectedRecord = sysTableLookup.performFormLookup();
return selectedRecord;
}
Выбор третьего лукапа должен автоматически заполнять первые два. Поскольку эта логика применяется для модели, а не только для отображения, перекрываем метод не на форме и не на датасорсе, а непосредственно на таблице:
public void modifiedField(FieldId _fieldId)
{
MyTable myTable;
CityTable cityTable;
;
super(_fieldId);
switch (_fieldId)
{
case fieldNum(CustomTable, Field1):
select firstOnly myTable where myTable.RecId == this.Field1;
select firstOnly cityTable where cityTable.Name == myTable.Item;
if (this.Field1) {
this.Field2 = myTable.Item;
this.Field3 = cityTable.Item2;
}
break;
….. }
}
Комментариев нет:
Отправить комментарий