Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Excel konzultáció 4. Előadás Dr. Pauler Gábor, egyetemi docens, ev. Adószám: 63673852-3-22 Számlaszám: 50400113-11065546 Telephely: 7666 Pogány, Széchenyi.

Hasonló előadás


Az előadások a következő témára: "Excel konzultáció 4. Előadás Dr. Pauler Gábor, egyetemi docens, ev. Adószám: 63673852-3-22 Számlaszám: 50400113-11065546 Telephely: 7666 Pogány, Széchenyi."— Előadás másolata:

1

2 Excel konzultáció 4. Előadás Dr. Pauler Gábor, egyetemi docens, ev. Adószám: Számlaszám: Telephely: 7666 Pogány, Széchenyi u. 1. Tel: 30/

3 Az előadás tartalma Külső adatforrások használata Excelben 1 Külső fájlok használata –Az Office Visual Basic fájlkezelése –Bináris fájlok kezelése –Szöveges log-fájlok nagysebességű beolvasása: Tops Friendly Markets Inc. T-log fájlok esettanulmány DelimitFile97 modul és felhasználói felülete Külső adatok beszerzése weblapokról –Megvalósítás VB makróból Külső adatok beszerzése adatbázisokból –Megvalósítás VB makróból –Az MSQuery lekérdezés-tervezője Az SQL lekérdező nyelv –Alapfogalmai –Egy táblás lekérdezések Egyszerű kiválasztó lekérdezések Szűrők használata Rendezések használata Csoportosítás és aggregáció használata –MS Access lekérdezés tervező SQL kódszerkesztő Grafikus lekérdezés-tervező –Több táblás lekérdezések Descartes Join Inner Join Left Join Full/Natural Join Kettőnél több tábla közti Joinok működése Szakirodalom

4 Az Office Visual Basic fájlkezelése 1 A Session1-ben már említettük, hogy az Excel – táblázatkezelő révén – nem alkalmas több százezer rekordból álló tranzakció adatok hatékony tárolására és kezelésére.Session1 Viszont elérheti az ilyen adatokat külső adatforrásokból: bináris fájlok, szöveges adat fájlok, webes adatbázisok, adatbáziskezelők adatbázisai. Képes az ilyen módon elért adatokkal műveleteket végezni, illetve az eredményeket visszaírni az adatforrásokba Ebben a legegyszerűbb műfaj a fájlkezelés Visual Basic makró kódból, ezért először ennek szintaktikai elemeit tekintjük át: Fájlok megnyitása: A fájlok adatait csak megnyitott állapotukban érhetjük el. A fájlt megnyitó utasítás általános formátuma: Open „Út\Fájlnév” For [Append/Binary/Input/Output/Random] _ Access [Read/Write/ReadWrite] [Shared/Lock Read/Lock Write] _ As FileSzám [Len = RekHossz] Ahol: „Út\Fájlnév” - a fájl elérési útja és neve, csak abszolút elérési útat kezel, relatívat nem! Fájl megnyitási üzemmódjai: Append - létező adatokhoz végéhez sorfolytonosan (Sequential) írásra Binary - bináris fájlként, byte-ok közt ide-oda navigálva, írásra/olvasásra Input - szekvenciális olvasásra, input fájlként Output - szekvenciális kiírásra, üres fájlból indulva, output fájlként Random - rekordok bóll álló fájlként, rekordok közt ide-oda navigálva, írásra/olvasásra Fájl elérési üzemmódjai: Shared - minden program mindig tud bele írni/olvasni (alapbeállítás, nem kell kiírni) Lock Read/Lock Write - csak a megnyitó program tud belőle olvasni/ bele írni Azonosítás: FileSzám - a megnyitott fájl programkódbeli azonosítószáma Ne kézzel adjuk meg hanem, a FreeFile függvényel kérjük előzetesen az első szabad fájlszámot egy Integer típusú fájlszám változóba: Dim BinFile As Integer BinFile = FreeFile Open BinFileName For Binary Access Read As BinFile Len = 1 RekHossz - a rekordok hossza bináris vagy rekordos elérés esetén

5 Az Office Visual Basic fájlkezelése 2 Olvasás fájlokból: String = Input(KarakterSzam, #FileSzam) – Input-tal megnyitott szekvenciális szövegfájlból (Text file) szed fel adott számú karaktert, az aktuális fájl pozíciótól (Position): hogy a pozíció mit jelent, az attól függ, hogyan nyitottuk meg a fájlt: Random – rekordok száma Input, Output, Append – max. 128 byte hosszúságú sorok száma Binary – byte-ok száma Line Input #FileSzam, String – Input-tal megnyitott szekvenciális szövegfájlból olvas fel 1 teljes sort string változóba az aktuális fájl pozíciótól Input #FileSzam, Valtozo – Input-tal megnyitott, vesszővel elválasztott értékeket (Comma Separated Values, CSV) tartalmazó szövegfájlból olvas fel 1db értéket, az aktuális fájl pozíciótól, tetszőleges típusú egyedi változóba (nem lehet tömb, de lehet tömb egyedi eleme!). Ha nem tudja a felolvasott szöveget automatikusan a változó típusára konvertálni (pl. szöveget olvasna számba), az 0-át kap értékül Get #FileSzam, RekordIndex, RekordValtozo – Random-mal megnyitott rekordos fájlból olvassa fel egy előzetesen Type-al definiált összetett típusú, Dim-el deklarált rekordváltozó (lásd: Session3) összes mezőjét a megadott sorszámú rekordbólSession3 Fájlban történő navigáció: Seek #FileSzam, FajlPozicio – adott fájlban adott fájlpozícióra állás (1..2.4Md). Long = FileLen(„Út\Fájlnév”) – meg nem nyitott fájl mérete, byte Long = LOF(FileSzam) – megnyitott fájl mérete, pozícióban Long = LOC(FileSzam) – megnyitott fájl aktuális pozíciója Boolean = EOF(FileSzam) – igazzá válik, ha Input-tal megnyitott szekvenciális szövegfájl végére értünk Formázott kiírás fájlokba: String = Format(Kifejezes, Formatumkod) – kiszámolt kifejezés értékének formátumkód szerinti szöveges formára hozása: GeneralNumber: általános formájú szám, pl Currency: ugyanaz $ előjelölővel, pl. $ Fixed: fix számú tizedesjegyre hozva, pl Standard: ugyanaz, ezres elválasztókkal, pl. 1, Percent: százalék, pl %, Scientific: tudományos, pl e-4 General Date: :55:22 Long/ Medium/ Short Date: / / 8.28 Long/ Medium/ Short Time: 09:55:22/ 09:55/ 9:55

6 Az Office Visual Basic fájlkezelése 3 Width #FileSzam, Sorszelesseg – Output-tal vagy Append-el megnyitott szekvenciális szöveges fájlban a sorok szélessége byte-ban Print #FileSzam, Kifejezes - Output-tal vagy Append-el megnyitott szekvenciális szöveges fájlba írja az adott numerikus vagy szöveges kifejezés értékét. Ha a kifejezés Spc(Darab) / Tab(Darab), akkor adott darab Space/Tab taboló karaktert ír a fájlba Write #FileSzam, Valtozo1, Valtozo2 - Output-tal vagy Append-el megnyitott szekvenciális szöveges fájlba írja több változó értékét, közéjük automatikusan vessző elválasztó karaktereket tesz, és ha eléri az előírt sorszélességet, akkor automatikusan Enter-rel lezárja és új sort kezd. Tehát automatikusan CSV-formátumú fájlt készít Put #FileSzam, RekordIndex, RekordValtozo – Random-mal megnyitott rekordos fajl adott pozíciójába írja a rekordváltozó mezőinek értékeit Fájlok lezárása: Close #FileSzam – a fájl lezárása, az input/output buffer tartalma lemezre kerül Reset – minden nyittot fájl lezárása Könyvtárműveletek: FileCopy „Út1\FajlNev1”, „Út2\FajlNev2” – fájl másolása Name „Út\FajlNev1”, „Út\FajlNev2” – fájl átnevezése Kill „Út\FajlNev1” – fájl törlése Date = FileDateTime(„Út\FajlNev1”) – fájl módosítási dátumának és idejének lekérdezése String = Dir(„Út\”,63) – adott könyvtárban az 1. fájl nevének lekérdezése, ismételt meghívásokra a többi fájlé sorban, ha nincstöbb fájl, üres stringet ad vissza

7 4-1.PÉLDA: Bináris fájlok kezelése A BinTextConv.xls fájl arra mutat példát, hogyanBinTextConv.xls használjuk a VB fájlkezelési elemeit bináris fájl- ok konvertálásakor szövegfájlokká: Erre akkor lehet szükség, ha valamely bináris fájl (pl. AkacosUt.wav) szerkezetét szeretnénk tanulmányozni hekkelési vagy elemzési célokból (pl. hangminta elemzés), és ezért át szeretnénk tenni olyan szövegfájlba, (pl. AkacosUt.txt), ami egyetlen oszlopban tartalmazza a byte-ok számértékeitAkacosUt.wavAkacosUt.txt paraméterA munkalapról a bináris- és a textfájlok elérés útját és nevét szedjük fel a BinFileNam és TxtFileNam nevű paraméter cellákban FreeFile függvénnyel kapunk egy bináris fájl azonosítót a BinFile egész változóba, Majd ilyen számmal nyitunk egy bináris fájlt (For Binary) 1 byte-os rekordmérettel Hasonló módszerrel nyitunk egy szekvenciális output szövegfájlt (For Output) J-be megkapjuk, hány byte hosszú a bináris fájl A rekordjain (byte-jain) végigfuttatunk egy For ciklust, Amiben Get-tel felolvassa az aktuális byte-ot egy Buffer nevű Byte típusú változóba, Majd Write-al szövegként ki is írja rögtön az output fájlba A végén zárja mindkét fájlt Private Sub CommandButton1_Click() Dim BinFileName As String Dim TextFileName As String Dim BinFile As Integer Dim TextFile As Integer Dim Buffer As Byte Dim I, J As Long BinFileName = CStr(ActiveSheet. _ Range("BinFileNam").Value) TextFileName = CStr(ActiveSheet. _ Range("TxtFileNam").Value) BinFile = FreeFile Open BinFileName For Binary _ Access Read _ As BinFile Len = 1 TextFile = FreeFile Open TextFileName For Output _ Access Write _ As TextFile J = LOF(BinFile) For I = 1 To J Get #BinFile, I, Buffer Write #TextFile, Buffer Next I Close #BinFile Close #TextFile End Sub katt

8 4-1.Gyakorló feladat: Ikon-bogarászás Programozza át a BinTextConv.xls fájlt oly módon, hogy az Excel konzultáció ikon 16 millió színű (3 egymás utáni byte kódolja a pixelek vörös, zöld, kék összetevőit), 32×32 pixeles *.BMP fájljának (ExcelKonz.bmp) a tartalmát felolvassa 3 munkalapra (vörös, zöld, kék), mindegyiken 32×32 cellába számkódokként, feltételes formázással (alacsony érték:feketébb, magas érték: vörösebb, vagy zöldebb, vagy kékebb).BinTextConv.xlsExcelKonz.bmp A *.BMP fájl fejléce 54 byte, és utána 32 lentről felfele haladó sorban 32 pixel következik balról jobbra, ezek színe 3 byte-on tárolódik, kék, zöld, vörös sorrendben A megoldás: 4-1GyakorloMegoldas.xls4-1GyakorloMegoldas.xls Innen rögtön látszani fog, hogy az ikonon Darth Vader és Obi-Van kenobi mutatnak lézerkardjaikkal X-et a halálcsillagon:

9 Szöveges log-fájlok kezelése Az Excelhez normál körülmények között inkább adatbázisokat használunk külső adatforrásként, és így nem kell belemélyednünk a VB elég elavult, elég struktúrálatlan fájlkezelő utasításainak használatába. Sajnos van azonban egy fontos kivétel az üzleti életben, amikor nem használhatunk adatbázis-adatforrásokat és muszáj fájlkezeléssel foglalkozni: ez a pénztári terminálok, bank-automaták, és egyéb soros porton (Serial Port) csatlakozó eszközökből legyűjtött adatok feldolgozása Ezek az eszközök gyakran elég bonyolult szerkezetű adatokat kezelnek. Pl. pénztári terminál esetén az árú fajtája, mennyisége, adott heti egységára az adott boltban, teljes nettó ár, forgalmi adó, fogyasztási adó, feltétel nélküli gyártói- vagy üzlet szintű árengedmények, a fogyasztói hűségkártya azonosítója, hűségkártyára kapott kedvezmények, az eladott tétel profittartama, hogyan csoportosulnak a tételek vásárlásba, stb. Látható, hogy ez olyan bonyolult adatstruktúra, ami tele van belső 1:több kapcsolatokkal (pl. 1 vásárláshoz : több tétel, 1 tételhez : több engedmény, stb.) Ezek alapján azt várnánk, hogy a pénztári terminálok valami szépen megtervezett, több táblából álló adatbázisba potyogtatják az adatokat. Ez azonban sajnos még az ezredforduló után is csak a legmodernebb és legdrágább rendszerekben igaz!!! Sokkal gyakoribb, hogy a perifériás eszközök valamilyen szekvenciális elérésű, az adatmezőket vesszővel (CSV), szóközzel, tab-bal, vagy egyéb jellel elhatároló (Delimitied) szöveges log-fájlba (Log File) írogatják az adatokat, messze NEM szabályos rekordszerkezetben! Pl. egy rekord állhat több sorból a szövegfájlban, soronként változó mezőstrktúrával, ami sokszor ráadásul nem is fix, hanem plusz mezők ékelődhetnek be / a mezők jelentése megváltozik más mezők értékétől függően. Láthatjuk, hogy ennek halvány köze nincs az adatbázisokhoz, nincs olyan adatbáziskezelő, ami ezt egy az egyben, értelmes módon táblákba tudná importálni (a drágább adatbázis- kezelőkhöz - pl. Oracle – van olyan modul, ami log-fájl elemzést végez, igencsak borsos áron). Ha a „szegény ember vízzel főz”, illetve a „most nem adunk hozzá semmit, de Józsikám, te ügyes vagy, majd megoldod” tipikus „keletejrópaji” esete forog fenn, akkor arra kényszerülhetünk, hogy magunk írjunk log-fájl elemzőt, ami képes kinyerni, és egy vagy több adatbázis táblába tölteni az információt a log fájlból Ezt a tevékenységet viszont a VB fájlkezelő utasításai alapban nem nagyon támogatják: Nem képesek változó mezőszerkezetű vagy több soros rekordokat kezelni Egyszerre 1db rekordot tartalmazó I/O bufferrel dolgoznak a memória és a merevlemez közt, ami rém lassú:ha pl.87byte-os a rekord, akkor a VB 87byte-onként olvas lemezről!

10 4-2.PÉLDA: Tops Friendly Markets Inc. T-log fájlok kezelése A NY, OH, PA államokban 136 szupermarketet üzemeltető Tops Friendly Markets Inc. élelmiszer áruház lánc egy 1979-es fejlesztésű IBM Supermarket System Unix-os mainframe-rendszert használt még 2004-ben is a pénztári terminál adtatok szöveges log- fájlokba gyűjtésére. (Az ilyen rendszerek rendkívül drágák, ezért képesek addig használni őket, amíg ki nem termelik az árukat. Ez beletelhet 20 évbe is, amikor már olyan vészesen elavultak, hogy az alap üzleti működést is veszélyeztetik. A Tops pl. képtelen volt profitot és profitabilitást számolni színrelépésünk előtt.) Minden rossz, amit fentebb elmondtunk a log-fájlokra, igaz volt erre a rendszerre. Struk- túrálisan maga volt a káosz: több soros rekordok, teljesen ad-hoc változó mezőszerkezettel: Egy kis izelítő a kódkönyvből, ami leírta, hogy mi mikor mit jelent éppen: Ráadásul még az óriási adatmennyiség is gondot jelentett: a teljes láncban évente 300Gbyte-nyi log fájl keletkezett Hogy egy ilyen méretű problémára Excel VB környezetben fejlesztettünk log-fájl elemző szoftvert (lásd: LogFileReader.xls ), az első pillantásra őrültségnek tűnhet, de megvolt rá a jó okunk, ami ki fog derülniLogFileReader.xls :020501:2217:0011:0352:00:0011:0352: :00:12:0117:7360:0887::04:15:2969:17: :020501:2217:0011:0352:01: :0299:01:999000:12:: :020501:2217:0011:0352:01: :0289:01:999000:12:01: :020501:2217:0011:0352:01: :0299:01:999000:12:01: :020501:2217:0011:0352:11:??: :00:0009:01: :020501:2217:0011:0352:01:084575:0150:01:999000:13:: :020501:2217:0011:0352:11::==:00:::4575: : :020501:2217:0011:0352:01:084589:0140:01:999000:13:: :020501:2217:0011:0352:11::==:00:::4589: : :020501:2217:0011:0352:11:<<:00:0290:00:02: :020501:2217:0011:0352:11:>>: :00:0290:02::::: :020501:2217:0011:0352:05:11:?600::: :020501:2217:0011:0352:09:11:03

11 A DelimitFile97 Modul Mindennek az alapja az volt, hogy kellett egy log-fájl beolvasó modul (lásd: a LogFileReader.xls–ben a DelimitFile97), ami a VB fájlkezelését megturbózva hatékonyan olvas log-fájlból:LogFileReader.xls Objektum-orientált logikájú,mégha formálisan nincs is megírva szabályos objektumnak: a fájl összes fontos beállítását, jelzését, adatbufferét összefogta egy adatszerkezetben (DelimitFile), a fájlkezelő eljárások ebből dolgoznak, ezért paraméterezésük, kezelésük rendkívül egyszerű: OpenDelimitFile DelimitFile -létező nyitása olvasásra CreateDelimitFile DelimitFile -új létrehozása, régit töröl AppendDelimitFile DelimitFile -létező végéhez írás CloseDelimitFile DelimitFile -fájl zárása ReadRec DelimitFile -következő rekordot bufferbe olvas WriteRec DelimitFile -bufferből aktuális rekordot fájlba ír A log fájl rekordjainak mezőit egy dinamikusan méretezhető, Variant-ok ból álló tömb elemeibe, mint memória-bufferbe olvassa be (.Field(OszlopIndex)), ezért le tud kezelni minden egzotikus mezőszerkezet változást, bármely mezőben kaphat bármilyen típusú adatot Mivel a munkalapok cellái is Variant típusúak, a bufferből könnyen feldobálhatjuk a log fájl szomszédos sorait akár egy munkalapra is, és az Excel cellafüggvényei segítségével bonyolult egyeztetéseket, kereséseket, statisztikákat is meg tudunk ejteni, véresebb kézi kódolás nélkül (A T-log fájlok kódkönyve és a mezők tartalma nem volt mindig összhangban, és hiányoztak is belőle adatok, így az elemző algoritmusnak különféle statisztikák alapján találgatni kellett, mi mit jelenthet. Pl. messze nem volt egyértelmű, hogy egy tételt súlyra vagy darabra vettek meg) A VB botrányosan lassú fájlkezelésén úgy segítettünk, hogy bináris fájlként nyitjuk meg és olvassuk fel a log-fájlt, a VB-ben maximálisan lehetséges 64Kbyte-os I/O bufferméretet használva. Ez nagyságrendekkel gyorsabb volt a rekordos fájlkezelésnél 'Type of delimited text file Type DelimitFile 'User specified settings DelimitFileName As String TxtPageSize As Long RecDelimit1 As Byte RecDelimit2 As Byte LinesPerRec As Long LineDelimit1 As Byte LineDelimit2 As Byte MaxFieldNum As Long FieldDelimit As Byte TextMarker As Byte Leading0Marker As Byte Treat0LngtField As Integer 'Data of input-output EOFIL As Boolean Field() As Variant End Type 'DelimitFile

12 A DelimitFile97 Modul felhasználói felülete Olyan esetre, ha a felolvasandó log-fájl formázási beállításai nem fixek, és a felhasználónak kellene őket aktuálisan állítgatni, a LogFileReader.xls Module1-ben írtunk egy eljárást:LogFileReader.xls Sub DelimitFileSettings(ByRef RowRange As Range, ByRef File As DelimitFile) Ami az alább mutatott elrendezésű RowRange 1db munkalap-sornyi cellatartományból automatikusan felszedi az aktuális DelimitFile-beállításait: 4-2.Gyakorló feladat: Tesco-cseszegetés Szkenneljen be OCR szövegfelismerővel 1 Tesco-blokkot egy szövegfájlba (pl. Tesco.txt)!Tesco.txt Olvassa fel a szövegfájl tartalmát DelimitFile97 modul segítségével egy Excel munkalapra oly módon, hogy a blokk adatai közül minél többet próbáljon meg adatmezőként haszno- sítható cella-tartalommá varázsolni(1 szám vagy felirat 1 cellába kerüljön, ne darabolódjon)! A feladat gyakorlati értelme a következő: ahhoz, hogy egy áruházlánc megtervezze a hetenkénti, üzletenkénti termékárazási stratégiáját, ismerni kell a 3-4 legfontosabb versenytársa adott heti árait adott régiókban, ami elég méretes adatbázis, tekintve hogy egy szupermarket ezer terméket forgalmaz, 52 héten, akár üzletben, amelyek egyedi terméknkénti kedvezményeket is adhatnak. Nem sétálhatunk be azonban a konkurrenciához azzal, hogy „Hé fiúk, kiírnátok nekem erre a DVD-re az e heti árazási és promóciós adatbázisotokat?!” A megoldási lehetőségek: Úriemberek megegyezésén (Gentlemans Agreement) alapuló, kultúrált amerikai módszer: az áruházak kölcsönösen megfizetnek egymás szervezetében egy téglát, hogy hetente lopják el az árazási adatbázisokat. Természetesen előbb-utóbb kiderül, ki a tégla, de az „amíg te nem rúgod ki az én téglámat, addig én se a tiedet”-elvet alkalmazzák. Nyíltan azért nem cserélhetik ki az adatokat, mert akkor kartellezés miatt rögtön lecsapna a versenyhivatal. A módszer technikailag hatékony, de drága: a téglákat jól meg kell fizetni az árulásért, a mégiscsak fennálló kirúgási kockázat miatt Keleteuróp rabszolgatartó módszer: részmunkaidős diákokat fizetünk az árak kézi leírására az üzletben (újabban mobillal lefényképezésére). Ez drága, megbízhatatlan, kis kapacitású, az árak töredékét méri fel csak, biztonsági őr kidobja, stb. A trükkös adatbányász módszer: a konkurrencia parkolójában kis értékű ajándék (cukorka) fejében összegyűjtetjük részmunkaidős diákkal a blokkokat a vásárlóktól, beszkenneljük, beolvassuk, megbányásszuk. Ez legális módszer, és nemcsak az árakról, de a forgalomról és kedvezményekről is ad információkat!

13 Az előadás tartalma Külső adatforrások használata Excelben 1 Külső fájlok használata –Az Office Visual Basic fájlkezelése –Bináris fájlok kezelése –Szöveges log-fájlok nagysebességű beolvasása: Tops Friendly Markets Inc. T-log fájlok esettanulmány DelimitFile97 modul és felhasználói felülete Külső adatok beszerzése weblapokról –Megvalósítás VB makróból Külső adatok beszerzése adatbázisokból –Megvalósítás VB makróból –Az MSQuery lekérdezés-tervezője Az SQL lekérdező nyelv –Alapfogalmai –Egy táblás lekérdezések Egyszerű kiválasztó lekérdezések Szűrők használata Rendezések használata Csoportosítás és aggregáció használata –MS Access lekérdezés tervező SQL kódszerkesztő Grafikus lekérdezés-tervező –Több táblás lekérdezések Descartes Join Inner Join Left Join Full/Natural Join Kettőnél több tábla közti Joinok működése Szakirodalom

14 Külső adatok átvétele weblapokról 1 Az Adatok|Külső adatok importálása| Új weble- kérdezés (Data|Import| Web) menűben: –Cím:a forrás webcí- me (pl.www.napi.hu /Tőzsdekompasz /BÉT linkre kattint)www.napi.hu –Kattintsunk a forrás HTML táblázat ob- jektum kijelölőre( ) –Bekereteződik a visszahozandó adat –Importálás gomb: adatok visszahozá- sa Excelbe katt

15 Külső adatok átvétele weblapokról 2 katt Ezután jelöljük ki a befogadó munkalapot+kezdő cellát OK gombra kattintva az adatok beíródnak a munka- lapra, és megjelenik a Külső adatok eszközsor: A Tulajdonságok gombra ( ) kattintva beállíthatjuk: –Mentse a lekérdezés-definíciót –Frissítse az adatokat nyitáskor és a háttérben 1 percenként (internet-kapcsolatot igényel) –Új adatokhoz teljes sorok beszúrása (ez szinkronizálja az adatforrás és a munkalap sorait) –Képletek kitöltése az adatok melletti oszlopokban (ez az új sorokba is auto-kitölti a mi képleteinket) Egy munkalapon csak 1 webes import lehet! katt

16 Külső adatok átvétele weblapokról 3 A webes adatlekérdezés makróból is megy. A munkalap (WorkSheet) objektum lekérdező- táblák (QueryTables()) kollekciójának lekérdezőtábla (QueryTable) objektuma intézi A lekérdezőtábla megjelenik a nevesített cellatartományok közt,a.Name-ben kapott néven: 1. A nevesített cellatartomány dinamikusan átméreteződik az éppen lekérdezett adatmennyiség függvényében, így egyszerű rá hivatkozni függvényekből, VB kódból 2. A munkafüzeten belüli névütközések elkerülése miatt nem globális tartománynév (Global Named Range),hanem lapspecifikus (Sheet-specific Named Range) tartomány- név lesz, más lapokról ebben a formában hivatkozható: LapNev!TartomanyNev 3. Ha a lekérdezőtábla mutat mezőneveket, a cellatartománya ezeket is tartalmazza! Dim MyQueryTable As QueryTable 'Üres lekérdezőtábla objektum Set MyQueryTable = ActiveSheet.QueryTables.Add( _ Connection:="URL;http://trader.napi.hu/index.asp?", _ Destination:=ActiveSheet.Range("A1")) 'Rádefiniálom az újat With MyQueryTable.Name = "ElsoWebLekerd" 'Lekérdezőtábla cellatartomány neve.FieldNames = True 'Hozza vissza a mezőneveket.RowNumbers = False 'Ne autoszámozza a sorokat.FillAdjacentFormulas = True 'Töltse ki a képleteket mellette.PreserveFormatting = True 'Őrizze meg a formázásokat.RefreshOnFileOpen = True 'Excel fáljnyitáskor frissítsen.BackgroundQuery = True 'Lekérdezés a háttérben fusson.RefreshStyle = xlInsertDeleteCells 'Engedi a cella beszúr/törlést.SavePassword = False 'Ne mentse a weblap belépési jelszót.SaveData = True 'Mentse a letöltött adatokat a munkalapba.AdjustColumnWidth = True 'Igazítsa az adatokhoz az oszlopokat.RefreshPeriod = 1 '1 percenként frissítsen automatikusan.WebSelectionType = xlSpecifiedTables 'Csak 1 táblát nézzen.WebFormatting = xlWebFormattingNone.WebTables = "12" 'A 12. táblát nézze a weblapon.WebPreFormattedTextToColumns = True.WebConsecutiveDelimitersAsOne = True.WebSingleBlockTextImport = False.WebDisableDateRecognition = False.WebDisableRedirections = False.Refresh BackgroundQuery:=False '1. frissítés fusson az előtérben End With

17 4-3.Gyakorló Feladat: Külső adatok átvétele weblapokról A honlapról töltsön le webes lekrdezéssel a lehető legrészletesebb tőzsdei részvényforgalmi és árfolyam adatokat (részvény, pontos idő, volumen, ár)www.napi.hu Látható, hogy a letöltött adatok nem adnak tranzakció szintű adatokat (pl. az adott időpontban létrejött kötés mérete hány részvény volt), csak forgalmi összesítést a nap addigi kötéseiről. Ez fontos információ egyetlen ingyenes BÉT adatforráson sem szerepel, mert a brókerházak maguk is intenzíven használják kereskedési modelljeikben. Ezért csak fizetősen férhető hozzá, vagy ott sem. Ha azonban nagyon sűrű időszeletekben (pl. 1 perc) figyeljük a folyamatosan frissülő adatokat, akkor két egymást követő összesített forgalom különbségeként ki lehet számítani a kötési méretet Ehhez készítsen egy makrót, ami frissítés után mindig átmásolja az adatokat egy puffer munkalapra, de előtte még összeveti őket az előzőleg a puffer munkalapon lévő régi adatokkal, és ahol különbséget talál, azt a sort a kiszámított kötési mérettel kiegészítve hozzáírja egy tranzakció-tároló munkalaphoz. A megoldás: 4-3GyakorloMegoldas.xls4-3GyakorloMegoldas.xls (Ez sem segít azonban azon, hogy az ingyenes BÉT adatforrások (és sok fizetős is) mind 15 perces késleltetéssel jelenítik meg az adatokat, hogy a brókerházak ki tudják hasz-nálni a nagyon rövid idejű árfolyam ingadozá-sokat arbitrage-ügyletek segítségével.)

18 Külső adatok átvétele relációs adatbázisokból 1 Az adatbázisokból történő lekérdezés hasonlóan működik a webeshez, bár némileg bonyolultabb. Az Adatok|Kül- ső adatok importálása| Új adatbázis lekérdezés (Data| External data|New database query) menüben: Válasszuk ki az adatforrást (pl. MS Access Adatbázis) Adjuk meg az adatbázis fájl elérési útját és nevét (pl. 4-7Pelda.mdb)4-7Pelda.mdb Ezután elindul az MSQuery nevű segédprogram, ami a Windows beépített része, és adatbázisok tartalmának lekérdezésére szolgál Először felhozza az adatbázis táblalis- táját, és 1 vagy több táblából kiválaszt- hatunk mezőket a lekérdezésbe a ( ) gombbal. (Ha több táblából választunk mezőket, rá fog kérdezni,hogy a táblák rekordjait milyen elsődleges-/ idegen kulcsmezőkön keresztül csatolja, lásd Lesson1) Lesson1 Ezután felkínálja a rekordok szűrésé- nek lehetőségét: 3 mező értékéből alkothatunk változatos szűrő kifejezést,<>,=, =, ÉS, Vagy, Nem operá- torok segítségével Ezután 3 mező szerint rendezhetjük növekvő/csökkenő sorrendbe az ered- ményt (az 1. a legmagasabb szintű rendező mező, aszerint végez főren- dezést, annak egyező értékein belül alrendezést a 2. mező, azon belül a 3. mező szerint) katt

19 Külső adatok átvétele adatbázisokból 2 Ezután lehetőségünk van akár kézzel is belenyúl- ni a lekérdezés SQL kódjába (lásd: Lesson1), de ez nem ajánlott, inkább válaszzuk az adatok átadása az Excelnek pontotLesson1 Ekkor az MSQuery véget ér és visszatérünk az Excel külső adat importáló varázslójához Itt meghatározhatjuk, mely munkalap mely cellá- jától íródjanak be a lekérdezett adatok. Vigyáz- zunk arra, hogy a lekérdezés akár több 1000 rekordot is beírhat sorokba, és akár több tucat mezőt oszlopokba, ezért a munkalapon tőle lefele és jobbra ne legyen más tartalom, mert azt felül- írja. Tegyük 1 üres lapra (de fejléc lehet felette)! A Tulajdonságok gombbal állíthatjuk a lekérde- zőtábla viselkedését: Név: ez a lekérdezőtábla is egy dinamikusan méreteződő, nevesített cellatartományt defi- niál, amin keresztül könnyű elérni az adato- kat, akár cellaképletekből, akár VB kódból Mezőnevekkel: vigyázzunk rá, hogy kérjük a mezőnevek megjelenítését, különben nem tudjuk majd melyik oszlop mit jelent. A mező- nevek képezik a fenti cellatartomány 1.sorát! Frissítés nyitáskor, frissítés 1 percenként: az adott alkalmazás igényei döntik el, milyen gyakran frissítsen automatikusan Új beszúrása, nem használt törlése: így az adatbázis tábla és az Excel lekérdező tábla sorai szinkronban lesznek Ha a lekérdezőtábla nagy, a mezőnevek könnyen kigördülhetnek a képernyőről, ami kellemetlen, ezért a kigördülő rész bal felső celláját kijelölve Ablak|Ablaktábla rögzítése (Window|Freeze) menüvel rögzítsük az 1.sort/oszlopot képernyőre katt

20 Külső adatok adatbázisokból 3 Természetesen az adatbázisok lekérdezése is programozható VB makró kódból, bár a szintaxis némileg bonyolultabb, mint a webes lekérdezés esetén: A lekérdezőtábla (Querytable) objektumban:.Connection – kapcsolati string, amely egy előírt szin- taktika szerint, pontosvesz- szővel elválasztva írja le az adatbázis kapcsolat paramé- tereit (adatforrás, adatbázis- név, stb.).CommandText – a lekérde- zés SQL kódja stringként A bonyolódást az okozza, hogy mindkettő elég hosszú string szo- kott lenni, és egyszerűen nem férnek ki a VB kódszerkesztő max. 128 karakteres soraiban (string konstans írása közben nem lehet „ _” sortörést alkal- mazni) Ezért az Array() függvényt hasz- náljuk több string konstans ösz- szefűzésére: String = Array(„Szov1”,”Szov2”) A lekérdezőtábla más tulajdonsá- gai és az általa generált dinami- kus, nevesített cellatartomány ugyanúgy működik mint az előbb Dim MyDBTable As QueryTable Set MyDBTable = ActiveSheet.QueryTables.Add( _ Connection:=Array( _ "ODBC;", _ "DSN=MS Access adatbázis;", _ "DBQ=D:\PTE-PMMFK\SourceData.mdb;", _ "DefaultDir=D:\PTE-PMMFK;", _ "DriverId=25;", _ "FIL=MS Access;", _ "MaxBufferSize=2048;", _ "PageTimeout=5;"), _ Destination:=Range("A1")) With MyDBTable.CommandText = Array( _ "SELECT", _ "SegCatData2.Seg,", _ "SegCatData2.ProfCut3,", _ "SegCatData2.Region,", _ "SegCatData2.CompClust,", _ "SegCatData2.Cat,", _ "FROM `D:\PTE-PMMFK\SourceData`.SegCatData2 ", _ "SegCatData2").Name = "AdatbTabla".FieldNames = True.RowNumbers = False.FillAdjacentFormulas = True.PreserveFormatting = True.RefreshOnFileOpen = True.BackgroundQuery = True.RefreshStyle = xlInsertDeleteCells.SavePassword = True.SaveData = True.AdjustColumnWidth = True.RefreshPeriod = 1.PreserveColumnInfo = True.Refresh BackgroundQuery:=False End With

21 Külső adatok adatbázisokból 4 Ha az adatbázis egyszerre több táblájából választunk mezőket, és meg kell határoz- ni a csatolásukat, vagy kézzel akarjuk szerkeszteni a lekérdezést, az MSQuery varázsló üzemmódból átvált a lekérdezés- tervező grafikus felületre (GUI): Itt felül a táblák mezőlistája látható, a táblák összecsatolásához a csatoló mezőket egérrel át kel húzni egymásba Középen van a lekérdezés eredménytábla Az SQL gombra kattintva alul megjelenik a lekérdezés SQL kódja Ha lehet, igyekezzünk elkerülni bonyolult le- kérdezések készítését MSQuery-ben,mert van néhány bosszantó hiányossága: A táblákban a mezők nem fizikai, hanem ABC sorrendben jelennek meg, így nem a tábla 1. mezője lesz az elsődleges kulcs, ami az áttekinthetőséget erősen zavarja Az SQL-t – mint bármely programkódot – tabulálni kell. Az SQL szerkesztő viszont nem kezel tabulátorokat! Az eredménytáblát mindig újraszámolja, ezt nem lehet kikapcsolni, ezért nagy adatbázis esetén az SQL két módosítása közt perceket kell várni! Így a több táblás lekérdezéseket érdemes in- kább előre, adatbáziskezelőben csinálni. Ezekre pedig biztosan szükség lesz, mert a normalizáció miatt (lásd: Lesson1) az adatbázisban ritkán tárolódnak 1 táblában mindazon mezők, amelyek az adatfor- ráshoz kellenek. Ezért ismerkedjünk meg az SQL lekérdező nyelv rejtelmeivel!Lesson1 katt húz

22 4-4Gyakorló Feladat:Külső adatok átvétele adatbázisból A 4-4Pelda.mdb adatbázis a NY, OH, PA államokban 164 élelmi- szer-szupermarketet üzemeltető Pops Friendly Markets Inc. termék-kategoria rendszerét tartalmazza, az alábbi táblákkal:4-4Pelda.mdb Categories: a termékek 300 főkategóriája a régi kategória rendszerben. Ez elég zavaros, mert a múltban sokszor egy promócióba rakott termékek miatt új főkategóriát hoztak létre SubCategories: kb alkategória, a régi rendszer kö- zépszintje, szintén zavaros, mert nem funkcionális csopor- tosításon alapul, hanem hogy egy helyen voltak a raktárban, vagy 1 szállító szállította őket. 1 dologra több alkategória is lehet, mert a régit nem találták meg papíron, és újat csináltak Products: kb , vonalkóddal (UPC) azonosított ter- mék, a kategória rendszer alsó szintje, van néhány termék ami nincs alkategóriába sorolva, illetve nemlétező alkategóri- ára hivatkozik a Products.SubCatCode idegen kulcsban SubDepartments: alosztályok-szintű termékcsoportosítás SuperCategories: 44 szuperkategória, amelyet a zavaros Categories helyett újonnan hoztak létre, és minda 4500 alkategóriát besorolták (ld.: SubCategories.SuperCatCode) HierCategories: újonnan létrehozott, max. 5-szintű funkcio- nális termékkategorizáció kb. 450 egymásba ágyazott kategóriával (a szerkezetét lásd a képen). A felső szint (vörösben) megegyezik a 44 szuperkategóriával. Nem fix szintszámú hierarchiaként (Non-fixed level hierarchy) táro- lódik, amit a tábla önmagára hivatkozó(Self connecting) 1: több kapcsolata ír le: a HierCategories.SupremeCatCode idegen kulcs hivatkozik az adott kategória felettesére. Azért nem fix-szintszámú hierearchia, mert a kevésbé fontos kategóriáknál nincs kibontva a csoportosítás lehetséges 5 szintje. A termékek ezen hierarchia alsó szintjeire vannak csatolva a Products.HierCatCode idegen kulccsal Feladat: kérdezze le Excelbe minden termék vonalkódját, leírását, alkategóriájának nevét, szuperkategóriájának nevét! A megoldás: 4-4GyakorloMegoldas.xls4-4GyakorloMegoldas.xls

23 Az előadás tartalma Külső adatforrások használata Excelben 1 Külső fájlok használata –Az Office Visual Basic fájlkezelése –Bináris fájlok kezelése –Szöveges log-fájlok nagysebességű beolvasása: Tops Friendly Markets Inc. T-log fájlok esettanulmány DelimitFile97 modul és felhasználói felülete Külső adatok beszerzése weblapokról –Megvalósítás VB makróból Külső adatok beszerzése adatbázisokból –Megvalósítás VB makróból –Az MSQuery lekérdezés-tervezője Az SQL lekérdező nyelv –Alapfogalmai –Egy táblás lekérdezések Egyszerű kiválasztó lekérdezések Szűrők használata Rendezések használata Csoportosítás és aggregáció használata –MS Access lekérdezés tervező SQL kódszerkesztő Grafikus lekérdezés-tervező –Több táblás lekérdezések Descartes Join Inner Join Left Join Full/Natural Join Kettőnél több tábla közti Joinok működése Szakirodalom

24 Az SQL alapfogalamai 1 A struktúrált lekérdező nyelv (Structured Query Language, SQL) célja relációs adatbázis táblák adatainak manipulációja: Leegyszerűsített szintaxissal: a procedurális programnyelvekkel ellentétben, az SQL utasításban nem algoritmust írunk le, hanem a kívánt végeredémény táblát definiáljuk. Az algoritmus ebből automatikusan számítódik ki. Ez azért van így, mert 1971-ben E. F. Codd, az SQL kitalálója, az Oracle elődének alapítója észrevette, hogy az addigi algoritmikus adatkezelő kódokban ugyanazok a feladatok ismétlődtek folyton kis változtatásokkal: „rendezések”, „legyűjtések”, „szétválogatások”, „keresések”. Így az adatkezelésben szükséges algoritmusok 95%-a előregyártott modulokból hatékonyan összerakható. Vagyis az SQL hihetetlen mennyiségű kézi kódolást takarít meg: egy soros SQL kód mögött az automatikusan generált procedurális kód sor is lehet! Az algoritmusok maradék 5%-a (pl. rekurzión alapuló algoritmusok) nehezen tehetők SQL-be, de ennek ellensúlyozására a jelentősebb gyártók az SQL-jeiket kiegészítették procedurális nyelvi elemekkel (Oracle: PL-SQL, Microsoft: Transact SQL) Gyorsan: az adatbázis motor (Database Engine) moduljai alaposan ki vannak optimalizálva merevlemez- processzor és memóriahasználat tekintetében, elérik az adott célra kézzel írt kód futási sebességének 90%-95%-át, emiatt több 1000 ember×évnyi programozói munkát tartalmaznak. Aki nem ismeri az adatbázis kezelőket, az adatbázis tervezést és az SQL-t, és ezért kézzel programozgat helyette bármiben, az beleszalad abba, hogy hihetelen időpazarlással, tök fölöslegesen elkezdi leprogramozni az adatbázis motor bizonyos részeit szarul, amit más sokkal jobban megírt már! Szabványosan: a procedurális programnyelvekkel ellentétben, az SQL szintaktikája 75-80%-ban szabványos az adatbáziskezelők közt, mert mind az ANSI SQL-en alapulnak. Amíg pl. egy C kódot szinte lehetelen Basic-be vagy Pascal-ba áttenni egy Accessben vagy MSSQL-ben írt SQL nagyrészt használható lesz MySQL-ben vagy Oracle-ben

25 Az SQL alapfogalamai 2 Az SQL alapelvei: Minden művelet, lekérdezés (Query) inputja és outputja csak adatbázis tábla (Database Table) lehet, kivéve, amikor egyes értékeket paraméterként (Parameter) viszünk be. Egy lekérdezés output táblája felhasználható egy másik lekérdezés egyik input táblájaként. Ilyenkor az első lekérdezés kódját beágyazhatjuk a második lekérdezésbe (Embedded Query). A lekérdezések több szinten egymásba ágyazhatók. A procedurális nyelvektől eltérően, nem lehet a táblákon kívül különálló változókat deklarálni, az eredménytáblázatokat pedig nem kell előre deklarálni: a mezőneveket és a mezők típusát automatikusan deklarálja bennük Alapértelmezésben minden műveletet az input táblák összes rekordjára végrehajt, ezért nem kell külön ciklusokat definálni a programkódban. A művelet hatását korlátozni csak rekordok mezőire vonatkozó szűrőfeltételekkel (Filter) lehet A rekordok és mezők nem indexelhetők közvetlenül, mint programozásban egy két dimenziós tömb elemei (Pl. Nincs olyan, hogy „567. rekord, 8. mező”), a rekordok és azon belül a mezők fizikai tárolási sorrendje lényegtelen! Ez első pillantásra hülyeség, de így nagy mennyiségű rekord beszúrását/törlését, sokkal gyorsabban lehet elvégezni, mert nem kell mindig frissíteni az elemek indexét, mint pl. egy listában (lásd: Lesson3)Lesson3 A rekordokat itt úgy tudom csak egyenként elérni, hogy egy egyedi értékeket tartalmazó mezővel besorszámozom őket, és erre rakok szűrést: Szűrő: ahol a Sorszám = 567 Az SQL utasítás részei: A procedurális nyelvektől eltérően, ahol 4-5 fajta alaputasítás van (If, For, Case, Loop, stb.) az SQL egyetlen fajta utasítással oldja meg a legtöbb műveletet, ami viszont több részből állhat, és ezek nem mind kötelező részek (lásd: [ ]): SELECT - Mely mezőket, számításokat válassza ki az eredménytáblába? FROM - Mely táblá(k)ból szedje az adatokat, ezek hogy kapcsolódnak? [WHERE] - Milyen feltételek legyenek érvényesek a rekordok kiválasztásnál? [GROUP BY] - Mely mező(k) értéke szerint vonja össze csoportokba a rekordokat? [HAVING] - Milyen feltételek vonatkozzanak a megalkotott csoportokra? [ORDER BY] - Mely mező(k) szerint rendezze az eredménytábla rekordjai? ; Pontosvessző zárja le A részek sorrendje kötött, de semmi köze hozzá, hogy algoritmikusan milyen sorrendben végzi el a feladatokat az adatbázis motor

26 Egy táblás lekérdezések 1: Egyszerű szelekciók FiokNevSzamlaSzamUgyfelNevEgyenleg Meszesi217Gallai Király utcai105Gallai Szigeti uti102Hegedűs Szigeti uti201Hoffman Király utcai101Kovács Kórház téri222Lakatos Uránvárosi215Sajó Rákóczi uti305Takács UgyfelNevEgyenleg Gallai Gallai Hegedűs Hoffman Kovács Lakatos Sajó Takács FiokNevSzamlaSzamUgyfelNevEgyenleg Meszesi217Gallai Király utcai105Gallai Szigeti uti102Hegedűs Szigeti uti201Hoffman Király utcai101Kovács Kórház téri222Lakatos Uránvárosi215Sajó Rákóczi uti305Takács FiokNev Király utcai Kórház téri Meszesi Rákóczi uti Szigeti uti Uránvárosi UgyfelNevEgyenleg Gallai Gallai Hegedűs Hoffman Kovács Lakatos Sajó Takács SELECT * FROM Betet; SELECT UgyfelNev, Egyenleg FROM Betet; SELECT UgyfelNev, Egyenleg*1.12 FROM Betet; SELECT DISTINCT FiokNev FROM Betet; MaxOf Egyenleg SELECT Max(Egyenleg) AS MaxOfEgyenleg FROM Betet; Itt a műveletek a tábla minden rekordjára végrehajtód- nak,mert nincs WHERE szűrő.A SELECT részben lehet: - Táblanév.* - az összes mező megadása - Táblanév.Mezőnév – adott mező megadása / * ^, Sin(), Cos(), Tan(), Ctg(), Abs() – műveletek, függvények mezőkkel - Min(), Max(), Sum(), Avg() – mezők aggregációja - AS MasNev-az eredménymezőnek más nevet adhatok - DISTINCT – összevonom egybe az egyező értékű rekordokat az eredménytáblában 1 rekordba - „ABC”, , # # – szöveges, szám, dátum konstansokat adhatok meg - Ha bármely mező értéke Null, vagyis hiányzó érték, (nem azonos a 0-val) a számítás eredménye Null

27 Egy táblás lekérdezések: szűrések WHERE feltétellel FiokNevSzamlaSzamUgyfelNevEgyenleg Meszesi217Gallai Király utcai105Gallai Szigeti uti102Hegedűs Szigeti uti201Hoffman Király utcai101Kovács Kórház téri222Lakatos Uránvárosi215Sajó Rákóczi uti305Takács UgyfelNevEgyenleg Hegedűs Hoffman Egyszerű feltétel: SELECT Betet.UgyfelNev, Betet.Egyenleg FROM Betet WHERE Betet.FiokNev="Szigeti uti"; UgyfelNevEgyenleg Sajó Lakatos Gallai Gallai Intervallumos feltétel: SELECT Betet.UgyfelNev, Betet.Egyenleg FROM Betet WHERE Betet.Egyenleg>= And Betet.Egyenleg<=850000; UgyfelNevUjEgyenleg Hoffman Gallai Egyszerű feltétel számítással: SELECT UgyfelNev, Egyenleg*1.12 AS UjEgyenleg FROM Betet WHERE Egyenleg*1.12>=850000; UgyfelNevUjEgyenleg Kovács Hegedűs Hoffman Gallai Halmazba eséses feltétel: A halmazt az In() operátorban adjuk meg SELECT UgyfelNev, Egyenleg FROM Betet WHERE FiokNev In("Szigeti uti", "Király utcai"); UgyfelNevEgyenleg Sajó Takács Lakatos Gallai Gallai Szövegmaszkolós feltétel: Like() operátorban adjuk meg a szövegmaszkot, ahol: „?” egy karaktert, „*” bármennyi karaktert, „#” egy számjegyet jelent. Pl. ügy- felek, ahol a név 2. betűje„a”: SELECT UgyfelNev FROM Betet WHERE UgyfelNev Like("?a*"); Kitöltöttség ellenőrzés: SELECT UgyfelNev FROM Betet WHERE UgyfelNev Is Not Null; Null: hiányzó érték, nem zérus (0)! Soha nem így tesztelem: =Null, mert a Null még önmagával sem =!

28 Egy táblás lekérdezések: rekordok rendezése az ORDER BY részben FiokNevSzamlaSzamUgyfelNevEgyenleg Meszesi217Gallai Király utcai105Gallai Szigeti uti102Hegedűs Szigeti uti201Hoffman Király utcai101Kovács Kórház téri222Lakatos Uránvárosi215Sajó Rákóczi uti305Takács FiokNevSzamlaSzamUgyfelNevEgyenleg Szigeti uti201Hoffman Király utcai105Gallai Meszesi217Gallai Kórház téri222Lakatos Uránvárosi215Sajó Király utcai101Kovács Szigeti uti102Hegedűs Rákóczi uti305Takács Egyszerű egy mezős rendezés: ASC - növekvő DESC - csökkenő SELECT * FROM Betet ORDER BY Egyenleg DESC; FiokNevSzamlaSzamUgyfelNevEgyenleg Király utcai105Gallai Király utcai101Kovács Kórház téri222Lakatos Meszesi217Gallai Rákóczi uti305Takács Szigeti uti201Hoffman Szigeti uti102Hegedűs Uránvárosi215Sajó Több mező szerint egyszerre rendezi sorba az eredményt: Mindig az első rendező mező a legmagasabb rangú, ez képezi főrendezést, ennek egyező értékein belül rendez a 2. mező, majd utána következők szerint De algoritmikusan a legalacsonyabb rangú szerint rendez először, a legmagasabb szerint utoljára! SELECT * FROM Betet ORDER BY FiokNev ASC, Egyenleg DESC; FiokNevSzamlaSzamUgyfelNevEgyenleg Király utcai105Gallai Király utcai101Kovács Meszesi217Gallai Szigeti uti201Hoffman Szigeti uti102Hegedűs Uránvárosi215Sajó Szűrőfeltétellel kombinált rendezés: SELECT * FROM Betet WHERE SzamlaSzam<=220 ORDER BY FiokNev ASC, Egyenleg DESC; Főcsoportok Alrendezések csoporton belül

29 Egy táblás lekérdezések: rekordok csoportosítása/aggregációja - GROUP BY FiokNevSzlaSzamUgyfelNevEgyenleg Meszesi217Gallai Király utcai105Gallai Szigeti uti102Hegedűs Szigeti uti201Hoffman Király utcai101Kovács Kórház téri222Lakatos Uránvárosi215Sajó Rákóczi uti305Takács Csoportosítás kombinálása előzetes szűréssel: Pl.:„Fiók-szintű”, „fiókonkénti” adatok kellenek – a FiokNev csoportosító mező (Grouping Field) (melyet a Select és a Group By részbe is be kell rakni) azonos értékű rekordjait (a Null értékűeket is!) csoportosítja, és csoporton- ként 1db kiszámított eredményrekordot gyárt: Pl.:Számítsuk ki a fiókokban a számlák számát, és maximális egyenlegét – a SzamlaSzam, Egyenleg aggregációs mezők (Aggergation Field), melyek csak valami aggregá- ciós függvénnyel (Aggregation Function) kerülhet- nek be a Select-be, ami a sok mező-értékből 1-et csinál, a hiányzó értékűeket (Null) átugorva: Count() - nem Null mező-értékek darabszáma Sum() - nem Null mező-értékek összege Avg() - nem Null mező-értékek átlaga Stdev() - nem Null mező-értékek szórása First/Last() – első/utolsó nem Null mező-érték Pl.: Úgy, hogy a „Hoffman” nevű ügyfelket hagyjuk ki - a WHERE feltétel a csoportosítás előtt, az eredeti adatokat szűri. Amit kiszűr, az már nem kerül csoportosításra! SELECT FiokNev, Count(SzlaSzam) AS CountOfSzam, Max(Egyenleg) AS MaxOfEgyenleg FROM Betet WHERE UgyfelNev <>"Hoffman" GROUP BY FiokNev; FiokNevCountOfSzamMaxOfEgyenleg Király utcai Csoportosítás kombinálása előzetes és utólagos szűréssel: pl. Az előbbi példából csak olyan fiókok adatai kellenek, ahol a számlák száma >1 A HAVING feltétel a csoportosítás után, a kiszámított csoport adatokat szűri (pl. nincs az eredeti táblában számlák száma mező!): SELECT FiokNev, Count(SzlaSzam) AS CountOfSzam, Max(Egyenleg) AS MaxOfEgyenleg FROM Betet WHERE UgyfelNev<>"Hoffman" GROUP BY FiokNev HAVING Count(SzlaSzam)>1; Ha egy szűrést WHERE-rel az eredeti ada- tokon is meg tudunk oldani,ne alkalmazzunk utószűrést HAVING-el, mert az már kiszámí- tott csoportokat dob el, pazarolja a gépidőt!!! FiokNevCountOfSzamMaxOfEgyenleg Király utcai Kórház téri Meszesi Rákóczi uti Szigeti uti Uránvárosi

30 SQL lekérdezések szerkesztése 1 Az Accessben a Lekérdezések|Új lekérdezés tervezőben (Queries|New query in designer) menüvel indíthatjuk el a lekérdezés tervezőt. Ennek 3 nézete van, amelyek közt a ( ) gombbal vagy a tervező Nézet (View) menüjével válthatunk: –Grafikus tervező nézet (Designer View) –Eredménytábla nézet (Table View) – ez lefuttatja a lekérdezést –SQL kód nézet (SQL View) Szándékos Access-butítás: nem lehet egyszerre nézni a grafikus tervezőt és az SQL-t Pozitív, hogy a lekérdezés nem fut le minden szerkesztésre, mint MSQuery-ben,hanem a tervező Lekérdezés|Futtat (Query|Run) menüjével vagy ( ) gombbal lehet futtatni Szándékos Access-butítás: az SQL kódszerkesztőt úgy tervezték, hogy ne lehessen benne komolyabb SQL-kódokat írni: ugyan írhatunk a kódba tabulálást, és entereket ezeket azonban nem fogja elmenteni, és ömlesztve kapjuk vissza! Ez ellen úgy lehet védekezni, hogy word-ben tároljuk SQL-kódjainkat, és vágólapon bemásolgatjuk ide Szándékos Access-butítás: az SQL kódszerkesztőbe írhatunk ugyan egymás után több SQL utasítást, el is menti, de mindig csak az 1.-t hajtja végre! Ez ellen úgy lehet védekezni, hogy az Access Makrók (Macro) menüjében olyan makrót állítunk össze, ami több lekérdezést indít A tervező File|Mentés (File|Save) menüjével vagy a ( ) gombbal lehet az SQL-kódot elmenteni egy adott néven (de ez NEM menti az eredménytábla tartalmát!!!)

31 A lekérdezéstervező grafikus nézete teljesen szinkronizált az SQL nézettel: mindent amit, le tud fordítani SQL-kódból, felrakja ide, és az ittenni változásokat visszaírja oda (ömlesztve) Ez alól egy kivétel van, grafikus tervezőben nincs DISTINCT, míg SQL-ben van ( ) gombbal határozhatjuk meg, miféle legyen a lekérdezés. A fontosabbak: –Kiválasztó lekérdezés (Select Query): a memóriába kiszámítódó nézet táblát (View) gyárt, amely nem tárolódik fixen az adatbázisban, de pl. Excelből meghívható –Táblakészítő (Make Table): az eredménytábla fixen tárolódik, a megadott néven –Felülíró (Update): létező tábla mezőit írja felül kiszámított értékekkel –Törlő (Delete): létező tábla rekordjaiból törli a szűrőfeltételnek megfelelőket ( ) gombbal adjuk hozzá a táblalistából a lekérdezéshez szükséges táblá(kat), amelyek mezőlistája megjelenik. A táblákat úgy tudjuk összekötni, hogy a csatlakozó mezőiket egérrel áthúzzuk egymásba. A csatolást (Join) vonal jelzi, amire duplakattolva szerkeszt- hetjük a tulajdonságait (erről részletesen lásd a következő előadásrészt) ( ) gombbal tudjuk bekapcsolni a tervezőben az aggregációt intéző Totál sort a rácsban A szerkesztőrács Mező (Field) sorába a táblákból tudunk egérrel mezőket behúzni, vagy ( ) gombbal képletszerkesztővel képleteket írni.Ez megfelel az SQL-kód Select részének A rács Tábla(Table) sora autokitöl- tődik,SQL-kódban ez a From rész A Totál(Total)sor a Group by rész: –Group by:csoportosítómező, több esetén az 1. a főcsoport –Min,Sum,..:aggregációs mező –Where:a mezőre előszűrő fel tételt adunk majd meg A Kritérium(Criteria) sor jelentése: –Ha nincs csoportosítás, vagy abban előszűrőnek jelöltük, akkor Where feltétel, előszűr –Ha van csoportosítás, akkor utószűrő Having feltétel –Minden feltétel És-sel kapcso- lódik,kiv.ha a Vagy(Or)-ba írjuk A Rendezés(Sort) sor az Order by: –Több esetén az 1. a főrendező SQL lekérdezések szerkesztése 2 katt húz kat húz katt

32 4-5.Gyakorló Feladat: Egy táblás lekérdezések gyakorlása A 4-4 Gyakorló Példában bemutatott 4-4Pelda.mdb adatbázisban hajtsa végre az alábbi lekérdezéseket: 4-4Pelda.mdb A,Hány olyan termék van, amely nincsen szuperkategóriákba sorolva? B,Hány olyan alkategória van, aminek nincsen kategória kódja? C,Az egyes szuperkategóriákba hány darab termék esik? A szuperkategóriák az eredményben legyenek növekvő sorba rendezve. A 0 kódú „Other” szuperkategória, és azok a termékek amelyeknek nincsen szuperkategória kódja ne szerepeljenek az eredményben. A megoldás: 4-5GyakorloMegoldas.ppt4-5GyakorloMegoldas.ppt

33 Több táblát összecsatoló lekérdezések fajtái 1 Az összes csatolásban a bal oldali (Left Side) a From részben 1.-ként szereplő tábla, a jobb oldali (Right Side) a 2.-ként említett tábla Descartes csatolás (Descartes Join): A bal és jobb oldali táblák közt itt nincs csatoló mező és reláció: Pl. Az ügyfelek és fiókok koordinátái közti páronkénti távolságok kiszámítása Minden jobb oldali rekordot összecsatol minden bal oldalival és mindkét oldalról minden rekordot bevon az eredménybe Egyik eredménymező sem lesz egyedi kulcs A Descartes Join az SQL alapbeállítása, ha két tábla közt nincs kapcsolat, vagy elfelejtjük definiálni, automatikusan mindent mindennel kombinál, amíg ezt nem korlátozom pl. WHERE feltételben!!! Ez erősen különbözik a procedurális programnyelvektől, ahol általában egy tömb első eleme a másik tömb első eleméhez tartozott, a második a másodikhoz, stb. Ezt felejtsük el, itt nem így van! A lehetséges rekordszám (R) az eredményben, ha a baloldali tábla rekordszáma B, a jobboldalié J: R = J×B Jobb oldal: Fiókok Fiok Nev XY Kertvárosi Király utcai Kórház téri Mecseki Meszesi Rákóczi uti Szigeti uti Uránvárosi Bal oldal: Ugyfelek Ugyfel Nev XY Aba Balogh Cinege Gallai Garai Hegedűs Hoffman Jánosi Kovács Lakatos Sajó Takács SELECT Ugyfelek.UgyfelNev, Fiokok.FiokNev, ( (Fiokok.X- Ugyfelek.X)^2 + (Fiokok.Y- Ugyfelek.Y)^2 )^0.5 AS Tav FROM Ugyfelek,Fiokok; UgyfelNevFiokNevTav JánosiKirály utcai0.022 JánosiKórház téri0.040 JánosiSzigeti uti0.067 JánosiUránvárosi0.050 JánosiRákóczi uti0.014 JánosiMecseki0.020 JánosiKertvárosi0.036 JánosiMeszesi0.022 SajóKirály utcai0.050 SajóKórház téri0.020 SajóSzigeti uti0.054 SajóUránvárosi0.022 SajóRákóczi uti0.058 SajóMecseki0.040 SajóKertvárosi0.061 SajóMeszesi0.022 HegedűsKirály utcai0.057 HegedűsKórház téri0.022

34 Több táblát összecsatoló lekérdezések fajtái 2 Belső csatolás (Inner Join): A bal és jobb táblák közt csatoló mezővel létrehozható 1:1, 1:több vagy több:több kapcsolat Minden jobb oldali rekordot összehasonlít minden bal oldalival A csatoló mező szerint egyező értékű rekordokat egybecsatolja Mindkét oldalról csak az egyező rekordokat vonja be az eredménybe Az egy oldali táblából származó sorok megtöbbszöröződhetnek az eredményben, mert a másik oldal több rekodjával is egyeznek Ha egy:több kapcsolat van a táblák közt, akkor a több oldal elsődleges kulcsa az eredményben is egyedi kulcs lesz A lehetséges rekordszám (R) az eredményben, ha a baloldali tábla rekordszáma B, a jobboldalié J: Min(J,B)  R  J+B SELECT Ugyfelek.UgyfelNev, Hitelek.HitelSzam FROM ( Ugyfelek INNER JOIN Hitelek ON Ugyfelek.UgyfelNev = Hitelek.UgyfelNev ); Bal: Ugyfelek Ugyfel Nev Lakhely AbaPécs BaloghMálom CinegeOlasz GallaiSiklós GaraiMohács HegedűsHarkány HoffmanPécsvárad JánosiHarkány KovácsKomló LakatosPécs SajóOlasz TakácsSiklós Jobb:Hitelek Hitel Szam Ugyfel Nev 10Balogh 11Takács 14Jakabfi 15Hegedűs 16Aba 17Jánosi 18Kovács 23Sajó 25Garai 29Hoffman 93Cinege tartozik 1:több Ugyfel Nev Hitel Szam Aba16 Balogh10 Cinege93 Garai25 Hegedűs15 Hoffman29 Jánosi17 Kovács18 Sajó23 Takács11 kat

35 Több táblát összecsatoló lekérdezések fajtái 3 Bal külső csatolás (Left Outer Join): A bal és jobb táblák közt csatoló mezővel létrehozható 1:1, 1:több vagy több:több kapcsolat Minden jobb oldali rekordot összehasonlít minden bal oldalival A csatoló mező szerint egyező értékű rekordokat egybecsatolja Bal oldalról minden rekordot, jobb oldalról az egyezőket bevonja az eredménybe A jobb oldalról származó eredménymezőkben lehet Null Az egy oldali táblából származó sorok megtöbbszöröződhetnek az eredményben, mert a másik oldal több rekodjával is egyeznek Ha egy:több kapcsolat van a táblák közt és a bal oldali tábla a több oldal (itt nem így van), akkor elsődleges kulcsa az eredményben is egyedi kulcs lesz, ez esetben: R = B Különben a lehetséges rekordszám az eredményben: B  R  J+B SELECT Ugyfelek.UgyfelNev, Hitelek.HitelSzam FROM ( Ugyfelek LEFT JOIN Hitelek ON Ugyfelek.UgyfelNev = Hitelek.UgyfelNev ); Bal: Ugyfelek Ugyfel Nev Lakhely AbaPécs BaloghMálom CinegeOlasz GallaiSiklós GaraiMohács HegedűsHarkány HoffmanPécsvárad JánosiHarkány KovácsKomló LakatosPécs SajóOlasz TakácsSiklós Jobb:Hitelek Hitel Szam Ugyfel Nev 10Balogh 11Takács 14Jakabfi 15Hegedűs 16Aba 17Jánosi 18Kovács 23Sajó 25Garai 29Hoffman 93Cinege tartozik 1:több Ugyfel Nev Hitel Szam Aba16 Balogh10 Cinege93 Gallai Garai25 Hegedűs15 Hoffman29 Jánosi17 Kovács18 Lakatos Sajó23 Takács11 kat

36 Több táblát összecsatoló lekérdezések fajtái 4 Teljes külső csatolás (Full Outer Join): Minden jobb oldali rekordot összehasonlít minden bal oldalival A csatoló mező szerint egyező értékű rekordokat egybecsatolja Mindkét oldalról minden rekordot bevon az eredménybe Mindkét oldalról származó eredménymezőkben lehet Null Az egy oldali táblából származó sorok megtöbbszöröződhetnek az eredményben, mert a másik oldal több rekodjával is egyeznek Így nem maradnak egyedi kulcsok Rekordszám: Max(J,B)  R  J+B Szándékos Access-lebutítás: Accessben nincs ilyen,a résztvevő tábláknak - egy minden lehetséges csatolómező-értéket tartalmazó - bal oldali csatolótáblára (Join Table) történő sorozatos left joinolásával lehet helyettesíteni Az olyan full outer joint, ami mindkét oldali tábla összes –közös mezője szerint csatol, –összes különböző mezőjét tartalmazza az eredményben természetes csatolásnak (Natural Join) nevezzük. Ez tulajdonképpen két tábla rekordjai közti unió (Union) kombinálva a mezőik közti unióval (Union) Accessben nincs ilyen, a fentebb leírt kerülő megoldást alkalmazzuk SELECT Ugyfelek.UgyfelNev, Hitelek.HitelSzam FROM ( Ugyfelek FULL OUTER JOIN Hitelek ON Ugyfelek.UgyfelNev = Hitelek.UgyfelNev ); Ugyfel Nev Hitel Szam Aba16 Balogh10 Cinege93 Gallai Garai25 Hegedűs15 Hoffman29 14 Jánosi17 Kovács18 Lakatos Sajó23 Takács11 Bal: Ugyfelek Ugyfel Nev Lakhely AbaPécs BaloghMálom CinegeOlasz GallaiSiklós GaraiMohács HegedűsHarkány HoffmanPécsvárad JánosiHarkány KovácsKomló LakatosPécs SajóOlasz TakácsSiklós Jobb:Hitelek Hitel Szam Ugyfel Nev 10Balogh 11Takács 14Jakabfi 15Hegedűs 16Aba 17Jánosi 18Kovács 23Sajó 25Garai 29Hoffman 93Cinege Ugyfel Nev Lakhely Hitel Szam AbaPécs16 BaloghMálom10 CinegeOlasz93 GallaiSiklós GaraiMohács25 HegedűsHarkány15 HoffmanPécsvárad29 14 JánosiHarkány17 KovácsKomló18 LakatosPécs SajóOlasz23 TakácsSiklós11 SELECT * FROM Ugyfelek NATURAL JOIN Hitelek; tartozik 1:több A Full/Natural Joinra fő- leg akkor lenne szük- ség, ha pl. hetente 1 táblánk készül adott dologról, amelyek tar- talma csak részlegesen fedi át egymást (pl. vá- sárlók heti vásárlásai), és köztük kell időbeli számításokat végezni!

37 Egy belső orvoshoz több eset tartozik és egy eset is több belső orvoshoz tartozik Egy beteghez több eset tartozik, de egy eset csak egy beteghez tartozik Ilyen esetben vagy csak Inner vagy csak Left/ Right joinokat használhatunk, nem keverhe- tők. Az SQL kódja elég bonyolult lesz, de… Pl. Lekérdezés: Kik a főorvos úr betegei? A belépési pont (Entry Point) az ismert információ (pl. főorvos), a WHERE (szűrőfeltétel) részben foglal helyet. A kilépési pont (Exit Point) az eredmény, ami kell (pl. beteg neve), a SELECT (kiválasztott eredmény) részben foglal helyet. nem kell bepötyögniA lekérdezési útvonal (Query Path) a két pont közt halad minimális számú reláción keresz- tül, és a FROM részben definálódik: ezt nem kell bepötyögni,csak az utat egérrel kihúzni!! SELECT Beteg.SzemIgSzam, Beteg.Név FROM ( ( ( Beteg INNER JOIN Eset ON Eset.SzemIgSzam= Beteg.SzemIgSzam) INNER JOIN OvosEset ON OrvosEset.EsetKod= Eset.EsetKod) INNER JOIN BelsoOrvos ON BelsoOrvos.OrvosKod = OrvosEset.OrvosKod) WHERE BelsoOrvos.Beosztas=„Főorvos”; OrvosEset OrvosKódEsetKód Kettőnél több tábla összecsatolásának működése Eset SzemIgSzámEsetKód GZ-II GF-I GZ-II BelsőOrvos # OrvosKód * Név * Beosztás * Tel * SzakTerül * Fizetés Beteg # SzemIgSzám * Név * LeányNév * Kor * CsaládÁll * Foglalkozás * Lakcím * HozzátartNév * Apanév * ApaFoglalk OrvosEset * OrvosKód * EsetKód Eset # EsetKód * SzemIgSzám húz

38 Az előadás tartalma Külső adatforrások használata Excelben 1 Külső fájlok használata –Az Office Visual Basic fájlkezelése –Bináris fájlok kezelése –Szöveges log-fájlok nagysebességű beolvasása: Tops Friendly Markets Inc. T-log fájlok esettanulmány DelimitFile97 modul és felhasználói felülete Külső adatok beszerzése weblapokról –Megvalósítás VB makróból Külső adatok beszerzése adatbázisokból –Megvalósítás VB makróból –Az MSQuery lekérdezés-tervezője Az SQL lekérdező nyelv –Alapfogalmai –Egy táblás lekérdezések Egyszerű kiválasztó lekérdezések Szűrők használata Rendezések használata Csoportosítás és aggregáció használata –MS Access lekérdezés tervező SQL kódszerkesztő Grafikus lekérdezés-tervező –Több táblás lekérdezések Descartes Join Inner Join Left Join Full/Natural Join Kettőnél több tábla közti Joinok működése Szakirodalom

39 4-6.Gyakorló Feladat: Több táblás lekérdezések gyakorlása A 4-6Pelda.mdb egy edénygyár adatbázisa, ahol az alábbi táblákkal:4-6Pelda.mdb Vevok: az edénygyár vevőinek törzstáblája Dolgozok, Dolgozok_1: az edénygyár dolgozói, köztük nem fix szintszámú szervezeti hierarchia van, amelyet a Dolgozok tábla önmagára mutató 1:több kapcsolata jelenít meg: minden dolgozónál eltároljuk a főnökére mutató idegen kulcsot (Dolgozok.FonokKod). AZ Access nem tudja a tábla önmagára mutató kapcsolatát ábrázolni a kapcsolati diagrammján, ezért ugyanazt a táblát még egyszer be kell hozni táblaálnéven (Alias), és vele összekötni a táblát. Fiokok: az edénygyár több városban tart fenn fió- kot, amelyeknek adott dolgozó a vezetője Termekek: az árúsított termékek törzstáblája, termék-egységárakkal Gyartasok: minden terméket több városban gyárt- hatnak, minden városban más az önköltségük Eladasok: tranzakciós tábla, amely tartalmazza, mikor, mely fiók milyen dolgozója, mely vevőnek, melyik terméket milyen mennyiségben adta el Feladat: készítse el a tanult belépsi/kilépési pont, lekér- dezési út elemzéssel az alábbi lekérdezéseket: A,Hányfajta terméket adtak el Pécsre? B,Milyen nevű termékeket adtak el Pécsre? Az azo- nos neveket ne ismételgesse! C,Összesen milyen értékben adtak el Pécsre?(Érték = Egységár × Mennyiség) D,Hány vásárló vásárolt összesen olyan fióknál, ahol pécsi terméket is eladtak? E,Adja meg minden dolgozó nevéhez a főnök nevét! A megoldás: 4-6GyakorloMegoldas.ppt4-6GyakorloMegoldas.ppt

40 MSDN Visual Basic for Applications Help: hu/library/aa269683(en-us,office.10).aspxhttp://msdn.microsoft.com/hu- hu/library/aa269683(en-us,office.10).aspx Microsoft Access SQL kézikönyv: us/access/CH aspxhttp://office.microsoft.com/en- us/access/CH aspx Microsoft Transact SQL kézikönyv: us/library/ms aspxhttp://msdn.microsoft.com/en- us/library/ms aspx Oracle SQL kézikönyv: MySQL kézikönyv: Access lekérdezés tervező használata: hu/access/HP aspxhttp://office.microsoft.com/hu- hu/access/HP aspx Kovács László (2004) Adatbázisok tervezésének és kezelésének módszertana, Computerbooks, Budapest Raffai Mária (2003) Információrendszerek fejlesztése és menedzselése, Novadat Kiadó, Budapest Joe Celiko (2002) SQL Felsőfokon, Kiskapu Kiadó, Budapest Bódy Bence (2003) Az SQL példákon keresztül, Jedlik Oktatási Stúdió, Budapest Peter Gulutzan (2002) SQL Teljesítményfokozás, Kiskapu Kiadó, Budapest Szakirodalom


Letölteni ppt "Excel konzultáció 4. Előadás Dr. Pauler Gábor, egyetemi docens, ev. Adószám: 63673852-3-22 Számlaszám: 50400113-11065546 Telephely: 7666 Pogány, Széchenyi."

Hasonló előadás


Google Hirdetések