DataTable And Two Row Sorting - vb.net

So the boss comes to me and says "I want the value of each agent and the project on one line and the average of all the other agents on the next line so I can easily see if they are above or below average."
the table looks like this:
dt.Columns.Add("AGENT", GetType(String))
dt.Columns.Add("PROJECT", GetType(String))
dt.Columns.Add("Sales", GetType(Integer))
dt.Columns.Add("Declines", GetType(Integer))
dt.Columns.Add("Margin", GetType(Integer))
Ok its all good. One row in the datatable is the agent and project. The next row is the average of all the other agents and project like so:
row 1:
John Smith,
ProjectName,
(other column values)
row 2:
John Smith,
ProjectName & " AVERAGE/TOTAL",
(other column values)
The project name is removed in the SSRS report on the AVERAGE/TOTAL line because of space constraints on the piece of paper it is printed on.
I do the sorting by our standard way of sorting a datatable.
Dim dataView As New DataView(dt1)
dataView.Sort = "AGENT,PROJECT"
dt1 = dataView.ToTable
Return dt1
But now the boss has a new requirement later on. He wants to be able to sort by other columns in the table but keep the two rows the (agent/project and the agent/project AVERAGE/TOTAL) together. So in essence he wants to be able to sort not by one row but the two rows together but the sort value could be "AGENT,Margin". Obviously to keep the two rows together I have to find a way to sort the Project value too.
So I am stumped and would appreciate any thoughts you might have. C# ideas are welcome as well.LINQ is fine but it is going to have to become a datatable.

so you create two tables. One with the row values one one with the average values. Loop through the row values and then do another loop inside that loop to match project names. Its a hack but it worked.
If SortValue = "Default" Then
dt1.Merge(dt)
Dim dataView As New DataView(dt1)
dataView.Sort = "AGENT,PROJECT"
dt1 = dataView.ToTable
Else
Dim dataView As New DataView(dt)
dataView.Sort = SortValue
dt = dataView.ToTable
Dim dtCopy As New DataTable
dtCopy = dt.Clone
For Each row As DataRow In dt.Rows
dtCopy.ImportRow(row)
For i = 0 To dt1.Rows.Count - 1
If dt1.Rows(i).Item("PROJECT").ToString.Replace(" AVERAGE/TOTAL", "") = row.Item("PROJECT") And dt1.Rows(i).Item("AGENT") = row.Item("AGENT") Then
dtCopy.Rows.Add(dt1.Rows(i).Item("AGENT"), dt1.Rows(i).Item("PROJECT"), dt1.Rows(i).Item("SALES"), dt1.Rows(i).Item("Declines"), dt1.Rows(i).Item("Margin"))
End If
Next
Next
dt1 = dtCopy
End If

Related

when I choose a value from the first compbox is the value of the remaining compbox is changed

I have 3 compobboxes I have created an import code from a SQL table
The problem when I choose a value from the first compbox
the values of other compbox is changed to be like my choice
I made a separate code for each compbox
But I find it impractical because my project has 90 compoboxes
It needs time to run
Is there a more practical solution?
this is my code...
Dim com As New SqlCommand("select Distinct Name1 from TB_dr", Con)
Dim RD As SqlDataReader = com.ExecuteReader
Dim DT As DataTable = New DataTable
DT.Load(RD)
ComboBox1.DisplayMember = "Name1"
ComboBox1.DataSource = DT
ComboBox2.DisplayMember = "Name1"
ComboBox2.DataSource = DT
ComboBox3.DisplayMember = "Name1"
ComboBox3.DataSource = DT
Only populate a combobox on its dropdown event.
That will make your app faster cause your client may not use them all and if he uses one combobox he would populate a small amount of data only.
And no data is populated on load.
As i look at what you are trying to do which is same data for all comboboxes, you can simply put all your comboboxes in a group, and go through your group to populate them all at once.
like for each cb in that group, cb.datasource = dt.
call the datatable once

Adding New Row and inserting data to row

I have an existing datatable with two columns predefined.
Example:
Column 1 = Name
Column 2 = Surname
No rows are currently in my data table.
Datatable.Rows.Add - Will add a row to my collection
Now I want to write to the current row added and column 1 (Name) with text "Bob" then write to current row and column 2 (Surname) with text "smith"
I can't seem to figure out how to do this. Any help is greatly appreciated.
You can add a DataRow with the specified information :
Dim dtTable As New DataTable
'create a new data row.
Dim drNewRow As DataRow = dtTable.NewRow
'specify the information of the new row.
drNewRow("Name") = "Bob"
drNewRow("Surname") = "Smith"
'add the new row with specified information to the table.
dtTable.Rows.Add(drNewRow)

Generate age from sql server. VB.NET

Can you tell me how to get ages from 0-5 and so on from sql server and input the total in a textbox or label? please click the link for sample
Generate Ages
thank you!
Do you mean something like
Dim sql As String = "SELECT age_column FROM your_table WHERE age_column BETWEEN '0' AND '5'"
'The above line selects the all records where age is between 0-5 (Change the variables)
Dim da As New OleDbDataAdapter(sql, connectionstring)
Dim ds As New DataSet
Dim dt as new DataTable
da.Fill(ds)
dt = ds.Tables(0).Copy()
' Above code stores the results in an iterable table
Dim i As Integer = 0
For Each dr as DataRow in dt.Rows
i = i + 1
Next
TextBox1.Text = i
'i will be the total number of records where age is between 0-5, and display it in a `TextBox`
Your question is, however, very poor, and normally people would not put too much effort into answering it, since you've put no effort in yourself.

Dynamically Adding a Column to existing DataTable in Vb.net

I am Working with Vb.Net Project, through Web Service call method I get the result in DataTable's Object , now I need to add more columns after local calculations, I m doing all in loops and adding one by column's data through loop or modifying it, for a larger DataTable its too time taking.
Is there any logic that I add those columns in one go rather traversing each DataRow?
Suppose I have a DataTable with 4 columns, (Name = dt)
I need to add two more into it.
for 2000 rows I have to go for each row to initialize the value of newly added columns.
****Suppose I have calculations of new tentative columns into a Temp table.
Is There any way so I can update the values of newly added columns (added into dt)by joins The tables (inside VB.NET code) on the bases of a common column (Primary Key Column)****
Suppose I have calculations of new tentative columns into a Temp
table. Is There any way so I can update the values of newly added
columns (added into dt)by joins The tables (inside VB.NET code) on the
bases of a common column (Primary Key Column)
If the tempTbl is within the same DataSet as your primary Table (containing the Data), and you've got a 1:1 matching key relationship: yes, you can.
Add a DataRelation between your two tables within the DataSet and use it to retrieve a combined DataRow, containing the columns of all related tables.
' the variables
Dim DSet As DataSet = New DataSet("DSet")
Dim DTbl1 As DataTable = New DataTable("One")
Dim DTbl2 As DataTable = New DataTable("Two")
Dim DRelation As DataRelation
' setting up sample tables
DTbl1.Columns.Add("SaleID", GetType(Integer))
DTbl1.Columns.Add("ProductName", GetType(String))
DTbl1.Columns.Add("AmountSold", GetType(Double))
DTbl1.Columns.Add("ItemPrice", GetType(Double))
DTbl2.Columns.Add("SaleID", GetType(Integer))
DTbl2.Columns.Add("Turnover", GetType(Double))
' host this DataTables in the DataSet
DSet.Tables.Add(DTbl1)
DSet.Tables.Add(DTbl2)
' this is the exiting part: adding primary keys...
' the DataTable.PrimaryKey-property is an Array of DataRow, so I just initialize a new array containing the one column I would like to set as primary key for this table.
DTbl1.PrimaryKey = {DTbl1.Columns("SaleID")}
DTbl2.PrimaryKey = {DTbl2.Columns("SaleID")}
' ...and the DataRelation
DRelation = New DataRelation("SaleIDRelation", DSet.Tables("One").Columns(0), DSet.Tables("Two").Columns(0))
DSet.Relations.Add(DRelation)
' populate Tbl1 with some sample data
DTbl1.Rows.Add(1, "Eggs", 4, 0.2)
DTbl1.Rows.Add(2, "Apples", 5, 0.5)
DTbl1.Rows.Add(3, "Milk", 5, 1)
' do the calculation
For Each DRow As DataRow In DSet.Tables("One").Rows
' I personally prefer to keep iteration variables scope inside the loops, so the variable can get catched by the GarbegeCollector as soon as the loop is left
Dim tPrice As Double = 0
' I also prefer not to rely on implicit conversion
tPrice = Convert.ToDouble(DRow("AmountSold")) * Convert.ToDouble(DRow("ItemPrice"))
' for each row processed by the loop, add a row to the second table to store the calculations result
' this row should have the same SaleID, so the DataReleation will be able to relate the two rows together later on
DTbl2.Rows.Add(DRow("SaleID"), tPrice)
Next
' so now you'll be able to get the according DataRow(s) of the second table by retriving the depending ChildRows through the DataRelation
For Each DRow As DataRow In DSet.Tables("One").Rows
Console.WriteLine(String.Format("Product {0} in SaleID {1} has made a total turnover of {2}", DRow("ProductName"), DRow("SaleID"), DRow.GetChildRows("SaleIDRelation")(0)("Turnover")))
Next
Output:
Product Eggs in SaleID 1 has made a total turnover of 0,8
Product Apples in SaleID 2 has made a total turnover of 2,5
Product Milk in SaleID 3 has made a total turnover of 5
The real magic is happening within the loop for the output. I'm accessing the desired value of the first child row, because due to the 1:1 DataRelation, I have made sure that each DataRow in Tbl1 has a pedant in Tbl2 that has the same SaleID.
So what I do is DRow.GetChildRows("SaleIDRelation")(0)("Turnover"):
For DRow (this DataRow)
Get the related ChildRows, using the DataRelation named "SaleIDRelation"
Use the first ChildRow that is found, indicated by (0)
And of that DataRow, I would like to have the value of the column ("Turnover")

navigating through records on a database

Simplest way how to loop and display through records using textbox, combo box and datetimepicker.
Below is a code but still cant figure it out
Dim dr As DataRow
Dim ds As Dataset
Dim dt As DataTable
<code to fill the dataset>
dt = ds.Tables(0)
For Each dr In dt.Rows
Console.WriteLine (dr("ColName"))
Next
ds.Dispose()
You need two loops to do this - an outer loop for the number of rows in the table, and an inner loop for the columns in each row.
You have the For Each for the rows already, but you need to know how many columns are in the DataRow, and print out the value in each column. You can get the count of columns from the DataTable.
Dim cols As Integer
cols = dt.Columns.Count - 1
For Each dr in dt.Rows
For i As Integer = 0 To cols
Console.WriteLine(dr(i).ToString())
Next
Next
Notice that I call ToString() on the value returned from each column, and reference the column by it's ordinal. When you access a specific column in the DataRow, it returns an Object, so you'll need to cast that value to the correct data type for use in your program.
The code you posted would have only printed the value for the column that had "ColName" as it's column name for each row. If you didn't have a column named "ColName" then you would see an error.