Обновляет заданные поля базы данных значениями из текстового файла.
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 SubPython:
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))