Запись данных before-image в файл XML
Во время работы приложения может потребоваться включить изменения, внесённые в ProDataSet, в XML-файл, который отправляется другому приложению. Параметр write-before в методе WRITE-XML позволяет добавлять данные before-image в XML-файл.
Вы уже знаете, как определить before-table как часть описания временной таблицы, например:
DEFINE TEMP-TABLE ttOrderLine NO-UNDO BEFORE-TABLE ttOrderLineBefore.
Так же вы научились как указать какие изменения вы хотите отслеживать. Чтобы напомнить, ниже приведены основные шаги:
- Активировать TRACKING-CHANGES.
- Изменить данные в наборе данных.
- Деактивировать TRACKING-CHANGES.
Далее приведён пример добавления данных before-image в файл XML. Для этого значение параметра write-before-image в методе WRITE-XML устанавливается равным TRUE. По умолчанию используется значение FALSE.
lReturn = hdsOrder:WRITE-XML (“FILE, “myFile.xml”, TRUE, ?, ?, ?, ?, TRUE).
В приведённом ниже примере XML показано как данные before-image записываются в файл с помощью параметра write-before-image. Обратите внимание на запись с изменениями, где QTY=66 и Discount=6, это данные after-image.
<?xml version="1.0"?> <prods:datasetChanges xmlns:prods="urn:schemas-progress-com:xml-dataset-changes:0001"> <dsPO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ttPurchaseOrder prods:id="ttPurchaseOrder2592"> <PONum>8005</PONum> <DateEntered>1998-03-25</DateEntered> <SupplierIDNum>5</SupplierIDNum> <ReceiveDate xsi:nil="true"/> <POTotal>120.0</POTotal> </ttPurchaseOrder> <ttPOLine prods:id="ttPOLine3104" prods:rowState="modified"> <PONum>8005</PONum> <LineNum>1</LineNum> <ItemNum>1</ItemNum> <Price>24.0</Price> <Qty>66</Qty> <Discount>6</Discount> <ExtendedPrice>120.0</ExtendedPrice> </ttPOLine> </dsPO>
Данные before-image представлены в следующей части XML. Вы можете сказать, какие after-записи совпадают с какими before-записями, потому что в XML они будут иметь соответствующие идентификаторы <prods:id>. Этот тег используется в качестве уникального идентификатора для записей в XML-файле.
<prods:before> <ttPOLine prods:id="ttPOLine3104"> <PONum>8005</PONum> <LineNum>1</LineNum> <ItemNum>1</ItemNum> <Price>24.0</Price> <Qty>5</Qty> <Discount>0</Discount> <ExtendedPrice>120.0</ExtendedPrice> </ttPOLine> </prods:before> </prods:datasetChanges>
Как работает write-before-image
Поскольку не существует стандарта для того, как должен выглядеть XML-документ, содержащий данные before- и after-image, то OpenEdge имеет свой собственный формат XML для описания обновлений в ProDataSet, этот XML-документ называется datasetChanges.
Как отправитель информации, вы должны предоставить получателю информацию о схеме, определенной для XML-файла datasetChanges, чтобы он мог правильно интерпретировать элементы XML-документа. Для этого используется метод WRITE-XML с параметрами write-xmlschema и schema-location.
Примечание: файл .xsd для временной таблицы с before-table точно такой же, как и для файла .xsd для временной таблицы без before-table.
Если вы зададите write-before-image, но никаких данных before-image не будет предоставлено, то вы получите документ datasetChanges с пустым разделом before. Это может произойти, если не был активирован TRACKING-CHANGES или если не было изменений в ProDataSet.
Секция before-image в документе XML выглядит так:
<prods:before> </prods:before>
Обратите внимание, что если данные before-image отсутствуют, то ошибка не будет сгенерирована.
Если данные уже существуют в datasetChanges, то метод WRITE-XML перезапишет файл XML текущими данными before-image и after-image.
Когда параметр write-before-image установлен в TRUE, то результирующий файл XML также будет включать информацию об ошибке (ERROR) и строке ошибки (ERROR-STRING).
Пример:
<ttemp prods:id = ttEmp6406 prods:rowState = “modified” Prod:hasErrors = “true”>
При том в секции prods:erros будет следующее:
<prods:errors> <ttemp prods:id=”ttEmp6406” prods:error=”credit limit exceeded”/> </prods:errors>