Si te lidhet Python me SQL Server, dhe si te manipulojme me shenime

Ne kete artikull do te mundohem te pershkruaj dhe sqaroj se si behet nderlidhja ne mes te platformes SQL Server me Python, dhe si te manipulojme me shenime te cilat gjenden ne databazat perkatese, mirepo deshirojme ato shenime t’i nxjerrim apo lexojme ne Python IDE. Normalisht pervec leximit te te dhenave nga databaza ne Python, mund te bejme edhe regjistrimin, perditesimin dhe fshirjen e shenimeve nga Python, e me pas ato shenime pasqyrohen ne/nga databazat perkatese qe gjenden ne SQL Server.

Per te mundesuar lidhjen e Python me SQL Server, se pari duhet ta instalojme dhe perdorim paketen pyodbc, e cila mundeson komunikimin ndermjet Python dhe SQL Serverit (gjithashtu edhe me platformat tjera, sic jane psh: Oracle, mysql, etj).

Instalimi i paketes pyodbc

Per te instaluar dhe me pas per ta importuar paketen pyodbc ne Python, duhet t’i ndjekim disa hapa, te cilat do t’i pershkruaj ne vazhdim. Pra, instalimi i paketes pyodbc behet duke perdore PIP (package manager ose package management system).

Po supozojme qe jemi duke perdore sistemin operativ Windows ne kompjuterin tone, me c’rast instalimi i nje pakete te Python-it behet duke hapur Command Prompt, dhe me pas shenohen komandat ne vijim:

pip install package_name

Ne rastin tone konkret, pasi te hapet Command Prompt, navigojme ne shtegun: C:\Users\mentor\AppData\Local\Programs\Python\Python310\Scripts, dhe me pas shenohet pip install pyodbc, sic eshte treguar meposhte:

C:\Users\mentor\AppData\Local\Programs\Python\Python310\Scripts\pip install pyodbc

Pasi te ekzekutohen keto komanda, rezultati do te jete si ne vijim:

Pra, pasi eshte bere instalimi i paketes pyodbc, tani plotesohen parakushtet qe te vazhdojme me lidhjen e Python me SQL Server, si dhe te behen manipulimet e duhura qe kane te bejne me shenimet qe gjenden ne databaze.

Leximi i te dhenave nga databaza ne SQL Server

Sintaksa e pergjithshme per leximin e shenimeve nga nje databaze, e qe duhet te shkruhet ne gjuhen programuese Python eshte si meposhte:

ku:

  • server_name eshte emri i serverit.
  • database_name eshte emri i databazes.
  • table_name eshte emri i tabeles.

Shembuj konkret si behet manipulimi i shenimeve nga databaza permes Python IDE

Meposhte do t’i pershkruaj disa shembuj konkret se si lexohen, regjistrohen, perditesohen, dhe fshihen shenimet (CRUD operacionet) nga databaza me emrin KlientetDB (e cila ekziston ne SQL Server), perkatesisht nga tabela Klientet qe permbane informatat e klienteve.

Gjithashtu le te supozojme qe kemi te instaluar nje database server ne kompjuterin tone me emrin mentor-pc, ku per nevoja testimi le te jete SQL Server Express Edition qe do te thote se emri i instances (default) eshte sqlexpress.

Leximi i shenimeve

Le te supozojme qe deshirojme t’i lexojme dhe nxjerrim informatat e klienteve qe gjenden ne tabelen Klientet.
Informatat e klienteve qe gjenden ne databazen e SQL Serverit jane si meposhte:

te cilat jane nxjerre duke perdore SSMS (Management Studio).

Kurse sintaksa e duhur per leximin e shenimeve nga tabela Klientet ne Python IDE eshte si ne vijim:

Pasi ta ekzekutojme sintaksen e mesiperme, do t’i shohim te gjithe klientet qe gjenden ne tabelen Klientet nga databaza e SQL Serverit, me c’rast rezultati do te jete si meposhte:

Regjistrimi i shenimeve

Le te supozojme tani qe deshirojme t’i regjistrojme disa klient te ri permes Python, atehere sintaksa e duhur per regjistrimin e klienteve ne tabelen Klientet eshte si ne vijim:

Pasi ta ekzekutojme sintaksen e mesiperme, nese shikojme rezultatet ne databaze permes SSMS do te shohim klientin e ri qe eshte regjistruar, me c’rast rezultati do te jete si meposhte:

Perditesimi i shenimeve

Ne vazhdim le te supozojme qe deshirojme te perditesojme klientin me ID=5 dhe ta permiresojme mbiemrin e klientit ne Kastrati. Sintaksa e duhur per realizimin e ketij veprimi, do te jete si meposhte:

Pasi ta ekzekutojme sintaksen e mesiperme, do te duhej qe te perditesohet mbiemri i klientit ne fjale, me c’rast rezultati do te jete si meposhte:

Fshirja e shenimeve

Le te supozojme qe deshirojme te fshijme shenime nga tabela Klientet, psh dy klienta te cilet kane ID-ne 3, dhe 6. Sintaksa e duhur per realizimin e ketij veprimi, do te jete si meposhte:

Pasi ta ekzekutojme sintaksen e mesiperme, do te duhej qe te fshihen dy klientat me ID-te e cekura, me c’rast rezultati do te jete si meposhte:


Shenim:

Pervec paketes pyodbc, ekziston edhe paketa tjeter me emrin pymssql, e cila pothuasje ofron te njejtat vecori dhe benefite me paketen e pershkruar mesiper, mirepo perzgjedhja ime ishte vetem si demonstrim se si mund realizohet lidhja dhe komunikimi i Python me SQL Server!

Krijimi i nje kuizi duke perdore gjuhen programuese Python

Nevoja per krijim te kuizeve ose testeve eshte mjaft e madhe, qofte per qellime te hulumtimeve te ndryshme, qofte per vleresimin e diturise per ndonje teme te caktuar, e sidomos krijmi dhe perdorimi i kuizeve eshte i dobishem kur deshirojme qe te “matim” njohurite e nje studenti/punetori per te na konfirmuar dhe treguar qe ai/ajo ka njohurite e duhura per nje teme ose fushe te caktuar!
Menyra e implementimit te krijimit te nje kuizi le te jete duke perdore gjuhen programuese Python!

Pershkrimi i kuizit

Le te supozojme qe deshirojme te krijojme nje kuiz i cili ka te beje me vleresimin e nje studenti per disa tema te ndryshme. Le te perpilojme kuizin qe permbane gjithesej 5 pyetje (normalisht numri i pyetjeve mund te jete sado qe nevojitet).
Kuizi do te krijohet ne at menyre qe cdo pergjigje e sakte do te vleresohet me 1 pike, kurse cdo pergjigje jo e sakte do te vleresohet me 0 pike. Gjithashtu plotesuesi i kuizit do te kete mundesi qe nese pergjigja e pare eshte e pasakte, atehere do te kete mundesi te pergjigjet per here te dyte. Perndryshe nese edhe pas heres se dyte pergjigjet jo sakte, atehere kalohet ne pyetjen e radhes, dhe keshtu me radhe.

Kodi i duhur i cili mund te shkruhet ne Python, eshte si meposhte:

def check_guess(guess, answer):
    global score
    still_guessing = True
    attempt = 0
    while still_guessing and attempt < 2:
        if guess.lower() == answer.lower():
            print('Pergjigja eshte e sakte!')
            print('-------------------------------------')
            score = score + 1  # kjo mund te shenohet edhe ndryshe si: score += 1
            still_guessing = False
        else:
            if attempt < 1:
                guess = input(
                    'Pergjigja eshte jo e sakte! Ju lutem provoni perseri... ')
            attempt = attempt + 1
    if attempt == 2:
        print('Keni dhene pergjigje te gabuar! Pergjigja e sakte eshte: ' + answer)
        print('-------------------------------------')


score = 0
print('Kuiz i pergjithshem!')
question1 = input('1) Sa eshte rezultati i 6+4*2?\n A) 12\n B) 14\n C) 16\n D) 8\n Shenoni: A, B, C, D? ')
check_guess(question1, 'B')

question2 = input('2) Cili eshte shteti me me se shumti banore ne bote? ')
check_guess(question2, 'Kina')

question3 = input('3) Cili eshte kryeqyteti i Gjermanise?\n 1) Hamburg\n 2) Dortmund\n 3) Berlin\n 4) Bon\n Shenoni: 1, 2, 3, 4? ')
check_guess(question3, '3')

question4 = input('4) Karrotat jane perime?\n Po\n Jo\n Asnjera\n Shenoni: Po, Jo, Asnjera? ')
check_guess(question4, 'Po')

question5 = input('5) Cili numer duhet te vije pas ketij vargu 1, 3, 6, 10, ...? ')
check_guess(question5, '15')

print('Rezultati juaj final eshte: ' + str(score), 'pike')
print('Piket maksimale jane 5!\n',
      'Urime, keni arritur', score/5*100, '% te kalueshmerise!')

Sqarimi i kodit

  • Ne rreshtin 1 te kodit eshte krijuar nje funksion me emrin check_guess, i cili pranon dy parametra: pyetjen dhe pergjigjen.
  • Pjesa e kodit ne rreshtin 2 paraqet variablen e rezultatit (score) e cila eshte variabel globale dhe na siguron qe cdo ndryshim qe behet ne kete variabel mund te shihet ne te gjithe programin.
  • Variabla ne rreshtin 3 ruan nje nga dy vlerat e mundshme: True ose False. Pra, ne menyre qe te dijme nese plotesuesi i kuiziti ka marr pergjigje te sakte, duhet te krijojme nje variabel te quajtur psh me emrin still_guessing. Me pas e vendosim variablen si True per te treguar se pergjigja e sakte nuk eshte gjetur. Kurse nese vendoset variabla si False, atehere plotesuesi i kuizit merr pergjigje te sakte.
  • Pjesa e kodit ne rreshtin 5, perkatesisht while loop ekzekuton 2 here kontrollimin e kodit (kushtin) ose derisa plotesuesi i pyetjes merr pergjigjen e sakte.
  • Pjesa e kodit ne rreshtin 6 mundeson qe pa marre parasysh se a shenohet pergjigja me shkronja te medha, me te vogla ose kombinim i tyre, rezultati do te pranohet si i njejte (me shkronja te vogla). Psh nese njera nga pergjigjet eshte Python, atehere edhe nese pergjigjemi si: python, PYTHON, … rezultati eshte i njejte. Pra permes funksionit lower() mundesohet qe te gjitha shkronjat te konvertohen/ndryshohen ne shkronja te vogla (lower-case characters) para se ato te kontrollohen apo validohen.
  • Pjesa e kodit ne rreshtin 16 na tregon se cila eshte pergjigja e sakte pas 2 tentimeve me pergjigje te gabuara.
  • Pjesa e kodit ne rreshtin 21, perkateisht score = 0 paraqet variablen fillestare per te ruajtur vleren fillestare te rezultatit, e cila me pas rritet per 1 pike pas cdo rezultati te sakte.
  • Variablat ne rreshtin 23, 26, 29, 32, 35 ruajne vlera perkatese varesisht se cka shenon plotesuesi i kuizit ne pyetjen perkatese.
  • Pjesa e kodit ne rreshtin 24, 27, 30, 33, 36 paraqet kontrollimin dhe validimin e pergjigjes se sakt te cdo pyetje perkatese, permes se ciles thirret funksioni check_guess(). Pra, permes ketij funksioni pranohet pyetja e dhene, dhe kontrollohet se a eshte e sakte pergjigja perkatese.
  • Pjesa e kodit ne rreshtin 38, perkatesisht pjesa str(score) krijon nje mesazh qe tregon numrin e pikeve te arditura dhe i paraqet ato ne ekran.

Paraqitja e pyetjeve dhe rezultateve te pergjigjeve perkatese

Kuiz i pergjithshem!
1) Sa eshte rezultati i 6+4*2?
 A) 12
 B) 14
 C) 16
 D) 8
 Shenoni: A, B, C, D? d
Pergjigja eshte jo e sakte! Ju lutem provoni perseri... b
Pergjigja eshte e sakte!
-------------------------------------
2) Cili eshte shteti me me se shumti banore ne bote? kina
Pergjigja eshte e sakte!
-------------------------------------
3) Cili eshte kryeqyteti i Gjermanise?
 1) Hamburg
 2) Dortmund
 3) Berlin
 4) Bon
 Shenoni: 1, 2, 3, 4? 2
Pergjigja eshte jo e sakte! Ju lutem provoni perseri... 4
Keni dhene pergjigje te gabuar! Pergjigja e sakte eshte: 3
-------------------------------------
4) Karrotat jane perime?
 Po
 Jo
 Asnjera
 Shenoni: Po, Jo, Asnjera? po
Pergjigja eshte e sakte!
-------------------------------------
5) Cili numer duhet te vije pas ketij vargu 1, 3, 6, 10, ...? 14
Pergjigja eshte jo e sakte! Ju lutem provoni perseri... 15
Pergjigja eshte e sakte!
-------------------------------------
Rezultati juaj final eshte: 4 pike
Piket maksimale jane 5!
 Urime, keni arritur 80.0 % te kalueshmerise!

Shenim:
Vlene te permendet qe ekzistojne edhe metoda tjera permes te cilave mund te krijohen kuize te ndryshme duke perdore gjuhen programuese Python. Psh metoda tjeter (e cila mund te jete me e preferueshme) e krijimit te nje kuizi eshte perdorimi i klasave, lists, arrays, for loops! Megjithate edhe metoda te cilen e kam zgjedhe, shpresoj qe eshte e duhura dhe sado pak e pershkruan logjiken dhe menyren e krijimit te nje kuizi duke perdore gjuhen programuese Python.


Normalisht kjo pjese e kodit te cilen e kam shenuar me larte, mund te vendoset dhe ekzekutohet ne Python IDE, ose cfaredo “code editori” ne te cilen eshte i instaluar Python extension, sic jane psh: Visual Studio Code (VSC), Sublime Text, etj.

Kalkulimi i pagës duke përdorë gjuhën programuese Python

Kalkulimi i pages eshte nje nga informatat shume te rendesishme qe duhet ta dijne te gjithe punetoret (qofte punedhenesi ose punemarresi), sidomos punetoret e rinje te cilet vetem se kane filluar punen dhe presin te marrin pagen e pare :), por gjithashtu edhe punetoret ekzistues te cileve eventualisht i peson rritje paga!

Edhepse ka mjaft kompani ose programera qe kane zhvilluar aplikacione te ndryshme qe ekzistojne ne treg (duke perdore Excel, C#, PHP, Java, etj) te cilat mundesojne kalkulimin e pages me te gjitha kontributet dhe shkallet e tatimeve perkatese, mirepo pak nga ato kompani/programera tregojne menyren ose kodin burimor se si e kane implementuar nje gje te tille!

Megjithate une do te mundohem qe te paraqes sintaksen perkatese duke perdore komandat e ndryshme qe i ofron gjuha programuese Python! Normalisht kjo pjese e kodit mund te vendoset dhe ekzekutohet ne Python IDE, ose cfaredo “code editori” ne te cilen eshte i instaluar Python extension, sic jane psh: Visual Studio Code (VSC), Sublime Text, etj.

while True:
    try:
        paga_bruto = float(input("Shenoni pagen bruto:"))
        if paga_bruto < 0:
            raise ValueError("Vlera e dhene nuk eshte valide")
    except ValueError:
        print('Vlera e dhene', paga_bruto, 'nuk eshte valide!')
        continue
    kontributi_punetorit = 0.05
    kontributi_punedhenesit = 0.05
    paga_tatueshme = paga_bruto-paga_bruto*kontributi_punedhenesit
    # Perqindjet e tatimeve sipas vleres se pages (0-80 = 0%, 80-250 = 4%, 250-450 = 8%, >450 = 10%)
    t1 = 0.0
    t2 = 0.04
    t3 = 0.08
    t4 = 0.1
    tatimi1 = 0
    tatimi2 = 80
    tatimi3 = 250
    tatimi4 = 450
    if paga_bruto > 0 and paga_bruto <= 80:
        t = (tatimi2-tatimi1)*t1
        paga_neto = paga_tatueshme-paga_tatueshme*t1-t
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((paga_tatueshme-tatimi1)*t1, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    elif paga_bruto > 80 and paga_bruto <= 250:
        t = (paga_tatueshme-tatimi2)*t2+(tatimi2-tatimi1)*t1
        paga_neto = paga_tatueshme-t
        paga_neto = round(paga_neto, 2)
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((tatimi2-tatimi1)*t1, 2), "euro")
        print("Paga prej 80-250€:", round((paga_tatueshme-tatimi2)*t2, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    elif paga_bruto > 250 and paga_bruto <= 450:
        t = (paga_tatueshme-tatimi3)*t3+(tatimi3-tatimi2)*t2
        paga_neto = paga_tatueshme-t
        paga_neto = round(paga_neto, 2)
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((tatimi2-tatimi1)*t1, 2), "euro")
        print("Paga prej 80-250€:", round((tatimi3-tatimi2)*t2, 2), "euro")
        print("Paga prej 250-450€:", round((paga_tatueshme-tatimi3)*t3, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    elif paga_bruto > 450:
        t = (paga_tatueshme-tatimi4)*t4 + \
            (tatimi4-tatimi3)*t3+(tatimi3-tatimi2)*t2
        paga_neto = paga_tatueshme-t
        paga_neto = round(paga_neto, 2)
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((tatimi2-tatimi1)*t1, 2), "euro")
        print("Paga prej 80-250€:", round((tatimi3-tatimi2)*t2, 2), "euro")
        print("Paga prej 250-450€:", round((tatimi4-tatimi3)*t3, 2), "euro")
        print("Paga mbi 450€:", round((paga_tatueshme-tatimi4)*t4, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    break


Kodi i mesiperm ka te beje me kalkulimin e pages primare, mirepo nese ka persona qe punojne nga 2 e me shume “puna” :), atehere kemi te bejme me pagen primare plus pagen sekondare, me c’rast kalkulimi i pages sekondare ne Python mund te behet duke perdore kodin ose skripten si ne vijim:

while True:
    try:
        paga_bruto = float(input("Shenoni pagen bruto:"))
        if paga_bruto < 0:
            raise ValueError("Vlera e dhene nuk eshte valide")
    except ValueError:
        print('Vlera e dhene', paga_bruto, 'nuk eshte valide!')
        continue
    kontributi_punetorit = 0.05
    kontributi_punedhenesit = 0.05
    paga_tatueshme = paga_bruto-paga_bruto*kontributi_punedhenesit
    # Perqindja e tatimit per pagen sekondare eshte 10%
    t = 0.1
    tatimi = paga_tatueshme*t
    paga_neto = paga_tatueshme-paga_tatueshme*t
    tatimi = round(tatimi, 2)
    paga_neto = round(paga_neto, 2)
    print("----------------------------------------")
    print("Paga bruto:", paga_bruto, "euro")
    print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
    print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
    print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
    print("Vlera totale e tatimit:", tatimi, "euro")
    print("Paga neto:", paga_neto, "euro")
    print("----------------------------------------")

Validimi i te dhenave duke perdore SQL Constraints

Cdo databaze, perkatesisht aplikacion duhet te posedoje ndonje mekanizem, i cili e ben kontrollimin dhe validimin e te dhenave brenda saj. Kjo arrihet duke perdore validime te ndryshme, perkatesisht SQL constraints qe mund te aplikohen ne nivel te backend-it (database serverit), dhe te cilat nese aplikohen ne menyre te duhur dhe efikase, behet me komplete implementimi i nje sistemi te databazes!

SQL constraints (validuesit) jane rregulla dhe kufizime te paracaktuara te cilat aplikohen ne nje ose me shume kolona, permes te cilave kontrollohet integriteti, saktesia, si dhe besueshmeria e te dhenave ne nje aplikacion, perkatesisht ne nje databaze, e cila mund te jete e implementuar ne platformen SQL Server, MySQL, Oracle, etj.

Ne shumicen e sistemeve te databazave ekzistojne keto lloje te validimeve:

  • NOT NULL – Cakton dhte siguron qe kolona nuk pranon vlere te zbrazet.
  • IDENTITY (AUTO_INCREMENT) – Perdoret per te realizuar plotesimin apo rritjen automatike te rreshtit.
  • UNIQUE – Siguron qe rreshti ka vlere unike.
  • PRIMARY KEY – Kombinimi i nje NOT NULL dhe UNIQUE. Siguron nje kolone ose kombinimi i disa kolonave te kene nje identifikues unik qe mundeson gjetje me te lehte te nje te dhene ne tabele.
  • FOREIGN KEY – Perdoret per te lidhur nje tabele me tabelat tjera e cila siguron integritetin referencial te te dhenave.
  • DEFAULT – Vendose nje vlere fillestare per kolonen.
  • CHECK – Siguron qe kolona ploteson kriteret e nevojshme.

Pasi e pame se cka jane validuesit dhe cili eshte roli i tyre ne implementimin e nje aplikacioni, perkatesisht databaze, le te shohim tani nje shembull ose detyre konkrete qe zakonisht mund te ballafaqohemi gjate zhvillimit te nje databaze.

Ne rastin tone, le te supozojme qe deshirojme te krijojme nje databaze me emrin ProjektetDB, e cila permbane disa tabela, mirepo ne do te fokusohemi vetem ne nje tabele me emrin Projektet, ne te cilen do t’i krijojme dhe aplikojme validuesit perkates!

Para se te bejme demonstrimin se si krijohen dhe aplikohen validuesit, le te supozojme qe tabela Projektet permbane informatat dhe kolonat si ne vijim:

  • Numri rendor i projektit
  • Emri projektit
  • Lloji i projektit
  • Data e fillimit
  • Data e mbarimit
  • Pershkrimi
  • Statusi i projektit

Pershkrimi i kerkesave ne detaje le te jete si meposhte:

  • Numri rendor te mos pranoje vlera te zbrazeta, te jete unik, dhe te mos pranoje vlera negative.
  • Emri i projektit te mos pranoje vlera te zbrazeta.
  • Lloji i projektit te mos pranoje vlera te zbrazeta si dhe te pranoje vetem dy lloje te projekteve:
    Planifikim, ose Instalim.
  • Data e fillimit te projektit te mos pranoje vlera te zbrazeta.
  • Data e mbarimit te projektit mund te pranoje edhe velera te zbrazeta.
    • Data e mbarimit te projektit te mos jete me e vogel se Data e fillimit te projektit.
  • Pershkrimi te mos pranoje vlera te zbrazeta.
  • Statusi te pranoje vleren paracaktuese: Ne pritje, dhe te pranoje vetem tre lloje te statuseve: Ne pritje, Ne proces, Kompletuar.


Ne fund, le te regjistrohen disa shenime, dhe mandej t’i analizojme dhe diskutojme rezultatet!

Gjithashtu le te themi se platforma qe duhet te implementohen keto pika te jete SQL Server. Vlene te permendet qe nuk ka rendesi se cilen platforme e perdorim per demonstrimin e SQL constraints, mund te jete edhe MySQL, Oracle, PostgreSQL, etj!

Zgjidhja e detyres

Hapi 1: Krijimi i databazes dhe tabeles, krijimi i kolonave, definimi i tipit te te dhenave, si dhe krijimi dhe definimi i constraints

Create Database ProjektetDB
Go

Use ProjektetDB
Go
Create Table Projektet (
NumriRendor int NOT NULL,
EmriProjektit nvarchar(80) NOT NULL,
LlojiProjektit nvarchar(20) NOT NULL,
DataFillimit date NOT NULL,
DataMbarimit date NULL,
Pershkrimi nvarchar(400) NOT NULL,
Statusi nvarchar(20) NOT NULL CONSTRAINT df_Statusi DEFAULT 'Ne pritje',
CONSTRAINT uc_NumriRendor UNIQUE (NumriRendor),
CONSTRAINT chk_NumriRendor CHECK (NumriRendor>0),
CONSTRAINT chk_LLojiProjektit CHECK (LlojiProjektit='Planifikim' OR LlojiProjektit='Instalim'),
CONSTRAINT chk_Data CHECK (DataFillimit<=DataMbarimit),
CONSTRAINT chk_Statusi CHECK (Statusi IN('Ne pritje','Ne proces','Kompletuar'))
);


Hapi 2: Regjistrimi i te dhenave

Use DBProjektet
Go
Insert into Projektet (NumriRendor,EmriProjektit,LlojiProjektit,DataFillimit,DataMbarimit,Pershkrimi)
Values (10,'Moduli i Burimeve Njerezore','Planifikim','2016-11-25','2016-12-15','Ky projekt sherben per menaxhimin e burimeve njerezore, sic jane pagat, pushimet, etj');

Select * from Projektet


Shenim: Nga hapi 2 shohim qe kolonen Statusi e kemi anashkaluar ne sintakse, me c’rast pasi te plotesohen kriteret e validimeve dhe te futen shenimet, atehere vlera e kolones Statusi do te jete Ne pritje, meqe ashtu e kemi definuar ne SQL constraint qe kjo kolone te pranoje vleren paracaktuese: Ne pritje.

Le te diskutojme disa nga rastet te cilat mund te ndodhin nese tentojme t’i regjistrojme disa te dhena:

Rasti 1:
Le te provojme te fusim prap shenime me te njejten numer rendor te projektit, psh me numrin 10 dhe t’i shohim rezultatet.

Sqarim: Ne kete rast do te paraqitet gabim (error) nga makina e databazes, per shkak se po tentojme te regjistrojme te dhena te cilat vetem se ekzistojne ne tabele me te njejten ID! Pra, numri rendor nuk mund pranoje vlera te njejta per rresht te ri, pasi qe vetem se ekzistone nje e dhene me kete ID. Pra, kete kufizim e mundeson pjesa e SQL sintakses: CONSTRAINT uc_NumriRendor UNIQUE (NumriRendor).

Rasti 2:
Le te provojme te fusim shenime ku lloji i projektit eshte Mirembajtje, dhe t’i shohim rezultatet.

Sqarim: Ne kete rast prap do te paraqitet gabim, per shkak se nuk e kemi definuar si validim opsionin Mirembajtje me rastin e krijimit te SQL check constraint.
Pra, tek validuesi CONSTRAINT chk_LLojiProjektit CHECK (LlojiProjektit=’Planifikim’ OR LlojiProjektit=’Instalim’) kemi thene qe lloji i projektit te pranoje vetem vleren Planifikim ose Instalim, e jo Mirembajtje.

Rasti 3:
Le te provojme te fusim shenime ku data e mbarimit te projektit eshte me e vogel se data e fillimit, dhe t’i shohim rezultatet.

Sqarim: Gjithashtu edhe ketu do te paraqitet gabim, per shkak se tek validuesi CONSTRAINT chk_Data CHECK (DataFillimit<=DataMbarimit) kemi thene qe data e mbarimit te projektit te jete me e madhe se data e fillimit te projektit!

Kalkulimi i harxhimeve te energjise elektrike duke perdore gjuhen programuese Python

Sic e dijme kohet e fundit pothuajse si cdo gje tjeter, edhe perdorimi i energjise elektrike eshte shtrejtuar! 😦
Megjithate, duke lene anash pjesen e diskutimeve te shumta, meposhte e kam shkruar nje pjese te kodit/skriptes ose nje “mini-program” i implementuar ne gjuhen programuese Python, i cili mundeson kalkulimin e harxhimit te energjise elektrike duke perdore komandat e ndryshme qe ofron Python. Kjo pjese e kodit mund te vendoset dhe ekzekutohet ne Python IDE, ose cfaredo “code editori” ne te cilen eshte i instaluar Python extension, sic jane psh: Visual Studio Code (VSC), Sublime Text, etj.
Jam i vetedijshem qe ka edhe zgjidhje tjera qe mundesojne nje kalkulim te tille, sic eshte psh duke perdore Excel, Java, C#, etj, mirepo une jam munduar sadopak te ofroj nje zgjidhje shtese ose alternative duke perdore Python.

tarifa_larte = float(input("Shenoni vleren e tarifes se larte: "))
tarifa_ulet = float(input("Shenoni vleren e tarifes se ulet: "))
# Tarifat e larta dhe te uleta ne bllok tarifa te ndryshme (mbi 800KW dhe nen 800KW)
a1 = 0.0675
a2 = 0.0289
b1 = 0.1252
b2 = 0.0590
t1=tarifa_larte/(tarifa_larte+tarifa_ulet)
t2=tarifa_ulet/(tarifa_larte+tarifa_ulet)
tl_nen800 = 800*t1
tu_nen800 = 800*t2 
tl_mbi800 = tarifa_larte-tl_nen800
tu_mbi800 = tarifa_ulet-tu_nen800
tarifa_fikse = 1.74
if tarifa_larte+tarifa_ulet<=800:
    vlera_totale_pa_tvsh = tarifa_larte*a1+tarifa_ulet*a2
    # tvsh eshte 8%
    tvsh = (tarifa_fikse+vlera_totale_pa_tvsh)*0.08
    vlera_totale = vlera_totale_pa_tvsh+tvsh+tarifa_fikse
else:
    vlera_totale_pa_tvsh = tl_nen800*a1+tu_nen800*a2+tl_mbi800*b1+tu_mbi800*b2 
    # tvsh eshte 8%
    tvsh = (tarifa_fikse+vlera_totale_pa_tvsh)*0.08
    vlera_totale = vlera_totale_pa_tvsh+tvsh+tarifa_fikse
    
tl_nen800 = round(tl_nen800, 2)
tu_nen800 = round(tu_nen800, 2)
tl_mbi800 = round(tl_mbi800, 2)
tu_mbi800 = round(tu_mbi800, 2)
vlera_totale_pa_tvsh = round(vlera_totale_pa_tvsh, 2)
vlera_totale = round(vlera_totale, 2)
tvsh = round(tvsh, 2)
# print("Vlera e t1:", t1)
# print("Vlera e t2:", t2)
# print("Numri i KW per tarifen e larte nen 800:", tl_nen800, "KW")
# print("Numri i KW per tarifen e ulet nen 800:", tu_nen800, "KW")
# print("Numri i KW per tarifen e larte mbi 800:", tl_mbi800, "KW")
# print("Numri i KW per tarifen e ulet mbi 800:", tu_mbi800, "KW")
print("Vlera e tarifes se larte nen 800KW:", round(tl_nen800*a1, 2), "euro")
print("Vlera e tarifes se ulet nen 800KW:" , round(tu_nen800*a2, 2), "euro")
print("Vlera e tarifes se larte mbi 800KW:", round(tl_mbi800*b1, 2), "euro")
print("Vlera e tarifes se ulet mbi 800KW:", round(tu_mbi800*b2, 2), "euro")
print("Vlera totale e fatures pa TVSH:", vlera_totale_pa_tvsh, "euro")
print("Tarifa fikse:", tarifa_fikse, "euro")
print("Vlera e TVSH-se:", tvsh, "euro")
print("Vlera totale e fatures:", vlera_totale, "euro")



Shenim:
Nese deshirojme ta dijme se si ka qene kalkulimi i energjise elektrike deri tani, dmth pa bllok-tarifa, normalisht edhe kalkulimi ka qene me i thjeshte, gjegjesisht edhe kodi adekuat i shkruar ne Python eshte me i thjesht dhe me i shkurt! 🙂
Kodi ose skripta ne fjale do te ishte si ne vijim:

tarifa_larte = float(input("Shenoni vleren e tarifes se larte: "))
tarifa_ulet = float(input("Shenoni vleren e tarifes se ulet: "))
# Tarifa e larte dhe e ulet
a1 = 0.0675
a2 = 0.0289
tarifa_fikse = 1.74
vlera_patvsh = tarifa_larte*a1 + tarifa_ulet*a2
# tvsh eshte 8%
tvsh = (tarifa_fikse+vlera_patvsh)*0.08
vlera_totale = tarifa_fikse+vlera_patvsh+tvsh
vlera_patvsh = round(vlera_patvsh, 2)
tvsh = round(tvsh, 2)
vlera_totale = round(vlera_totale, 2)
print("Vlera totale e fatures pa tvsh:", vlera_patvsh, "euro")
print("Tarifa fikse:", tarifa_fikse, "euro")
print("Vlera e TVSH-se:", tvsh, "euro")
print("Vlera totale e fatures:", vlera_totale, "euro")

Çfarë modeli të smartphone-ve të zgjedhim

Jemi dëshmitarë të zhvillimit dhe evoluimit të vrullshëm të teknologjisë në shumë sfera dhe fusha të ndryshme, sidomos të asaj telefonike. Si pasojë e kësaj, telefonat e mençur çdo ditë e më shumë po gjejnë përdorim më të madh në botën moderne, njëherësh edhe tek vendi ynë në Kosovë, pothuajse përdorimi i tyre është bërë pjesë e jetës së përditshme.
Si duket ka kaluar koha kur telefoni përdorej vetëm për thirrje dhe dërgim të mesazheve apo për lojëra. Tanimë përdorimi i tyre varësisht prej karakteristikave, ka filluar të përdoret më shumë e më shumë jo vetëm nga të rinjtë por edhe nga të moshuarit!
Duke patur parasysh rëndësinë e përdorimit të telefonave të mençur si dhe zgjedhjen e tyre, do t’i përmendi dhe përshkruaj disa nga modelet më të reja dhe më të njohur të telefonave të mençur, të cilët gjenden aktualisht në tregun botëror! Modelet e telefonave të mençur të cilët konsiderohen momentalisht si telefona me performanca dhe karakteristika të shkëlqyeshme janë si në vijim: Samsung, Iphone, HTC, LG, Nokia, Motorola, Sony, etj.

 * Këtu radhitja e tyre nuk është bërë sipas telefonit më të mirë/shpejt, mirëpo sipas “popullaritetit”! Megjithate në vazhdim do të mundohem sado pak t’i përshkruaj dhe krahasoj modelet e telefonave sipas karakteristikave të tyre.

SamsungNote3_LGG2


Përshkrimi i modeleve të reja të telefonave të mençur dhe karakteristikat e tyre

Mëposhtë do t’i përshkruaj karakteristikat dhe specifikat e telefonave më të mirë dhe më të ri që ekzistojnë në treg! Si kriter i kam marr veçoritë kryesore, si: sistemi operativ, madhësia e telefonit (ekranit), procesori, RAM memorja, hapësira (storage), kamera, dhe bateria.

Read more of this post

Përdorimi i komandave/skriptave në SharePoint 2010 Management Shell

Dihet se përmes ndërfaqes grafike të përdoruesit – GUI (Graphical User Interface) nuk mund të kryhen të gjitha veprimet, dhe si pasojë ekzistojnë edhe mënyra tjera që mund t’i kryejne këto veprime, siç është vegla SharePoint 2010 Management Shell, e cila është e përfshirë në SharePoint 2010.
SharePoint Management Shell është një gjuhëe skriptuar dhe një vegël e perbërë nga një grumbull i komandave që përdoret për ekzekutimin e veprimeve të ndryshme në mjedise siç janë intranete apo portale të implementuara në platformën MS SharePoint 2010.
SharePoint Management Shell pak a shumë është një vegël e ngjashme me PowerShell që vije në kuadër të Windows Server 2008, mirëpo këtu janë të përfshira apo ngarkuara komandat e dedikuara enkas për mjedise të platformës SharePoint.

Kjo vegël posedon më shumë se 600 komanda (cmdlets), mirëpo unë do t’i listoj disa nga ato që përdoren më së shpeshti, posaçërisht ato komanda pa të cilat konfigurimet apo veprimet e caktuara nuk mund të ekzekutohen përmes GUI!

Read more of this post

Export/Import Lists in SharePoint 2007/2010

Despite the advantage and great features that possess the SharePoint platform, however this platform is associated with one of the “weaknesses” when it comes to import/export the lists/forms (with greater size than 10MB) from one site to another site. By default they can’t be transferred without executing some scripts on “Command Prompt” or “SharePoint Management Shell” respectively by using the STSADM tool which is the part of SharePoint.


What are Lists in SharePoint

A List is the form that contains one or more fields/columns which define the item data or metadata schema. For example, a List can be considered the form called “Projects” with the following fields: Project title, Description, Start date, End date, Status. This could be considered similar to a database table. A List might contain as well attachments.

 

Read more of this post

Eksportimi/Importimi i Listave ne SharePoint 2007/2010

Perkunder perparesive dhe vecorive mjaft te medha qe i posedon platforma SharePoint, nje nder “te metat” qe ka kjo platforme kur eshte fjala per importimin apo eksportimin e listave/formave (me madhesi me te madhe se 10MB) prej nje faqe ne faqen tjeter, eshte se ato zakonisht (by default) nuk mund te barten pa i ekzekutuar disa skripta ne “Command Prompt” ose “SharePoint Management Shell”, perkatesisht duke perdorur veglen STSADM qe vije ne kuader te SharePoint-it.


Cka jane “Lists” ne SharePoint

“List” paraqet nje forme qe perbehet prej nje e me shume fushave apo kolonave te cilat definojne te dhenat e formes. Psh nje liste mund te jete forma e quajtur “Projects” me keto fusha: Project title, Description, Start date, End date, Status. Lista mund te konsiderohet si nje tabele e databazes. Lista mund te permbaje ne vete edhe dokumente te ndryshme (attachments).

Read more of this post

Ngatërrimi i fjalëve pothuajse të ngjashme, por me kuptime jo të ngjashme

Edhe pse tema e këtij artikulli në fakt nuk është e natyrës time, për shkak se zakonisht shkruaj për teknologji, megjithate vendosa të shkruaj këtë artikull që ka të bëjë me përdorimin e disa fjalëve delikate apo “ngatërruese” në jetën e përditshme.
Ndodhë që çdo person kur të lexojë apo shkruajë diçka në gjuhën shqipe, mund të ngatërrohet pa dashje apo të mos dijë dhe dallojë si duhet fjalët që i posedon gjuha shqipe, qofshin ato fjalë shqipe “autoktone” apo të “huazuara”! Prandaj mëposhtë do t’i paraqes disa fjalë që pak a shumë tingëllojnë si të ngjashme, por që kuptimin e kanë plotësisht jo të ngjashëm.

Një ndër veçoritë apo karakteristikat kryesore që e bëjnë gjuhën shqipe të veçant dhe më të pasur janë shkronjat: “ë”, “ç”, “dh”, “th”, “y”.

Për këtë arsye për hirë të këtyre shkronjave dhe alfabetit shqip, këtë artikull do të mundohem t’a shkruaj me të gjitha elementet e gjuhës shqipe duke përdorur këto shkronja karakteristike sidomos shkronjat “ë” dhe “ç”, gjë që zakonisht nuk i përdori 🙂 (për shkak të “peripecive” kompjuterike).

Read more of this post

Design a site like this with WordPress.com
Get started