Szülői adatok betöltése - kiegészítésekkel(!)

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.

Módosítsuk a szulo táblát ideiglenesen egy oId (diák oktatási azonosítója) mező hozzáadásával (ezt csak a legelső alkalommal kell elvégezni!):

  ALTER TABLE szulo ADD COLUMN oId bigint(11) unsigned;

Az szülői adatok fájl 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		telefon

A kész állományokat másoljuk a szerver /tmp könyvtárába.

A sokadik osztály után, sőt, a második tanévtől kezdve biztosan lesznek egyező nevű szülők. A kezdeti (vagyis az új adatok feltöltése előtti) állapotot listázzuk ki, később nagyon nehéz lesz kiszűrni, kik is az új, egyező nevű szülők!

SELECT concat_ws(' ',csaladinev,utonev) as nev, count(*) as db FROM szulo GROUP BY nev having db>1 ORDER BY nev;

Ezt a listát mentsük/másoljuk - hasznos lesz később!

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ű)

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 (itt lesz szerepe az elején mentett lekérdezésnek - hasonlítsuk össze ezt a listát a „nulladik” változattal!):

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ély két azonosítójáról, vagy két különböző, de azonos nevű személy azonosítóiról van-e szó. 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 különböző userAccount-okat kell beállítani a két rekordban.

A már távozott diákok (elballagottak) szülői adatai még szerepelnek a táblában, ezeknek a rekordoknak is üres a userAccont-ja, ezért a többi userAccount-ot a nevek és az oId-k alapján generáljuk:

UPDATE szulo SET userAccount=concat(csaladinev,'.',substring_index(utonev,' ',1)) WHERE userAccount IS NULL AND oId IS NOT NULL;

Majd újabb ütközés ellenőrzés következik:

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. A javítás a korábbiakban leírt módon történhet. Ha az összes ütközést kiküszöböltük, akkor felvehetjük a szulői azonosítókat, ehhez vegyünk fel ideiglenesen egy táblát:

  CREATE TEMPORARY TABLE _szulo SELECT * FROM szulo LEFT JOIN
     mayor_parent.accounts USING (userAccount) WHERE userCn IS NULL AND szulo.oId IS NOT NULL;

majd a továbbiakban dolgozzunk ezzel!

  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 kész vagyunk, az ideiglenes táblát eldobhatjuk:

DROP TABLE _szulo;

Végül a hozzárendeltek oId-jét a szulo táblában NULL-ra állítjuk:

UPDATE szulo SET oId=null WHERE oId IS NOT NULL;

Végezzük el ezeket a lépéseket az apa, és esetleg a más gondviselő adataival is!

A szülői account-ok lekérdezéséhez válasszuk ki az osztály táblából a keresett osztály osztályId-jét (pl.24), majd:

  SELECT szuloId,csaladinev,utonev,useraccount,crc32(csaladinev) FROM intezmeny_szag.osztalyDiak
     LEFT JOIN intezmeny_szag.diak using (diakId) LEFT JOIN intezmeny_szag.szulo on szuloId in
     (anyaId,apaId,gondviseloId,neveloId) WHERE osztalyId=24 AND beDt<=curdate() AND (kiDt is null or kiDt>=curdate());

Az osztályId-t az osztaly táblából leshetjük ki, vagy kikeresünk egy ebbe az osztályba járó diákot (Intézményi adatok/Diákok), feljegyezzük a diakId-jét (pl. 134), és az osztalyDiak táblából kikeressük:

SELECT * FROM osztalyDiak WHERE diakId=134;

Megjegyzés: a beDt⇐curdate() helyett az aktuális tanév kezdődátumát írhatjuk, ha pl. az osztálybakerülés dátuma szeptember 1., és az account-okat még e dátum előtt szeretnénk elkészíteni!

hogyan/szueloi_adatok_betoeltese_kiegeszitesekkel.txt · Utolsó módosítás: 2019/05/28 19:52 (külső szerkesztés)
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0