====== Szülői adatok betöltése ====== A szülői adatok felvétele normál esetben - a diák többi adatával együtt - a beiratkozáskor történhet. De az is előfordulhat, hogy a szülői adatokat utólag, tömegesen szeretnénk betölteni valamilyen adatállományból - tipikusan ilyen eset a telepítés utáni első adatfeltöltés. Erről - illetve a szülők felhasználói azonosítóinak adatbázis szinten történő létrehozásáról (MySQL backend-et feltételezve) - szól ez a leírás. ===== Szülők adatainak betöltése adatállományból a naplóba ===== A szülők adatait általában a diákok adatival együtt kapjuk meg, egy táblázatban. A MaYoR rendszerben viszont a szülők adatai külön adattáblába kerülnek. Ez a használat során előnyös (pl. testvér gyerekek szülői adatai csak egy helyen lesznek eltárolva), de a betöltéskor nehézségeket okoz. Első lépésként a rendelkezésre álló adatokból olyan tabulátorokkal tagolt szöveges állományokat kell készítenünk, melyekben a diák oktatási azonosítója mellett szerepelnek a betöltendő szülői adatok. Ennek menete nagyban függ a rendelkezésre álló adatok formátumától, de használhatunk táblázatkezelőt, vagy ügyes parancssori alkalmazásokat (''cut'', ''grep'', ''awk'', ''sed'', stb). Külön állományba kerüljenek az anya, apa és más gondviselő adatai. Az állomány fejlécében érdemes az intézményi adatbázis ''szulo'' táblájának mezőneveit használni: oId nem nevElotag csaladinev utonev cimOrszag cimHelyseg cimIrsz cimKozteruletNev cimKozteruletJelleg cimHazszam cimEmelet cimAjto A kész állományokat másoljuk a szerver ''/tmp'' könyvtárába. Majd módosítsuk a ''szulo'' táblát ideiglenesen egy ''oId'' mező hozzáadásával: alter table szulo add column oId bigint(11) unsigned; Ezt a mezőt két dologra fogjuk használni: egyrészt ez alapján tudjuk majd megkülönböztetni az épp betöltött rekordokat a már korábban bekerültektől (azoknál ez a mező ''NULL'' értékű lesz), másrészt ez a mező lesz a kapcsolat a diák tábla fele. A betöltési folyamat végére ez a kapcsolat épp ellenkező irányú lesz: a ''diak'' tábla ''anyaId'', ''apaId'', ''gondviseloId'', illetve ''neveloId'' mezői fognak a megfelelő szülő ''szuliId'' attribútumára mutatni. Az adatokat betölthetjük MySQL parancssorból (LOAD DATA INFILE ...), vagy a felületről az "Admin/Import" menüpontban. Itt a ''szulo'' tábla kiválasztása után az adatállomány elérési útját kell megadnunk. Ezek után a program beolvassa az állomány első öt sorát és ha megfelelő mezőneveket használtunk, akkor elvégzi az oszlopok mezőkhöz rendelését is (egyébként et nekünk kell megtenni). A betöltés előtt még mindenképp meg kell adnunk egy (vagy több) kulcs mezőt - jelen esetben a diák oktatási azonosítója és a név megfelelő lehet. A felvett szülőket az oktatási azonosító alapján rendeljük a megfelelő diák megfelelő atribútumához. Például az ''anya'' adatok esetén az ''anyaId'' atribútumhoz: update szulo left join diak using (oid) set anyaId=szuloId where szulo.oId is not null; (Csak a most betöltött adatok esetén lehet a szulo oId mezője nem null értékű) Hasonlóan járunk el az ''apa'', a ''gondviselo'', illletve a ''nevelo'' esetén is. A hozzárendeltek oId-jét NULL-ra állítjuk (hogy a következő betöltésnél megint csak az új rekordok esetén legyen ennek a mezőnek értéke): update szulo set oId=null where oId is not null; ===== Duplán adminisztrált szülők kiszűrése ===== Most jön a neheze! Ki kell szűrjük a többszörös neveket - ezek lehet hogy testvérek miatti adat-többszöröződések. Hogy tényleg azok-e, az csak az egyéb adatok vizsgálatával, illetve utánajárással deríthető ki: select concat_ws(' ',csaladinev,utonev) as nev, count(*) as db from szulo group by nev having db>1 order by nev; Ha például Vincs Eszter szerepel a többszörös nevek listájában, akkor lekérdezzük az adataikat: select * from szulo where concat_ws(' ',csaladinev,utonev)='Vincs Eszter'; A cím és egyéb adatok alapján már sejthetjük, hogy egy személyt reprezentáló két rekordról van-e szó, vagy két különböző, csak épp azonos nevű személyt találtunk. A szuloid-k alapján lekérdezhetjük a hozzájuk tartozó diákok adatait is (a szuloId-k pl. 28 és 293): select * from diak where anyaId in (28,293); Ha úgy ítéljük meg, hogy a két rekord ugyanazt a szülőt jelöli, akkor módosítjuk a hozzárendelést és töröljük a felesleges szülőt: update diak set anyaId=28 where anyaId=293; delete from szulo where szuloId in (293); Valódi névütközés esetén a továbbiakban különböző ''userAccount''-okat kell beállítani a két rekordban... ===== A szülők felhasználói azonosítói ====== A naplóban szereplő szülők számára készíthetünk felhasználói azonosítókat, de lehetnek olyan szülő objektumaink is, melyekhez nem tartozik azonosító. Ilyenek az elballagott diákok szülei - adataik továbbra is szerepelnek a naplóban, de a rendszerhez már nem kell hozzáférniük, ezért felhasználói azonosítót nem kapnak. A szülői azonosítók létrehozása két adattáblát érint: egyrészt létre kell hoznunk magát az azonosítót a ''mayor_parent.accounts'' táblában, másrészt meg kell mondanunk, hogy ez a felhasználói azonosító mely naplóban szereplő szülőhöz tartozik - ezt a ''szulo'' tábla ''userAccount'' mezőjében adjuk meg. Első lépésként tehát a ''szulo'' táblában generáljunk ''userAccount''-ot a nevek alapján: update szulo set userAccount=concat(substring_index(csaladinev,' ',-1),'.',substring_index(utonev,' ',1)) where userAccount is null; A fenti utasítás minden olyan rekordban kitölti a userAccount mezőt, amelyben az eddig üres volt. Ez egy első adatfeltöltés esetén megfelelő lehet, később azonban már nem, hiszen ezzel például az elballagott diákok szüleinek is újra azonosítót generálnánk. A problémára többféle megoldás is kínálkozik. Egyik lehetőség, hogy a felhasználói azonosítókat is az adatállományból töltjük be a többi szülői adattal együtt. A másik lehetőség, hogy a ''szulo'' táblát összekapcsoljuk a ''diak'' táblával, hogy csak a jogviszonyban lévő tanulók szüleinek adjunk ''userAccount''-ot: update szulo left join diak on szuloId in (anyaId, apaId, gondviseloId, neveloId) and diak.statusz in ('jogviszonyban van','magántanuló','vendégtanuló') set userAccount=concat(substring_index(csaladinev,' ',-1),'.',substring_index(utonev,' ',1)) where userAccount is null; Ezek után ellenőrizzük, hogy vannak-e ütköző felhasználói azonosítók: select userAccount,count(*) as db from szulo group by userAccount having db>1; Sajnos előfordulhat, hogy újabb szülőket találunk, akik többször szerepelnek az adatbázisban, de az is lehet, hogy csak egyszerű név egyezés keseríti a dolgunkat. A javítás a korábbiakban leírt módon történik egészen addig, amíg sikerül elérni, hogy minden szülőnek egyedi azonosítója legyen. ==== Szülői azonosítók felvétele (MySQL backend) ==== Ha az összes ütközést kiküszöböltük, akkor felvehetjük a szülői azonosítókat a ''mayor_parent.accounts'' táblába. Ha kezdeti adatfelvitelről van szó, tehát az összes azonosítót most hozzuk létre, akkor a parancs a következő lehet: insert into mayor_parent.accounts (policy,userAccount,userCn,userPassword) select 'parent',userAccount,trim(concat_ws(' ',nevElotag,csaladinev,utonev)) as userCn,sha(crc32(csaladinev)) as userPassword from szulo; Ha vannak már azonosítók a ''mayor_parent.accounts'' táblában, akkor csak azokat az azonosítókat kell és lehet létrehozni, amelyek még nem szerepelnek a táblában: insert into mayor_parent.accounts (policy,userAccount,userCn,userPassword) select 'parent',userAccount,trim(concat_ws(' ',nevElotag,csaladinev,utonev)) as userCn, sha(crc32(csaladinev)) as userPassword from intezmeny_vmg.szulo left join mayor_parent.accounts using (userAccount) where szulo.userAccount is not null and accounts.userCn is NULL; Ha még precízebbek akarunk lenni, akkor a ''diak'' táblával is össze kell kapcsolnunk a ''szulo'' táblát, hogy csak a jogviszonyban lévő diákok szüleinek adjunk azonosítót: insert into mayor_parent.accounts (policy,userAccount,userCn,userPassword) select distinct 'parent',userAccount, trim(concat_ws(' ',nevElotag,csaladinev,utonev)) as userCn, sha(crc32(csaladinev)) as userPassword from intezmeny_vmg.szulo left join mayor_parent.accounts using (userAccount) left join intezmeny_vmg.diak on szuloId in (anyaId, apaId, gondviseloId, neveloId) and diak.statusz in ('jogviszonyban van','magántanuló','vendégtanuló') where szulo.userAccount is not null and accounts.userCn is NULL;