Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

SemData у MapObject

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Ср 27 Ноя 2013 14:38    Заголовок сообщения: SemData у MapObject Ответить с цитатой

Здравствуйте!
Я начинаю свое знакомство с программированием в ИнГео, поэтому мой вопрос может показаться банальным.

Суть в следующем.
Например, у метода SetValue(...) объекта типа IIngeoSemData, который хранит семантические данные объекта карты, в качестве первого параметра указывается имя таблицы (Name). Но это имя таблицы не уникально. Можно создать несколько таблиц с одним именем. Каким образом мне различить таблицы с одинаковыми именами при записи данных? Перегрузки SetValue(...) для SemDbTableName ведь нет.

А вот имя столбца этому методу необходимо уникальное, соответствующее таблице БД. Но почему же имя таблицы требуется не из БДSmile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Чт 28 Ноя 2013 18:02    Заголовок сообщения: Ответить с цитатой

В качестве имени таблицы можно указывать и условное имя таблицы и физическое имя таблицы в БД.

Кроме того, таблица с таким именем ищется только в рамках слоя, к которому относится объект. Как правило, в пределах слоя имена таблиц уникальные.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Пн 02 Дек 2013 09:27    Заголовок сообщения: Ответить с цитатой

Спасибо! Но условное имя одной таблицы может совпадать с физическим именем другой таблицы. Как в этом случае поведет себя ИнГео?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Пн 02 Дек 2013 11:22    Заголовок сообщения: Ответить с цитатой

Николаускас писал(а):
Спасибо! Но условное имя одной таблицы может совпадать с физическим именем другой таблицы. Как в этом случае поведет себя ИнГео?

Выполняется поиск первой попавшейся таблицы слоя, у корой совпадает условное или физическое имя.

Еще раз повторю, что поиск выполняется только в рамках слоя (не БД).

Проблема может возникнуть, если в одном слое есть несколько таблиц с одинаковыми условными именами, либо условное имя одной из таблиц совпадает с физическим именем другой таблицы того же слоя. В этом случае будет использована первая попавшаяся таблица.

P.S. Поиск по имени не различает большие и маленькие буквы (регистрово-независим, case insensitive).

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Вт 03 Дек 2013 14:09    Заголовок сообщения: Ответить с цитатой

Спасибо! Скажите, а, например, с GetValue и GetRecCount та же история?

UPD. Выяснил, что GetRecCount работает только с условным именем таблицы. Да и SetValue. Они требуют именно условное имя. Если подставляю физическое, то при попытке записи выскакивает исключение с сообщением о том, что таковой таблицы не найдено.
Что противоречит сказанному Вами. Версия 4.4.0.177.
Должно же быть какое-то средство абсолютно однозначно задать таблицу и поле для записи. Может быть какие-то альтернативы есть методам SetValue и GetRecCount?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Чт 05 Дек 2013 13:58    Заголовок сообщения: Ответить с цитатой

Николаускас писал(а):
Спасибо! Скажите, а, например, с GetValue и GetRecCount та же история?

UPD. Выяснил, что GetRecCount работает только с условным именем таблицы. Да и SetValue. Они требуют именно условное имя. Если подставляю физическое, то при попытке записи выскакивает исключение с сообщением о том, что таковой таблицы не найдено.
Что противоречит сказанному Вами. Версия 4.4.0.177.
Должно же быть какое-то средство абсолютно однозначно задать таблицу и поле для записи. Может быть какие-то альтернативы есть методам SetValue и GetRecCount?


Да. В версии 4.4 поиск выполнялся только по условному имени.

В 4.6 (релиз-кандидат) поиск выполняется, как я написал выше.

А что вам мешает сделать условные имена таблиц уникальными внутри слоя? И пользователям так удобнее.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Чт 05 Дек 2013 14:10    Заголовок сообщения: Ответить с цитатой

А как я могу это сделать? Таблицы же создает пользователь вручную в GUI ИнГео. Он там может их хоть миллион одноименных насоздавать.
Что Вы имеете в виду?

У меня еще один вопрос. Метод SetValue в качестве второго параметра (имя поля) в v4.4 позволяет использовать, в отличие от имени таблицы (как мы уже выяснили), и условное имя поля и физическое. При этом сначала он (из моих наблюдений и экспериментов) ищет совпадения в физических именах, а уже потом - в условных. В связи с этим возникает вопрос. В версии 4.6 (RC) имя таблицы ищется тоже сначала в физических именах, а затем в условных или по какой-то другой схеме? И изменилась ли схема поиска имени поля в версии 4.6?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Пт 06 Дек 2013 16:45    Заголовок сообщения: Ответить с цитатой

Николаускас писал(а):
А как я могу это сделать? Таблицы же создает пользователь вручную в GUI ИнГео. Он там может их хоть миллион одноименных насоздавать.
Что Вы имеете в виду?

Обычно структуру карты создает не обычный пользователь, а продвинутый, или, даже, администратор или программист. Обычным пользователям, обычно, даже прав таких не дают.

Николаускас писал(а):
У меня еще один вопрос. Метод SetValue в качестве второго параметра (имя поля) в v4.4 позволяет использовать, в отличие от имени таблицы (как мы уже выяснили), и условное имя поля и физическое. При этом сначала он (из моих наблюдений и экспериментов) ищет совпадения в физических именах, а уже потом - в условных. В связи с этим возникает вопрос. В версии 4.6 (RC) имя таблицы ищется тоже сначала в физических именах, а затем в условных или по какой-то другой схеме? И изменилась ли схема поиска имени поля в версии 4.6?

Думаю, в 4.6 сделаем такой алгоритм (одинаковый и для полей и для таблиц):
Сначала выполняется поиск по физическому имени (они всегда уникальны).
Затем, если не найдено, по логическому имени (заголовку). Если найдено более одного логического имени, то генерировать ошибку о неоднозначности имени.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Пт 06 Дек 2013 17:56    Заголовок сообщения: Ответить с цитатой

Спасибо. А относительно GetRecCount все то же самое?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Пн 09 Дек 2013 10:16    Заголовок сообщения: Ответить с цитатой

Николаускас писал(а):
Спасибо. А относительно GetRecCount все то же самое?

Да

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Пн 09 Дек 2013 10:49    Заголовок сообщения: Ответить с цитатой

Благодарю Вас за ответы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Пн 09 Дек 2013 12:17    Заголовок сообщения: Ответить с цитатой

Михаил, не хочу показаться назойливым, но у меня снова вопрос, и он имеет отношение к этой теме.
Я заметил, что при удалении таблицы из слоя в GUI ИнГео сведения о ней в SemTables исчезают не сразу. Из СУБД таблица сразу исчезает, а вот если программно "спросить" layerView.Layer.SemTables, то там она еще "висит" некоторое время. Причем время это не одинаково каждый раз.
С чем это может быть связано? Конечно не исключаю, что такое поведение может быть результатом какой-нибудь моей ошибки, но я все проверилSmile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 10 Дек 2013 09:55    Заголовок сообщения: Ответить с цитатой

Николаускас писал(а):
Михаил, не хочу показаться назойливым, но у меня снова вопрос, и он имеет отношение к этой теме.
Я заметил, что при удалении таблицы из слоя в GUI ИнГео сведения о ней в SemTables исчезают не сразу. Из СУБД таблица сразу исчезает, а вот если программно "спросить" layerView.Layer.SemTables, то там она еще "висит" некоторое время. Причем время это не одинаково каждый раз.
С чем это может быть связано? Конечно не исключаю, что такое поведение может быть результатом какой-нибудь моей ошибки, но я все проверилSmile

Вы правы - есть такой нюанс. Список сем.таблиц слоя не отражает удаления таблиц. Однако если освободить COM-экземпляр Layer.SemTables и взять его повторно, то новый список будет актуальным (без удаленной таблицы).

В 4.6 это исправлено.

P.S. Какая же тут назойливость? Для того форум и нужен, чтобы такие вопросы обсуждать. Так что пишите, спрашивайте.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Вт 10 Дек 2013 10:34    Заголовок сообщения: Ответить с цитатой

Спасибо. Я не совсем понял насчет "освободить COM-экземпляр Layer.SemTables и взять его повторно". Никаких Dispose() и т.п. не нашел.
Я ищу слой по ID : IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id);
tempItem - это объект моего класса, идентифицирующий слой (одно из полей - ID).
То есть у меня имеется ComboBox, элементы которого - объекты моего типа. При выборе одного из элементов я проверяю, имеет ли выбранный слой таблицы с одинаковыми условными именами:

Код:

...
                ComboBoxUniqueIngeoItem tempItem = (ComboBoxUniqueIngeoItem)comboBox2.SelectedItem;

                IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id);
               
                bool isUnique = true;
                for (int i = 0; i < layerView.Layer.SemTables.Count; i++)
                {
                    for (int j = 0; j < layerView.Layer.SemTables.Count; j++)
                        if (layerView.Layer.SemTables[i].Name == layerView.Layer.SemTables[j].Name && i != j)
                        {
                            //  Одинаковые таблицы в слое
                            isUnique = false;
                            break;
                        }
                    if (!isUnique) break;
                }

if (!isUnique) // Сообщение о неуникальности имен таблиц
...


То есть в этом коде каждый раз заново получаю слой по ID. Но SemTables все равно хранит информацию об удаленной таблице.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 10 Дек 2013 11:15    Заголовок сообщения: Ответить с цитатой

Николаускас писал(а):
Спасибо. Я не совсем понял насчет "освободить COM-экземпляр Layer.SemTables и взять его повторно". Никаких Dispose() и т.п. не нашел.
Я ищу слой по ID : IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id);
tempItem - это объект моего класса, идентифицирующий слой (одно из полей - ID).
То есть у меня имеется ComboBox, элементы которого - объекты моего типа. При выборе одного из элементов я проверяю, имеет ли выбранный слой таблицы с одинаковыми условными именами:

Код:

...
                ComboBoxUniqueIngeoItem tempItem = (ComboBoxUniqueIngeoItem)comboBox2.SelectedItem;

                IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id);
               
                bool isUnique = true;
                for (int i = 0; i < layerView.Layer.SemTables.Count; i++)
                {
                    for (int j = 0; j < layerView.Layer.SemTables.Count; j++)
                        if (layerView.Layer.SemTables[i].Name == layerView.Layer.SemTables[j].Name && i != j)
                        {
                            //  Одинаковые таблицы в слое
                            isUnique = false;
                            break;
                        }
                    if (!isUnique) break;
                }

if (!isUnique) // Сообщение о неуникальности имен таблиц
...


То есть в этом коде каждый раз заново получаю слой по ID. Но SemTables все равно хранит информацию об удаленной таблице.

C#? COM-интероп невидимо и нежно держит ссылки на COM-объекты.
Попробуйте так:
Код:
...
IIngeoSemTables layerTables = layerView.Layer.SemTables;
try {
    bool isUnique = true;
    for (int i = 0; i < layerTables.Count; i++) {
        for (int j = 0; j < layerTables.Count; j++) {
            if (layerTables[i].Name == layerTables[j].Name && i != j) {
                //  Одинаковые таблицы в слое
                isUnique = false;
                break;
            }
        }
        if (!isUnique) break;
    }
}
finally {
    Marshal.ReleaseComObject(layerTables);
}
...

Должно помочь.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Вт 10 Дек 2013 14:10    Заголовок сообщения: Ответить с цитатой

Спасибо! РаботаетSmile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Николаускас



Зарегистрирован: 27.11.2013
Сообщения: 52

СообщениеДобавлено: Вт 10 Дек 2013 17:36    Заголовок сообщения: Ответить с цитатой

Кстати, возвращаясь к той теме, я думаю, было бы лучше, если бы одним из параметров SetValue и подобных методов был флаг, определяющий, как будет выполняться поиск: по физическим именам; по условным именам; и по физическим, и по условным именам.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB