Archiwum kategorii: ASP.NET MVC

SQL Dobre praktyki przy pisaniu zapytań sql.

Czesto w sieci widzę pytania typu: jak dobrze pisać zapytania SQL? albo jakie są dobre praktyki pisania zapytań sql? itp. Postanowiłem podzielić się z Wami kilkoma poradami tego typu. Modyfikacja "swojego warsztatu" zalezy oczywiście od stopnia Twojego zaawandowania w pisaniu zapytań ale może komus się przydadzą. Podane poniżej porady stosuję osobiście i wynikaja one z mojego długoletniego doświadczenia w pracy z bazami danych.

1. Nie rzucaj sie od razu na głęboką wodę.

Jeśli masz do napisania jakieś skomplikowane zapytanie to dobrym sposobem jest rozbić je sobie na kilka kroków. Nie zaczynaj od razu pisać postaci finalnej tylko dojdź do tej postaci etapami. Chodzi o to, że jak zbudujesz dość duże zapytanie to ciężko jest później szukać ewentualnych błędów a tak jak podzielisz prace na mniejsze etapy to za każdym razem przy końcu danego etapu możesz sprawdzić poprawność swojego zapytania.

2. Podzapytania testuj osobno.

Często się zdarza, że w swoim zapytaniu potrzebujesz utworzyć podzapyanie. Ja podzapytania staram się budować obok głównego zapytania i dopiero jak sie upewnię, że działa ono poprawnie dołączam je do zapytania głównego. Czasami zdarza się, że Twoje zapytanie zwraca błędne wyniki a Ty ciągle analizujesz "główne zapytanie" a tak naprawdę to Twoje podzapytanie może zwracać błędne wyniki cząstkowe.

3. Poprawność, czytelność, optymalizacja

Bardzo często za szybko i za dużo chcesz zrobić w jednym kroku. Od razu przy budowaniu myślisz o optymalizacji i to nie jest generalnie złe. Ale często za bardzo skupiasz się na optymalizacji na samym początku i cierpi na tym poprawność i czytelność zapytania.

Moim zdaniem lepiej jest zacząć od poprawności i czytelności zapytania. Oczywiście kluczowa jest tutaj poprawność ale NIE bagatelizujcie czytelności zapytania. Czasami na szybko próbujesz coś stworzyć. Piszesz i piszesz i Twoje zapytanie staje się juz dosyć sporawe i nagle błąd. Bez zadbania od razu o czytelność zapytania trudno Ci będzie szybko zdiagnozować problem.

4. Zapoznaj się z danymi.

Jak nie poznasz dobrze zbioru danych do którego będziesz pisał zapytania to przygotuj się na drogę przez mękę. Poświęć czas na poznanie tabel, zależności pomiędzy nimi i typów danych w kolumnach itd. Ale także a może przede wszystkim zastanów się jakie wartości mogą przechowywać Twoje tabele/kolumny i głównie chodzi mi tutaj np o NULL-e. Bardzo często to właśnie wartości null mogą bardzo pomóc lub wygenerować jakiś nichciany błąd. Powiedzmy, że mamy kolumnę "DataKoniecZatrudnienia" i tam przy niektórych pracownikach są wartości NULL. Oznacza to, że jeśli jest NULL to pracownik jeszcze pracuje w firmie bo w tej klumnie nie ma konkretnej wartości i w przykładowym zapytaniu np.: pokaż mi wszystkich pracowników, którzy pracują aktualnie w firmie ta informacja może bardzo pomóc. Ale np. okazuje się, że są przypadki kiedy przy pracowniku nie ma ani daty zatrudnienia ani daty końca zatrudnienia i oznacza to, że pracownik jest zatrudniany np. na umowy zlecenia ale jest wykazywany na liście pracowników itp.

Sam widzisz, że kombinacji może być wiele i bez dobrego rozpoznania tematu można nieźle zamieszać zapytaniem.

5. Do poprawności analizuj mniejsze ilości danych lub pojedyncze małe lokalizacje/działy.

Jak napiszamy sobie zapytanie które "wypluwa" nam dziesiątki tysięcy, a może i więcej, rekordów to skąd będziesz wiedział, że zapytanie zwraca poprawne wyniki? Żeby zminimalizować ryzyko wykonuj swoje zapytania na mniejszych ilościach danych np. z jednego miesiąca lub np. z jednego działu firmy itp. Niestety mniejsza ilość danych nie gwarantuje oczywiście pełnego sukcesu bo ograniczamy także ilość możliwości wystąpienia takichś niestandardowych sytuacji. Chodzi tylko o to, że np. na mniejszej ilości danych jesteś w stanie szybciej przeanalizować poprawność wyników zapytania.

6. Robisz UPDATE? Pamiętaj o kryteriach WHERE.

Informatyk jest jak saper. Niektóre czynności robi tylko raz i z reguły to wystarczy żeby uczyć się na swoich błędach. Czasami jednak straty są już nie do naprawienia. Przykład z życia. Pewien znajomy informatyk napisał sobie UPDATE-a w celu zmiany ceny jednego produktu w sklepie internetowym. Jakieś było jego zdziwienie jak po chwili wszystkie produkty miały takią samą cenę. Jeśli modyfikujesz jeden lub tylko kilka rekordów to przyjmij zasadę UPDATE = WHERE czyli jeśli stosujesz UPDATE to musi wystąpić WHERE z warunkami opisującymi który rekord, lub grupę rekordów, zmodyfikować w innym przypadku "polecisz po całej tabeli" i będzie rozmowa dyscyplinująca z przełożonym (w najlepszym przypadku).

To na dzisiaj tyle. Myślę, że w miarę możliwości będę ten post rozbudowywał lub dorzucał jego kolejne części.

 

 

PostgreSQL łączenie stringów (konkatenacja) i NULL-e.

PostgreSQL łączenie stringów (konkatenacja) i NULL-e.

 

Do łączenia stringów w PostgreSQL możemy podejść na dwa sposoby.

Sposób 1. Użyj operatora konkatenacji ||

Zadanie 1

Połącz dwa stringi 'Text1' i 'Text2'.

Rozwiązanie

SELECT 'Text1' || 'Text2'

Wynik

Text1Tex2

Zadanie 2

Połącz text 'Text1' i NULL

Rozwiązanie

SELECT 'Text1' || NULL

Wynik

NULL

Zadanie 3

Połącz text 'Text1', wartość NULL i 'Text2'

Rozwiązanie

SELECT 'Text1' || NULL || 'Text2'

Wynik

NULL

 

Sposób 2. Użyj funkcji CONCAT()

Zadanie 1

Połącz dwa stringi 'Text1' i 'Text2'.

Rozwiązanie

SELECT CONCAT( 'Text1' , 'Text2')

Wynik

Text1Tex2

Zadanie 2

Połącz text 'Text1' i NULL

Rozwiązanie

SELECT CONCAT( 'Text1' , NULL)

Wynik

Text1

Zadanie 3

Połącz text 'Text1', wartość NULL i 'Text2'

Rozwiązanie

SELECT CONCAT( 'Text1' , NULL , 'Text2' )

Wynik

Text1Text2

 

Podsumowanie

Wszędzie tam gdzie spodziewasz się, że jedna z części, które chcesz połączyć w nowy string, może być NULL-em, używaj funkcji CONCAT().

Jak obliczyć cenę zużycia prądu przez konkretne urządzenie?

Pewnie nie raz zastanawialiście się ile kosztuje zagrzanie wody w czajniku elektrycznym, albo ile kosztuje dziennie działanie komputera lub ile kosztuje miesięczne lub roczne użytkowanie danego urządzenia? W pewnym momencie też stanąłem przed takim pytaniem i postanowiłem sam oblicz ile energii zużywają moje urządzenia w domu.

Do obliczenia kosztów użytkowania urządzeń musisz znać ilość energii którą pobiera urządzenie, która wyrażona jest w Watach (W) i czas użytkowania urządzenia. Z reguly taką informację znajdziesz na opakowaniu lub na naklejce z tyłu lub pod spodem urządzenia.

Przykład:
Dla lepszego zobrazowania obliczeń weźmy pod uwagę czajnik elektryczny o mocy 1300 W i przyjmijmy, że zagotowanie pełnego czajnika wody zajmie nam 5 minut.

Moc czajnika wyrażona jest w Watach (W) a czas zagotowania wody w minutach. Koszty energii wyrażone są w złotych (zł) za 1 kWh (kilowatogodzinę).

Co wiemy:
moc urządzenia (czajnika) = 1300 W
czas działania urządzenia = 5 minut
cena energii za 1 kWh = 0,55 zł (uśredniona cena energii w Polsce za 1 kWh w 2018 roku na podstawie danych od dostawców prądu)

Zwróć uwagę że cena energii jest wyrażona w kWh (kilowatogodzinach), moc urządzenia w Watach (W) a czas działania urządzenia w minutach. Trzeba to wszystko tak poprzeliczać żeby do siebie pasowało.

Żeby otrzymać ilość zużytych przez urządzenie kWh musimy moc urządzenia, wyrażoną w Watach (W), zamienić na kW (kilowaty) a czas w minutach zamienić na godziny i podstawić do wzoru.

moc_urzązenia * czas_działania_urządzenia = ilość_zużytych_kWh

a więc:
żeby zamienić moc urządzenia na kW musimy moc w Watach pomnożyć przez 1000. To tak jak z dystansem, 1 km to 1000 m. Tak samo z mocą 1 kW to 1000 W. Ok to już mamy.
Teraz zamieńmy czas działania urządzenia, wyrażoną w minutach, na godziny. Żeby wiedzieć ile to jest 5 minut wyrażone w godzinach musimy podzielić 5 (czas działania urządzenia) przez 60 (bo godzina ma 60 minut). Zaokrąglony wynik to 0,083 h (godzina).

możemy już podstawić nasze dane do powyższego wzoru:

moc_urzązenia * czas_działania_urządzenia = ilość_zużytych_kWh

1,3 kW * 0,083 h = 0,1079 kWh

Wynikiem powyższego równania jest zużycie energii przez czajnik w ciągu 5 minut jego działania. Wynik jest wyrażony w kWh (kilowatogodziny). Teraz żeby poznać ostateczną cenę wystarczy przemnożyć nasz wynik przez koszt 1 kWh czyli w naszym przypadku przez 0,55 zł.

0,1079 kWh * 0,55 zł = 0,05945 zł = ok. 6 groszy

Rozwiązanie naszego problemu:
Podgrzanie wody w czajniku o mocy 1300 W, przy założeniu że potrwa to 5 minut, będzie nasz kosztowało w przybliżeniu 6 groszy.

 

 

C++ kurs programowania obiektowego (#0)

C++ kurs podstawy programowania

Zmienne. Typy danych.
Instrukcja warunkowa if else.
Instrukcja warunkowa switch case.
Pętla for.
Pętla while.
Pętla do while.
Praca z plikami tekstowymi, zapis.
Praca z plikami tekstowymi, odczyt.
Wskaźniki
Przekazywanie argumentów przez wartość
Przekazywanie argumentów przez wskaźnik
Przekazywanie argumentów przez referencję

C++ kurs programowania obiektowego

(#1) Środowisko programistyczne IDE (skąd pobrać? jak rozpocząć programować?)
(#2) Pierwszy program "Hello world!".
(#3) Pierwszy program omówienie kodu.
(dodawanie bibliotek, wskazywanie przestrzeni nazw, funkcja main)
(#4) Obiekty (zacznij myśleć obiektowo)
(#5) Klasy
(#6) Jak stworzyć dobry projekt (podział kodu na pliki)
(plik nagłówkowy, plik z ciałami metod)

Jak wyczyścić, zresetować bufor wydruku w systemie Windows 7 i 10

Dzisiaj zajmiemy się problemem z drukark pt. bufor wydruku. Czasami zdarza się, że drukarka nie chce współpracować. Mimo, że "wysyłamy" do niej dokumenty drukarka nie reaguje. W takich sytuacjach bardzo często pomaga "wyczyszczenie" bufora wydruku. Jak to zrobić przeczytasz poniżej.

Krok 1. Sprawdzamy czy w katalogu "C:\Windows\System32\spool\PRINTERS" znajdują się jakieś pliki. W przypadku problemów z buforem wydruku powinny być.

Krok 2. Uruchamiamy wiersz poleceń (z uprawnieniami administratora). W polu "szukaj" (w menu start) wprowadzamy tekst "cmd" a następnie prawym przyciskiem myszy (dalej PPM) i z podręcznego menu wybieramy opcję "uruchom jako administrator". Po uruchomieniu wiersza poleceń wprowadzamy komendę.

net stop spooler

która zatrzyma nam usługę  "Bufor wydruku". Po zatwierdzeniu (Enter) powinniśmy otrzymać komunikaty:


"Usługa Bufor wydruku jest właśnie zatrzymywana"
"Usługa Bufor wydruku zastała zatrzymana pomyślnie"

Krok 3. Teraz wprowadzamy komendę

del /F /q %systemroot%\system32\spool\printers\*.*

 w tym momencie usuwamy wszystkie pliki we wskazanym w kroku 1 katalogu.

Krok 4. Kolejny krok to uruchamienie z powrotem usługi "Bufor wydruku" poleceniem

net start spooler

powinniśmy otrzymać komunikat

"Usługa Bufor wydruku jest właśnie uruchamiana"
"Pomyślnie uruchomiono usługę Bufor wydruku"

Gotowe 🙂

Możemy terez sprawdzić że w katalogu z kroku 1 ("C:\Windows\System32\spool\PRINTERS") nie ma żadnych plików.

Całą "operację" w wierszu poleceń obrazuje poniższy rysunek.

Jak wyczyścić, zresetować bufor wydruku w systemie Windows 7 i 10

 

 

ASP.NET MVC Przesyłanie (przekazywanie) danych z kontrolera do widoku z użyciem funkcji ViewBag

ASP.NET MVC Przesyłanie (przekazywanie) danych z kontrolera do widoku z użyciem funkcji  ViewBag

W niniejszym wpisie pokaże jak, za pomocą funkcji ViewBag, można przesłać (przekazać) dane z kontrolera do widoku. Stworzymy listę kilku pracowników firmy i prześlemy ją do widoku w celu wyświetlenia.

W tym celu tworzymy nowy projekt ASP.NET Web Application (jak to zrobić przeczytasz <<<tutaj>>>)

Kolejny krok to stworzenie modelu danych. Czyli musimy określić jakie dane i jakiego typu będziemy przechowywać. W tym celu klikamy prawym przyciskiem myszy (dalej PPM) na katalogu Models w oknie Solution Explorer i wybieramy opcję Add ® Class

asp.net mvc kontroler widok viewbag

Następnie w oknie Add New Item wybieramy opcję Class, w polu Name wprowadzamy nazwę pracownik i potwierdzamy przyciskiem Add.

asp.net mvc kontroler widok viewbag

Teraz określimy jakie dane o pracowniku będziemy przechowywać. W oknie solution explorer rozwijamy gałąź Models gdzie powinien znajdować się plik pracownik.cs, klikamy na ten plik. W ognie głównym Visual Studio otworzy się nam nowa zakładka pracownik.cs w którym zobaczymy następujący kod.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ViewBag.Models
{
    public class pracownik
    {
    }
}

Uzupełniamy klasę pracownik zgodnie z poniższym listingiem


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ViewBag.Models
{
    public class pracownik
    {
        public string Imie { get; set; }
        public string Nazwisko { get; set; }
        public string Stanowisko { get; set; }
        public string Dzial { get; set; }
        public string Miejscowosc { get; set; }
        public int Pensja { get; set; }    }
}


Widzimy tutaj, że będziemy przechowywać takie informacje jak imię, nazwisko, stanowisko, dzial, miejscowość i pensja. Oczywiście wszystkie pola „nie liczbowe” są typu string a pole pensja ma przechowywać liczby.

OK w tym momencie mamy gotowy model danych.

Teraz musimy oprogramować metodę w kontrolerze która będzie przekazywała dane do widoku.

W oknie Solution Explorer przechodzimy do katalogu Controllers, rozwijamy całą gałąź i klikamy na HomeController.cs. W oknie głównym Visual Studio pojawi się nowa zakładka HomeControllers.cs. Odnajdujemy akcję ActionResult i w niej będziemy tworzyć naszą listę pracowników. Oczywiście dane do listy powinniśmy „zaciągać” z bazy danych ale nie to jest tematem tego wpisu i żeby nie zaciemniać głównego wątku krótką listę utworzymy ręcznie. Utworzymy listę 4 pracowników z przykładowymi danymi co przedstawia kod poniżej.


var pracownicy = new List {
                new pracownik { Imie = "Piotr", Nazwisko = "Nowak", Stanowisko = "Pracownik Biurowy", Dzial = "Finanse", Miejscowosc = "Warszawa", Pensja = 2500 }
                , new pracownik { Imie = "Leon", Nazwisko = "Zawodowiec", Stanowisko = "Pracownik Biurowy", Dzial = "Egzekucja", Miejscowosc = "Warszawa", Pensja = 3500 }
                , new pracownik { Imie = "Leonid", Nazwisko = "Pogoda", Stanowisko = "Pracownik Biurowy", Dzial = "Księgowość", Miejscowosc = "Warszawa", Pensja = 3000 }
                , new pracownik { Imie = "Anna", Nazwisko = "Maria", Stanowisko = "Pracownik Biurowy", Dzial = "Kadry", Miejscowosc = "Warszawa", Pensja = 2500 } };

W tym momencie mamy już model danych, zgodnie z którym utworzyliśmy listę pracowników. Teraz wystarczy tylko przekazać te dane do widoku i wyświetlić ale wcześniej należy przypisać naszą listę jako obiekt do funkcji ViewBag.

ViewBag.pracownicy = pracownicy;

Teraz obiekt ViewBag.pracownicy zawiera naszą listę pracowników.

Żeby wyświetlić tą listę zajmiemy się widokiem  Index więc zaraz po uruchomieniu aplikacji powinniśmy otrzymać listę pracowników na głównym widoku aplikacji. W oknie Solution Explorer klikamy w katalog Views następnie w katalog Home (bo w tym kontrolerze tworzyliśmy naszą listę) i wybieramy widok Index.cshtml. Nasz kod umieścimy na początku strony. Żeby wyświetlić listę najlepiej jest zrobić to w pętli a najlepiej do naszego zadania nadaje się pętla foreach (o której możesz przeczytać <<<TUTAJ>>>).  Przydatną cechą tej pętli jest to, że nie trzeba myśleć o warunku wyjścia z pętli. Foreach przeskoczy po wszystkich elementach naszej listy i zakończy działanie. Na początek stworzymy więc kod.

@{ foreach (var Item in Collection) { } }

Utworzymy więc element <div> w którym zdefiniujemy pętlę. Pamiętajmy o tym że żeby Visual Studio wiedziało, że teraz chemy korzystać z C# to musimy mu o tym powiedzieć i do tego służy kod.

@{  }

Teraz zajmijmy się samą pętlą. Aby przyspieszyć tworzenie pętli wpisujemy słówko foreach i przyciskamy dwa razy przycisk tab. W tym momencie powinna nam się utworzyć automatycznie struktura pętli foreach (jak poniżej).

@{
        foreach (var Item in Collection)
        {
            
        }
    }     

Naszą kolekcją jest lista pracownicy, a ta lista została przekazana do ViewBag.pracownicy więc słówko Collection w naszym wzorze musimy zastąpić ViewBag.pracownicy. Natomiast żeby „dobrać” się do poszczególnych elementów listy musimy posłużyć się modelem pracownik, zmieniamy więc słówko Item we wzorze na pracownik. Teraz wewnątrz pętli wyświetlimy poszczególnych pracowników w tagach paragraf. Jeżeli chcemy wyświetlić jakieś pole np. imię pracownika posługujemy się taką składnią @pracownik.Imie, czyli odwołujemy się, za każdym przebiegiem pętli, do pola Imię w obiekcie  pracownik. Oczywiście nie musimy wyświetlać wszystkich informacji o pracowniku które są w naszej liście. Dla celów tego przykładu wyświetlimy tylko imię i nazwisko pracowników z listy, kod poniżej.

    @{
        foreach (var Item in Collection)
        {
            

@pracownik.Imie, @pracownik.Nazwisko

} }

Nasz projekt uruchamiamy wciskając przycisk F5. Jeżeli nie zrobiliśmy żadnego błędu zostanie uruchomiona nasza domyśla przeglądarka internetowa i naszym oczom ukaże się strona, jak na załączonym obrazku, z listą naszych pracowników.

asp.net mvc kontroler widok viewbag

Dziękujemy za czytanie naszych wpisów, mamy nadzieję, że przyczyniamy się choć troszeczkę do pogłębiania przez Was wiedzy. Pozdrawiamy i zachęcamy do czytania innych naszych wpisów.

Adventureworks 23. Policz produkty wg modeli. Wyniki posortuj malejąco wg liczby produktów danego modelu.

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Baza: AdventureWorks

Zadanie nr: 23

Treść: Policz produkty wg modeli. Wyniki posortuj malejąco wg liczby produktów danego modelu.

Polecenia/funkcje w zapytaniu: SELECT, FROM, Alias, GROUP BY, ORDER BY, COUNT(), INNER JOIN, JOIN


   


Rozwiązanie:

Zapytanie:

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Wynik:

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Pobierz skrypt sql


   


 

XAMPP PhpMyAdmin import dużej bazy danych.

XAMPP PhpMyAdmin import dużej bazy danych.

Co należy zrobić kiedy przy imporcie bazy danych na serwerze XAMPP otrzymamy komunikat "Nie otrzymano żadnych danych do importu. Albo nie dostarczono nazwy pliku, albo jego rozmiar przekroczył rozmiar maksymalny, dozwolony przez konfigurację PHP. Zobacz FAQ…" ?

Naszym problemem jest ograniczenie w wielkości pliku bazy danych który chcemy zaimportować. W moim przypadku jest to 2M a korzystam z XAMPP w wersji 1.7.7. Aby zwiększyć rozmiar dopuszczalnego pliku musimy odnaleźć plik php.ini w którym należy zwiększyć tą wartość. Standardowo plik php.ini znajduje się w lokalizacji gdzie zainstalowaliśmy serwer XAMPP, następnie przechodzimy do katalogu php w którym znajdziemy nasz pliczek php.ini. Kolejny krok to wyedytowanie naszego pliku. W tym celu klikamy prawym przyciskiem myszy na naszym pliku u z menu wybieramy opcję otwórz za pomocą i z kolejnego rozwijalnego menu wybieramy opcję notatnik.
Kolejnym krokiem jest wyszukanie odpowiedniego fragmentu pliku do modyfikacji. W tym celu wciskamy kombinację klawiszy Ctrl +F. Po wybraniu tej kombinacji klawiszy uruchomi się okno znajdowanie i w polu Znajdź wpisujemy upload_max_filesize. Tak jak wspomniałem wcześniej ja w swojej wersji XAMPP-a mam ograniczenie do 2 mega i w moim przypadku ten fragment wygląda następująco.

upload_max_filesize=2M

 teraz wystarczy zmienić wartość po znaku "=" na odpowiedni, czyli taki żebyśmy mogli zaimportować naszą bazę danych.

Powodzenia 🙂

 

SQL LIKE

SQL LIKE


    


DEFINICJA

Operator LIKE służy do filtrowania wyników zapytania tylko do takich rekordów gdzie wartości w danej kolumnie są zgodnie z wzorem podamy przy tym operatorze. Operatora LIKE używamy przy złączeniu z klauzulą WHERE.

SQL LIKE składnia

WHERE
    nazwa_kolumny LIKE wzorzec


Przykład zastosowania LIKE (baza Adventureworks)

Wyświetl wszystkie produkty (kolumny: Nazwa Produktu , Numer Produktu) których nazwa zaczyna się na 'A'.

SELECT
     Name AS [Nazwa Produktu]
    ,ProductNumber AS [Numer Produktu]
FROM
    Production.Product
WHERE
    Name LIKE 'A%'

znak '%' we wzorcu operatoar LIKE oznacza tyle, że w tym miejscu we wzorcu może wystąpić dowolny ciąg znaków


 Przykład zastosowania LIKE (baza Northwind)

Wyświetl wszystkich pracowników (wyświetl tylko kolumny: Nazwisko , Imię , DataUrodzenia) których imię kończy się na 't'.

SELECT
     Prac.LastName AS Nazwisko
    ,Prac.FirstName AS Imię
    ,Prac.BirthDate AS [Data Urodzenia]    
FROM
    Employees AS Prac
WHERE
    Prac.FirstName LIKE '%t'