58
A VisualFoxpro adatbázisfejlesztő rendszer
  • rushman
    #1
    Na most már nyitok ennek a témának egy topikot, mivel az EGÉSZ nagy Magyarországon nem találok hozzá sem magyar nyelvű könyvet, sem doksit, sem semmilyen leírást. (Egyetlen helyen találtam egy 3.0-ás verzióhoz könyvet, holott már a 8.0 a naprakész)

    Teljes elkeseredésemben remélem, hogy rajtam kívül is meg akarja ismerni ezt a rendszert.
  • Taranov
    #2
    Ha ez a teljes hivatalos neve, hogy Visual FoxPro, akkor nincs nekem sem, pedig elég sok "E-Bookom" van.
  • rushman
    #3
    Microsoft Visual FoxPro vagy csak simán foxpro, bár elvileg a 3.0 óta a Visual családba tartozik...
  • BlackHawks
    #4
    Sziasztok!

    Itt van a kezemben 1 könyv:

    Nádai - Rezessy : Visual Foxpro 6.0 2680Ft

    ha elakadok, akkor itt találok útmutatást
    Tényleg elég mostoha a magyar könyvanyag, szégyen, pedig szerintem egész jó kis adatbáziskezelő progik készíthetőek vele

    Bye!
  • PetruZ
    #5
    Kérdezz, és ha tudok, felelek. Öt éve nyomom a FoxPro-t, a DOS-os 2.6-tól kezdve a legújabb 8.01-ig. :)

    Magyar doksit én sem tudok a lentebb említett könyvön kívül, de angol nyelven az MSDN-en kívül is elég sok létezik belőle.
  • rushman
    #6
    na az a könyv kifutott, viszont találtam egy foxpro 5.0*6.0 könyvet Gacsó Zoltán nevével fémjelezve. Ezt most tanulmányozom.

    PetruZ: Kössz a felajánlást, azthiszem élni fogok vele...
  • PetruZ
    #7
    De csak ha itt kérdezel. A levelezést hanyagoljuk, ismeretlen címről le sem töltöm a levelet, rögtön törlöm, a rengeteg spam miatt. :)
  • rushman
    #9
    egyértelmű, nem mailozok

    bu-bu: először csak win9x alatt, az SQLServert egyelőre hanyagolom, de azé' kössz
  • rushman
    #11
    kézzel, ahhoz szoktam eddig

    egyenlőre a függvényekkel barátkozom...
    egyébként ez inkább a dbase-hez hasonlít, vagy inkább egyedileg beépített?

    .......
    érdekes, a visual studio tagja révén furcsa, hogy a nyelv sem a c++-hez, sem a visualbasic-hez nem hasonlít, nem?
  • rushman
    #13
    azt nem értem,(legalábbis amit olvastam róla), miért implicit módon szereplenek a változók?
  • PetruZ
    #14
    Mire gondolsz pontosan?

    Egyébként a VFP már nem tagja a VS családnak (a 6.0 volt az utolsó, ami a VS-ben jelent meg).
  • rushman
    #15
    arra, hogy a változókat nem kell deklarálni?

    olvastam egy szar könyvet a foxpro-ról, és abban a szaki úgy írta az eljárásokat, hogy a kódrészben megnevezett egy változót, majd annak értéket adott, oszt kész. Később ebből a változóból hívott értéket.

    Sajnos nem tudok példálózni, mert nincs nálam a könyv.
  • rushman
    #16
    egyébként igazad van, csak a 6-osig volt a visual része, bár én is 6.0 -al "botladozom" éppen.

    sajna nics többszázezrem a 8.0-ásra
  • PetruZ
    #17
    Hát... elvileg nem kell. De lehet, illetve public változóknál kell is. Egyébként ez a változósdi elég kavarós a FVP-ben, mivel a form objektumok nem látják a külső eljárásokon kívüli változókat (csak a public-ként deklaráltakat), de ha pl. egy form metódusból hívsz egy külső függvényt, akkor a megegyező változónevek bizony azonos adatterületre fognak hivatkozni (hacsak nincsenek külön local-ként deklarálva).

    Pl.:
    (ez külön prg blokkban, más fájlban)
    procedure kulso_eljaras(y)
    x=y*10
    return

    A metódusban meg ez van:
    ...
    x=3
    kulso_eljaras(x)
    ...

    Az eredmény? A várakozásoknak "megfelelően" az "x" értéke 30-ra fog változni... Elég könnyű beleesni ebbe a csapdába, célszerű inkább a külső eljárásokon, függvényeken belül a "local" használata.
    Sajnos a VFP ezen nagyvonalú lazasága elég bosszantó tud lenni néha, pláne ha azt nézzük, hogy ehhez képest az automatikus konverziók sokszor pont úgy működnek, ahogy nekünk éppen nem kell. Különösen a form mezőknél szokott előjönni ez, ha feldolgozod az értéküket és csak futásidőben (azok a kib* "type mismatch" üzenetek :] ).

    Én elsősorban azért használom a VFP-t, mert a fejlesztéseimben többnyire nagy adathalmazokból, több adatbázisból (Oracle) SQL-lel lehúzott kurzorokkal kell dolgozni, és nagyon jól és gyorsan lehet mókolni, átalakítgatni és összekapcsolni őket. A form kezelői részét és a vezérlőelemeit viszont nagyon gyatrának érzem, az "igazzy" OOP-től majdhogynem idegennek. Arra viszont nincs idő, hogy kézzel programozzam le az egészet. :)
  • rushman
    #18
    Hát ez az! Pont ez a probléma bosszant engem is! Ráadásul még ki sem lehet kapcsolni, illetve kötelezővé tenni a deklarálást.
    Nem értem, ha azt akarom, hogy az 'x' eljárásban szereplő 'z' változóm értékét 'y' eljárásból le tudjam kérni, ahhoz az 'x' eljárást public-ként kell jelölni?
    Nem lett volna egyszerűbb, ha a 'z' változómat public-ként deklarálom?

    Egyébként BUÉK!
  • PetruZ
    #19
    Valamit keversz: ami leírsz, azt elvileg nem is szabad megengedni és szerencsére nem is működik. Akkor lenne még csak nagy balhé, ha az egy modulban szereplő eljárások látnák egymás változóit. Eljárás public-ként való deklarálásának nincs is értelme, viszont a(z osztály) metódus és az eljárás/függvény a VFP-ben (is) eltér, nem ugyanaz a működési mechanizmus!
  • rushman
    #20
    Amint látod, még csak kóstolgatom ezt a dbase elvet...

    Arra akartam kijukadni, hogy egy modulon belüli eljárások EGY változót használjanak egy bizonyos adat kezeléséhez. Pl az egyik eljárás feltölti, míg a másik lekérdezi stb. Vagy egy boolean változó értékét több eljárás is figyelhesse ecc.
  • PetruZ
    #21
    Ha ilyet akarsz, azokat a változókat az eljárásokon kívül, a modul fejlécében public-ként kell deklarálni.
  • rushman
    #22
    Lenne agy kapcsolatos kérdésem, egy labdarúgás hasonlattal élnék, hátha így könnyebben értelmezhető:

    Egy fordulóban több mérkőzés is lehet, de minden csapat csak egyszer játszhat(mérkőzéseredmények tábla). Egy fordulóban egy csapat több játékosának rögzíthető a teljesítménye (gól, gólpassz stb.), de mindegyiknek csak egyszer(játékosstatisztika tábla).

    A mérkőzéseredmények és a játékosstatisztikák egy-egy külön táblában vannak tárolva. Ennek a rendszernek a kapcsolatait kellene úgy megoldanom, hogy az említett "törvények" teljesüljenek, és az adatok könnyen lekérdezhetők legyenek.
    Várom a megoldásokat!
  • PetruZ
    #23
    Hát, én mondjuk elsőre azt csinálnám, hogy az eredménytáblába elhelyeznék egy egyedi kulcsot (mondjuk egy folytonosan növekvő szám is jó; unique key index, ha így ismerősebb). A statisztika táblának ez idegen kulcsa (foreign key) lenne, az eredmény - statisztika között 1:N kapcsolattal. A statisztika táblán ez a mérkőzésazonosító plusz a játékos azonosító szintén külön egyedi kulcsot alkotna.
    Így az egyediséget minden esetben le lehet fedni, az adatok összekapcsolása pedig a mérközésazonosító alapján egyértelmű (egy mérkőzéshez több stat sor tartozhat, de mindegyiknek csak egy játékos sora lehet a második unique key miatt). A korlátokról maga az adatbázis gondoskodik a két unique megszorítás miatt.

    Pl. (csak nagyon vázlatosan, a konkrét táblastruktúra ismeretében tovább finomítható, csiszolható):
    -egy játékos adatai egy adott mérkőzésen: select a.*, b.* from merkozes a, stat b where a.merkozes_id = b.merkozes_id and b.jatekos_id = XXX and a.merkozes_id = YYY;
    -egy játékos mely mérkőzéseken játszott: select a.* from merkozes a, stat b where a.merkozes_id = b.merkozes_id and b.jatekos_id = XXX;
    És így tovább. A lényeg a két tábla összekapcsolása a merkozes_id alapján, a többi már gyerekjáték.
  • PetruZ
    #24
    Még valami: ha szükséges, hogy az egyes fordulókban egy csapat csak egyszer szerepelhessen, akkor a legegyszerűbb megoldás, ha a mérkőzés táblában az egyedi mérkőzésazonosító megmarad, de ezen felül a forduló sorszámából, a mérkőzésazonosítóból és a két csapat azonosítójából egy újabb egyedi kulcsot kell képezni (a forduló dátuma nem jó, mert egy forduló több napon át is tarthat és halasztás is lehet). Ezek összekapcsolása a statisztika táblával *nem* szükséges (nincs is mivel), csak az egyediséget garantálja. Az egyes adatokat a csapatok adattábláival lehet összekapcsolgatni.
  • rushman
    #25
    Kitűnő!

    ...játékos azonosító szintén külön egyedi kulcsot alkotna.

    1-N kapcsolattal a [játékosnevek] tábla azonosító kulcsához?
  • PetruZ
    #26
    Nem pontosan, bár arra is használható (csak fordítva): ahogy írtam, a mérkőzés azonosító plusz a játékosazonosító alkotna még egy új egyedi kulcsot a statisztika táblán (ez garantálja, hogy egy játékos egy mérkőzésen csak egy statisztikai sorral rendelkezzen). A játékosnevek táblán a játékos azonosító természetesen önmagában egyedi kulcs és az kapcsolódik 1:N-el a statisztika táblához.
  • Laza
    #27
    Hali all...

    Ha vkinek van VFP5-os futtato kornyezet (kb 3 dll), plz linkelje mar be, vagy irjon, ha at tudna kuldeni...
    koszi...
  • Laza
    #28
    Koszi, mar talaltam...
  • nippy
    #29
    Valaki próbált már egy létező EXCEL file-ba adatokat irni ?

    Ha igen érdekelne

    Új excel file-t gond nélkül lehet készíteni.

    Esetleg valakinek ötlete ?
  • PetruZ
    #30
    Ja, pár éve kellett, akkor OLE-n keresztül csináltam - de baromi lassú.
    Pl.:

    ...
    if type( 'GETOBJECT(, "Excel.Application")' ) = "O"
    OLEExcel=GETOBJECT(, "Excel.Application")
    else
    OLEExcel=CreateObject("Excel.Application")
    endif
    with OLEExcel
    .Visible=.t.
    .workbooks.open(fájlnév, 0, .f.)
    .sheets(1).select
    ...
    Innentől kezdve elméletileg a teljes VBA scripting funkcionalitás a rendelkezésedre áll, csak ne feledkezz meg az előpontokról, hogy az OLEExcel objektumon keresztül dolgozzon. A FoxPro-t nem érdekli, hogy a számára többnyire értelmetlen dolgok lehetnek itt, ő szépen továbbpasszolja majd az Excelnek.
    ...
    release OLEExcel
    ...

    Megismétlem: ez egy nagyon lassú módszer...
  • nippy
    #31
    Már a GETOBJECT -re hibát jelez ,hogy "OLE hiba :a művelet nem hajtható végre"

    Kicsit tanácstalan vagyok..




  • PetruZ
    #32
    Excel van telepítve a gépre, ahol próbálod? Nálam pár éve 7-es és 8-as FoxPro-val működött Excel 95-től 2000-ig. Már nem Fox-ozok, a részlet egy régi alkalmazásom forrásából van, amit széles körben használt a volt cégem, gond nélkül.
    A gépemen van egy Fox8-as, most kipróbáltam rajta, de nekem működik. Igaz, nincs Office a gépemen, de nem a GetObject(()-tel van baja, hanem az else ággal, ugyanis nem tud Excel objektumot kreálni (ahogy az logikus is).
    Ennyi volt az egész program:

    if type( 'GETOBJECT(, "Excel.Application")' ) = "O"
    OLEExcel=GETOBJECT(, "Excel.Application")
    else
    OLEExcel=CreateObject("Excel.Application")
    endif
    with OLEExcel
    .Visible=.t.
    endwith
    release OLEExcel

    Compile lement, futtatás is megy. Sztem valamit kihagytál / elgépeltél (idézőjelek, vesszők nem mindegy, hol vannak).
  • nippy
    #33
    Lehet hogy az excel 2003 -mal van a hiba ?

    7-es FoxPro-val próbáltam

    Meg fogom nézni egy másik gépen ahol 97-es office van.

  • PetruZ
    #34
    Nem hinném, az MSDN library szerint is ezt, ilyen formában érdemes használni, nincs megkülönböztetés. Bár előfordulhat, hogy a hivatkozás hibás / hiányos. :)
  • nippy
    #35
    Van arra külön parancs, ha feldolgozottságot szeretnék megjelentettni, ugyan úgy mint amikor megy egy install és %-osan húzza a csikot ?


  • PetruZ
    #36
    Nincs, neked kell megírni, vagy használhatsz vmi külső (jellemzően OCX v. ActiveX) komponenst. Ez már kicsit túlmutat az alap FoxPro programozáson.
  • nippy
    #37
    Használtál már activeX-et ? Mert én még nem, ha egy kis iránymutatót adnál, nagyon megköszönném.
  • PetruZ
    #38
    Pl. nyiss egy új Form-ot, a toolbar-ról dobj rá egy ActiveX Control (OLEControl) objektumot. A megnyíló listában keresd meg pl. a Microsoft ProgressBar Control 6.0-át, majd méretezd kedved szerint. Bizonyos paramétereit beállíthatod kézzel, ha jobbklikket nyomsz rá, majd a menüben a ProgCtrl Properties pontot választod. Ugyanezek a property-k (és a többi is, ami nincs itt), programozás oldaláról is elérhető (pl. az olecontrol1.value kell neked a pozíció beállításához). A pontos leírásokat az MSDN Library-ből tudod előásni.
  • nippy
    #39
    Köszi !
  • nippy
    #40
    Most már csak az érdekelne, hogy hogyan foglalod keretbe a folyamatot ?
    pl.
    olecontrol1.value=0,0001 & az induló érték

    de hogy fog automatikusan dolgozni ?



  • PetruZ
    #41
    Mit jelent az, hogy automatikusan? Mit kell dolgoznia? Sejtem, mire gondolsz, de vajon tudod-e, hogy mire gondolsz, és mit akarsz megvalósítani? :) Biztosan automatikusan kellene mennie?
    Az ilyesféle event kezelés kicsit tág témakör, úgy nagyjából a modern programozás háromnegyedét valamilyen szinten érinti...
  • nippy
    #42
    Én azért egyszerübb dologra gondoltam :)

    Pl.
    van egy nagy adatbázis (néha 100000 record feletti)
    ezt indexelni, ebből leválogatni sql-es parancsokkal is időígényes
    ezt szeretném látni, hogy épp hol tart.

    (az automatikus csak a csík megjelenítése lenne)


  • PetruZ
    #43
    A százezer rekord az nudli, a nagy adatbázis úgy tízmilliós nagyságrendnél kezdődik. :)

    De egyébként ezt nem tudod megcsinálni FoxPro-ban (automatikusra), csak akkor, ha te programozod a keresést. Nem tudom, milyen típusú adatbázisról van szó, de a legtöbb nem fogja neked a belső működését megmutatni (nem fogja megmondani, hol tart az indexelésben, vagy a sorok leválogatásában, mert ez nem ilyen egzakt dolog; az adatbázisok belső működése majdhogynem külön tudomány :) ), csak azt tudod számolni, hogy a lekérdezés végén hány sor jött, és a sorok át-fetch-elése hol tart. Ha ezt meg akarod jeleníteni, az programozott dolog, nincs rá automatika. Ez esetben neked kell pl. a progressbar-t vezérelni.