Bug #5799
write-xml doesn't serialize the prods:id attributes and the deleted fields for before-table
Start date:
Due date:
% Done:
100%
billable:
No
vendor_id:
GCD
case_num:
version_reported:
version_resolved:
reviewer:
production:
No
env_name:
topics:
Related issues
History
#1 Updated by Constantin Asofiei over 4 years ago
This program:
@openapi.openedge.export FILE(type="REST", executionMode="external", useReturnValue="false", writeDataSetBeforeImage="true").
block-level on error undo, throw.
define temp-table ttOrder no-undo
before-table bttOrder
field orderNum as integer
field orderName as character.
define dataset dsOutputBT
for ttOrder.
define var input_orderNum as integer no-undo.
define var input_orderName as character no-undo.
input_orderNum = 1.
input_orderName = "Toto".
create ttOrder.
assign
ttOrder.orderName = input_orderName
ttOrder.orderNum = input_orderNum.
create ttOrder.
assign
ttOrder.orderName = input_orderName
ttOrder.orderNum = input_orderNum - 100.
temp-table ttOrder:tracking-changes = true.
//update
find ttOrder where ttOrder.orderNum = input_orderNum.
ttOrder.orderName = substitute ('Modified &1',input_orderName).
//add new
create ttOrder.
assign
ttOrder.orderName = substitute ('New &1',input_orderName)
ttOrder.orderNum = input_orderNum + 100.
// delete
for each ttOrder where ttOrder.orderNum = input_orderNum - 100:
delete ttOrder.
end.
dataset dsoutputbt:write-xml("file", "dso.xml", yes, ?, ?, no, ?, true, ?).
must produce this file:
<?xml version="1.0"?>
<prods:datasetChanges xmlns:prods="urn:schemas-progress-com:xml-dataset-changes:0001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dsOutputBT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ttOrder prods:id="ttOrder12544" prods:rowState="modified">
<orderNum>1</orderNum>
<orderName>Modified Toto</orderName>
</ttOrder>
<ttOrder prods:id="ttOrder12546" prods:rowState="created">
<orderNum>101</orderNum>
<orderName>New Toto</orderName>
</ttOrder>
</dsOutputBT>
<prods:before>
<ttOrder prods:id="ttOrder10498">
<orderNum>-99</orderNum>
<orderName>Toto</orderName>
</ttOrder>
<ttOrder prods:id="ttOrder12544">
<orderNum>1</orderNum>
<orderName>Toto</orderName>
</ttOrder>
</prods:before>
</prods:datasetChanges>
In FWD, it writes this:
<?xml version='1.0'?>
<dsOutputBT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<prods:datasetChanges xmlns:prods="urn:schemas-progress-com:xml-dataset-changes:0001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dsOutputBT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ttOrder>
<orderNum>1</orderNum>
<orderName>Modified Toto</orderName>
</ttOrder>
<ttOrder>
<orderNum>101</orderNum>
<orderName>New Toto</orderName>
</ttOrder>
</dsOutputBT>
<prods:before>
<ttOrder prods:id="ttOrder1">
<orderNum>1</orderNum>
<orderName>Toto</orderName>
</ttOrder>
</prods:before>
</prods:datasetChanges>
</dsOutputBT>
Note how the before table is missing the deleted field and the after-table is missing the prods attributes.
#2 Updated by Constantin Asofiei over 4 years ago
- Related to Feature #3310: add support for the equivalent of the OpenEdge Web Services Adapter (and ProxyGen) and PASOE SOAP transport added
#3 Updated by Ovidiu Maxiniuc over 4 years ago
- % Done changed from 0 to 100
- Assignee set to Ovidiu Maxiniuc
- Status changed from New to Feedback
As you noted, there were two issues here:
- WRITE-XML was not serializing the
prods:idandprods:rowStateattributes. This was disabled from code because they were exposed in other cases. I am not aware when these attributes are serialized exactly. It might depend on the dataset/table internal configuration rather than the parameters of WRITE-XML. I guess it's better to have them extra than the lack of them; - the deleted records were not serialized. The problem here was that they did not exist in database and, in fact they were not created at all. This is because FWD analysed the delete code and detected a possible optimization by bulk deleting the records directly in SQL. Doing so, the before table is not populated with the expected records. I disabled the optimization for tables with change-tracking active and the issue is gone. The other temp-tables can be fast deleted as before.
However, there is another thing that I see: FWD wraps the serialized dataset in an additional wrapper: <prods:datasetChanges ...>. Obviously, this was implemented as result of my observations while working with various testcases. Same like the prods attributes above, I am unable to tell what dictates whether they are output to XML stream. Is this (additional node) OK for your use case?
Committed revision 13126.