issue is solved, hope it will useful to them who are suffering with the same problem.
I have 2 sub reports accessing them from code using index 0 & 1 [for assign datasource runtime]. Index of subreports were inverted, so that datasource assignment was going wrong that's why in link parameter it was unable to find 'RecNo' because in that table there was not such field.
in practice prefer accessing subreport from code using name instead of index
when you will select subreport and see it's property[F4] there is a Name property it will give you name of subreport.
Dim orpt As New ReportDocument
Dim a = System.Reflection.Assembly.GetExecutingAssembly.Location
a = a.Substring(0, a.IndexOf("\bin\"))
dt.WriteXmlSchema(a & "\Reports\Receipt.xml")
Dim HeaderDT As DataTable
HeaderDT = DBGetData("select ...")
HeaderDT.WriteXmlSchema(a & "\Reports\HeaderRpt.xml")
orpt.Load(a & "\Reports\Receipt.rpt")
orpt.SetDataSource(dt)
orpt.Database.Tables(0).SetDataSource(dt)
orpt.Subreports("HeaderRpt.rpt").SetDataSource(HeaderDT)
orpt.Subreports("HeaderRpt.rpt").Database.Tables(0).SetDataSource(HeaderDT)
orpt.Subreports("Dtls.rpt").SetDataSource(dt)
orpt.Subreports("Dtls.rpt").Database.Tables(0).SetDataSource(dt)
orpt.Refresh()
CrystalReportViewer1.ReportSource = orpt
Happy Coding!
:)