Populate Nested Repeating Table Using Web Service Data - InfoPath Dev
in

InfoPath Dev

Populate Nested Repeating Table Using Web Service Data

Last post 01-28-2011 01:35 AM by Beircheart. 3 replies.
Page 1 of 1 (4 items)
Sort Posts: Previous Next
  • 08-03-2010 03:27 AM

    Populate Nested Repeating Table Using Web Service Data

    Hi all,

    I'm trying to populate a nested repeating table programmatically. I can populate a repeating table using the following code. However, I've been having difficulty populating the repeater nested within.

     

    SourceFieldArray = New String() {"PROG_FORMED_MOD_COL", "MOD_COL_SHORT_NAME", "MOD_COL_NAME", "PROG_MIN_VALUE", "PROG_MAX_VALUE"}

    DestFieldArray = New String() {"BundleCode", "BundleDesc", "ElectiveBundleName", "ElectiveBundleMin", "ElectiveBundleMax"}

    PopulateRepeatingTable("ProgrammeInfo", SecondaryPath + "ElectiveModules", SourceFieldArray, _
    "/my:ProgrammeForm/my:Structure/my:CoreStream/my:ElectiveBundlesSectionGroup", "ElectiveBundlesSection", DestFieldArray, "Nested")
    Sub PopulateRepeatingTable(ByVal DataSource As String, ByVal SourceXPath As String, ByVal SourceFields() As String, _
                                       ByVal DestXPath As String, ByVal DestTable As String, ByVal DestFields() As String, Optional ByVal Nested As String = "")
    
                Dim NodeIterator As XPathNodeIterator = DataSources(DataSource).CreateNavigator().Select(SourceXPath, NamespaceManager)
                Dim Field As String
    
                For Each Node As XPathNavigator In NodeIterator
    
                    Dim MyNamespace As String = NamespaceManager.LookupNamespace("my")
    
                    If Node Is Nothing Then
                        'Do Nothing
                    Else
                        Using Writer As XmlWriter = MainDataSource.CreateNavigator().SelectSingleNode(DestXPath, NamespaceManager).AppendChild()
    
                            Writer.WriteStartElement(DestTable, MyNamespace)
    
                            Dim i As Integer = 0
    
                            For Each Field In SourceFields
    
                                If Node.SelectSingleNode(SourceFields(i)) Is Nothing Then
                                    Writer.WriteElementString(DestFields(i), MyNamespace, "")
                                Else
                                    Writer.WriteElementString(DestFields(i), MyNamespace, Node.SelectSingleNode(SourceFields(i)).ToString)
                                End If
                                i = i + 1
    
                            Next
    
                            Writer.WriteEndElement()
                            Writer.Close()
    
                        End Using
    
                    End If
    
                Next
    
            End Sub
    

     


    Repeater XPath:
    "/my:ProgrammeForm/my:Structure/my:CoreStream/my:ElectiveBundlesSectionGroup/my:ElectiveBundlesSection" (Yes, the repeater is called ElectiveBundlesSection. I must rename to something a bit better)

    Nested Repeater XPath:
    "my:ProgrammeForm/my:Structure/my:CoreStream/my:ElectiveBundlesSectionGroup/my:ElectiveBundlesSection/my:ElectiveBundlesGroup/my:ElectiveBundles"

    I keep running in to a NullException... Whichever repeater I populate first, populates successfully e.g. I can call the function to populate the nested repeater but if i call the function again to populate the parent, a Null Exception is encountered. Same thing happens in reverse.

    The XmlWriter appears to be creating only certain fields for a node and then when I try to populate either nested fields or parent fields of that node, it can't seem to find them. I don't really understand how it works so here I am! :)

    This is a project for work and i need to have it sorted out asap. I'd really appreciate advice on this.

    Thanks a million,

    Ben

  • 08-06-2010 06:55 AM In reply to

    Re: Populate Nested Repeating Table Using Web Service Data

    Hi again,

    Problem solved. Writing the entire XML group as a string and then appending that using AppendChild rather than appending one row at a time worked for me. I was working off (Pretty much copied) the work done here: (Thanks Hilary)

    http://www.infopathdev.com/blogs/hilary/archive/2008/07/04/how-do-i-copy-repeating-data-from-an-external-source-into-my-form.aspx

    Here is my own end product in case it helps anyone else:

    Sub PopulateElectiveBundles()

    Dim SourceXPath As XPathNodeIterator = Me.DataSources("ProgrammeInfo").CreateNavigator().Select("/dfs:myFields/dfs:dataFields/tns:ProgrammeInfoResponse/tns:ProgrammeInfoResult/Programme/ElectiveModules[not(MOD_COL_NAME=preceding-sibling::ElectiveModules/MOD_COL_NAME)]", NamespaceManager)

    Dim DestXPath As XPathNavigator = MainDataSource.CreateNavigator().SelectSingleNode("/my:ProgrammeForm/my:Structure/my:CoreStream/my:ElectiveBundlesSectionGroup", NamespaceManager)

    For Each Node As XPathNavigator In SourceXPath

    Try

    Dim ElecBundleCode As String = Node.SelectSingleNode("PROG_FORMED_MOD_COL", NamespaceManager).Value

    Dim ElecBundleDesc As String = Node.SelectSingleNode("MOD_COL_SHORT_NAME", NamespaceManager).Value

    Dim ElecBundleName As String = Node.SelectSingleNode("MOD_COL_NAME", NamespaceManager).Value

    Dim ElecBundleMin As String = Node.SelectSingleNode("PROG_MIN_VALUE", NamespaceManager).Value

    Dim ElecBundleMax As String = Node.SelectSingleNode("PROG_MAX_VALUE", NamespaceManager).Value

    Dim ElecBundleXml As String = "<my:ElectiveBundlesSection xmlns:my='http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-11-14T14:21:59'>" & _

    "<my:BundleCode>" & ElecBundleCode & "</my:BundleCode>" & _

    "<my:BundleDesc>" & ElecBundleDesc & "</my:BundleDesc>" & _

    "<my:ElectiveBundleName>" & ElecBundleName & "</my:ElectiveBundleName>" & _

    "<my:ElectiveBundleMin>" & ElecBundleMin & "</my:ElectiveBundleMin>" & _

    "<my:ElectiveBundleMax>" & ElecBundleMax & "</my:ElectiveBundleMax>" & _

    "<my:ElectiveBundlesGroup>"

    ' Get Modules for this Bundle

    Dim ElecBundle As XPathNodeIterator = Me.DataSources("ProgrammeInfo").CreateNavigator().Select("/dfs:myFields/dfs:dataFields/tns:ProgrammeInfoResponse/tns:ProgrammeInfoResult/Programme/ElectiveModules[PROG_FORMED_MOD_COL = '" + ElecBundleCode + "']", NamespaceManager)

    For Each ElecModule As XPathNavigator In ElecBundle

    Dim ElecYear As String = ElecModule.SelectSingleNode("PROG_YEAR", NamespaceManager).Value

    Dim ElecSemester As String = ElecModule.SelectSingleNode("PROG_ELEM_PERIOD", NamespaceManager).Value

    Dim ElecModCode As String = ElecModule.SelectSingleNode("MOD_ELEM_CODE", NamespaceManager).Value

    DataSources("Module Info").CreateNavigator().SelectSingleNode("/dfs:myFields/dfs:queryFields/tns:ReturnModuleInfo/tns:ModuleCode", NamespaceManager).SetValue(ElecModCode)

    Dim ElecModTitle As String = DataSources("Module Info").CreateNavigator().SelectSingleNode("/dfs:myFields/dfs:dataFields/tns:ReturnModuleInfoResponse/tns:ReturnModuleInfoResult/Modules/ModuleInfo/MOD_NAME", NamespaceManager).Value

    Dim ElecModLevel As String = DataSources("Module Info").CreateNavigator().SelectSingleNode("/dfs:myFields/dfs:dataFields/tns:ReturnModuleInfoResponse/tns:ReturnModuleInfoResult/Modules/ModuleInfo/LEV_CODE", NamespaceManager).Value

    Dim ElecModEcts As String = DataSources("Module Info").CreateNavigator().SelectSingleNode("/dfs:myFields/dfs:dataFields/tns:ReturnModuleInfoResponse/tns:ReturnModuleInfoResult/Modules/ModuleInfo/MOD_CRDT", NamespaceManager).Value

     

    ElecBundleXml +=
    "<my:ElectiveBundles>" & _

    "<my:ElecYear>" & ElecYear & "</my:ElecYear>" & _

    "<my:ElecSemester>" & ElecSemester & "</my:ElecSemester>" & _

    "<my:ElecModCode>" & ElecModCode & "</my:ElecModCode>" & _

    "<my:ElecModTitle>" & ElecModTitle & "</my:ElecModTitle>" & _

    "<my:ElecModLevel>" & ElecModLevel & "</my:ElecModLevel>" & _

    "<my:ElecModEcts>" & ElecModEcts & "</my:ElecModEcts>" & _

    "<my:ElecBundleCode>" & ElecBundleCode & "</my:ElecBundleCode>" & _

    "<my:ElecBundleDesc>" & ElecBundleDesc & "</my:ElecBundleDesc>" & _

    "<my:ElecBundleName>" & ElecBundleName & "</my:ElecBundleName>" & _

    "<my:ElecBundleMin>" & ElecBundleMin & "</my:ElecBundleMin>" & _

    "<my:ElecBundleMax>" & ElecBundleMax & "</my:ElecBundleMax>" & _

    "</my:ElectiveBundles>"

    Next

    ElecBundleXml += "</my:ElectiveBundlesGroup></my:ElectiveBundlesSection>"

    Dim TempXmlDoc As New XmlDocument()

    TempXmlDoc.LoadXml(ElecBundleXml)

    Dim ElecBundleChild As XPathNavigator = TempXmlDoc.CreateNavigator().SelectSingleNode("/my:ElectiveBundlesSection", NamespaceManager)

    DestXPath.AppendChild(ElecBundleChild)

    Catch ex As Exception

    Console.WriteLine(ex)

    End Try

    Next

    End Sub

  • 01-27-2011 03:09 PM In reply to

    Re: Populate Nested Repeating Table Using Web Service Data

    Your populate nested repeating table code really helped me, exactly what I was trying to do also, thanks.

    this might also help someone to see the xml structure of your data when you manually save you data to an xml file:

    public void SaveXML(string filePath, string sourceXpath)

    {

    XPathNavigator myRoot = MainDataSource.CreateNavigator();

    XPathNavigator node = myRoot.SelectSingleNode(sourceXpath, NamespaceManager);

    using (StreamWriter sw = new StreamWriter(filePath))

    {

    sw.Write(node.OuterXml.ToString());

    sw.Flush();

    sw.Close();

    }
    }

  • 01-28-2011 01:35 AM In reply to

    Re: Populate Nested Repeating Table Using Web Service Data

    Glad to hear it Hamish

    Thanks for taking the time to let me know

Page 1 of 1 (4 items)
Copyright © 2003-2019 Qdabra Software. All rights reserved.
View our Terms of Use.