[(vb).net] Columns in DataTable toevoegen en berekenen

Pagina: 1
Acties:
  • 132 views sinds 30-01-2008
  • Reageer

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Eigenlijk zit ik met twee probleempjes:

1. Ik heb een applicatie die een csv bestand inleest naar een Datatable. Hier staat een kolom met een tijd in.

Nu moet ik deze tijd (aantal seconden) vermenigvuldigen met een bedrag. Ik heb al een extra DataColumn toegevoegd aan de DataTable, deze moet volgens mij gevuld worden met behulp van de DataColumn.Expression variabele. Hoe vul ik deze DataColumn variabele nu?
Als ik het volgende doe: (Time is de columnname van de tijd kolom)
Visual Basic:
1
2
datatable.Columns.Add("Costs")
datatable.Columns("Costs").Expression = 0.54 * "Time"

Geeft hij een exception dat je een Decimal niet kunt vermenigvuldigen met een Date. Dit lijkt me inderdaad ook heel logisch, maar hoe kan ik die "Time" nu converten naar een aantal seconden?
En eigenlijk moet voor elke aparte row ook apart berekend kunnen worden wat de waarde is van die
kosten (waar nu dus 0.54 staat, moet veranderen naar gelang de waardes in andere kolommen op die row)

2. Als ik de CSV file inlees naar een DataTable haalt hij bij de kolom 'telefoonnummer' bij alle velden de eerste 0 weg.
Als ik de CSV inlees in Excel doet hij hetzelfde, pas als ik bij de wizard in Excel aangeef dat die kolom een String (tekst kolom) moet zijn in plaats van een Standaard Kolom doet hij het wel goed. Hoe kan ik dit nou in vb.net ook op die manier doen?

Ik heb geprobeerd de column van de DataTable van te voren het datatype System.String mee te geven. Maar dan zegt hij daarna vrolijk dat het een String is, terwijl er toch nog steeds geen 0 voor staat. Ik neem aan dat er met het inlezen van de CSV file iets verkeerds gaat. Dit doe ik als volgt:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  "Data Source=" & Application.StartupPath & ";" & _
  "Extended Properties=""Text;HDR=YES;"""

Conn = New System.Data.OleDb.OleDbConnection(ConnectionString)
Conn.Open()

Dim da As New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM bla.csv", Conn)

Dim ds As New DataSet("TextFiles")

da.Fill(ds, "CallData")

Dim dt As DataTable

dt = ds.Tables("CallData")

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

  1. DateDiff?
  2. Een string als datatype gebruiken voor een telefoonnummer of anders FormatNumber?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
-NMe- schreef op donderdag 29 september 2005 @ 20:35:
  1. Een string als datatype gebruiken voor een telefoonnummer of anders FormatNumber?
Dat heb ik al geprobeerd, maar hij geeft wel aan dat de kolom van het type string is, maar nog steeds geen 0 ervoor. In de csv staat er toch wel degelijk een 0 voor. En formatnumber is geen optie, aangezien er voor sommige nummers geen 0 moet komen.

[ Voor 8% gewijzigd door Rodyman op 29-09-2005 20:49 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

1. TimeSpan
2. Google met woorden "CSV "leading zero" C#", bijvoorbeeld http://www.dotnet247.com/247reference/msgs/45/225228.aspx ?

[ Voor 91% gewijzigd door gorgi_19 op 30-09-2005 08:51 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ok, volgens mij heb ik het probleem bij 1 niet helemaal goed uitgelegd.

Ik heb een datatable met de volgende kolommen:
code:
1
2
3
  id 
  duur 
  telefoonnummer


Hier wil ik een vierde kolom aan toevoegen met de kosten. Hier moet in komen te staan:
duur * kosten, waarbij de kosten afhangen van het telefoonnummer (06 of vaste lijn)

Maar volgens mij kan ik met het toevoegen van een kolom, dit niet mbv de expression variabale invoeren. Ik wil eigenlijk de hele table even doorlopen en voor elke row een waarde berekenen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Wel, je kan idd je table doorlopen.
code:
1
2
3
4
foreach( DataRow dr in myTable.Rows )
{
   // do stuff;
}

https://fgheysels.github.io/


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
whoami schreef op vrijdag 30 september 2005 @ 12:08:
Wel, je kan idd je table doorlopen.
code:
1
2
3
4
foreach( DataRow dr in myTable.Rows )
{
   // do stuff;
}
Ja maar als ik dan het volgende doe:

code:
1
2
3
For Each dr As DataRow In dt.Rows
  dr.Item("Costs") = (kosten * duur)
Next


Dan zegt hij dat item read-only is. Hoe kan ik dit nu wel wegschrijven?

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ok ik ben nu echt al 2 dagen aan het zoeken naar een oplossing, maar ik krijg het nog steeds niet voor elkaar.

Hoe moet ik nou een calculated column toevoegen aan een datagrid. Deze column moet dan berekend worden aan de hand van wat variabelen uit de andere columns en wat andere regels en variabelen. Oftewel, een function die de waarde teruggeeft.

Dit lijkt me toch niet zo moeilijk, in Delphi kun je gewoon precies aangeven hoe hij de waarde van die row moet vullen met behulp van een return waarde van een of andere functie.

Hoe doe ik dit nou in vb.net?

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
laat maar, ik heb de oplossing net zelf al gevonden.
Ik kan natuurlijk gewoon de datatable net na het ophalen van de gegevens vullen met een extra column. |:( |:(

Nu zit ik alleen nog met probleem 2. Hij blijft de 0 maar weghalen...

[ Voor 3% gewijzigd door Rodyman op 01-10-2005 18:20 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Rodyman schreef op zaterdag 01 oktober 2005 @ 18:20:
Nu zit ik alleen nog met probleem 2. Hij blijft de 0 maar weghalen...
Wat werkte er niet aan de links in [rml]gorgi_19 in "[ (vb).net] Columns in DataTable toevoege..."[/rml] ?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Nou daar plakken ze gewoon een 0 voor de waarde. Dat is niet de bedoeling, aangezien er ook telefoonnummers in de CSV file staan waar geen netnummer (dus geen 0) voor staat.

Ik moet gewoon die kolom als een string in zien te lezen ipv automatisch een type te laten geven.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Rodyman schreef op zaterdag 01 oktober 2005 @ 18:56:
[...]

Nou daar plakken ze gewoon een 0 voor de waarde. Dat is niet de bedoeling, aangezien er ook telefoonnummers in de CSV file staan waar geen netnummer (dus geen 0) voor staat.

Ik moet gewoon die kolom als een string in zien te lezen ipv automatisch een type te laten geven.
een .csv is in principe een tekstbestand; zelf het bestand inlezen en regel voor regel een datatable creeeren?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
gorgi_19 schreef op zaterdag 01 oktober 2005 @ 19:00:
[...]

een .csv is in principe een tekstbestand; zelf het bestand inlezen en regel voor regel een datatable creeeren?
Ja dat was mijn laatste optie die ik anders zou toepassen :) Maar het moet toch ook via de andere weg kunnen neem ik aan..

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
je kunt het toch in je query berekenen?

code:
1
SELECT a.field * b.field AS c FROM a...

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Slagroom schreef op zondag 02 oktober 2005 @ 02:35:
je kunt het toch in je query berekenen?

code:
1
SELECT a.field * b.field AS c FROM a...
Er moet niet echt iets berekenend worden. Er moet gekeken worden naar het telefoonnummer, en aan de hand daarvan moet de duur van het gesprek vermenigvuldigd worden met het betreffende tarief.

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ok, ik ben er net achter gekomen. De oplossing om columns van een bepaalde datatype te voorzien bij het inlezen van een CSV file is dat je een schema.ini file moet toevoegen aan de directory met de datatypes van de kolommen.

Zie: http://msdn.microsoft.com...dbcjetschema_ini_file.asp
Daar staat alles in.

Bedankt iedereen in ieder geval! Zonder jullie was ik hier nooit achter gekomen! _/-\o_
Pagina: 1