Announcement

Collapse
No announcement yet.

Summenfeld

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Summenfeld

    Hallo,

    zu einer Auftragstabelle habe ich eine Positionstabelle.
    Auf einem Form habe ich eine TextBox mit der Auftragsnummer und ein DataGridView zur Anzeige der Auftragspositionen. Unterhalb der DGrV habe ich eine zusätzliche TextBox plaziert. Alles verbunden mittels BindingSource.

    Code:
    tbAuftragsnummer.DataBindings.Add("Text", bsAuftraege, "Auftragsnummer");
    DGrVPositionen.DataSource	= bsPositionen;
    tbSpaltenSumme.DataBindings.Add("Text", bsPositionen, "Positionssumme");
    Wenn ich jetzt durch das Grid scrolle erscheint in der TextBox tbSpaltensumme jeweils die aktuelle Positionssumme. Leider ist es nicht das, was ich gerne hätte. Ich möchte in der TextBox die Summe aller Positionen des aktuellen Auftrags anzeigen. Leider weiß ich nicht wie und in der Literatur hab ich bisher nichts gefunden. Kann mir jemand sagen, wie man da vorgeht?

    Danke und Gruß
    ______________________
    Danke und Gruß M. Humsch

  • #2
    Auch hallo,

    das müsste über den SQL-Befehl SUM oder eine anzuzeigende Variable, deren Wert mit += verändert wird, zu realisieren sein. Hierfür findet sich unter Codeproject ein Beispiel (ASP.NET mit VB): http://www.codeproject.com/KB/aspnet/SumColumn.aspx
    MfG
    Cheat-Sheets for Developers / Programming Quotes

    Comment


    • #3
      Spaltensumme in Textbox

      Originally posted by Markus Lahr View Post
      Auch hallo,

      das müsste über den SQL-Befehl SUM oder eine anzuzeigende Variable, deren Wert mit += verändert wird, zu realisieren sein.
      Hallo,

      erstmal Danke für die schnelle Antwort. Allerdings hilft es mir nicht wirklich weiter, da ein SQL-Befehl SUM nicht angewendet werden kann, weil die Spalte in der zugrundeliegenden Tabelle nicht existiert, sondern nur innerhalb der DGrV als berechnetes Feld eingefügt wird.

      Code:
      tblPositionen.Columns.Add("Positionsumsatz",typeof(decimal),"(ANZAHL*VERKAUFSPREIS)");
      Wenn also im Grid die Anzahl und/oder der Preis geändert wird, so wird augenblicklich auch der Wert in der berechneten Spalte angepasst und die in der Textbox angezeigte Gesamtsumme müsste ebenfalls sofort aktualisiert werden. Mittels SQL ist das wohl nicht zu realisieren.

      Danke und Gruß
      ______________________
      Danke und Gruß M. Humsch

      Comment


      • #4
        ist es eine berechnete Spalte im Datatable oder eine die nur in der Datagridview existiert?
        Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

        Comment


        • #5
          Originally posted by das-d View Post
          ist es eine berechnete Spalte im Datatable oder eine die nur in der Datagridview existiert?
          Die berechnete Spalte wird in der DataTable erstellt (siehe weiter oben) und natürlich auch im DGrV angezeigt.
          Zuletzt editiert von Humsch; 16.03.2009, 08:58.
          ______________________
          Danke und Gruß M. Humsch

          Comment


          • #6
            Lege eine weitere berechnete Spalte an, nimm den Expression Ausdruck aus deiner andere berechneten Spalte, schreib Sum(..) drum, pack das in dieses berechnete Feld und zeig dieses berechnete Feld in der Textbox an.

            Comment


            • #7
              Spaltensumme in Textbox

              Originally posted by Ralf Jansen View Post
              Lege eine weitere berechnete Spalte an, nimm den Expression Ausdruck aus deiner andere berechneten Spalte, schreib Sum(..) drum, pack das in dieses berechnete Feld und zeig dieses berechnete Feld in der Textbox an.
              Hab ich gemacht, Danke für den Tipp.

              Code:
              tblPositionen.Columns.Add("Gesamtumsatz",typeof(decimal),"Sum(ANZAHL*VERKAUFSPREIS)");
              Bekomme ich folgende Fehlermeldung:
              Syntaxfehler im Aggregatargument: Es wird ein Einzelspaltenargument erwartet, das möglicherweise einen 'Child'-Qualifizierer hat.

              ______________________
              Danke und Gruß M. Humsch
              ______________________
              Danke und Gruß M. Humsch

              Comment


              • #8
                Stimmt. Ausprobiert und bekomme ich auch. Man scheint nur einfache Spaltenausdrücke benutzen zu dürfen.

                Aber du kannst ja einfach, anstatt dem Ausdruck, den Spaltennamen deines anderen berechneten Feldes benutzen. Auch probiert. Das geht.

                Code:
                           
                DataTable dt = new DataTable();
                dt.Columns.Add("value1", typeof(int));
                dt.Columns.Add("value2", typeof(int));
                            
                DataColumn dc1 = dt.Columns.Add("rowsum", typeof(int));
                dc1.Expression = "value1 * value2";
                
                DataColumn dc2 = dt.Columns.Add("totalsum", typeof(int));
                dc2.Expression = "sum(rowsum)"; // geht
                
                //DataColumn dc3 = dt.Columns.Add("totalsum", typeof(int));
                //dc2.Expression = "sum(value1 * value2)"; // geht nicht
                
                dt.Rows.Add(new object[] { 3, 4 });
                dt.Rows.Add(new object[] { 5, 4 });
                Zuletzt editiert von Ralf Jansen; 16.03.2009, 21:27. Reason: CodeTag geändert Highlight kann nicht mit [ umgehen.

                Comment


                • #9
                  Originally posted by Ralf Jansen View Post
                  Stimmt. Ausprobiert und bekomme ich auch. Man scheint nur einfache Spaltenausdrücke benutzen zu dürfen.

                  Aber du kannst ja einfach, anstatt dem Ausdruck, den Spaltennamen deines anderen berechneten Feldes benutzen. Auch probiert. Das geht.
                  Hallo, erstmal vielen Dank für Deine Bemühungen.
                  Habe ich gleich so ausprobiert und es hat auch auf Anhieb geklappt.
                  Allerdings nur auf den ersten Blick. Das Problem ist Folgendes:

                  Die Positionen sind ja Teil einer 1:n-Beziehung, Aufträge -> Positionen. Wenn ich jetzt im Feld Auftragsnummer (siehe meine Ausgangsfrage) scrolle, dann werden ja immer die zum Auftrag gehörenden Positionen angezeigt. In der Textbox mit den Summen der Positionen erscheint aber nicht nur die Summe der Positionen zum aktuellen Auftrag, sondern zu allen Positionen aller Aufträge. Nun könnte man einwenden, dass eben immer nur ein Auftrag ins Formular zu laden ist. Aber, ersten löst es das Problem nicht prinzipiell und zweitens soll die Beziehung später (wenn das mit dem Summenfeld funktioniert) zu Kunde->Auftrag->Positionen erweitert werden, so das dann wieder das gleiche Problem auftritt.

                  Ich hatte ja an sowas wie

                  Code:
                  tbSpaltenSumme.DataBindings.Add("Text", bsPositionen, "Sum(Positionssumme)");
                  gedacht, aber das funktioniert nicht. Ich habe das Gefühl, dass der Hinweis mit dem Child-Qualifizierer in der genannten Fehlermeldung in die richtige Richtung weist, kann aber momentan so rein gar nichts damit anfangen.

                  PS. Hätte ja im Traum nicht dran gedacht, das so ein ordinäres Summenfeld solche Schwierigkeiten bereiten könnte.

                  ______________________
                  Danke und Gruß M. Humsch
                  ______________________
                  Danke und Gruß M. Humsch

                  Comment


                  • #10
                    dann musst du dafür sorgen dass zum Beispiel im Zeilensummenfeld --> dass das Jürgen "Rowsum" genannt hat, nur dann einen Wert größer Null ausgibt wenn die Bedingungen der Beziehungen erfüllt sind. In Expressions kannst du auf Parent und Child Tables zugreifen.
                    Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                    Comment


                    • #11
                      Hallo,

                      da das Ergebnis inzwischen anscheinend nicht mehr im DGV, sondern in einer TextBox angezeigt werden soll, möchte ich als Alternative noch DataTable.Compute vorschlagen. Das benutzt die Aggregatfunktionen, die bei DataColumn.Expression berücksichtigt sind; also sollten alle bisher besprochenen Punkte weiterhin gültig sein.

                      Jürgen

                      @das-d
                      Der Name "RowSum" stammt von Ralf.

                      Comment


                      • #12
                        ich würde eine weitere Spalte in der Auftrags tabelle einfügen. In der würde ich dann die summe der aufträge berechnen. Ich denke das müsste gehen ich teste das jetzt gleich mal aus

                        also um nur an die Summe der Positionen eines bestimmten Auftrages zu kommen. Müssen die Datatables richtig verknüpft sein. Also eine 1:n Beziehung vom Auftrag zu den Positionen. Angenommen bei Position existiert eine Column mit dem Preis.
                        dann genügt es in der Auftragstabelle eine Column mit folgender expression hinzuzufügen.

                        "Sum(Child.Preis)"

                        schon wird in dieser column immer der Gesamtpreis der Positionen eines Auftrages angezeigt. Dieses Feld lässt sich dann bequem an die Textbox binden. Das war doch das worauf du hinauswolltest oder?
                        Zuletzt editiert von das-d; 17.03.2009, 20:25.
                        Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                        Comment


                        • #13
                          Originally posted by das-d View Post
                          ...dann genügt es in der Auftragstabelle eine Column mit folgender expression hinzuzufügen.

                          "Sum(Child.Preis)"

                          schon wird in dieser column immer der Gesamtpreis der Positionen eines Auftrages angezeigt. Dieses Feld lässt sich dann bequem an die Textbox binden. Das war doch das worauf du hinauswolltest oder?
                          Hallo,

                          bin grad an einem anderen Problem. Ich glaube ich habe eine Lösung gefunden, werde ich hier heute Abend - spätestens morgen vormittag - darstellen. Nur soviel: Es muss eine Spalte in der DetailTabelle und eine in der MasterTabelle eingefügt werden. Die MasterTabelle wird dann mit "Sum(Child(RelationsName).FeldName)" bedient und die DetailTabelle mit "Parent.MasterFeldname". Die Datenbindung der Textbox erfolgt dann über die BindingSource der MasterTabelle.
                          So bekomme ich die Spaltensummen der Detaildatensätze sauber in die Textbox. Ich schreib's noch genauer auf.
                          Hab mir allerdings gleich ein neues Problem damit eingehandelt.
                          ______________________
                          Danke und Gruß M. Humsch

                          Comment


                          • #14
                            Originally posted by das-d View Post
                            ich würde eine weitere Spalte ...
                            Code:
                            dtPositionen.Columns.Add("SOLLUMSATZ",typeof(decimal),"PositionsAnzahl*VERKAUFSPREIS");
                            
                            dcAufträge		= ds.Tables["dtAufträge"].Columns[0];
                            dcPositionen		= ds.Tables["dtPositionen"].Columns[0];
                            drAuftragsPositionen	= new DataRelation("Aufträge2Positionen", dcAufträge, dcPositionen, true);
                            ds.Relations.Add(drAuftragsPositionen);
                            			
                            dtAufträge.Columns.Add("SollUmsatz",typeof(decimal),"Sum(Child(Aufträge2Positionen).SOLLUMSATZ)");
                            ds.Tables["dtPositionen"].Columns.Add("SollUmsatz",typeof(decimal),"Parent.SollUmsatz");
                            
                            // a.a.O.
                            
                            tbSollUmsatz.DataBindings.Add("Text",bsAufträge,"SollUmsatz");
                            Die entscheidende Hilfe habe ich hier gefunden. Falls der Link nicht funktioniert einfach nach 'Spaltenausdrücke' googeln.

                            ______________________
                            Danke und Gruß M. Humsch
                            ______________________
                            Danke und Gruß M. Humsch

                            Comment


                            • #15
                              für was ist denn die zweite Sollumsatz column gut? die wird doch nicht benötigt --> dann ist die lösung so wie ich sie vorgeschlagen habe
                              Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                              Comment

                              Working...
                              X