SynchronizeDatabase method (Layer)

Метод приводит в соответствие записи базовой таблицы семантической базы данных, подключенной к слою, с графическими объектами слоя.

Применяется к:

Layer

Синтаксис:

Visual Basic:

Function SynchronizeDatabase(BaseID As Long, Flags As Long) As Long

BaseID - ID базы данных слоя.

Flags - флаги:

1 - удаление записей, для которых нет графических объектов.

2 - создание пустых записей для графических объектов, у которых нет записей в базе данных.

3 - включает оба действия.

Описание:

Параметр BaseID - это идентификатор базы данных слоя, который присутствует в списке баз слоя - Layer.Bases. Для примитивов BaseID хранится в свойстве Layer.BaseID. Для типовых объектов - Layer.ObjectTypes.Item(TypeID).BaseID.

Метод делает работу, но по возвращаемому значению об этом не судить: при флагах 1, 2 и 3 он отвечает -1 независимо от того, изменилось что-нибудь или нет, а при флаге 0 и на несуществующей базе - 0. Проверять нужно сами записи.

Например, если в слой добавлен типовой объект без записи в базе, вызов с флагом 2 создает для него пустую запись; если объект удален, а запись осталась, вызов с флагом 1 ее удаляет.

Пример:

Пример добавляет в слой свой объект, создает для него запись в базе, а затем убирает и объект, и лишнюю запись.

Visual Basic:

Function Records(L, BaseID)
  Dim DS, n
  Set DS = L.OpenDatabase(BaseID, "").SelectAll
  n = 0
  DS.MoveFirst
  Do While Not DS.Eof
    n = n + 1
    DS.MoveNext
  Loop
  Records = n
End Function

Sub Layer_SynchronizeDatabase
'Берем активный слой карты
Set L = Zulu.ActiveMapDoc.Layers.Active
Set R = L.GetBoundsRectangle
S = "Объектов типа 3: " & L.SelectByType(3, 0).Count & ", записей в базе: " & Records(L, 3)
'Добавляем свой объект - записи в базе у него нет
Key = L.AddSymbol(R.Xmax + 100, R.Ymin, 3, 1)
S = S & vbCrLf & "после добавления объекта: " & L.SelectByType(3, 0).Count & " и " & Records(L, 3)
'Создаем недостающие записи
L.SynchronizeDatabase 3, 2
S = S & vbCrLf & "после синхронизации (флаг 2): " & Records(L, 3)
'Убираем свой объект и оставшуюся без объекта запись
L.DeleteElement Key
L.SynchronizeDatabase 3, 1
S = S & vbCrLf & "после уборки (флаг 1): " & L.SelectByType(3, 0).Count & " и " & Records(L, 3)
MsgBox S
End Sub

Python:

import zulu

def Macro_Layer_SynchronizeDatabase():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    R = L.GetBoundsRectangle()

    def records(base_id):
        ds = L.OpenDatabase(base_id, "").SelectAll()
        n = 0
        ds.MoveFirst()
        while not ds.Eof:
            n += 1
            ds.MoveNext()
        return n

    print("Объектов типа 3:", L.SelectByType(3, 0).Count, ", записей в базе:", records(3))
    # Добавляем свой объект - записи в базе у него нет
    key = L.AddSymbol(R.Xmax + 100, R.Ymin, 3, 1)
    print("после добавления объекта:", L.SelectByType(3, 0).Count, "и", records(3))
    # Создаем недостающие записи
    L.SynchronizeDatabase(3, 2)
    print("после синхронизации (флаг 2):", records(3))
    # Убираем свой объект и оставшуюся без объекта запись
    L.DeleteElement(key)
    L.SynchronizeDatabase(3, 1)
    print("после уборки (флаг 1):", L.SelectByType(3, 0).Count, "и", records(3))