コード例 #1
0
 /// <summary>
 /// assists research of all Dimension (Escluded timeDimension) in DataTableMessageObject for format the SeriesKey
 /// </summary>
 /// <param name="dim">Dimension test</param>
 /// <returns>Return true if DataMessageObject is Valid</returns>
 internal bool OnlySeriesKey(DataMessageObject dim)
 {
     try
     {
         if (dim == null || dim.Val == null)
         {
             return(false);
         }
         if (dim.ColImpl.ConceptType == ConceptTypeEnum.Dimension)
         {
             if (string.IsNullOrEmpty(DimensionAtObservation) || new List <string> {
                 "TIME_PERIOD", "ALLDIMENSIONS"
             }.Contains(DimensionAtObservation.Trim().ToUpper()))
             {
                 if (((IDimensionConcept)dim.ColImpl).DimensionType != DimensionTypeEnum.Time)
                 {
                     return(true);
                 }
             }
             else
             {
                 if (dim.ColImpl.Id.Trim().ToUpper() != DimensionAtObservation.Trim().ToUpper())
                 {
                     return(true);
                 }
             }
         }
         return(false);
     }
     catch (SdmxException) { throw; }
     catch (Exception ex)
     {
         throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.GetSeriesKey, ex);
     }
 }
コード例 #2
0
        internal void SettingValues(List <DataMessageObject> dmo, SdmxJsonBaseDataWriter dataWriterEngine)
        {
            try
            {
                bool AddedDatasetAttribute = false;

                foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                {
                    dataWriterEngine.AddSerie(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString(), dataWriterEngine.GetKeyPosition(dataWriterEngine._dsd, seriesKey.ColImpl.ConceptObjectCode), true);
                }

                foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                {
                    dataWriterEngine.AddAttribute(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString(), "Serie");
                }


                DataMessageObject val = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);

                DataMessageObject ObsVal = null;

                if (string.IsNullOrEmpty(DimensionAtObservation))
                {
                    DimensionAtObservation = "TIME_PERIOD";
                }

                ObsVal = dmo.Find(dimT => dimT.ColImpl.Id.Trim().ToUpper() == DimensionAtObservation.Trim().ToUpper());
                dataWriterEngine.AddObsValue(ObsVal.Val.ToString());

                if (dataWriterEngine.JsonStruct.Observation.ID == null)
                {
                    dataWriterEngine.JsonStruct.Observation.Role = "time";
                    dataWriterEngine.JsonStruct.Observation.ID   = ObsVal.ColImpl.Id;
                }

                if (!AddedDatasetAttribute)
                {
                    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                    {
                        dataWriterEngine.AddAttribute(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString(), "DataSet");
                    }
                    AddedDatasetAttribute = true;
                }

                foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                {
                    dataWriterEngine.AddAttribute(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString(), "Observation");
                }
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteTimeSeriesData, ex);
            }
        }
コード例 #3
0
        /// <summary>
        /// Write a TimeSeries Data in FLAT format
        /// </summary>
        /// <param name="dataWriterEngine">input structure contains data</param>
        private void WriteFlatData(IDataWriterEngine dataWriterEngine)
        {
            try
            {
                dataWriterEngine.StartSeries();
                bool AddedDatasetAttribute   = false;
                List <DataMessageObject> dmo = _tableResponse.GetNext();
                do
                {
                    if (dmo == null)
                    {
                        break;
                    }

                    //Aggiungo gli Attributi di Dataset
                    if (!AddedDatasetAttribute)
                    {
                        foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                        {
                            dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                        }
                        AddedDatasetAttribute = true;
                    }


                    //OBSERVATION
                    DataMessageObject val  = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);
                    DataMessageObject time = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                    dataWriterEngine.WriteObservation(time.Val.ToString(), val.Val.ToString());


                    foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                    {
                        dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString());
                    }

                    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                    {
                        dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    }
                    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                    {
                        dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    }

                    dmo = _tableResponse.GetNext();
                } while (dmo != null);
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteFlatData, ex);
            }
        }
コード例 #4
0
 /// <summary>
 /// assists research of all Attribute with AttachmentLevel= DimensionGroup in DataTableMessageObject for format the SeriesKey
 /// </summary>
 /// <param name="att">Attribute test</param>
 /// <returns>Return true if DataMessageObject is Valid</returns>
 internal bool OnlySeriesAttribute(DataMessageObject att)
 {
     try
     {
         if (att == null || att.Val == null || att.Val.ToString() == String.Empty)
         {
             return(false);
         }
         if (att.ColImpl.ConceptType == ConceptTypeEnum.Attribute)
         {
             if (((IAttributeConcept)att.ColImpl).AttributeAttachmentLevelType == AttributeAttachmentLevel.DimensionGroup)
             {
                 return(true);
             }
         }
         return(false);
     }
     catch (SdmxException) { throw; }
     catch (Exception ex)
     {
         throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.GetSeriesAttribute, ex);
     }
 }
コード例 #5
0
 /// <summary>
 /// assists research of all Attribute with AttachmentLevel= DataSet in DataTableMessageObject for format the DatasetDescription
 /// </summary>
 /// <param name="att">Attribute test</param>
 /// <returns>Return true if DataMessageObject is Valid</returns>
 internal bool OnlyDatasetAttribute(DataMessageObject att)
 {
     try
     {
         if (att == null || att.Val == null)
         {
             return(false);
         }
         if (att.ColImpl.ConceptType == ConceptTypeEnum.Attribute)
         {
             if (((IAttributeConcept)att.ColImpl).AttributeAttachmentLevelType == AttributeAttachmentLevel.DataSet)
             {
                 return(true);
             }
         }
         return(false);
     }
     catch (SdmxException) { throw; }
     catch (Exception ex)
     {
         throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.GetDataSetAttribute, ex);
     }
 }
コード例 #6
0
        /// <summary>
        /// Write a TimeSeries Data
        /// </summary>
        /// <param name="dataWriterEngine">input structure contains data</param>
        private void WriteTimeSeriesData(IDataWriterEngine dataWriterEngine)
        {
            //TODO: MAX - FORSE E' QUESTA LA PARTE DA MODIFICARE!!

            try
            {
                bool AddedDatasetAttribute   = false;
                List <DataMessageObject> dmo = _tableResponse.GetNext();
                do
                {
                    if (dmo == null)
                    {
                        break;
                    }

                    //Aggiungo gli Attributi di Dataset
                    if (!AddedDatasetAttribute)
                    {
                        foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                        {
                            dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                        }
                        AddedDatasetAttribute = true;
                    }


                    //SERIE
                    if (CheckChanged(dmo))
                    {
                        dataWriterEngine.StartSeries();

                        foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                        {
                            dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString());
                        }

                        foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                        {
                            dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                        }
                    }

                    //OBSERVATION
                    DataMessageObject val = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);

                    DataMessageObject ObsVal = null;
                    if (string.IsNullOrEmpty(DimensionAtObservation) || new List <string> {
                        "TIME_PERIOD", "ALLDIMENSIONS"
                    }.Contains(DimensionAtObservation.Trim().ToUpper()))
                    {
                        ObsVal = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                        dataWriterEngine.WriteObservation(ObsVal.Val.ToString(), val.Val.ToString());
                    }
                    else
                    {
                        ObsVal = dmo.Find(dimT => dimT.ColImpl.Id.Trim().ToUpper() == DimensionAtObservation.Trim().ToUpper());
                        dataWriterEngine.WriteObservation(ObsVal.ColImpl.Id, ObsVal.Val.ToString(), val.Val.ToString());
                    }

                    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                    {
                        if (seriesAttribute.Val.ToString() != String.Empty)
                        {
                            dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                        }
                    }

                    dmo = _tableResponse.GetNext();
                } while (dmo != null);
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteTimeSeriesData, ex);
            }
        }
コード例 #7
0
        /// <summary>
        /// Write a DataMessage in XmlWriter
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                IRDFDataWriterEngine dataWriterEngine = null;
                switch (MessageType)
                {
                case MessageTypeEnum.Rdf:
                    dataWriterEngine = new RDFDataWriterEngine(writer.__SdmxXml);
                    break;
                }


                if (dataWriterEngine == null)
                {
                    throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.InternalError, new Exception("No Type Message recognized"));
                }

                DataStructureObjectImpl dsd = _retrievalManager._dsd;

                // start dataset
                dataWriterEngine.StartDataset(dsd.Immutated.TimeDimension.Id, _retrievalManager.DataFlowID, _retrievalManager._dsd.Id);



                //// Aggiungo dataset Title
                //if (FlyConfiguration.DatasetTitle && !string.IsNullOrEmpty(this._retrievalManager.DataFlowTitle))
                //    dataWriterEngine.WriteAttributeValue("Title", this._retrievalManager.DataFlowTitle);


                //Aggiungo gli Attributi di Dataset
                //bool AddedDatasetAttribute = false;
                this.LastSeriesKey = null;
                List <DataMessageObject> dmo = _tableResponse.GetNext();

                do
                {
                    if (dmo == null)
                    {
                        break;
                    }
                    //if (!AddedDatasetAttribute)
                    //{
                    //    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                    //        dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    //    AddedDatasetAttribute = true;
                    //}



                    //SERIE
                    //if (CheckChanged(dmo))
                    //{
                    List <string> Vals = new List <string>();
                    Vals.Add(RDFProvider.Constants.RDFConstants.RdfDataset + _retrievalManager.DataFlowID);
                    foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                    {
                        Vals.Add(seriesKey.Val.ToString());
                    }

                    dataWriterEngine.StartSeries(string.Join("/", Vals), _retrievalManager.DataFlowID);


                    foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                    {
                        if (seriesKey.ColImpl.ConceptDSDInfo != null)
                        {
                            dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString(), seriesKey.ColImpl.ConceptDSDInfo.CodelistVersion, seriesKey.ColImpl.ConceptDSDInfo.CodelistId);
                        }
                        else
                        {
                            dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString(), FlyConfiguration.Version, string.Format("CL_{0}", seriesKey.ColImpl.ConceptObjectCode));
                        }
                    }

                    //foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                    //    dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    //}

                    //OBSERVATION
                    DataMessageObject val  = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);
                    DataMessageObject time = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                    dataWriterEngine.RDFWriteObservation(time.ColImpl.ConceptObjectCode, time.Val.ToString(), val.Val.ToString());

                    //foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                    //    dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());

                    dmo = _tableResponse.GetNext();
                } while (dmo != null);


                dataWriterEngine.Close();
                writer.__SdmxXml.Flush();
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }
コード例 #8
0
        /// <summary>
        /// Write a DataMessage in XmlWriter
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                using (TextWriter tw = new StreamWriter(new MemoryStream()))
                {
                    DsplTextWriter        dsplTextWriter   = new DsplTextWriter(tw);
                    IDsplDataWriterEngine dataWriterEngine = null;
                    switch (MessageType)
                    {
                    case MessageTypeEnum.Dspl:
                        dataWriterEngine = new DsplBaseDataWriter(dsplTextWriter);
                        break;
                    }

                    try
                    {
                        if (dataWriterEngine == null)
                        {
                            throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.InternalError, new Exception("No Type Message recognized"));
                        }

                        DataStructureObjectImpl dsd = _retrievalManager._dsd;
                        IHeader header = FlyConfiguration.HeaderSettings.GetHeader();
                        dataWriterEngine.WriteHeader(header);

                        // start dataset
                        dataWriterEngine.SetDsdOrder(dsd.Immutated);
                        dataWriterEngine.StartDataset(_retrievalManager.GetDataflowFromSdmxObject(), dsd.Immutated, new DsplBaseDataWriter.RetreiveCodelistDelegate(GetCodelist));


                        dataWriterEngine.StartSeries(null);
                        List <DataMessageObject> dmo = _tableResponse.GetNext();
                        do
                        {
                            if (dmo == null)
                            {
                                break;
                            }

                            foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                            {
                                dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString());
                            }

                            //OBSERVATION
                            DataMessageObject val  = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);
                            DataMessageObject time = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                            dataWriterEngine.WriteObservation(time.Val.ToString(), val.Val.ToString());

                            dmo = _tableResponse.GetNext();
                        } while (dmo != null);


                        dataWriterEngine.CloseAndZip(writer.__DsplJSONTextWriter);
                        writer.__DsplJSONTextWriter.Flush();
                    }
                    catch (Exception ex)
                    {
                        throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteFlatData, ex);
                    }
                    finally
                    {
                        dataWriterEngine.ClearTempFolder();
                    }
                }
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }
コード例 #9
0
        public void WriteAttributes(DataMessageObject attributes)
        {
            var value = this.GetAttValPosition(attributes.ColId.ToString(), attributes.Val.ToString());

            WriteAttributeValue(attributes.ColId.ToString(), value);
        }
コード例 #10
0
        /// <summary>
        /// Write a TimeSeries Data
        /// </summary>
        /// <param name="dataWriterEngine">input structure contains data</param>
        private void WriteTimeSeriesData(SdmxJsonBaseDataWriter dataWriterEngine)
        {
            try
            {
                bool AddedDatasetAttribute   = false;
                List <DataMessageObject> dmo = _tableResponse.GetNext();
                do
                {
                    if (dmo == null)
                    {
                        break;
                    }

                    SettingValues(dmo, dataWriterEngine);

                    if (!AddedDatasetAttribute)
                    {
                        dataWriterEngine.StartElement("attributes", false);
                        foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                        {
                            dataWriterEngine.WriteAttributes(seriesAttribute);
                        }

                        AddedDatasetAttribute = true;
                        dataWriterEngine.CloseArray();
                        dataWriterEngine.StartSeries();
                    }
                    //SERIE
                    if (CheckChanged(dmo))
                    {
                        if (dataWriterEngine.StartedObservations)
                        {
                            dataWriterEngine.CloseObject();
                            dataWriterEngine.CloseObject();
                            dataWriterEngine._startedObservations = false;
                        }

                        dataWriterEngine.WriteSeriesKey(dmo);

                        // write series attributes
                        dataWriterEngine.StartElement("attributes", false);
                        foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                        {
                            dataWriterEngine.WriteAttributes(seriesAttribute);
                        }
                        dataWriterEngine.CloseArray();


                        if (!dataWriterEngine._startedObservations)
                        {
                            dataWriterEngine.StartElement("observations", true);
                            dataWriterEngine._startedObservations = true;
                        }
                    }
                    ////OBSERVATION
                    DataMessageObject val = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);

                    DataMessageObject ObsVal = null;

                    ObsVal = dmo.Find(dimT => dimT.ColImpl.Id.Trim().ToUpper() == DimensionAtObservation.Trim().ToUpper());
                    dataWriterEngine.WriteObservation(dataWriterEngine.GetObsValPosition(ObsVal.Val.ToString()), val.Val.ToString());
                    //Write Observation Attributes
                    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                    {
                        dataWriterEngine.WriteAttributes(seriesAttribute);
                    }

                    dataWriterEngine.CloseArray();


                    dmo = _tableResponse.GetNext();
                } while (dmo != null);
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteTimeSeriesData, ex);
            }
        }
コード例 #11
0
        /// <summary>
        /// Write a DataMessage in XmlWriter
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                IDataWriterEngine dataWriterEngine = null;
                switch (MessageType)
                {
                case MessageTypeEnum.Compact_20:
                    dataWriterEngine = new CompactDataWriterEngine(writer.__SdmxXml, SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwo));
                    break;

                case MessageTypeEnum.Generic_20:
                    dataWriterEngine = new GenericDataWriterEngine(writer.__SdmxXml, SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwo));
                    break;

                case MessageTypeEnum.CrossSectional_20:
                    break;
                }

                if (dataWriterEngine == null)
                {
                    throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.InternalError, new Exception("No Type Message recognized"));
                }


                // write header
                dataWriterEngine.WriteHeader(FlyConfiguration.HeaderSettings.GetHeader());

                // start dataset
                DataStructureObjectImpl dsd = _retrievalManager._dsd;
                dataWriterEngine.StartDataset(null, dsd.Immutated, null);

                // Aggiungo dataset Title
                if (FlyConfiguration.DatasetTitle && !string.IsNullOrEmpty(this._retrievalManager.DataFlowTitle))
                {
                    dataWriterEngine.WriteAttributeValue("Title", this._retrievalManager.DataFlowTitle);
                }



                this.LastSeriesKey = null;
                List <DataMessageObject> dmo = _tableResponse.GetNext();

                if (dmo != null)
                {
                    //Aggiungo gli Attributi di Dataset
                    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                    {
                        dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    }


                    //GROUPS
                    if (_retrievalManager.Groups != null && _retrievalManager.Groups.Count > 0)
                    {
                        foreach (DataGroupObject group in _retrievalManager.Groups)
                        {
                            dataWriterEngine.StartGroup(group.GroupId);
                            foreach (GroupReferenceObject GroupKey in group.DimensionReferences)
                            {
                                dataWriterEngine.WriteGroupKeyValue(GroupKey.ConceptCode, GroupKey.ConceptValue.ToString());
                            }

                            foreach (GroupReferenceObject GroupAttribute in group.AttributeReferences)
                            {
                                dataWriterEngine.WriteAttributeValue(GroupAttribute.ConceptCode, GroupAttribute.ConceptValue.ToString());
                            }
                        }
                    }

                    do
                    {
                        if (dmo == null)
                        {
                            break;
                        }

                        //SERIE
                        if (CheckChanged(dmo))
                        {
                            dataWriterEngine.StartSeries();

                            foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                            {
                                dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString());
                            }

                            foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                            {
                                dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                            }
                        }

                        //OBSERVATION
                        DataMessageObject val  = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);
                        DataMessageObject time = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                        dataWriterEngine.WriteObservation(time.Val.ToString(), val.Val.ToString());

                        foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                        {
                            if (seriesAttribute.Val.ToString() != String.Empty)
                            {
                                dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                            }
                        }

                        dmo = _tableResponse.GetNext();
                    } while (dmo != null);
                }

                dataWriterEngine.Close();
                writer.__SdmxXml.Flush();
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }