103
Views
7
Comments
Solved
Converting Record Lists to List
Question

Hi,

I am trying to write an extension that performs calculations on a list of information obtained by an external system.

My theory was to write it using LINQ in Integration Studio.

I wrote some Sample Functions which work in a normal C# application


    public decimal returnPremium(List<MyList> MyList)

        {

            var Premium = ssMyList.Where(item => item.Status == "Old").Sum(item => item.Premium);

            return Premium;

        }


However, I am passing a Record List into the Extension and looping round that to populate List<MyList>, trouble is, everytime I do this I seem to get results of 0, despite being decimals in my list.


This is how I populate this list I created


        public List<MyList> createList(RLOutsystemsRecordList myRecordList)

        {

            List<MyList> MyList = new List<MyList>();

            MyList myRecord= new MyList();

                myRecordList.Reset();

                myRecordList.StartIteration(); //Start iteration from the start

            while (!myRecordList.Eof)//indicates in the end of the list

            {

                //Access Current rec for the current information

                myRecord.Premium = myRecordList.CurrentRec.ssSTMyRecord.Premium;

                MyList.Add(myRecord);

                myRecordList.Advance();

            }

               

                myRecordList.EndIteration();

            return MyList;


        }


Should I be passing an Object into the Extension? Or have I missed something obvious?

Rank: #2155
Solution

Hi Killian.

The debug told me it was iterating successfully, so I knew the problem was with the Add.

After looking around, I found a solution. Effectively I needed to create a new record within the loop to ensure this was always being added.


public List<DecimalHolder> createDecimalList(RLDecimalRecordList ssDecimalList)

        {

            List<DecimalHolder> decimalList = new List<DecimalHolder>();

            RLDecimalRecordList newList = ssDecimalList;

            newList.Reset();

            newList.StartIteration();


            while(!newList.Eof)

            {

                DecimalHolder decimalRecord = new DecimalHolder();

                decimalRecord.DecimalValue= newList.CurrentRec.ssSTDecimal.ssDecimal;

                decimalList.Add(decimalRecord);

                newList.Advance();

            }


            newList.EndIteration();

           return decimalList; 


        }


Interestingly after reviewing with my colleagues, I did not need to create my own list as I could perform a LINQ query on said List by referencing System.Collections and System.Reflection


 public decimal AddUpList(List<DecimalHolder> decimalHolderList)

        {

            decimal ssSum = 0.0M;

            decimalHolderList.AsQueryable();

            ssSum = (from d in decimalHolderList

            select (decimal?)d.DecimalValue).Sum() ?? 0;

            return ssSum;

        }


Many thanks for all your help :)

mvp_badge
MVP
Rank: #2

Hi Edward,

At a first glance, that looks ok. You could pass an Object, but then you'd have to use reflection to get something out of it, so I'm not sure that would be the way to go.

Rank: #2155

Hi Killian,


Thanks for your reply. After spending a lot of the day debugging I've discovered that it only seems to be adding the last record, which in all my examples was 0. Hence the result of 0


I thought the Reset() would start the iteration again?


Edward

mvp_badge
MVP
Rank: #2

I don't think the Reset() is needed. See this very old post that is still valid, afaik. So I'm not sure why only the last record is added. I would advice you to add some debugging output to the logging, to see if it's really not being iterated, or the problem lies with the List<MyList> and the Add().

GenericExtendedActions.LogMessage(AppInfo.GetAppInfo().OsContext, "My message", "XXXX");
Rank: #2155

Hi Kilian. I'm able to get some results in Service Centre from the Logging. I will do more investigation and see if I can find the root cause.

Cheers


Ed

mvp_badge
MVP
Rank: #2

Thanks for the update, keep us posted!

Rank: #2155
Solution

Hi Killian.

The debug told me it was iterating successfully, so I knew the problem was with the Add.

After looking around, I found a solution. Effectively I needed to create a new record within the loop to ensure this was always being added.


public List<DecimalHolder> createDecimalList(RLDecimalRecordList ssDecimalList)

        {

            List<DecimalHolder> decimalList = new List<DecimalHolder>();

            RLDecimalRecordList newList = ssDecimalList;

            newList.Reset();

            newList.StartIteration();


            while(!newList.Eof)

            {

                DecimalHolder decimalRecord = new DecimalHolder();

                decimalRecord.DecimalValue= newList.CurrentRec.ssSTDecimal.ssDecimal;

                decimalList.Add(decimalRecord);

                newList.Advance();

            }


            newList.EndIteration();

           return decimalList; 


        }


Interestingly after reviewing with my colleagues, I did not need to create my own list as I could perform a LINQ query on said List by referencing System.Collections and System.Reflection


 public decimal AddUpList(List<DecimalHolder> decimalHolderList)

        {

            decimal ssSum = 0.0M;

            decimalHolderList.AsQueryable();

            ssSum = (from d in decimalHolderList

            select (decimal?)d.DecimalValue).Sum() ?? 0;

            return ssSum;

        }


Many thanks for all your help :)

mvp_badge
MVP
Rank: #2

Hi Edward,

Thanks for the feedback! I wouldn't have thought creating a new record would be necessary, but I did a quick Googling and apparently only a reference to the object is added to the list, so the behaviour makes sense. My OutSystems skills are way better than my .NET skills :).