www.map-info.ru :: Просмотр темы - Странная проблема с некоторыми операторами в MapBasic
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
КД



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

СообщениеДобавлено: Пн Окт 20, 2008 6:13 pm    Заголовок сообщения: Странная проблема с некоторыми операторами в MapBasic Добавить ответ со ссылкой на данный текст

Был сделан .tab-файл с записями о точках. Из Access'а они добавляются, изменяется информация о них. Предполагалось также, что их можно будет и удалять. На MapBasic'е составлялись соответствующие конструкции, которые преобразовывались в Access'овские модули. Итак, добавление:

Set miNewApp = CreateObject("MapInfo.Application")

miNewApp.Visible = True

strPath = "C:\Точки"

strAction = "Open Table """ & strPath & """"

miNewApp.RunCommand (strAction)

miNewApp.RunCommand ("Browse * From Точки")

miNewApp.RunCommand ("Insert Into Точки (idsPOINT_LEG_ID, idsDISTRICT_ID, chrPOINT_LEG_NAME, lngLAT_DEG, " & _
"lngLAT_MIN, lngLAT_SEC, sngLAT_DEC, lngLON_DEG, lngLON_MIN, lngLON_SEC, sngLON_DEC) VALUES (" & strValues & ")")

Все хорошо, точка вставляется, но в некоторые поля (секунды и десятичные градусы) передаются дробные числа, а отображается почему-то только целая их часть.

Пришлось добавить сюда оператор, который отвечал за изменение информации:

miNewApp.RunCommand ("Select * From Точки Where idsPOINT_LEG_ID = " & intValue & "")

miNewApp.RunCommand ("Update Selection Set idsDISTRICT_ID = """ & intCodeDistrict & """, " & _
"chrPOINT_LEG_NAME = """ & strPointName & """, lngLAT_DEG = """ & varLatitudeDeg & """, " & _
"lngLAT_MIN = """ & varLatitudeMin & """, lngLAT_SEC = """ & varLatitudeSec & """, " & _
"sngLAT_DEC = """ & varLatitudeDec & """, lngLON_DEG = """ & varLongitudeDeg & """, " & _
"lngLON_MIN = """ & varLongitudeMin & """, lngLON_SEC = """ & varLongitudeSec & """, " & _
"sngLON_DEC = """ & varLongitudeDec & """")

Проблема исчезла, а вопрос остался. Кто-н. в курсе, что это за глюки?


Далее, пытаюсь удалить точку (несколько строк кода не привожу, они как в предыдущем модуле):
Dim intRowID As Integer

miNewApp.RunCommand ("Select * From Точки_сбора Where idsPOINT_LEG_ID = " & varNumber & "")

miNewApp.RunCommand ("intRowID = Selection.RowID")

miNewApp.RunCommand ("Delete From Точки Where Rowid = " & intRowID & "") - эту строку он выполнять не хочет, пишет, что не определена переменная intRowID. А ведь она определена. К тому же в предыдущих примерах тоже использовались переменные и с ними все нормально.
Эту последовательность операторов пытался выполнить из файла .mbx, подставив вместо varNumber конкретное значение. Строка, имеющая idsPOINT_LEG_ID = 500 действительно помечается черным квадратиком, а удаляется почему-то первая!
Кто знает, как же все-таки удалить запись в таблице, если неизвестен ее Rowid?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



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

СообщениеДобавлено: Пн Окт 20, 2008 8:58 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Я прям даже и не знаю с чего тут начинать... Ладно по порядку:
1)
miNewApp.RunCommand ("Insert Into Точки (idsPOINT_LEG_ID, idsDISTRICT_ID, chrPOINT_LEG_NAME, lngLAT_DEG, " & _
"lngLAT_MIN, lngLAT_SEC, sngLAT_DEC, lngLON_DEG, lngLON_MIN, lngLON_SEC, sngLON_DEC) VALUES (" & strValues & ")")

не вижу где и как формируется strValues. Проблема там.
2) Смотрим внимательно на эти строки:
Dim intRowID As Integer
miNewApp.RunCommand ("intRowID = Selection.RowID")
miNewApp.RunCommand ("Delete From Точки Where Rowid = " & intRowID & "")
Переменная intRowID где объявлена? Правильно в Access. А присвоение ей где происходит? Правильно в MapInfo. Не путайте контекст MapInfo с контекстом Access, MapInfo ничего неизвестно про переменные, объявленные в Access.
3) Кто знает, как же все-таки удалить запись в таблице, если неизвестен ее Rowid?
miNewApp.RunCommand ("Select * From Точки_сбора Where idsPOINT_LEG_ID = " & varNumber & " Into DeletePointTable NoSelect")
miNewApp.RunCommand ("Delete From DeletePointTable")
miNewApp.RunCommand ("Close Table DeletePointTable")
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
КД



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

СообщениеДобавлено: Ср Окт 22, 2008 5:35 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

1.
> не вижу где и как формируется strValues. Проблема там.

strValues = """" & intValue & """, """ & intCodeDistrict & """, """ & strPointName & """, " & _
"""" & varLatitudeDeg & """, """ & varLatitudeMin & """, """ & varLatitudeSec & """, " & _
"""" & varLatitudeDec & """, """ & varLongitudeDeg & """, """ & varLongitudeMin & """, " & _
"""" & varLongitudeSec & """, """ & varLongitudeDec & """"

strValues = Replace(strValues, ".", ",") ‘причем эту строку можно и не выполнять, все равно вставятся только целые части дробных чисел.
Проблемы здесь, кажется, нет. В strValues просто собраны все переменные, которые по отдельности участвуют в операторе Update, а там результат вполне адекватный.

2.
> Переменная intRowID где объявлена? Правильно в Access. А присвоение ей где происходит? Правильно в MapInfo. Не путайте контекст MapInfo с контекстом Access, MapInfo ничего неизвестно про переменные, объявленные в Access.
Ну это да, это я прошляпил.

3.
> miNewApp.RunCommand ("Select * From Точки_сбора Where idsPOINT_LEG_ID = " & varNumber & " Into DeletePointTable NoSelect")
miNewApp.RunCommand ("Delete From DeletePointTable")
Да, я бы до этого сам не допер. Я-то просто пытался повторить пример из справки, а там вроде бы не так?

Спасибо большое!

И еще вопрос. Как таблицу закрывать, я знаю. А как сам MapInfo закрыть? Попытка выполнить
miNewApp.RunCommand ("Run Menu Command M_FILE_EXIT") к желаемому результату не привела.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
КД



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

СообщениеДобавлено: Чт Окт 23, 2008 5:09 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Помимо добавления записи о точке в таблицу tab еще нужно добавить графический объект в таблицу MAP.

Declare Sub Main

Sub Main
Dim obj as Object

Include "mapbasic.def"
Open Table "C:\Точки"
Browse * From Точки
Insert Into Точки (idsDISTRICT_ID, chrPOINT_LEG_NAME, lngLAT_DEG, lngLAT_MIN, lngLAT_SEC, sngLAT_DEC, lngLON_DEG, lngLON_MIN, lngLON_SEC, sngLON_DEC) VALUES ("7", "Быковка", "49", "30", "10,6", "49,5029", "43", "20", "13,8", "43,3372")
Update Точки
Set obj = CreatePoint(43.3372, 49.5029,) ‘здесь происходит ошибка!
Commit Table Точки
Close Table Точки

End Sub

Процедура без ошибок откомпилировалась в MapBasic, но при выполнении выдала, что «в этом выражении нельзя использовать неинициализированную переменную object». Я вроде бы просто в который раз пытаюсь повторить пример из справки. Там сказано, что объектные переменные нужно перед использованием инициализировать, но я не нашел как. Обычно для этого хватает присвоения объекта или создания нового, а тут – нет.
Что-то мне не нравится справка по MapBasic...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



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

СообщениеДобавлено: Пн Окт 27, 2008 8:53 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Dim obj as Object
Вот это ты зачем сделал? Убери.
obj это не переменная - это столбец в любой таблице MapInfo, где хранятся графические объекты. Объявив obj переменной, ты только MapInfo запудрил мозги.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
КД



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

СообщениеДобавлено: Вт Окт 28, 2008 11:02 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

>> Dim obj as Object
> Вот это ты зачем сделал? Убери.
> obj это не переменная - это столбец в любой таблице MapInfo, где хранятся графические объекты.
Я извиняюсь, поскольку совсем не программист, кое-как разбираюсь в VB… А тут вообще все не так, да еще и справка оставляет желать лучшего. Ну вот где там про это сказано? Кроме того, в руководстве пользователя MapInfo написано, что графические объекты, выводимые на карте, содержатся в файлах .MAP. К тому же файл .tab был сделан из Access’овской таблы, где, естественно, никаких полей для графических объектов не было. Странно, очень странно. И какое же поле в таблице должно содержать этот графический объект? Сейчас в таблице: номер точки, код района, название, 4 поля для значений широты (градусы, минуты, секунды, десятичные градусы) и 4 для долготы (тоже самое). Я полагал, что графические объекты содержатся в файле .MAP, а связываются с записями в таблице по полю, содержащему уникальный номер (в моем случае это idsPOINT_LEG_ID).
Пробую выполнить такой код:

Declare Sub Main

Sub Main

Include "mapbasic.def"
Open Table "C:\Точки"
Browse * From Точки

Insert Into Точки (idsPOINT_LEG_ID, idsDISTRICT_ID, chrPOINT_LEG_NAME, lngLAT_DEG, lngLAT_MIN, lngLAT_SEC, sngLAT_DEC, lngLON_DEG, lngLON_MIN, lngLON_SEC, sngLON_DEC) VALUES ("500", "7", "Быковка", "48", "50", "50.0", "48.8472", "43", "50", "50.0", "43.8472")

Select * From Точки Where idsPOINT_LEG_ID = 500
Update Selection Set lngLAT_SEC = "50.0", sngLAT_DEC = "48.8472", lngLON_SEC = "50.0", sngLON_DEC = "43.8472"

Insert Into Точки (idsPOINT_LEG_ID)
Values ( CreatePoint (43.8472, 48.8472) ) ‘на этой строке ошибка – пишет, что не удалось преобразовать данные

Commit Table Точки
Close Table Точки

End Sub



А по пп. 1 и 3 из прошлого моего поста что-н.?
> И еще вопрос. Как таблицу закрывать, я знаю. А как сам MapInfo закрыть? Попытка выполнить
miNewApp.RunCommand ("Run Menu Command M_FILE_EXIT") к желаемому результату не привела.
Оказывается, объявленная константа Public Const M_FILE_EXIT = 113 не помогает. Надо передавать непосредственно число:
miNewApp.RunCommand ("Run Menu Command 113")
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



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

СообщениеДобавлено: Ср Окт 29, 2008 3:21 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Делай так:
Insert Into Точки (Obj)
Values (CreatePoint (43.8472, 48.8472) ) ‘на этой строке ошибка – пишет, что не удалось преобразовать данные

> еще вопрос. Как таблицу закрывать, я знаю. А как сам MapInfo закрыть? Попытка выполнить
miNewApp.RunCommand ("Run Menu Command M_FILE_EXIT") к желаемому результату не привела.

Команда
End MapInfo

По пункту 1 - видимо где-то что-то путаешь с разделителем целой и дробной части числа. Т.е. "." с "," или наоборот
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
КД



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

СообщениеДобавлено: Ср Окт 29, 2008 6:50 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

> Делай так:
Insert Into Точки (Obj)
Values (CreatePoint (43.8472, 48.8472) ) ‘на этой строке ошибка – пишет, что не удалось преобразовать данные

Вот так сделал:

Declare Sub Main

Sub Main

Include "mapbasic.def"
Open Table "C:\Точки"
Browse * From Точки

Insert Into Точки (idsPOINT_LEG_ID, idsDISTRICT_ID, chrPOINT_LEG_NAME, lngLAT_DEG, lngLAT_MIN, lngLAT_SEC, sngLAT_DEC, lngLON_DEG, lngLON_MIN, lngLON_SEC, sngLON_DEC) VALUES ("500", "7", "Быковка", "48", "50", "50.0", "48.8472", "43", "50", "50.0", "43.8472")

Select * From Точки Where idsPOINT_LEG_ID = 500

Update Selection Set obj = CreatePoint (43.8472, 48.8472)

Commit Table Точки
Close Table Точки

End Sub

Просто не сразу понял, что obj – это название колонки, которая не отображается. Читаю Руководство пользователя MapBasic. На порядок лучше чем хелп.

О закрывании MapInfo
> Команда
End MapInfo

А можно так:
miNewApp.RunCommand ("Run Menu Command 113")
Оказывается, объявленная константа Public Const M_FILE_EXIT = 113 не помогает. Надо передавать непосредственно число.


Возник вопрос с удалением записи. Чтобы в таблице не оставалось серой строки, ее надо упаковать:

Declare Sub Main

Sub Main

Include "mapbasic.def"
Open Table "C:\Точки"
Browse * From Точки
Select * From Точки Where idsPOINT_LEG_ID = 500 Into DeletePointTable NoSelect
Delete From DeletePointTable
Commit Table Точки
Pack Table Точки
Close Table Точки

End Sub
но почему-то все равно серая строка на месте удаленной записи остается. Почему?


Вот еще интересно. После вставки новой точки (ее изменения или удаления) слой с точками исчезает из рабочего набора (если он при этом открыт) и его нет в списке таблиц, открываемых в Управление слоями -> Добавить. Но если закрыть, а потом снова открыть набор, то все слои на месте и точки отображаются правильно в соответствии со значениями их координат. А нельзя ли как-н. сразу отображать в наборе произошедшие изменения, без закрытия и открытия набора?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
КД



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

СообщениеДобавлено: Чт Окт 30, 2008 6:22 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Вот еще вопрос. Меняю информацию о точке в Access’е:

Set miNewApp = CreateObject("MapInfo.Application")

miNewApp.Visible = True

strPath = "C:\Точки"
strAction = "Open Table """ & strPath & """"
miNewApp.RunCommand (strAction)

miNewApp.RunCommand ("Browse * From Точки")
miNewApp.RunCommand ("Select * From Точки Where idsPOINT_LEG_ID = " & intPointLegId & "")

miNewApp.RunCommand ("Update Selection Set idsDISTRICT_ID = """ & intCodeDistrict & """, " & _
"chrPOINT_LEG_NAME = """ & strPointName & """, lngLAT_DEG = """ & varLatitudeDeg & """, " & _
"lngLAT_MIN = """ & varLatitudeMin & """, lngLAT_SEC = """ & varLatitudeSec & """, " & _
"sngLAT_DEC = """ & varLatitudeDec & """, lngLON_DEG = """ & varLongitudeDeg & """, " & _
"lngLON_MIN = """ & varLongitudeMin & """, lngLON_SEC = """ & varLongitudeSec & """, " & _
"sngLON_DEC = """ & varLongitudeDec & """")

miNewApp.RunCommand ("Select * From Точки Where idsPOINT_LEG_ID = " & intPointLegId & "")
miNewApp.RunCommand ("Delete Object From Selection")
miNewApp.RunCommand ("Update Selection Set obj = CreatePoint (" & varLongitudeDec & ", " & varLatitudeDec & ")")

strAction = "Commit Table Точки"
miNewApp.RunCommand (strAction) ‘на этой строке свернутое окно MapInfo начинает мигать и выполнение кода останавливается. Продолжается лишь после щелчка на окне MI. Что с этим делать?

strAction = "Close Table Точки"
miNewApp.RunCommand (strAction)

miNewApp.RunCommand ("Run Menu Command 113")
Set miNewApp = Nothing

И еще, я так понимаю, что при добавлении графического объекта автоматически учитывается координатная система таблицы или это надо в коде отдельно прописывать?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
КД



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

СообщениеДобавлено: Чт Ноя 06, 2008 6:48 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Я уже так достал своими вопросами или что-то очень трудное спросил?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

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


Top.Mail.Ru