Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Visual Studio(VB) - Program bazy danych

kafus6 15 Lip 2014 05:50 3498 30
  • #1 15 Lip 2014 05:50
    kafus6
    Poziom 14  

    Witam wszystkich,

    Mam do stworzenia program, który:

    1. Może wyświetlać (+add, +edit, +del) tabele z bazy danych
    2. Może sortować powyższe dane
    3. Tworzyć raporty w postaci wykresów oraz eksportować je do excela (np. z danych posortowanych lub danych, które nas interesują nie wliczając pozostałych danych)

    Mam problem już przy 1 kroku, mianowicie:
    wyświetlam dane w DataGridview i wszystko było by ok, gdyby nie fakt, że musze pokazać dane z kilku tabel osobno:
    np. tabele, pracownicy, zamowienia, klienci.
    Gdy kliknę na button pracownicy - ma sie pojawic tabela pracowników,
    Gdy kliknę na button zamowienia - ma sie pojawic tabela zamowień a tabela pracowników zniknąć etc.
    Jak na razie uzywam opcji show(), hide() ale wiem, że to nie zbyt dobra metoda a nie wiem jak mogę wyczyścić DataGridview i wstawić dane z innej tabeli. Myślałem też, o otwieraniu nowego formularza, ale tak naprawdę- komu by się chciało otwierać i zamykać nowe okienka.

    2. Sortowanie zrobiłbym Cobmobox z opcjami do sortowania (?)

    3. Nie mam pojecia jak i czym to zrobić :(

    Proszę o jakieś porady. Jeśli ktoś ma więcej doświadczenia w takich programikach to proszę o podpowiedź? Im prościej tym lepiej- bez żadnych wodotrysków :)

    ps. Używam Visual Studio 2013 (Windows Forms Application(Visual basic))

    0 29
  • #2 15 Lip 2014 07:49
    sivex
    Poziom 27  

    A nie można na DataGridview użyć metody typu "Clear"
    a następnie użyć nowego źródła danych "datasource"
    i ostatecznie odświeżyć metodą typu "Refresh" ?

    pozdr.

    0
  • #3 15 Lip 2014 12:15
    kafus6
    Poziom 14  

    Ok. Tak już próbowałem i nie działa mi ten Clear()

    DataGridView1.DataSource.Clear() wywala błąd, że nie można wyczyścić tej tabeli.
    lub
    Me.DataGridView1.DataSource.Clear() to samo
    Próbowałem bez Datasource itp. to samo

    Edit:

    Ok. Zadziałało na
    DataGridView1.Colums.Clear()

    0
  • #4 15 Lip 2014 12:36
    marcinj12
    Poziom 40  

    Właśnie robię programik, akurat w C#, który działa podobnie - ma ładować dane z różnych tabel do jednego DataGridView. Zrobiłem to tak, że jest pusta DataGridView, wspólne przyciski menu (dodaj, usuń, modyfikuj, filtruj etc.) i combobox, z którego użytkownik wybiera predefiniowane tabele do wyświetlenia. Na przykładzie są dwie, może ten kod Cię natchnie.

    Pominąłem niektóre nieistotne fragmenty, ale generalnie: po zmianie wyboru w comboboxie następuje pobranie odpowiednich danych. Pobieranie danych mam zorganizowane w osobnym pliku z dostępem do danych, ale generalnie jest to zapytanie SQL które zwraca obiekt DataTable wypełniony danymi, przypinany następnie poprzez bindingSource /używam do filtrowania/ jako DataSource do DataGridView.
    Oprócz tego po podmianie tabeli z danymi, każdorazowo formatuję dgv tak, żeby pasował do wybranej tabeli - ja akurat korzystam z własnej pomocniczej klasy, do której przekazuję tablicę z szerokością, wyrównaniem i nagłówkiem poszczególnych kolumn.
    Wspólne przyciski dodaj, usuń, modyfikuj etc. działają podobnie - jest switch(), który w zależności od wybranej w comboboxie tabeli, wykonuje odpowiednie akcje.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #5 15 Lip 2014 13:01
    kafus6
    Poziom 14  

    sivex napisał:

    a następnie użyć nowego źródła danych "datasource"


    Tell me how!!! :) Proszę :)


    Marcinj12, dzięki za podpowiedź. Jak uporam się z pkt 1 mojego super zadania to będę się wpatrywać w to co wyskrobałeś :)

    ps.
    Ładowanie danych do DataGridView mam tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #6 15 Lip 2014 17:27
    sivex
    Poziom 27  

    No ale najpierw ten dataGridView zsynchronizowałeś z jakimś bindingSource ?


    pozdr.

    0
  • #7 15 Lip 2014 18:17
    kafus6
    Poziom 14  

    Tak. Przez designera jest podpięta tabela i niestety nie widze to tego kodu :/

    O ile się orientuję jest to tak naprawdę jedna linijka kodu, której nie umiem 'wymyślić'. :(

    Czy mógłbyś mi ją napisać/podać ?


    Edit:

    Mam takie coś

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    czy to bedzie ok? i jak to teraz wyswietlic?:)

    Edit:

    Czizus...Ja już nie wiem
    (w zasadzie to i tak nie wiedziałem)

    0
  • Pomocny post
    #8 15 Lip 2014 18:53
    wiesniak
    Poziom 31  

    kafus6 napisał:
    musze pokazać dane z kilku tabel osobno:
    np. tabele, pracownicy, zamowienia, klienci.
    Gdy kliknę na button pracownicy - ma sie pojawic tabela pracowników,
    Gdy kliknę na button zamowienia - ma sie pojawic tabela zamowień a tabela pracowników zniknąć etc.

    Ja bym użył TabControl, na każdej zakładce inny grid i ładowałbym dane na zakładkę, która jest widoczna (pewnie jest jakieś zdarzenie SelectedIndexChanged czy coś w tym stylu). To absolutnie upraszcza zarządzanie gridami, a jednocześnie nie obciąża aplikacji zaciąganiem wszystkiego, bo masz ładowanie na żądanie (można dodać czyszczenie grida, którego zakładka traci widoczność).
    Odpuściłbym też używanie kontrolek BindingSource i ładował dane ręcznie (grid.DataSource = kolekcjaDanych). To daje pełną kontrolę nad rzeczami dziejącymi się w aplikacji. Same dane możesz wyciągać w wygodny sposób za pomocą EntityFramework.

    kafus6 napisał:
    2. Sortowanie zrobiłbym Cobmobox z opcjami do sortowania (?)

    Moim zdaniem chodzi o sortowanie poprzez klikanie na nagłówki kolumn. Klikasz na nagłówek, to się sortuje np rosnąco po danej kolumnie. Klikasz ponownie i sortuje się malejąco. Jeszcze raz i wyłączasz sortowanie. Kolejne kliknięcie ponawia cykl. Kliknięcie na inną kolumnę powoduje wyłączenie sortowania po poprzedniej i włączenie po nowej. Opcja ekstra: trzymając klawisz control możesz włączyć sortowanie po kolumnie bez wyłączania sortowania poprzednich kolumn.

    Raporty możesz zrobić za pomocą dostępnych w VS raportów (rdlc).
    Eksport do excela to oledb i ace driver (nie polecam), interopy (office tools for VS - wymaga office'a na komputerze) oraz biblioteka NPOI (polecam). Być może są też inne opcje, ale ich nie znam.

    0
  • #9 15 Lip 2014 19:19
    kafus6
    Poziom 14  

    wow. Dzięki wielkie Wiesniaku (że się tak wyrażę) za wysiłek i pomysły.

    TabControl jak najbardziej tutaj pasuje( nie wiedziałem o tej opcji).

    Cytat:
    Odpuściłbym też używanie kontrolek BindingSource i ładował dane ręcznie (grid.DataSource = kolekcjaDanych).


    Bardzo chętnie. Ale niestety próbuje to zrobić on rana i po prostu nie wychodzi...
    Albo nie chce ładować danych albo wyświetlać etc... znalazłem coś takiego:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    No i wywala błąd przy getdata ( a jest to przykład ze strony MS)



    Jeśli chodzi o sortowanie to zle mnie zrozumiałem ( albo ja zle napisałem). Chodziło mi o stworzenie wykresu, którego dane sam mógłbyś wybrać. Czyli nie sortowanie a wybieranie danych do wykresu. np:

    Wykres ma pokazać ilość towarów sprzedanych od 2010 roku i do tego wyszczególnić jakie to były towary.
    Wykres się narysował to teraz możliwość exportu do xlsx

    0
  • Pomocny post
    #10 15 Lip 2014 19:29
    wiesniak
    Poziom 31  

    Zobacz mój post oraz demo https://www.elektroda.pl/rtvforum/viewtopic.php?p=11874967#11874967
    Kod jest w C#, ale myślę, że przeżyjesz ;] Jest tam baza, jest EntityFramework, jest grid.

    Czyli nie chodzi Ci o sortowanie, tylko o filtrowanie :) W tym xlsx ma się znaleźć ten wygenerowany wykres czy przefiltrowane dane?
    Jeśli wykres, to w sumie masz kilka opcji: albo wrzucisz do excela dane i na ich podstawie wygenerujesz wykres, albo wykres z aplikacji zapiszesz jako obrazek i wrzucisz do excela.
    Sam wykres możesz zrobić za pomocą kontrolki Chart, a obrazek z niego zapisać za pomocą metody SaveImage.

    0
  • #11 15 Lip 2014 19:46
    kafus6
    Poziom 14  

    Tak!. słowo klucz na dzisiaj to filtrowanie :)

    W xlsx chciałbym mieć wygenerowany wykres i może tabele przestawną, ale tabela to jest tylko opcja.
    Obrazki nie wchodzą w grę tak więc tylko generowanie wykresu w excelu?
    Masz na myśli makra?

    Dziękuję Ci jeszcze raz za zainteresowanie :) dzięki takiej postawie, aż chce mi sie uczyc dalej :)


    Edit:

    Eureka! Działa ten niesforny BindingSource!!!
    Teraz tylko(aż) te wykresy :)

    0
  • #12 15 Lip 2014 20:08
    wiesniak
    Poziom 31  

    Z tym wykresem w excelu może być problem. Z tego co widzę, NPOI nie obsługuje wykresów. Jeśli możesz skorzystać z szablonu excela (czyli masz gotowy plik bez danych) to się da - ładujesz dane, wykres się przegeneruje - są poradniki na necie. W innym wypadku musisz niestety zrobić samodzielne przeszukiwanie netu, jak to ugryźć - ja się takim czymś nie zajmowałem.

    Ucz się, ucz. Programowanie to fajna zabawa, z której da się wyżyć ;] Tylko olej VB i naucz się C# :P

    0
  • #13 15 Lip 2014 20:18
    kafus6
    Poziom 14  

    Czemu polecasz C# nad VB ?

    ps. Jak dodać cokolwiek(kod) do tych Tabów w TabControl?

    0
  • #14 15 Lip 2014 20:40
    wiesniak
    Poziom 31  

    Temat VB.NET vs C# to dyskusja na inny wątek, ale moim zdaniem:
    1. C# powstał dla .NETu, podczas gdy VB.NET został dostosowany do .NETu.
    2. Subiektywnie rzecz biorąc, C# jest bardziej zwięzły i czytelny (duże podobieństwo do C/C++).
    3. W internecie, szukając jakiegoś rozwiązania, masz znacznie większą szansę znaleźć odpowiedź właśnie w C#.

    Co do tabów, to są one kontenerami na kontrolki. Możesz tam osadzić cokolwiek, np gridy. Wtedy kod robiący cokolwiek z tabami czy ich zawartością musi pojawić się w kodzie formy. Możesz też osadzić na tabie własną kontrolkę i wtedy możesz część kodu przenieść do tej kontrolki.
    Jeśli napiszesz, co dokładnie chcesz uzyskać, łatwiej będzie odpowiedzieć.

    0
  • #15 15 Lip 2014 21:06
    kafus6
    Poziom 14  

    Dzięki za udzielenie lekcji co do C#.
    Właśnie przestawiłem się na C# i jestem w tym samym miejscu co w VB wiec chyba jest ok :)

    mam 3 zakładki TabPage1, Tabpage2 ...

    W pierwszej, która ma nazywać się "Klienci"
    Chciałbym osadzić gridview( i to jest ok)
    Ale teraz chciałbym oczywiscie pokazać w nim tabele 'klienci',
    w drugiej TabPage2 (z nazwą pracownicy) chce mieć grdiview 'pracownicy etc.

    kod do ładowania to:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    ale nie wiem gdzie go wpisać...:(

    ps. przy kilku buttonach i jednym grdview jest ok, ale nie umiem "kliknąć" na TabPage, żeby zacząć pisać do niego kod(jesli rozumiesz o co mi chodzi bo pisze w Visual studio)


    Edit: a tak swoją drogą to bawiłem się w C++ no i faktycznie coś wspólnego mają ze sobą. Chociaż muszę przyznać że c# jest prostszy i czytelniejszy.

    0
  • #16 15 Lip 2014 21:18
    wiesniak
    Poziom 31  

    TabControl i TabPanel to nie są Twoje, osobne formularze, więc nie dostaniesz dla nich osobnych klas. Zresztą to Ci nie jest potrzebne.
    Przede wszystkim powinieneś mieć dostęp do grida w kodzie swojej formy. Więc w konstruktorze, albo lepiej w zdarzeniu Load formy możesz wykonać swoje ładowanie danych.
    Generalnie nic w Twoim kodzie nie powinno ulec zmianie - taby opisują tylko układ na formie.
    Możesz też inaczej podejść do sprawy - zrób działający grid bez tabów (co już chyba Ci się udało), po czym przemieść go na taba - w Twoim kodzie nie powinno być żadnych zmian, a grid powinien dalej działać.
    Przekazanie zapytania zapisanego na sztywno to najbardziej paskudne podejście, jakie można zrobić. Będziesz chciał dodać filtr i będziesz się pieścił z doklejaniem tekstu. Ciągle namawiam do poświęcenia godziny czy dwóch na zabawę z EntityFramework ;]
    PS. Polecam też zamiast Formsów użyć WPF ;]

    0
  • #17 15 Lip 2014 22:36
    kafus6
    Poziom 14  

    Cytat:
    Przekazanie zapytania zapisanego na sztywno to najbardziej paskudne podejście


    tzn? kiedy przekazuje się zapytanie na sztywno ?

    0
  • #18 15 Lip 2014 23:08
    wiesniak
    Poziom 31  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Przekazałeś tekst, więc na sztywno zdefiniowałeś zapytanie.

    0
  • #19 15 Lip 2014 23:56
    kafus6
    Poziom 14  

    mhm.

    To jak najlepiej bindingować więc?
    Co mam wpisać w Grida jako ta funkcja wyświetlająca dane ?

    Do EF nie chce przechodzić jeszcze bo zwykłego C# nie umiem a co dopiero EF :P chyba, że nie ma to róznicy dla mnie (czyt. nie znającego C#)

    Edit:
    Aa... i jakie są różnice podstawowe między form a WPF Aplication ? :)

    Edit 2:
    Jakieś propozycje co do sortowania?
    Myślałem, żeby wczytać nazwy kolumn do Comboboxa i poniżej dać textbox do którego wpisywałoby się dodatkowe sortowanie ale to nie wypali bo ma małe możliwości.
    Musisz wziąć pod uwagę to, jak podasz mi pomysł to jeszcze zmuszony zostaniesz przeze mnie do łopatologicznego tłumaczenia ;)

    Edit 3:

    Marcinj12

    A jak dojdzie Ci 20 nowych kolumn w tabeli?
    Albo 2000 w 30 tabelach ?

    Wydaje mi się, że przypisywanie każdej wartości dla poszczególnych kolumn jest trochę uciążliwe. Tak mi się wydanie, ale mogłem coś pomieszać bo się dopiero uczę...

    lepiej np:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    ??

    0
  • #21 16 Lip 2014 20:09
    kafus6
    Poziom 14  

    Sivex, tak właśnie zrobiłem.
    Jak mówiłem teraz potrzebuje czegoś ciekawego do filtrowania grida. Czegoś co by mogło filtrować dane(wyznaczone przez użytkownika) z kilku(najlepiej) tabel (gridów). Nie wiem natomiast jak sie do tego zabrać.

    Dodano po 29 [minuty]:

    Wymyśliłem coś takiego:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Z tym, że trzeba teraz dodać to do każdej tabeli, do każdej kolumny osobno.
    Da się jakoś to "zautomatyzować"?

    0
  • #22 16 Lip 2014 20:48
    sivex
    Poziom 27  

    No to właśnie Twój program ma to automatyzować.
    masz do tego pętle, inne możliwosci konstrukcji filtra itp.

    pozdr.

    0
  • #23 16 Lip 2014 20:57
    kafus6
    Poziom 14  

    Dzięki za odpowiedź.

    Czy mógłbyś podpowiedzieć jak zrobić pętle, która wyszukuje nazwy kolumn (np. lastname) w tabeli, która jest w grid'zie ?

    Lub może prościej:

    if (...)

    ...
    textBox1.hide();

    ??

    0
  • #24 16 Lip 2014 21:33
    sivex
    Poziom 27  

    A nie lepiej zmieniać zapytanie na postawie tego co user chce przefiltrować
    żeby wygenerować nowa tabele i umieścic ją w gridzie?

    Aha... nie zapomnij o sql injections.


    pozdr.

    0
  • #25 16 Lip 2014 22:56
    kafus6
    Poziom 14  

    hm... wiesz co... nie rozumiem co Ty do mnie rozmawiasz :)

    Mógłbyś podać przykład kodu bo nie umiem sobie tego wyobrazić.
    Proszę o wyrozumiałość- dopiero drugi dzień mam styczność z C#

    Edit:

    Ok. Zrobiłem coś takiego, ale oczywiscie nie działa. Mógłby ktoś zerknąć?

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Nie pokazuje żadnego wyniku.
    A po drugie chciałem kolumny z Tabeli, a wyszlo rekordy z kolumny :)
    jakaś podpowiedź/odpowiedź?

    0
  • #27 17 Lip 2014 13:09
    kafus6
    Poziom 14  

    Dzięki za podpowiedź.

    Czy może być tak ?

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Nie wiem czy to jest ok czy coś zmienić? Jak na razie to tylko wyświetlanie wszystkich kolumn do comboboxa.
    Teraz: jesli w combobox 1 jest zaznaczona tabela Orders, then wyświetl kolumny z tabeli orders w combobox2
    co wpisać w IFie () ?

    0
  • #28 20 Lip 2014 11:30
    cepelia
    Poziom 20  

    Sorki, ale nie miałem czasu wcześniej... zobacz czy ten opis ci coś rozjaśni, w razie pytań pisz...

    0
  • #29 20 Lip 2014 20:09
    kafus6
    Poziom 14  

    Dzięki za link. Faktycznie trochę informacji tam znalazłem.
    Jako, że w międzyczasie przerzuciłem się na C# to przekształciłem to na ten właśnie język.

    No i właśnie. Jako, że już nie uczę się w VB to można chyba temat zamknąć. Najwyżej utworze nowy z tematem Csharp.

    Dziękuję wszystkim za pomoc :)

    0
  • #30 20 Lip 2014 20:15
    cepelia
    Poziom 20  

    Jak się przyjrzysz, to sam zobaczysz że oba języki są do siebie bardzo podobne, a w zasadzie różnią się tylko delikatnie składnią... metody, właściwości i zdarzenia są dokładnie takie same...

    Pisałem to właśnie z myślą o podobnych pytaniach, z tego co widziałem w twoim kodzie, to proponuję dokładniej przeczytać o połączeniach i zapytaniach do bazy... poza tym każdą aplikację która korzysta z bazy (a dokładniej jej model danych) trzeba głęboko przemyśleć bo nie zawsze błędy w zaprojektowaniu da się naprawić i trzeba zaczynać od początku...

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo