Donnerstag, 8. Mai 2008

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.

Keine Kommentare: