Autor Beitrag
Marc Dirk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 19.04.10 11:14 
Hi,

ich hab mal wieder ne Frage die Ihr bestimmt aus dem Effeff beantworten könnt. Ich tue mich jedoch leider noch sehr sehr schwer damit.

Ich habe eine Tabelle aus lauter Strings. In der Spalte cArtNr sind alle Artikelnummern abgelegt. Ich möchte nun auf eine sehr schnelle und einfache Weise wissen wie ich die höchste Artikelnummer erfahre.

Ich bin bis hier gekommen:

ausblenden C#-Quelltext
1:
maxArtNr = (Int32)dt.Compute("Max(cArtNr)""??");					


Ich weiß nicht was ich in den String filter schreiben soll und ob der String expression so richtig ist.
Die Tabelle besteht aus zwei Spalten. An Position 0 ist Spalte cArtNr und an Position 1 die Spalte cLiefArtNr

Wer kann mir hier helfen? Danke!

Marc
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 19.04.10 11:25 
Hallo Marc,

der Filter wird in der SDK-Doku/MSDN/Hilfe nicht genauer beschrieben. Versuche einmal null oder String.Empty oder "1=1"; denn du willst ja vermutlich alle Zeilen auswerten.

Der Ausdruck scheint mir korrekt zu sein. Aber wenn es sich wirklich um eine String-Spalte handelt, bekommst du das Maximum nach String-Sortierung. Wenn es sich tatsächlich um eine Zahl handelt, sollte die Tabelle in der DB geändert werden.

Wie unter DataColumn.Expression beschrieben ist, kannst du notfalls mit CONVERT die Werte adhoc konvertieren. Dann brauchst du aber noch eine "berechnete Spalte", und erst über die kannst du das MAX bestimmen. Das steht aber alles in der SDK-Doku/MSDN/Hilfe.

Gruß Jürgen
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 19.04.10 11:51 
Hallo Jürgen,

Danke für Deine Antwort. Ich werd es ausprobieren.
Kannst Du mir hier auch noch helfen?

ausblenden C#-Quelltext
1:
foundRow = dt.Select("cLiefArtNr = row[column]");					


Dies funktioniert natürlich nicht aber veranschaulicht was ich möchte. In row[column] ist der String den ich suche. In foundRow möchte ich dann die andere Spalte cArtNr auswerten.
Wie muß nun die Abfrage gestrickt sein, dass die DataTable in der Spalte cLiefArtNr nach dem Inhalt der row[column] durchsucht wird und die gefundene Zeile foundRow zurück liefert?

Gruß

Marc
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 19.04.10 12:02 
Gehört row zur selben Tabelle oder zu einer anderen?

Bei derselben Tabelle sind das doch einfache Vergleiche, sodass (wie bei Select/Expression üblich) die Spaltennamen anzugeben sind:
ausblenden C#-Quelltext
1:
foundRows = dt.Select("cLiefArtNr = Spaltenname");					

Aber das widerspricht der Normalisierung von DB-Tabellen.

Bei verschiedenen Tabellen musst du den konkreten Wert holen und einfügen (bei einem String in Hochkommata).

Oder habe ich die Nachfrage völlig falsch verstanden? Jürgen
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 19.04.10 12:42 
Hallo Jürgen,

row[column] gehört zu einer anderen Tabelle bzw. DataTable. Wie soll ich da den konkreten Wert holen, da er doch eine Variable in einer foreach-Schleife ist.

Derzeit habe ich die Abfrage mit einer zweiten inneren foreach-Schleife innerhalb der äußeren foreach-Schleife gelöst. Das dauert aber ziemlich lange,
da er immer wieder die ganze innere Schleife innerhalb der Außenschleife durchlaufen muss. Ich breche zwar ab wenn die Bedingung erfüllt ist aber da die
Artikelnummern fortlaufen sind wird mit jedem Durchlauf durch die Außenschleife der Durchlauf der Innenschleife länger. Ich hoffe, dass die Select-Methode
hier viel intelligenter und schneller ist.

Gruß
Marc