Проблема с фильтром

Добрый день.
Создал новый справочник ds_jobs(id, name, tasktypeid)
В нем есть поле "Тип задачи", тип задачи берется из справочника "Типы задач".
Добавил его на окно задачи.
Для того, чтобы справочник ds_jobs зависел от "Типы задач" необходимо добавить фильтр.
Добавляю:

function edtJobOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
     var Dataset = dlData.Dataset;
     var TypeID = Dataset.Values('TypeID');
     var IsEnabled = (TypeID != null);
     var LookupDataset = LookupDataControl.DataField.LookupDataset;
     ApplyDatasetFilter(LookupDataset, 'TaskTypeID', TypeID, IsEnabled);
}

В ответ получаю "Исключение брошено и не поймано", в чем может быть проблема? Может в фильтре не то применяю?

Нравится

12 комментариев

Проверьте существует ли в sq_jobs параметр TaskTypeID и одноименный фильтр

Большое спасибо, теперь я понял как работать с фильтрами =)

Хотелось бы уточнить как проверить наличие в справочнике.
Необходимо, чтобы для типов задач, которые есть в справочнике ds_jobs, он был isvisible = true.
Для остальных isvisible = false.

function edtTypeOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
         var Dataset = dlData.Dataset;
	 var JobsDataset = Services.GetSingleItemByUSI('ds_Jobs');
	 JobsDataset.Open();
	 JobsDataset.Edit();
	 if(Dataset.Values('TypeID') == JobsDataset.Values('TaskTypeID'))
	 {
	        Dataset.DataFields.ItemsByName('JobID').IsVisible = true;
	 }
	 else
	 {
	        Dataset.DataFields.ItemsByName('JobID').IsVisible = false;
	 }  
}

Что то похожее может быть. Но это не катит

Олег, в поле типа справочник может быть только одно значение, которое не содержится в справочнике - NULL. Иное значение Вы не сможете выбрать, разве что присвоить запросом вручную, минуя Terrasoft.

Свойство IsVisble есть у поля в карточке, его нет в датасете. Поэтому скрипт будет выглядеть примерно так:

if(!Dataset.Values('TypeID'))
          {
                 edtJob.IsVisible = true;
          }
          else
          {
                 edtJob.IsVisible = false;
          }  

Да, спасибо. Я так и сделал.

var Dataset = BaseDBEdit.Dataset;
var JobsDataset = Services.GetSingleItemByUSI('ds_Jobs');
JobsDataset.Open();
JobsDataset.Edit();
if(Dataset.Values('TypeID') == JobsDataset.Values('TaskTypeID'))
	{
           edtJob.IsVisible = true;
	}
	else
	{
	       edtJob.IsVisible = false;
	}

А можно ли сделать как нибудь так? Сделать проверку на наличие ID типа задачи в датасете ds_Jobs.

if(Dataset.Values('TypeID') есть в "ds_jobs")
	{
           edtJob.IsVisible = true;
	}
	else
	{
	       edtJob.IsVisible = false;
	}

Здравствуйте Олег
Вы можете пройти циклом по всем записям по определенному полю ds_Jobs. И установить переменную есть ли определенная запись в датасете или нет.
Пример, того как пройтись циклом по датасету

	var Dataset = Services.GetNewItemByUSI('ds_jobs');
	Dataset.Open();
	while(!Dataset.IsEOF) {
	if ( Dataset.Values('TypeID') == TypeID ) 
Isfound = true;
	Dataset.GotoNext();
	}
    var Dataset = BaseDBEdit.Dataset;
    var TypeID = Dataset.Values('TypeID');
    var JobsDataset = Services.GetNewItemByUSI('ds_jobs');
    JobsDataset.Open();
    while(!JobsDataset.IsEOF)
    {
    	if(TypeID == JobsDataset.Values('TaskTypeID'))
		{
		   Isfound = true;
        	   edtJob.IsVisible = true;
        	  JobsDataset.GotoNext();
		}
		else
		{
		       edtJob.IsVisible = false;
		}
	}

Сделал так. но программа зависает при открытии окна задачи

var Dataset = BaseDBEdit.Dataset;
    var TypeID = Dataset.Values('TypeID');
    var JobsDataset = Services.GetNewItemByUSI('ds_jobs');
    JobsDataset.Open();
    while(!JobsDataset.IsEOF)
    {
        if(TypeID == JobsDataset.Values('TaskTypeID'))
                {
                   Isfound = true;
                   edtJob.IsVisible = true;
                  JobsDataset.GotoNext();
                }
                else
                {
                       edtJob.IsVisible = false;
                      JobsDataset.GotoNext();
                }
        }

Олег, вы объявили Isfound ?
Я предлагаю сначала пройтись по циклу, а потом уже присваивать edtJob свойство видимости т.е
edtJob.IsVisible = Isfound присваивать после того как мы пройдемся по датасету:
Примерный вид :

     var Dataset = BaseDBEdit.Dataset;
    var TypeID = Dataset.Values('TypeID');
    var JobsDataset = Services.GetNewItemByUSI('ds_jobs');
    JobsDataset.Open();
    var Isfound = false; 
    while(!JobsDataset.IsEOF)
    {
        if(TypeID == JobsDataset.Values('TaskTypeID'))               
                   Isfound = true;
                  JobsDataset.GotoNext();                                                                                     
        }
 
  edtJob.IsVisible = Isfound;

Спасибо, это помогло.

Показать все комментарии