Revit API Forum
Welcome to Autodesk’s Revit API Forums. Share your knowledge, ask questions, and explore popular Revit API topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Compare and combine datatables

6 REPLIES 6
SOLVED
Reply
Message 1 of 7
HD12310
743 Views, 6 Replies

Compare and combine datatables

HD12310
Contributor
Contributor

Hi i have to datatables - two columns in each table.

The first column in both is guid.

I need to compare the guids in these two tables.

And return one datatable witch contains the second columns from each table.

To combine data from two tables where the guid is equal.

(Note: it doesnt have to be datatables, could be string arrays or whatever really.)

 

This code below never returns isEq=true - anyone has some code that can do this ?

 

bool isEq;

 

foreach(DataRow r_row in dtRvtPfv.Rows)
{
foreach (DataColumn r_col in dtRvtPfv.Columns)
{
if (r_col.ColumnName == BuiltInParameter.IFC_GUID.ToString())
{
if (r_row[r_col] != null)
{
isEq = dtTeklaPfv.Select().ToList().Exists(row => row["GUID"].ToString() == r_row[r_col].ToString());

if (isEq)
{
TaskDialog.Show("Guid match", r_row[r_col].ToString());

}
}
}
}
}

0 Likes

Compare and combine datatables

Hi i have to datatables - two columns in each table.

The first column in both is guid.

I need to compare the guids in these two tables.

And return one datatable witch contains the second columns from each table.

To combine data from two tables where the guid is equal.

(Note: it doesnt have to be datatables, could be string arrays or whatever really.)

 

This code below never returns isEq=true - anyone has some code that can do this ?

 

bool isEq;

 

foreach(DataRow r_row in dtRvtPfv.Rows)
{
foreach (DataColumn r_col in dtRvtPfv.Columns)
{
if (r_col.ColumnName == BuiltInParameter.IFC_GUID.ToString())
{
if (r_row[r_col] != null)
{
isEq = dtTeklaPfv.Select().ToList().Exists(row => row["GUID"].ToString() == r_row[r_col].ToString());

if (isEq)
{
TaskDialog.Show("Guid match", r_row[r_col].ToString());

}
}
}
}
}

6 REPLIES 6
Message 2 of 7
jeremytammik
in reply to: HD12310

jeremytammik
Autodesk
Autodesk

Dear Hd12310,

 

Happy New Year to you!

 

Sorry, I find both your question and your code hard to comprehend, so I cannot really answer it in this state.

 

Best regards,

 

Jeremy



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

0 Likes

Dear Hd12310,

 

Happy New Year to you!

 

Sorry, I find both your question and your code hard to comprehend, so I cannot really answer it in this state.

 

Best regards,

 

Jeremy



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Message 3 of 7
HD12310
in reply to: jeremytammik

HD12310
Contributor
Contributor

 

 

Thanks for reply Jeremy.

Basically im trying to update elements based on their guid.

 

The elements have been exported to IFC - and sent to Tekla.

Tekla evaluates the elements and produce an status report for each element.

 

I have the Revit elements in one table and the tekla report in another table.

I need to copy the Tekla status from one dataTable to the other dataTable - by matching their guids like this:

 

DataTable1

guid                   status

287A628346     OK

387A628346     NOT_OK

 

DataTable2

guid                   ElementId

287A628346     Family1

387A628346     Family1

 

The goal is to compare and combine DataTable1 and DataTable2 - to get DataTable3

DateTable3

guid                   ElementId     status

287A628346     Family1         OK

387A628346     Family1         NOT_OK

 

 

I realize its not really a core Revit API question so i will be digging into some MSDN forums for this as well.

 

 

0 Likes

 

 

Thanks for reply Jeremy.

Basically im trying to update elements based on their guid.

 

The elements have been exported to IFC - and sent to Tekla.

Tekla evaluates the elements and produce an status report for each element.

 

I have the Revit elements in one table and the tekla report in another table.

I need to copy the Tekla status from one dataTable to the other dataTable - by matching their guids like this:

 

DataTable1

guid                   status

287A628346     OK

387A628346     NOT_OK

 

DataTable2

guid                   ElementId

287A628346     Family1

387A628346     Family1

 

The goal is to compare and combine DataTable1 and DataTable2 - to get DataTable3

DateTable3

guid                   ElementId     status

287A628346     Family1         OK

387A628346     Family1         NOT_OK

 

 

I realize its not really a core Revit API question so i will be digging into some MSDN forums for this as well.

 

 

Message 4 of 7
jeremytammik
in reply to: HD12310

jeremytammik
Autodesk
Autodesk
Accepted solution

Hi Hd12310,

 

Personally, I would create two generic .NET dictionaries keyed on the GUIDs.

 

Loop through one of the dictionaries, check whether the other dictionary has a corresponding entry.

 

If not, you are done. If yes, do your thing.

 

Cheers,

 

Jeremy



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Hi Hd12310,

 

Personally, I would create two generic .NET dictionaries keyed on the GUIDs.

 

Loop through one of the dictionaries, check whether the other dictionary has a corresponding entry.

 

If not, you are done. If yes, do your thing.

 

Cheers,

 

Jeremy



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Message 5 of 7
HD12310
in reply to: jeremytammik

HD12310
Contributor
Contributor

Thanks.

I ended up using the datatables directly and lopped through the rows.

Heres the working sample code if anyone is interrested.

From there on i could create a 3. datatable or just expand dtA with values from dtB.

           

            string guid_a = "";  //in datatable dtA
            string guid_b = "";  //in datatable dtB

            foreach(DataRow a_row in dtA.Rows)
            {
                guid_a = (string)a_row["GUID"];

                foreach(DataRow b_row in dtB.Rows)
                {
                    guid_b = (string)b_row["GUID"];

                    if(guid_a.Equals(guid_b))
                    {
                        //we have a match
                    }
                }
            }

0 Likes

Thanks.

I ended up using the datatables directly and lopped through the rows.

Heres the working sample code if anyone is interrested.

From there on i could create a 3. datatable or just expand dtA with values from dtB.

           

            string guid_a = "";  //in datatable dtA
            string guid_b = "";  //in datatable dtB

            foreach(DataRow a_row in dtA.Rows)
            {
                guid_a = (string)a_row["GUID"];

                foreach(DataRow b_row in dtB.Rows)
                {
                    guid_b = (string)b_row["GUID"];

                    if(guid_a.Equals(guid_b))
                    {
                        //we have a match
                    }
                }
            }

Message 6 of 7
GonçaloFeio1321
in reply to: HD12310

GonçaloFeio1321
Enthusiast
Enthusiast

A more complicated solution, but with cleaner code would be using Linq instead or recursive loops:

http://msdn.microsoft.com/en-us/library/bb386943(v=vs.110).aspx

http://stackoverflow.com/questions/24020981/linq-query-multiple-datatables-in-dataset

 

0 Likes

A more complicated solution, but with cleaner code would be using Linq instead or recursive loops:

http://msdn.microsoft.com/en-us/library/bb386943(v=vs.110).aspx

http://stackoverflow.com/questions/24020981/linq-query-multiple-datatables-in-dataset

 

Message 7 of 7
HD12310
in reply to: GonçaloFeio1321

HD12310
Contributor
Contributor
Tnx - especially the msdn link har some great examples
0 Likes

Tnx - especially the msdn link har some great examples

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report