Экспорт данных в формате XML
Формат XML на сегодняшний день является стандартом для обмена информацией между различными приложениями. Создадим на Гедымине функцию, которая будет извлекать данные из заданной таблицы и помещать их в XML следующего вида:
<Table> <Name>Имя таблицы</Name> <Records> <Record> <Field> <FieldName>Имя поля</FieldName> <FieldValue>Значение поля</FieldValue> </Field> ... </Record> ... </Records> </Table>
Данные в XML должны быть представлены в кодировке UTF-8. В этой кодировке первые 128 символов (символы латинского алфавита, цифры, знаки пунктуации и т.п.) совпадают с кодовой таблицей ASCII. Остальные символы передаются с помощью последовательности "�<Code>;", где <Code> -- код символа. Кириллические символы, которые в кодировке Win1251 занимают позиции с C0 по FF, в кодировке UTF-8 имеют номера от 410 до 44F. Исключение составляет большая и малая буква Ё: B8-й и A8-й символ в кодировке Win1251, которым соответствуют символы 451 и 401 из UTF-8.
Напишем вспомогательную функцию, которая будет перекодировать заданную строку из кириллической кодировки Windows-1251 в UTF-8:
function ConvertToUTF8(ByVal S) dim R, I, C, K R = "" for I = 1 to Len(S) K = Mid(S, I, 1) C = Asc(K) if (C >= 192) and (C <= 255) then R = R & "�" & Hex(C + &H410 - 192) & ";" elseif C = 184 then R = R & "ё" elseif C = 168 then R = R & "Ё" else R = R & K end if next ConvertToUTF8 = R end function
Теперь, все готово для написания функции, а точнее процедуры, XMLText:
sub XMLText(ByVal ATableName, ByVal AFields, ByVal ACondition, ByVal AddRUID, ByVal AFileName) AFields = "," & AFields & "," dim Creator set Creator = new TCreator dim q , sstr set q = Creator.GetObject(nil, "TIBSQL", "") q.Transaction = gdcBaseManager.ReadTransaction q.SQL.Text = "SELECT * FROM " & ATableName q.ExecQuery dim i, XMLBody, f XMLBody = "<?xml version=""1.0"" standalone=""yes""?>" & vbCrLf XMLBody = XMLBody & "<Data>" & vbCrLf & "<Table>" & vbCrLf & "<Name>" & ATableName & "</Name>" & vbCrLf & "<Records>" & vbCrLf while not q.EOF if ACondition > "" then f = Eval(ACondition) else f = True end if if f then XMLBody = XMLBody & "<Record>" & vbCrLf for i = 0 to q.Current.Count - 1 if InStr(1, AFields, "," & q.Fields(i).Name & ",", 1) <> 0 then if not q.Fields(i).IsNull then XMLBody = XmlBody & "<Field>" & vbCrLf & "<FieldName>" & q.Fields(i).Name & "</FieldName>" & vbCrLf XMLBody = XmlBody & "<FieldValue>" & q.Fields(i).AsString & "</FieldValue>" & vbCrLf & "</Field>" & vbCrLf end if end if next if AddRUID then XMLBody = XMLBody & "<Field>" & vbCrLf & "<FieldName>" & "RUID" & "</FieldName>" & vbCrLf XMLBody = XmlBody & "<FieldValue>" & gdcBaseManager.GetRUIDStringByID(q.FieldByName("ID").AsInteger) & "</FieldValue>" & vbCrLf & "</Field>" & vbCrLf end if XMLBody = XMLBody & "</Record>" & vbCrLf end if q.Next wend XMLBody = XMLBody & "</Records>" & vbCrLf & "</Table>" & vbCrLf & "</Data>" & vbCrLf Dim fso, tf Set fso = CreateObject("Scripting.FileSystemObject") Set tf = fso.CreateTextFile(AFileName, True) tf.Write (ConvertToUTF8(XMLBody)) tf.Close end sub
Входящие параметры:
- ATableName
- имя таблицы в базе данных.
- AFields
- список полей для экспорта (имена полей должны быть разделены запятыми).
- ACondition
- выражение на языке VBScript для отбора записей. Если ACondition равно пустой строке, то в XML файл будут перенесены все записи из таблицы. Внутри выражения можно обращаться к переменной q, типа TIBSQL, которая содержит текущую запись. Например, выражение q.FieldbyName(“disabled”).AsInteger = 0 позволит отобрать только активные записи. При условии, конечно, что в указанной таблице присутствует поле с именем disabled.
- AddRUID
- булевский параметр. Если имеет значение Истина, то для каждой записи будет указан ее RUID.
- AFileName
- имя файла, в который будет записан результат.
Примерный результат выполнения функции:
<?xml version="1.0" encoding="UTF-8"?> <Data> <Table> <Name>gd_good</Name> <Records> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100612</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>"Анжелика" печать плат. документов</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100613</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Секрет Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100614</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Анжелика-Бухгалтер"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100615</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Зарплата Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100616</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Средства Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100617</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Меню Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100618</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Комплекс Анжелики" +</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100619</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Аренда Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100620</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Книга покупок и продаж"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100621</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Маршруты Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100622</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Договор Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100623</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Анжелика Турист"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100624</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "СТО Анжелики"</FieldValue> </Field> </Record> <Record> <Field> <FieldName>ID</FieldName> <FieldValue>147100625</FieldValue> </Field> <Field> <FieldName>NAME</FieldName> <FieldValue>Программа "Хранитель Анжелики"</FieldValue> </Field> </Record> </Records> </Table> </Data>