Tworzenie maila z danych w DataTable

0

Witam,
uczę się programowania i tworzę małą aplikację żeby ułatwić sobie pracę, mam pewien problem.

Posiadam DataTable z kolumami NIP, Imie Nazwisko, Termin.
załóżmy że są w niej dane:
123456789 Jarek Nowak 2018-12-31
999999999 Andrzej Malina 2018-11-30
987654321 Mirek Truskawka 2018-10-25
999999999 Stanisław Wilk 2018-09-15

Potrzebuję wyciągnąć dane z tabeli tylko i wyłącznie dla tych wierszy gdzie NIP jest równy 999999999
i wrzucić je potem do jednego maila, przy użyciu mailto.

Podejrzewam, że musiałbym użyć w jakiś magiczny sposób foreach ale nie potrafię tego ogarnąć a przeszukiwanie google nie daje rezultatów :)
Proszę o jakąs podpowiedź :)

0

Skąd dostajesz ten datatable ?

0

Dane w Datatable uzyskuje z zapytania do bazy SQL.

1
Wojciech Guse napisał(a):

Dane w Datatable uzyskuje z zapytania do bazy SQL.

To może warto napisać to zapytanie tak żeby zwracało tylko wiersz z NIPem takim jaki chcesz ?

0

Problem jest taki, ze nie wiem jaki nip tam wystąpi :) zapytanie zwraca dane dla których termin jest bliżej niż 31 dni. Ja potrzebuje na tej podstawie wyslac wiadomość do klientów. Wiem jak wyslac maila z danymi jednego rekordu ( na końcu każdego wiersza mam buttona, który to właśnie robi)
ale nie chciałbym zaspamowac komuś maila, w związku z tym potrzebowalbym pobrać z tabeli wszystkie badania jednego klienta.

0

Najlepiej byłoby użyć jakiegoś ORM'a. Następnie robisz GROUP BY po NIPie i masz dla każdego NIPu powiązane z nim badania. Jeśli chcesz koniecznie zostać przy klasycznym ADO.NET to zmapuj wynik zazpytania na kolekcje obiektów i zrób GROUP BY w pamięci przy pomocy LINQ. Trzecie rozwiązanie to zrobienie zapytania z GROUP BY i zmapowanie wyniku na jakiś słownik gdzie kluczem jest NIP, a wartością cały wiersz jednak to będzie rzeźba. ORM zrobiłby to za Ciebie. Drugie rozwiązanie jest nierekomendowane, ale w EF Core do niedawna nie było GROUP BY po stronie bazy i jakoś ludzie żyli :D

1

Pseudokod:

class Klient
{
     public string NIP { get; set;}
     public string Imie {get; set;}
     public string Nazwisko {get; set;}
     public string Termin {get; set;}
}

List<Klient> klienciNip999 = new List<Klient>();
foreach(DataRow row in twojaDateTable.Rows)
{
     if(row[0].ToString()=="999999999")
           klienciNip999.Add(new Klient() { NIP=row[0].ToString(), Imie=row[1].ToString(), Nazwisko=row[2].ToString(), Termin=row[3].ToString() });
}

NIe testowałem kodu W tym przykładzie do listy wrzucasz akurat tych klientów które spełniają Twój warunek. Mógłbyś wrzucić do listy wszystkich bez warunku, a wtedy przez LINQ możesz sobie przeszukiwać kolekcję. Ale tak jak napisał kolega wyżej, mógłbyś ominąć takie "mapowanie" korzystając z jakiegoś ORM.

0

Zrobiłem tak jak pisaliście, stworzyłem listę na podstawie
foreach(DataRow row in twojaDateTable.Rows)
po czym generuje mi się mail.
Wszystko działa jak należy, dziękuję bardzo :)
Zaoszczędziliście człowiekowi masę godzin pracy,
Pozdrawiam

0

Moim zdaniem ten problem jest słabo rozwiązany. Po co zaciągasz wszystkie dane z bazy (podejrzewam że tak robisz). Powinieneś zmodyfikować zapytanie do bazy aby zwracało ci tylko ten jeden rekord który potrzebujesz.

error91 napisał(a):

To może warto napisać to zapytanie tak żeby zwracało tylko wiersz z NIPem takim jaki chcesz ?

Wojciech Guse napisał(a):

Problem jest taki, ze nie wiem jaki nip tam wystąpi :) zapytanie zwraca dane dla których termin jest bliżej niż 31 dni. ....

Więc wystarczy dopisać do zapytania AND NIP = '99999999'

0

Moje dane w DataTable powstają po zapytaniu ok. 230 baz danych (1 baza dla 1 Klienta którego identyfikuje po NIP).
Zapytanie do SQL zwraca NIP oraz dane pracowników danego klienta, jeżeli termin kończy się w ciągu 31 dni.
Więc czasami w mojej DataTable jest np 15 wierszy z tym samym nipem ale różne nazwiska i imiona.
Dlatego po wybraniu wiersza pobieram numer NIP, wyszukuję w tabeli wiersze, które posiadają ten wybrany NIP i generuje z listy maila :)
Nie wiem jak to inaczej opisać, zdaję sobie sprawę, że to trochę zagmatwane...

EDIT: W sumie mógłbym po wybraniu nipu dodać kolejne query na podstawie wybranego NIP do danego klienta ale to chyba bardziej uciążliwe niż przeszukiwanie DT o mniejszej ilośći wpisów,

0
Wojciech Guse napisał(a):

Moje dane w DataTable powstają po zapytaniu ok. 230 baz danych (1 baza dla 1 Klienta którego identyfikuje po NIP).

Kto to wymyślił? :(

Zapytanie do SQL zwraca NIP oraz dane pracowników danego klienta, jeżeli termin kończy się w ciągu 31 dni.

Ale NIP w jednej bazie jest zawsze taki sam? (Skoro to baza jednego klienta.)

0
somekind napisał(a):
Wojciech Guse napisał(a):

Moje dane w DataTable powstają po zapytaniu ok. 230 baz danych (1 baza dla 1 Klienta którego identyfikuje po NIP).

Kto to wymyślił? :(

Zapytanie do SQL zwraca NIP oraz dane pracowników danego klienta, jeżeli termin kończy się w ciągu 31 dni.

Ale NIP w jednej bazie jest zawsze taki sam? (Skoro to baza jednego klienta.)

Ja tego nie wymyśliłem, jedynie na tym pracuje :) takie rozwiązanie ma swoje wady i zalety.

Co do bazy, to tak, dla jednej bazy jest jeden NIP.

0

Więc skoro w jednej bazie jest jeden NIP, i potrzebujesz maila dla jednego NIP, to po co mieszasz potem dane z różnych baz w jednym DataTable? Nie prościej na podstawie każdej bazy oddzielnie przygotować ten email?

1 użytkowników online, w tym zalogowanych: 0, gości: 1