UpdateFromAscii method (Layer)

Обновляет заданные поля базы данных значениями из текстового файла.

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

Layer

Синтаксис:

Visual Basic:

Function UpdateFromAscii(iDb As ZbDatabase, AsciiFile As String, Fields) As Long

iDb - база данных, открытая на файле того типа объектов, записи которого обновляются. Имя файла базы дает свойство BaseName типа из коллекции ObjectTypes.

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

Fields - имена обновляемых полей, разделенные символом с кодом ASCII 10.

Описание:

Одна строка файла - одна запись базы. Первым в строке стоит ключ объекта, за ним значения полей в том порядке, в каком поля перечислены в параметре Fields. Значения разделяются запятой, текстовые берутся в двойные кавычки; ключ принимается и в кавычках, и без них.

Файл читается в кодировках ANSI, UTF-16 и UTF-8 с меткой порядка байтов. Файл в UTF-8 без метки метод читает как ANSI, и кириллица в нем портится.

При успехе метод возвращает 0, при отказе - -1; при отказе ни одна запись не меняется. Отказом кончаются: имена полей, разделенные запятой вместо символа с кодом 10; лишний разделитель в конце списка полей; номера полей вместо имен - и строкой, и массивом; массив имен полей; имя поля, которого нет в базе; отсутствующий файл; база другого типа объектов. Значения в файле, разделенные точкой с запятой, тоже дают -1. Разбирая такой файл, ZuluGIS пишет в окно сообщений строку вида «Ошибка преобразования данных» с именем файла, номером поля и значением, на котором разбор остановился.

Строка с ключом, которого в базе нет, молча пропускается: остальные строки файла обновляются, метод возвращает 0.

Если значений в строке меньше, чем полей в списке, недостающие поля очищаются; лишние значения в строке отбрасываются.

Пустая строка в параметре Fields переписывает запись целиком: значения из файла ложатся в поля по порядку начиная с первого поля после ключа, а все остальные поля записи очищаются.

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

Пример:

Пример записывает в первое поле первой записи пробное значение и возвращает прежнее обратно.

Visual Basic:

Sub Layer_UpdateFromAscii
'Берем активный слой карты
Set L = Zulu.ActiveMapDoc.Layers.Active
'Первый тип объектов слоя и его база данных
Set T = L.ObjectTypes.GetItemByIndex(0)
Set db = CreateObject("Zb.ZbDatabase")
db.Open T.BaseName
'Берем первую запись: ее ключ и первое поле после ключа
Set ds = db.SelectAll
If ds.Eof Then
  MsgBox "В базе типа " & T.Name & " нет записей"
  Exit Sub
End If
Key = ds.FieldValue(0)
Set fd = ds.GetFieldDef(1)
FName = fd.Name
Was = ds.FieldValue(1)
'Готовим файл: ключ и новое значение через запятую
Set FSO = CreateObject("Scripting.FileSystemObject")
Set F = FSO.OpenTextFile("C:\Data\update.txt", 2, True, -1)
F.WriteLine Key & ",""ПРОБА"""
F.Close
'Обновляем поле по файлу
r1 = L.UpdateFromAscii(db, "C:\Data\update.txt", FName)
Set ds1 = db.SelectByKey(Key)
Got = ds1.FieldValue(1)
'Возвращаем прежнее значение
Set F = FSO.OpenTextFile("C:\Data\update.txt", 2, True, -1)
F.WriteLine Key & ",""" & Was & """"
F.Close
r2 = L.UpdateFromAscii(db, "C:\Data\update.txt", FName)
Set ds2 = db.SelectByKey(Key)
S = "Тип " & T.Name & ", поле " & FName & ", ключ " & Key
S = S & vbCrLf & "было: " & Was
S = S & vbCrLf & "стало (возврат " & r1 & "): " & Got
S = S & vbCrLf & "после восстановления (возврат " & r2 & "): " & ds2.FieldValue(1)
MsgBox S
End Sub

Python:

import zulu

def Macro_Layer_UpdateFromAscii():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    # Первый тип объектов слоя и его база данных
    T = L.ObjectTypes.GetItemByIndex(0)
    db = zulu.ZbDatabase()
    db.Open(T.BaseName)
    # Берем первую запись: ее ключ и первое поле после ключа
    ds = db.SelectAll()
    if ds.Eof:
        print("В базе типа", T.Name, "нет записей")
        return
    key = ds.FieldValue(0)
    fname = ds.GetFieldDef(1).Name
    was = ds.FieldValue(1)
    path = r"C:\Data\update.txt"
    # Файл в UTF-8 пишем с меткой порядка байтов, иначе кириллица прочитается как ANSI
    with open(path, "w", encoding="utf-8-sig") as f:
        f.write('%s,"ПРОБА"\n' % key)
    # Обновляем поле по файлу
    r1 = L.UpdateFromAscii(db, path, fname)
    got = db.SelectByKey(key).FieldValue(1)
    # Возвращаем прежнее значение
    with open(path, "w", encoding="utf-8-sig") as f:
        f.write('%s,"%s"\n' % (key, was))
    r2 = L.UpdateFromAscii(db, path, fname)
    print("Тип", T.Name, ", поле", fname, ", ключ", key)
    print("было:", was)
    print("стало (возврат", r1, "):", got)
    print("после восстановления (возврат", r2, "):", db.SelectByKey(key).FieldValue(1))