• Rezultati Niso Bili Najdeni

Programski jeziki so bili skozi zgodovino ustvarjeni za rešitev določenega problema, jezik C# pa je po podatkih Microsoftove spletne strani (Microsoft Corporation, 2021) univerzalen programski jezik.

V osnovi je namenjen podjetjem, ki za svoje potrebe potrebujejo različne vrste programov za različne probleme. Programski jezik C# je preprost, sodoben in objektno usmerjen jezik. Razvil ga je Microsoft leta 2001 z namenom, da se izdela jezik, ki je enostaven za učenje in podpira razvoj sodobne programske opreme. Uporabimo ga lahko za izdelavo računalniških (namiznih), spletnih in mobilnih aplikacij za platforme Windows, Linux in Mac. Mogoče je izdelati tudi knjižnice, aplikacije v oblaku in videoigre. Je hiter in odprtokodni jezik, ki se razvija s pomočjo skupnosti. V primerjavi z drugimi programskimi jeziki se razvija najhitreje. V uporabi je že različica C# 9.0.

4 Izdelava programske rešitve

Pred začetkom izdelave programske rešitve je bilo treba natančno načrtovati programsko rešitev.

Osnovni namen je spraviti čim več informacij na eno mesto in avtomatizirati procese, ki vzamejo največ časa.

Pri delu zdaj ves čas uporabljamo dve Excelovi tabeli, ki sta shranjeni na strežniku, in podatke redno posodabljamo. To sta tabela predvidenih odprem in transformatorjev na zunanjem skladiščenju. V tabeli predvidenih odprem je več zavihkov.

Na prvem zavihku so prikazani podatki vseh transformatorjev, ki so bili odpremljeni. Podatki segajo do sredine leta 2015 in obsegajo osnovne podatke, ki se s pomočjo funkcije VLOOKUP prikazujejo iz CMP-ja. Osnovni podatki so element PPS, številka SAP naročila, matični podatek, serijska številka, nazivna moč, kupec, država in odgovorni komercialist. Ostali podatki, ki jih vnesemo ročno, so oznaka ponudbe, na podlagi katere je izdelan transformator, računska in realna teža glavnega dela transformatorja in obrat, v katerem je bil transformator izdelan. Vnesti je treba datum odpreme glavnega dela iz tovarne, datum postavitve glavnega dela na temelj ter izvajalca montaže in meritev.

Nazadnje je treba v tabelo še vnesti datuma najave odpreme za en teden vnaprej in dva tedna vnaprej.

Datuma sta vpisana zaradi vodenja evidence odstopanja od najavljenih odprem.

Na drugem zavihku so prikazane predvidene odpreme. Prav tako so tu osnovni podatki vpisani iz CMP-ja glede na element PPS, ki je vpisan v prvem stolpcu. Prikazan je torej element PPS, številka SAP naročila in ID kosa. Vpisani so tudi nazivna moč in napetost, serijska številka, kupec, država ter komercialist. Poleg teh podatkov ročno vpišemo še predviden datum odpreme, ki nam ga sporoči komercialist ali prevoznik. Ročno vpišemo še podatke o indikatorjih tresljajev. Vpišemo tudi, ali je med transportom dovolj en indikator in/ali sta potrebna dva ali nobeden. Vpišemo tudi, ali je zahtevana montaža na kotel ali aktivni del. Za nekatere projekte najamemo zunanje izvajalce, zato vpišemo tudi izvajalca montaže transformatorja na terenu. Kot zadnji je prikazan podatek o odpremi transformatorja, ki je vnesen v sistemu SAP. Prikazuje se s pomočjo funkcije VLOOKUP iz tabele, kjer so izvoženi podatki iz sistema SAP.

Na zavihku SAP odpreme so s pomočjo Excelovega orodja Power Query prikazani podatki iz Excelovega dokumenta, ki vsebuje surove podatke iz SAP-a. Zavihek uporabljamo za preverjanje, ali se podatki ujemajo z našim datumom predvidene odpreme.

V tabeli TR na zunanjem skladišču je glavni poudarek na prikazu podatkov o skladiščenih transformatorjih, ki so postavljeni na skladiščenje na dvorišče tovarne. Tudi v tej tabeli so osnovni podatki prikazani s pomočjo funkcije VLOOKUP glede na element PPS, ki je vpisan v prvem stolpcu.

Prikazani so podatki, kot so serijska številka, nazivna napetost in moč, kupec ter komercialist.

Vključena sta tudi datum predvidene odpreme, ki je povezan s tabelo predvidenih odprem, in datum planiranih FAT meritev, ki je povezan s tabelo Plan FAT, ki se nahaja na strežniku. Ročno vpišemo težo transformatorja, ki je na skladiščenju, in ni nujno, da se vedno ujema s transportno težo glavnega dela. Vpisani so tudi oznaka lokacije in zaporedna številka za lažje lociranje transformatorja na skladiščni površini ter datum postavitve na zunanje skladišče.

Glavni cilj programske rešitve je urejen prikaz čim večje količine podatkov, ki so dostopni v podatkovni bazi. Ročni vpis podatkov bi bil samo za podatke, ki so v domeni oddelka prodajne logistike. Standardiziran vnos podatkov naj bi minimaliziral možnost napak z omejitvami in preverjanji.

4.1 Izbira programskih jezikov

Prvotna ideja je bila izdelati programsko rešitev v Pythonu ali C++. Prednost Pythona je enostavnost jezika. Prav ta enostavnost in berljivost programskega jezika pa pripomoreta k lažjemu učenju uporabe jezika. S programskim jezikom C++ sem se v preteklosti že srečala, zato so mi bila osnovna pravila jasna, učenje pa s tem lažje.

Na sestanku z oddelkom razvoja v podjetju so predstavili podatkovno bazo. Izdelan je bil dostop do podatkovne baze in dodeljena mi je bila pravica za branje vseh podatkov in pravica za urejanje testne podatkovne baze. Baza je izdelana v podatkovni bazi MySQL. V uporabi je jezik SQL za dostopanje do baze in spreminjanje podatkov v njej.

Izpostavljena je bila zahteva, da je program izdelan v jeziku C#. V načrtu so namreč postopna opustitev tabel in uvajanje namenskih programskih rešitev po oddelkih ter v končni fazi tudi združitev vseh rešitev v celoto. Programski jezik C# je podoben C++, zato taka sprememba ne bi smela predstavljati večjih težav. Prav tako je C# lažji jezik za uporabo, saj je v primerjavi s C++ sintaksa lažja in zahteva manj pisanja za isti rezultat.

4.2 WPF ali Windows Forms

Za enostavnejšo izdelavo programske rešitve v programskem jeziku C# je potreben program Visual Studio. V uporabi je trenutno različica Visual Studio 2019. Kot že omenjeno, Visual Studio omogoča urejanje kode, grafično oblikovanje uporabniškega vmesnika, prevajanje v strojni jezik, razhroščevanje ter testiranje aplikacije na enostaven in pregleden način.

Kot je navedeno na spletni strani (Microsoft Corporation, 2021), lahko v jeziku C# s pomočjo razvojnega okolja Visual Studio izdelamo konzolne in spletne aplikacije. Izdelamo lahko tudi aplikacije, imenovane Universal Windows Platform (UWP), Windows Presentation Foundation (WPF) in Windows Forms Applications (WinForms).

Konzolne aplikacije so aplikacije, ki se uporabljajo za enostavne ukaze, ki vrnejo rezultat v obliki teksta. (Microsoft Corporation, 2021)

Spletne aplikacije so aplikacije, ki so dostopne prek spleta in jih lahko uporabljamo prek spletnega brskalnika. To so torej spletne strani, ki nam omogočajo interakcijo in nam vrnejo neko funkcionalnost. (Microsoft Corporation, 2021)

Universal Windows Platform (UWP) so aplikacije, ki so izdelane za platformo Windows 10 in se lahko z uporabo posebnih mostov uporabljajo tudi na mobilnih telefonih ali na Xbox platformi in podobno. Primerna je predvsem za aplikacije, ki so namenjene širši uporabi, saj jih lahko objavimo v trgovini, prek katere jih uporabnik namesti na svojo napravo. Prej opisane aplikacije torej niso primerne za programsko rešitev, saj omogočajo specifično funkcionalnost, ki ni potrebna oz. ni mogoče izdelati dovolj kompleksne programske rešitve, ki jo potrebujemo. (Microsoft Corporation, 2021)

Tako WPF kot WinForms sta namenjena za izdelavo grafičnih uporabniških vmesnikov. Oba tipa aplikacij sta bila oblikovana pri Microsoftu, obenem pa ju ves čas tudi nadgrajujejo in razvijajo. WPF se imenuje po Microsoftovi fundaciji Windows Presentation Foundation, WinForms pa je krajša različica za poimenovanje Windows Forms Applications. V naslednjih odstavkih bodo predstavljene lastnosti vsakega tipa aplikacij, ki so opisane na različnih spletnih straneh (Bonello, 2020), (Hammad, 2021) in (Tutorial, 2021). Navedeni bodo tudi končna odločitev in glavni razlogi za izbiro določenega tipa aplikacije za izdelavo programske rešitve. (Microsoft Corporation, 2021)

Front-end oz. sprednji del je del aplikacije, ki ga vidi uporabnik. Back-end oz. zadnji del je funkcionalni del aplikacije, ki omogoča, da vse deluje pravilno. Tako za aplikacije WPF kot WinForms se za back-end uporablja programski jezik C#, pri WPF pa je za front-end uporabljen jezik XML. WPF omogoča grafično oblikovanje elementov, ki temeljijo na vektorjih. Ta lastnost omogoča lažje prilagajanje uporabniškega vmesnika različnim velikostim ekranov, na katerih se aplikacija uporablja. Ta lastnost je uporabna predvsem pri aplikacijah, ki se uporabljajo na različnih napravah, kot so računalniki, mobiteli in tablice. Grafično oblikovanje je pri aplikaciji WPF bolj zahtevno, saj je potrebna določena stopnja znanja. Prav to pa omogoča kompleksnješo in sodobnejšo grafično podobo z 2D-, 3D-elementi, animacijami in podobno. Pri WinFormsih je grafično oblikovanje manj

elemente, ki jih želimo vključiti v program, izberemo in povlečemo iz orodne vrstice na lokacijo, kjer jih želimo. WinForms uporablja standardne Windows komponente, ki se odzivajo na prej določene dogodke z miško ali tipkovnico, na primer, ko se z miško pomaknemo nad element ali ko kliknemo nanj in podobno. Te komponente zelo olajšajo in pohitrijo izdelavo aplikacije, saj že vsebujejo veliko različnih elementov, omogočajo tudi dodajanje in spreminjanje teh glede na specifične zahteve.

Aplikacije WPF se ne zanašajo na Windows komponente. Vse elemente je torej treba posamezno oblikovati, določiti obnašanje in dodati dogodke, na katere se odziva na določen način. V nekaterih primerih je lahko to prednost, na primer, ko želimo v preprost element, kot je gumb, dodati sliko, kar WinForms ne omogoča brez predelave elementa. Lahko pa je slabost, če želimo izdelati seznam s tekstom in sliko. Pri WPF-ju moramo vsak element ročno dodati in poravnati z ostalimi elementi, medtem ko je pri WinFormsih to urejeno z eno vrstico kode, saj obstaja element, ki vse to že vsebuje brez predelave.

WPF je oblikovan za lažjo obdelavo večje količine podatkov z vgrajenim slojem, ki omogoča hitrejši način za interakcijo s podatki in spreminjanjem teh.

WPF za hitrejše prikazovanje uporablja strojno pospeševanje pri prikazovanju grafičnega uporabniškega vmesnika, zato so aplikacije hitrejše od aplikacij WinForms. Pri delovanju aplikacije WPF uporabijo več RAM pomnilnika, kar lahko upočasni delovanje računalnika, če hkrati izvajamo ostale procese, ki tudi potrebujejo RAM pomnilnik.

WPF je bil razvit pozneje, kar pomeni, da so uporabljene sodobnejše tehnologije in je bolj v koraku s časom. Tip aplikacij WinForms je bil izdelan prej. Ta tehnologija je trenutno bolj preizkušena in preverjena. Prav tako je v ozadju velika skupnost, ki razvija ta tip aplikacij, zato verjetno ni stvari, ki je ne bi nekdo že prej preizkusil oz. se srečal s tem problemom. Prav zaradi tega je iskanje rešitev na spletu lažje in hitrejše.

Končna odločitev je bila, da se programsko rešitev izdela kot aplikacijo WinForms. Če povzamem, so glavni razlogi torej, da se za izdelavo aplikacije uporablja samo en programski jezik, da uporablja enostavnejši način za oblikovanje grafičnega vmesnika z že vgrajenimi dogodki, kar predvidoma skrajša čas izdelave programske rešitve, čeprav grafična podoba na koncu ni tako sodobna, kot bi lahko bila z aplikacijo WPF. Čeprav se aplikacija WPF hitreje odpira in prikazuje, aplikacija WinForms za svoje delovanje porabi manj RAM pomnilnika, kar pomeni, da je za svoje delovanje manj zahtevna. Zadnja prednost aplikacij WinForms je velika skupnost, ki podpira ta tip aplikacije.

Kot že prej omejeno, to omogoča lažje iskanje rešitev za probleme, ki se lahko pojavijo med razvojem programske rešitve.

4.3 Oblikovanje osnovnega okna

Ko je določilen tip aplikacije, ki bo uporabljen za programsko rešitev, je najprej treba ustvariti nov projekt v programu Visual Studio 2019. Iz seznama tipov aplikacij izberemo Windows Forms App v .NET Framework ogrodju za razvoj aplikacij. Aplikacijo smo poimenovali Prodajna logistika. Ustvari se nov projekt z osnovnim oknom in ostalimi datotekami za zagon aplikacije.

Najprej je bilo treba oblikovati osnovno okno za prikaz podatkov. Vsako okno lahko odpremo v grafičnem urejevalniku ali urejevalniku kode. Najprej odpremo datoteko za oblikovanje okna. V orodni vrstici izberemo možnost pogled in na seznamu izberemo orodjarna oz. Toolbox. Odpre se nam okno, ki prikazuje vse gradnike (vsebnike), ki jih lahko umestimo v okno. En gradnik predstavlja že samo okno oz. obrazec. Ko izberemo posamezen gradnik, ki je umeščen v okno, se v razdelku lastnosti pokažejo vse lastnosti gradnika. V tem razdelku lahko določamo tudi vse dogodke, ki so vezani na posamezen gradnik. Najpomembnejša lastnost posameznega gradnika je njegovo ime. Na to lastnost se sklicujemo v programski kodi. Gradnik moramo poimenovati unikatno in razumljivo, da ga ne moremo po pomoti zamenjati za drug gradnik. Z dodajanjem gradnikov in spreminjanjem lastnosti se v ozadju samodejno kreira koda, v tem primeru v jeziku C#. Do te kode lahko dostopamo v podmeniju okna, ki ga urejamo. Datoteka ima končnico .Designer.cs. Čeprav se spreminja sama, jo lahko tudi ročno urejamo.

V osnovnem oknu torej želimo prikazati več tabel z različnimi podatki. V orodjarni smo našli gradnik, imenovan TabControl oz. nadzornik zavihkov. V nastavitvah spremenimo ime gradnika in določimo, da se razprostira čez celotno odprto okno. Z desnim klikom na gradnik v oknu se odpre podmeni.

Tam lahko dodamo nove zavihke. S klikom na posamezen zavihek lahko urejamo lastnosti vsakega posebej. Določimo jim unikatna imena in besedilo, ki se prikaže uporabniku. Dodamo štiri zavihke s tekstom Vsi podatki, Predvidene odpreme, Servis in Skladiščenje.

V vsak zavihek najprej dodamo gradnik, imenovan TableLayoutPanel oz. razporednik gradnikov v tabelarični obliki. Gradnik prikaže vsebino okna v mrežasti obliki vrstic in stolpcev. V nastavitvah določimo ime gradnika, izberemo postavitev, ki zavzame celotno razpoložljivo polje, ter določimo število vrstic in stolpcev, ki jih želimo. Z desnim klikom na gradnik se nam odpre podmeni, kjer izberemo možnost Edit rows and columns. Odpre se nam okno v katerem lahko oblikujemo vrstice in stolpce tabele. Določimo lahko število stolpcev in vrstic ter njihovo relativno velikost v odstotkih, velikost v slikovnih točkah ali samodejno prilagajanje velikosti glede na velikost gradnikov v poljih.

Za potrebe osnovnega okna določimo dva stolpca in dve vrstici. Pri stolpcih določimo, da ima prvi stolpec relativno velikost 100 odstotkov, drugi pa absolutno vrednost 166 slikovnih točk. To pomeni, da bo drugi stolpec vedno enako velik ne glede na spreminjanje velikosti okna, zaradi različnih

velikosti ekranov ali uporabnikovih nastavitev. Drugi stolpec bo vedno zavzel vso ostalo površino, ki je na voljo. Pri vrsticah določimo absolutno velikost prve vrstice, tj. 61 slikovnih točk, in relativno velikost druge vrstice, tj. 100 odstotkov. Da bi se izognili prekomernemu pomanjševanju okna, v lastnostih določimo minimalno velikost okna.

Vsaka celica v tabelaričnem razporedniku ima v osnovi lahko samo en gradnik. V vsako celico v prvi vrstici zato umestimo gradnik, imenovan FlowLayoutPanel oz. razporednik gradnikov v vrsti.

Gradnik omogoča dodajanje več gradnikov, ki jih samodejno razporedi. Oba razporednika ustrezno poimenujemo in določimo, da zavzameta vso razpoložljivo površino. V lastnostih gradnikov določimo, da se samodejno pojavi vertikalni drsnik, ko je potreben, in da so gradniki razporejeni od leve proti desni. V prvo celico na vsakem zavihku dodamo nekaj gumbov. V oknu lastnosti jim določimo velikost, barvo ozadja in pisavo besedila. Pazimo, da so barve gumbov različno razporejene, saj le tako lahko uporabnik lažje loči zavihke med seboj. V drugo celico v prvi vrstici dodamo en sam gumb na zavihek. Vsi gumbi so obarvani z enako barvo, dodamo jim besedilo Osveži. V prvo celico v drugi vrstici umestimo Panel oz. ploščo. Je osnovni gradnik za odlaganje drugih gradnikov.

Primerno ga poimenujemo in določimo, da se razprostira čez celotno površino. Ker se nahaja v TableLayoutPanelu, mu lahko določimo, koliko vrstic in stolpcev lahko zavzema. Določimo, da zavzema dva stolpca in eno vrstico. V panel dodamo gradnik DataGridView oz. preglednik podatkov v tabeli. V nastavitvah lastnosti določimo ime gradnika in da se razprostira čez celotno površino.

Določimo, da se vrstice in stolpci v tabeli prilagajajo po širini in višini glede na vsebino celice, obenem pa tudi, da vsebine ne moremo spreminjati in da lahko v tabeli izberemo eno celico in ne vedno celotne vrstice ali stolpca.

Po dodajanju osnovnih elementov v vsak zavihek se lahko posvetimo prikazovanju podatkov in posameznim podoknom s svojimi funkcionalnostmi.

4.4 Urejanje zavihka Vsi podatki

Zavihek z vsemi podatki je namenjen prikazovanju podatkov o vseh transformatorjih, torej o transformatorjih, ki so že bili in še bodo odpremljeni. Zavihek je pomemben za dodajanje novih datumov o odpremah, saj v drugih zavihkih praviloma ne bodo prikazani transformatorji brez datuma odpreme, razen v redkih primerih. Najprej je torej treba poskrbeti za prikaz podatkov.

4.4.1. Prikaz podatkov

Najprej je bilo treba pregledati podatke, ki so nam dostopni v že obstoječi podatkovni bazi. Pregledali smo jih v programu MySQL Workbench. Želimo prikazati osnovne podatke transformatorja, na primer element PPS, serijsko številko, številko SAP, kupca in podobno. Želimo dodati in prikazati tudi podatke, ki še ne obstajajo v podatkovni bazi. Te tabele je bilo treba oblikovati in dodati v bazo.

Kot glavni identifikator smo določili serijsko številko, saj je med množico unikatnih oznak za transformator edina oznaka, ki vsebuje samo številke brez posebnih znakov, kar omogoča lažjo manipulacijo.

Prvi manjkajoči podatek je datum odpreme. V testno podatkovno bazo smo dodali tabelo z imenom odprema. Prvi stolpec te tabele vsebuje podatkovni tip številk, imenovan int(11). Vrednost v polju se samodejno povečuje in deluje kot primarni ključ. Drugi stolpec prav tako vsebuje samo številke.

Prikazuje serijske številke transformatorjev. Ta podatek je glavni za povezovanje tabel med seboj.

Naslednji je prikaz datuma v ustreznem podatkovnem tipu. Sledi podatek o tipu odpreme v podatkovnem tipu varchar(5). To pomeni, da je v polje lahko vnesen znakovni niz, dolg največ 5 znakov. Poznamo tri tipe odprem, in sicer glavni del, oprema ter avtocisterna. Uporabljene so oznake GD, O in AC.

V zavihku želimo tudi prikazati podatek o tem, ali se transformator nahaja na zunanjem skladiščenju.

Oblikovati je bilo treba tudi tabelo za to. Vsebuje ID, ki je primarni ključ in se samodejno povečuje, stolpec s serijsko številko transformatorja in stolpec, ki prikazuje, ali je transformator na skladiščenju v podatkovne tipu tinyint(1). Podatkovni tip je primeren za shranjevanje vrednosti TRUE/FALSE oz da/ne v obliki 1/0.

Za prikaz podatkov v tabeli je bil oblikovan pogled, imenovan pregled_vseh_podatkov. Ker elementa PPS v celoti ne dobimo iz podatkovne baze, ga je bilo treba sestaviti. Element PPS je sestavljen iz projektne številke, oznake kosa in karakteristične številke. Prikazuje se v svojem stolpcu, sestavimo pa ga znotraj poizvedbe. V tabeli prikazujemo še stolpec serijska številka, SAP naročilo, matični podatek, ponudbo, oznako, kupca, državo, datum odpreme glavnega dela, obrat, v katerem je bil izdelan, uspešnost FAT meritev in postavitev na zunanje skladiščenje. Pogled je bil oblikovan s

poizvedbo SQL z uporabo ukazov SELECT DISTINCT, SELECT MIN, WHERE, CASE, CONCAT, LEFT JOIN, ORDER BY, LIMIT ter operatorjev AND, OR in NOT.

Po oblikovanju pogleda je bilo treba prikazati podatke v gradniku, ki omogoča pregled podatkov v tabeli. V kodi je treba vzpostaviti povezavo do podatkovne baze. Na začetku vsake .cs datoteke, iz katere želimo dostopati do podatkovne baze, moramo dodati knjižnico MySql.Data.MySqlClient. Če tega ne storimo, nas razhroščevalnik opozori, da želene funkcije ne obstajajo.

Kodo za odpiranje povezave je priporočljivo umestiti v varovalni blok try catch kot prikazano na sliki 7. Namenjen je obravnavanju prekinitev, ko program naleti na napako ali neizvedljivo kodo, v nasprotnem primeru se program nepričakovano zaustavi. V try blok napišemo kodo, ki jo želimo izvesti. V našem primeru je to povezava do podatkovne baze. Tudi če je koda v celoti napisana

Kodo za odpiranje povezave je priporočljivo umestiti v varovalni blok try catch kot prikazano na sliki 7. Namenjen je obravnavanju prekinitev, ko program naleti na napako ali neizvedljivo kodo, v nasprotnem primeru se program nepričakovano zaustavi. V try blok napišemo kodo, ki jo želimo izvesti. V našem primeru je to povezava do podatkovne baze. Tudi če je koda v celoti napisana