Welcome, Guest
Username: Password: Remember me

TOPIC: Opmaak bedragen PAIN files (Rabo)

Opmaak bedragen PAIN files (Rabo) 19 feb 2014 17:35 #1

Vandaag een Pain.001 naar de Rabobank gestuurd ter controle (Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.).
Dit bestand wordt afgekeurd omdat de bedragen geen 2 decimalen hebben. Er staat nergens in de documentatie dat dit moet.
De Rabobank wil ook de bedragen in de Pain.008 file met decimalen hebben.

Hoe hebben jullie dit opgelost? Is er ergens voorbeeldcode?
Ik werk in C#, heb de xsd gedownload en maak heel mooi via serialization een xml.
Heb nu een aanpassing gemaakt in de code die gegenereerd is vanaf de xsd. Niet zo mooi, want bij een update moet dit weer gedaan worden.
Last Edit: 19 feb 2014 17:36 by Arjan Heusinkveld. Reason: Aanvulling
The administrator has disabled public write access.

Opmaak bedragen PAIN files (Rabo) 19 feb 2014 18:23 #2

Waarom zou je de code ooit opnieuw genereren? De XSD-definitie gaat m.i. niet meer veranderen. ik zie het genereren van code vanuit XSD als een snelle start, ideaal is het resultaat vaak niet.

Als je je tool partial classes laat genereren, kun je je eigen business logic toevoegen met minimale impact. Een voorbeeld:
    public partial class ActiveOrHistoricCurrencyAndAmount
    {

        /// <remarks>
        /// Usage EPC: Only ‘EUR’ is allowed.</remarks>
        [XmlAttribute("Ccy")]
        public string Currency { get; set; }

        [XmlText()]
        public string ValueString
        {
            get
            {
                return Value.ToString("0.00", CultureInfo.InvariantCulture);
            }
            set
            {
                try
                {
                    this.Value = Decimal.Parse(value, CultureInfo.InvariantCulture);
                }
                catch
                {
                    this.Value = 0.00m;
                }
            }
        }

        [XmlIgnore()]
        public decimal Value { get; set; }
    }

Vanuit de code benader ik Value, geschreven en gelezen wordt ValueString. De andere partial class can bijv. Currency initialiseren.
The administrator has disabled public write access.
The following user(s) said Thank You: Arjan Heusinkveld

Opmaak bedragen PAIN files (Rabo) 20 feb 2014 12:16 #3

Wij houden de code vanuit de XSD het liefst zoals deze is, ook al zal de XSD niet veranderen.

Als je de gegenereerde code wijzigt en er komt een nieuwe versie, bv 001.001.04, dan moet je die code wijziging weer opnieuw toevoegen en dat ga je (of degene die er dan aan werkt) vast vergeten.

Bedankt voor je voorbeeld. Zo had ik het in eerste instantie ook opgelost.
Vanochtend nogmaals gezocht en heb ik de volgende oplossing gevonden, die je bij een nieuwe versie kan hergebruiken (totdat men namen datatypes gaat veranderen).
Twee losse .cs files naast de vanuit XSD gegenereerde .cs file:
public partial class ActiveOrHistoricCurrencyAndAmount
{
	[XmlText()]
	public string AmountString
	{
		get
		{
			return Value.ToString("0.00", CultureInfo.InvariantCulture);
		}
		set
		{
			decimal amount = 0;
			if (Decimal.TryParse(value, out amount))
				Value = amount;
		}
	}
}
public partial class Document
{
	/// <summary>
	/// Get the XmlAttributes to override
	/// </summary>
	public XmlAttributeOverrides XmlOverrides
	{
		get
		{
			var xOver = new XmlAttributeOverrides();
			//Setting XmlIgnore of Value property to true so it will not be serialized, we have our own property in our partial class file. It's decorated with the XmlElement attribute.
			xOver.Add(typeof(ActiveOrHistoricCurrencyAndAmount), "Value", new XmlAttributes() { XmlIgnore = true });
			//We can add extra overides to xOver if we need to override more

			return xOver;
		}
	}
}

Bij het serializen geef je XmlOverrides mee zodat het XmlIgnore attribute toegevoegd wordt.
Het serializen gebeurt in een class die d.m.v. een namespace naar de juiste versie van Pain001/Pain008 verwijst. Dus die zal bij een nieuwe versie niet veranderen (op de namespace using na).
Document paymentDocument;

//fill paymentDocument here with your data.

var xDoc = new XDocument();
using (var writer = xDoc.CreateWriter())
{
	var serializer = new System.Xml.Serialization.XmlSerializer(paymentDocument.GetType(), paymentDocument.XmlOverrides);
	serializer.Serialize(writer, paymentDocument);
}
Last Edit: 20 feb 2014 12:16 by Arjan Heusinkveld.
The administrator has disabled public write access.
Time to create page: 0.216 seconds
Powered by Kunena Forum

Enigma Consulting