>>create cursor stylelist (style c(10),synonyms m) >>select styles >>scan >> select synonyms >> lcSynonym = "" >> scan while fk = styles.pk >> lcSynonyms = m.lcSynonyms + iif(empty(m.lcSynonyms),"",",") + synonyms.synonym >> endscan >> if _Tally > 0 >> lcSynonyms = "("+m.lcSynonyms+")" >> endif >> select styles >> insert into stylelist values (styles.style,m.lcSynonyms) >>endscan >>select stylelist >>browse >>>
using System; using System.Data; using System.Data.OleDb; using System.Text; namespace RelatedDataset { class Class1 { [STAThread] static void Main() { string strcon,strsql1,strsql2; strcon = @"Provider=VFPOLEDB;Data Source=C:\temp\"; // Just plain select strsql1 = "select * from Styles"; strsql2 = "select * from Synonyms"; DataSet ds = new DataSet(); OleDbConnection conn = new OleDbConnection(strcon); conn.Open(); OleDbDataAdapter daStyles = new OleDbDataAdapter(strsql1, conn); OleDbDataAdapter daSynonyms = new OleDbDataAdapter(strsql2, conn); daStyles.Fill(ds,"styles"); daSynonyms.Fill(ds,"synonyms"); conn.Close(); // Add a calculated column to Styles ds.Tables["Styles"].Columns.Add("mySynonyms", typeof(string)); // relate tables: Styles.pk -- synonyms.fk DataRelation myRel = new DataRelation("StyleSynonyms", ds.Tables["styles"].Columns["pk"], ds.Tables["synonyms"].Columns["fk"], false); ds.Relations.Add(myRel); // StringBuilder is optimized for string operations StringBuilder sb = new StringBuilder(); foreach (DataRow row in ds.Tables["Styles"].Rows) { sb.Length = 0; DataRow[] aRows = row.GetChildRows(myRel); // Collect synonyms for current row if (aRows.Length > 0) { sb.Append("("); } for (int childs=0;childs<aRows.Length;childs++) { if (childs > 0) { sb.Append(","); } sb.Append( ((string)aRows[childs]["synonym"]).Trim() ); } if (aRows.Length > 0) { sb.Append(")"); } // add collected to calculated column row["mySynonyms"] = sb.ToString(); } /* List from current styles table with added calculated column */ foreach(DataRow row in ds.Tables["styles"].Rows) { Console.WriteLine("Style:{0}\tSynonyms:{1}", row["style"],row["mySynonyms"]); } } } }PS: BTW this is VFP code to create test tables:
local ix,jx Create Table ("c:\temp\styles") free (Style c(10), pk i) Create Table ("c:\temp\synonyms") (synonym c(10), pk i) For ix =1 To 20 Insert Into ("c:\temp\styles") Values ('style'+Padl(m.ix,2,'0'),m.ix) For jx=1 To Int(Rand()*5) Insert Into ("c:\temp\synonyms") Values ('synonym'+Padl(m.jx,2,'0'),m.ix) Endfor EndforSynonyms might be 0-N with no practical limit I think.