| |
VB.NET - Ein- und UmsteigerRe: Spalte durchsuchen | | | Autor: Vegas85 | Datum: 05.09.16 01:04 |
| Habe den Code in zwei Teile Posten müssen wegen der 5kb begrenzung
' Versandkosten ermitteln Spalte 6 #########
'1.Schritt:
Dim val As String = row("SP_6").ToString
'1a.)
val = val.Replace("."c, ",")
'2.Schritt:
Dim dec As Decimal
'3.Schritt:
If Decimal.TryParse(val, dec) Then
'4. Schritt:
If dec <= 70 Then
orow("Versandkosten") = "5,9"
Else
orow("Versandkosten") = "0"
End If
Else
orow("Versandkosten") = "" 'Leerstring oder
' Missing-Kennung zuweisen
End If
' Preis ermitteln #########
'1.Schritt:
Dim val2 As String = row("SP_6").ToString
'1a.)
val2 = val2.Replace("."c, ",")
'2.Schritt:
Dim dec1 As Decimal
'3.Schritt:
If Decimal.TryParse(val2, dec1) Then
'4. Schritt:
If dec1 = 000 Then
orow("Preis") = row("SP_5")
End If
Else
orow("Preis") = "" 'Leerstring oder Missing-Kennung
' zuweisen
End If
' Stückzahl festlegen #########
'1.Schritt:
Dim val4 As String = row("SP_4").ToString
'1a.)
val4 = val4.Replace("."c, ",")
'2.Schritt:
Dim dec4 As Decimal
'3.Schritt:
If Decimal.TryParse(val4, dec4) Then
'4. Schritt:
If dec4 >= 20 Then
orow("Stückzahl") = "10"
End If
Else
orow("Stückzahl") = "" 'Leerstring oder Missing-Kennung
' zuweisen
End If
' EAN festlegen #########
'1.Schritt:
Dim val5 As String = row("SP_7").ToString
'1a.)
val5 = val5.Replace("."c, ",")
'2.Schritt:
Dim dec5 As Decimal
'3.Schritt:
If Decimal.TryParse(val5, dec5) Then
'4. Schritt:
If dec5 = Nothing Then
orow("EAN") = row("SP_7")
End If
Else
orow("EAN") = "Nicht zutreffend" 'Leerstring oder
' Missing-Kennung zuweisen
End If
' Tabelle Füllen #########
dtout.Rows.Add(orow)
'Ausgabe-Datensatz als Text aufbereiten
line.Clear()
For i As Integer = 0 To orow.ItemArray.Length - 1
line.Append(orow(i).ToString & ";")
Next i
Next rowindex
Catch ex As Exception
MessageBox.Show("Abbruch - Fehler: " & ex.Message)
Exit Sub
End Try
'Ausgabe als Text anzeigen
DataGridView1.DataSource = dtout
DataGridView1.CurrentCell = Nothing
DataGridView1.Rows(0).Visible = False
End If
End Sub
Beitrag wurde zuletzt am 05.09.16 um 01:06:09 editiert. | |
Spalte durchsuchen | | | Autor: Vegas85 | Datum: 04.09.16 21:19 |
| Hallo
Ich habe da ein kleines Problem wo ich leider grade nicht weiter komme.
Folgendes ich durchsuche eine Spalte z.b die SP_0 nach einem bestimmten Wort.
Wurde dieses Wort gefunden möchte ich in eine anderen Spalte z.b SP_2 durchsuchen,
alle Werte zwischen 2200 und 2300 sollen dann einen bestimmten Text bekommen.
Hier dazu mal mein Code
'1.Schritt: den Wert in der Zelle als String lesen
Dim val1 As String = row("SP_0").ToString
Dim val2 As String = row("SP_2").ToString
'1a.)
val1 = val1.Replace("."c, ",")
val2 = val2.Replace("."c, ",")
'2.Schritt: eine Dezimalzahl-Variable erstellen
Dim dec1 As Decimal
Dim dec2 As Decimal
'3.Schritt: Versuch, den String in die Dezimalvariable als
' Zahl einzutragen
If Decimal.TryParse(val1, dec1) Then
'4. Schritt: Bedingung prüfen in SP_0 nach dem Wert
' suchen.
If dec1 = "test" Then
'5.Schritt In SP_2 alle nummer zwischen 2200 und
' 2300 bekommen in Kato einen neuen Wert
If Decimal.TryParse(val2, dec2) Then
If dec2 >= 2200 And dec2 <= 2300 Then
orow("Kato") = "teeeeest2016" 'Zuweisung
' des gew. Wertes als String
End If
Else
orow("Kato") = "" 'Leerstring oder
' Missing-Kennung zuweisen
End If
End If
Else
orow("Kato") = "" 'Leerstring oder Missing-Kennung
' zuweisen
End If | |
Re: Spalte durchsuchen | | | Autor: Manfred X | Datum: 04.09.16 23:37 |
| Hallo!
Unter der Voraussetzung, daß die Spalte SP_2 einen numerischen Datentyp
besitzt, kann man eventuell einen Bindingsource-Filter für die Bearbeitung
der Datensätze verwenden.
Public Class frmFilter
Dim dt As New DataTable
Dim bs As New BindingSource
Dim dgv As New DataGridView With {.Parent = Me}
Private Sub frmFilter_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Testspalten und Testdaten
dt.Columns.Add("SP_0")
dt.Columns.Add("SP_1", GetType(Integer))
dt.Columns.Add("Kato")
dt.Rows.Add({"xxx", 1000, "a"})
dt.Rows.Add({"test", 1000, "b"})
dt.Rows.Add({"test", 2210, "c"})
dt.Rows.Add({"xxx", 2210, "d"})
dt.Rows.Add({"test", 2280, "e"})
dt.Rows.Add({"test", 2480, "f"})
bs.DataSource = dt
'Datensatz-Filter setzen
bs.Filter = "SP_0 = 'test' AND SP_1 >= 2200 AND SP_1 <= 2300"
'Gefilterte Datensätze bearbeiten
For i As Integer = 0 To bs.Count - 1
Dim r As DataRow = DirectCast(bs(i), DataRowView).Row
r("Kato") = "selected"
Next i
'Filter entfernen
bs.Filter = ""
dgv.DataSource = bs
End Sub
End Class | |
Re: Spalte durchsuchen | | | Autor: Vegas85 | Datum: 05.09.16 01:04 |
| Hatte vergessen zu sagen das mein Code auf diesen hier aufgebaut ist.
CSV-Editor
Ja die Spalte SP_2 ist ein numerischen Datentyp,
Also hier mal mein Code.
Gibt es eine möglichkeit die ganzen einzelne prüfungen wie EAN festlegen , Stückzahl festlegen usw. zu einer zusammenfügen ?
'Hauptfunktion #########
Private Function LoadCSV(file As String) As cDataTableCSV
'CSV Datei laden - ggf. Schlüssel festlegen
Dim dt As New cDataTableCSV
dt.TableName = IO.Path.GetFileNameWithoutExtension(file)
If Not dt.LoadFile(file, System.Text.Encoding.Default) Then Return _
Nothing
'dt.PrimaryKey = New DataColumn() {dt.Columns(0)}
Return dt
End Function
'CSV-File lesen #########
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
Dim file_open As New OpenFileDialog
file_open.Filter = "csv-dateien|*.csv"
file_open.AddExtension = True
If file_open.ShowDialog = DialogResult.OK Then
ds.Tables.Clear()
ds.Tables.Add(LoadCSV(file_open.FileName))
If Not ds.Tables.Count = 1 Then
MessageBox.Show("Eine Datei konnte nicht gelesen werden")
Exit Sub
End If
'Spalten in Ausgabedatei erstellen
dtout = New cDataTableCSV
dtout.Columns.Add("Action") : dtout.Columns.Add("Category")
dtout.Columns.Add("Title") : dtout.Columns.Add("Beschreibung")
dtout.Columns.Add("Kato")
'+++++++ Habe ich etwas gekürzt ++++++++++++
'Spalteninhalte einer Zeile als Zeichenfolge kombinieren
Dim line As New System.Text.StringBuilder
'Zeilen als Zeichenfolge kombinieren
Dim text As New System.Text.StringBuilder
dtout.Rows.Add({"*Action", "*Category", "*Title",
"*Description", "Kato"})
Try
For rowindex As Integer = 1 To ds.Tables(0).Rows.Count - 1
'zusätzliche Zeile einfügen
Dim row As DataRow = ds.Tables(0).Rows(rowindex)
'Ausgabedatensatz aufbauen
Dim orow As DataRow = dtout.NewRow
orow("Action") = "Add"
orow("Category") = KategoriennummerTextBox.Text
orow("Title") = row("SP_0") & " " & row("SP_1") & " " & _
ComboBox.Text & " - Art.Nr. " & row("SP_2")
orow("Beschreibung") = TextBox5.Text & row("SP_3").ToString _
& TextBox6.Text
'+++++++ Habe ich etwas gekürzt ++++++++++++ | |
Re: Spalte durchsuchen | | | Autor: Manfred X | Datum: 05.09.16 09:51 |
| 'Zwei Hilfsvariablen für die TryParse-Methode erstellen (vor der
' Datensatz-Schleife)
Dim st As Globalization.NumberStyles = _
Globalization.NumberStyles.AllowDecimalPoint
Dim cult As Globalization.CultureInfo = _
Globalization.CultureInfo.InvariantCulture
'In der Schleife: Für jeden Datensatz ... (row / orow)
'Initialisierungswerte zuweisen
orow("Versandkosten") = ""
orow("Preis") = ""
'Bedingungen für SP_6 bearbeiten
If Decimal.TryParse(row("SP_6").ToString, st, cult, dec) Then
If dec <= 70 Then
orow("Versandkosten") = "5,9"
Else
orow("Versandkosten") = "0"
End If
If dec = 0 Then
orow("Preis") = row("SP_5")
End If
End If
'.... weitere Bedingungen für andere Spalten entsprechend | |
Re: Spalte durchsuchen | | | Autor: Vegas85 | Datum: 05.09.16 10:18 |
| Moin,
Vielen Dank, damit kann ich nun mein Code ein wenig übersichtlicher machen.
Kann ich da nun auch den Bindingsource-Filter anwenden aus deinem ersten beitrag ?
Gibt es allgemein noch verbesserungs möglichkeiten bei meinem Code ? | |
Re: Spalte durchsuchen | | | Autor: Manfred X | Datum: 05.09.16 11:14 |
| Die Arbeitsweise des Bindingsource-Filters setzt voraus,
daß die Spalten in der angebundenen Datatable spezifische
Datentypen besitzen.
Du scheinst aber mit CSV-Dateien zu operieren.
Dabei werden die Daten allgemein als Zeichenfolgen geführt. | |
Re: Spalte durchsuchen | | | Autor: Vegas85 | Datum: 05.09.16 11:52 |
| Genau es wird eine CSV-Datei eingelesen.
In der Spalte 0 steht z.b "Test" und in der Spalte 2 Zahlen z.b "100, 2345, 5000 usw."
Nun soll in Spalte 0 nach "test" gesucht werden, wurde "test" gefunden sollen alle Zahlen zwischen 2300 und 2400 gesucht werden und anschließend in Spalte 3 ein neues Wort geschrieben werden.
Also muss ich mir Zeichenfolgen etwas genauer anschauen. | |
Re: Spalte durchsuchen | | | Autor: Vegas85 | Datum: 18.09.16 23:57 |
| Hallo,
Komme leider seit ein paar Tagen nicht weiter.
Wenn ich den Filter anwende, Bekomme nun bei folgendem Code:
Dim r As DataRow = DirectCast(bs(i), DataRowView).Row Diesen fehler angezeigt:
Abbruch - Fehler: Das Objekt des Typs "System.Data.DataViewManagerListItemTypeDescriptor" kann nicht in Typ "System.Data.DataRowView umgewandelt werden.
Wie kann ich denn den Fehler beheben ? | |
Re: Spalte durchsuchen | | | Autor: Vegas85 | Datum: 19.09.16 22:52 |
| Hallo,
Habe den Fehler gefunden, hatte die falsche DataSource
Läuft auch soweit fast wie es soll. Nur wird leider der Filter nicht richtig ausgeführt.
Bei "Art >= 1050 AND Art <= 1055" wird nach der 1055 einfach weiter in die Spalte Kato geschrieben.
Woran könnte das liegen?
Ist es auch möglich mehre Filter auf die gleiche DataSource anzuwenden? bzw. geht das auch einfacher, denn ich habe zwar in meinem Code diesen schon angewendet aber sieht nicht wirklich elegant aus.
Imports System
Imports System.IO
Imports System.Net
Imports System.Text
Public Class Form1
Dim ds As New DataSet
Dim dt1, dt2, dtout As cDataTableCSV
Private Function LoadCSV(file As String) As cDataTableCSV
'CSV Datei laden - ggf. Schlüssel festlegen
Dim dt As New cDataTableCSV
dt.TableName = IO.Path.GetFileNameWithoutExtension(file)
If Not dt.LoadFile(file, System.Text.Encoding.Default) Then Return _
Nothing
'dt.PrimaryKey = New DataColumn() {dt.Columns(0)}
Return dt
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
Dim file_open As New OpenFileDialog
file_open.Filter = "csv-dateien|*.csv"
file_open.AddExtension = True
If file_open.ShowDialog = DialogResult.OK Then
ds.Tables.Clear()
ds.Tables.Add(LoadCSV(file_open.FileName))
If Not ds.Tables.Count = 1 Then
MessageBox.Show("Eine Datei konnte nicht gelesen werden")
Exit Sub
End If
'Spalten in Ausgabedatei erstellen
dtout = New cDataTableCSV
dtout.Columns.Add("Mark") : dtout.Columns.Add("Art") : _
dtout.Columns.Add("Kato")
'Spalteninhalte einer Zeile als Zeichenfolge kombinieren
Dim line As New System.Text.StringBuilder
'Zeilen als Zeichenfolge kombinieren
Dim text As New System.Text.StringBuilder
dtout.Rows.Add({"Kato"})
Try
For rowindex As Integer = 1 To ds.Tables(0).Rows.Count - 1
'zusätzliche Zeile einfügen
Dim row As DataRow = ds.Tables(0).Rows(rowindex)
'Ausgabedatensatz aufbauen
Dim orow As DataRow = dtout.NewRow
orow("Mark") = row("SP_0")
orow("Art") = row("SP_2")
'Filter anwenden
Dim bs As New BindingSource
Dim bs2 As New BindingSource
bs.DataSource = dtout
bs2.DataSource = dtout
'Datensatz-Filter setzen
bs.Filter = "Mark = 'Haus' AND Art >= 1050 AND Art <= 1055"
bs2.Filter = "Mark = 'Wetter' AND Art >= 232334 AND Art" & _
"<= 232345"
'Gefilterte Datensätze bearbeiten
For i As Integer = 0 To bs.Count - 1
Dim r As DataRow = DirectCast(bs(i), DataRowView).Row
orow("Kato") = "selected"
Next i
For i As Integer = 0 To bs.Count - 1
Dim r As DataRow = DirectCast(bs2(i), DataRowView).Row
orow("Kato") = "Hallo"
Next i
'Filter entfernen
bs.Filter = ""
' Tabelle Füllen
dtout.Rows.Add(orow)
'Ausgabe-Datensatz als Text aufbereiten
line.Clear()
For i As Integer = 0 To orow.ItemArray.Length - 1
line.Append(orow(i).ToString & ";")
Next i
Next rowindex
Catch ex As Exception
MessageBox.Show("Abbruch - Fehler: " & ex.Message)
Exit Sub
End Try
'Ausgabe als Text anzeigen in DGV
DataGridView1.DataSource = dtout
End If
End Sub
End Class | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|