2017-09-05 7 views
0

En utilisant du code comme:"Aucun échange n'a été démarré." erreur sur la sérialisation EdiMessage

... 
EdiMessage ediMessage = (EdiMessage)instance; 
using (FileStream ediStream = File.OpenWrite(file)) 
{ 
    using (EdifactWriter writer = new EdifactWriter(ediStream)) 
    { 
     writer.Write(ediMessage); 
    } 
} 

Je reçois un message d'erreur 'Aucun échange a commencé.'

trace de la pile en dessous de l'appel writer.Write (dernière version publique de Edifabric):

at EdiFabric.Framework.Writers.EdiWriter`2.Write(EdiMessage message) 

Il porte sur un objet INVOIC D96A avec BGM, certains FTX et UNH. La classe d'objet est. Et l'exception est soulevée par EdiWriter sur l'appel writer.Write. Les données ediMessage semblent avoir été validées. Selon Edifabric documentation il faut ajouter les séparateurs de EDIFACT par défaut automatiquement:

Si non spécifié explicitement l'auteur utilisera les séparateurs par défaut par la norme:

Qu'est-ce que j'oublie de configuration?

+0

Le message 'Aucun échange a commencé.' signifie qu'aucun segment d'en-tête d'échange n'a été créé. Les documents EDI suivent une structure telle que: En-tête d'échange-> En-tête de groupe (facultatif pour EDIFACT) -> Transaction-> Remorque de groupe-> Remorque d'échange. Dans votre cas, vous devez d'abord écrire un UNB, puis écrire toutes les transactions \ messages. –

+0

@DonZoeggerle merci pour le fond; le mot "Interchange" dans l'erreur était dû au manque de termes EDIFACT pas clair pour moi alors. Avec quelques cellules grises supplémentaires, je sais maintenant qu'il se réfère à un échange de messages EDI. EDIFACT fonctionne très bien; design simple et élégant! –

Répondre

0

Cela semble être un bug de documentation; le défaut ne se produit pas. Lors de la modification du code à:

using (EdifactWriter writer = new EdifactWriter(ediStream)) 
{ 
    var unb = new UNB(); // Begin interchange. 
    writer.Write(unb, Separators.Edifact); 

    writer.Write(ediMessage); 
} 

l'élément insère un en-tête dans le document, après quoi un message est ajouté. Le code a maintenant soulevé une "référence d'objet non définie à une instance d'un objet." avec la pile d'appels

at EdiFabric.Core.Model.Edi.EdiMessage.GetControlNumber(String tag, Int32 position) 

qui a été fixé en ajoutant:

ediMessage.ControlNumber = ...; 
+0

Oui, les numéros de contrôle à tous les niveaux sont obligatoires. N'oubliez pas de valider votre message avant de l'écrire. –

+0

@DonZoeggerle merci pour le conseil. Je vais regarder comment le valider. Nous ne vérifions maintenant que les erreurs. –