Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

c# Zliczanie tych samych wierszy w datagirdview.

23 Wrz 2011 11:04 3085 12
  • Poziom 12  
    Witam.
    Poniższy kod z VB Excel potrzebuję przerobić na C# tak by wyświetlał się w datagirdview.
    Zadaniem kodu jest zliczanie wierszy o takiej samej nazwie w kolumnach A:B, sumowanie wierszy w kolumnie D, usunięcie policzonego wiersza.
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dane kiedyś zbierałem w arkuszu Excel obecnie zapisywane są w bazie MySQL.
    Obecnie w moim projekcie jestem na etapie wyświetleniu danych za wybrany okres czasowy. Ponieważ dane się powtarzają chciałbym by je sumowało i wyświetlało.
    Załącznik zawiera powyższe makro.
    Informację, które obecnie wyświetlane są w datagirdview uzyskuję za pomocą kodu:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 22  
    Po 1 nie stosuj SELECT *. Powinno się zawsze wymieniać nazwy kolumn poleceniu SELECT i wypisywać tylko te, które są rzeczywiście niezbędne. Zmniejsza to ilość operacji odczytu/ zapisu, przez co wpływa na poprawę wydajności.

    Po 2 nie rozumiem tego zdania:
    braciszek0 napisał:
    Zadaniem kodu jest zliczanie wierszy o takiej samej nazwie w kolumnach A:B, sumowanie wierszy w kolumnie D, usunięcie policzonego wiersza.

    Zliczyć wiersze możesz poleceniem:
    Kod: sql
    Zaloguj się, aby zobaczyć kod

    Sumowanie wierszy to chodzi o zliczenie wierszy czy o sumowanie wartości które się w nich znajdują.
    Jeśli sumowanie wartości to służy do tego funkcja SUM
    Kod: sql
    Zaloguj się, aby zobaczyć kod
  • Poziom 12  
    Oba te polecenia znam i wykorzystuję.
    Ilość dachów ,ilość błędów i suma punktów. (nie mogę tylko wyniku wkleić w textBoxa a było by ładniej :( )
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Chodzi mi oto by w drugim datagirdview: "Znalezione błędy"
    Te wiersze które mają taki sam wpis w kolumnie: "Miejsce_blendu + Blond + Status " Wyświetliło tylko raz wstawiając na koniec kolumnę z informacją ile było powtórzeń (dokładnie ile razy znaleziono taki błąd)
    Zrzut okna w załączonym pliku jpg. (ukryłem tylko dane poufne :) )

    Efekt jaki chcę uzyskać jest w pliku Excela załączony do pierwszego postu (plik zrobiłem wczoraj na potrzebę odpowiedzi komuś na inny post)

    c# Zliczanie tych samych wierszy w datagirdview.
    https://obrazki.elektroda.pl/1212080900_1316806705.jpg
  • Poziom 12  
    Efekt jak w tym oknie tylko żeby błąd był wyświetlony tylko raz a na końcu w kolumnie ile razy się powtórzył (dla poniższego przykładu: 3)

    c# Zliczanie tych samych wierszy w datagirdview.

    https://obrazki.elektroda.pl/1642006000_1316807618.jpg


    Jak byś pobrał ten plik Excela i uruchomił makro to byś odrazu zrozumiał :) bo mi trudno to wytłumaczyć bez pokazu.
  • Pomocny post
    Poziom 22  
    Nie uruchamiam makr z nieznanych arkuszy na swoim kompie, a nie chce mi się wirtualnej maszyny tworzyć :)

    No to użyj COUNT i potem GROUP BY
    Kod: sql
    Zaloguj się, aby zobaczyć kod

    Efekt (sql server, ale w tym przypadku składnia jest taka sama dla mysql):
    c# Zliczanie tych samych wierszy w datagirdview.

    Dodano po 37 [minuty]:

    braciszek0 napisał:
    Oba te polecenia znam i wykorzystuję.
    Ilość dachów ,ilość błędów i suma punktów. (nie mogę tylko wyniku wkleić w textBoxa a było by ładniej :( )
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Kod: csharp
    Zaloguj się, aby zobaczyć kod



    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 12  
    markonedj napisał:
    No to użyj COUNT i potem GROUP BY

    Kod SQL - [rozwiń] SELECT Blad, COUNT(Blad) AS 'Ilosc' FROM Tabela GROUP BY Blad


    Fajnie działa, lecz jestem wybredny i mam swoje "ale"
    1)Podane zapytanie stworzy mi nową kolumnę i zwróci mi tylko wyniki.
    Czy dało by się stworzyć podzapytanie by wyświetlało również tabele: Miejsce_blendu, Blond, Status + ta nowa Ilość
    2) Zliczanie COUNT musi uwzględniać trzy tabele: Miejsce_blendu, Blond, Status tak jak by najpierw złączyć do kupy z nich teksty (powiedzmy do kolumny `zloncz_teksty`) i dopiero użyć polecenia COUNT na kolumnie`zloncz_teksty` z wyświetleniem wyników zachowując zasadę 1).

    Co do sposobu wstawienia wyniku w textboxa to wywala mi błędy na : SqlConnection, connString, SqlCommand, SqlDataReader. Że niby czegoś mi brakuje ( The type or namespace "tu jedna z wymienionych nazw" could not be fund (are you missing a using directive or an assembly reference?) Może dojdę czego po to w końcu stworzyli Google. :)
    Zastanawiam się tylko czemu w innej z moich Form w której pobieram z tabeli wartość liczbową określającą poziom uprawnień wstawienie w textboxa wyszło mi bez problemu.
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    Rozumiem że odwołałem się tu do określonej komórki, ale jak odwołać się tym samym sposobem do jednej komórki z polecenia COUNT :)
    Czemu to nie jest tak łatwe jak VB :)
  • Pomocny post
    Poziom 22  
    braciszek0 napisał:

    Co do sposobu wstawienia wyniku w textboxa to wywala mi błędy na : SqlConnection, connString, SqlCommand, SqlDataReader. Że niby czegoś mi brakuje ( The type or namespace "tu jedna z wymienionych nazw" could not be fund (are you missing a using directive or an assembly reference?)

    Tak bo te klasy służą do komunikacji z SQL Serverem (wymagają przestrzeni nazw System.Data.SqlClient). Dla mysql będą inne: MySqlConnection, MySqlDataReader, MySqlCommand itd.
  • Poziom 12  
    Ok działa. Z małymi poprawkami w kodzie ponieważ połączenie zbazą mam wywołane odrazu przy otwarciu Form kod wygląda w moim przypadku tak :
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Teraz będzie przejrzyście. :)

    Lecz to jest odpowiedź nie do tematu postu tylko do zapisu w textboxa. :)
    Pozostało mi więc męczyć dalej temat postu.
    Czyli uzyskać by nazwy które się powtarzają w kolumnie `Miejsce_blendu`+`Blond`+`Status` (złączone z nich teksty) policzyło i wyświetliło jako jeden wiersz z kolumnami `Miejsce_blendu` `Blond` `Status` AS `Ilosc`
  • Poziom 22  
    Jeszcze tylko nazywaj metody z dużej litery, zrób obsługę wyjątków i będzie ok:)
  • Poziom 12  
    Musi tak zliczać ponieważ dla wartości z kolumny `Miejsce_blendu` nie zawsze posiadają tę samą wartość w kolumnach `Blond` i `Status`. Podsumując Dla jednego miejsca błędu (części składowej dachu cabrio) może być kilka rodzaji błędów.
    c# Zliczanie tych samych wierszy w datagirdview.

    Dodano po 43 [minuty]:

    markonedj która linijka z twojego kodu do wpisania wyniku w textboxa zamyka połączenie z bazą danych?
    Bo do polecenia wypełnienia dwóch pozostałych textBoxów musiałem dodać linijkę z poleceniem conDatabase.Open();
  • Poziom 22  
    Żadna, pisałem wcześniej o korzyściach z użycia using ? Pisałem :)
  • Poziom 12  
    A nio pisałeś. I załapałem oco chodzi. Tyle tylko że teraz muszę trochę przebudować projekt by korzystać z using. :) Tak to jest jak się nie zna wszystkiego i w momęcie poznania ciekawszego rozwiązania trzeba przebudować projekt.


    Aczkolwiek nadal mnie nurtuje temat:
    Uzyskać by nazwy które się powtarzają w kolumnie `Miejsce_blendu`+`Blond`+`Status` (złączone z nich teksty) policzyło i wyświetliło w (dataGirdview) jako wiersze z kolumnami `Miejsce_blendu` `Blond` `Status` AS `Ilosc`
    Obrazowo: Robię remament i po zeskanowaniu wszystkich towarów (niektóre pomimo tej samej nazwy mają inną wagę i cenę) mam tabel z XXX wierszami. I potrzebne jest polecenie które wykona iż w dataGirdview wyświetli uporządkowane towary według nazwy, wagi i ceny z dodatkową kolumną informującą ile było sztuk. Czyli zamiast XXX wierszy zostaje mi XX
  • Poziom 12  
    Hej markonedj.

    Znalazłem chwilkę czasu i znów zabrałem się do tego tematu. Lecz jak to zwykle bywa napotkałem mały błąd z którym nie mogę sobie poradzić.

    Kod wygląda tak:
    Kod: mysql
    Zaloguj się, aby zobaczyć kod


    Jak sprawić by sortowanie powstało według nowo utworzonej kolumny 'Ilosc'
    ponieważ jak podmienię
    Kod: mysql
    Zaloguj się, aby zobaczyć kod


    Wywala oczywiście błąd #1056 - Can't group on 'Ilosc'

    Dodano po 1 [godziny] 24 [minuty]:

    Ok rozwiązałem problem
    wystarczy na końcu dopisać: ORDER BY `Ilosc` DESC

    Dodano po 43 [minuty]:

    A jednak jest jakiś błąd.

    Dodano po 3 [minuty]:

    Jak to poprawić:
    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    żeby sumowało jeżeli będzie nazwa zgodna z połączenia tych dwóch kolumn. Bo puki co nadal sumuje tylko jeżeli nazwa w pierwszej kolumny się zgadza.
    Jakiego użyć znacznika zamiast "+" ??

    Dodano po 9 [minuty]:

    Ok już znalazłem. należało zmienić przy : GROUP BY Miejsce_bledu, Blad a nie przy COUNT