Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
КД
Зарегистрирован: 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") |
|
Вернуться к началу |
|
|
КД
Зарегистрирован: 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 запудрил мозги. |
|
Вернуться к началу |
|
|
КД
Зарегистрирован: 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 - видимо где-то что-то путаешь с разделителем целой и дробной части числа. Т.е. "." с "," или наоборот |
|
Вернуться к началу |
|
|
КД
Зарегистрирован: 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 Заголовок сообщения: |
|
|
Я уже так достал своими вопросами или что-то очень трудное спросил? |
|
Вернуться к началу |
|
|
|