XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
DG SarboSubject: converter EDI --> typ = no
Author: DG Sarbo
Date: 10 Aug 2009 07:01 AM
Originally Posted: 10 Aug 2009 06:51 AM
Please take a look at the xquery in sample1.

In the EDI message (sample1.edi) there is a line MEA+AAE+G+KGM:16920'
here I want to be sure that the '16920' is an instance of decimal. So I check this in the mapping (see xquery sample1.xquery take scenario 1).

This does not work. I first assumed that because the converter makes a stringtype out of the '16920', it is impossible to check if the value is an instance of decimal.

However, if I change '16920' to e.g. 'string' (see sample2.edi) the same xquery (see sample1.xquery but now with scenario 2) throws an error:

Error during conversion: [DDEE0012] ERROR Invalid character in numeric value string (often caused by incorrect decimal character).

This is how it should be! SS checks the EDIFACT D95B CODECO, sees that the type of
Segment: MEA (line 18)
Position: MEA0302
Element: C174:6314
Measurement value Value: "string" ... is not numeric.

But the error message SS gives is very hard to read for the untrained eye (workers in our helpdesk also see this error message). We want to have a nicer message (in plain English) and further down in the error message SS makes a suggestion:

To turn off all data type validation, use the "typ=no" URI option.

I add the typ=no option in my xquery (see scenario 3) and now something happens that I do not understand. There is no error but also no output... The whole <xlEquipmentGrossWeight> is gone from the output.

What did happen?


Unknownsample1.xquery
the xquery

Unknownsample2.edi
sample 2

Unknownsample1.edi
sample 1

Postnext
Tony LavinioSubject: converter EDI --> typ = no
Author: Tony Lavinio
Date: 11 Aug 2009 05:57 PM
First, the issue is not with typ=no, but in your query. The query
line:
where $MEA/MEA02/MEA0201/text() = 'G'
should be
where $MEA/MEA02/text() = 'G'

But there is a more subtle problem in your XQuery.

saying "$lmnt instance of xs:decimal" depends on the declared type of
the element based on XML Schema, not based on whether the string value
of the element looks like a number.

So without an XML schema defined, "instance of" will not do what you
expect. If you want to test if an untyped element looks like a number,
use this:

string(number($lmnt)) != 'NaN'

In any case, this should not be needed. The XML Converters already
have builtin code to check for all sorts of conditions, including
whether a specific element has the correct characters for that
datatype and minimum and maximum lengths.

One issue your code does not test is the proper way of handling
lengths for numeric values. For example, the '-' sign is not counted
as part of the length, ".5" and "5." are illegal values, etc. The
converter handles all of these issues, but you are for some reason
disabling those checks and handling them manually.

Possibly a better method would be to intercept the errors via a
EDIConverterListener Java class, and reporting your own errors. This
would let the converters handle their validation as designed, and
would save you duplicating much effort.

Postnext
DG SarboSubject: converter EDI --> typ = no
Author: DG Sarbo
Date: 12 Aug 2009 04:18 AM
Originally Posted: 12 Aug 2009 03:52 AM
Sorry but I think you are wrong about:

>$MEA/MEA02/MEA0201/text() =
>'G'
>should be
>where $MEA/MEA02/text() = 'G'

The D95B EDIFACT message has a MEA segment in GROUP_3. The MEA/MEA02 is a 'C502' composite element that holds composites: 6313, 6321, 6155 and 6154. Beacuse the 'G' is in the first composite (in 6313), in the EDI message (see e.g. sample 1) the line: MEA+AAE+G+KGM:string' should be seens as MEA+AAE+:G+KGM:string' (notice the ':' before G).

*****
Thank you for the help, I will try this!


Also could you please look at my initial question about the typ=no?

In scenario1 I use: "converter:EDI?file://C:.....\sample1.edi"

In scenario3 I use: "converter:EDI:typ=no?file://C:.....\sample2.edi"

In scenario1, it executes the local:checkField function but I don't know what happens in scenario3.

Postnext
Tony LavinioSubject: converter EDI --> typ = no
Author: Tony Lavinio
Date: 12 Aug 2009 04:16 AM
>Sorry but I think you are wrong about:
> $MEA/MEA02/MEA0201/text() = 'G'
> should be
> $MEA/MEA02/text() = 'G'

No, I am not wrong, based on the sample1.edi and sample2.edi
that you posted earlier. Neither has a +:G+, but both have just
+G+.

Perhaps the real definition uses +:G+, but that's not the sample
you posted, and that's why your sample didn't work.

For the rest, after fixing either your input file or your XQuery
to handle the +G+ issue, please re-read the comments above.

Your code to do "instance of decimal" will not do what you think.

Postnext
DG SarboSubject: converter EDI --> typ = no
Author: DG Sarbo
Date: 12 Aug 2009 04:40 AM
>No, I am not wrong, based on
>the sample1.edi and
>sample2.edi
>that you posted earlier.
>Neither has a +:G+, but both
>have just
>+G+.

Yes you are wrong... I know for a FACT that it MUST be MEA/MEA02/MEA0201
Just open the D95B EDIFACT standard... see that it has a composite element and look inside it to see that the 'G' is in 'MEA0201'.

It is impossible to have a composite element (like MEA02) with a string/AN value (like 'G').

If you think this:

>Perhaps the real definition
>uses +:G+, but that's not the
>sample
>you posted, and that's why
>your sample didn't work.

Than you did not try my xquery in SS. If you change the code like you suggested the 'G' will not be found and the code would not reach the part where the local:checkField function is.

On the other hand if you do it like I wrote the code, than the function is reached (as you can try for yourself), executed and the error message that is in it, is displayed by SS (in the error message the value of MEA/MEA03/MEA0302 is displayed, this could not happen if my code was wrong!!!)

EDIFACT works like this:

if there is a composite element and a value from the first composite (like I said: 6313) holds 'G' than there is no need to use '+:' in a EDIFACT message. That is why I said: "it can be seen as"

If the 'G' would be in the 2nd/ 3d of 4th composit (in: 6321, 6155 or 6154) than the ':' would be used.

Please just try running the xquery before stating something that is not true.

Postnext
Jordy BakkerSubject: converter EDI --> typ = no
Author: Jordy Bakker
Date: 12 Aug 2009 05:07 AM
A value can never be found in a composite.
It should always be in an element or a composite element.

MEA/MEA01 is element 6311, which can contain a value.
MEA/MEA02 is composite C502, which cannot contain a value itself.
Only its composite elements C502/6313, C502/6321, C502/6155 and C502/6154 can contain a value.

The elements and composites are divided by a +
The composite elements are divided by a :

Since C502/6313 is the first composite element of composite C502, it should not be preceded by a :

MEA+AAE+G+KGM:1000' is a segment which has the following values:
'MEA' is the segment (MEA)
'AAE' is in element 6311 (MEA/MEA01)
'G' is in composite element C502/6313 (MEA/MEA02/MEA0201)
'KGM' is in composite element C174/6411 (MEA/MEA03/MEA0301)
'1000' is in composite element C174/6314 (MEA/MEA03/MEA0302)

Postnext
Tony LavinioSubject: converter EDI --> typ = no
Author: Tony Lavinio
Date: 12 Aug 2009 10:41 AM
Originally Posted: 12 Aug 2009 10:30 AM
Ah! You have discovered a problem.

I was looking just at the XML output.

It appears that when typ=no, we can't distinguish in the input from
content being in a 01 vs. a 0101 position.

This is a bug, and will be fixed for the 5.0 release.

But the other pieces about "instance of xs:decimal" are still
correct.

That particular bug has been in the product for several years.
The reason it was never encountered is that in general our other
users never turn off type checking.

Posttop
DG SarboSubject: converter EDI --> typ = no
Author: DG Sarbo
Date: 12 Aug 2009 12:06 PM
Ok, I wait on it for release 5.0

The code you have given to solve the "instance of xs:decimal" problem is very helpful. Thank you for that.

 
Topic Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.