Mittwoch, 8. Oktober 2008
BizTalk 2006 Error BEC2004: Validate Instance failed for schema
Donnerstag, 8. Mai 2008
Codepages und DIN 66003
Es gibt Dinge, die wollte ich nie wissen und habe es tunlichst vermieden mich damit auseinanderzusetzen, jetzt hat mich das dank der Anbindung an verschiedene UNIX Systeme doch wieder eingeholt: Zeichsatzcodierungen.
Mit Hilfe von BizTalk werden verschiedene Quellen ausgelesen, die UNIX-typisch jeweils anders codiert sind. Sehr geholfen hat mir http://msdn.microsoft.com/en-us/library/ms776446(VS.85).aspx, jedoch ist das auch hier nicht ganz ohne Fallstricke ausgegangen:
IBM 437 = 437,
ISO 8859-1 = 28591,
ISO 8859-15 = 28605,
und DIN 66003?
urks, steht nicht drin, ist ja auch klar. Die Recherche ergab ziemlich schnell, dass dahinter ISO 646 in der deutschen Ausprägung steht (021, bzw. DE, je nach Bezeichnungsvariante), was nichts anderes als ASCII 7bit für Deutschland darstellt... tzia nur das findet man immer noch nicht in dem obigen MSDN Link. Erst weitere Nachforschungen haben eine Implementation der ISO 646 nach IA5 zu Tage gefördert, BINGO! Da gibts tatsächlich was dazu unter der MSDN:
DIN 66003 = 20106
Letztendlich wird mir wieder klar, warum ich diese Zeichensatzcodierungen nie ausstehen konnte, die blanke Flut an Bezeichnern für ein und dasselbe sind schon ziemliche irre für sich allein genommen...
Ich hab aber auch eine Serie :-/
BizTalk: "Variable Längen" handeln in Flatfile Schemas
Ziemlich viel Zeit hat mich folgendes Problem mit BizTalk gekostet, als ich die Lösung hatte hab ich dazu auch endlich was in Google gefunden... ärgerlich.
Folgendes Problem: ich bekomme eine Datenstruktur mit folgendem Aufbau zugeschickt:
nnnXXXXabcd/CR/LF
Dies ist erst einmal relativ simpel mit dem Flatfile Wizard von Biztalk zu lösen (wem das Tutorial aus der MSDN nicht den zündenen Geistesblitz gibt, sollte es mit dem hier versuchen).
Jetzt ist allerdings folgender Fallstrick in meinem Flatfile, eine nachfolgende row im Flatfile kann wie folgt aussehen:
nnnXXXXabcdefgh/CR/LF
urgs, richtig! Variable Längen... in einem positional record, das gibt einem auch prompt beim ausprobieren einen "Unexpected Data found while looking for '/r/n'" Error
Um das in den Griff zu kriegen, mußte ich furchtbar lange rumpobieren da ich nix sinnvolles an Hilfe fand. Ich bin dann mit dem XSD Editor auf folgendes gestoßen:
1: <?xml version="1.0" encoding="utf-16" ?>
2: <xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003"
3: xmlns="http://xyz.de"
4: targetNamespace="http://xyz.de"
5: xmlns:xs="http://www.w3.org/2001/XMLSchema">
6: <xs:annotation>
7: <xs:appinfo>
8: <schemaEditorExtension:schemaInfo namespaceAlias="b"
9: extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension"
10: standardName="Flat File"
11: xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" />
12: <b:schemaInfo standard="Flat File"
13: codepage="65001"
14: count_positions_by_byte="true"
15: default_pad_char="" pad_char_type="char"
16: parser_optimization="speed"
17: lookahead_depth="3"
18: suppress_empty_nodes="false"
19: generate_empty_nodes="true"
20: allow_early_termination="false"
21: early_terminate_optional_fields="false"
22: allow_message_breakup_of_infix_root="false"
23: compile_parse_tables="false"
24: root_reference="Group" />
25: </xs:appinfo>
26: </xs:annotation>
27:
28: ...
Das Attribute "allow_early_termination" auf true gesetzt und dann bei pos_length im entsprechenden Element eine geeignete Größe gewählt (z.B. pos_length="1000") führte zu einem funktionierendem Ergebnis.
Nachteil bleibt der Faktor mit pos_length, sollte es einmal doch "länger" sein, sind wir wirklich aufgeschmissen an diesem Punkt. Da bleibt dann wohl nur noch ein Umweg dies über die BizTalk Pipelines zu fixen, bzw. mit einer geeigneten Applikation, die uns das File vorher aufbereitet.
