Spalten im DataTable vergleichen


lecoeur

Grünschnabel
Ich habe folgendes Problem.
Ich habe Select benutzt um die Werte in meiner DataTable zu bekommen.

C#:
string montant = txbmontant.Text;
cmd.CommandText = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using (pureenr) WHERE compartiment = " + montant;
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;

Jetzt moechte ich die Werte der Spalte "quantite" und "quantite_Cage" vergleichen. Ich will mich vergewissern dass die Werte der dritten Spalten(also jede Zeile vergleichen) tasächlich kleiner sind als die der 4 Spalte.

C#:
string montant = txbmontant.Text;
string sqlis = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using (pureenr) WHERE `quantite`< quantite_cage  AND compartiment = " + montant;
MySqlCommand cmdis = newMySqlCommand(sql, conn);
string resultat = cmdis.ExecuteScalar().ToString();
label.Text = "";
if (resultat == "")
{
label.Text = "Bestellmenge grösser als Mengen Im Lager";
}
else
{
label.Text = "Bestellmenge tatsächlich kleiner als Mengen Im Lager";
}

Ich bekomme zwar keinen Fehlermeldung aber Label.Text wird nicht genau angezeigt.

Kann es sein dass string Resultat ist falsch, (mit dem ".ExecuteScalar().ToString();")?

kann man direkt von der datatable vergleichen ohne noch mal die Datenbank abzufragen?


Danke im voraus
 
Zuletzt bearbeitet von einem Moderator:

lecoeur

Grünschnabel
Habe auch folgendes versucht. direkt von der DataTable zu vergleichen:

Code:
for (int i = 0; i < dtlivraison.Rows.Count; i++)
{
if (Convert.ToInt32(dtlivraison.Rows[i][2]) < Convert.ToInt32(dtlivraison.Rows[i][3]))
{
label.Text = "ist ok";
}
else
{
label.Text = "NICHT OK";
}
}

aber der Label zeigt immer "ist ok" obwohl eine Zahl in der 3.Spalte(Quantite) deutlich mehr als die Zahl in der 4.Spalte (quantite_Cage) .
 

Spyke

Premium-User
Ich denke mal das "ist ok" im label steht, liegt einfach da dran das der letzte Datensatz deiner DataTable einfach true für deine bedingung liefert.
Du durchläufst ja die einzelnen zeilen.

Setzt eifnach mal ein breakpoint dann müsstest du sehen ob deine Bedingung eintritt.

Ansonsten könntest du theoretisch die werte auch direkt in deinem SQL mit abprüfen:
SQL:
SELECT id, name, wert1, wert2, (wert1<wert2) AS vergleich FROM tabelle
 
Zuletzt bearbeitet von einem Moderator:

lecoeur

Grünschnabel
Wow, Tausend mal danke. alles funktioniert super.

hätte noch eine Frage: wie könnte ich eine Column im DataTable mit der Farbe rot auffüllen.
Anstatt "NICHT OK" hätte ich gerne die 3.Spalte rot gehabt. Ist es möglich?
 

lecoeur

Grünschnabel
Ansonsten könntest du theoretisch die werte auch direkt in deinem SQL mit abprüfen:
SQL:
SELECT id, name, wert1, wert2, (wert1<wert2) AS vergleich FROM tabelle

Das hatte ich auch versucht. Nur was ich nicht geschafft habe, ist zu prüfen, ob mein Select etwas hatte oder nicht. Deswegen hatte ich folgende Code benutzt
Code:
string sqlis = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using (pureenr) WHERE `quantite`< quantite_cage  AND compartiment = " + montant;
MySqlCommand cmdis = newMySqlCommand(sql, conn);
string resultat = cmdis.ExecuteScalar().ToString();
label.Text = "";
if (resultat == "")

Ich hatte ExecuteScalar().ToString() benutzt. Anscheinend geht es nicht. deswegen habe ich mit der Tabelle gearbeitet
 

Spyke

Premium-User
ExecuteScalar liefert dir nur den wert der ersten Spalte des ersten Datensatzes.

Ich denke was du ev. verwenden sollteste wäre ExecuteReader.
Diesen reader könntest du Zeilenweise auslesen und dort die entsprechenden Spaltenwerte dann.
 

lecoeur

Grünschnabel
Dke, habe geschafft.


habe noch ein Verständnis Problem. Habe einiges geändert.

Code:
private void commande_Click(object sender, EventArgs e)
{
string abtnr = txbmontant.Text;
                bslivraison.DataSource = ds;
                bslivraison.DataMember = "dtlivraison";
                //Visualisierung Grid
                grdlivraison.DataSource = bslivraison;
              
                bslivraison.Filter = "compartiment = '" + txbmontant.Text + "'";
                for (int i = 0; i < dtlivraison.Rows.Count; i++)
                {
                    if (Convert.ToInt16(dtlivraison.Rows[i][3]) < Convert.ToInt16(dtlivraison.Rows[i][4]))
                    {
                        label.Text = "ist ok";
                    }
                    else
                    {
                        label.Text = "NICHT OK";
                        break;
                    }
                }
}

natürlich geht es hier nicht mehr um die dataTable dtlivraison, sonderm um die Filterung. Wie sollte ich bitte die For und if bearbeiten?
Wie sollte ich bitte die For- und If-Schleife bearbeiten, damit das Label.text gut angezeigt wird?
 

Spyke

Premium-User
Was ist den ein compartiment?

Kommt bei deiner SQL Anweisung nur ein Datensatz zurück oder mehrere?

So wie du jetzt deine Schleife aufgebaut hast würde in deinem Label "ist ok" nur stehen wenn alle gelieferten Datensätze deine Bedingung erfüllen.
Sobald nur ein Datensatz diese Bedingung nicht erfüllt, erscheint "nicht ok" und du verlässt durch break die schleife.

Theoretisch könnte es erstmal so laufen wie du es vorhast.
Jetzt kommts halt drauf an was für Datensätze du bekommst.

Setzt einfach mal Breakpoint (standard Shortcut glaube F9) und schau mal ob VS dort beim debuggen überhaupt reinspringt.

P.S.:
Du musst nicht bei jeder Antwort danke sagen, machs wenn dann wenn problem gelöst ist ;)
 

lecoeur

Grünschnabel
compartiment ist ein französicher Name, so heißt die Spalte.

Ich bekomme immer "NICHT OK" auch wenn die Bedingung nicht erfüllt ist :(

Aus dem Debuging kann ich folgendes lesen:
dtlivraison.Rows.Count 12 int
obwohl ich nur 4 Datensätze nach dem "Filtern" habe.
Das ist auch normal. Schliesslich arbeite ich inmeiner For und if-Schleife mit dem dtlivraison. Nach der Überlegung sollte ich bestimmt etwas anderes anstatt "dtlivraison" schreiben, da ich in der dtlivraison filtere.

Ich möchte aus der Filterung prüfen, ob alle Datensätze der dritten Spalten kleiner sind als der 4. Spalte. wenn das der Fall ist, dann Label.Text sollte "ist OK" anzeigen, sonst "NICHT OK".

Meine Frage ist dann, wie prüfe ich alle Datensätze aus einer Filterung?
 

ksk

Erfahrenes Mitglied
... kann es sein das der Output "OK" beim nächsten mal durch "Nicht OK" überschrieben wird da die Bedingung nicht zutrifft???
Du brichst die Schleife ab sobald die Bedingunght zutrifft.
Probier mal folgendes:
Code:
// Alle Datensätze wo die 3. Spalte größer ist als die 4. Spalte
var allRowsWhereCol3GreatherCol4 = from row in dtlivraison.AsEnumerable() where row.Field<int>(3) > row.Field<int>(4) select row;
// Falls ein Datensatz in welcher die 3. Spalte größer ist, gefunden wurde
if (allRowsWhereCol3GreatherCol4.Count() > 0)
{
  label.Text = "NICHT OK";
}
else
{
  label.Text = "OK";
}

Lg
ksk
 

Neue Beiträge