Как работает DataGrid

Добрый день!

Подскажите, пожалуйста, логику работы DataGrid, совсем запутался.

Что я делаю:
- Есть SELECT запрос,
- есть DataSet к этому запросу,
- есть форма, на ней лежит управление и DataGrid с прописанным DatasetLink,
- есть не визуальный компонент DatasetLink (приписан соответственно),
- есть DataGridView, приписана к DataGrid,
- 2 столбца видимы.

Работает так - вводится в текстовое поле фильтр (в SELECT подставляется), нажимается кнопка и должны появиться записи в гриде, в соответствии с селектом. А ничего нет.

Я чувствую что я не делаю какую-то принципиальную вещь.

Спасибо заранее!

Нравится

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

Доброго времени суток, Алексей.
Тут: "Работает так - вводится в текстовое поле фильтр (в SELECT подставляется)" - подробнее пожалуйста. Какое поле, куда и как подставляется SELECT? Как он связан с DataGrid и DatasetLink.
В прочем, задача тоже пока не ясна.

Задача - найти в таблице tblContacts дубли фамилий, посчитать их количество, отобразить список найденных контактов в гриде.

У SELECT 2 поля - ID и Name FROM tbl_Contact WHERE фильтр типа LIKE по параметру, который включается программно.

При нажатии на, допустим, кнопку:

 if (!Assigned(ds)) {
   var ds = Services.GetNewItemByUSI('ds_findDoubleFIO');
   }
 
   var str = 'Яковлева Яна'; // Здесь данные из текстового поля
   ApplyDatasetFilter(ds, 'FIO', str, true); 
 
   ds.Close();
   ds.Open();
 
   ShowInformationDialog(ds.RecordsCount;); // для проверки работоспособности
 
   ShowEditWindowEx('wnd_findDoubleFIO'); 
  }

Количество записей показывает, т.е. датасет заполняется запросом.

Соответственно окно wnd_findDoubleFIO содержит небольшую инфу и грид, куда и надо вывести список записей датасета ds.

А как что связано у меня описано в первом сообщении.

Подскажите, что не так, пожалуйста.

Добрый день. В коде выше нет связи между ShowEditWindowEx('wnd_findDoubleFIO'); и отфильтрованым датасетом ds.
Попробуйте сначала сделать .Prepare() кокна.
Затем на его датасет наложить фильтр, или передать массивом ID записей, котороые оно должно отобразить.

В текущей реализации, окно wnd_findDoubleFIO открывается с пустым датасетом.

Я так понял - присвоение датасета гриду не означает что грид заполняется?

Если это так, то подскажите, пожалуйста, кодом - что надо дописать.

Спасибо!

Вы можете сразу с датасетом окна работать. не создавая датасет в конфигурации.

Пример из конфигурации:

	var Window = GetSingleItemByCode('wnd_SearchForSolution');
	Window.Prepare();
 
//	обратитесь к датасету окна:
	var ds = Window.ComponentsByName('dlData').Dataset
 
   var str = 'Яковлева Яна'; // Здесь данные из текстового поля
   ApplyDatasetFilter(ds, 'FIO', str, true); 
   RefreshDataset(ds);
 
   if(ds.RecordsCount > 0) {
	Window.Show();      
   }

То что надо! Спасибо!

Появилась новая проблема, мне нужно отображать в окне tbl_Contact.Name и ответственного за него, но в таблице tbl_Contact есть только tbl_Contact.OwnerID. Как мне в одном запросе и отобразить tbl_Contact.Name и найти Name по tbl_Contact.OwnerID ?

Или можно только программно сравнивать ID и подставлять в строчку уже NAME?

Заранее спасибо!

"Соляник Алексей" написал:Как мне в одном запросе и отобразить tbl_Contact.Name и найти Name по tbl_Contact.OwnerID ?

Если я правильно поняла проблему, то нужно отобразить ответственного по контакту?
В запросе sq_ContactЮ для поля ответсвенного есть 2 колонки: OwnerID (про которую Вы говорите, из таблицы tbl_Contact.OwnerID) и OwnerName (из таблицы tbl_Owner.Name, которая приджойнена к основной таблице: Left join tbl_Contact as tbl_Owner). В датасете для поля-справочника источник данных указан как ds_Owner.
Если же Вы и так работаете с датасетом Контакта, а значение нужно вывести в текстовое поле, то можно попробовать написать так:
var OwnerName = Dataset.DisplayValues('OwnerID')
или
var OwnerName = Dataset.DataFields('OwnerID').DisplayValue, что, в принципе, одно и то же...
Или Вы имели что-то другое ввиду, задавая этот вопрос?

Или Вы имели что-то другое ввиду, задавая этот вопрос?

Да, к сожалению другое.

Есть одна таблица tbl_Contact, в ней есть поля ID, Name, OwnerID и другие. Поле OwnerID - это ссылка на tbl_Contact.ID.

Т.е. по-русски говоря все контакты в одной таблице, у каждого есть ответственный (owner), который находится также в этой же таблице как простой контакт.

Алексей, в запросе sq_Contact присутствует колонка OwnerName, которая отображает Name ответственного у контакта.
Если Вам нужно строковое поле, которое будет отображать имя ответственного у контакта, добавьте в датасет поле со ссылкой на данную колонку.

Спасибо!!!

Сделал по аналогии с sq_Contact в своем запросе left join и все стало ок! Спасибо еще раз!

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