Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek 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.

braciszek0 23 Wrz 2011 11:04 2860 12
  • #1 23 Wrz 2011 11:04
    braciszek0
    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

    0 12
  • #2 23 Wrz 2011 21:18
    markonedj
    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

    0
  • #3 23 Wrz 2011 21:34
    braciszek0
    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

    0
  • #4 23 Wrz 2011 21:54
    braciszek0
    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.

    0
  • Pomocny post
    #5 23 Wrz 2011 23:05
    markonedj
    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

    0
  • #6 24 Wrz 2011 12:05
    braciszek0
    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 :)

    0
  • Pomocny post
    #7 24 Wrz 2011 12:21
    markonedj
    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.

    0
  • #8 24 Wrz 2011 12:35
    braciszek0
    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`

    0
  • #9 24 Wrz 2011 12:44
    markonedj
    Poziom 22  

    Jeszcze tylko nazywaj metody z dużej litery, zrób obsługę wyjątków i będzie ok:)

    0
  • #10 24 Wrz 2011 13:31
    braciszek0
    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();

    0
  • #11 24 Wrz 2011 13:42
    markonedj
    Poziom 22  

    Żadna, pisałem wcześniej o korzyściach z użycia using ? Pisałem :)

    0
  • #12 24 Wrz 2011 13:58
    braciszek0
    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

    0
  • #13 27 Paź 2011 10:53
    braciszek0
    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

    0