baze.podataka.1peca.st,
Pozdrav!
Postoji li ovde neko ko se aktivnije bavi Microsoft Access-om? ;) Imao bih neka
pitanja, a ne mogu više da "mučim" fancy-ja! :)))))
Hvala unapred.
baze.podataka.2ppekovic,
>> Postoji li ovde neko ko se aktivnije bavi Microsoft Access-om? ;) Imao bih
>> neka pitanja, a ne mogu više da "mučim" fancy-ja! :)))))
Pitaj, naci ce se vec neko da odgovori.
Paya
baze.podataka.3petrovics,
*** Odgovor na poruku 11.1123 ***
>> Naravno da moze. Pogledaj primere LNK fajlova koji se dobijaju uz
>> Blinker, a za pocetak ce i ovo raditi isto sto i RTLink:
>>
>> Blinker FI <lista OBJ> LIB <lista LIB> BLI INC OFF
Zahvaljujem se na brzim odgovorima i tebi i MBOLE-tu.
Ipak problem i dalje postoji. Kod vecih aplikacija se javi
problem da nece da rade jer im fali memorija dok sa RTLINK-om
tih problema nema. Nije li problem stara verzija, jer ja
koristim verziju 2.0 ?
Inace i ranije sam probao ovo sto mi i vi kazete: samo sam
umesto RTLINK-a pozvao BLINKER u .RMK datoteci.
baze.podataka.4peca.st,
Pitanje vezano za Microsoft Access: hteo bih da
mi Access prilikom unosa novog rekorda u tabelu sam
dodeli neku šifru (koju korisnik ne bi trebalo ni da zna,
jer mu nije bitna), recimo u polje "Proizvod ID". Kako to
da napravim? Bilo bi optimalno kada bi samo uvećao
prethodni ID za jedan, ili ga odredio prema fizičkom
broju rekorda? Koja je varijanta bolja?
Hvala!
baze.podataka.5dr.grba,
>> da napravim? Bilo bi optimalno kada bi samo uvećao
>> prethodni ID za jedan, ili ga odredio prema fizičkom
>> broju rekorda? Koja je varijanta bolja?
Inkrementiraj, pa dodeli još jednu, kontrolnu cifru, izračunatu po nekom
modulu. Tako sprečavaš smeće u sistemu.
baze.podataka.6petrovics,
*** Odgovor na poruku 11.1125 iz PC.PROG.3 ***
>> > Za sada ga koristim samo za manje programe :(
>>
>> Ja imam programe od preko 1MB EXE uradene na ovaj nacin.
Puno hvala na objasnjenju :).
Posto kod mene to i dalje pravi probleme mora da mi je lose
instaliran Blinker.
Bar znam gde je greska ...
baze.podataka.7nbatocanin,
>>> Blinker FI <lista OBJ> LIB <lista LIB> BLI INC OFF
> Ipak problem i dalje postoji. Kod vecih aplikacija se javi
> problem da nece da rade jer im fali memorija dok sa
> RTLINK-om tih problema nema.
Ako ovako linkuješ, svi moduli i biblioteke idu u root, pa program
zahteva enormno mnogo memorije. Koristi skript i stavi sve što možeš
u overleje.
baze.podataka.8dpredovic,
> Posto kod mene to i dalje pravi probleme mora da mi je lose
> instaliran Blinker.
Praktično neizvodljivo. Ako ikako radi, znači da je dobro insta-
liran. Dede pošalji neki svoj .lnk fajl, pa da vidimo u čemu je
frka.
Cu, Dejan
baze.podataka.9astojkovic,
Prodajem Knjigu Baralića i Ćirića "dBASE III Plus", jeftino.
Koliko jeftino? Nemam pojma. Koliko? ma wr astojkovic
baze.podataka.10mbole,
> Ipak problem i dalje postoji. Kod vecih aplikacija se javi
> problem da nece da rade jer im fali memorija dok sa RTLINK-om
> tih problema nema. Nije li problem stara verzija, jer ja
> koristim verziju 2.0 ?
Da li si ubacio blinker incremental off?
Probaj da u lnk datoteku dodaš sadržaj cl501min.lnk, ili je ubaci kao
inline pomoću @. Imaš tri ovakve lnk datoteke koje stižu uz blink, lepo su
iskomentarisane, pa pogledaj malo po njima.
baze.podataka.11vigor,
HELP
Nedavno sam nabavio Clarion 3.0 ali mi prilikom kompajliranja redovno puca
program tj prijavljuje neku gresku u memoriji, naravno instalirao sam ga i sa i
bez 8Mb. memorije tj sa 4 i sa 8, prckao sam po setup-u itd.
Ako neko nesto zna neka odgovori !!
baze.podataka.12lisse,
Radi se o programu FOX PRO 2.0.Kada mu se da parce koda u stilu:
SELECT 8;
FROM HHIMENIK;
WHERE IME = MEMVAR;
INTO CURSOR IMEN
REPORT FORM IMEN.FRX PREVIEW
to u interaktivnom modu kada se pokrene sa DO radi dobro ali kada se kompajluje
ustand-alone EXE program vrati poruku :
Invalid report file.
Da li je neko bio u slicnoj situaciji i u cemu je problem?Urgent help isMK
markable welcomMMe!!
baze.podataka.13parmak,
> to u interaktivnom modu kada se pokrene sa DO radi dobro ali
> kada se kompajluje ustand-alone EXE program vrati poruku :
> Invalid report file.
Da li ti je report ukljucen u project ?
baze.podataka.14vsasa,
Na SEZAMU sam "nekad davno" video .DBF file sa ESC sekvencama za
raznorazne stampace. Sada, k'o za inat, ne mogu da se setim gde.
Moze li mi 'ko pomoci?
CAO, Vsasa.
baze.podataka.15miroslavn,
Imam problem sa FoxPro 2.5 za Dos...
Kada otvorim sistemski prozor za help (u mom programu)
, a potom kliknem mišem na desktop mog programa fox više
ne prihvata ništa sa tastature...
Heeeelppp
baze.podataka.16dr.grba,
>> Na SEZAMU sam "nekad davno" video .DBF file sa ESC sekvencama za
>> raznorazne stampace. Sada, k'o za inat, ne mogu da se setim gde.
>> Moze li mi 'ko pomoci?
Može se pomoći, kako da ne? Za prvu pomoć, a možda i više od toga, evo mog
DBF priloga.
printer.zipbaze.podataka.17tvucko,
Posto kucam online bicu kratak .
Da li je neko cuo, vidio ili mozda ima upgrade za
Clipper 5.2 na verziju D.
Pozdrav TVucko
baze.podataka.18bulaja,
│Da li je neko cuo, vidio ili mozda ima upgrade za
│Clipper 5.2 na verziju D.
└───
Ni čuo ni video, a ne verujem da takvo nešto postoji :). Bar ga nema na
aprilskoj listi fajlova Clipper foruma na Compuserve, a ako ga nema tamo
onda znači da ga nema uopšte :). Btw postoji i tema PC.PROG:clipper. :)
baze.podataka.19tvucko,
Ja cuo i vidio, a informacije sam dobio sa Hekom BBS-a
i fajl je imao datum 02.05.1994.
52dix.txtbaze.podataka.20mjevta,
>> Radi se o programu FOX PRO 2.0.Kada mu se da parce koda u
>> stilu: SELECT 8;
>> FROM HHIMENIK;
>> WHERE IME = MEMVAR;
>> INTO CURSOR IMEN
>> REPORT FORM IMEN.FRX PREVIEW
>> to u interaktivnom modu kada se pokrene sa DO radi dobro ali
>> kada se kompajluje ustand-alone EXE program vrati poruku :
>> Invalid report file.
1. Cemu REPORT FORM IMEN.FRX PREVIEW, kada je ekstenzija .FRX default?
2. SELECT 8 -> SELECT *
3. Ako radis sa projektima, sto je prirodno, proveri sta je sa
ukljucivanjem report file-a u projekat (include), a ako je to u redu
onda ti je najverovatnije report file ostecen. Otvori ga kao DBF sa
USE IMEN.FRX i browse-iraj ga, ako se snalazis sa strukturom FRX
file-ova, ili izvestaj kreiraj ponovo.
baze.podataka.21mjevta,
>> Na SEZAMU sam "nekad davno" video .DBF file sa ESC sekvencama
>> za raznorazne stampace. Sada, k'o za inat, ne mogu da se setim
>> gde.
Uz FoxPro se isporucuje tabela (.dbf) koji sadrzi kodove za
prilicno stampaca. Ako ti treba, javi se.
bjevta
baze.podataka.22frant,
Ako ovde ima korisnika baza podataka pod Windows-om, molim
da mi daju svoje mišljenje:
1. Koji je programski paket bolji - Acess ili Paradox for
Windows?
2. Koristim Paradox for Windows, verziju 1.0 . Nisam uspeo da ga
nateram da prihvati naša slova iz Windows-a EE. Da li postoji
način?
3. Koja je najnovija verzija Paradox-a for Windows?
4. U help-u se na dva mesta pominje mogućnost formiranja
vremenskog polja 'Time Field', ali ja to nikako ne mogu da
dobijem. Da li to može da se koristi u novijoj verziji?
Frant
baze.podataka.23bulaja,
│Ja cuo i vidio, a informacije sam dobio sa Hekom BBS-a
│i fajl je imao datum 02.05.1994.
└───
Woow, potrudiću se da to stigne brzo ovde :).
baze.podataka.24djorzor,
> 1. Koji je programski paket bolji - Acess ili Paradox for
> Windows?
Po mom mišljenju, Paradox je trenutno tehnološki zreliji. Ali,
nije isključeno da MS smisli nešto pa Access 2.0 bude bolji.
Ili, može da se desi da Paradox neće raditi u Win 4.0.
> 2. Koristim Paradox for Windows, verziju 1.0 . Nisam uspeo da ga
> nateram da prihvati naša slova iz Windows-a EE. Da li postoji
> način?
Koristim YUSCII, bez EE-a, ali bi me čudilo da to ne radi.
> 3. Koja je najnovija verzija Paradox-a for Windows?
Borland Paradox for WIN 4.5
> 4. U help-u se na dva mesta pominje mogućnost formiranja
> vremenskog polja 'Time Field', ali ja to nikako ne mogu da
> dobijem. Da li to može da se koristi u novijoj verziji?
Otvoriš tabelu, meni Table/Restructure, u Type polju treba da stoji D.
Koliko znam, to je radilo u svim verzijama.
baze.podataka.25mjevta,
>> 1. Koji je programski paket bolji - Acess ili Paradox
>> for Windows?
Probaj FOX4WIN, bices zadovoljan (ako imas 8MB RAM).
baze.podataka.26jasicp,
Ako neko moze da mi posalje na mail sto vise primera u vezi sa
programiranjem pomocu Paradox Enginea za Pascal i C ( C++ ), bio bih mu
izuzetno zahvalan !
baze.podataka.27dcolak,
│ Ako neko moze da mi posalje na mail sto vise primera u vezi sa
│ programiranjem pomocu Paradox Enginea za Pascal i C ( C++ ), bio bih mu
│ izuzetno zahvalan !
Da li je to stvar koja mora da se registruje?
Gde može da se nabavi?
žitao sam u Rač. da je paradox dosta sporiji od Clippera recimo,
ali kad se svedu konačni rezultati dođe na isto..
Sledge DAMMIR!
baze.podataka.28miroslavn,
Kako u FoxPro 2.5 za Dos proveriti da li je isključen sistemski help prozor
primer:
help <- otvaranje sistemskog help prozora
if isključen help then
do procedura1
else
do procedura2
endif
Pitanje 2
Kada otvorim sistemski prozor za help (u mom programu)
, a potom kliknem mišem na desktop mog p
rograma fox više
ne prihvata ništa sa tastature...
baze.podataka.29mjova,
> žitao sam u Rač. da je paradox dosta sporiji od Clippera
> recimo, ali kad se svedu konačni rezultati dođe na isto..
???
PE nije jezik/skript ;) kao kliper. teško je dati objektivnu ocenu
poređenjem baba i žaba! dakle, ako se radi o pristupanju bazi, onda
se nekakva paralela može naći i dati nekakvi testovi. no, i to se ne
može baš lako uraditi je kliper je kliper, a PE je PE, a mene mrzi da
o tome pišem ;).
baze.podataka.30frant,
> Koristim YUSCII, bez EE-a, ali bi me čudilo da to ne radi.
Sa YUSCII-jem bi valjda i moralo da radi, ali sa EE neće.
> Otvoriš tabelu, meni Table/Restructure, u Type polju treba da stoji D.
> Koliko znam, to je radilo u svim verzijama.
Da, ali tako dobijem DATUMSKO polje, a meni je potrebno VREME u
satima i minutima ... probaću sa verzijom 4.5 .
Frant
baze.podataka.31frant,
> Probaj FOX4WIN, bices zadovoljan (ako imas 8MB RAM).
Nažalost, imam samo 4 MB. Može li da radi sa toliko memorije ili
je 8 MB minimum? (I ovaj Paradox stalno swap-uje ...)
Frant
baze.podataka.32zorani,
##> Probaj FOX4WIN, bices zadovoljan (ako imas 8MB RAM).
##
## Nažalost, imam samo 4 MB. Može li da radi sa toliko memorije ili
## je 8 MB minimum? (I ovaj Paradox stalno swap-uje ...)
Radi. Teško da je FOX4WIN zahtevniji u pogledu memorije od ACCESS-a
i PARADOX-a. I oni vole 8 ali rade i sa 4MB.
baze.podataka.33vitez.koja,
#=>│ Ako neko moze da mi posalje na mail sto vise primera u
#=>│ vezi sa programiranjem pomocu Paradox Enginea za Pascal
#=>│ i C ( C++ ), bio bih mu izuzetno zahvalan !
#=> Da li je to stvar koja mora da se registruje?
#=> Gde može da se nabavi?
Paradox Engine je komercijalna biblioteka, znači kad je kupiš tvoja je i nema
šta da se registruje.
Što se tiče nabavljanja, znam jednog koji ima instalaciju O:)... Možete njega
da pitate odakle mu ;)
baze.podataka.34mmitrovic,
Ů█▀█Ţ Što se tiče nabavljanja, znam jednog koji ima instalaciju O:)... Možete
Ů█▀█Ţ njega da pitate odakle mu ;)
Rado, kad bi znao ko je.
baze.podataka.35dsisic,
> Da li je neko cuo, vidio ili mozda ima upgrade za
> Clipper 5.2 na verziju D.
Ja cuo, video, al' nisam pobedio posto se radilo o update-u za
international verziju Clipper-a.
Naime, brljao sam po nekom file serveru u inostranstvu i pronasao
taj update. Od 52dus ni traga. Sto jes, jes, ima ga na Hekomu, al'
ne moz' da ga skines bez da platis :(
Verovatno ce ga neko pecnuti uskoro....
baze.podataka.36ndragan,
/ ustand-alone EXE program vrati poruku :
/ Invalid report file.
Za početak probaj da izbaciš taj riport iz projekta, pa probaš bez
njega (tj da .frx ne bude uopšte u projektu, nego na lokalnom
direktoriju), pa onda opet sa njim. Moguće da ti je u projektu ostala
neka bajatija verzija, ili samo .frx bez .fpt ili tako nešto.
--> U konferenciji SEX, tema o.jeziku...
baze.podataka.37ndragan,
/ je 8 MB minimum? (I ovaj Paradox stalno swap-uje ...)
Minimum za FP2.5W je 4M realne + 2M virtualne.
baze.podataka.38ndragan,
/ Kako u FoxPro 2.5 za Dos proveriti da li je isključen sistemski help
/ prozor
A ima i if Wvisible('help'), pored onog što smo rekli u temi kliper.
baze.podataka.39ddabic,
Kako resavate sledeci problem:
Radite u FoxPro-u, u sred rada nestane struje. Kada ponovo dodje struja
probate da nastavite sa radom i dobijete poruku:
*** Not a database file ***
tj. ostecen je header baze i Fox je ne prepoznaje kao .DBF
Znam da mogu bazu da popravim sa FILEFIX i sl.
Uspeo sam i na jedan vrlo cudan nacin. Udjem u FoxPlus (on nejavlja
nikakvu gresku kod USE-a), spakujem bazu i ponovo se vratim u FoxPro
posle cega sve normalno radi.
Ova resenja mi nisu interesantna posto mnogo komplikuju zivot.
Treba mi neki programcic koji ovo resava bez izlaska iz Fox-a, ili
neki slican FILEFIX-u ali da se startuje npr FIX (file) i da se sa
tim posao zavrsi.
Ako znate o cemu se radi molim za pomoc.
Dejan D.
baze.podataka.40zgolub,
> Radite u FoxPro-u, u sred rada nestane struje. Kada ponovo dodje struja
> probate da nastavite sa radom i dobijete poruku:
> *** Not a database file ***
> tj. ostecen je header baze i Fox je ne prepoznaje kao .DBF
║Ovaj problem se javlja i kod CLIPPER-a. To sam do sada radio tako što otvorim
novu datoteku sa istom strukturom i prepišep podatke iz stare zatim staru
obrišem. Naravno ovo važi samo ako je datoteku moguće otvoriti sa USE.
baze.podataka.41miroslavn,
> Kako u FoxPro 2.5 za Dos proveriti da li je isključen sistemski help
> prozor
>
> primer:
>
> help <- otvaranje sistemskog help prozora
> if isključen help then
>
> do procedura1
> else
> do procedura2
> endif
>
> Pitanje 2
>
> Kada otvorim sistemski prozor za help (u mom programu)
> , a potom kliknem mišem na desktop mog p
> rograma fox više
> ne prihvata ništa sa tastature...
Ponavljam ovo moje pitanje od pre par dana. Stvar je hitna...
baze.podataka.42jovca.car,
/* Minimum za FP2.5W je 4M realne + 2M virtualne.
~~~~~~~~~
Aiii, gusto. :( Realne ili slobodne?
baze.podataka.43jovca.car,
/* Treba mi neki programcic koji ovo resava bez izlaska iz Fox-a, ili
Probaj RUN FILEFIX
baze.podataka.44dr.grba,
Postoji već nekoliko grupa u kojima sam član, a koje se bave ovim
i onim pitanjima u programiranju, planiranju, problemima i slično.
Imam nameru da osnujem grupu koja bi se bavila projektovanjem
informacionih sistema. Dakle, rasprava o skupu postupaka koji se
(formalno ili neformalno, kako god hoćete) preduzimaju u procesu
uvođenja računarske podrške informacionim sistemima.
Nivo rasprave bi trebalo da bude iznad problematike ovog ili onog
programskog jezika, možda čak i iznad problematike vrste hardvera.
Zainteresovani neka se jave isključivo meni u mail, do ponedeljka, kada
će grupa biti osnovana. Prednost, bez ljutnje, dajem profesionalcima na
tom polju.
baze.podataka.45ddabic,
> Probaj RUN FILEFIX
Probato, nije to to. FILEFIX restaurira strukturu ali izgubi podatke.
Dejan D.
baze.podataka.46ddabic,
> obrisem. Naravno ovo vazi samo ako je datoteku moguce otvoriti
> sa USE.
Problem i jeste u tome sto ne mogu da otvorim bazu sa USE.
Dejan D.
baze.podataka.47ndragan,
/ nikakvu gresku kod USE-a), spakujem bazu i ponovo se vratim u FoxPro
Ne moraš ni da spakuješ. Jedno 'append blank' završava posao.
baze.podataka.48miroslavn,
> Kako u FoxPro 2.5 za Dos proveriti da li je isključen sistemski help
> prozor
>
> primer:
>
> help <- otvaranje sistemskog help prozora
> if isključen help then
>
> do procedura1
> else
> do procedura2
> endif
>
> Pitanje 2
>
> Kada otvorim sistemski prozor za help (u mom programu)
> , a potom kliknem mišem na desktop mog p
> rograma fox više
> ne prihvata ništa sa tastature...
Ponavljam ovo moje pitanje od pre par dana. Stvar je hitna...
baze.podataka.49dr.grba,
Molio bih nekog korisnika Clariona da mi objasni šta je to LIM. Da li je to
ekvivalenat korisničkoj biblioteci u Clipperu, TPU u Turbo Pascalu ili nešto
treće?
baze.podataka.50mdimitrijevic,
Hitno bi mi trebalo !!!
Potrebno mi je kod unosa lozinke iz FOX PRO-a 2.0 da se ne vidi sta se
ispisuje na ekranu. Prosto da boja pozadine i boja ispisa slova budu iste. To
je u DBASE IV moglo sa X ili * cini mi se ( davno je bilo ).
Ako iko zna neka mi odgovori sto pre !!!!!!!
Pozdrav,
Marjan
baze.podataka.51misa.m,
>> Potrebno mi je kod unosa lozinke iz FOX PRO-a 2.0 da se ne vidi sta se
>> ispisuje na ekranu. Prosto da boja pozadine i boja ispisa slova budu iste.
>> To je u DBASE IV moglo sa X ili * cini mi se ( davno je bilo ).
To isto (X/X) radi i u Fox-u bilo koje verzije.
Ako isto želiš da izvedeš kroz screen generator onda postoje bar dve varijante:
- Kreiraš neku slobodnu kolor šemu sa parovima 'x/x,x/x,....' ili bilo koje dve
iste boje
i sa Screen menija dodeliš svom GET polju.
- Druga varijanta je da u READ WHEN klauzuli staviš:
show get m.lozinka color "r/r,r/r"
a u VALID za polje m.lozinka:
m.loz=m.lozinka
m.lozinka=space(10)
jedina mana je upotreba 2 memorijske varijable.
P.S. Meni se više dopada kombinacija istih boja zato što prikazuje i kretanje
kursora.
baze.podataka.52mdimitrijevic,
OK, probacu.
Pozdrav,
Marjan
P.S. HVALA !!!!!!!
baze.podataka.53mbole,
> ispisuje na ekranu. Prosto da boja pozadine i boja ispisa slova
> budu iste. To je u DBASE IV moglo sa X ili * cini mi se ( davno
> je bilo ).
Pazite se monohromatskih ekrana. Svojevremeno sam radio ovako nešto (u
clipperu doduše al dođe mu na isto), i desila se sledeća stvar. Probao sam
program na lokalnoj VGA karti, i sve je bilo ok, tj nije se video ispis.
Odnesem program da ga instaliram radi demonstracije, onako po navici ne
gledajući u ekran, otkucam pristupnu šifru, podignem pogled kad ono na
ekranu se sasvim lepo i čitljivo vidi šifra :(
Reko mora da sam nešto pobrljaveo prilikom zadnjeg kompajliranja, pa kad
sam došao nazad, pustim program na gorepomenutoj VGA, šifra se ne vidi.
Zašto? Nemam pojma, a i nije me mnogo interesovalo. žim se desilo jednom
desiće se opet.
Otad prilikom unosa ovakvih stvari isključujem ispis na ekran , pročitam
taster, uključim ispis, opalim zvezdicu na ekran, ponovo isključim ispis...
Naravno ovo je cela funkcija koja ima kontrolu backspacea itd... vraća
uneti string.
Mislim da je ovo najbolje rešenje.
baze.podataka.54zzk.,
> Pazite se monohromatskih ekrana. Svojevremeno sam radio ovako nešto (u
> clipperu doduše al dođe mu na isto), i desila se sledeća stvar. Probao sam
> program na lokalnoj VGA karti, i sve je bilo ok, tj nije se video ispis.
> Odnesem program da ga instaliram radi demonstracije, onako po navici ne
> gledajući u ekran, otkucam pristupnu šifru, podignem pogled kad ono na
> ekranu se sasvim lepo i čitljivo vidi šifra :(
Koju si ti to definiciju boje koristio?
Kombinacija 'osnovna,N/N' ili 'osnovna, / ' mi jos nikada nije 'zakazala',
a prosla je na desetine raznih kartica i ekrana.
baze.podataka.55snemcev,
>> ...šta je to LIM.
Lotus Imtel Microsoft. :)
baze.podataka.56mjevta,
>> Potrebno mi je kod unosa lozinke iz FOX PRO-a 2.0 da se ne
>> vidi sta se ispisuje na ekranu. Prosto da boja pozadine i boja
>> ispisa slova budu iste.
Naredba č ... SAY/GET ima COLOR klauzulu.
bjevta
baze.podataka.57ndragan,
/ sam došao nazad, pustim program na gorepomenutoj VGA, šifra se ne
/ vidi. Zašto? Nemam pojma, a i nije me mnogo interesovalo.
Difolt boje za herkulesa, emulira kako zna i ume pa sve pokušavajući da
izbegne kombinacije tipa crno na crno, napravi to što napravi. Jedino
što me zasad nije zeznulo je 'color n/n,n/n', daje stvarno crno na crno.
Mada mislim da i plavo na plavo radi.
baze.podataka.58dr.grba,
>>>> ...šta je to LIM.
>>
>> Lotus Imtel Microsoft. :)
Passe... (:
Ali si me ipak prisetio na čoveka koji je kupovao PC pre jedno tri-četiri
godine, spremio silne pare... tražio mi da mu objasnim kakva je to limena
memorija, objasnili mu da to treba. "Zar nisu bolji oni čipovi?"...
baze.podataka.59cnenad,
ŁŁŁ godine, spremio silne pare... tražio mi da mu objasnim kakva je to limena
ŁŁŁ memorija, objasnili mu da to treba. "Zar nisu bolji oni čipovi?"...
:))))))))
Ma kakav članak PRESS ANY KEY. Grbo daj još ovakvih primera.
baze.podataka.60madamov,
Gde se kod nas može naći knjiga "Database structure and design"? Ili neka
druga na istu temu.
baze.podataka.61dr.grba,
>> ŁŁŁ memorija, objasnili mu da to treba. "Zar nisu bolji oni čipovi?"...
>> ...
>> Ma kakav članak PRESS ANY KEY. Grbo daj još ovakvih primera.
Obično se trudim da potisnem to iz glave. Da nije tužno, bilo bi smešno. Taj
isti čovek sad ima 386 mašinu sa 8 MB memorije, od kojih 2 MB koristi za EMS,
a (sad se držite) 5 MB za keširanje diska...
Ne bi on ni držao ta 2 MB za EMS, nego treba softveru koji je bio u kutiji sa
skenerom.....
E, da sam zapisivao sve bisere, sad bismo imali seriju tekstova u
Računarima...
baze.podataka.62dr.grba,
>> Gde se kod nas može naći knjiga "Database structure and design"? Ili neka
>> druga na istu temu.
Jesi li prečačkao podrum u "Jugoslovenskoj knjizi", ispod "Albanije"?
baze.podataka.63rpausic,
POŠTOVANE KOLEGE!
Razmišljam se da otvorim grupu sa programere koji rade u PROGRESS-u.
Ako ste jedan od njih, a zainteresovani ste da svoja iskustva podelite
sa drugima, javite mi se mail-om. Bude li nas više od troje, možemo
se družiti u grupi. S obzirom na mali broj korisnika PROGRESS-a,
verujem da ćemo svi imati koristi od toga. Rok za prijavu je neograničen,
ali je poželjno da to bude što pre :)
Pozdrav, Robert Paušić.
baze.podataka.64madamov,
> Jesi li prečačkao podrum u "Jugoslovenskoj knjizi", ispod "Albanije"?
Nisam bio tamo od kada sam kupovao ruske knjige za faks. B) Probaću tamo,
hvala na podsećanju.
baze.podataka.65zakic,
Kako u FOXPRO-u dobiti podatke o kirisnicima, grupama ...
na NOVELL NetWare operativnom sistemu
baze.podataka.67sikima,
Da li ima neko slobodno mesto u grupi za PE (pascal verzija).Rado bih
se pridruzio.
baze.podataka.68dejanr,
>> Da li ima neko slobodno mesto u grupi za PE (pascal verzija).
Nisam čuo da postoji grupa za Paradox Engine, a u svakom slučaju, o toj
biblioteci se sasvim lepo može diskutovati u ovoj temi.
baze.podataka.69sikima,
O.K Dejane. Reci mi kako da pocnem sa PE. Je li mozem da mi posaljes
neki programcic pisan sa PE da vidim kako to sve radi. Nadam se da ne
trazim mnogo.
P.S. I know You can help me!
baze.podataka.70dejanr,
>> O.K Dejane. Reci mi kako da pocnem sa PE. Je li mozem da mi posaljes
>> neki programcic pisan sa PE da vidim kako to sve radi. Nadam se da ne
>> trazim mnogo.
Rado bih pomogao, ali nikada nisam radio sa Paradox Engine-om. Ni za C,
ni za paskal. Ako te zanima, možeš da pogledaš tekstove koji su prethodnih
meseci o tome objavljivani u "Računarima".
baze.podataka.71mjova,
> O.K Dejane. Reci mi kako da pocnem sa PE. Je li mozem da
> mi posaljes neki programcic pisan sa PE da vidim kako to
> sve radi. Nadam se da ne trazim mnogo.
uz samu biblioteku ide dosta primera. naravno, oni koji treba
da prikažu upotrebu funkcije su krajnje trivijalni, pa ti
preporučujem da ih i ne gledaš. pogledaj one programe koji se
daju kao primer - nešto o restoranima ili čemu beše već. to
je odličan početak.
drugo, što se tiče paskal i C verzije, razlika je samo u
jeziku, imena funkcija su iste.
> P.S. I know You can help me!
ne vezano za dejana, već za većinu ljudi koji ti mogu ponešto
odgovoriti: ne računaj da će iko trošiti svoje vreme na
pisanje primera svakom ko postavi pitanje. najbolje je
postavljati pitanja koja ne zahtevaju puno vremena za
odgovor. to znači da se moraš više truditi da sam 'provališ'
ono što te muči.
kako sam dugo koristio PE može se očekivati da ga dobro
poznajem. no, već više od 8 meseci ne koristim PE, pa mi je
od svega toga ostala samo suština - više se ne sećam imena
funkcija itd. pogledaj računare u kojima je bilo priče o
njima, mislim da će ti dosta pomoći.
baze.podataka.72sikima,
> Vise truda u vezi Paradox Engine 3.0
Mozda me nisi shvatio. Nisam trazio kompletnu obuku nego najlaksi
nacin da startujem sa necim. Nisam shvatio ono sa primerom (restoran).
Reci mi bar tacno ime tog fajla. Ja koliko sam video ima neki divlji
primer (to bi i ja znao da napisem).
P.S. Odakle si ti sve naucio (literatura,saveti,...).Ja sam i dalje
zaintersovan za parce source bilo kakvog PE (pascal) programa.
Pozdrav
Sikima
s
H
baze.podataka.73vitez.koja,
#=> Rado bih pomogao, ali nikada nisam radio sa Paradox
#=> Engine-om. Ni za C, ni za paskal. Ako te zanima, možeš
#=> da pogledaš tekstove koji su prethodnih meseci o tome
#=> objavljivani u "Računarima".
Pomenuti tekstovi su veoma informativni i korisni, preporučujem
:) Međutim, za pravo korišćenje potrebna ti je prava literatura
ili Norton Guide (ima na sezamu) + hiljadu probavanja &
isprobavanja.
baze.podataka.74dcolak,
│ kako sam dugo koristio PE može se očekivati da ga dobro
│ poznajem. no, već više od 8 meseci ne koristim PE, pa mi je
│ od svega toga ostala samo suština - više se ne sećam imena
Zašto si (ako si) odustao od PE? Na šta si prešao?
Sledge DAMMIR!
baze.podataka.75bulaja,
│ Zašto si (ako si) odustao od PE? Na šta si prešao?
└───
MJogi, jel da kažem (bRookha)? :)
baze.podataka.76dr.grba,
Molio bi sve one koji su stekli ikakva, barem elementarna iskustva
u radu Paradoxa 4.x u mreži da mi kažu par reči o svojim iskustvima.
Kako instalirati? Kakve su perfomanse pod Novell NetWare 3.11? Šta
je to SQLL Novell za Paradox? Nekakva biblioteka? Server modul?
Posebno i pride, postavljam isto pitanje za Paradox for Windows u
mrežnoj okolini.
Informacije svih vrsta su vrlo dobrodošle. Hvala unapred.
baze.podataka.77mjova,
> Zašto si (ako si) odustao od PE? Na šta si prešao?
ne nasedaj na insinuacije od strane file moderatora ;)
trenutno nemam potrebe za bazama, ali u svakom slučaju
izbegavaću C kao jezik za tako nešto.
baze.podataka.78.djn,
> Da li ima neko slobodno mesto u grupi za PE (pascal verzija).Rado bih
> se pridruzio.
I ja sam zainteresovan za clanstvo u grupi PE ako to znaci
Paradox Engine.
Imam iskustva sa verzijom za Pascal.
.djn
baze.podataka.79nigra,
Pozdrav!
Da li neko zna kako je moguce zastititi podatke u tabelama (u nekoj
bazi podataka) od neovlascenog pristupa. Naprimer, spreciti druge
da nekim disk editorom "iscupaju" podatke iz tabele, odnosno iz
DOS fajla u koji je snimljen sadrzaj te tabele?
Da li se mogu kod upisa u tabelu podaci "skremblovati" i kako onda
vrsiti pretrazivanje po indeksima?
Unapred hvala!
baze.podataka.80djelovic,
> Da li neko zna kako je moguce zastititi podatke u tabelama (u nekoj
> bazi podataka) od neovlascenog pristupa.
Većina sistema za rad sa bazama podataka ima mogućnost postavljanja šifre
na tabelu. Van unošenja te šifre pri otvaranju tabele sistem je potpuno
transparentan, i ti ne moraš da brineš o indeksiranju i sl. E sad, reci koji
DBMS/programski jezik koristiš, pa da vidimo koja su funkcije u njemu za to
zadužene.
baze.podataka.81nigra,
<< Većina sistema za rad sa bazama podataka ima mogućnost postavljanja šifre
<< na tabelu. Van unošenja te šifre pri otvaranju tabele sistem je potpuno
To je u redu kada se tabeli pristupa programski , naprimer, podignem
ORACLE, udjem u SQL*Plus i napravim selekt iz te tabele. Isto tako, kada DBF
tabeli pristupam CLIPPER programom. Ali, i pored šifre ja mogu iz PCTOOLS-a
da pristupim *.DBF ili *.ORA fajlu i pročitam podatke. Ili da napišem program
u C-u, koji će mi izdvojiti sve podatke iz tabele.
<< transparentan, i ti ne moraš da brineš o indeksiranju i sl. E sad, reci koji
<< DBMS/programski jezik koristiš, pa da vidimo koja su funkcije u njemu za to
U obzir dolaze FOX PRO, Paradox Engine, Clipper, Progress ili ORACLE. Po-
trebno je i da DBMS ima dobre performanse u radu sa velikim tabelama (oko
milion redova).
Pozdrav,
nigra.
baze.podataka.82isimic,
Imam jedan mali problemčić sa FoxPro-om 2.5 (DOS):
Unošenje podataka za neku datoteku vrši se u BROWSE prozoru. Prilikom unosa,
postoji potreba da se po unošenju npr. šifre artikla u jednom polju, u sused-
nom polju prikaže naziv tog artikla, ali iz druge tabele povezane relacijom
sa tabelom u koju se vrši unos. Uslov je da se u polje šifre može uneti samo
ona šifra koja već postoji u tabeli šifara, ali i da se provera postojanja
šifre izvrši odmah, prilikom pokušaja napuštanja polja sa šifrom. Nekoliko
različitih rešenja za koje sam smatrao da su sasvim normalna, nisu dala
rezultate. Npr.
SELECT 0
USE tab1 ĐĐ tabela šifara
SELECT 0
USE tab2 ĐĐ tabela promena
SET RELATION TO šifra INTO tab1
BROWSE FIELDS tab2.šifra;
:V = FOUND('tab1');
:E = 'Nepostojeća šifra',;
tab1.nazivartikla :R;
...
...
ne dozvoljava unos NIKAKVE šifre, ni postojeće ni nepostojeće. Isto to izve-
deno kao UDF() na mestu FOUND(), ne daje ništa bolje rezultate.
Isti segmnent koda, samo sa EOF() umesto FOUND() daje još čudnije rezultate.
Prvi unos u takvo polje moguće je izvršiti BILO KAKVOM šifrom - unos je uvek(!)
validan; ako šifra ne postoji u tabeli šifara, jedino što polje naziva artikla
ostaje prazno. Ispravka vrednosti šifre prouzrokuje prikazivanje i naziva
artikla u susednom polju. Tek sledeća promena u neku nepostojeću šifru
aktivira rutinu za grešku (ali u polju naziva ostaje i dalje ime artikla za
koji je prethodno unesena ispravna šifra). Sve u svemu, opšta ludnica!
Bez provere postojanja šifre (:V i :E) u tabeli šifara dobija se jednostavno
prazno polje naziva artikla, što daje neku vizuelnu kontrolu ispravnosti
unete šifre, ali postoji zahtev da se takva nepravilnost odmah registruje i
onemogući dalji unos pdataka. Pa, valjda je mušterija uvek u pravu!
* * * * *
Jedini logičan odgovor koji sam mogao naći je da se pre napuštanja polja
šifre - za vreme kontrole njene validnosti - uneta vrednost još stvarno ne
dodeljuje polju, sve dok se provera ne završi. A pošto se provera vrši upravo
na osnovu relacije sa još nepostojećom vrednošću, ili u slučaju EOF() sa
prethodnom vrednošću korektno uspostavljene relacije... ali zašto onda prolazi
prvi pokušaj unošenja u varijanti sa EOF()... Potpuno sam zbunjen ovim, i
do daljnjeg ću preskočiti ova dva programska reda. Ali, ako neko zna rešenje,
please help me, jer ću kad-tad morati da se vratim na njih, pa da ne bih
tražio stručnu pomoć na drugom mestu...
Pozdrav! (Zoran)
baze.podataka.83misa.m,
>> BROWSE FIELDS tab2.šifra;
>> :V = FOUND('tab1');
>> :E = 'Nepostojeća šifra',;
>> tab1.nazivartikla :R;
>> ne dozvoljava unos NIKAKVE šifre, ni postojeće ni nepostojeće. Isto to
>> izve- deno kao UDF() na mestu FOUND(), ne daje ništa bolje rezultate.
Radiće kako očekuješ samo upotrebi :
:V = seek(šifra, 'tab1')
Pozdrav Miša
baze.podataka.84isimic,
>> Radiće kako očekuješ samo upotrebi :
>> :V = seek(šifra, 'tab1')
Slazem se. Radi. Ali za to rešenje ne treba relacija. A pošto je sama relacija
već sama po sebi implicitni seek, ne razumem zašto bi bio potreban još jedan.
Naravno, u nedostatku boljeg, koirstiću i ovo rešenje, mada mi se ne čini
potpuno 'čisto'. Nemoj pogrešno da me shvatiš - ovo stavljam na dušu ljudima
iz FoxPro-Microsofta.
Hvala!
Pozdrav.
baze.podataka.85sikima,
Da li je neko radio sa Paradox 4.0 i pravio .exe verzije (naravno, uz pomoc
Run-Time). Kakva su iskustva u odnosu na Access, Cliper, Fox,....
Parametri za ocenjivanje: brzina na svim platformama, memeorijski zahtevi,
velicina .exe fajla,....
Poceo sam da se bavim Paradoxom i PAL jezikom pa me intersuje da li je to
uzaludan posao ili da trazim nesto bolje.
P.S. Ocekujem odgovor, jer mislim da ima jos zaintersovanih
Da li postoji grupa za Paradox. Ako da li ima slobodnih mesta
baze.podataka.86isimic,
>>Slazem se. Radi. Ali za to rešenje ne treba relacija. A pošto je sama
relacija
>>već sama po sebi implicitni seek, ne razumem zašto bi bio potreban još jedan.
Ispravka! Ne radi! Odnosno, radi, ali sa još čudnijim efektima. Kad se prvi
put uđe u browse, i dok još ništa nije uneseno u tabelu, u polju naziva
artikla već se nalazi naziv još neunesenog artikla, i to prvog u logičkom
redosledu u odnosu na aktivan indeks u child tabeli. A za svaki sledeći
slog, pre bilo kakvog unosa, u polju naziva artikla nalazi se ime artikla
iz prethodnog sloga. Prema tome, problem i dalje ostaje nerešen.
Uzgred, zna li neko gde i pod kojim uslovima se može nabaviti Library
Construction Kit za FoxPro 2.5?
Pozdrav!
Zoran.
baze.podataka.87pedjolino,
Ovo sto me zanima je cini mi se vec bilo aktuelno ovde, ali neka.
Ima li neko iskustva u povezivanju VisualBasica 3.0 i Oracla,
odnosno ima li neko SQL*Net for Windows da bi ODBC radio.
Da li je potrebno jos nesto osim SQL*Net-a??
Hteo bih da probam ovo ali mi nedostaje SQL*Net pa ako moze...??
baze.podataka.88sikima,
Da li je neko radio sa Paradox 4.0 i pravio .exe verzije (naravno, uz pomoc
Run-Time). Kakva su iskustva u odnosu na Access, Cliper, Fox,....
Parametri za ocenjivanje: brzina na svim platformama, memeorijski zahtevi,
velicina .exe fajla,....
Poceo sam da se bavim Paradoxom i PAL jezikom pa me intersuje da li je to
uzaludan posao ili da trazim nesto bolje.
P.S. Ocekujem odgovor, jer mislim da ima jos zaintersovanih
Da li postoji grupa za Paradox. Ako da li ima slobodnih mesta
H
baze.podataka.89misa.m,
>> Slazem se. Radi. Ali za to rešenje ne treba relacija. A pošto je sama
>> relacija već sama po sebi implicitni seek, ne razumem zašto bi bio
>> potreban još jedan.
Zato što se vrednost polja upisuje u bazu tek ako je valid uslov ispunjen,
u suprotnom zadržava se već postojeća. Sama relacija se izvršava na osnovu
prave vrednosti u bazi.
>> Naravno, u nedostatku boljeg, koirstiću i ovo rešenje, mada mi se ne čini
>> potpuno 'čisto'. Nemoj pogrešno da me shvatiš - ovo stavljam na dušu
>> ljudima iz FoxPro-Microsofta.
Ne vidim ništa nečisto u koriščenju sistemske funkcije, čak naprotiv.
baze.podataka.90misa.m,
>> Ispravka! Ne radi! Odnosno, radi, ali sa još čudnijim efektima. Kad se
>> prvi put uđe u browse, i dok još ništa nije uneseno u tabelu, u polju
Na Fox2.5a for Dos i Fox2.5 for Win RADI bez ikakvih propratnih efekata.
Testirani program:
close data
use tab1 order tag sifra
select 0
use tab2
set rela to sifra into tab1
browse fields sifra:v=seek(sifra,'tab1'):e='Ne postoji šifra',;
tab1.naziv:R
Ili imaš bagovitu verziju ili se ti i ja ne razumemo najbolje pa da ne bi
zamarali ostale možemo da nastavimo u mail-u.
baze.podataka.91dkrstic,
Šta biste preporučili za učenje (od paketa za razvoj baza podataka) čoveku
koji se sada opredeljuje za razvojni alat?
baze.podataka.92cnenad,
ŁŁŁ Šta biste preporučili za učenje (od paketa za razvoj baza podataka)
ŁŁŁ čoveku koji se sada opredeljuje za razvojni alat?
Možda je mala digresija, a možda i 'jeres' ;)
'Klinci' mi napričaše da je najbolje baze podataka raditi sa C++ -om.
Da li je ovo tačno ?
Kao, svi prešli da rade baze sa C++.
baze.podataka.93sikima,
===============================
11.91 PC.PROG.4:baze.podataka
dkrstic, 29.06.Sre 21:32, 120 chr
---------------------------------------------------------
> Sta biste preporucili za ucenje (od paketa za razvoj baza podataka) coveku
> koji se sada opredeljuje za razvojni alat?
Ja sam isto pocetnik u radu sa bazama podataka ali sam dugo odlucivao i opre-
delio se za Paradox. Dugo sam proucavao mogucnosti razlicitih programa i
dosao sam do dileme izmedju Access 2.0 ili Paradox 4.5, tj.
Microsoft or Borland.
Kako sam ljubitelj Borlandovih proizvoda odlucio sam se na vec pomenuti
program. Naravno, koliko ljudi toliko cudi tako da vrlo brzo ocekujem reply
na moj text. Da cujemo ostale sta misle o ovome
P.S. Zamolio bih Clipper-ase da se ne javljaju u odbranu svog mezimca (;
Pozdrav svima
Sikima
baze.podataka.94cnenad,
ŁŁŁ P.S. Zamolio bih Clipper-ase da se ne javljaju u odbranu svog mezimca (;
Nema potrebe, samo ćutanje je dovoljan znak da ni ne vredi 'razglabati' o
PE-u ;))
baze.podataka.95sikima,
> samo cutanje je dovoljno da ne vredi razglabati o PE-u
Ako si procitao poruku pisalo je Paradox 4.0, a to je cista baza a ne
skup funkcija kao PE3.0. Ali ocekivao sam ozbiljniji neki reply :))
baze.podataka.96lkudlik,
Pomozite !
Da li neko ima na disketi u vezi ORACLE-a nesto ?
Rec je o potpuno pocetnicima koji hoce da sa CLIPPER-a predju na
ORACLE ili PROGRES.
Puno hvala
Lkudlik
baze.podataka.97dkrstic,
I ja se kolebam između Access 2.0 i Paradox 4.5 / Paradox Engine 3.0.
Ima li nekog od iskusnijih da nas posavetuje u koji standard za baze
podataka vredi ulagati trud, da nebi kroz godinu dana morali da se
preorijentišemo na sasvim drugu stranu.
Druga stvar - dajte ovde pouzdane (proverene) informacije o minimalnim
i optimalnim hardverskim resursima za pojedine pakete za razvoj baza
i utiske koje ste stekli u radu s tim paketima.
Unapred zahvalan,
DKRSTIC
baze.podataka.98djelovic,
> 'Klinci' mi napričaše da je najbolje baze podataka raditi sa C++ -om.
> Da li je ovo tačno ?
Ne. Nijedna komercijalna C++ biblioteka ne može da se po lakoći ili brzini
rada meri sa Clipperom ili Foxom. Na drugu stranu, ukoliko ti treba nešto
ekstra, kao telekomunikacije+baze podataka, ili velika fleksibilnost, onda je
C++ bolje rešenje.
baze.podataka.99cnenad,
ŁŁŁ Ako si procitao poruku pisalo je Paradox 4.0, a to je cista baza a ne
Sorry, nisam primetio. Doduše tu si u pravu, Clipper i Paradox se ne mogu
porediti.
baze.podataka.100sines,
Glasam za Paradox za Windows.
Radim u njemu skoro godinu dana, i jos me uvek prijatno iznenadjuje.
Stvarno je bezobrazno lak i mocan. Naravno, potrebno je platiti penale u smislu
hardvera (min 386/40 + 8MB RAM-, ali to danas i nije tako tesko.
Inace, na poslu radim u FOX-u, ZIM-u, Clipper-u, ali to nije to (s tim sto
moram da priznam da je FOX za DOS zverski brz na Novell-u).
Sve u svemu, neces pogresiti i ako se opredelis za FOX, ali ja sam za PARADOX.
p.s. izvinite za on line...
pozdrav, Sinisa.
baze.podataka.101peacock,
#### Da li je neko radio sa Paradox 4.0 i pravio .exe verzije
#### (naravno, uz pomoc Run-Time). Kakva su iskustva u odnosu na
#### Access, Cliper, Fox,.... Parametri za ocenjivanje: brzina na
#### svim platformama, memeorijski zahtevi, velicina .exe
#### fajla,.... Poceo sam da se bavim Paradoxom i PAL jezikom pa
#### me intersuje da li je to uzaludan posao ili da trazim nesto
Ja radim sa Paradoxom nekoliko godina :) Zadovoljan sam,
jedino još fali kopmpajler za DOS verziju. Paradox Runtime
nije kompajler, već interpreter kroz koji pokrećeš svoje
aplikacije. Znači, ne može se upoređivati sa standardnim
jezicima za upravljanje bazama poput Clippera. Sada sam na
verziji 4.5, dovoljno je brza, zavisi šta očekuješ. Ako si
kupio paket, uverio si se u velike mogućnosti i fleksibilnost
rada. Ja sam terao Pdox 3.5 i na XT makini, i radila je
iznenađujuće brzo.
Za Windows verziju Paradoxa izašao je paket za razvoj
aplikacija koji sadrži i kompajler, a ja čekam da se pojavi
verzija za DOS, valjda će je pustiti u prodaju pošto je
sigurno imaju.
baze.podataka.102mjevta,
>> Ne. Nijedna komercijalna C++ biblioteka ne može da se po
>> lakoći ili brzini rada meri sa Clipperom ili Foxom.
Postoji Watcom SQL for Windows, a verovatno i za DOS.
Mozda bi to bilo pravo resenje. U svakom slucaju, ako
neko koristi ovu kombinaciju (Watcom + Watcom SQL),
ne bi bilo lose da napise koju rec o tome.
bjevta
baze.podataka.103spantic,
> ekstra, kao telekomunikacije+baze podataka, ili velika fleksibilnost, onda
> je C++ bolje rešenje.
Zadnjih dva meseca se baš akam sa time, a i bar još toliko ću i voleo
bih da si u pravu. Pravi problem je baš u nedostatku adekvatnih biblioteka
koje omogućavaju efikasan rad nad bazom podataka.
Rešenje sa kojim se krpimo je Clipper 5.01 i MSC 5.1. Nisam baš srećan
sa time, ali dok ne nađem bolje rešenje, to je to.
Da se razumemo, pod boljim rešenjem podrazumevam da prelaz na njega
neće biti skuplji nego ostanak na sadašnjem rešenju.
A da problema ima, ima. Ako je neko uspeo da radi sa kontrolerom prekida
iz C modula sa Clipper glavnim programom a da nije zablokirao računar,
voleo bih da mi se javi.
Miša najbolje zna koliko su trajale moje kuknjave na tu temu :(
baze.podataka.104ppekovic,
>> Ne. Nijedna komercijalna C++ biblioteka ne može da se po lakoći ili brzini
>> rada meri sa Clipperom ili Foxom. Na drugu stranu, ukoliko ti treba nešto
>> ekstra, kao telekomunikacije+baze podataka, ili velika fleksibilnost, onda
je
>> C++ bolje rešenje.
Ukazao si na osnovni problem, ali nisi postavio ključno
pitanje. Dakle, kakve baze čovek žali da razvija, na kojim
platformama, ... Ovo je ključno pitanje za izbor između C++-a,
Clipper-a, Fox-a, Access-a, Paradox-a, Oracle-a, DB2, ZIM-a, ...
Paya
baze.podataka.105ppekovic,
>> I ja se kolebam između Access 2.0 i Paradox 4.5 / Paradox Engine 3.0.
>> Ima li nekog od iskusnijih da nas posavetuje u koji standard za baze
>> podataka vredi ulagati trud, da nebi kroz godinu dana morali da se
>> preorijentišemo na sasvim drugu stranu.
Mene interesuje mogućnosti Paradox-a u radu sa distribuiranim
bazama i da li ima nešto slično Microsoft ODBC-u. takođe, zanima
me da li je neko vezao Access sa Oracle SQL-om?
Paya
baze.podataka.106bulaja,
│A da problema ima, ima. Ako je neko uspeo da radi sa kontrolerom prekida
│iz C modula sa Clipper glavnim programom a da nije zablokirao računar,
│voleo bih da mi se javi.
└───
Pogledaj npr. \ibmpc\clipper\int86x.zip ili source za ceo NanFor.
Ako nije tajna, za šta vam to treba C a ne možete da rešite stvar u
čistom Clipper-u ili preko interapta.
baze.podataka.107djelovic,
> Zadnjih dva meseca se baš akam sa time, a i bar još toliko ću i voleo
> bih da si u pravu. Pravi problem je baš u nedostatku adekvatnih biblioteka
> koje omogućavaju efikasan rad nad bazom podataka.
Ne bih se složio. Paradox Engine je sasvim pristojno rešenje, naravno pod
uslovom da njegove funkcije "obaviješ" C++ klasama. Ja sam svojevremeno
napravio par C++ klasa za PE 2.0, i stvar je funkcionisala sasvim O.K. Jedini
teret koji je program nosio a koji xBASE jezici nemaju jeste "prijavljivanje"
polja u slogovima. Recimo, da bi se deklarisao jedan slog, ja sam morao da
napišem:
struct MyRecord: public Record {
MyRecord ();
String ime, prezime;
int godine;
};
što je u redu, jer i kod xBASE jezika slog mora da se deklariše, s tim što se
to tamo radi preko niza. Ono što je meni smetalo je bio deo u kome sam morao da
"prijavim" promenjljive:
MyRecord::MyRecord ()
: ime (30), prezime (30)
{
*this << ime << prezime << godine;
}
Na drugu stranu, to je posao koji se radi jednom po tabeli, a može se i u
dovoljnoj meri automatizovati makroima.
P.S. Relacioni model? Fuj! Gledao sam malo neke objektne baze podataka, i moram
da kažem da šiju relacione za dva reda veličine kada se radi o čitljivosti
i jednostavnosi koda. Problem je u tome što se kod veoma mnogo komplikuje
ukoliko aplikacija treba da radi na mreži (don't they all? :)), a ako se
radi sa transakcijama onda je sve presporo :(. Obrni-okreni, ne valja.
baze.podataka.108djorzor,
> Dugo sam proucavao mogucnosti razlicitih
> programa i dosao sam do dileme izmedju Access 2.0 ili Paradox 4.5, tj.
> Microsoft or Borland.
> Kako sam ljubitelj Borlandovih proizvoda odlucio sam se na vec pomenuti
> program.
Bavim se bazama nekolicinu godina. žak sam zaradio koji dinar na tome.
Pošto su baze na kojima radim uglavnom usko specijalizovane
(upravljanje projektima) i namenjene određenom korisniku,
mnogo mi je bitnije da razvojno okruženje bude user-friendly, nego
da performanse gotove baze budu bogzna kakve.
Zato sam posle dBASE IV, ORACLE-a prešao na PARADOX for WIN 4.5.
Verujem da za programere koji prave baze za obračunavanje plata
za 2-3 hiljade ljudi i čije baze treba da rade na XT-u, postoje
bolje baze od PARADOX-a.
baze.podataka.109neman,
> P.S. Zamolio bih Clipper-ase da se ne javljaju u odbranu
> svog mezimca (; Pozdrav svima
Pa mi imamo svoju temu, a vi evri badi na gomilu ;)
baze.podataka.110neman,
> Da li neko ima na disketi u vezi ORACLE-a nesto ?
-------
Trebace ti nesto vise od diskete ;)
baze.podataka.111spantic,
> Ako nije tajna, za šta vam to treba C a ne možete da rešite stvar u
> čistom Clipper-u ili preko interapta.
Nije posebna tajna. Reč je o tome da imam enkoder nakačen na paralelni
port i da sa njime upravljam direktno iz C-a. Clipper zapravo služi samo
za prikupljanje podataka od operatera. Poruka se upućuje C modulu, a on
onda istu transformiše u traženi oblik i šalje na paralelni port.
Problem je bio kada je prethodna verzija enkodera tražila da se
postavlja kontroler prekida. Clipper ne podnosi takva brljanja :(
Srećom, hardverska ekipa mi je posle nonšalantno izjavila kako to
"uopšte nije bilo ni potrebno, nego samo onako..." ;)
baze.podataka.112spantic,
> i jednostavnosi koda. Problem je u tome što se kod veoma mnogo komplikuje
> ukoliko aplikacija treba da radi na mreži (don't they all? :)), a ako se
> radi sa transakcijama onda je sve presporo :(. Obrni-okreni, ne valja.
Sasvim dovoljno :( Zato je mene oduševila mogućnost eksplicitnih i
implicitnih
realizacija transakcija kod Novell-a.
baze.podataka.113neman,
> za 2-3 hiljade ljudi i cije baze treba da rade na XT-u,
> postoje
Jeb*ti firmu koja ima 3000 radnika a rade platu na XTu.
baze.podataka.114dcolak,
│> za 2-3 hiljade ljudi i cije baze treba da rade na XT-u,
│> postoje
│
│ Jeb*ti firmu koja ima 3000 radnika a rade platu na XTu.
Ne, uglavnom se podaci samo unose i prebiraju na XT-u, a glavni
posao rade jače mašine..
Mada, kada vidim šta sve ljudi rade na XT-u sa ORACLE-om..
Sledge DAMMIR!
baze.podataka.115neman,
> Mada, kada vidim sta sve ljudi rade na XT-u sa ORACLE-om..
Mazohisti ???
baze.podataka.116nbatocanin,
> P.S. Relacioni model? Fuj! Gledao sam malo neke objektne
> baze podataka, i moram da kažem da šiju relacione za dva
> reda veličine kada se radi o čitljivosti i jednostavnosi
> koda.
Jel imaš nešto od ovoga, interesuje me.
baze.podataka.117dcolak,
│> Mada, kada vidim sta sve ljudi rade na XT-u sa ORACLE-om..
│
│ Mazohisti ???
Ne baš, sve radi sasvim pristojno ;)
Sledge DAMMIR!
baze.podataka.118dr.grba,
>>> P.S. Zamolio bih Clipper-ase da se ne javljaju u odbranu
>>> svog mezimca (; Pozdrav svima
>>
>> Pa mi imamo svoju temu, a vi evri badi na gomilu ;)
Što bi rekli: po svecu i tropar (:
baze.podataka.119nbatocanin,
> Problem je bio kada je prethodna verzija enkodera tražila
> da se postavlja kontroler prekida. Clipper ne podnosi
> takva brljanja :(
Radio sam na projektu u kome je Clipper baza preko C rutina
komunicirala sa gomilom periferija preko serijskih/paralelnih portova
(od kojih su neki uređaji bili *veoma* egzotični: goniometri,
prijemnici, kasetofoni, ...) i to je sve šljakalo ok. Na žalost, ja
nisam radio taj deo pa ne mogu ništa preciznije da kažem, a cela ta
ekipa je sada kud-koji-mili-moji, pa je teško dobiti neku precizniju
informaciju.
baze.podataka.120spantic,
> prijemnici, kasetofoni, ...) i to je sve šljakalo ok. Na žalost, ja
> nisam radio taj deo pa ne mogu ništa preciznije da kažem, a cela ta
> ekipa je sada kud-koji-mili-moji, pa je teško dobiti neku precizniju
> informaciju.
Zaista šteta. Rado bih razmenio iskustva.
baze.podataka.122ab.comp,
Jedan moj prijhatelj, koji ima SCO UNIX, pita:
- gde može da se nabavi FOX za UNIX
- da li je izašao FOXPRO za UNIX
- koje su, odnosno kolike su (procentualno) razlike između DOS i
UNIX verzije FOX-a, da bi aplikacija koja je radila pod DOS-om radila i
pod UNIX-om?
Odgovore slati na mail.
Pozdrav
█ █ █ █
▄▄█ █ █▄▄ █▄▄
baze.podataka.123peca.st,
HELP! :)
Ako je neko vešt sa MS-Access-om, bio bih mu
zahvalan ako bi mogao da mi pomogne! :)
MAIL WR PECA.ST
baze.podataka.124fancy,
ŮŢ> Ako je neko vešt sa MS-Access-om, bio bih mu
ŮŢ> zahvalan ako bi mogao da mi pomogne! :)
Aman, Ivane, sedi i čitaj manual. Do sada bi ga već naučio napamet.
baze.podataka.125vitez.koja,
#=> Ako je neko vešt sa MS-Access-om, bio bih mu
#=> zahvalan ako bi mogao da mi pomogne! :)
Postavljajući svaki dan isti zahtev (molbu) nećeš ništa postići
(sem možda poneki ignore, to prilično iritira).
Možda bi bilo bolje da opišeš svoj problem, potrudi se sam malo,
ponudi neke pare za par priv. časova, pročitaj ceo help...
sk
ps. Prvo definiši šta ti tačno treba, pa traži rešenje :)
baze.podataka.126mirche,
> HELP! :)
>
> Ako je neko vešt sa MS-Access-om, bio bih mu
....
Kao što rekoh, hvala lepo, zadržaću clipper. :)
baze.podataka.127peca.st,
Microsoft Access -- pitanje
===========================
Pitaću jednostavnu stvar koja se u potpunosti
oslanja na knjigu Vladimira Tomaševića ''Access'' (APP
Press).
Vlada na jednom mestu objašnjava šta su to M:N
relacije i daje primer radnika i projekata -- jedan
radnik može biti uključen u više različitih projekata,
a, isto tako, na jednom projektu mogu raditi posve
drugačiji radnici. Jednostavno kada se takva baza
''projektuje''.
Ono što ja pitam je: kako napraviti form-ove u
kojima bi se unosili, recimo, rakvi radnici, zatim
projekti, sve to editovalo, dodavalo, brisalo,
sortiralo...?
Da ne bih pisao više, ako je neko familijaran sa
Access-om, još bih preciznije postavio pitanje.
Hvala!
baze.podataka.128peca.st,
█ Možda bi bilo bolje da opišeš svoj problem, potrudi se sam
█ malo, ponudi neke pare za par priv. časova, pročitaj ceo
█ help...
Odgovor na svoj neprimereni ''predlog'' naći ćeš u privatnoj pošti jer tome
ovde nije mesto.
Pozdrav.
baze.podataka.129ppekovic,
>> Ono što ja pitam je: kako napraviti form-ove u
>> kojima bi se unosili, recimo, rakvi radnici, zatim
>> projekti, sve to editovalo, dodavalo, brisalo,
>> sortiralo...?
U tvom primeru imaš radnika i projekat. Dakle, model objekti
veze bi izgledao ovako:
┌──────────┐ 1:M / \ 1:M ┌────────────┐
│ RADNIK ├─────────< radi >─────────────┤ PROJEKAT │
└──────────┘ \ / └────────────┘
Prevedeno u relacioni model imaćeš recimo:
radnik( sifrad#, ime, prezime, ... )
projekat( sifproj#, naziv, ... )
radi( sifrad, sifproj )
Napravi tabele radnik, projekat i radi. Poveži tabele radnik i
radi kao i radi i projekat preko odgovarajućih atributa
(Edit/Relationships). Kardinalnosti neka budu 1:M.
Sada kreni da praviš form. Napravi form nad tabelom radi i to
tabular. Zatim, napravi form nad tabelom radnik. U taj form
umetni kao subform form nad tabelom radi koji si prethodno
napravio. To se radi tako što iz onog osnovnog database prozora,
dok edituješ form za radnike, klikneš na forms pa onda jednostavno
formu za radi preneseš na formu za radnika. To je to. Istu priču
možeš da napraviš u suprotnom smeru dakle, form:projekat,
subform:radi.
Naravno, ovo je samo osnovna ideja, za dalje pitaj konkretno
šta te muči pa da rešimo.
Paya
baze.podataka.130dbarbul,
1. Da li je neko uspeo da iz CLARION-a 3.0 poziva svoje funkcije
pisane u C-u ili asembleru.
2. Da li neko ima Top Speed asembler i/ili C.
MM Odgovori mogu i u mail.
Dule B.
baze.podataka.131bulaja,
Ima li neko objašnjenje strukture .FPT datoteka (memo polja za FoxPro
i CLipper/SIxCDX .DBF baze podataka) ili još bolje :) neki utility za
popravak oštećenih .FPT? Imam slučaj neke pobrljane baze podataka gde
se može pristupiti samo minimalnom broju tekstova u memo poljima, ali
se iz direktnog pregleda .FPT datoteke može videti da su svi tekstovi
i dalje tu, jedino ima malo djubreta u header-u :).
baze.podataka.132sinfos,
da li ima neki program koji ce da pretvori .dbf u .txt ????
baze.podataka.133jolicm,
U Clipperu postoji naredba COPY TO
Primer:
ULAZ - naziv *.dbDBF datoteke
IZLAZ - naziv TXT datoteke koja ti treba.
Use ulaz
copy to izlaz sdf
quit
ili
Use ulaz
copy to izlaz delimited
quit
kompajliraš sa clipper program
linkuješ sa: rtlink program
i to je sve
ako imaš negde blizu programera na clipperu on će ti to sigurno napraviti
za manje od minuta.
Ako ti treba univerzalan program moze se uvesti i dve GET naredbe ijedno
READ i to je sve
Pozdrav :)
baze.podataka.134nbatocanin,
> da li ima neki program koji ce da pretvori .dbf u .txt
U bilo kom xBase proizvodu upotrebi COPY TO sa opcijom DELIMITED ili
SDF.
baze.podataka.135jolicm,
Da li neko ima iskustva u radu sa klarionom,
da li vredi preći sa klipera na klarion ?
koliko je to teško za nekog ko zna clipper, c, ASM, basic, cobol.
Molim vrlo kratko koje su mu prednosti ? :)
baze.podataka.136djelovic,
> Da li neko ima iskustva u radu sa klarionom,
> da li vredi preći sa klipera na klarion ?
> koliko je to teško za nekog ko zna clipper, c, ASM, basic, cobol.
> Molim vrlo kratko koje su mu prednosti ? :)
1. Clarion kao jezik nije ništa posebno. U odnosu na, recimo, Clipper,
Clarion mu nije ni do kolena.
2. Clarion 3.X kao generator aplikacija je *fantastičan*. Aplikacije se
pomoću miša i menija pišu zaista brzo, a rade sasvim dobro. Podržava relacioni
model, rad na mreži se bira jednostavnim čekiranjem odgovarajućeg polja, itd.
3. Clarion 3.X ima toliko bagova da je za praktične upotrebe neupotrebljiv.
Bilo bi lepo ako bi neko napravio generator aplikacija kao onaj u Clarionu za
Clipper, to bi ubrzalo kreiranje aplikacija deset puta.
baze.podataka.139iboris,
Ł da li vredi preći sa klipera na klarion ?
Po meni je to "sa konja na magarca". Klarion je generator programa,
ali je, koliko sam video vrlo bagovit. Jeste da se jednostavne stvari
mnogo brzo napišu, ali zato neke malo komplikovanije stvari pucaju po svim
šavovima.
baze.podataka.140misa.m,
>> Ima li neko objašnjenje strukture .FPT datoteka (memo polja za FoxPro
Možda ti pomogne struktura FPT, od FoxPro 2.0 pa dalje:
MEMO HEADER: 00-03 Location of next free block *
04-05 Unused
06-07 Block size (bytes per block) *
08-511 Unused
Bloch HEADER & TEXT:
00-03 Block signature (indicates type of data in block) *
a. 0 - Picture field type
b. 1 - Text (memo) field type
04-07 Length of memo (in bytes) *
08-n Memo text (n=length)
* Number represented in left-to-right order in hexadecimal
Memo datoteka sadrži 1 header i više blokova. Heder sadrži adresu sledećeg
praznog bloka i njegovu veličinu koja je definisana u trenutku kreiranja
datoteke (SET BLOCKSIZE komanda).
Svi memo blokovi startuju na "even block boundary addresses"
DBF datoteka sadrži na adresi 00 tip memo datoteke:
0x03 - no memo
0x83 - FoxBase+/dBase III+ with memo
0xF5 - FoxPro with memo
0x8B - dBase IV with memo
baze.podataka.141eotek,
> da li ima neki program koji ce da pretvori .dbf u .txt ????
mozda ce ovo pomoci ????
(lista .dbf, redirekcijom u fajl, na stampac ...)
dbf2txt.zipbaze.podataka.144mmitrovic,
Imam jedan metuzalemski zahtev, treba mi format DBF fajla sa opisom
polja i mogućim vrednostima. Takođe, ali nije hitno, format index fajlova
za Dbase, Clipper i Fox. To je sve ;)
baze.podataka.146dr.grba,
>> Imam jedan metuzalemski zahtev, treba mi format DBF fajla sa opisom
>> polja i mogućim vrednostima. Takođe, ali nije hitno, format index fajlova
>> za Dbase, Clipper i Fox. To je sve ;)
HINT: knjiga "Clipper 5: Vodič za programere" by Rick Spence ne samo da
priča i analizira neke od ovih formata na kraju knjige, nego daje i alate
za čačkanje istih.
baze.podataka.147ikordic,
=> da li ima neki program koji ce da pretvori .dbf u .txt ????
Pa, ne znam za neki konkretan, ali je posao u principu trivijalan, pod uslovom
da nema memo-polja. Ako ih ima, treba samo malo više petljancije.
Najprostiji način ti je da iz dBase-a ili Fox-a uradiš COPY TO <ime>
SDF/DELINITED. Alternativno, prg bi se mogao napisati u Clipperu ili C-u. Javi
ako ti ustreba nešto takvo.
baze.podataka.148sir.oracle,
Ima jedan: JA
Koristim ga za grafiku (dijagrame) posto mi je to jeftinija varijanta
nego da kupujem Oracle Graphics. Tu i tamo odradim po neku manju
aplikaciju samo za MS Access pa imam i ja jedno par pitanja:
1) Da li se za Access 2.0 pojavio runtime (distribution kit).
2) Ako jeste da li je malo inteligentniji od onog za verziju 1.1
posto u ovome moze ladno da se izlista ceo sors. :(
3) Kako u verziji 1.1 najednostavnije uraditi upgrade aplikacije, sto
podrazumeva:
a) Backup podataka (sadrzaja tabela iz datoteke ?.mdb)
b) Kopiranje nove verzije ?.mdb
c) Restore podataka
Nemojte zuriti sa odgovorima iz 2 razloga:
1. Problem nije jednostavan (resenje mora biti 101% pouzdano) i ako
neko zuri sa resenjem, a nije prakticno probao ovo da izvede bilo
bi dobro da naznaci da je resenje teorijsko. Samo da dodam jos 2
otezavajuca uslova: U aplikaciji su definisane relacije nad tabelama
sa ogranicenjima za brisanje sadrzaja, a u novoj verziji aplikacije
kojom se vrsi upgrade menja se i struktura tabela (npr. dodaju se
nova polja u tabelama).
2. (ovaj je sigurno ubedljiviji) Na odmoru sam do 22.8.1994.
baze.podataka.149mmitrovic,
Ů█▀█Ţ HINT: knjiga "Clipper 5: Vodič za programere" by Rick Spence ne samo da
Nemam tu knjigu, niti znam nekoga da to ima.
So, ako vlasnika ne mrzi nek mi baci te formate.
baze.podataka.150isimic,
Trenutno sam u velikom poslu pa nemam vremena da ti to 'bacim', pa ako te ne
mrzi javi se na 140-019 da se dogovorimo kako da uzmeš knjigu na posluženje.
Pozdrav,
Zoran.
baze.podataka.151milanv,
║║ Ů█▀█Ţ HINT: knjiga "Clipper 5: Vodič za programere" by Rick Spence ne
║║ samo da
║║
║║ Nemam tu knjigu, niti znam nekoga da to ima.
║║ So, ako vlasnika ne mrzi nek mi baci te formate.
Iskali ste, eve vam ga :). Iz "Jedrenjaka" pravo u vaše kompjutere:
Struktura je prikazana C formatom, uz uključni fajl DBF.H:
.DBF
/***
* dbf.h
*/
typedef struct
š
char dbf_id
char last_updateŠ3Ć
long last_rec
unsigned data_offset
unsigned red_size
char fillerŠ20Ć
ć DBF_HEAD
1) 03 (hex) -> baza podataka, 83 -> memo
2) datum poslednje promene: godina (pos. 2 broja), mesec i dan
3) broj pos. zapisa. Vrednost koja se dobija sa RECCOUNT()
4) pozicija od koje počinju stvarni podaci. Vrednost zavisi
od broja obeležja u zapisu
5) vel. svakog zapisa. To je suma dužina svih obeležja +1
za znak izbrisanosti zapisa
6) 20 praznih bajtova.
.DBT
Prvih 512 bajtova su naslov. Prva četiri su tipa long i
specificiraju broj zapisa duž. 512 bajtova u datoteci, uklj. i
naslov. Ostatak naslova je neiskorišćen. Obeležje tipa memo može
da bude bilo koje dužine do 64K, a sastoji se od niz zapisa duž
512 bajtova. Posledica je da čak 511 bajtova može da ostane
neiskorišćeno (izuzetak je zapis koji završava datoteku. On
zauzima onoliko bajtova koliko mu je potrebno. Za njim sledi
znak kraja datoteke 1A.).
.FRM
short lign1 dva bajta tipa integer vrednosti 02
short exp_end sadrži sled. slobodni znak u exp_area
short exp_lengthŠ55Ć dužine izraza. Indeks je broj
izraza
short exp_indexŠ55Ć indeksi u exp_area gde
počinje svaki izraz
char exp_areaŠ1440Ć oblast gde se nalaze izrazi
indeksirani sa dve prethodne ind. prom.
FRM_FIELD fieldsŠ25Đ ima element za svako polje u
izveštaju. Prvo (indeks 0) se ne koristi
short title_exp_num broj izraza za niz znakova naslova
short grp_on_exp_num broj izraza za podgrupu (SUB
GROUP ON)
short grp_head_exp_num broj izraza za niz znakova
naslova za grupu. Nije izraz!
short sub_head_exp_num broj izraza za niz znakova za
podgrupu
short page_width širina strane
short line_per_page broj linija po strani
short left_marg veličina leve margine
short right_marg
short num_of_cols broj kolona (ili obeležja)
char dbl_space Y ili N. Da li se koristi
dvostruk8i prored ili ne
char summary Y ili N. Da li se koristi
sažet izvištaj ili ne
char eject Y ili N. Novi list za svaku grupu?
char plus_bytes ind ravnih izveštaja u
verzijama pre dB III+. Sada sadrži vred. u tri bita:
izbacivanje lista pre štampanja
izbacivanje lista posle štampanja
ravan izveštaj
short sign2 nije opisano
Za svako polje izveštaja postiji strukura FRM_FIELD koja se
čuva u indeksiranim prom. polja prethodno opisanih. Svaka od
njih ima sled. format:
short width širina u kojoj se štampa polje
short pad1 znak za popunjavanje od dva bajta
char total da li se sumira brojčano obeležje
char dec broj decimalnih mesta za
brojčana obeležja
short exp_contents broj izraza za sadržaj polja
exp_header broj izraza za niz znakova
naziva polja. Niz znakova, ne izraz!
Uh! Toliko za sada. Preostali su: .LBL, .MEM, .NTX i .NDX.
Loži nekog drugog da mi pomogne. Ako ti ne uspe :) a neophodan
ti je još neki tip fajla, viči...
Pozdrav, Milan.
baze.podataka.152ndragan,
/ Kako u FOXPRO-u dobiti podatke o kirisnicima, grupama ...
/ na NOVELL NetWare operativnom sistemu
Beats me. Sys(0) daje "# 0" kao da uopšte nisi u mreži (čak je glupa
mala RPTI mreža lepo javljala "DINGO #264"). Jedino što sam dosad
smislio je jedno
Set ime="%LOGIN_NAME"
u startup.ncf, bar da znam ko se javio. Posle iz aplikacije
ko_sam=GetEnv("ime")
do case
case ko_sam="PPeric"
...
Novel 4.0 je ladno zadržao velika i mala slova onako kako se pojavljuju
u listi objekata, ne šmirglajući 5/100 to što sam se prijavljivao kao
pPeric, PpErIc itd, uvek je bilo PPeric, sečeno na osam znakova ako je
duže.
Trebalo bi malo pročešljati netware.plb, možda ima nešto, takođe i
foxtools.plb (odnosno .fll u pendžerskoj verziji).
baze.podataka.153ndragan,
/ Ispravka! Ne radi! Odnosno, radi, ali sa još čudnijim efektima. Kad se
/ prvi
2.5 je možda malo bagovit, ali zar ne treba da proveriš da takva šifra
postoji u drugoj bazi, i to valjda ovako:
:v=a.sifra=b.sifra ;
tj da zahtevaš da se u b zoni upravo nalazi ono što si ukucao u a.
baze.podataka.154bulaja,
**** new file ****
R:\IBMPC\C\*.*
----------------------
bltc18z zip 256858 Bullet for C 1.03z: B-tree/dBase (DBF) database toolkit
BULLET is a super-fast, super-small B-tree/dBASE .DBF, transaction-based,
multi-user database toolkit for DOS C/C++ compilers. Also availble for BASIC.
BULLET DOS C version 1.08z, 01-Aug-94.
baze.podataka.156iritel,
Potreban mi je mali savet ili preporuka.
Radi se o sledecem: U jednoj aplikaciji pisanoj u C-u, koja radi
pod SCO Unix-om, potrebno je dograditi odredjeni skup funkcija za
rad sa bazama podataka (DBF format). Kako to najlakse resiti ?
Postoji li neka biblioteka C funkcija za ovakve namene ?
Ili neki drugi alat ?
Unapred zahvalan, Zoran Miljkov
baze.podataka.157djelovic,
> rad sa bazama podataka (DBF format). Kako to najlakse resiti ?
> Postoji li neka biblioteka C funkcija za ovakve namene ?
Pogledaj u C direktorijumu, imaš tamo neke biblioteke sa izvornim kodom
koje bi ti mogle poslužiti. Jedna od njih je CBASE*.
baze.podataka.158ndragan,
Jel ima neko pojma kako u lisici za prozore (fox4win) promeniti font kojim
se ispisuju meniji i (fox style) help? Onaj difolt fixedsys je ogavan (bar
da koristi neku krupniju verziju), a foxprint.fon u helpu je još gori.
_više_ sam popizdeo.
Bue_ NDragan
baze.podataka.159djelovic,
> Jel ima neko pojma kako u lisici za prozore (fox4win) promeniti font kojim
> se ispisuju meniji i (fox style) help? Onaj difolt fixedsys je ogavan (bar
> da koristi neku krupniju verziju), a foxprint.fon u helpu je još gori.
To nema veze sa Foxom već sa Windowsima. Da bi promenio taj font moraš da
izmeniš stavku "fixedsys=..." u SYSTEM.INI. Ili uzmi program SYSFON iz
Sezamovih dirova, ona ti daje "vizuelni" izbor fonta.
Što se tiče helpa, mislim da nema šanse da izmeniš font. Fontovi
upotrebljeni u .HLP datotekama su tamo "ugrađeni", pa nikakvo menjanje
sistemskih fontova ne pomaže.
baze.podataka.160iritel,
>>> rad sa bazama podataka (DBF format). Kako to najlakse resiti
>>> ? Postoji li neka biblioteka C funkcija za ovakve namene ?
>>
>> Pogledaj u C direktorijumu, imas tamo neke biblioteke sa
>> izvornim kodom koje bi ti mogle posluziti. Jedna od njih je
>> CBASE*.
CBASE sam skinuo i pogledao pre nego sto sam poslao poruku. Iz onoga sto
tamo pise nisam zakljucio da radi sa DBF formatom zapisa, pa sam od toga
digao ruke. Voleo bih da sam brzopleto pogresio, medjutim na osnovu tvoga
odgovora ne mogu da zakljucim sta mi je ciniti: da li da preispitam svoj
zakljucak ili da trazim dalje.
Da pojasnim pitanje: hoce li baza podataka kreirana pomocu programa zasno-
vanog na CBASE biblioteci biti citljiva pomocu npr. DBASE-a ili FOX-a ?
Pozdrav, Zoran Miljkov
baze.podataka.161djelovic,
> Da pojasnim pitanje: hoce li baza podataka kreirana pomocu programa
> zasnovanog na CBASE biblioteci biti citljiva pomocu npr. DBASE-a
> ili FOX-a ?
Ne mogu da tvrdim 100%, ali mislim da CBASE piše datoteke u DBF formatu.
baze.podataka.162ndragan,
/ Što se tiče helpa, mislim da nema šanse da izmeniš font. Fontovi
/ upotrebljeni u .HLP datotekama su tamo "ugrađeni", pa nikakvo menjanje
Nisam bio precizan, mislio sam na dos-style help, dakle sa foxhelp.dbf a
ne sa .hlp; radi se u stvari o samom foksovom help prozoru, koji
formalno ne postoji (Wexist("help") daje .f., valjda... hm, to još nisam
probao), a font u njemu čak nije fixedsys, nego foxprint, koji lepo
prikazije dosove q&q (kuke+kvake) ali uz podršku za 852 (a moram da je
držim, pošto radim naizmenično mađarsku i srpsku verziju) uglovi na
okvirima koji imaju nešto jednostrukih i nešto dvostrukih strana bivaju
zauzeti nekim tamo rumunskim, poljskim i turskim slovima. Drugi problem
je što sve popapove ispisuje fixedsys ako je normalan, odnosno sa
foxprint i to jako sitnim ako popap ima naslov (nešto kao emulira dos
verziju, pa radi toga), što onda ruši kompletnu šminku u ostatku
aplikacije.
Ako treba da se promeni system.ini ili tako nešto iz samog foksa, ili da
se krne neki font gde mu mesto nije, postoji bogat sloj funkcija u
foxtools.fll, tako da nije problem pozvati bilo koji .dll ili sistemsku
funkciju pendžera, samo treba znati dva detalja, ime i parametre ;).
Inače, za .hlp može da se definiše font, ali prilikom kompajliranja help
fajla. Bogami me namučio .RTF format, pošto mali mekani insistira na
tome da se .rtf piše iz Vorda 'ili drugog editora koji može da radi .rtf
format'. Kod mene se help iz dos verzije aplikacije već nalazi u nekoj
bazi gde se lako menja dodaje itd, i ne pada mi na pamet da ga sad
izvozim u nekakav .txt pa ručno prečačkavam u .rtf edabi se dalo
prekompajlirati u .hlp, nego sam morao da provaljujem .rtf format i
bogami uzeo mi je nekoliko dana dok nisam napravio rutinu za prepis iz
moje baze u .rtf format. Još nisam zadovoljan rezultatom, ali bar radi i
može da se čačka do mile volje.
Vord, naravno, odbija da čita takav fajl (tvrdi da to nije .RTF ili samo
javlja da ne može da ga otvori), ali ga hc31.exe ladno čita i pravi .hlp
fajl.
Ako nekog zanima kako na pešački način napisati .rtf za help, mogu da
bačim koji hint. Za neke stvari baš nisam siguran šta i kako rade,
jednostavno sam prepisivao iz onog jednog primera i mućkao dok nije
proradilo.
Hm, odužih. Tako je to kad tri godine čantram kako ne podnosim pendžere
i na kraju moram da radim u njima. Bljah.
baze.podataka.163leonardo,
Hi, zamolio d.petrovic da vas pitam:
Koju relaionu bazu podataka za rad pod unix-om preporucujete ?
baze.podataka.164iritel,
>> Ne mogu da tvrdim 100%, ali mislim da CBASE pise datoteke u DBF formatu.
Hvala na odgovoru.
Zoran Miljkov
P.S. Ako je neko probao CBASE nek bude ljubazan da javne. Ako ostanemo bez
odgovora krecemo u "istrazivanje".
baze.podataka.165pele,
Mojoj drugarici je potreban neko ko bi joj uradio bazu podataka u
fortranu. Za tu uslugu je spremna da plati.
Ostale informacije i ponude na meni na mail.
pele.
baze.podataka.166ikordic,
=> Pogledaj u C direktorijumu, imaš tamo neke biblioteke sa izvornim
=> kodom koje bi ti mogle poslužiti. Jedna od njih je CBASE*.
Ima li neko iskustva sa ovim? Komfor, brzina, pozdanost, neka paralela sa
Clipper-om, ...
baze.podataka.167djelovic,
> Ima li neko iskustva sa ovim? Komfor, brzina, pozdanost, neka paralela sa
> Clipper-om, ...
Nije ni do kolena Clipperu.
baze.podataka.168nbatocanin,
> Da pojasnim pitanje: hoce li baza podataka kreirana pomocu
> programa zasno- vanog na CBASE biblioteci biti citljiva
> pomocu npr. DBASE-a ili FOX-a ?
Ovo ne znam, ali znam da sa CodeBase hoće.
baze.podataka.169vitez.koja,
#=> Ako nekog zanima kako na pešački način napisati .rtf za
#=> help, mogu da bačim koji hint. Za neke stvari baš nisam
Slobodno :)
baze.podataka.170iritel,
>> Ovo ne znam, ali znam da sa CodeBase hoce.
A postoji li verzija CodeBase-a za SCO Unix (ja sam video da se pominju samo
verzije za DOS i Windows) ?
Pozdrav, Zoran Miljkov
baze.podataka.171max.headroom,
Možda nekome ko radi sa Fox-om bude interesantno:
Funkcija NETWARE() - poziva Novell-ov API
Novell-ov NetWare API radi sa "paketima". Potrebna su dva paketa:
Request i Reply. Prva dva bajta oba paketa sadrže njihove dužine.
Ostatak sadržaja paketa varira u zavisnosti od toga koju funkciju
API-ja pozivamo. Koristeći f-ju FP_INT86() za DOS, moguće je kreirati
posebnu funkciju za pozivanje NetWare API-ja. Pozivanje API-ja se
sastoji iz sledećih koraka:
1. Kreiranje REQUEST paketa. To je FoxPro string koji sadrži razne
podatke potrebne API-ju.
2. Kreiranje praznog REPLY paketa, koji mora biti dovoljno veliki da
primi podatke vraćene od API-ja.
3. Punjenje DOS registara, što podrazumeva broj API f-je i pointere na
REQUEST i REPLY pakete.
4. Izvršavanje DOS interapta.
5. Uklanjanje bajtova koji označavaju dužinu sa početka REPLY paketa.
6. Vraćanje error koda DOS poziva.
FUNCTION NetWare
PARAMETERS nService,cRequest,cReply
DIMENSION aRegs(10)
PRIVATE nReturn
nReturn = -1
aRegs(1) = nService * 256
aRegs(8) = CHR(LEN(cRequest))+CHR(0)+cRequest
aRegs(5) = .T.
aRegs(9) = CHR(LEN(cReply))+CHR(0)+cReply
aRegs(6) = .F.
IF fp_int86( 33, čaRegs )
nReturn = aRegs(1) % 256
IF nReturn < 0
nReturn = nReturn + 256
ENDIF
ENDIF
cReply = SUBSTR(aRegs(9),3)
RETURN nReturn
baze.podataka.172max.headroom,
A evo i malo funkcija za komforniji rad sa NetWare-om:
U pitanju je skup rutina koje konvertuju NetWare rezultate u format
razumljiv Fox-u. Kada NetWare vrati string, ovaj se završava NULL
bajtom. Da bi Fox sa ovakvim stringom mogao dalje da barata, NULL bajt
i svi ostali iza njega moraju biti "otkinuti". Obrnuto, kada se
stringovi prosleđuju NetWare-u, moraju biti prekrojeni na odgovarajuću
dužinu i "ukrašeni" NULL bajtom. Slično je i sa brojevima, od kojih
NetWare razlikuje: bytes, integers i long integers.
----------------------------------------------------------------------
* SVRHA: F-ja uklanja sve karaktere koji slede iza NULL karaktera,
* uključujući i njega samog.
* SINTAKSA: <cString> := CleanStr(cNovellString)
* ARGUMENT: cNovellString - string koji je vratila neka Novell API
* f-ja.
FUNCTION CleanStr
PARAMETER cString
PRIVATE x
x = AT(CHR(0),cString)
RETURN IIF(x=0, cString, SUBSTR(cString, 1, x-1)
* SVRHA: F-ja popunjava string sa NULL karakterima
* SINTAKSA: <cLstring> := Lstring(cString,nSize)
* ARGUMENTI: cString - Bilo koji string
* nSize - Dužina stringa koji se kreira
FUNCTION Lstring
PARAMETERS cString, nSize
RETURN CHR(nSize)+PADR(ALLTRIM(cString), nSize, CHR(0))
* Novell INTEGER -> FoxPro
FUNCTION Int2Fox
PARAMETER cInteger
PRIVATE nValue
nValue = 256 * ASC(cInteger) + ASC(SUBSTR(cInteger,2,1))
RETURN nValue
* FoxPro -> Novell INTEGER
FUNCTION Fox2Int
PARAMETER nValue
RETURN CHR( nValue / 256 ) + CHR( nValue % 256 )
* Novell LONG INTEGER -> FoxPro
FUNCTION Long2Fox
PARAMETER cInteger
PRIVATE nValue
nValue = ASC(SUBSTR(cInteger,1,1)) * 65536 + ;
ASC(SUBSTR(cInteger,2,1)) * 4096 + ;
ASC(SUBSTR(cInteger,3,1)) * 256 + ;
ASC(SUBSTR(cInteger,4,1))
RETURN nValue
* FoxPro -> Novell LONG INTEGER
FUNCTION Fox2Long
PARAMETER nValue
RETURN CHR( nValue/65536 ) + ;
CHR( nValue%65536 )/4096 + ;
CHR( nValue%4096 )/256 + ;
CHR( nValue%256 )
* Šestocifreni INTEGER string -> FoxPro num.
FUNCTION Six2Fox
PARAMETER cInteger
RETURN ASC(SUBSTR(cInteger,1,1)) * 16777216 + ;
ASC(SUBSTR(cInteger,2,1)) * 1048576 + ;
ASC(SUBSTR(cInteger,3,1)) * 65536 + ;
ASC(SUBSTR(cInteger,4,1)) * 4096 + ;
ASC(SUBSTR(cInteger,5,1)) * 256 + ;
ASC(SUBSTR(cInteger,6,1))
* FoxPro num. -> long (šestocifreni) string
FUNCTION Fox2Six
PARAMETERS nValue
RETURN CHR( nValue/16777216) + ;
CHR((nValue%16777216)/1048576) + ;
CHR((nValue%1048576)/65536) + ;
CHR((nValue%65536)/4096) + ;
CHR((nValue%4096)/256) + ;
CHR(nValue%256)
Eto, to je to. Uskoro spuštam još neke zanimljivosti vezane za
konkretno korišćenje pomenutih funkcija, rad sa BINDERY-jem, itd.
baze.podataka.173bulaja,
│A postoji li verzija CodeBase-a za SCO Unix (ja sam video da se pominju
│samo verzije za DOS i Windows) ?
└───
Uz CodeBase se dobija source cele biblioteke koji bi trebao da može da
se portuje na UNIX.
baze.podataka.174nbatocanin,
>>> Ovo ne znam, ali znam da sa CodeBase hoce.
>
> A postoji li verzija CodeBase-a za SCO Unix (ja sam video
> da se pominju samo verzije za DOS i Windows) ?
Koliko znam postoji, ali je nisam video. Ceo CB je dat u sorsu,
ali čini mi se da ima delova za najniži pristup u ASM-u. Jedan moj
prijatelj je preradio DOS verziju za Xenix i kaže da je proradilo,
ali da je imao problema.
Njegov izbor za baze na Unixu je ipak Fox - pri proceni ove izjave
treba imati u vidu da je taj tip prvo naučio C, pa onda srpski ;)
baze.podataka.175milanv,
Prvi put sam se suočio sa .MDB bazama (Access 1.1 iz Visual
Basic-a 3.0) i oduševio se kada sam uporedio karakteristike sa
.DBF bazama Clipper-a. Međutim, već prilikom prve upotrebe iste
naleteo sam na kosku, pa pitam: Da li je zaista moguće da već
uneta polja u tabelu nije moguće modifikovati (ime, tip, dužina)
ni dok podaci nisu uneti, a kamoli kada se unese gomila istih???
Da li postoji neki program za laku manipulaciju tim bazama,
tipa DBU za .DBF? Za sada mi je na raspolaganju Data Menager iz
VB. (Nemojte mi preporučivati Access:).
Kako najlakše prebabaciti stotine kilobajta podataka iz
.DBF u .MDB?
Hvala, unapred.
baze.podataka.176mdrazic,
Za ljubitelje Clipper-a i UNIX-a:
prekucavam reklamu za Recital softver (bez prevođenja zbog vremena):
Recital brings the power of Clipper to UNIX
The latest version of Recital for UNIX can now read and update
native Clipper-database and index files. No file conversion is needed.
Recirtal supports most Clipper commands and functions, and allows
Clipper applications and data developed in MS-DOS to run under the UNIX
operating system. Recital is the only Xbase product in the world that
offers compatibility with FoxPro, dBase IV, and Clipper. Clipper
applications running on UNIX use full color support with the look and
feel of PC applications.
Recital also connects in to most SQL database products on UNIX,
including Oracle, Informix, DB2, and Sybase.
Recital for UNIX is available for all major UNIX platforms
including Intel 386/486/Pentium, IBM RS/6000, SUN SPARC, HP9000,
Digital Alpha/AXP and many more.
Recital for UNIX can share data and applications with Clipper
running on MS-DOS using portable Netware for UNIX or PC/NFS.
(sada ide malo beznačajne žvake...)
Includes: Integrated data dictionary
dBase IV 2.0 with Object-oriented extensions
Supports Clipper extend system on UNIX
Supports FoxPro windowing, Browse, and much more...
Recital Corporation
USA: 508-750-1066, fax: 508-750-8097
UK & International: +44-(0)344-301444, fax: +44-(0)344-300689
O istom paketu iz Buyer's Guide-a:
Recital
Recital, Danvers, MA
508-750-1066, 800-873-7443
A fourth-generation application development environment with
a client/server architecture ideal for application development and
system migration. Developers can use Recital's 4GL tools to build
applications portable to VAX/VMS, OpenVMS, OSF/1, HP MPE/XL, DOS,
Motif, Windows, and more than 70 Unix platforms. The Recital tool
set includes an object oriented active data dictionary, event-driven
triggers, before- and after-image journaling, screen painter, report
writer, pop-up and pull-down menuing, dialog boxes, support for SQL,
and support for Ethernet and NetWare networks. Also includes an open
API for incorporating 3GL objects as built-in Recital executables.
Recital is compatible with widely used PC application development
languages such as dBASE IV, dBASE III Plus, FoxBase, FoxPro, and
CA-Clipper. Applications and data may be migrated to more than 70
platforms without program modification. Recital server interface and
SQL Gateways provide read/write access to Oracle, Sybase, DB2/6000,
Rdb, and Informix.
O ceni nigde ni pomena.
Baš ga nahvališe. Da pola u vodu bacimo, ipak ostaje još pola.
baze.podataka.177max.headroom,
Elem, napomenuh da ću da spustim nešto što bi FoxPro programeru
pomoglo da lakše barata BINDERY-jem NetWare-a. Dakle:
BINDERY je baza podataka o korisnicima (users), grupama (groups),
print queue-ovima i sličnim bitnim stvarima, a nalazi se na svakom
file-serveru. Koristeći Bindery, file-server proverava user ID,
lozinke i pristupe korisnika queue-ovima i direktorijumima (njim se
određuje čak i prostor na disku koji svaki od korisnika može da
zauzme). Mreža otvara bindery fajlove kada se pokrene i ostavlja ih
otvorenim i zaključanim sve vreme. Samo supervisor može da ih zatvori.
SYSCON je program koji omogućava direktno ažuriranje ovih podataka iz
DOS-a.
Bindery je organizovan kao skup objekata. Objekat može biti "client"
ili "server". Korisnici su "clients", na primer, a print queue je
"server". Svaki objekat ima ime, tip i određeni broj setovanja koji su
mu pridruženi (uz svako setovanje, logično, ide i jedna ili više
brojnih vrednosti).
OBJEKTI - iako Bindery može da ima do 65000 objekata, ovaj broj ne bi
trebao biti veći od 1000. Objekat može biti "user", "gruop" ili
"resource". Na primer, IVANA može biti korisnik u grupi ZAPOSLENI, a
koja ima pristup LASER_PRINT_QUEUE-u. Koristeći Bindery možemo
odrediti da li korisnik IVANA ima pravo pristupa laserskom printeru.
Svaki objekat se sastoji od sledećih pet delova:
- Object ID - broj dodeljen od strane NetWare-a za svaki objekat. To
je četvorobajtni integer (unique za celu mrežu).
- Object Name - string koji predstavlja ime objekta. Za "user"
objekat, to može biti npr. ime korisnika. String može biti dugačak
najviše 47 karaktera.
- Object Type - numerička vrednost koja određuje tip objekta. Sledeća
tabela prikazuje dozvoljene tipove:
Vrednost Tip objekta
-------- ------------------------------------
1 Korisnik (user)
2 Grupa korisnika (user group)
3 Print queue
4 File server
5 Job server
6 Gateway
7 Print server
8 Archive queue
9 Archive server
10 Job queue
11 Administration
33 NAS SNA gateway
35 Async gateway
36 Remote bridge server
38 Async bridge
40 X.25 bridge
45 Time synchronization server
46 Archive server
71 Advertising print server
80 Btrieve value-added Process
83 Print queue user
162 Bindery
163 Oracle DB server
167 Rconsole
(dva ili više objekata mogu imati isto ime, ali im tipovi moraju biti
različiti)
- Object Flag - pokazuje da li je objekat "static" ili "dynamic".
Dinamički objekti su privremeni i brišu se pošto se mreža spusti.
Statički objekti ostaju u Bindery-ju dok se implicitno ne uklone.
- Object Security - read-write pristup za svaki objekat, označava da
li definisanom objektu mogu ppristupiti drugi objekti. To je
jednobajtna vrednost: prva 4 bita ukazuju na write-security,
poslednja 4 na read-security. Dozvoljene su sledeće kombinacije:
Vrednost Značenje
-------- ------------------------------
0 Svako može pristupiti objektu
1 Korisnici ulogovani na server
2 Samo tekući objekat
3 Samo supervisor
4 Samo NetWare operativni sistem
PRONALAčENJE OBJEKATA
NetWare sadrži API f-ju koja se može iskoristiti da prikaže listu
svih objekata sa zadatim tipom. F-ja N_SCANBINDERY() uzima tip objekta
i matricu kao parametre, a vraća broj pronađenih objekata. Ona takođe
popunjava matricu sa svim objektima koji odgovaraju zadatom tipu.
* SINTAKSA: nCount = N_ScanBindery ( nType, čaObjects )
* ARGUMENTI: nType - tip objek(a)ta koji će biti vraćeni
* aObjects - matrica sa objektima zadatog tipa
FUNCTION N_ScanBindery
PARAMETERS nType,aObjects
PRIVATE cBuffer,cRequest,nCount,cList,x,y,z
nCount = 0
cBuffer = SPACE(57)
cRequest = CHR(55) + CHR(255) + CHR(255) + CHR(255) + ;
CHR(255) + CHR(0) + CHR(nType) + Lstring("*",48)
cList = ""
DO WHILE NetWare( 227, cRequest, čcBuffer ) == 0 .AND. ;
LEN(TRIM(cBuffer)) > 0
*** Izdvoj ime objekta i smesti ga u matricu
nCount = nCount + 1
cList = cList + CleanStr(SUBSTR(cBuffer,7,48))+";"
cRequest = SUBSTR(cRequest,1,1) + SUBSTR(cBuffer,1,4) + ;
SUBSTR(cRequest,6)
ENDDO
IF nCount > 0
DIMENSION aObjects(nCount)
z = 1
FOR x = 1 TO nCount
y = AT(";",cList,x)
aObjects(x) = SUBSTR(cList,z,y-z)
z = y + 1
NEXT
ENDIF
RETURN nCount
----------------------------------------------
baze.podataka.178max.headroom,
Ima li neko opis hedera DBF fajla (FoxPro)? Pravio sam neku sitnu
rutinu koja podiže bazu kada joj se uništi heder, ali sam naleteo na
kosku pokušavajući da "povratim" sadržaje Memo polja. Video sam da to
ne radi ni FILEFIX iz Nortonovog paketa... Hmh...
(Zar ne bi bilo sjajno kada bi napravili univerzalnu f-ju za otvaranje
baza, a ako joj je slučajno oštećen heder ili neki indeks sve se
automatski recover-uje i korisnik nema potrebu za reindex-om? :) Sve
sam ja to lepo složio u makinu, kad ono - MEMO polja mogu da
pozdravim...)
baze.podataka.180max.headroom,
A sada evo i konkretnog primera korišćenja N_ScanBindery f-je:
DIMENSION aUsers(1)
IF N_ScanBindery(1,čaUsers) = 0
WAIT "Nema ni jednog korisnika" WINDOW TIMEOUT 30
ENDIF
Navedeni program vraća listu (aUsers) NetWare korisnika.
ODREĐIVANJE SIGURNOSNOG NIVOA
Evo i funkcije kojom se određuje sigurnosni nivo. Argument može biti:
U - korisnikov User ID
R - read security
W - write security
* SINTAKSA: xReturn = N_BindLevel( cOption )
* ARGUMENT: cOption = R - Read security
* W - Write security
* U - User ID
FUNCTION N_BindLevel
PARAMETERS cWhich
PRIVATE cBuffer, cRequest, xAnswer, y
IF PARAMETERS() = 0
cWhich = "U"
ENDIF
cBuffer = SPACE(5)
cRequest = CHR(70)
xAnswer = -1
IF Netware(227, cRequest, čcBuffer) == 0
DO CASE
CASE cWhich = "R"
y = ASC(cBuffer)%16
xAnswer = SUBSTR("ALOSN",y+1,1)
CASE cWhich = "W"
y = INT(ASC(cBuffer)/16)
xAnswer = SUBSTR("ALOSN",y+1,1)
OTHERWISE
xAnswer = Long2Fox(SUBSTR(cBuffer,2,4))
ENDCASE
ENDIF
RETURN xAnswer
--------------
Read/Write sigurnosni nivoi se sastoje od slova koja označavaju nivo
objekta. Značenja:
SLOVO SIGURNOSNI NIVO
----- -------------------
A Svako može da pristupi objektu
L Samo korisnici logovani na server
O Samo tekući objekat
S Samo supervisor
N Samo NetWare OS
baze.podataka.181max.headroom,
IDENTIFIKOVANJE OBJEKATA
Kada ste dobili ime objekta ili njegov ID, pomoću tih informacija
možete njime dalje manipulisati i/ili dobiti neke nove informacije.
Doleprikazana funkcija N_OBJECTNAME() vraća ime objekta, ako se kao
argument zada ID objekta. Koristeći ovu f-ju zajedno sa N_BINDLEVEL()
f-jom (ranije prikazana) možete dobiti ime korisnika trenutno
ulogovanog na mrežu.
* SINTAKSA: cName = N_ObjectName ( nID )
* ARGUMENT: nID - ID objekta
* REZULTAT: cName - Ime objekta u Bindery-ju
FUNCTION N_ObjectName
PARAMETER nID
PRIVATE cBuffer, cRequest, cName
cBuffer = SPACE(54)
cRequest = CHR(54) + Fox2Long(nID)
cName = ""
IF Netware(227, cRequest, čcBuffer) == 0
cName = CleanStr(SUBSTR(cBuffer,7))
ENDIF
RETURN cName
------------
Takođe je moguće odrediti obj. ID ako kao argument zadate ime objekta.
Evo i f-je nazvane N_OBJECTID() koja kao parametar uzima ime i tip
objekta, a kao rezultat vraća njegov ID:
* SINTAKSA: nIDcode = N_ObjectID( <cObject>,<nObjType> )
* ARGUMENTI: cObject - ime objekta
* nObjType - tip objekta
* REZULTAT: nIDcode - ID objekta iz Bindery-ja
FUNCTION N_ObjectID
PARAMETERS cObject, nObjType
PRIVATE cBuffer, nID, cRequest
cBuffer = SPACE(54)
nID = 0
cRequest = CHR(53) + CHR(0) + CHR(nObjType) + Lstring(cObject,48)
IF Netware(227, cRequest, čcBuffer) == 0
nID = Long2Fox(SUBSTR(cBuffer,1,4))
ENDIF
RETURN nID
----------
ODREĐIVANJE KORISNIžKOG ID-a
Funkcije N_BINDLEVEL() i N_OBJECTNAME() mogu biti kombinovano
korišćene da bi se dobila treća f-ja, zvana N_WHOAMI(), a koja vraća
ID tekućeg korisnika.
* SINTAKSA: cUser = N_WhoAmI()
* ARGUMENT: NEMA
* REZULTAT: cUser - Ime objekta za tekućeg korisnika
FUNCTION N_WhoAmI
PRIVATE nID, cUser
nID = N_BindLevel("U")
cUser = ""
IF .NOT. EMPTY(nID)
cUser = N_ObjectName(nID)
ENDIF
RETURN cUser
(Ako gušim sa ovakvim porukama neka mi neko skrene pažnju, da vam ne
bih punio PAD-ove nepotrebnim informacijama. Međutim, iako je tema
poprilično suvoparna, da se zaključiti da nekada i nekome može
poslužiti da uspostavi "prisnije" veze između Novell-a i Fox-a :) Osim
toga, neka neki Fox_User napiše svoja rešenja po pitanju ovakve
problematike. Sve mi se čini da je malo ko probao u svojim
aplikacijama slične radikalnije zahvate ovakve vrste... Znam, znam,
provaljuje se FoxPro for Win, ali to nije razlog da se zapuste i
ostali elementi ;) )
baze.podataka.182djelovic,
> Ako gušim sa ovakvim porukama neka mi neko skrene pažnju, da vam ne
> bih punio PAD-ove nepotrebnim informacijama.
Naprotiv, hvala na veoma zanimljivim prilozima. Jesi li razmišljao da sve
ovo skupiš u jednu biblioteku, pa da je Bulaja stavi u dir?
baze.podataka.184max.headroom,
> Naprotiv, hvala na veoma zanimljivim prilozima. Jesi li
> razmišljao da sve ovo skupiš u jednu biblioteku, pa da je
> Bulaja stavi u dir?
Nikakav problem - jedino će mi trebati pola meseca vremena da
pripremim materijal :)
P.S.
Da li je neko video kakvo zanimljivo rešenje izbegavanja komande PACK?
Ovo je valjda sa PC PLUS BBS-a:
- baza je indeksirana
- podaci koji su predviđeni za brisanje markiraju se sa DELETE
- čim se podatak briše (DELETE), odmah potom mu se polje po kome je
indeksirano napuni nulama ili spejsovima, zavisno od tipa
- na taj način polje stiže na vrh baze
- pre nego što se uradi bilo koji sledeći APPEND BLANK, proveri se
ima li takvih brisanih polja u bazi
- ako ih ima, obrisati prvom sadržaj i popuniti ga novim sadržajem
- ako ih nema, tada se ipak radi APPEND BLANK
Na taj način se sva polja markirana za brisanje koriste pri unosu
novih podataka u bazu i komanda PACK gubi smisao :) Stvarno zanimljivo
rešenje. (Dobro, ovo nikome ne pada na pamet da koristi iz stojednog
razloga, ali hint je interesantan)
baze.podataka.185djelovic,
> - podaci koji su predviđeni za brisanje markiraju se sa DELETE
> - čim se podatak briše (DELETE), odmah potom mu se polje po kome je
> indeksirano napuni nulama ili spejsovima, zavisno od tipa
> - na taj način polje stiže na vrh baze
> - pre nego što se uradi bilo koji sledeći APPEND BLANK, proveri se
> ima li takvih brisanih polja u bazi
> - ako ih ima, obrisati prvom sadržaj i popuniti ga novim sadržajem
> - ako ih nema, tada se ipak radi APPEND BLANK
Stari trik :), barem za Klipete :). Doduše, ukoliko baza podataka koju
koristiš podržava selektivno indeksiranje, onda je ipak bolje da obrisani
slogovi ne opterećuju indeks, već da ih pakuješ u nekakvu uvezanu listu.
baze.podataka.186dr.grba,
>> Na taj način se sva polja markirana za brisanje koriste pri unosu
>> novih podataka u bazu i komanda PACK gubi smisao :) Stvarno zanimljivo
>> rešenje. (Dobro, ovo nikome ne pada na pamet da koristi iz stojednog
>> razloga, ali hint je interesantan)
Ovaj hint je već viđen u "Računarima", tridesetak brojeva unazad...
baze.podataka.187jolicm,
Ja koristim to isto da bih izbegao pack, ali sa dodatkom:
Tvoj predlog ima manu (slogovi ulaze u obične indekse)
Ja samo obrišem slog koji zelim sa delete
Datoteka pored redovnih indeksa ima i jedan dodatan:
index on deleted() to nazivindeksa
i zatim kada mi zatreba append blank
uradim:
set order to nazivdelindeksa
dbseek(.t.,.f.)
i ako je nadjen slog vršim recal i odgovarajucu popunu. :)
baze.podataka.188milanv,
Nije valjda da se niko ne razume u .MDB-ove, ili da
poznavaoci istog nemaju ni malo dobre volje :(.
Naročito mi je važan odgovor na pitanje kako podatke iz
.DBF prebaciti u .MDB.
baze.podataka.189nkbog,
> Nije valjda da se niko ne razume u .MDB-ove, ili da
> poznavaoci istog nemaju ni malo dobre volje :(.
> Naročito mi je važan odgovor na pitanje kako podatke iz
> .DBF prebaciti u .MDB.
Jedan jako logičan odgovor u obliku pitanja: Pomoću Accessa? Ili VB-a?
Drugi odgovor zašto konvertovat - Access engine radi i sa DBF tabelama.
Stranu na šalu, .MDB nema baš jednostavan format poput .DBF-a jer
jedan je MDB jedna baza podataka: više tabela, više indeksa itd.
Najjednostavniji način je da kreiraš tabelu u Access formatu i traženom
MDB-u, a iste strukture kao tvoj DBF, da otvoriš DBF kao external table
i da jednostavno iskopiraš sve slogove iz DBF u MDB, zatim isklučiš DBF
i gotovo. Pogledaj dokumentaciju (elektronsku barem ;)) o tome kako
se otvaraju eksterne tabele i baze podataka.
NB.
baze.podataka.191max.headroom,
Kako uspostaviti DDE vezu FoxPro-a for Win sa nekom drugom Win
aplikacijom? Ništa lakše. "črtva" je Excel :)
Evo jednog prostog primera - pre nego što se bacite na matematike
potrebno je napraviti jedan Excel "formular" u koji će se smeštati Fox
podaci i iz kojeg će se vaditi rezultat. Neka se ta tabela zove
PROBA.XLS i neka izgleda ovako:
-------------------------------------------------
A B C
-------------------------------------------------
1 TIP CENA
2
3 Cigarete 100.00
4 Piće 250.00
5 Diskete 400.00
6
7 ZBIR: 750.00 <-- SUM komanda u Excel-u
-------------------------------------------------
Iz Fox-a se zadaju cene pojedinačnih artikala, a u Fox vraćamo
rezultat koji se nalazi u polju C7 (ZBIR).
Da bi uopšte uspostavili vezu za Excel-om potrebno je uveriti se da je
on pokrenut. Najjednostavnija varijanta je startovati Excel zajedno sa
dokumentom:
RUN /N7 EXCEL.EXE PROBA
/N svič ukazuje na to da je aplikacija koja se pokreće "true Windows"
aplikacija, a /N7 kazuje da će aplikacija biti minimizovana i da će
biti "inactivated", tj. da će se na ekranu vrteti samo Fox prozor.
Sledeća komanda uspostavlja vezu između FoxPro-a i Excel-a:
iChannel = DDEInitiate( "Excel", "PROBA.XLS" )
Ako je rezultat (koji se smešta u var. iChannel) pozitivan broj, veza
je uspostavljena i DDE "konverzacija" može da se nastavi. Sada program
može da prenese u Excel cene artikala:
= DDEPoke( iChannel, "R3C3", STR(cigarete,10))
= DDEPoke( iChannel, "R4C3", STR(pice,10))
= DDEPoke( iChannel, "R5C3", STR(diskete,10))
Komanda DDEPoke šalje podatak na DDE server. String "R4C3" govori
Excel-u da se podaci smeštaju u četvrti red, treća kolona (R - Row, C
- Column). Da bi se dobio rezultat izračunavanja potrebno je zadati:
iResult = DDERequest( iChannel, "R7C3", "CF_TEXT", "iDone" )
Ova komanda smešta rezultat kalkulacije u promenljivu iResult, odn. u
nju kopira sadržaj polja C7 (gledano u odnosu na tabelu). Ova rutina
vraća rezultat tek pošto je Excel završio sa kalkulisanjem. String
"CF_TEXT" označava da je rezultat standardni tekst. String iDone je
ime tzv. "callback" funkcije. Evo njene strukture:
PROCEDURE iDone
PARAMETERS iChanNum, sAction, sItem, sData, sFormat, iStatus
DO ekran.spr && Prikaži dobijeni rezultat
nonote = .F. && Indikator kraja
result = "" && Ovde ide "prerađeni" rezultat
FOR i = 1 TO LEN(sData)
chrq = SUBSTR(sData, i, 1)
IF ISDIGIT(chrq)
result = result + chrq
ENDIF
ENDFOR
result = VAL(result)
Procedura iDone se poziva posle izvršene transakcije, i ona koristi
sledeće parametre:
PARAMETERS iChanNum, sAction, sItem, sData, sFormat, iStatus
Oni se vraćaju kao rezultat svake transakcije, i moraju biti navedeni
u liniji sa parametrima čak i da vas ne interesuje kakva je njihova
sadržina.
iChanNum - baciti pogled na ovu vrednost u slučaju da se koristi ista
"callback" f-ja za različite DDE kanale.
sAction - najčešće su mu vrednosti "INITIATE", "REQUEST" ili
"TERMINATE". Pomoću njih se možete odlučiti šta da radite
sa podacima.
sItem - u navedenom primeru mu je vrednost "R7C3".
sData - rezultat (potrebno ga je konvertovati u brojnu vrednost).
sFormat - u našem slučaju je "CF_TEXT".
iStatus - ako je on pozitivan broj - transfer je uspeo.
Pošto je rad sa tabelom PROBA.XLS završen, možemo prekinuti vezu
sledećom komandom:
= DDETerminate( iChannel )
Excel se može zatvoriti i komandama:
iChannel = DDEInitiate("Excel", "System")
= DDEExecute(iChannel, 'ŠERROR(FALSE)Ć')
= DDEExecute(iChannel, 'ŠQUIT()Ć')
= DDETerminate(iChannel)
Tako koristimo System topic koja briše sve greške i zatvara Excel.
Treba zapamtiti da se sve ovo odvija za vreme koje Fox provodi u
daljem izvršavanja programa.
baze.podataka.192max.headroom,
Evo naslova nekih biblioteka za FoxPro for DOS, a mene zanima gde se
one mrežne i komunikacione daju pokupiti...
Kategorija Naziv
--------------------- ------------------------------------------
Grafika Espia, dGE, SilverPaint, FoxGraph, SunShow
Serijska komunikacija CommTools, SilverFox SPCS
NetWare biblioteke NetLib, FPNet, GPLib
Client-Servers Biton/ORACLE, RaSQL
baze.podataka.193mdrazic,
> - baza je indeksirana
> - podaci koji su predviđeni za brisanje markiraju se sa DELETE
> - čim se podatak briše (DELETE), odmah potom mu se polje po kome
> je indeksirano napuni nulama ili spejsovima, zavisno od tipa
> - na taj način polje stiže na vrh baze
> - pre nego što se uradi bilo koji sledeći APPEND BLANK, proveri
> se ima li takvih brisanih polja u bazi
> - ako ih ima, obrisati prvom sadržaj i popuniti ga novim sadržajem
> - ako ih nema, tada se ipak radi APPEND BLANK
Ovo se još zove i reciklaža. Uz pomoć uslovnih indeksa može se
rad sa (indeksiranom) bazom ubrzati, ako se više ne koristi
ispitivanje da li je record deleted(). Za takav rad svi normalni
indeksi treba da su uslovni (neprazno ključno polje). Dodatni
indeks (opet uslovni) treba da sadrži samo brisane (blankovane)
zapise. Znači, SET DELETED OFF u aplikaciji i reciklaža pomoću
uslovnih indeksa.
Ako nemate uslovne indekse, za udoban rad ipak treba SET DELETED ON,
što malo usporava rad. Ono što se ne vidi golim okom, imao sam
prilike da osetim na većoj bazi (stotinjak hiljada zapisa). Jedan
od indeksa je bio po polju koje je u oko 10% slučajeva bilo prazno.
SEEK po tom indeksu (na normalne zapise) je bio BITNO SPORIJI od
indeksa koji je sadržavao različite ključeve. Ovo je bilo u
Clipper-Novell kombinaciji i izgleda da veliki broj istih ključeva
usporava SEEK. Možda je to i zbog toga što su blanko ključevi na
vrhu indeksa (logički). O tome bi možda neki vrstan znalac B-tree
i sličnih drveta mogao nešto da kaže.
Mislim da ipak povremeno treba pakovati tabele, ali ne PACK
naredbom, nego prepisivanjem u drugu (ima tih funkcija po
knjigama). Usput, ja omogućavam da se koristi neki od
indeksa ili novi ključ za originalnu bazu, tako da se tada
baza i sortira u istom cugu. Sortirana baza može ubrzati
rad na mreži pošto se manje paketa šalje mrežom ako su
zapisi jedan blizu drugog.
Puno reciklaže vam želi,
Milan
baze.podataka.194djelovic,
> SEEK po tom indeksu (na normalne zapise) je bio BITNO SPORIJI od
> indeksa koji je sadržavao različite ključeve. Ovo je bilo u
> Clipper-Novell kombinaciji i izgleda da veliki broj istih ključeva
> usporava SEEK.
Veći broj istih vrednosti u indeksu zaista bitno usporava rad i to:
1. Kod brisanja i dodavanja slogova na jednokorisničkom sistemu.
2. Kod svih operacija na višekorisničkom sistemu.
Problem se može izbeći dodavanjem nekog random polja u slog pri njegovoj
kreaciji, pa "produžavanjem" problematičnog indeksa sa datim poljem.
baze.podataka.195nbatocanin,
> Na taj način se sva polja markirana za brisanje
> koriste pri unosu novih podataka u bazu i komanda PACK
> gubi smisao :)
Sva rešenja koja recikliraju stare slogove imaju jednu veliku manu:
uništavaju stare podatke. Lično mi se više sviđa da imam mogućnost da
korisniku koji je neoprezno iskoristio naredbu za brisanje vratim
neki važan podataka i jednom u nekoliko meseci prepakujem celu bazu.
baze.podataka.196feniks,
Kako je poznato žiro-računi izgledaju otprilike ovako:
40801-601-X-15837...
│ │ │ │
filijala ──────┘ │ │ │
namena ───────────┘ │ │
kontrolna cifra ──────────────┘ │
partija ──────────────────┘
Moja sestra pita da li neko zna formulu po kojoj se
računa kontrolna cifra. Izvinjavam se ako je ovo već bilo...
SP
baze.podataka.197djelovic,
> Moja sestra pita da li neko zna formulu po kojoj se
> računa kontrolna cifra. Izvinjavam se ako je ovo već bilo...
Bilo je u prethodnoj PC.PROG, tema algoritmi (?).
baze.podataka.198feniks,
│> Moja sestra pita da li neko zna formulu po kojoj se
│> računa kontrolna cifra. Izvinjavam se ako je ovo već bilo...
│
│ Bilo je u prethodnoj PC.PROG, tema algoritmi (?).
└──────────────────
Hvala na pointeru, valjda ću pronaći tamo...
baze.podataka.199dr.grba,
>> Moja sestra pita da li neko zna formulu po kojoj se
>> računa kontrolna cifra. Izvinjavam se ako je ovo već bilo...
Još jednom, evo modula koji je snemcev dosada već slao na Sezam. U pitanju je
funkcija koju je vrlo prikladno ugrađivati kao valid funkciju pri unosu nekog
žiro računa.
Funkcija ne samo da ispituje kontrolni broj žiro računa, nego i kontrolni
broj individualne partije (poslednja cifra poslednjeg broja), tako da se
verovatnoća unosa pogrešnog žiro računa bitno smanjuje, što i jeste svrha
ovih kontrolnih brojeva.
Algoritmi izračunavanja se lako vide u listingu.
ziro.zipbaze.podataka.200snemcev,
>> Moja sestra pita da li neko zna formulu po kojoj se
>> računa kontrolna cifra. Izvinjavam se ako je ovo već bilo...
Pogledaj u temi algoritmi -- tamo je dr.grba poslao veoma opširno
objašnjenje.
baze.podataka.201feniks,
│ Funkcija ne samo da ispituje kontrolni broj žiro računa, nego i kontrolni
│ broj individualne partije (poslednja cifra poslednjeg broja), tako da se
│ verovatnoća unosa pogrešnog žiro računa bitno smanjuje, što i jeste svrha
│ ovih kontrolnih brojeva.
│
│ Algoritmi izračunavanja se lako vide u listingu.
└──────────────────────────
Hvala i za ovo. Sestri je bio dovoljan podatak da se to
nalazi u Računarima br.98 (Bajtovi lične prirode). Ona je programer
i lako će se sada snaći. Ovaj algoritam koji si poslao je u clipper-u
(zgodno kao primer), inače njena aplikacija ne radi pod DOS-om
(valjda pod QMX-om).
Pozdrav, SP
baze.podataka.202max.headroom,
> Hvala na pointeru, valjda ću pronaći tamo...
Ako ne nađeš, podseti me da spustim u konf.
baze.podataka.203max.headroom,
> Problem se može izbeći dodavanjem nekog random polja u
> slog pri njegovoj kreaciji, pa "produžavanjem"
> problematičnog indeksa sa datim poljem.
Da, tačno. Ali je sam sistem "reciklaže" nezgodan jer ostaješ bez
starih podataka koji će (Marfi) kad-tad ustrebati :)
Međutim, mene je dugo vremena morila jedna druga bedastoća: npr.
program koristi jednu prolaznu bazu koja se briše i po stotinak puta u
toku radnog dana. Baza nema random ime, tj. ZAPuje se pre svakog novog
popunjavanja. Elem, tu nastaju nevolje - prečesto se dešava da joj se
ošteti heder, što sam ja pripisivao HDD nepouzdanosti, ali sam na
kraju morao da položim oružje i da "teram" baze koje će po pokretanju
inkriminisanog dela programa biti iznova kreirane pod random imenom, a
posle upotrebe obrisane. Da ne bih gušio, poenta je u sledećem: ako se
ispostavi da neka temporary baza treba da postoji, gurnite je u RAM
disk. Manje-više što je brže, nego je _pouzdanije_.
Pomenuti primer se odnosio na bazu za unos faktura. Zamislite, ja sebe
pretpostavljao za krelca što se toliko zlopatim sa njom, kad ono vidim
softver u kojoj je programer kreirao vlastite sisteme za rad sa
bazama, a koji se oslanjaju na matrice (!)... Stvarno cool :) Jeste,
dobrodošlo je ako npr. Win4WGroups neće da se tera sa manje od 4MB,
ali je princip rađen u Fox-u i pre pojave Win-a za radne grupe. žudna
rešenje se iznalaze, stvarno... :)
baze.podataka.204max.headroom,
Interesantno:
Kada se kod FoxPro-a ošteti neki CDX fajl, pri otvaranju baze kojoj
taj ind. fajl pripada Fox prijavljuje grešku. Međutim, pri svakom
sledećem otvaranju iz baze bivaju izbrisane sve definicije indeksa i
greška se više ne javlja, ali to nipošto ne rešava problem :)
baze.podataka.205max.headroom,
Dilema sa DELETED() zapisima (Fox):
Kada je SET DELETED postavljen na ON, sve komande za rad sa bazom
ignorišu izbrisane zapise. Rushmore optimizacija se uglavnom sastoji
od provere indeksa pre testiranja zapisa u bazi. Kada se izvrši COUNT
ili SELECT COUNT() komanda, Rushmore nam omogućava dobijanje rezultata
bez ikakvog pristupanja bazi.
Međutim, u naš problem se sastoji u tome što je DELETED() fleg smešten
u bazi. Tako, ako je SET DELETED ON, COUNT i SELECT COUNT() komande su
prinuđene da testiraju zapise iz baze pre nego što vrate vrednost. Kao
rezultat, COUNT i SELECT COUNT() se izvršavaju mnogo sporije ako je
SET DELETED postavljen na ON.
Rešenje ovog problema sastoji se u sledećem: indeksirajte bazu (u
kojoj važi SET DELETED ON) po još jednom ključu -
INDEX ON DELETED() TAG ime_taga
Kada se ubaci indeks koji je baziran na DELETED() f-ji, Fox može
ponovo odrediti sve zapise koji odgovaraju uslovu bez pristupanja
samoj bazi.
baze.podataka.206max.headroom,
Hmh, ali pokušavajući da pomognemo Rushmore-u tako što ćemo setovati
master ključ pre pokretanja komande često više odmognemo i izgubimo na
brzini:
CLOSE ALL
USE baza ORDER ime
t1 = SECO()
LIST FOR ime = "Mika"
t2 = SECO()
WAIT WINDOW STR(t2 - t1, 10, 4) && 18 sekundi
CLOSE ALL
USE baza
t1 = SECO()
LIST FOR ime = "Mika"
t2 = SECO()
WAIT WINDOW STR(t2 - t1, 10, 4) && 2 sekunde
Elem, očigledno smo odmogli. Problem je u tome što FoxPro koristi
Rushmore da odredi koji zapisi sadrže imena "Mika". To se završava za
manje od dve sekunde. Međutim, pošto odredi koji zapisi odgovaraju
uslovu, FoxPro mora da se vrati nazad i pročita čitav indeks da bi
odredio u kakvom poretku da predstavi podatke :)
(Rezultati odgovaraju bazi sa oko 5000 zapisa, ali sve to nije bitno -
bitna je onol'ka razlika u vremenu izvršenja programa :)
P.S.
SQL SELECT ignoriše ORDER postavku, te tako ne pati od pomenutih
"stomačnih tegoba".
baze.podataka.207max.headroom,
Neka rešenja za SET ORDER probleme:
Teorijski, lako je reći "ne setuj ORDER pre pozivanja BROWSE FOR ili
SCAN FOR komande". U praksi je najčešće potrebno upravo to - želimo
podatke sortirane po nekom kriterijumu (pa posle propuštene kroz
sito). Evo nekih rezultata:
CLEAR
CLOSE DATA
USE baza
t1 = SECO()
** BROWSE FOR, bez ORDER-a t2 - t1 = 1.321
BROWSE FOR godina = 10 NOWAIT
t2 = SECO()
CLOSE DATA
USE baza ORDER ime
t3 = SECO()
** BROWSE FOR posle SET ORDER t4 - t3 = 4.581
BROWSE FOR godina = 10 NOWAIT
t4 = SECO()
CLOSE DATA
USE baza
t5 = SECO()
** SCAN FOR, bez ORDER-a t6 - t5 = 0.993
SCAN FOR godina = 10
mvar = ime
ENDSCAN
t6 = SECO()
CLOSE DATA
USE baza ORDER ime
t7 = SECO()
** SCAN FOR posle SET ORDER t8 - t7 = 9.488
SCAN FOR godina = 10
mvar = ime
ENDSCAN
t8 = SECO()
CLOSE DATA
t9 = SECO()
** BROWSE trik t10 - t9 = 1.497
SELECT RECNO() AS trik ;
FROM baza WHERE godina = 10 ;
ORDER BY ime INTO CURSOR rezultat
SET RELATION TO trik INTO baza
BROWSE FIELDS baza.godina, baza.ime NOWAIT
t10 = SECO()
CLOSE DATA
t11 = SECO()
** SCAN trik t12 - t11 = 1.388
SELECT RECNO() AS trik ;
FROM baza WHERE godina = 10 ;
ORDER BY ime INTO CURSOR rezultat
SET RELATION TO trik INTO baza
SCAN
mvar = baza.ime
ENDSCAN
t12 = SECO()
CLOSE DATA
t13 = SECO()
** BROWSE posle SELECT ORDER t14 - t13 = 1.343
SELECT * FROM baza WHERE godina = 10 ;
INTO CURSOR rezultat ;
ORDER BY ime
BROWSE NOWAIT
t14 = SECO()
CLOSE DATA
t15 = SECO()
** SCAN posle SELECT ORDER t16 - t15 = 1.315
SELECT * FROM baza WHERE godina = 10 ;
INTO CURSOR rezultat ;
ORDER BY ime
SCAN
mvar = ime
ENDSCAN
t16 = SECO()
CLOSE DATA
t17 = SECO()
** BROWSE posle INDEX FOR t18 - t17 = 2.948
USE baza
INDEX ON ime FOR godina = 10 TO rezultat COMPACT
BROWSE NOWAIT
t18 = SECO()
CLOSE DATA
t19 = SECO()
** SCAN posle INDEX FOR t20 - t19 = 2.786
USE baza
INDEX ON ime FOR godina = 10 TO rezultat
SCAN
mvar = ime
ENDSCAN
t20 = SECO()
? "BROWSE FOR, bez ORDER-a ",t2-t1 && 1.321
? "BROWSE posle SELECT ORDER ",t14-t13 && 1.343
? "BROWSE trik ",t10-t9 && 1.497
? "BROWSE posle INDEX FOR ",t18-t17 && 2.948
? "BROWSE FOR posle SET ORDER ",t4-t3 && 4.581
?
? "SCAN FOR, bez ORDER-a ",t6-t5 && 0.993
? "SCAN FOR posle SELECT ORDER ",t16-t15 && 1.315
? "SCAN FOR trik ",t12-t11 && 1.388
? "SCAN FOR posle INDEX FOR ",t20-t19 && 2.786
? "SCAN FOR posle SET ORDER ",t8-t7 && 9.488
Eto - zaključke izvlačite sami :)
baze.podataka.208djelovic,
> Da, tačno. Ali je sam sistem "reciklaže" nezgodan jer ostaješ bez
> starih podataka koji će (Marfi) kad-tad ustrebati :)
Hm, ukoliko mi treba mogućnost da se neki slog stornira, ja ubacim bajt
koji označava storniranje, umesto da ga brišem. Ukoliko je potrebna istorija
sloga, onda imam posebnu tabelu u kojoj držim uvezanu listu prethodnih varjanti
sloga. Van toga, ne vidim neku potrebu za čuvanjem obrisanih slogova?
> Međutim, mene je dugo vremena morila jedna druga bedastoća: npr.
> program koristi jednu prolaznu bazu koja se briše i po stotinak puta u
> toku radnog dana. Baza nema random ime, tj. ZAPuje se pre svakog novog
> popunjavanja. Elem, tu nastaju nevolje - prečesto se dešava da joj se
> ošteti heder, što sam ja pripisivao HDD nepouzdanosti, ali sam na
> kraju morao da položim oružje i da "teram" baze koje će po pokretanju
> inkriminisanog dela programa biti iznova kreirane pod random imenom, a
> posle upotrebe obrisane. Da ne bih gušio, poenta je u sledećem: ako se
> ispostavi da neka temporary baza treba da postoji, gurnite je u RAM
> disk. Manje-više što je brže, nego je _pouzdanije_.
A kada smo dragisha i ja prigovarali Kliperašima što što za sve koriste
tabele umesto da uposle adekvatne memorijske strukture, onda smo mi bili ludi,
a? :) Nego, ukoliko ti RAM disk postane tesan, zašto ne probaš drugu metodu:
umesto da koristiš fajlove sa random imenima, jednostavno na svakoj stanici u
AUTOEXEC ubaciš jedno:
SET JEDINSTVENOIME=<neko ime>
pa onda ne otvaraš po tom imenu? To te rešava svih problema sa konkurentnošću
pristupa podacima, a gornja SET naredba može da se automatizuje sa pomoću
Novella tako što će u login skriptu svih koji pripadaju nekoj grupi koja
koristi tvoj program promenljivoj JEDINSTVENOIME da se dodeljuje broj spoja.
baze.podataka.209mdrazic,
> umesto da koristiš fajlove sa random imenima, jednostavno
> na svakoj stanici u AUTOEXEC ubaciš jedno:
>
> SET JEDINSTVENOIME=<neko ime>
Može, samo traži dodatno angažovanje oko dodeljivanja ovih
imena. A i ne rešava problem (vrlo čest kod user-a) da se
dve stanice jave pod istim username-om.
Ja to radim ovako:
- svaki korisnik je registrovan, ima password i tako to,
ali i jedinstvene inicijale od dva znaka.
- kad se korisnik prijavi, registruje se on kao i koji
je broj procesa (ako je više stanica sa istim username-om
unutar aplikacije). Primer: MD1 za mene, MD2 za nekog
ko se posle mene prijavio pod mojim imenom u aplikaciju.
Naravno, postoji i tabela procesa iz koje se mnogo toga
jako lepo vidi :))) dinamički u toku rada.
- gorepomenuta tri znaka su jedinstvena u datom trenutku
za jednog korisnika. Njima dodaš po volji i ukusu još
po neki znak ako hoćeš. Sistem sa brojem veze je isto dobar,
(ali ne možeš multitasking da radiš sa jedne stanice ;),
ali moj način ostavlja trag čiji je fajl bio u slučaju da
ti zatreba.
- pošto sve izveštaje prvo pravim u fajl pa zatim gledam,
editujem, pa ako treba da se štampaju, prosto pošaljem
u neki queue ili na local. Za te potrebe u jednoj static
varijabli čuvam brojač koji dodam na gorepomenuta tri
znaka. Ime fajla dobijaš funkcijom, otprilike
cFileName := DajTmpIme()
a u njoj se inkrementira brojač.
Problemi koji slede kod Visual Object-a: kod multitaskinga
možeš kao jedan logovan user imati više Win procesa (na istoj
stanici) istovremeno u aplikaciji u koju si se samo jednom
logovao!
baze.podataka.210pedjav,
Pozdrav svima od novog sezamovca!
Pišem jednu malu C++ biblioteku klasa za rad sa bazom podataka.
Format datoteka je sopstveni. Pošto imam nameru da cela stvar radi
pod Windows (dakle više procesa odjednom može tražiti da čita/piše
po istoj datoteci i zapisu) moram nekako da izvedem zaključavanje
zapisa. Pošto nemam ama baš nikakvo iskustvo sa SHARE i mehanizmima
za zaključavanje pod DOS-om molim one koji su upućeni u problematiku
da mi objasne kako SHARE radi i kako se izvodi zaključavanje cele
datoteke i jednog njenog dela. Pomoglo bi i upućivanje na neku
literaturu.
pedjav
baze.podataka.211max.headroom,
Daklem, što se dalo zaključiti iz moje prethodne poruke (BROWSE FOR i
SCAN FOR u kombinacijama sa SET ORDER): SELECT ORDER BY je jasan izbor
u momentu kada treba predstaviti čitavu skupinu rezultata. Međutim, da
bi se dao ekranski pregled record-a (jedan skrin, dakle) najbolje
rešenje je BROWSE FOR sa SET ORDER.
(Ako su kriterijumi za vaš query uvek isti, najbolje rešenje je dodati
kondicionalni tag u CDX fajl. Npr. ako se želi pregled imena ljudi
koji su stariji od 30 godina, indeksirajte bazu sa:
INDEX ON ime TAG imegod FOR godina > 30
pa se posle jednostavnim pozivanjem:
SET ORDER TO imegod
BROWSE
dobijaju željeni rezultati).
baze.podataka.212max.headroom,
Skeniranje indeksirane baze traje duže od skeniranja neindeksirane.
Razlog je jednostavan: kada FoxPro "guli" po indeksiranoj bazi on mora
da skače napred-nazad tražeći sledeći zapis u indeksu. Evo primera:
---------------------------------------------
VREDNOST (key) REDNI BROJ ZAPISA
---------------------------------------------
A 100,231
B 7
C 96,325
D 43
E 106,002
---------------------------------------------
Kada FoxPro krene da procesira ovu bazu po indeksiranom polju (key),
on prvo mora da skoči na record 100,231. Tada ide na rec. br. 7. Potom
na 96,325, pa na 43, i, najzad, na 106,002. Toliko skakanja ume da
oduzme dosta vremena :) Sada je jasno zašto Fox neindeksiranu bazu
pretrči za x sekundi manje od indeksirane. Ono što nije za pretposta-
viti je to da sortiranje baze po određenom ključu traje čak i kraće od
tih x sekundi.
Iako je SORTiranje često brže od korišćenja postojećeg indeksa,
postoje momenti kada SORT ne treba koristiti (čak i u slučaju da je
potrebno napraviti novi indeks). Evo nekih činjenica:
- Ako je u bazi manje od nekoliko hiljada zapisa, ili ako query vraća
manje od 50 zapisa, metoda koja se izabere nije ni bitna (SORT ili
ORDER).
- Uvek prvo koristite SQL SELECT pristup problemu.
U slučaju da je brzina ono što je neophodno potrebno, trebalo bi se
odlučiti između indeksiranja i SELECT...ORDER BY. Evo "rešenja":
IF (memo_postoji_i_postoji_sadržaj) .OR. (nedovoljno_mesta_za_SORT)
IF tag_postoji
SET ORDER
ELSE
INDEX ON
ENDIF
ELSE
IF zapisi_su_već_u_odgovarajućem_poretku
SET ORDER
ELSE
IF mnogo_zapisa
IF TAG
SET ORDER
ELSE
INDEX ON
ENDIF
ELSE
SORT / SELECT...ORDER BY
ENDIF
ENDIF
ENDIF
Evo kako dobiti bazu za slučaj "zapisi_su_već_u_odgov._poretku":
** COPY TO pristup
USE baza
SET ORDER TO ime
COPY TO temp
USE
ERASE baza.dbf
ERASE baza.cdx
USE temp
RENAME temp.dbf TO baza.dbf
USE baza
&& ponovo indeksiraj bazu
** SELECT...ORDER BY pristup
SELECT * FROM baza INTO TABLE temp ORDER BY ime
USE IN baza
USE IN temp
ERASE baza.dbf
ERASE baza.cdx
RENAME temp.dbf TO baza.dbf
USE baza
&& ponovo indeksiraj bazu
Ako vas brine ono "ponovo indeksiraj bazu" - džabe se brinete :)
Indeksiranje već sortirane baze (naravno, isti ključ) traje kratko.
baze.podataka.213max.headroom,
BROWSE KEY ili BROWSE FOR - šta je brže?
** Test program
DEFINE WINDOW prozor FROM 1,0 TO 20,75
CLOSE DATA
USE baza
t1 = SECO()
BROWSE FOR pol = "M" NOWAIT WINDOW prozor
t2 = SECO()
CLOSE DATA
USE baza ORDER pol
t3 = SECO()
BROWSE KEY "M" NOWAIT WINDOW prozor
t4 = SECO()
CLOSE DATA
USE baza ORDER pol
t5 = SECO()
BROWSE FOR pol = "M" NOWAIT WINDOW prozor
t6 = SECO()
----------------
Evo i rezultata (baza ima nekih 20,000 zapisa):
FOR 0.445 .
KEY 0.493 . LAN (SET EXCLUSIVE ON)
FOR sa SET ORDER 0.755 .
FOR 0.117 .
KEY 0.259 . LAN (SET EXCLUSIVE OFF)
FOR sa SET ORDER 0.749 .
Koristite BROWSE KEY kad kog možete. BROWSE FOR je fleksibilniji
pristup, ali sporiji. I, što je najzanimljivije, provalite rezultate -
ekskluzivno otvorena baza i sporiji pristup (!). Kažu da je ovo
primećeno samo na Novell-u, u sprezi sa query-jem koji je moguće
optimizovati a koji kao rezultat vraća mali broj zapisa.
baze.podataka.214max.headroom,
A-uh, problema...
Treba da uradim nekakav report na Epson LX-800 štampaču (znate ono
malo devetopinsko čudo). Papir je beskonačni, i sve ide lepo kada
report stane na jednu strane. Ali (agh!) čim se produži na dve-tri ili
više strana, posle prve otštampane strane printer mu daje EJECT i baca
me u nesvest. Tada report izgleda ovako:
---------------------------Prvi list
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
---------------------------Drugi list
<========================Ovde tera papir
xxxxxxxxxxxxxxxx
---------------------------Treći list
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
<========================Ovde ponovo EJECT (?!)
---------------------------žetvrti, itd...
U reportu sam izbacio sve "Paper Eject"-ove, dužina strane je 55
linija, tj. sve je standardno. Verovatno je do setovanja štampača. Ima
li neko iskustva sa ovim malim mučiteljem (LX-800)?
baze.podataka.215djelovic,
> U reportu sam izbacio sve "Paper Eject"-ove, dužina strane je 55
> linija, tj. sve je standardno. Verovatno je do setovanja štampača. Ima
> li neko iskustva sa ovim malim mučiteljem (LX-800)?
Biće da je štampač podešen da posle nekog broja linija sam uradi FF, ili ti
je možda loše podešena dužina strane? Za prvo je najčešće kriv pogrešno
postavljen džamper, a za drugo je potrebna ESC sekvenca na početku programa.
P.S. Odjednom si počeo da pišeš ovo obilje lepih poruka? Odakle taj iznenadni
entuzijazam? Na čemu god da si, daj i meni malo! :)
baze.podataka.216evlad,
>> A-uh, problema...
>>
>> Treba da uradim nekakav report na Epson LX-800 stampacu (znate ono
>> malo devetopinsko cudo). Papir je beskonacni, i sve ide lepo kada
Ponosni vlasnik LX-800 ti pomaze:
DIP switch group 2 (4 komada)
2-3 je skip over perforation on == 1 inch off == none
2-1 je set page length on == 12 inch off == 11 inch
so 2-3 stavis na off i 2-1 stavis na on i resen problem.
za IBM graficke karaktere
DIP switch group 1 (8 komada)
1-1 je set condenset or normal on == condenset off == normal
1-2 je set zero type on == 0 off == O
1-3 je set character table on == graphics off == italics
1-5 je set print qality on == NLQ off == draft
ako ti treba ostalo vici !
baze.podataka.217max.headroom,
> Hm, ukoliko mi treba mogućnost da se neki slog stornira,
> ja ubacim bajt koji označava storniranje, umesto da ga
> brišem. Ukoliko je potrebna istorija
Da, u globalu se sve stornira (a malo toga konkretno i briše). Al'
vole korisnici onol'ko da brljaju, a posle... ko će sve to ispraviti i
vratiti u normalno stanje :)
> A kada smo dragisha i ja prigovarali Kliperašima što što
> za sve koriste tabele umesto da uposle adekvatne
> memorijske strukture, onda smo mi bili ludi,
Jooj :) Ali zašto praviti, iznova, čitav sistem za rad sa bazama kada
već isti postoji? Na samu pomisao da kreiram sopstveni BROWSE koji
samo izdaleka liči na Fox-ov, diže mi se kosa na glavi :) Ja nekako
praktikujem liniju manjeg otpora :)
> SET JEDINSTVENOIME=<neko ime>
Uh, vole njih petnaest odjednom pod isti user... To nemo'š ljudima
objasniti :) Možda da se za svakog usera definiše neki skup
identifikacionih znakova (3 ili 4) koji će se vući zajedno sa TMP
datotekom - posle bi, verovatno, olakšalo osmatranje sa servera kada
neka baza padne (mada nije tragedija jer su privremene, odn. kreiraju
se po startovanju određenog dela programa). Mene je mnogo više
zainteresovala ideja pravljenja neke Open f-je za baze, koja će videti
da baza (u slučaju da je heder ili indeks oštećen) nije otvorena i
preduzeti odgovarajući recovery. Ali... odakle mi source za taj
recovery program? :) Pokušao sam ja nešto i sam ali mi se rezultati ne
dopadaju (MEMO polja naprosto "odlepršaju").
baze.podataka.218max.headroom,
> - pošto sve izveštaje prvo pravim u fajl pa zatim gledam,
> editujem, pa ako treba da se štampaju, prosto pošaljem
> u neki queue ili na local. Za te potrebe u jednoj static
> varijabli čuvam brojač koji dodam na gorepomenuta tri
Ako je štampa u pitanju - ne treba praviti dva queue-a (jedan local,
jedan server). Ali se meni češće događa da je izveštaj potrebno
importovati u Excel ili Word, pa mora da stoji i kao file (beuh).
Ja pravim neki TMP stack svega toga, pa kada mi mreža javi da je stvar
"finito", skidam je sa steka. Inače, programski procesi imaju 3
početna slova procesa i random nastavak. A sve to ide u LOG file. Pa
onda traje, traje... Biraj: sigurnost ili brzina :)
> Problemi koji slede kod Visual Object-a: kod
> multitaskinga možeš kao jedan logovan user imati više Win
> procesa (na istoj stanici) istovremeno u aplikaciji u koju
> si se samo jednom logovao!
Elem, reši stvar: svakom programskom procesu dodeli neko ime, pa to
trpaj u neki privremeni stek. Ako user iz drugog taska pokuša da
pokrene isti programski deo (deluje nebulozno), zabrani :) Logično je
da neće da pravi isti izveštaj u oba taska. Ali postoji mogućnost da,
npr. reši da dobije vrednosti za dva različita vremenska perioda
(recimo, 1. task = pregled analitičkih kartica od 01.01.94 do
10.01.94, 2. task = isti pregled anal. kar. ali od 12.01.94. do
01.02.94.)... Tada je rešenje ubaciti i neki "komentar" u gorenavedeno
ime prog. procesa - a to je u ovom primeru datum.
baze.podataka.219max.headroom,
> Pišem jednu malu C++ biblioteku klasa za rad sa bazom
> podataka. ====
A-uh :) Baci pogled u direktorijume, ili pitaj nekoga ko poseduje
nešto slično. Kao C-laik pretpostavljam da je u pitanju sizifovski
posao. Obrati se i u PC.PROG: razno, odn. kontaktiraj korisnika mjova.
baze.podataka.220max.headroom,
RUSHMORE
(Iliti - zašto je Fox brži od sličnih aplikacija)
Rushmore je naziv koji Microsoft upotrebljava da predstavi skup
algoritama i procedura koje koristi Fox da bi optimizovao query-je.
Generalno, kad god se zada neka komanda koja vrši pretragu za podatkom
(skupom podataka) koji odgovara zadatom uslovu, Fox koristi Rushmore
da se čitava stvar izvede što je brže moguće. Na primer, pretpostavimo
da imamo bazu faktura koja sadrži 680,000 istih (oko 50 MB na disku).
Zatim, pretpostavimo da želimo da vidimo koliko je cipela prodato
prošle nedelje...
SELECT COUNT(artikal), SUM(kolicina) ;
FROM fakture WHERE artikal = "cipele" .AND. ;
datum >= š24.08.94ć .AND. datum <= š31.08.94ć
Posle pretrage ispada da je za proteklih sedam dana urađeno 30 stavki,
odn. prodato 96 pari cipela. A čitava pretraga je trajala 1.38 sekundi
(!) Nije korišćen Cray, već odomaćena 486-ica na 50 MHz sa 8 MB RAM-a.
A sada - rešili smo da napravimo query za istu bazu, a rezultati će
odgovarati sledećem uslovu:
SELECT COUNT(artikal), SUM(količina) ;
FROM fakture WHERE artikal = "cipele" .AND. ;
datum >= š24.08.94ć .AND. datum <= š31.08.94ć ;
.AND. kolicina > 2
Daklem, tražimo slične podatke kao i malopre, ali sa još jednim
uslovom - da stavka sadrži minimum tri para cipela. Query je dao
rezultate za 0.02 sekunde. Ha!
ŠTA RUSHMORE ZAHTEVA?
Kada se zada komanda kojom tražimo određene podatke u bazi, Fox prvo
proverava da li je i kako je baza indeksirana. Ako određeni indeksi
postoje, Fox ih koristi za dobijanje rezultata a da nije ni pristupio
samoj bazi. Drugim rečima, da bi Rushmore dao rezultate potrebno je da
baza bude indeksirana. Takođe, potrebno je kao parametar poređenja (sa
vrednošću ključa) upotrebljavati isključivo statičke vrednosti (odn.
one koje se ne menjaju u toku vršenja same pretrage). Evo i
demonstracije pravilnog i nepravilnog korišćenja Rushmore sistema:
Kao prvo, kreira se baza:
Structure for table: c:ĐprogramiĐbaza.dbf
Number of data records: 106960
Date of last update: 02/05/93
Field Field Name Type Width Dec Index
1 IME Character 10 Asc
2 STAROST Numeric 10 Asc
3 DATRODJ Date 8 Asc
** Total ** 29
Select area: 1, Table in Use: C:ĐPROGRAMIĐBAZA.DBF Alias: BAZA
Structural CDX file: C:ĐPROGRAMIĐBAZA.CDX
Index tag: IME Key: IME+STR(STAROST,10)
Index tag: STAROST Key: STAROST
Index tag: DATRODJ Key: DATRODJ
Index tag: BILOSTA Key: DELETED()
Lock(s): Exclusive USE
Kao što se da videti, baza BAZA.DBF sadrži 106,960 zapisa i zauzima
oko 3.1 MB prostora na disku.
Prvi query koristi Rushmore na pravilan način, i to da bi se dobili
svi zapisi u kojima je STAROST 10 godina:
mvar = 10
SELECT * FROM baza WHERE starost = mvar
FoxPro vraća 33 zapisa za 0.22 sekunde. Ovaj primer se povrgava
pravilima Rushmore-a jer:
* Poredi statičku vrednost sa postojećom indeksiranom vrednošću
* Koristi =, <, >, <=, >=, <>, #, odn. != operator.
Sledeći primer je primer nepravilnog korišćenja Rushmore optimizacije:
LIST FOR ime = "B0"
Komandi je potrebno čitavih 16 sekundi da bi dobila i prikazala 35
zapisa. Nešto, očigledno, nije u redu. LIST komanda potpada pod one
koje se mogu Rushmore optimizovati - to, dakle, nije problem. Operator
= je takođe OK, a i konstanta "B0" je svakako statička vrednost.
Evo razloga: mi imamo indeksni tag "ime", ali se isti sastoji od
izraza IME+STR(STAROST,10)... Ponovimo komandu koristeći
LIST FOR ime + STR(starost, 10) = "B0"
Ovog puta sve traje 2.3 sekunde. Problem je bio u tome što navedeni
query uslov mora biti identičan onome iz indeksa. Evo još jednog
primera koji za vraćanje rezultata zahteva 23.78 sekundi (220 zapisa):
SELECT * FROM baza WHERE starost + 0 > 10 .AND. starost + 0 < 20
Zašto izračunavanje traje toliko dugo? Zato što nemamo tag koji sadrži
izraz STAROST + 0. Sledećem query-ju treba 4.7 sekundi za rezultat:
SELECT * FROM baza WHERE starost + 0 > 10 .AND. starost < 20
Znamo da deo query-ja STAROST + 0 > 10 nemože da se optimizuje, ali se
zato deo STAROST < 20 može optimizovati, a i Fox prepoznaje situaciju.
Dakle, Fox prvo izvuče rezultate za deo query-ja koji je moguće
optimizovati, pa zatim na njega primenjuje deo koji ne odgovara
Rushmore-u. To znači da nije potrebno indeksirati baš svako polje da
bi se dobila svemirska :) brzina.
Evo i spiska komandi koje, kombinovane sa SELECT...FOR, mogu biti
Rushmore optimizovane:
AVERAGE INDEX BROWSE LABEL
CALCULATE LIST CHANGE LOCATE
COPY TO RECALL COPY TO ARRAY REPLACE
COUNT REPORT DELETE SCAN
DISPLAY SORT EDIT SUM
EXPORT TOTAL
baze.podataka.221djelovic,
> > SET JEDINSTVENOIME=<neko ime>
>
> Uh, vole njih petnaest odjednom pod isti user... To nemo'š ljudima
> objasniti :)
Znam, nisam ni predlagao da se za jedinstveno ime koristi username, već,
pošto jedinstveno ime treba da bude jedinstveno za mašinu, broj konekcije
(connection number).
Varjanta dva jeste da na disku postoji nekakva prazna baza podataka, u
kojoj bi svaka radna stanica zaključavala po jedan slog odmah po ulasku u
program - i to, prvi ako može, pa ako ne može onda proba drugi, i tako do
N-tog. Taj jedan slog za sve vreme rada drži zaključan, i njegov redni broj
je *jedinstven*. Uzgredan plus ovog rešenja jeste što može da se ograniči
trenutan broj korisnika programa - zgodno ukoliko se prodaje licenca za
korišćenje na određenom broju mašina.
baze.podataka.222neman,
> N-tog. Taj jedan slog za sve vreme rada drzi zakljucan, i
> njegov redni broj je *jedinstven*. Uzgredan plus ovog
> resenja jeste sto moze da se ogranici
A uzgred minus je situacija kada aplikacija pukne tj. neregularno :)
zavrsi rad.
baze.podataka.223djelovic,
> A uzgred minus je situacija kada aplikacija pukne tj. neregularno :)
> zavrsi rad.
Zašto? Taj slog se otključa čim se korisnik sledeći put uloguje. Nema
nikakve nekonzistentnosti i nikakvog reindeksiranja jer je zapravo tabela
prazna - jedina svrha joj je međuprocesna konvencija.
baze.podataka.224nbatocanin,
> Van toga, ne vidim neku potrebu za čuvanjem obrisanih slogova?
"Slušaj, došo mi juče mali i igrao se sa kompjuterom. Jel smeta nešto
što je izbrisao lager listu?"
>> posle upotrebe obrisane. Da ne bih gušio, poenta je u
>> sledećem: ako se ispostavi da neka temporary baza treba
>> da postoji, gurnite je u RAM disk. Manje-više što je
> brže, nego je _pouzdanije_.
Hm, ovo mi nije baš najjasnije. Zašto bi kreiranje u RAM disku bilo
sigurnije od kreiranja na disku? I kakve veze ima random ime sa
sadržajem baze?
baze.podataka.225nbatocanin,
> Problemi koji slede kod Visual Object-a: kod
> multitaskinga možeš kao jedan logovan user imati više Win
> procesa (na istoj stanici) istovremeno u aplikaciji u koju
> si se samo jednom logovao!
Kod moje koncepcije ovo ne utiče na program: svaki korisnik može
kreirati proizvoljan broj procesa koji nešto rade. Ekvivalent je da
se na klasičnom višekorisničkom sistemu uloguje na više terminala.
baze.podataka.226max.headroom,
> so 2-3 stavis na off i 2-1 stavis na on i resen problem.
Joj, to je :) Hvala - reko', Fox mi pobrljavio (a do sada nisam baš
previše kalemio sa matričnim štampačima; plus što nemam nikakav Ref.
menjual).
baze.podataka.227max.headroom,
> P.S. Odjednom si počeo da pišeš ovo obilje lepih poruka?
> Odakle taj iznenadni entuzijazam? Na čemu god da si, daj i
> meni malo! :)
A-iii, tajna beskrajna :)) Ma, bacim ja pogled na topic, kad ono - 20
poruka u dva reda. Pa se setim da ovde 50% ljudi piše raznorazne
aplikacije koje, između ostalog, koriste i baze; pa mi deluje
neobično. A u "Računarima" stalno nekakav "umetak", ali nipošto nešto
konkretno. I tako, u krajnjem down-u, vidim da na SETNet-u (paramreža)
ima više poruka na zadatu temu nego ovde. I tu mi pade mrak na oči...
:)
P.S.
Još uvek su ljudi dosta tajanstveni kada treba objasniti princip rada
neke aplikacije, nedajbože pisane za Fox ili Clipper. Sve mislimo -
krademo jedni od drugih 'leba iz usta :) A ovo tržište, sa ovakvim
(floating) zakonima, nikada neće dobiti univerzalni program za
finansijsko, odn. materijalno knjigovostvo. Pa se ne plašim :)
P.P.S.
Program se ne prodaje sam - prodaje ga prodavac. Do debilnosti se
divim ljudima koji su pravili "jednostavni podsetnik sa kalendarom,
alias baza podataka" i prodavali ga (srećnih devedesetih) za 1000 DEM.
baze.podataka.228max.headroom,
SQL SELECT
SQL SELECT komanda daje rezultate izuzetno brzo, u sledećem
slučaju i pod sledećim uslovima: ako je moguće potpuno Rushmore
optimizovati, ako koristi samo jednu bazu, ako koristi polja samo
iz te jedne baze, ako ne koristi aliase za imena polja, ako nema
GROUP BY ili ORDER BY klauzule, i ako daje redirekciju rezultata
u "cursor".
Elem, umesto da se kopira rezultat jednog query-ja u posebnu bazu
(a taj query se vrši nad podacima iz samo jedne baze), FoxPro
pronalazi podatke koji odgovaraju zadatom uslovu, otvara istu
bazu u drugoj radnoj oblasti i uspostavlja filter sa uslovima
identičnim onima iz query-ja.
Dakle, koristeći brzinsku prednost SQL SELECT komande možemo dobiti
rezultate u obliku reporta, BROWSE-a, ili novih baza. Baze kreirane
SQL-om mogu biti permanentne (DBF) ili privremene ("cursor"). Dalje,
pošto je ANSI/ISO standardom definisano implementiranje klauzula u SQL
SELECT, query-ji se lako prenose sa FoxPro platforme na raznorazne
client-server primerke poput Oracle-a i SQL Server-a.
FROM parametar
--------------
Parametar (klauzula) FROM govori SQL-u gde da traži polja iz liste
polja. Ako su navedene baze zatvorene, FoxPro će ih otvoriti ali ne i
zatvoriti posle upotrebe. Ako su baze (baza) već otvorene, FoxPro ih
ponovo otvara pomoću USE...AGAIN komande. Pošto je baza ponovo
otvorena, Fox zahteva dodatnu radnu oblast, ali ne i dodatni file
handle. Po mogućnosti otvorite baze pre upotrebe SQL SELECT, jer je
vreme pristupa kraće.
Lista polja
-----------
Lista polja govori SQL SELECT-u koja polja treba uključiti u rezultat.
Ovaj parametar sledi odmah posle SELECT naredbe. Lista može sadržati
sledeće elemente:
- * (zvezdica) iliti "wildcard"
- Bilo koje polje iz baze navedene posle FROM parametra
- Bilo koju FoxPro f-ju
- Bilo koju SELECT f-ju za rad sa kolonama
- Bilo koju UDF
Primeri: SELECT ime,prezime FROM baza
SELECT * FROM baza
Ja preferiram da naznačim i ime radne oblasti ispred naziva polja
(npr. baza.ime), u slučaju da dva polja iz dve različite baze imaju
isto ime. U slučaju da ovo pravilo nije ispoštovano sledi i greška:
"<polje> đ <promenljiva> is not unique and must be qualified".
SQL i UDF-i (User Defined Functions)
------------------------------------
Kao što rekoh, FoxPro podržava upotrebu UDF-ova u SELECT listi polja.
Očigledno, druge implementacije tako dobijene SQL SELECT komande možda
neće raditi na različitim platformama. Ali postoji još jedan, malo
nezgodniji problem - pošto SELECT vrši kreiranje privremenih baza,
privremenih indeksa i privremenih relacija, UDF se ne sme oslanjati na
njihovo postojanje, niti na način na koji su one indeksirane ili
filtrirane. Još jedan problem je način na koji radi SQL parser: Ako se
u listu polja uključi promenljiva koja se inkrementira pri svakom
prolasku kroz UDF (brojač), da se uočiti da vrednost promenljive
odstupa za jedan prolaz. Drugim rečima, ako UDF broji record-e čiji je
sadržaj "X", vidi se da je krajnja vrednost veća za jedan od realnog
stanja u bazi.
SQL Parser
----------
Kada se query pusti u izvršavanje, FoxPro prvo razbije SELECT komandu
na delove, proveravajući njihovu sintaksu i druge run-time greške.
Zatim proverava postojanje navedenih baza i polja u bazama. Potom se
proverava da slučajno ne postoje dva polja istog imena u dve različite
baze (a da nisu navedena imena radnih oblasti). I na kraju se izvršava
UDF eventualno naveden u query-ju. Pošto FoxPro "proveri" UDF, UDF je
praktično izvršena, čak i pre nego što je bilo koji podatak iz baze
proveren. Eto zašto se UDF u query-ju izvršava jedanput više nego što
mi očekujemo.
Pošto je sintaksa SELECT-a proverena, na scenu stupa SQL optimizer. On
vrši optimizaciju prema sledećim kriterijumima:
- postoje li indeksi koji bi mogli ubrzati query?
- ako ne postoje, treba li ih kreirati "u hodu"?
- da li bi query trebao prvo da izvrši JOIN, pa tek potom doda
filtere i pod-filtere, ili obrnuto?
- može li FoxPro izbeći sekvencijalnu pretragu po bazama
kreirajući neku "međubazu"?
(nastavak o SQL sledi...)
baze.podataka.229max.headroom,
* Í─────────────────────────────────Ě
* ║ DB2PRG DESCRIPTION ║
* Ë─────────────────────────────────Ż
* While developing applications, use CREATE and MODIFY STRUCTURE as usual
* to create and modify data file structures.
* Just before distributing your application, use DB2PRG.PRG. The most
* current structure of each DBF will be recorded in the MAKEDBF.PRG
* generated.
* DB2PRG.PRG does not need to be distributed with an application, only
* the MAKEDBF.PRG it creates need be distributed with your application.
* Your applications could use the following code in it's initialization
* process to let it know if it needs to DO MAKEDBF:
*
* mmakedbf = .NOT. FILE('myfile1.dbf')
* mmakedbf = mmakedbf .OR. .NOT. FILE('myfile2.dbf')
* mmakedbf = mmakedbf .OR. .NOT. FILE('myfile3.dbf')
* * ... and so forth for every dbf file in the application
* IF mmakedbf
* DO makedbf
* * makedbf will only create missing files.
* * makedbf will never overwrite any dbf files that already exist.
* DO reindex && application specific reindexing procedure you supply
* ENDIF
* The author acknowledges John Bauman for his article "DBF'S ON THE FLY" in
* the August 1989 DATA BASED ADVISOR. The article ably proved the value of
* DBF from scratch capabilities. DB2PRG has incorporated adaptations of
* some of the methodologies described in John's article.
db2prg.arjbaze.podataka.230jmilovic,
Zanima me koji se software za baze podataka pokazao kao najbolji pod
UNIX operativnim sistemom ???
baze.podataka.231mdrazic,
> Varjanta dva jeste da na disku postoji nekakva prazna baza
> podataka, u kojoj bi svaka radna stanica zaključavala po
> jedan slog odmah po ulasku u program - i to, prvi ako
> može, pa ako ne može onda proba drugi, i tako do N-tog.
> Taj jedan slog za sve vreme rada drži zaključan, i njegov
> redni broj je *jedinstven*. Uzgredan plus ovog rešenja
> jeste što može da se ograniči trenutan broj korisnika
> programa - zgodno ukoliko se prodaje licenca za korišćenje
> na određenom broju mašina.
Jest, a šta biva kada padne stanica: slog osta zaključan?
Kod mene kada user pristupa sistemu kada prođe password,
prvo mu prikažem ko je tada na sistemu i definišem njegov
proces (kao poslednji proces istog usera koji se trenutno
vrti + 1). Tada upišem u tabelu procesa da se logovao,
vreme, i tako to. Kod rada možeš ako želiš da u ovu
tabelu upisuješ šta radi user (gde je u meniju, koje
transakcije izvodi i slično), pa ovlašćeno lice :) može
prilično detaljno da gleda šta ko trenutno radi (dinamički).
Kada user izađe regularno, i to se registruje, pa oslobađa
proces. Kada padne stanica, to je serveru isto kao da
se ona duže vreme ne javlja. Tako posle pada vidiš da
postoji proces koji je poslednji put bio aktivan pre neka
tri sata i možeš da ga ukineš (pospremiš šta treba).
I ovde je trivijalno ograničiti istovremeni broj usera.
Milan
baze.podataka.232mdrazic,
> Ako je štampa u pitanju - ne treba praviti dva queue-a
> (jedan local, jedan server). Ali se meni češće
Za više štampača, više queue-ova; bar je meni tako lakše ;))
> Ja pravim neki TMP stack svega toga, pa kada mi mreža javi
> da je stvar "finito", skidam je sa steka. Inače,
Što da Novell ne brine o tome? A ti vozić dalje...
> Elem, reši stvar: svakom programskom procesu dodeli neko
> ime, pa to trpaj u neki privremeni stek. Ako user iz
Ima jedan manje-više pouzdan brojač: to je vreme. Informacija
o satu, minutu i sekundi može se spakovati u ne više od tri
čitljiva bajta. Kada tražiš od za to namenjene funkcije novo
tmp ime, na proj procesa sa logovanja dodaj ova tri bajta,
sačekaj sekundu (da zabraniš da neko otvori pet prozora u
sekundi:) i vrati tmp ime. Na ovaj način izbegavaš klasičan
brojač, ali praviš gužvu na disku ako ne brišeš ove fajlove.
Ima situacija kada ne znaš kada je fajl slobodan za brisanje
(print queue na primer). Sa klasičnim brojačem koristiš ista
imena fajlova kao u prethodnoj seansi, pa ih ima ipak ograničen
broj.
Više taskova sa klasičnim brojačem zahteva zapisivanje na
disk radi komunikacije sa drugim taskovima.
> drugog taska pokuša da pokrene isti programski deo
> (deluje nebulozno), zabrani :) Logično je da neće da
> pravi isti izveštaj u oba taska. Ali postoji mogućnost
Štaviše, uopšte nije nelogično, već vrlo verovatno.
Milan
baze.podataka.233pedjak,
> po istoj datoteci i zapisu) moram nekako da izvedem zaključavanje
> zapisa. Pošto nemam ama baš nikakvo iskustvo sa SHARE i mehanizmima
> za zaključavanje pod DOS-om molim one koji su upućeni u problematiku
> da mi objasne kako SHARE radi i kako se izvodi zaključavanje cele
> datoteke i jednog njenog dela. Pomoglo bi i upućivanje na neku
> literaturu.
Da bi mogao da zaključavaš slogove u nekom multitasking okruženju,
potrebno je da prethodno učitaš SHARE. Ukoliko radiš pod nekom
mrežom, to nije potrebno, jer sam mrežni softver ima ugrađen SHARE
mehanizam. Dalje, za sve operacije zaključavanja datoteka i slogova
koriste se dve dosove funkcije:
DOS open file
-------------
AH=3DH
AL=sa kakvim atributima se otvara fajl ( read/write+mrežni atributi )
DS=SEG filename
DX=OFS filename
INT 21H
DOS Control Record Access
-------------------------
AH=5CH
AL=0/1 ( 0 - zaključavanje, 1 - otključavanje )
BX=handle
CX=FILE_OFFSET_HI_WORD
DX=FILE_OFFSET_LO_WORD
SI=RECORD_LEN_HI_WORD
DI=RECORD_LEN_LO_WORD
INT 21H
Kao što vidiš funkcije zaključavanja slogova se mogu lako
implementirati u bilo kom modernom jeziku. Ali, pošto vidim da radiš
u C++, u C-u već postoje gotove funkcije koje omogućavaju
zaključavanje slogova. Za otvaranje fajlova koristi sopen koji barata
datotekama na handle nivou, a za zaključavanje funckiju locking.
Pogledaj i /rsoft/r068cht.zip, dat je jedan mali primer na tu temu
chat između dva noda na mreži.
p.s. ove funkcije postoje u MS C-u, za Borland nisam siguran.
baze.podataka.234djelovic,
> ove funkcije postoje u MS C-u, za Borland nisam siguran.
Ih, pa nemoj da vređaš :). BC++ ne samo da nudi Microsoftovu funkciju
locking, nego i nudi mnogo komfornije lock i unlock.
baze.podataka.235neman,
> Zasto? Taj slog se otkljuca cim se korisnik sledeci put
> uloguje. Nema nikakve nekonzistentnosti i nikakvog
> reindeksiranja jer je zapravo tabela
Zato sto dok se korisnik ponovo ne uloguje ( a recimo slucajno ispadne )
ti nemas pojma da li on stvarno radi, tj. morao bi da uporedjujes listu
korisnika koju mozes da dobijes preko Novell API-ja, a cemu onda dodatna
baza ?. Da, da, treba podesiti vreme ocitavnja stanja radnih stanica.
baze.podataka.236neman,
> I ovde je trivijalno ograniciti istovremeni broj usera.
Mislim da Novell ima mogucnost zabrane prijave korisnika pod istim
username-om. Definisi zatim grupu koja pristupa tom programu i to je to.
baze.podataka.237djelovic,
> Zato sto dok se korisnik ponovo ne uloguje ( a recimo slucajno ispadne )
> ti nemas pojma da li on stvarno radi, tj. morao bi da uporedjujes listu
> korisnika koju mozes da dobijes preko Novell API-ja, a cemu onda dodatna
> baza ?. Da, da, treba podesiti vreme ocitavnja stanja radnih stanica.
Dodatna baza radi ograničenja maksimalnog broja ljudi koji koriste program
i radi određivanja jedinstavnenog broja za svaki proces nezavisno od OS-a na
kome se sve to izvršava.
baze.podataka.238misa.m,
>> ...uglovi na okvirima koji imaju nešto jednostrukih i nešto dvostrukih...
Što ne uradiš običnu zamenu, ništa se ne gubi u izgledu:
repl all details with chrtran(details,"ÍĚËŻ║","┌┐└┘│")
baze.podataka.239misa.m,
>> USE baza ORDER pol
>> t5 = SECO()
>> BROWSE FOR pol = "M" NOWAIT WINDOW prozor
Kada već ovako lepo testiraš Fox ubaci ako te ne mrzi i varijantu koja
bi trebalo da bude efikasnija od Rushmore tehnologije u ovom poslednjem
slučaju, odnosno kada je sam uslov u master indeksu:
use baza order pol
if seek("M")
brow while pol = "M" nowait
endif
baze.podataka.240evlad,
>> Joj, to je :) Hvala - reko', Fox mi pobrljavio (a do sada nisam bas
>> previse kalemio sa matricnim stampacima; plus sto nemam nikakav Ref.
>> menjual).
Ako nemas YUSCII slova na svedskom setu moze se font download-ovati,
ali na samo 6 mesta. Ako ti to treba javi mi se na mail posto je malo duze.
baze.podataka.241nbatocanin,
> Ako user iz drugog taska pokuša da pokrene isti programski deo
> (deluje nebulozno), zabrani :) Logično je da neće da pravi isti
> izveštaj u oba taska.
Ne bih rekao :) Na primer, jedan proces traži zbirni izveštaj o
prodaji u poslednjih mesec dana, a drugi od početka godine, zbog
poređenja. Ja sve privremene datoteke kreiram tako da budu
jedinstvene za svaki proces - tako nema problema makar svi
istovremeno tražili isti izveštaj. Biće reči u novim Računarima :)
baze.podataka.242misa.m,
Mala uporedna analiza korišćenja memorije i veličine Fox-ovih
run-time izlaza na jednoj maloj aplikaciji (sve u KB). Ponekad
i samo par KB memorije više mnogo znači.
A B C D E
-----------------------------------------------------------
FOXR+APP 265(512) 471(3676) 38582
Comp EXE 275(513) 471(3676) 49182 22130 47205
Stan EXE 272(517) - 1303087
Ext EXE - 495(3768) 1355963 751590 776988
-----------------------------------------------------------
A - Standard: slobodna osnovna i do 1MB memorija (pokrenut sa -x)
B - Extended: slobodna osnovna i ukupno rezervisana XMS memorija
C - Veličina aplikacije na disku
D - Veličina nakon pakovanja sa ARJ a
E - Isto kao D, stim što je aplikacija napravljena sa Encrypt opc.
Mašina je 386/40 sa 8MB, QEMM 7.04, Fox je 2.6 DOS
baze.podataka.243max.headroom,
> Zašto? Taj slog se otključa čim se korisnik sledeći put
> uloguje.
Zar neće izabrati novi nezaključan record iz baze?
baze.podataka.244max.headroom,
> Hm, ovo mi nije baš najjasnije. Zašto bi kreiranje u RAM
> disku bilo sigurnije od kreiranja na disku? I kakve veze
> ima random ime sa sadržajem baze?
Dobro, ovo je reply na moje pisanije. Nisi me razumeo - pričao sam o
malim temporary bazama (što se RAM diska tiče), ali drugi deo (random
ime i sadržaj baze) nisam dovodio ni u kakvu vezu :)
baze.podataka.245max.headroom,
(SQL SELECT nastavak...)
Wildcard (*)
------------
Wildcard se u SQL komandi može pojaviti samo u listi polja. Kada se
umesto naziva polja navede *, u rezultat se ubacuju sva polja iz
navedene baze, odn. moguće je navesti * posle naziva radne oblasti.
Primer:
SELECT * FROM baza1, baza2 ;
WHERE b1art = b2art
SELECT baza1.*, baza2.polje1, baza2.polje2 ;
FROM baza1, baza2 ;
WHERE b1art = b2art
U rezultat su (prvi primer) uključena sva polja iz obe baze (BAZA1.DBF i
BAZA2.DBF). U drugom primeru u rezultat su uključena sva polja iz
BAZA1.DBF baze i polja POLJE1 i POLJE2 iz BAZA2.DBF baze.
AS (Alias za naziv kolone)
--------------------------
Znate i sami da je dosta nezgodno gledati BROWSE ili neki report kada
su nazivi kolona (Headings, parametar :H u BROWSE-u) identični
nazivima polja u bazi (npr. "red_br_a" ili "datrodj"). SQL SELECT
parametar AS nam omogućava da nazive kolona koje se pojavljuju u
rezultatu predefinišemo. Primer:
SELECT datrodj AS datum_rodj, pbr AS post_broj ;
FROM baza1
Rezultujući BROWSE će imati nazive kolona "datum_rodj" i "post_broj".
Alias ime kolone ne sme prelaziti 10 karaktera, i ne sme sadržati
spejsove. Nezgoda je što ovaj parametar nije definisan ANSI/ISO
standardom, pa će tako kreirani query biti neportabilan (neće moći da
se seli na druge platforme).
DISTINCT (zabrana ponavljanja)
------------------------------
DISTINCT eliminiše duplicirana polja iz rezultata. Na primer, ako
želimo listu imena i svih zaposlenih u firmi, koristićemo:
SELECT DISTINCT ime ;
FROM baza1
Međutim, ako u rezultat ubacimo još jedno polje:
SELECT DISTINCT ime, prezime ;
FROM baza1
Pojavljivaće se duplirana imena u slučajevima kada su prezimena
različita. Evo šta SQL radi kada naiđe na DISTINCT:
- kreira se pomoćna baza koja sadrži sve vrednosti iz zadatog polja.
- nad tom bazom se kreira unique indeks (odn. na polju (poljima) koje
je obeleženo sa DISTINCT).
- SQL tada primenjuje kreirani indeks na privremenu bazu i u
rezultat povlači samo podatke iz indeksa. Daklem, bez duplikata.
Međutim, sve ovo ume i da potraje...
WHERE
-----
Najčešće nam nije namera da u rezultat query-ja guramo sve vrednosti
iz polja, tj. potrebno nam je da polja koja će stići u rezultat
odgovaraju nekom uslovu. Za to nam je potrebna neka vrsta filtera. Ako
koristimo SET FILTER komandu nad bazom iz koje rezultate vadimo sa
SQL SELECT-om, nećemo postići ništa, jerbo se eksterni filteri
ignorišu. Zato u sledećem primeru kao rezultat dobijamo sva polja iz
baze:
USE baza1
SET FILTER TO UPPER(republika) = "SRBIJA"
SELECT ime, prezime, republika FROM baza1
Za željeni rezultat potrebno je sledeće:
SELECT ime, prezime, republika ;
FROM baza1 ;
WHERE UPPER(republika) = "SRBIJA"
Filteri i podfilteri
--------------------
Podfiltere je moguće praviti sa AND i OR. Može ih biti koliko hoćete
unutar jedne WHERE opcije. Primer:
SELECT racun, predracun
FROM racuni, predrac
WHERE racun = predracun ;
AND UPPER(ime) = "MARKO" ;
AND UPPER(prezime) = "CICIĆ" ;
AND datum >= š01.01.94ć ;
AND datum <= š10.01.94ć
Kao rezultat se dobija lista racuna i predracuna (sa identičnim
brojevima) koje je kupio Marko Cicić u periodu od 01.01. do 10.01.
1994. godine. Još jedan primer:
SELECT racun, predracun
FROM racuni, predrac
WHERE racun = predracun ;
AND UPPER(ime) = "MARKO" ;
AND UPPER(prezime) = "CICIĆ" ;
OR datum >= š01.01.94ć ;
AND datum <= š10.01.94ć
Rezultat je identičan rezultatu iz prethodnog primera, sa tom razlikom
što se izbacuju i računi/predračuni koji su ili pisani na Marka Cicića,
ili pripadaju navedenom vremenskom periodu.
JOIN
----
Kada u query-ju imamo posla sa više baza, potrebno je da primenimo
specijalni tip WHERE opcije, zvane "join". Join uspostavlja relaciju
bilo one-to-one, bilo one-to-many tipa nad bazama navedenim posle
FROM. Ako se, pak, ne koristi JOIN, SQL primenjuje sistem po kome su
svi zapisi iz BAZA1.DBF baze povezani sa svim zapisima iz BAZA2.DBF
baze. U slučaju da baza1 ima 10,000 zapisa, a baza2 200,000 zapisa,
rezultat sadrži 2,000,000 zapisa. To ume da POTRAJE.
Ograničenja su sledeća: nemože se imati query u kome je jedna baza
povezana relacijom sa više od jedne baze-roditelja. Na primer, ako je
baza RACUNI (brojevi računa i suma sa računa) povezana relacijom
one-to-many sa bazama SPECIFIK (brojevi računa, stavke sa računa i
cene), odn. PLACENO (brojevi računa i datumi prispelih uplata na
iste), nije moguće generisati rezultat koristeći jednostavno:
SELECT * FROM racuni, specifik, placeno ;
WHERE specifik.brracuna = racuni.brracuna ;
AND placeno.brracuna = racuni.brracuna
jer SQL poredi sadržaje polja iz više baza sa sadržajem polja u jednoj
bazi, pa se kao rezultat dobija jedan zapis za svaki od zapisa u
child-bazi, i tako za svaku relaciju. Jendostavnije, dobija se višak
zapisa :)
BETWEEN
-------
Koristi se da se utvrdi da li vrednosti polja odgovaraju zadatom
intervalu, sa tim da vrednosti polja ne smeju biti drugačijeg tipa od
onog u uslovu. Primer:
SELECT brracuna FROM racuni ;
WHERE datum BETWEEN š01.01.94ć AND š10.01.94ć
IN
--
IN se koristi kada želimo poređene sadržaja navedenog polja sa
definisanim skupom vrednosti. Primer:
SELECT brracuna FROM racuni ;
WHERE UPPER(kupac) IN("INTERSOFT","COMTRADE","ABC COMPUTING")
Rezultat su svi brojevi računa koji su izdati firmama Intersoft,
ComTrade i ABC Computing. Kao i u BETWEEN-u, vrednosti polja ne smeju
biti drugačijeg tipa od onog navedenog u uslovu. Takođe, moguća je i
sledeća kombinacija:
SELECT brracuna FROM racuni ;
WHERE UPPER(kupac) NOT IN("čIKA COMP","MIKA COMP")
Pa se kao rezultat dobijaju brojevi računa koji NISU izdati firmama
čika Computers i Mika Computers.
(Nastavak o SQL SELECT sledi...)
baze.podataka.246mdrazic,
> Zanima me koji se software za baze podataka pokazao kao
> najbolji pod UNIX operativnim sistemom ???
Oracle 7 je po reklamama šio ostale po brzini otprilike
duplo. Kako, ne znam. Najavljuje se Oracle 8 (višestruki
commit, replikacija tabela,... koliko sam čuo).
Ne znam ima li DB2 za Unix. Zavisi i na kojoj platformi.
Milan
baze.podataka.247mdrazic,
Evo stigla mi je pod ruku jedna bibliografija iz oblasti
projektovanja i CASE-a. Ko ima informacije o nekoj od
knjiga (kakva je, sadržaj, gde se nalazi itd.) molim da
javi ovde.
1. Paul T. Ward, Stephen J. Mellor
Structured Development for Real Time Systems (Vols I-III)
Yourdon Press, 1985.
2. Derek J. Hatley, Imtiaz A. Pirbhai
Strategies for Real-Time System Specification
Dorset House, 1987.
3. Meiler Page-Jones
Practical Guide to Structured Systems Design (Second Edition)
Yourdon Press, 1987.
4. Tom DeMarco
Structured Analysis and Systems Specification
Yourdon Press, 1978.
5. E. N. Yourdon
Modern Structured Analysis
Yourdon Press, 1988.
6. S. Shlaer, S. Mellor
Object Oriented Systems Analysis
Yourdon Press, 1989.
7. M. McMenamin, J. F. Palmer
Essential Structured Analysis
Prentice-Hall, 1984.
8. B. Dickinson
Developing Quality Systems
Yourdon Press, 1989.
9. P. Chen
The Entity-Relationship Approach to Logical Database Design
QED Information Sciences, 1977.
10. James Martin, Carma McClure
Structured Techniques for Computing
Prentice-Hall, 1985.
11. Michael Jackson
System Development
Prentice-Hall Intl., 1983.
12. E. N. Yourdon, L. L. Constantine
Structured design
Prentice-Hall, 1979.
13. C. Gane, T. Sarson
Structured Systems Analysis: Tools and Techniques
Prentice-Hall, 1979.
14. B. Dickinson
Developing Quality Systems (second edition)
Yourdon Press, 1989.
15. Carma McClure
CASE Is Software Automation
Prentice-Hall, 1988.
16. R. Elmasri, S. Navathe
Fundamentals of Database Systems
The Benjamin/Cummings Company Inc., 1989.
17. Peter Coad, Edward Yourdon
Object Oriented Analysis (second edition)
Yourdon Press, 1990.
18. Rex Hogan
A Practical Guide to Database Design
Prentice-Hall, 1990.
19. C. Fleminf, B. VonHalle
Handbook of Relational Database Design
Addison-Wesley, 1989.
20. Larry Towner
CASE Concepts and Implementation
McGraw Hill, 1989.
21. James Martin
Information Engineering (Books 1-3)
Prentice-Hall, 1989.
Ako neko ima još neku referencu u vezi projektovanja,
molim da doda.
Posebno molim kolege sa FONa i ETFa da provere ima li nešto
od ovoga u njihovoj biblioteci.
Milan
baze.podataka.248ppekovic,
>> Zanima me koji se software za baze podataka pokazao kao najbolji pod
>> UNIX operativnim sistemom ???
Teško je reći koji je najbolji, ali je najpopularniji svakako
ORACLE.
Paya
baze.podataka.249djelovic,
> > Zašto? Taj slog se otključa čim se korisnik sledeći put
> > uloguje.
>
> Zar neće izabrati novi nezaključan record iz baze?
Ma hoće, ali sam odgovarao na zamerku da će u slučaju pada mašine slog
ostati zaključan. Bez obzira da li mreža vrši automatski logout, sve se dovede
na meste čim se korisnik opet uloguje.
baze.podataka.250max.headroom,
> Štaviše, uopšte nije nelogično, već vrlo verovatno.
Znaem, znaem :) Zato sam i dao primere sa datumima (nisam mislio da
prog. task bude otvaranje prozora :)
baze.podataka.251max.headroom,
> Ne bih rekao :) Na primer, jedan proces traži zbirni
> izveštaj o prodaji u poslednjih mesec dana, a drugi od
> početka godine, zbog
Buhuhuu, pa ja sam ispod ovog citata dao još dva reda teksta u kojima
objašnjavam da to ne važi kada task ima drugačiji parametar (npr.
izveštaj sa drugačijim datumom, ili, npr. izveštaj za drugu firmu)...
Mislio sam da se beleži u formatu: ime_taska+parametar. Medžutim ;),
ako user pokuša da pokrene ISTI report sa ISTIM parametrima, tada on
prosto ubija dosadu testirajući program, i ima da mu sledi poruka
"Bolje igraj Tetris" :)
Nego, videste li onaj Tetris za Fox? Zamislite koji je to komercijalni
udar za end-usera :)
baze.podataka.252max.headroom,
> Dodatna baza radi ograničenja maksimalnog broja ljudi koji
> koriste program
Baš sam počeo da pišem o Fox-ovom LAN interface-u kada mi neko reče da
to stavim u fajl. Tu je lepo objašnjeno kako skinuti broj aktivnih
usera.
baze.podataka.253mdrazic,
> Mislim da Novell ima mogucnost zabrane prijave korisnika
> pod istim username-om. Definisi zatim grupu koja pristupa
> tom programu i to je to.
Ja teram korisnike da se prijavljuju i u paket. Ne može mi
tamo neki supervisor da radi ako mu ne dozvolim :)) .
U principu imena u mreži i u paketu mogu biti različita.
Pošto isti program (mora da) radi i u mrežnom okruženju i
na običnom PC-ju, ne bakćem se čitanjem Novell username-a,
mada i to ima dobrih strana.
Milan
baze.podataka.254pedjak,
>> ove funkcije postoje u MS C-u, za Borland nisam siguran.
> Ih, pa nemoj da vređaš :). BC++ ne samo da nudi Microsoftovu
> funkciju locking, nego i nudi mnogo komfornije lock i unlock.
Ih :) na radim sa BC++, pa sam se odmah ogradio, da ne ispadne
posle da pričam bezveze :)
baze.podataka.255ndragan,
/ repl all details with chrtran(details,"ÍĚËŻ║","┌┐└┘│")
To nije problem, za aplikaciju ionako generišem sopstveni *help.dbf,
koji izbegava čudna slova, a za pendžersku verziju napokon generišem
zglavan .rtf koji se uredno kompajlira. A u tu priču sa generisanjem
.RTF fajla sam uleteo upravo zato što ne mogu da promenim font u
dos_style help pendžeru, gde su okviri još najmanji problem - mnogo veći
problem je kodna strana tog fonta. Nikad ne znam da li treba da mu dam
memo polje za 1250 ili 852.
baze.podataka.256ndragan,
/ rešenje. (Dobro, ovo nikome ne pada na pamet da koristi iz stojednog
/ razloga, ali hint je interesantan)
Radio sam nešto slično kod nekih prepisa iz baze u bazu u stilu "ajde
sad da prebacimo ove naloge iz fakturisanja u analitiku i glavnu
knjigu". Pošto nije nikad sigurno da se prepis pušta prvi put, kao ni da
li ima isti broj slogova ili ne, ciljna baza je bila indeksirana po
broju naloga i kontu, pa su se svi slogovi koji su već postojali
praznili (izuzev broja naloga), i prepis je išao po principu "ako nađeš
slog sa ključem m.nalog+chr(254), gazi slobodno, inače pravi nov". Tako
je, istina, ponekad ostajalo nešto slogova sa chr(254) u kontu, ali
garant praznih po svim drugim pitanjima pa su se mogli ladno ignorisati.
Inače, taj štos nije loš ako rutinu za upis pišeš peške i taj se trik
pojavljuje regularno (u svim bazama itd). Ostaje još samo da se
povremenu uradi Pack Memo, što opet treba sračunati kada treba da se
radi.
BTNJ, jel neko napisao funkciju koja bi umela da vrati količinu bačenog
prostora u .fpt fajlu, pa da onda malo proračunamo kad je zrelo za
pakovanje, ili čak za pregenerisanje baze sa drugom veličinom bloka.
baze.podataka.257ndragan,
/ inkriminisanog dela programa biti iznova kreirane pod random imenom, a
/ posle upotrebe obrisane. Da ne bih gušio, poenta je u sledećem: ako se
/ ispostavi da neka temporary baza treba da postoji, gurnite je u RAM
/ disk. Manje-više što je brže, nego je _pouzdanije_.
Ne volim da se oslanjam na to da se neka baza nalazi na direktoriju, i
da ima strukturu koju treba da ima; više volim da program sadrži
strukturu, tj
Create Table/Cursor trt_mrt (polje1 c(13), ...)
Naravno, vrlo retko pišem takve rutine... napisao sam programče koje ih
generiše. Štaviše, kad menjam strukturu, izmenim je u takvoj rutini, jer
nikad nisam siguran da neću kroz pet minuta odzipovati bazu sa starom
strukturom ;).
baze.podataka.258ndragan,
/ A uzgred minus je situacija kada aplikacija pukne tj. neregularno :)
/ zavrsi rad.
Baš i nije neki minus - slog je ostao zaključan, piše čiji je, ako broj
potrošenih slogova ne premašuje bonus, korisnik može ponovo da se zakači
itd. Nije loše, mogao bih da probam (mada meni i ne treba, jer sam u
položaju da propišem strogo jednokratno prijavljivanje).
S druge strane, mislim da je zaključavanje sloga malo skupo rešenje,
troši se po jedna brava za svakog korisnika; lakše bi bilo da se postavi
indikatorsko polje i da se kontroliše iz aplikacije te da ladno otkačiš
ponovo prijavljenog korisnika. Ovako ostavljaš mreži da se petlja sa
bravama svaki put kad neko pristupi toj bazi.
baze.podataka.259ndragan,
/ Mislim da Novell ima mogucnost zabrane prijave korisnika pod istim
Na novelu 4.x (valjda i na 3.*) za svakog korisnika imaš varijantu da
definišeš najveći broj istovremenih prijava; difolt je 3 a niko te ne
sprečava da staviš 1.
baze.podataka.260ndragan,
/ sledećem otvaranju iz baze bivaju izbrisane sve definicije indeksa i
/ greška se više ne javlja, ali to nipošto ne rešava problem :)
Upravo tako, moraš sam da ga rešiš :).
Naime, difolt ponašanje je da se prilikom otvaranja baze sa kršnim .cdx
fajlom isti jednostavno ignoriše, i to tako što se u zaglavlju baze isti
komplet zaboravi. Ja upravo tako i indeksiram, prvo obrišem .cdx sa
diska, pa otvorim bazu; foks javi grešku, koju odignorišem (dobro,
presretnem) i reagujem tako da bazu otvorim ponovo, i onda _pravim_ nov
.cdx fajl.
Naravoučenije: aman ljudi, svi smo se po jednom zeznuli stavljajući
Reindex u proceduru za indeksiranje. To pada na prvom indeksu sa
oštećenim hederom. Procedura za indeksiranje treba (mora!) da sadrži
kompletnu informaciju o ključevima i eventualnim filtriranim indeksima,
a ni u kom slučaju ne sme da zavisi od toga da li na disku već postoji
indeksni fajl i u kakvom je stanju.
p.s. problem je čak i ako se to desi kad smo kod korisnika - ko će se
setiti naziva, redosleda i tačnih indeksnih pojmova za sve tegove, a?
baze.podataka.261ndragan,
/ Rešenje ovog problema sastoji se u sledećem: indeksirajte bazu (u
/ kojoj važi SET DELETED ON) po još jednom ključu -
Da, tako nešto piše i u helpu, mada mi se baš i ne sviđa previše. Ovo je
u stvari problem tipa "starim putem pa bez drumarine ili obratno". S
jedne strane, ako nemam mnogo obrisanih slogova, cela priča me se ne
tiče previše, i samo me nervira što uopšte tretira te obrisane slogove
/zar nisu mogli da drže i brojač obrisanih slogova u zaglavlju baze/,
ali me se tiče što mi sve radi dovoljno sporije. Select count() upravo
služi brojanju neobrisanih slogova (ukupan se ionako dobija sa recc());
s druge strane, inde on dele() to trt_mrt goji .cdx fajlove i usporava
pristup istima čisto zbog veličine (jes' da ima ukupno dva indeksna
pojma, ali zato ima po bar tri bajta za svaki slog, plus režija u
zaglavljima blokova). Sve skupa, opet treba da proračunavamo kad nam se
šta isplati.
baze.podataka.262ndragan,
/ SQL SELECT ignoriše ORDER postavku, te tako ne pati od pomenutih
/ "stomačnih tegoba".
Jes', ali u helpu isto kaže da i Select radi brže ako baza ima order 0;
nemam pojma zašto, ali ako su to napisali isti ljudi koji su to i
pravili, valjda oni znaju.
baze.podataka.263ndragan,
/ Eto - zaključke izvlačite sami :)
Jel to beše tek od 2.5 ili 2.6 uvedeno Browse ... Rest, tako da se uradi
jedno Seek ili Locate, pa onda Browse For ... Rest, tako da ni ne
pokušava da gleda bazu do tog mesta, nego odmah skače na taj slog i
gleda ostatak. Trebalo bi da je brže od svega.
baze.podataka.264max.headroom,
(Nastavak SQL SELECT...)
LIKE
----
žesto se dešava da ne želimo tačno poređenje dva izraza, odn. da imamo
potrebu da samo deo jednog izraza tražimo u drugom. Za to se kod SQL
SELECT-a koristi LIKE opcija, sa odatkom % ili _ operanda.
% - Koristi se da se zameni proizvoljan broj karaktera. Posebno je
koristan za pretrage po memo-poljima. Primer:
SELECT roba.brartikla, roba.opis, racuni.brracuna ;
FROM roba, racuni ;
WHERE racuni.brartikla = roba.brartikla ;
AND roba.opis LIKE "%Patike%"
Rezultat su svi brojevi artikala zajedno sa opisima, a koji su izdati
po fakturama. Uslov je i taj da se u opisu robe mora nalaziti reč (deo
reči) "Patike". Opis može biti i memo-polje. U rezultujućem polju OPIS
mogu se naći "Crvene Patike", kao i "Patike Zelene" :)
_ - (Underscore) Ovaj wildcard je sličan DOS-ovom ?. On zamenjuje
jedan karakter u izrazu. Na primer:
SELECT roba.brartikla, racuni.kupac, racuni.brracuna ;
FROM roba, racuni ;
WHERE racuni.brartikla = roba.brartikla ;
AND racuni.kupac LIKE "M_rko"
Rezultat su svi brojevi artikala zajedno sa opisima, a koji su izdati
po fakturama. Uslov je i taj da se u imenu kupca pojavljuje "Marko"
ili "Mirko". Normalno, džoker-znake _ i % moguće je i kombinovati
unutar jednog izraza. Međutim, u slučaju da u izrazu tražimo upravo
neki od ta dva znaka (% ili _), koristimo opciju ESCAPE. Primer:
SELECT roba.brartikla, racuni.kupac, racuni.brracuna ;
FROM roba, racuni ;
WHERE racuni.brartikla = roba.brartikla ;
AND racuni.kupac LIKE "%/%%" ESCAPE "/"
Znači, u imenu kupca tražimo znak "%". Karakter koji je naznačen posle
ESCAPE je karakter posle koga se nalazi znak koji se ne prevodi.
Dakle, ako smo za ESCAPE karakter naznačili "/", tada i u izrazu,
odmah posle ESCAPE karaktera (%/%%) mora da postoji vrednost koja se
neće prevoditi kao wildcard - u ovom slučaju to je znak "%".
SQL i makroi
------------
SQL komanda bez problema koristi makroe (macro substitution), i što je
najvažnije, makro se u query-ju prevodi samo jednom. Primer:
baza1 = "BAZA.DBF"
baza2 = "LISTA.DBF"
SELECT * ;
FROM (baza1) ;
WHERE baza = &baza2
A makroi se mogu koristiti čak i kod LIKE klauzule, radi poređenja:
naziv = "Patike"
SELECT roba.brartikla, roba.opis, racuni.brracuna ;
FROM roba, racuni ;
WHERE racuni.brartikla = roba.brartikla ;
AND roba.opis LIKE "%&naziv%"
SQL i veličina slova (Case Sensitivity)
---------------------------------------
SQL je case-sensitive, tj. pravi razliku između velikih i malih slova.
Npr. ako se u polju ime nalazi "Marko", tada poređenje tipa ime =
"MARKO" daje False rezultat. Zato bi valjalo navesti jedno UPPER.
SQL i indeksi
-------------
WHERE opcija koristi Rushmore i indekse da bi ubrzala pretragu. SQL
može koristiti sve tipove indeksa: structural CDX (tag), external CDX
ili external IDX. Međutim, da bi SQL mogao da iskoristi eksterne
indekse, pre pozivanja SELECT komande potrebno je takve indekse i
otvoriti. Primer:
USE baza INDEX idxfajl, extcdx
Sortiranje rezultata sa ORDER BY
--------------------------------
ORDER opcija može biti primenjena na proizvoljan broj polja, što znači
da se rezultujuća baza može sortirati po proizvoljnom broju
parametara (odn. onoliko polja koliko se nalazi u listi polja posle
SELECT). Primer:
SELECT republika, ime ;
FROM baza ;
WHERE republika IN ("SRBIJA","CRNA GORA") ;
ORDER BY republika, ime
Rezultujući BROWSE će prikazati podatke sortirane po republikama, a
unutar njih po imenima. Sortiranje je ASCENDING (default, od A do Z),
što se može i promeniti dodavanjem opcije DESCENDING (od Z do A).
Moguće je čak kombinovati ASCENDING (ne navode se eksplicitno) i
DESCENDING parametre. Primer:
SELECT republika, ime ;
FROM baza ;
WHERE republika IN ("SRBIJA","CRNA GORA") ;
ORDER BY republika, ime DESCENDING
U rezultatu će podaci biti prikazani po republikama (prvo Crna Gora,
zatim Srbija - od A do Z), a unutar tako isortiranih podataka
sortiraju se imena od Z do A (DESCENDING). Konačno, moguće je
rezultujuću bazu (sa ORDER BY) sortirati i po rednom broju polja
navedenog u listi polja posle SELECT (korisno ako sortiramo po poljima
koja sadrže neki UDF ili neku Fox-ovu f-ju tipa UPPER() ili LEFT()).
Primer isti kao i prethodni:
SELECT republika, ime ;
FROM baza ;
WHERE republika IN ("SRBIJA","CRNA GORA") ;
ORDER BY 1, 2 DESCENDING
Funkcije za rad sa kolonama
---------------------------
U listi polja je moguće navesti bilo koju od sledećih funkcija:
AVG(ime_polja) - Prosek za navedeno polje. Polje mora sadržati samo
numeričke vrednosti.
SUM(ime_polja) - Suma za navedeno polje. Polje mora sadržati samo
numeričke vrednosti.
MIN(ime_polja) - Najmanja vrednost u navedenom polju. Dozvoljeni
tipovi podataka su: Numeric, Character i Date.
MAX(ime_polja) - Najveća vrednost u navedenom polju. Dozvoljeni
tipovi podataka su: Numeric, Character i Date.
COUNT(ime_polja) - Broj zapisa u kojima se pojavljuje određeno polje.
Taj broj zavisi isključivo od filtera koji se
primenjuje nad bazom. Zato se umesto (ime_polja)
može navesti i * wildcard.
SELECT SUM(cena), artikal ;
FROM racuni ;
WHERE datum = š10.01.94ć
Navedeni primer daje summary rezultat cena za svaki artikal prodat
10.01.1994., ali sve to u jednom zapisu (pogledati GROUP BY za
drugačiju izvedbu). Rezultate je moguće i sortirati pomoću ORDER BY:
SELECT SUM(cena), artikal ;
FROM racuni ;
WHERE datum = š10.01.94ć ;
ORDER BY artikal, 1 DESC
Moguće je koristiti i opciju DISTINCT za sve f-je za rad sa kolonama
osim MIN() i MAX(). Npr:
SELECT AVG(DISTINCT cena), artikal ;
FROM racuni
Ali pažnja - moguće je imati samo jedan DISTINCT u listi polja.
Sledeći primer neće raditi:
SELECT DISTINCT AVG(DISTINCT cena), artikal ;
FROM racuni
I još nešto: COUNT() f-ja neće dozvoliti upotrebu DISTINCT opcije ako
je ime polja zamenjeno sa * (wildcard), npr. COUNT(DISTINCT *). Da bi
se uradilo DISTINCT, u COUNT()-u se mora navesti i ime polja.
I još jedna sitnica :) - nije moguće izvršavati "nested" f-je za rad
sa kolonama, tipa:
SELECT SUM(AVG(cena)) FROM racuni
Jerbo Fox prijavljuje grešku "AVG.PRG cannot be found".
(Nastavak SQL SELECT sledi...)
baze.podataka.265zoranv,
Jedan problem vazna za Fox Pro za Win 2.5.
Kako da se postigne poravnanje teksta uz desnu marginu u jednoj od kolona
u BROWSE prozoru?
baze.podataka.266zoranv,
Da li neko zna da li postoji grupa za Fox Pro za WIndows?
Ja sam zainteresovan ...
baze.podataka.267dr.grba,
>> Jel to beše tek od 2.5 ili 2.6 uvedeno Browse ... Rest, tako da se uradi
>> jedno Seek ili Locate, pa onda Browse For ... Rest, tako da ni ne
Eto, a mene si zimus zezao zbog "tek sad uvedenog" SCOPE indeksa u Clipper.
(:
baze.podataka.268pedjav,
> Da bi mogao da zaključavaš slogove u nekom multitasking okruženju,
> potrebno je da prethodno učitaš SHARE. Ukoliko radiš pod nekom
> mrežom, to nije potrebno, jer sam mrežni softver ima ugrađen SHARE
Dobro, to je sve OK i jasno mi je. Ali tu se sad postavlja još jedan
problem - dead-lock? Da malo pojasnim problem:
Proces A je zaključao jedan slog i zahteva drugi slog koji, međutim,
drži proces B, koji istovremeno zahteva baš onaj slog koji drži
proces A. Tako se stvara jedna beskonačna petlja u kojoj dva procesa
čekaju da budu oslobođeni slogovi koji im trebaju trošeći
procesorsko vreme.
U praksi se može dogoditi da jednu takvu petlju čini veći broj procesa.
Mene sada interesuje da li SHARE o svemu ovome vodi računa pre nego što
dozvoli zaključavanje nekog sloga ili ću sam morati da napišem neku
rutinu koja će to regulisati (napr. neće dozvoliti zaključavanje
ukoliko će to dovesti do pojave dead-locka).
baze.podataka.269max.headroom,
> Jes', ali u helpu isto kaže da i Select radi brže ako baza
> ima order 0;
Hmmm... tada je baza već otvorena, pa je i logično - SQL SELECT nema
potrebu da istu ponovo "fizički" otvara, već je iskopira u drugu radnu
oblast (USE...AGAIN). Verovatno grešim.
baze.podataka.270max.headroom,
> gleda ostatak. Trebalo bi da je brže od svega.
Da, ja sam računao na ver. 2.00. Ipak, 2.5 for DOS/WIN je još uvek u
fazi razbucavanja :)
baze.podataka.271max.headroom,
(Nastavak SQL SELECT...)
GROUP BY
--------
Ranije sam pomenuo primer:
SELECT SUM(cena), kupac ;
FROM racuni ;
WHERE artikal = "Cipele"
Daklem, kao rezultat se dobija samo jedan zapis, a mi smo želeli
zbirno izračunati koliko je koji kupac kupio cipela, odn. jedan zapis
po kupcu (sa sub-totalom za svakog kupca). Za takvo nešto potrebno je
koristiti GROUP BY opciju. Ona grupiše rezultat po navedenom parametru
(nazivu polja). Primer koji to radi:
SELECT SUM(cena), kupac ;
FROM racuni ;
WHERE artikal = "Cipele" ;
GROUP BY kupac
Kada Fox izvršava query sa GROUP BY, on kreira jednu međubazu u koju
prenosi sadržaje svih navedenih polja iz liste polja, kao i polja
navedena iza GROUP BY. To znači da rezultat možemo grupisati i po
polju koje se ne pojavljuje u rezultatu. Tada se polja filtriraju po
uslovu koji stoji posle WHERE. Potom se podaci grupišu i nad njima se
izvršava SUM() ond. neka druga SQL f-ja. Posle GROUP BY se može
navesti proizvoljan broj polja, pa je moguća i ova kombinacija:
SELECT artikal, SUM(cena), kupac ;
FROM racuni ;
GROUP BY artikal, kupac
Još nešto - GROUP BY radi brže od DISTINCT, pa je, ako želimo
grupisanje podataka neke velike baze (a ne želimo redundantne zapise),
grupisanje potrebno uraditi po nekom unique polju (U prethodnom
primeru bi se mogla otvoriti i baza ROBA.DBF, iz koje bi se vadile
šifre artikala - one se sigurno ne ponavljaju).
HAVING
------
Pošto smo sa GROUP BY sredili da dobijamo subtotale, javlja se sledeći
problem - kako ustanoviti kriterijum koja će se grupa pojavljivati u
izveštaju, a koja neće? Nije moguće koristiti WHERE opciju jer ona ima
uticaj samo na originalnu bazu, dok je nama potreban filter za
međubazu kreiranu od GROUP BY. HAVING opcija nam omogućava upravo to -
koje će grupe preći u međubazu i pojaviti se u izveštaju. Kontrola se
vrši uglavnom AVG(), SUM() ili nekom sličnom SQL f-jom, a koja može i
ne mora biti ista kao i SQL f-ja u listi polja. Primer:
SELECT SUM(cena), kupac ;
FROM racuni ;
WHERE artikal = "Cipele" ;
GROUP BY kupac ;
HAVING SUM(cena) > 0
Tako da query omogućava pregled samo onih grupa kojima je subtotal
veći od nule.
(Dešava se da programer uradi sledeće:
SELECT * FROM racuni HAVING artikal = "Cipele"
što se izvršava sto puta sporije, a Rushmore-u ne pada na pamet da ga
gleda. Najpravilnija kombinacija je:
SELECT * FROM racuni WHERE artikal = "Cipele" )
U KOM OBLIKU ĆE BITI REZULTAT?
------------------------------
FoxPro 2.5 omogućava direkciju izlaza (SELECT INTO) u: CURSOR, DBF
(TABLE) i ARRAY. Rezultat se može smestiti i u ASCII FILE ili biti
poslat na PRINTER. Može se koristiti INTO ili TO opcija, ali ne obe
odjednom (iako će SQL dati prednost INTO opciji).
INTO CURSOR
-----------
SELECT "cursor" je privremena baza na koju se primenjuje filter -
sada, zavisno od veličine tog temporary fajla, on će biti ili u
memoriji, ili na disku. I to su uglavnom read-only baze. Međutim, ako
se podaci dobijeni kroz query žele zadržati za dalju upotrebu (npr.
njihovo propuštanje kroz novi query), najbolje je raditi smeštanje
podataka ne u "cursor", već u "dbf" (ili "table"). Ali ako je IPAK
potrebno imati tu privremenu bazu na disku (dakle, da budemo sigurni
da je ona i na disku, a ne da se samo povlači po memoriji), koristimo
sledeće:
- AS opciju za zaglavlja polja.
- Korišćenje izraza u listi polja koji nije samo puko ime polja.
- GROUP BY ili ORDER BY opciju.
- Neka SQL f-ja za operacije nad kolonama (poljima) - AVG(), SUM()...
Pretpostavimo da pokušate da koristite "cursor" da bi podatke iz njega
prebacili u neku drugu bazu. Tada je neophodno znati da je "cursor"
neka postojeća baza na disku, a ne njena kopija u memoriji. Ako
"cursor" baza (sa odgovarajućim filterom) postoji na disku, APPEND
FROM komanda će ignorisati filter uspostavljen SELECT komandom i
dodati sve zapise iz izvorne baze. Da bi se odredilo da li imate
filtrirani ili "pravi" cursor, treba posle završenog query-ja uneti
sledeće:
xx = DBF()
Pa ako je xx baza sa nastavkom .TMP, u pitanju je "pravi" cursor.
Međutim, još uvek se ne možete pozvati na alias radne oblasti (u ovom
slučaju ime cursor-a), jer kada se koristi APPEND FROM, mora se
navesti i ime baze. Tada se radi sledeće:
SELECT * FROM racuni ;
WHERE datum BETWEEN š01.01.94ć AND š10.01.94ć ;
INTO CURSOR kursor ORDER BY datum
SELECT baza
APPEND FROM (DBF("kursor"))
Još nešto - pazite šta se događa sa filtriranim cursor-om u
višekorisničkoj sredini, jer je on, jednostavno, baza na koju se
primenjuje filter. Svaka izmena u originalnoj bazi dovodi do promene
resultata u cursor-u.
INTO ARRAY
----------
SELECT kupac, brracuna ;
FROM racuni ;
WHERE artikal = "Cipele" ;
INTO ARRAY matrica
Padžnja :) - ako nema rezultata, nema ni matrice. Daklem, mora se
proveriti postojanje iste pre njene dalje upotrebe. Najbolji trik je
proverom vrednosti u _TALLY sistemskoj promenljivoj, posle izvršenog
SELECT-a. Primer:
IF _TALLY = 0 && Nema elemenata u matrici, tj. nema matrice
..........
ENDIF
Takođe, nemojte vršiti prenos podataka u matricu ako niste sigurni
kolika je veličina rezultata. Maksimalni broj elemenata jedne matrice
(FoxPro 2.5) je 65,000, a može zafaliti i memorije. U oba slučaja Fox
prijavi grešku.
INTO TABLE / DBF
----------------
Od rezultata query-ja kreira permanentnu bazu. Primer:
SELECT kupac, brracuna ;
FROM racuni ;
WHERE artikal = "Cipele" ;
INTO TABLE baza
Pažnja - ako je SET SAFETY OFF, Fox ne prijavljuje nikakvu poruku u
slučaju da je ime baze navedeno posle INTO TABLE isto kao i ime neke
već postojeće baze (makar ona bila i otvorena), stara baza će biti
zatvorena i nova će pretrčati preko nje (!).
TO FILE
-------
Prebacuje podatke dobijene query-jem u ASCII fajl. Primer:
SELECT kupac, brracuna ;
FROM racuni ;
WHERE artikal = "Cipele" ;
TO FILE fajl.txt ADDITIVE
TO PRINTER
----------
Prebacuje podatke dobijene query-jem na printer. Primer:
SELECT kupac, brracuna ;
FROM racuni ;
WHERE artikal = "Cipele" ;
TO PRINTER NOCONSOLE
baze.podataka.272nbatocanin,
> Mene sada interesuje da li SHARE o svemu
> ovome vodi računa pre nego što dozvoli zaključavanje nekog
> sloga ili ću sam morati da napišem neku rutinu koja će to
> regulisati (napr. neće dozvoliti zaključavanje ukoliko će
> to dovesti do pojave dead-locka).
Nikako. Ovo je problem koji SHARE uopšte i ne može rešavati.
baze.podataka.273gcurcic,
¨˙> Dobro, ovo je reply na moje pisanije. Nisi me razumeo - pričao sam o
¨˙> malim temporary bazama (što se RAM diska tiče), ali drugi deo (random
A zašto ne iskoristiš ADDUSER i za svaku radnu stanicu definišeš direktorijum
za .TMP baze?
baze.podataka.274mdrazic,
> Dobro, to je sve OK i jasno mi je. Ali tu se sad postavlja
> još jedan problem - dead-lock?
>
> broj procesa. Mene sada interesuje da li SHARE o svemu
> ovome vodi računa pre nego što dozvoli zaključavanje nekog
> sloga ili ću sam morati da napišem neku rutinu koja će to
> regulisati (napr. neće dozvoliti zaključavanje ukoliko će
> to dovesti do pojave dead-locka).
Nema teorije da unapred znaš šta će neko drugi zaključati, pa
nikakva rutina za otkrivanje takvih stvari tu ne pomaže.
Stvar je ipak razrešiva. Kada praviš transakciju (upisivanje
na jedno ili više mesta) radiš na sledeći način:
1. (faza širenja)
Pokušaš da zaključaš SVE potrebne tabele. Ako uspeš ideš
na sledeći korak. Ako ne uspeš, tipični scenario je da opet
probaš određeni broj puta. Kada oceniš da nema šanse da
SVE zaključaš, onda odustaješ od transakcije i otključavaš
sve što si do tada zaključao.
2. Ako si došao dovde, znači da su sve potrebne tabele uspešno
zaključane. Niko te sad ne može sprečiti da završiš transa-
kciju. Upisuješ sve što imaš.
3. (faza skupljanja)
Po završenom upisivaju otključaš sve tabele.
Veoma je bitno za komotan rad više korisnika da u ove tri faze
NEMAŠ stanje čekanja (ne daj bože neko editovanje) koje koči
ostale korisnike. Bitno je da se sve tri faze što brže završe
da tabele ne budu dugo zaključane.
Pročitaj lepu knjižicu Suada Alagića: Relacione baze podataka.
Milan
baze.podataka.275mjevta,
>> MAX(ime_polja) - Najveća vrednost u navedenom polju.
>> Dozvoljeni tipovi podataka su: Numeric, Character i Date.
Još uvek koristim FoxPro 2.0 pa me zanima kako u FoxPro - u
2.6 funkcioniše SQL u jednom konkretnom slučaju. Elem:
SELECT MAX( datum ), Ime, ... FROM maticna INTO CURSOR cur ;
WHERE _neki_uslov
... pokupi najveći datum ali ubaci ostale podatke iz poslednjeg?!?
sloga u tabeli. Alternativno rešenje ..
SELECT DISTINCT datum, Ime, ... FROM maticna INTO CURSOR cur;
WHERE datum IN ( SELECT MAX( datum ) FROM maticna ) AND ;
_neki_uslov
... radi ali nisam testirao performanse na vecoj količini podataka.
Kako to radi u 2.6 ?
baze.podataka.276dr.grba,
>> Stvar je ipak razrešiva. Kada praviš transakciju (upisivanje
>> na jedno ili više mesta) radiš na sledeći način:
Scenario je egzaktan i jasan. Ali kako se u ovu priču uklapa neregularni
prekid bilo koje vrste u slučajnom trenutku? Znaš na šta mislim: recimo
prekid kabla ili nestanak struje na klijentovom računaru, baš neposredno
posle zaključavanja tabela...
baze.podataka.277pedjak,
> Dobro, to je sve OK i jasno mi je. Ali tu se sad postavlja još jedan
> problem - dead-lock? Da malo pojasnim problem:
> Proces A je zaključao jedan slog i zahteva drugi slog koji, međutim,
> drži proces B, koji istovremeno zahteva baš onaj slog koji drži
> proces A. Tako se stvara jedna beskonačna petlja u kojoj dva procesa
> čekaju da budu oslobođeni slogovi koji im trebaju trošeći
> procesorsko vreme.
Naravno da je to problem, zato ih moraš sam izbeći. Najpre,
nastojiš da slog držiš zaključanim što je moguće manje vremena,
čisto da upišeš izmene. Drugo, prilikom pokušaja zaključavanja
sloga, koji je već zaključan, DOS vraća informaciju da je slog već
zaključan. Šta tada činiti..? Ne treba neprestano pokušavati sa
zaključavanjem tog sloga, em što nema nekog naročitog smisla, em
što dolazi do naglog pada performansi mreže. Šta se radi: sačeka
se u proseku od 0.5-1.0 sec pa se onda pokuša ponovo. Broj pokušaja
svesti na neku razumnu meru, na primer 10-20 puta. Ako i posle toga
ne uspeš da zaključaš slog, onda program treba da prijavi grešku.
Moraš nastojati da izbegneš situacije koje dovode do ded-loka,
pisanjem programa koji takve situacije izbegavaju.
baze.podataka.278max.headroom,
> A zašto ne iskoristiš ADDUSER i za svaku radnu stanicu
> definišeš direktorijum za .TMP baze?
U suštini, nisam mislio na Fox-ove sveprisutne TMP baze, već na one
koje provejavaju kroz program - deo auditorijuma :) predlaže da se
takve stvari organizuju od strane samog programera, u memoriji (dakle,
pišeš vlastiti source za rad sa bazama, a koji u 99% slučajeva koristi
matrice). Normalno je da postane nezgodno ako TEMPDIR našteluješ na
RAM drajv, a ono TMP pređe tu granicu :)
baze.podataka.279max.headroom,
> Nema teorije da unapred znaš šta će neko drugi zaključati,
> pa nikakva rutina za otkrivanje takvih stvari tu ne
> pomaže.
Varijanta 2:
- prepišeš ono što želiš da edituješ u mem.var.1 i u mem.var.2
(ništa se ne zaključava)
- edituješ mem.var.1
- pogledaš da li je sadržaj sloga sada različit od mem.var.2
(ako jeste, neko je u međuvremenu pisao u njega, pa onoga koji je
upravo završio sa editovanjem o tome obavestiti)
- zaključaš record
- upišeš mem.var.1 u record
- otključaš record
baze.podataka.280mdrazic,
> Varijanta 2:
>
> - prepišeš ono što želiš da edituješ u mem.var.1 i u
> mem.var.2 (ništa se ne zaključava)
> - edituješ mem.var.1
> - pogledaš da li je sadržaj sloga sada različit od
> mem.var.2
...
To je ta ista varijanta, samo se nisam osvrtao na problem
editovanja, već posle toga kako upisati transakciju a da
ne dođe do deadlock-a.
Milan
baze.podataka.281mdrazic,
> Scenario je egzaktan i jasan. Ali kako se u ovu priču
> uklapa neregularni prekid bilo koje vrste u slučajnom
> trenutku? Znaš na šta mislim: recimo prekid kabla ili
> nestanak struje na klijentovom računaru, baš neposredno
> posle zaključavanja tabela...
Da se razumemo: bilo je reči o tome kako sprečiti deadlock.
Ako neko ostavi zaključane tabele posle pada, tu nema pomoći
nego otkriti ko ih drži, i 'pospremiti' za njim. Pravi
problem je da ne uđeš u deadlock na sred transakcije, pa
si nešto upisao, a ostalo ne možeš.
Milan
baze.podataka.282mdrazic,
> Moraš nastojati da izbegneš situacije koje dovode do
> ded-loka, pisanjem programa koji takve situacije
> izbegavaju.
Imam jedan takav program. Ništa ne upisuje na disk i
dosad nijedan deadlock (kuc,kuc) ;)
baze.podataka.283misa.m,
>> ORDER opcija može biti primenjena na proizvoljan broj polja, što znači
>> da se rezultujuća baza može sortirati po proizvoljnom broju
>> parametara (odn. onoliko polja koliko se nalazi u listi polja posle
>> SELECT).
Mala dopuna, ORDER BY ne mora biti iz liste izlaznih polja već može biti
bilo koje polje tabela (osim memo i general). Ovo važi od verzije 2.5 i dalje.
baze.podataka.284misa.m,
>> Kako da se postigne poravnanje teksta uz desnu marginu u jednoj od kolona
>> u BROWSE prozoru?
Isto kao i u DOS verziji:
browse fields title:P='@j' font "FoxFont",10
Problem ustvari nastaje za neproporcionalne fontove jer se dužina polja
računa na osnovu neke srednje veličine fonta a prava zavisi od konkretnih
znakova u samom polju. Jedini način je da upotrebiš neki od proporcionalnih
fontova kao npr FoxFont.
>> Da li neko zna da li postoji grupa za Fox Pro za WIndows?
Zašto grupa? Grupa predstavlja samo ograničenje na 12 korisnika i nema
razloga da se o jednom sve popularnijem paketu pravi grupa. Jedino ako
max.headroom nastavi ovako snažno, možda dobijemo temu :) i to jedino
ako nekome bude previše Foxa u ovoj temi.
BTW Grupa FOX je postojala (mislim i da postoji još uvek) ali je pre nekih
godinu dana zamrla. Vlasnik je max.headroom.
baze.podataka.285max.headroom,
> ne dođe do deadlock-a.
Izvin'te na digresiji (pakovao sam bazu), ali ne pratih raspravu u
celini pa mi se stoga javlja problem razumevanja "dead lock"-a. Šta mu
to dođe? (ja sam video na delu "lunch-time lock", a za ovaj prvi
značenje nagađam :) )
baze.podataka.286tetragon,
¸> IF fp_int86( 33, čaRegs )
¸> nReturn = aRegs(1) % 256
¸> IF nReturn < 0
¸> nReturn = nReturn + 256
¸> ENDIF
¸> ENDIF
Da li funkcija fp_int86() postoji u FP2.5/DOS ?
Ako nema, da li ima načina da se "ugradi", (biblioteka...) ?
Pozdrav, Zlatko
baze.podataka.287vgenije,
Programiram vec jedno vreme u pascalu.Cinim mi da imam znanja koje bi
zadovoljilo moje potrebe.Koji mi jezik preporucujete za baze podataka
pod uslovom da bude objektni.
p.s.dali paradox moze da radi kao objectni jezik i kako
baze.podataka.288mdrazic,
> celini pa mi se stoga javlja problem razumevanja "dead
> lock"-a. Šta mu to dođe? (ja sam video na delu
> "lunch-time lock", a za ovaj prvi
Skini temu ponovo pa vidi... :)
Ukratko: Dva usera treba da zaključaju bazu A i bazu B.
Ne pitaj zašto, ali 1. user prvo zaključa A, a drugi
prvo zaključa B. Zatim obojica pokušavaju da zaključaju
onu preostalu, ali ne mogu. To se zove 'deadlock'.
Izlaz je da neko mora popustiti (prekinuti transakciju)
da bi se baze mogle normalno koristiti.
Uzgred, nije deadlock karakterističan samo za baze.
Za programiranje višeprocesorskih ('paralelnih') računara
postoji prigodan jezik OCCAM (čita se okam) i kod njega
je glavni problem u komunikaciji između procesa na raznim
procesima. Tu se često desi deadlock pošto ako procesor
čeka nešto od drugog, ovaj od trećeg i tako zatvore krug,
eto belaja. Studenti su u šali jezik zvali:
OCCAM - deadlock-am
Milan
baze.podataka.289mdrazic,
> Programiram vec jedno vreme u pascalu.Cinim mi da imam
> znanja koje bi zadovoljilo moje potrebe.Koji mi jezik
> preporucujete za baze podataka pod uslovom da bude
> objektni.
Trenutno je lepa kombinacija Clipper 5.2 (imamo ga) sa
Class(y) bibliotekom (nemamo je još, oko $150 u USA).
Ovo gornje je po rečima Ricka Spencea (guru za Clipper)
idealno za treniranje za budući Visual Objects (VO).
Dok Clipper radi pod DOS-om (ima biblioteka da može da
radi i pod Windowsima), dotle će VO da radi pod Windowsima
u startu, biće 99% kompatibilan sa Clipperom, imaće
prave objekte, drajvere za DBF, SQL, ODBC, funkcije za
Windows kerefeke biće nalik na Visual Basic. VO bi
trebalo da se pojavi do kraja godine.
Uprkos kompatibilnosti, velika promena nije toliko sam
Windows koliko prelaz na event-driven programiranje
nasuprot dosadašnjem modalnom.
Naravno, ako želiš, možeš raditi i u C++ sa svim lepim
(portabilnost,...) i ružnim stranama (nije komforan kao
prethodni, manje pratećih biblioteka za baze,...).
Milan
baze.podataka.290max.headroom,
> BTW Grupa FOX je postojala (mislim i da postoji još uvek)
> ali je pre nekih
Ja, lično, nisam za grupu. Konferencija je sasvim prihvatljivo mesto
da se raspravlja o ovakvim temama. Pre neki dan sam na Hellas BBS-u
video znatnu količinu fajlova za Fox, pa ću se već potruditi da ovde
prenesem najzanimljivije detalje...
baze.podataka.291max.headroom,
Spisak programa iz dir-a CLIPPER na HELLAS BBS-u:
NAZIV VELICINA DATUM OPIS SADRZAJA DATOTEKE
============ ======== ======== ============================================
52AN00.ARJ 16298 12-05-93 Spisak nepravilnosti u CA-Clipper 5.2
52CAPI.ARJ 112568 02-20-94 Clipper 5.2C Technical ref. book
52CUS.A01 183559 02-20-94 Update sa Clipper 5.2C US verzije 1/2
52CUS.A02 180901 02-20-94 -đđ- 2/2
AE501A.EXE 10328 07-18-93 Bug fix za fju. AEVAL za Clipper 5.01A
BLI201NG.ZIP 29148 02-20-94 Update za Blinker 2.01 Norton Guide
BLINK201.ZIP 144540 02-20-94 Update za Blinker 2.01 compiler
BLINKER3.A01 150559 03-31-94 Instalaciona verzija Blinker-a 3.0 #2/5
BLINKER3.A02 150651 03-31-94 Instalaciona verzija Blinker-a 3.0 #3/5
BLINKER3.A03 150659 03-31-94 Instalaciona verzija Blinker-a 3.0 #4/5
BLINKER3.A04 34373 03-31-94 Instalaciona verzija Blinker-a 3.0 #5/5
BLINKER3.ARJ 150559 03-31-94 Instalaciona verzija Blinker-a 3.0 #1/5
BUMENU14.ZIP 13466 02-20-94 Bulaja Menu System ver. 1.4
C50XP300.A01 105881 02-20-94 Biblioteka raznih fja za Clipper 5.01 1/2
C50XP300.ARJ 106357 02-20-94 -đđ- 2/2
C52TN1.ARJ 4736 02-20-94 Technical notes za Clipper 5.2 (prvi tom)
CL-YUSRT.ZIP 3471 01-18-93 Sortiranje indeksa po YU standardima
CL5103.ZIP 32490 02-20-94 Spisak bugova u Clipper 5.01
CLDEBUGE.ARJ 8565 02-20-94 Kako koristiti Clipper debugger
CLHLP23.ZIP 175854 02-20-94 Help sistem za Clipper 5.01/S87
CLIP52A.ZIP 97590 02-20-94 Update sa verzije 5.2 US
CLIPDIAL.ZIP 10720 01-18-93 Biblioteka za rad sa modemom
CLIPFPCX.ZIP 38235 02-20-94 Prikaz .PCX za verzije S87/5.XX (EGA i VGA)
CLIPGR12.ZIP 66609 11-22-90 Graficke rutine iz clippera
CLIPGR21.ZIP 153742 02-20-94 Graficka biblioteka za verzije S87/5.XX
CLIPINT.ARJ 4853 06-08-92 Pozivanje interapta iz clippera
CLIPINT.ZIP 6012 02-20-94 Pozivanje interapta iz Clipper-a
CLIPTOOL.ARJ 11087 02-20-94 Biblioteka fja za Clipper (Goranr sa Sezama)
CLIP_52B.ZIP 5811 02-20-94 Noviteti u Clipper 5.2B
CLIP_52C.ZIP 4634 02-20-94 Noviteti u Clipper 5.2C
CLPATCH.ZIP 46408 02-20-94 Patch.exe potreban za update Clipper 5.XX
CLUG0194.ARJ 37748 02-20-94 Listing Clipper korisnickih grupa u svetu
CRC32.ZIP 6606 02-20-94 Funkcija za racunanje 32-bit CRC (asm)
CT_BLI.ARJ 4406 02-20-94 Automatski overlay uz Blinker
DBUPLUS.ARJ 67359 02-20-94 Update za Clipper 5.2 (DBU)
DENTAL1.ZIP 344176 11-24-93 Aplikacija za zubnu ordinaciju
DGXGENER.ARJ 223978 11-16-93 Generator dge src-a za dBase, Clipper i Fox
Uploaded by: Cedomir Suljagic
DISCLIPP.ZIP 109920 01-18-93 Clipper dekompajler
DM_101.EXE 18689 01-14-94 Demo maker (dodatak za Vern 6 library)
FEDO10.ARJ 27164 02-20-94 OOP zamena za MemoEdit()
FIXLIB2.ZIP 16680 02-20-94 Koriscenje 5.01 bibl. iz verzije 5.02
FLIP1.ZIP 360088 02-28-94 Graficka biblioteka za Clipper 1/4
FLIP2.ZIP 361803 02-28-94 -đđ- 2/4
FLIP3.ZIP 360795 02-28-94 -đđ- 3/4
FLIP4.ZIP 129856 02-28-94 -đđ- 4/4
FPCLIP.ZIP 16674 08-16-93 ZA Cliper
FRANK.ARJ 243255 02-20-94 Frankie lib. User Interface Engine v. 2.01
FRANKG.ARJ 87571 02-20-94 Frankie lib. Norton Guide v. 2.01
FRANKN.ARJ 12007 02-20-94 Frankie lib. Newsletter v. 2.01
FRANKR.ARJ 67101 02-20-94 Frankie lib. Reference v. 2.01
FT_DOC.ARJ 30249 02-20-94 Kreiranje NG iz source koda
FXCOLOR.ARJ 56249 02-20-94 Specijalni efekti sa bojama za Clipper 5.2
GENIFER.ZIP 256649 12-05-93 Generator aplikacija
IE52NG.ARJ 8982 12-05-93 NG o I/O error handlerima za Clipper 5.2
ISNET.ARJ 3017 02-20-94 patch za Netto.lib
LLIBCA.ARJ 122034 02-20-94 MSC 5.1 lib. za vezu Clipper <-> C
NEDESC11.ARJ 4787 02-20-94 Spisak fja. Netto.lib 1.1
NETGUIDE.ZIP 28400 08-16-93 Primeri za rad pod Novellom iz clippera
NETTOL.ZIP 168283 02-20-94 Novell NETWARE API lib. za Clipper 5.2
NETTOS11.A01 113435 02-20-94 Netware Clipper lib. source code 1/2
NETTOS11.A02 110604 02-20-94 -đđ-
NFDESC.ARJ 14348 01-10-92 Nanforum library toolkit
NFLIB.ARJ 167326 01-10-92 --đđ--
NFLIB21.ARJ 172416 02-20-94 NanForum Toolkit lib. ver. 2.1
NFLIB_CH.ARJ 4746 02-20-94 Header fajlovi (.CH) za Nflib21
NFPAT.ARJ 24607 01-10-92 --đđ--
NFPAT.ZIP 58077 02-20-94 Patches za NFlib21 (source...) 1...7
NFPAT8.ZIP 13259 02-20-94 Patches za NFlib21 8 deo
NFSRC.A01 150265 01-10-92 --đđ--
NFSRC.ARJ 159186 01-10-92 --đđ--
NFSRC21.A01 163620 02-20-94 Nanforum Toolkit v 2.1 source 1/2
NFSRC21.ARJ 164314 02-20-94 -đđ- 2/2
NUM2STR.ZIP 4469 02-20-94 Konverzija brojeva u slovni oblik
OBJECTCL.A01 176334 02-20-94 OOP biblioteka za Clipper 5.01 2/4
OBJECTCL.A02 176480 02-20-94 -đđ- 3/4
OBJECTCL.A03 174072 02-20-94 -đđ- 4/4
OBJECTCL.ARJ 176375 02-20-94 -đđ- 1/4
OCLIP.ZIP 17482 03-26-92 Object Oriented Lib. za Clipper
ONOTES.ZIP 29002 02-09-93 Koriscenje objektno orijentisanih biblioteka
PKV4.ZIP 15847 08-16-93 Rad sa zip 2.0 arhivama iz clippera
PPUPD1.ZIP 96842 10-04-91 1/2 Zastita Clipper programa
PPUPD2.ZIP 30332 08-18-93 2/2 --đđ--
PROPLUS.ZIP 273913 04-16-91 Biblioteke za zastitu Vasih Clipper programa
PUSHBU.ARJ 21788 02-20-94 Pushbutons za GET sistem
RADIOBUT.ZIP 5160 08-18-93 Source za radiobuttons u Clipper-u
RCMPLB20.ZIP 26120 01-11-94 kompresija za kliper
Uploaded by: Cedomir Suljagic
RPCXLB10.ZIP 196669 02-20-94 Clipper lib. za prikaz .PCX
RSHPCX12.ZIP 7056 08-16-93 Prikaz PCX iz Clipper-a
SG202.ZIP 13472 09-21-92 Scrolled GET's (skrolujuci GET, source)
SIX15_P1.ZIP 61027 02-20-94 Fix za SIx driver v 1.5
SPRINGB.ZIP 59545 10-26-91 Poziva drugi program dok se ucitava Vasa
Clipper aplikacija
STRALEY.ZIP 29194 02-20-94 Diskusija tvorca Clippera o "reusable system"
SUBNTX2.ZIP 62154 02-20-94 Filtriranje slogova u .NTX datotekama
TBMORE.ZIP 8705 12-05-93 Opis TBrowse bug-a
VERN_SIX.ZIP 6781 10-18-93 Spisak funkcija u Vern Six's Clipper 5.x
biblioteci
VS_904.A01 185609 10-18-93 Vern Six's Clipper ToolBox V.9.04
biblioteka #1
VS_904.A02 185628 10-18-93 Vern Six's Clipper ToolBox V.9.04
biblioteka #2
VS_904.A03 182629 10-18-93 Vern Six's Clipper ToolBox V.9.04
biblioteka #3
baze.podataka.292max.headroom,
FoxPro Editor Enhancements
by
Fred Wampler
Ph (615)247-6674
Dodaje još jedan popup u sistemski meni.
Popup sadrži svu silu korisnih (i manje korisnih) alatki za
debugovanje korisnikovih programa.
fpedfn2.zipbaze.podataka.293nbatocanin,
> Uzgred, nije deadlock karakterističan samo za baze.
Preciznije, javlja se svuda gde ima upravljanja deljenim resursima.
baze.podataka.294max.headroom,
> Izlaz je da neko mora popustiti (prekinuti transakciju)
> da bi se baze mogle normalno koristiti.
A i bilo bi logično :) Mislim, pre pokretanja transakcije prvo se
provere uspeli lock-ovi, pa ako su svi .T. onda giljaj, a ne da te
sistem odjedared iznenadi (a ti baš otišao na pauzu da nešto gricneš).
baze.podataka.295max.headroom,
> Class(y) bibliotekom (nemamo je još, oko $150 u USA).
VGENIJE, u međuvremenu pogledaj FoxPro for Windows (ako ti se baš 'oće
da radiš pod Prozorima).
baze.podataka.296max.headroom,
Izvinjenije :) U poruci 11.292 - FPEDFN2.ZIP
E, ali nije ZIP nego ARJ (greškica)
baze.podataka.297mdrazic,
>> Izlaz je da neko mora popustiti (prekinuti transakciju)
>> da bi se baze mogle normalno koristiti.
>
> A i bilo bi logično :) Mislim, pre pokretanja
> transakcije prvo se provere uspeli lock-ovi, pa ako su
> svi .T. onda giljaj, a ne da te sistem odjedared
> iznenadi (a ti baš otišao na pauzu da nešto gricneš).
To što je ovo logično meni i tebi, ne znači da je i drugima:)
Puno se poletaraca u ovom poslu opeklo po ovom pitanju. Ali
zato postoje knjige (recimo Suad Alagić: Relacione baze podataka)
pa se tamo pročita šta je drugima bio problem i kako treba raditi.
Ako pretpostavimo da učenje komandi i funkcija programerima nije
problem, onda vidim dva ključna prelaza od programiranja na
recimo dBaseIII+ do programiranja za Windows u mreži:
1. Prelaz sa 'single user' mašine na mrežu. Na mreži više
ne možeš očekivati da te išta čeka na disku što očekuješ, a ako
i postoji, ko zna da li je u poslednjoj milisekundi neko to
promenio, obrisao,... . Za svaku transakciju moraš prvo da
pripremiš teren, pa da je obaviš pazeći da ne zagušuješ druge
korisnike. Ovde se menja i filozofija otvaranja baza i indeksa,
zaključavanje tabela, editovanje itd. Video sam puno 'mrežnih'
verzija paketa koji sve otvaraju ekskluzivno - radi na mreži,
ali samo po jedan korisnik istovremeno.
2. Prelaz sa modalnog na 'event driven' programiranje. Tu već
ne znaš ni šta ti korisnik (sve) radi, kuda klikće mišom, koje
je sve procese pokrenuo (recimo otvorio više prozora za koji je
zadužen isti deo programa). Za ovo mu dođe prirodno da se koristi
neki objektno orijentisani jezik (CA-Visual Objects biće takav).
Milan
baze.podataka.298mdrazic,
> VGENIJE, u međuvremenu pogledaj FoxPro for Windows (ako ti
> se baš 'oće da radiš pod Prozorima).
Uz sav respekt prema proizvodu (Fox) i firmi (Microsoft) ipak
ću da sačekam CA-Visual Objects koji plasira firma orijentisana
na softver za veće sisteme pa sa client/server aplikacijama
neće biti problema. Jezik je objektni, ima sve lepe osobine
nasleđene iz Clippera (slično kao Fox), radi pod Windowsima, a
poznato je da je za Clipper (biće i za VO) najveće tržište
raznih biblioteka, RDD (database drajvera) i utilitija.
U startu ima DBF, SQL i ODBC drajvere, a kome treba još nešto,
lako se doda. Veza sa asemblerom i C jezikom je jako korisna:)
Usto Clipper je oduvek pravio kao izlaz standardni EXE fajl.
Milan
baze.podataka.299dejanr,
>> Uz sav respekt prema proizvodu (Fox) i firmi (Microsoft) ipak
>> ću da sačekam CA-Visual Objects koji plasira firma orijentisana
>> na softver za veće sisteme pa sa client/server aplikacijama
>> neće biti problema.
Zanimljiva stvar, u poslednjem PC Magazine-u (15. septembar) su
testirali relacione baze podataka. Ono što me je začudilo je da
ni Clipper (ni bilo šta od CA) nisu uopšte ni uzeli u obzir.
Ne znam zašto.
Editor's Choice je bio Access 2.0, dok su negde odmah iza njega
Paradox za Windows i FoxPro za DOS i Windows. Access po performansama
nije baš briljirao (FOX je redovno bio bolji) ali je izabran zbog
izuzetne fleksibilnosti, mogućnostima provere podataka, konzistencije
relacija itd.
Doduše, PC Magazine je uvek bio sklon Microsoft-u ;)
baze.podataka.300.marko.,
Ima li neko iskustva, pozitivna/negativna sa kursom ORACLE-a koji organizuje
"Vinca" institut.
Kazu mi (preko telefona) da su autorizovani, pa zna li neko koliko je to
tacno, s obzirom na sankcije (nicim izazvane :)).Usput mi rekose da njihove
diplome priznaju i napolju (daju diplomu i na Engleskom).
Unapred hvala na odgovoru!
baze.podataka.301mdrazic,
> Zanimljiva stvar, u poslednjem PC Magazine-u (15.
> septembar) su testirali relacione baze podataka. Ono što
> me je začudilo je da ni Clipper (ni bilo šta od CA) nisu
> uopšte ni uzeli u obzir. Ne znam zašto.
Evo zašto: Clipper i nije baza podataka! Clipper je samo
(odličan) jezik za pisanje aplikacija, a ranije se zvao
prevodilac za dBase programe. Pošto nemać integrisanu
okolinu kao u dBase, FoxBase Clipper nije zgodan korisnicima
koji ujedno nisu i programeri. Da ne pominjemo interpreter
naredbi!
Pre godinu ili nešto više u Data Based Advisor-u (časopis
specijalizovan za baze na PC-ima) je bila anketa među
korisnicima o dobrim i lošim stranama raznih softvera za
baze. Na početku je bilo i napomenuto da Clipper iskače iz
opšte slike pošto je to samo jezik. Na testovima brzine,
mogućnosti, generisanja reporta i sl. testirali su za
Clipper verovali ili ne, DBU (tj. ono što ide u paketu).
Na tim testovima je lošije prošao od nekih konkurenata, ali
ubedljivo najviše ocene je (od korisnika) Clipper dobio za
bogatstvo jezika i snagu istog.:)))
Normalno, i ja se slažem da je Fox mnogo bolji po mogućnostima
od DBU.EXE .
Ista firma koja izdaje Data Based Advisor počela je da izdaje
i Clipper Advisor (dvomesečno) a tek kasnije se pojavilo
dBASE Advisor a ako postoje Fox Advisor, Access Advisor to je
tek od ovog leta možda.
Milan
baze.podataka.302vlador,
> Evo zašto: Clipper i nije baza podataka! Clipper je samo
Ali, u PC Worldu od maja ove godine je takođe bio uporedni test baza podataka
ali je tu bio i Clipper!
baze.podataka.303mdrazic,
> Ali, u PC Worldu od maja ove godine je takođe bio uporedni
> test baza podataka ali je tu bio i Clipper!
Šta su testirali i kako je prošao?
baze.podataka.304max.headroom,
Svima onima koji imaju pristup Internet-u, preporučujem:
FOXWISHčMICROSOFT.COM
baze.podataka.305max.headroom,
FOXDCOMP
A DECOMPILER FOR FOXBASE PROGRAMS
by
Doyle and Associates
FOXDCOMP is a program reads a precompiled Foxbase program
and recreates the original program source. This is an essential
utility for the Foxbase environment that can be used for the
following purposes:
- Recreating lost, unavailable, or destroyed source code.
This will allow modifications to an existing system
without starting from scratch.
- As an aid in understanding a purchased compiled package
that was delivered without source code. This can be
a very useful tool when adding a customized front-end
to a purchased compiled system.
- To view the source code of professionally-developed
systems in order to learn programming techniques
used to create efficient, reliable, and visually-
appealing systems.
FEATURES
- Simple DOS command-line operation.
- Correctly decompiles programs compiled with
Foxbase version 2.1 or lower.
- Written in efficiently structured C language
for FAST execution.
- Fully indented source code is produced.
- Language keywords are printed in capital letters.
Variable name are printed in lower-case.
- Macros, arrays, user-defined functions, and
functions with variable arguments are fully
supported.
Doyle and Associates
101 Westminster Road
Rochester, NY 14607
Telephone: (716) 461-1148
baze.podataka.306max.headroom,
BROWSE komanda & mrežno okruženje
NOREFRESH opcija
BROWSE prozor će biti "osvežavan" onoliko puta koliko je navedeno pri
setovanju SET REFRESH komande. Ako se želi "statičan" BROWSE prozor,
tj. prikaz podataka uzetih u određenom momentu bez daljeg obaziranja
na to da li je došlo do promene sadržaja nekog od njih, iza BROWSE
komande navodi se NOREFRESH opcija. U slučaju da je potrebno prikazati
neki read-only fajl, poželjno je navesti i NOREFRESH opciju, jerbo se
performanse time poboljšavaju. Međutim, čak i ako se ova opcija navede
(a nije u pitanju read-only fajl), i započne se sa editovanjem
podataka, editovani zapis će ipak biti pročitan sa diska (tj. biće
"svež").
TIMEOUT opcija
Uvek koristite ovu opciju BROWSE komande. žak i ako je postavite na
jedan sat, i to će biti bolje nego da BROWSE prozor "čeka" i troši
vreme serveru zahtevajući sveže podatke. Zna se kako je narod aljkav,
odn. kako voli da odluta od terminala - a te momente softver bi trebao
da prepozna.
Popravljanje BROWSE performansi
- Smanjite broj kolona (polja). Najčešće se BROWSE koristi bez liste
polja koje treba prikazati, tj. prikazuju se sva polja iz baze.
Dakle, redukujte broj dostupnih polja (BROWSE FIELDS) što više.
- Smanjite broj redova (zapisa) prikazanih na ekranu. Što je manje
zapisa prikazano, to BROWSE brže "osvežava" prozor.
- Ukinite relacije, ili bar redukujte njihov broj. Ako se vrši BROWSE
samo jedne baze, tada je mnogo bolja izvedba primeniti ručni SEEK,
ako slučaj već nalaže, tj. ako se krene sa editovanjem nekog
zapisa. Evo primera: zamislite pet baza - jedna sadrži imena
takmičara, druga njihove datume rođenja, treća postignute
rezultate, četvrta adrese, a peta plasman na tekućem takmičenju.
Kada se radi BROWSE takmičara, tada je za pretpostaviti da će se
uvesti relacije kojima ćemo na ekranu u istom redu za svakog
takmičara imati prikazane sve ostale relevantne podatke. Medžutim,
;), svakako je brže pre BROWSE-a ukinuti relacije, a po
aktiviranjui sa ON KEY LABEL uraditi SEEK u svakoj bazi i tako na
ekranu prikazati ostale podatke, a pomoću BROWSE-a samo imena
takmičara (primer glup ali ukazuje na suštinu ekonomisanja sličnog
tipa :)
- Učestalost osvežavanja (SET REFRESH). Što je ona veća, performanse
opadaju. Na primer, u bazama u kojima se promene vrše retko (baza
dobavljača, na primer), ova cifra treba da bude velika (tj.
osvežavanje se vrši u većim vremenskim razmacima - 300 sekundi ili
više). Ako se, pak, zaželi edit određenog zapisa, uvek se dobija
najsvežija informacija.
- Fizički sortirajte bazu. FoxPro nije jedina aplikacija koja
inteligentno koristi keševe i bafere; većina mrežnih operativnih
sistema koristi disk-keš da poboljša performanse. Kada se zatraži
zapis iz DBF fajla, FoxPro konvertuje broj zapisa u ofset u fajlu.
Tada traži od mreže podatke sa pomenute ofset lokacije, u dužini
od onoliko bajtova kolika je veličina zapisa. Mreža ispunjava
zahtev, ali takođe kopira taj sektor u svoj vlastiti interni keš.
Ako je dužina sektora (mreža) 4,096 bajtova, na primer, i dužina
zapisa 64 bajta, tada sektor prekopiran u keš sadrži tekući zapis,
zajedno sa još 47 susednih :) Ali ako su zapisi sortirani fizički,
tada je mreži potrebno da pristupi disku tek posle svakih 48
zapisa. Ako se, međutim, zapis čita preko indeksa, brojevi zapisa
mogu biti razbacani po fajlu, smanjujući verovatnoću da će traženi
podatak biti moguće izvući direktno iz keša.
baze.podataka.307max.headroom,
Jeste li već čuli da... :)
FLOCK() i RLOCK() komande Fox-a "pate" od jednog nedostatka: naime,
raznorazne prethodne i buduće Fox razvojne aplikacije prepoznaju da je
fajl zaključan; ali, drugi xBASE paketi poput CA-Clipper-a - NE. Sledi
objašnjenje:
DOS 3.1 je predstavio novu funkciju koja bi trebala da bude korišćena
od strane programa glede kontrole shared pristupa podacima. Ta
LOCK/UNLOCK funkcija uzima četiri parametra: file handle, ofset,
veličinu, i fleg koji indicira da li je u pitanju lock ili unlock.
Kada se izvrši lock, svaki pristup tom delu fajla (odn. fajlu) je
zabranjen. Ali, trenutak... ako je pristup zabranjen, kako FoxPro čita
zaključani zapis? Odgovor na ovo pitanje je da su FoxPro dizajneri
iskoristili činjenicu da LOCK ne mora da bude fizički smešten u okviru
fajla. Kada FoxPro zaključa zapis, on preračuna ofset u fajl uzimajući
veličinu hedera + veličinu zapisa * broj zapisa (minus jedan). Potom
dodaje 40,000,000 heksadecimalno (ili 1,073,741,824) bajtova na ofset,
i zaključava tako dobijene bajtove u dužini zapisa. Fox ne zaključava
ofset unutar samog fajla. To omogućava read pristup fajlu, dok se
write pristup koordinira preko FoxPro programa.
Ekipa koja je osmišljala CA-Clipper koristila je sličnu strategiju da
dozvoli čitanje zaključanih zapisa. Nažalost, oni su uzeli jednu
milijardu kao ofset (a ne 40 miliona). I CA-Clipper zaključava samo
jedan bajt, a ne onoliko kolika je dužina zapisa. Tako, ako je
CA-Clipper-om zaključan deseti zapis, a isto se uradi i sa Fox-om,
operativni sistem misli da postoje dva lock-a: jedan na ofsetu
1,000,000,010, a drugi na drugom ofsetu. I eto haosa :)
baze.podataka.308max.headroom,
The GOFER UDF gofer()
Definition The gofer UDF allows the programmer to place
database information in picklist format in a FoxPro
browse window so a user can easily locate and accept or
reject items in the list. gofer() returns a .t. or .f.
reflecting the choice made.
gofer002.arjbaze.podataka.309sir.oracle,
Postovane kolege,
Iako ovo mozda nije najprikladnije mesto za oglasavanje ovakve vrste
pokusacu da vam za trenutak skrenem paznju ovim tekstom.
Ukoliko medju vama ima dobrih ORACLE programera, koji su spremni na
saradnju po pitanju izrade jednog vrlo kokretnog projekta sa vrlo konkretnim
rokom i vrlo konkretnim zadatkom, molio bih da mi se jave ili preko prijatelja
ostave svoje podatke u mail-u za korisnika sir.oracle (odnosno mene). Ocekujem
da ce u vasim dopisima biti puno pitanja, ali bih molio da u prvom dopisu koji
posaljete prilozite sledece podatke:
-Ime i prezime (obavezno)
-Username na sezam-u za slanje dopisa (obavezno)
-Godina rodjenja (opciono)
-Broj telefona (opciono)
-Gde radite (opciono)
-Koliko dugo radite u ORACLE-u (obavezno)
-Na kojim ste projektima radili do sad (opciono)
(njihov naziv i trajanje)
-Ostali licni i profesionalni podaci (opciono)
po vasem izboru
U odgovoru na vas dopis dobicete sto je moguce vise podataka o poslu i
projektu osim informacija koje predstavljaju poslovnu tajnu.
U OBZIR DOLAZE SVI OBLICI SARADNJE POCEV OD UGOVORA ZA "SLOBODNJAKE"
DO STALNOG ZAPOSLENJA ZA PROGRAMERE KOJI ZELE DA PROMENE RADNO MESTO.
Javite se na mail: sir.oracle, ocekujem vase dopise
ps. Rok za odgovor je 7 dana.
baze.podataka.310.ken.,
> FLOCK() i RLOCK() komande Fox-a "pate" od jednog nedostatka:
> naime, raznorazne prethodne i buduce Fox razvojne aplikacije
> prepoznaju da je fajl zakljucan; ali, drugi xBASE paketi poput
> CA-Clipper-a - NE.
Clipper-a 5.2 cak i sam poseduje dve vrste zakljucavanja (za RDD NTX)
Default koje je kompatabilno sa starim nacinom zakljucavanja (Clipper 5.01)
i nova vrsta kod koje je ofset prebacen na FFFFFFFF (sto je najveci ofset
dozvoljen sistemom DOS-a - izvor Joseph D.Booth i Greg Lief)
Ako zelimo da imamo novi nacin zakljucavanja treba ulinkovati datoteku
NTXLOCK2.OBJ
Mislim, mada nisam imao prilike da probam da SIXCDX RDD za Clipper ima
mogucnost da radi kompatabilno sa FOX-om i da ne prave probleme jedan
drugom.
baze.podataka.311vlador,
>> Ali, u PC Worldu od maja ove godine je takođe bio uporedni
> Šta su testirali i kako je prošao?
Na žalost, nisam čitao, samo mi je tekst proleteo kroz ruke. O:)
baze.podataka.312.marko.,
Ima li ko kakva pozitivna/negativna iskustva sa kursom za ORACLE
koji organizuje "Vinca"?
baze.podataka.313nkbog,
Dva problema sa FoxPro 2.6:
1. SELECT nesto AS a, SUM(nestodrugo) AS b FROM blabla WHERE blabla
GROUP BY nesto INTO CURSOR temp
dodeljuje polju b MMMMMsirinu od nula decimala ako je prvo "nestodrugo" vezano
za nesto nula (cela suma). Ovo smo resili tako sto pisemo 0.0001 + SUM(...),
al' me interesuje dal' ima neko bolje resenje.
2. Na nekoliko sporijih masina (dve): AT i 386-ica, kod BROWSE-a kada se brzo
pritiska leva strelica ispali poruku "Invalid file descriptor". S obzirom da
nas to upucuje na MS Support (tamo negde u Nemackoj), da li neko zna kako
to izbeci (ON ERROR, ON KEY ili nesto slicno).
NB.
baze.podataka.314misa.m,
>> 1. SELECT nesto AS a, SUM(nestodrugo) AS b FROM blabla WHERE blabla
>> GROUP BY nesto INTO CURSOR temp
>> dodeljuje polju b MMMMMsirinu od nula decimala ako je prvo "nestodrugo"
Rezultujuće polje bi trebalo uvek da ima isti broj decimala
kao ulazno, bez obzira na sadržaj. Ja za forsiranje dužine
decimalnog dela koristim ROUND funkciju, npr:
SELECT nesto AS a, SUM(ROUND(nestodrugo, 4)) AS b ...
baze.podataka.315ndragan,
/ Eto, a mene si zimus zezao zbog "tek sad uvedenog" SCOPE indeksa u
/ Clipper.
Ej, pajto, spusti malo. Pomenuti Browse je _već_ u 2.0 imao opcije
Key k1 (, k2)
For
Valid
When (poslednje dve na nivou celog sloga i pojedinog polja).
Rest opcija je samo mali dodatak koji sprečava prečitavanje baze i/ili
indekasa od početka, nego tek od tekućeg sloga naniže, kol'ko da se
ubrza stvar.
baze.podataka.316ndragan,
/ SELECT MAX( datum ), Ime, ... FROM maticna INTO CURSOR cur ;
Ovde implicitno praviš grupu (group by) čim koristiš neku od agregatnih
funkcija nad kolonama, u ovom slučaju MAX(); pošto nisi naveo kriterijum
grupisanja, podrazumeva se da vadi jedan slog iz cele baze; samo za prvo
polje si naveo šta tačno hoćeš i to si dobio, za ostala polja se smatra
da ti je svejedno iz kog su sloga.
/ SELECT DISTINCT datum, Ime, ... FROM maticna INTO CURSOR cur;
/ WHERE datum IN ( SELECT MAX( datum ) FROM maticna ) AND ;
E ovde si već bio precizniji, tražio si da ti izdvoji sve slogove kod
kojih je datum jednak najvećem datumu.
/ Kako to radi u 2.6 ?
Isto tako.
baze.podataka.317ndragan,
/ Veoma je bitno za komotan rad više korisnika da u ove tri faze
/ NEMAŠ stanje čekanja (ne daj bože neko editovanje) koje koči
Što reče help za TTS u FP2.6:
"When other users on the network try to access records you have
modified, they must wait until you end your transaction. They receive
the message "Record not available ... please wait" until the records
become available. Because of this, it is important to keep the length of
the transaction to a minimum. It is best to end a transaction before
you go to lunch."
baze.podataka.318max.headroom,
> 2. Na nekoliko sporijih masina (dve): AT i 386-ica, kod
> BROWSE-a kada se brzo pritiska leva strelica ispali poruku
> "Invalid file descriptor". S obzirom da
De, ako te ne mrzi, opiši problem malo podrobnije.
baze.podataka.320nbulatovic,
> FOXDCOMP
> A DECOMPILER FOR FOXBASE PROGRAMS
Gde to može da se nabavi?
ja sam inače radio sa sličnim programima i nisam baš oduševljen
njihovom efikasnošću.
Nikola
baze.podataka.321gaston,
Zdravo narode !
Nije me dugo bilo, pa sam bio prijatno iznenadjen kvalitetom diskusije
u zadnja 2-3 meseca. Posebno se to odnosi na priloge max.headroom-a.
Ne znam cime ga hrane, ali samo neka tako nastave ! Verovatno ce "dosaditi"
moderatorima konferencija pretrpavanjem istih korisnim (i dugackim) prilozima
vezanim za FOX, pa cemo valjda dobiti posebnu konferenciju. Od mene licno ima
gajbu piva, samo neka javne broj ziro-racuna, pa neka sve knjizi u fond za
reprezentaciju.
Imam nekoliko pitanja i zapazanja:
1) Sve sto je u vezi strukture DBF i ostalih fajlova poslao milanv je tacno,
nema se sta zameriti, ali jedan podatak koji me jako interesuje nije spomenut.
To je u vezi sa zapazanjima max.headroom-a i ndragan-a u vezi nacina kako FOX
resava situaciju nedostajeceg CDX fajla i kako je programer mora resiti. I ja
imam slicna zapazanja o toj pojavi.
Mislim da FOX negde u DBF fajlu upisuje da li uz fajl ide i CDX ili ne.
Prema tome, ako je nekome poznato gde i kako, neka to javne. Onda bi se dala
napraviti procedura za proveru postojanja CDX fajla iz hedera DBF fajla. U
vrlo lepoj knjizici "CA-Clipper 5.2 i mrezno programiranje" od J.D.Booth i
G.Lief daju se strukture DBF , NDX, CDX i dr., kao i kompletna procedura za
proveru izpravnosti hedera DBF i CDX fajlova. Medjutim ni u toj knjizi se nista
ne kaze o mestu u hederu DBF fajla gde je zapisana informacija o tome da li
postoji CDX fajl.
2) U jednom od priloga max.headroom-a vezanih za mreze, daje se lep primer
programceta za dobijanje nekih parametara mreze putem funkcije FP_INT86().
Slicnih stvari ima i u gorepomenutoj knjizi. Iako je knjiga pisana za Clipper
moze sasvim lepo da posluzi i za FOX. Jedino sto sam ja vrrrrlooo slab sa
asemblerom (sama funkcija FP_INT86() je deo NanForum Clipper biblioteke i
data je u asembleru). Elem, treba taj asemblerski program preraditi na
odredjeni nacin (sto meni nije uspelo, i pored svojevremenih sugestija
ndragan-a), prevesti i koristiti u FOX-u. Ako je noko voljan da opise kako je
to resio, verujem da ne bih bio jedini koji bi mu bio vrlo zahvalan.
3) Da li neko ima iskustva sa Library Construction Kit-om za FOX ??????
Ajd pa tako
Nesa - Gaston
P.S. Bolje naka max.headroom javno objavi broj ziro-racuna, verovatno nisam
jedini koji zeli da konkretno zahvali ...
baze.podataka.322goxx,
■ Mislim da FOX negde u DBF fajlu upisuje da li uz fajl ide i CDX ili ne.
■ Prema tome, ako je nekome poznato gde i kako, neka to javne. Onda bi se dala
■ napraviti procedura za proveru postojanja CDX fajla iz hedera DBF fajla. U
Gotovo da sam sto posto siguran da tako nešto ne postoji. U vezi procedure:
Da li bi ti to bila pouzdana informacija o postojanju CDX-a? Šta kad ručno
izbrišeš CDX, a u DBF-u ostane indikator?
Postoje file sistemi koji drže opis indeksa u osnovnom fajlu (naročito na
većim sistemima).
Goran
baze.podataka.323dobrada,
Zanima me da li za biblioteke za rada sa bazama podataka pre svega za
C/C++ (Paradox Engine ili Code Base) postoje alati koji omogucavaju
pri debugovanju da se vidi sta se desava sa bazom podataka (trenutni slog,
aktivni index i sl.).
U clipper-u je to integrisano u njegov debuger.
baze.podataka.324ndragan,
/ Uz sav respekt prema proizvodu (Fox) i firmi (Microsoft) ipak
BTW, nisam nešto najjače zadovoljan ponašanjem lisice pod prozorom.
Prvo, brzina grafike je drastično manja nego u aplikacijama pisanim u
jezicima nižih nivoa; drugo, sve mi se čini da je, otkako je Mali Mekani
kupio Lisicu, počelo zbrzeljavanje (paz' verzije: 1.00, 1.01, 1.02, 2.00
pa odma 2.5, 2.6 - tipično za maleckog mekanog).
Takođe mi ide na I.I. što između #if i #endif ne može da se uglavi
nikakav #define, te izmišljam promenljive gde bi lepo došle konjstante.
Inače je ok, i ima većinu stvari (tri od četiri :) koje su dosad
nedostajale.
--> jel nekom pao šaka LCK za fp3.0?
baze.podataka.325ndragan,
/ za nesto nula (cela suma). Ovo smo resili tako sto pisemo 0.0001 +
/ SUM(...),
On pokušava da na osnovu prvog sloga proračuna širinu polja, pa šta
dobije (probaj ? 0+0 i ? 0+0.00) . Najbolje je da se zada kompletna širina
navođenjem potrebnog broja nula sa obe strane decimalne tačke:
000000000000.00+sum(trt_mrt) as rkekoke
/ to izbeci (ON ERROR, ON KEY ili nesto slicno).
Ovo vuče na neki bag iz 2.5, koji se javljao na strelici ulevo na brauzu
na numeričkom polju. Nisam imao slučaj, mada sam čuo, a prema
dokumentaciji treba da je ispravljeno u 2.6. Probaj "on key label
leftarrow keyb 'šbacktabć' plain', istina skakaće po celo polje ulevo, a
korisnici mogu još da pomisle da tako i treba :)
baze.podataka.326dr.grba,
>> jezicima nižih nivoa; drugo, sve mi se čini da je, otkako je Mali Mekani
>> kupio Lisicu, počelo zbrzeljavanje (paz' verzije: 1.00, 1.01, 1.02, 2.00
>> pa odma 2.5, 2.6 - tipično za maleckog mekanog).
Gotovo sam siguran da Microsoft ovo radi namerno, a u nameri da izbaci
Access u prvi plan.
baze.podataka.327bulaja,
│ Mislim da FOX negde u DBF fajlu upisuje da li uz fajl ide i CDX ili ne.
│ Prema tome, ako je nekome poznato gde i kako, neka to javne.
└───
Ne upisuje! :) Pretpostavljam da to misliš zbog postojanja .CDX-ova koji
se automatski otvaraju kad se otvori .DBF, ali tu se jednostavno radi o
tome da database engine (Fox-ov ili npr. kod Clippera neki RDD, npr. SIx
CDX) kod otvaranja baze (npr. "test.dbf") proveri da li postoji .CDX sa
istim imenom ("test.cdx") i ukoliko je uključeno samootvaranje CDX-ova
(auto-open) otvori i njega.
baze.podataka.328ndragan,
/ Prema tome, ako je nekome poznato gde i kako, neka to javne. Onda bi
/ se dala napraviti procedura za proveru postojanja CDX fajla iz hedera
/ DBF fajla. U
Knjiga ('razvijačke gajde') mi je u Mađarskoj, pa ako se setim negde od
nedelje. Mislim da piše gde je.
Što se mene tiče, za indeksiranje svakako _preventivno_ obrišem .cdx
fajl. Zatim ga otvaram Excl (mora, inače odbija da pravi tegove). Rutina
za obradu greške javi da je fajlu nestao .cdx, foks obriše informaciju o
postojanju .cdx i onda forsirano ponovo otvorim .dbf (ovog puta je on
bez ikakvog indeksa) i onda sve prolazi.
Ono brisanje ne ide tek tako zbog mreže, zato prvo probam da otvorim za
čitanje/pisanje:
xx=fopen(cdxf, 2)
if xx<0
... (neko drži otvoreno)
Zašto brišem .cdx? Zato što foks odbija da otvori bazu ako je on
oštećen, a upravo hoću da napravim nov pa dobar - ergo, uopšte me ne
zanima kakav je stari.
baze.podataka.329max.headroom,
FOXDCOMP
A DECOMPILER FOR FOXBASE PROGRAMS
Evo ga, stiže. Nisam proveravao njegovu pouzdanost, pa ti ne
mogu garantovati kvalitet :)
P.S. Nikola, zanimaš li se i dalje neuronskim mrežama? Ako da,
jesi li u kakvoj zanimljivoj grupi?
foxdcomp.arjbaze.podataka.331misa.m,
>>>> jezicima nižih nivoa; drugo, sve mi se čini da je, otkako je Mali Mekani
>>>> kupio Lisicu, počelo zbrzeljavanje (paz' verzije: 1.00, 1.01, 1.02, 2.00
>>>> pa odma 2.5, 2.6 - tipično za maleckog mekanog).
>> Gotovo sam siguran da Microsoft ovo radi namerno, a u nameri da izbaci
>> Access u prvi plan.
U septembarskom PC Magazine je objavljen test Developer Databases
(Clarion 3.0, DataEase 4.53, DataFlex 3.05, dBase IV 2.0, Access 2.0,
FoxPro 2.6 prof DOS i WIN, Paradox 4.5 DOS i WFG, R:Base 4.5+ )
i normalno ;) Editors' choice je Access.
Paradox for DOS i obe verzije Foxa imaju najbolje perfomanse u single
user varijanti dok je FOX daleko iznad svih u mreži (32 stanice).
Access je (sa pozajmljenom Rushmore tehnologijom) u mreži izbio na
treće mesto.
U prilog vaših teza evo i zadnje rečenice iz Fact FILe-a:
ACCESS: If you're looking for a superb Windows development tool,
look no further.
FOX4WIN: Yuo might be better off waiting for the next release.
baze.podataka.333gaston,
Mislim da FOX negde u DBF fajlu upisuje da li uz fajl ide i CDX ili ne.
Prema tome, ako je nekome poznato gde i kako, neka to javne. Onda bi se dala
napraviti procedura za proveru postojanja CDX fajla iz hedera DBF fajla. U
>> Gotovo da sam sto posto siguran da tako nesto ne postoji. U vezi
procedure:
>> Da li bi ti to bila pouzdana informacija o postojanju CDX-a? Sta kad rucno
>> izbrises CDX, a u DBF-u ostane indikator?
A ja sam sto posto siguran da TAKO NESTO POSTOJI !
Mozda se nismo dovoljno razumeli...
Sa instaliranim error handler-om (npr. iz FOX2EROR.PRG ili slicno) ako obrisete
CDX neke baze, javice gresku:
"Structural .CDX file not found - Error #1707"
Evo kako se ponasa FOX ako se uradi recimo sledece:
ON ERROR() DO GRESKA.PRG WITH ....
SELECT 0
USE ABC
INDEX ON _POLJE TAG _PO_POLJU
CLOSE DATABASES
!DEL ABC.CDX
<<< USE ABC >>> tu ce javiti poruku o gresci.
Medjutim, kada sledeci put otvorite ABC, a CDX ne postoji, greska nece biti
prijavljena. Ja iz takvog ponasanja zakljucujem sledece:
Informacija da neki DBF fajl ima CDX se zapisuje negde u zaglavlju baze
podataka. Ako obrisemo CDX, FOX ce po tom znaku zakljuciti da CDX treba da
postoji,ali ce proverom na disku utvrditi da ga nema i javice poruku o
gresci #1707. Pored toga, upisace u zaglavlje DBF fajla znak da DBF fajl
nema CDX fajl, tako da kada se sledeci put pokusa otvaranje baze,
nece biti greske.
Program za proveru ispravnosti DBF i CDX fajlova bi radio sledece:
- proverio bi ispravnost strukture DBF fajla, memo i CDX fajla
- proveravao bi postojanje memo i CDX fajlova i dr.
i u zavisnosti od toga preduzimao odredjene akcije: popravke ili prekide rada.
Da li sam sada malo jasniji ? U svakom slucaju hvala na primedbi.
Nesa Gaston
baze.podataka.334max.headroom,
Izvinjavam se na odsutnosti - sve je posledica nedostatka vremena.
Da se iskupim, šaljem programske pristupe otvaranju baza po
Booth-u i Lief-u...
* Function: INITDB()
* Purpose: Initialize database structure arrays
* Syntax: InitDB()
* Arguments: <NONE>
* Returns: .T.
*
* Notes: This function is used to create two public
* arrays which the opening programs use to make
* sure that all necessary files are opened when
* you need to access a table.
*
*********************************************************
PUBLIC AFiles_Š5Ć
PUBLIC ARelat_Š1Ć
PUBLIC AIndex_Š6Ć
* Alias DBF Name Index file names
* ------ ---------- -----------------
AFiles_Š1Ć = "EMPLOYEE; F:ĐAPPĐEMPLOYEE ; EMP_INIT,EMP_NAME"
AFiles_Š2Ć = "EMP_DEPT; F:ĐAPPĐEMP_DEPT ; EMP_LINK"
AFiles_Š3Ć = "DEPTS ; F:ĐPAYĐDEPTS ; DEPTS"
AFiles_Š4Ć = "POSITION; F:ĐPAYĐPOSITION ; POSITION"
AFiles_Š5Ć = "MANAGERS; F:ĐPERSĐMANAGERS; MGRS"
*
* Index Expression
* ------ ----------
AIndex_Š1Ć = "EMP_INIT; INITIALS"
AIndex_Š2Ć = "EMP_NAME; EMPLOYEE"
AIndex_Š3Ć = "EMP_LINK; INITIALS+DTOS(START)"
AIndex_Š4Ć = "DEPTS ; DEPT_NO"
AIndex_Š5Ć = "POSITION; POS_NO"
AIndex_Š6Ć = "MGRS ; MGR_INIT"
*
* Logical
* Table Required files
* -------- --------------
ARelat_Š1Ć = "EMPLOYEE; EMPLOYEE,EMP_DEPT,DEPTS,POSITION,MANAGERS"
*
return .T.
baze.podataka.335max.headroom,
Po Booth-u i Lief-u...
* Function: SHARED()
* Purpose: Open a list of tables in shared mode
* Syntax: <logical> = Shared( cTable(s) )
* Arguments: cTable - Name of logical table(s) to open
* Returns: .T. - If files were opened ok,
* .F. - if the files could not be opened
*
*********************************************************
FUNCTION Shared
PARAMETERS cTab1,cTab2,cTab3,cTab4,cTab5,cTab6,cTab7,cTab8,cTab9,cTab10
PRIVATE all_ok,x
PRIVATE aFlist_Š PARAMETERS() Ć
FOR X = 1 TO PARAMETERS()
TMP = "CTAB"+ALLTRIM(STR(X,2))
aFLIST_ŠXĆ = &TMP
NEXT
all_ok = OPENLIST(.F.,čAFLIST_)
return all_ok
*****************************
FUNCTION OPENLIST
PARAMETERS isExcl,FilesToDo
PRIVATE x,y,z
PRIVATE tmp,cFile
PRIVATE all_ok
IF isExcl
SET EXCLUSIVE ON
ELSE
SET EXCLUSIVE OFF
ENDIF
SET EXACT OFF
FOR X = 1 TO ALEN(FILESTODO)
Y = ASCAN(ARELAT_,FILESTODOŠXĆ) && Look for this table
IF Y = 0 && File name does not exist
CLOSE DATABASES && in our database, so we return
RETURN .F. && FALSE
ENDIF
tmp = ARELAT_ŠYĆ && Extract the file information
Y = AT(";",tmp)
tmp = SUBSTR(tmp,Y+1)+"," && Get required files
Z = AT(",",tmp)
DO WHILE Z > 0
cFile = ALLTRIM(SUBSTR(tmp,1,Z-1)) && Extract each file name
all_ok = OPENFILE(cFile) && and attempt to open it
IF NOT all_ok && File could not be opened
CLOSE DATABASES && so we close any open files
RETURN .F. && and return FALSE
ENDIF
IF z < LEN(tmp)
tmp = SUBSTR(tmp,Z+1)
z = AT(",",tmp)
ELSE
z = 0
ENDIF
ENDDO
IF NOT all_ok
CLOSE DATABASES
RETURN .F.
ENDIF
NEXT
RETURN .T.
*********************************************************
FUNCTION OpenFile
PARAMETER cFileName
PRIVATE y,z,tmp
PRIVATE cDBFname,cIndx
PRIVATE all_ok
PRIVATE cPath
cPath = ""
all_ok = .T.
y = ASCAN( aFiles_,cFileName )
ON ERROR DO OPENERR WITH cFilename,cDBFName
IF y > 0
tmp = aFiles_ŠyĆ
y = AT(";",tmp)
tmp = SUBSTR(tmp,y+1)
y = AT(";",tmp)
cDBFname = SUBSTR(tmp,1,y-1)
z = RAT("Đ",cDBFname)
if z > 0
cPath = substr(cDBFName,1,z)
endif
tmp = alltrim(SUBSTR(tmp,y+1))+","
IF NOT USED( cFileName )
USE &cDBFName IN 0 ALIAS &cFileName
IF USED( cFileName ) && File was opened ok
*
* DEAL WITH THE INDEX FILES
*
SELECT &cFileName
Z = AT(",",tmp)
DO WHILE Z > 0
cIndx = cPath+ALLTRIM(SUBSTR(tmp,1,Z-1))
SET INDEX TO &cIndx ADDITIVE
IF NOT all_ok
** RECREATE THE INDEX FILE
zz = ASCAN(AIndex_,ALLTRIM(SUBSTR(tmp,1,Z-1)) )
IF zz > 0
temp2 = aIndex_ŠzzĆ
zz = AT(";",temp2)
temp2 = ALLTRIM(SUBSTR(temp2,zz+1))
INDEX ON &temp2 TO &cIndx
all_ok = .T.
SET INDEX TO &cIndx ADDITIVE
ELSE
CLOSE DATABASES
RETURN .F.
ENDIF
ENDIF
IF z < LEN(tmp)
tmp = ALLTRIM(SUBSTR(tmp,Z+1))
Z = AT(",",tmp)
ELSE
Z = 0
ENDIF
ENDDO
SET ORDER TO 1
ENDIF
ENDIF
ELSE
RETURN .F.
ENDIF
ON ERROR
RETURN USED( cFileName )
******************************************************************************
FUNCTION OPENERR
PARAMETER cAlias,cDBF
PRIVATE nError
PRIVATE cMessage
nError = ERROR()
cMsg = MESSAGE()
DO CASE
**
** These errors handle missing or corrupt index files
**
CASE nError = 1 .or. nError = 114 .or. nError = 19
all_ok = .F.
ENDCASE
RETURN
******************************************************************************
baze.podataka.336max.headroom,
FP_INT86() f-ja (plus raznorazne, u temi ranije obrađene f-je korisne
Fox-u pod Novell-om), i to u tri oblika: C, FLL i PLB. Molim dobre
duše koje se identifikuju sa C-magovima :) da pogledaju ovaj source.
blnet.arjbaze.podataka.337max.headroom,
Ko se latio korišćenja svih resursa Novell-a iz Fox-a, eto mu prilike
da se raduje...
FoxPro
Functions to access Netware's Bindery (1)
*
* Function: N_ScanBindery()
* Purpose: Scans the bindery for a given object type
* Syntax: nCount = N_scanBindery( nType,čaObjects )
* Arguments: nType - Type of objects to be returned
* aObjects - Array of objects of the
* indicated type
*
* Returns: nCount - How many objects were found
*
* Notes: This function is used to get a list of all
* objects in a bindery type. For example,
* type 4 is the servers, so N_ScanBindery(4)
* would return all servers within the bindery.
*
*********************************************************
function N_ScanBindery
PARAMETERS nType,aObjects
PRIVATE cBuffer,cRequest,nCount,cList
PRIVATE x,y,z
nCount = 0
cBuffer = SPACE(57)
cRequest = CHR( 55)+CHR(255)+CHR(255)+;
CHR(255)+CHR(255)+;
CHR(0)+CHR(nType)+;
Lstring("*",48)
cList = ""
DO WHILE NetWare( 227,cRequest,čcBuffer ) == 0 AND ;
LEN(TRIM(cBuffer)) > 0
************************************************
** Extract the object name and save in array **
************************************************
nCount = nCount +1
cList = cList +CleanStr(SUBSTR(cBuffer,7,48))+";"
**
** Update the send buffer to get next member
**
cRequest = SUBSTR(cRequest,1,1)+SUBSTR(cBuffer,1,4)+;
SUBSTR(cRequest,6)
ENDDO
IF nCount > 0
DIMENSION aObjectsŠnCountĆ
z = 1
FOR x = 1 TO nCount
y = AT(";",cList,x)
aObjectsŠxĆ = SUBSTR(cList,z,y-z)
z = y+1
NEXT
ENDIF
RETURN nCount
**********************************************************
baze.podataka.338max.headroom,
FoxPro
Functions to access Netware's Bindery (2)
* Function: N_BindLevel()
* Purpose: Get workstations access level to the bindery
* Syntax: xReturn = N_BindLevel( cOption )
* Arguments: cOption = R -Read security
* W -Write security
* U -User id number
*
*********************************************************
function N_BindLevel
PARAMETERS cWhich
PRIVATE cBuffer,cRequest
PRIVATE xAnswer,y
IF PARAMETERS() = 0
cWhich = "U"
ENDIF
cBuffer = SPACE(5)
cRequest = CHR(70)
xAnswer = -1
IF Netware(227,cRequest,čcBuffer) == 0
DO CASE
CASE cWhich = "R"
y = ASC(cBuffer)%16
xAnswer = SUBSTR("ALOSN",y+1,1)
CASE cWhich = "W"
y = INT(ASC(cBuffer)/16)
xAnswer = SUBSTR("ALOSN",y+1,1)
OTHERWISE
xAnswer = Long2Fox(SUBSTR(cBuffer,2,4))
ENDCASE
ENDIF
RETURN xAnswer
baze.podataka.339max.headroom,
FoxPro
Functions to access Netware's Bindery (3)
**********************************************************
*
* Function: N_ObjectName()
* Purpose: Returns object's name from a bindery object
* Syntax: cName = N_ObjectName( nId )
* Arguments: nId - Bindery object id
* Returns: cName - The object's name in the bindery
*
* Notes:
*
*********************************************************
function N_ObjectName
parameter nId
PRIVATE cBuffer,cRequest
PRIVATE cName
cBuffer = SPACE(54)
cRequest = CHR(54)+Fox2Long(nId)
cName = ""
IF Netware(227,cRequest,čcBuffer) == 0
cName = CleanStr( SUBSTR(cBuffer,7) )
ENDIF
RETURN cName
**********************************************************
baze.podataka.340max.headroom,
FoxPro
Functions to access Netware's Bindery (4)
* Function: N_ObjectId()
* Purpose: Returns the object id for a given object
* Syntax: nIdCode = N_ObjectId( <cObject>,<nObjType> )
* Arguments: cObject - Object name
* nObjType - Type of object
*
* Returns: nIdCode - Bindery id number
*
* Notes: Every object in the bindery has a unique
* number to identify it. This function can be
* used to determine the number for any object.
*
**********************************************************
function N_ObjectId
PARAMETERS cObject,nObjType
PRIVATE cBuffer,nId,cRequest
cBuffer = SPACE(54) && Set up Receive Buffer
nId = 0
cRequest = CHR(53)+CHR(0)+CHR(nObjType)+;
Lstring(cObject,48)
if Netware(227, cRequest, čcBuffer) == 0
nId = Long2Fox(SUBSTR(cBuffer,1,4)) && Extract id
endif
RETURN nId
*********************************************************
baze.podataka.341max.headroom,
FoxPro
Functions to access Netware's Bindery (5)
* Function: N_WhoAmI()
* Purpose: Get workstation's user id
* Syntax: cUser = N_WhoAmI()
* Arguments: <NONE>
* Returns: cUser - Object name for current connection
*
* Notes: This function is used to determine the
* bindery name for the current connection.
* You could use this function to determine
* a user's id code for logging purposes.
*
*********************************************************
function N_WhoAmI
PRIVATE nId,cUser
nId = N_BindLevel("U")
cUser = ""
if !empty(nId)
cUser = N_ObjectName(nId)
endif
RETURN cUser
**********************************************************
baze.podataka.342max.headroom,
FoxPro
Functions to access Netware's Bindery (6)
* Function: N_Properties()
* Purpose: Scans the bindery object for properties
* Syntax: nCount = N_Properties(cObject,nType,;
* aProperties )
* Arguments: cObject - Object to determine properties
* nType - Type of object being checked
* aProperties - List of object's properties
*
* Returns: nCount - Number of properties associated
* with this object.
*
* Notes: This function is used to determine what
* properties are associated with this object.
* You can also use the N_PropVal() function to
* determine the value of the properties.
*
**********************************************************
function N_Properties
PARAMETERS cObject, nType,aProperties
PRIVATE cBuffer,cRequest,nCount,cList
PRIVATE x,y,z
cBuffer = SPACE(24)
cRequest = CHR(60)+;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)+;
CHR(255)+CHR(255)+CHR(255)+CHR(255)+;
Lstring("*",15)
nCount = 0
cList = ""
DO WHILE Netware( 227, cRequest, čcBuffer) = 0
nCount = nCount +1
cList = cList +CleanStr(LEFT(cBuffer,16))+";"
****************************************************
** replace sequence number with last one received **
****************************************************
cRequest = STUFF(cRequest, 53, 4, SUBSTR(cBuffer,19,4))
ENDDO
IF nCount > 0
DIMENSION aPropertiesŠnCountĆ
z = 1
FOR x = 1 TO nCount
y = AT(";",cList,x)
aPropertiessŠxĆ = SUBSTR(cList,z,y-z)
z = y+1
NEXT
ENDIF
RETURN nCount
**********************************************************
baze.podataka.343max.headroom,
FoxPro
Functions to access Netware's Bindery (7)
* Function: N_PropVal()
* Purpose: Return value of a specified property
* Syntax: xValue := N_PropVal( cObject,;
* ntype,;
* cProperty,;
* lClean )
*
* Arguments: cObject - Object to be queried
* nType - Type of object being queried
* cProperty - Property value to extract
* lClean - Should the return value be
* NULL stripped?
*
* Returns: xValue - varies depending upon the
* object and property
*
* Notes: This function is used to determine the value
* for a property from an another object. For
* example, you can use this function to
* determine the full name of a bindery object.
*
**********************************************************
function N_PropVal
PARAMETERS cObject,nType,cProperty,lClean,aList
PRIVATE cBuffer,xReturn,nSegment,nPos,cName,nObjtype
PRIVATE cId,cRequest,cList,isList
PRIVATE x,y,z
cBuffer = SPACE(130)
xReturn = ""
nSegment = 1
isList = .F.
cRequest = CHR(61)+;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)+;
CHR(nSegment)+;
Lstring(UPPER(cProperty),16)
IF type("lClean") <> "L"
lClean = .T.
ENDIF
DO WHILE Netware(227, cRequest, čcBuffer) == 0
IF ASC(SUBSTR(cBuffer,130,1)) >0
IF nSegment == 1
cList = ""
isList = .T.
xReturn = 0
ENDIF
nPos = 1
DO WHILE nPos < 128
cId = Long2Fox(SUBSTR(cBuffer,nPos,4)) && Read bindery ID
IF cId == 0 && Check for end of segment
exit
ENDIF
cName = N_ObjectName(cId) && Lookup Name & Type
cList = cList + cName+";" && and put in Return Array
xReturn = xReturn +1
nPos = nPos + 4 && then point to next ID
ENDDO
ELSE
IF nSegment == 1
xReturn = ""
ENDIF
xReturn = xReturn + left(cBuffer, 128)
ENDIF
nSegment = nSegment +1
cRequest = STUFF(cRequest,53,1,CHR(nSegment))
ENDDO
DO CASE
CASE isList
IF xReturn > 0
DIMENSION aListŠxReturnĆ
z = 1
FOR x = 1 TO xReturn
y = AT(";",cList,x)
aListŠxĆ = SUBSTR(cList,z,y-z)
z = y+1
NEXT
ENDIF
CASE lClean and type("xReturn")="C"
xReturn = CleanStr(xReturn)
ENDCASE
RETURN (xReturn)
**********************************************************
baze.podataka.344max.headroom,
FoxPro
Functions to access Netware's Bindery (8)
* Function: N_FullName()
* Purpose: Get the users full name
* Syntax: <cFullName> := N_FullName( cUser )
*
* Arguments: cUser - User bindery name
*
* Returns: cFullName - Full name of this user
*
* Notes: This function returns the user's
* identification string, usually their name.
*
*
**********************************************************
function N_FullName
PARAMETER cUser
IF PARAMETERS()=0
cUser = N_WhoAmI()
ENDIF
RETURN N_PropVal(cUser,1,"IDENTIFICATION",.T.)
*************************************
baze.podataka.345max.headroom,
FoxPro
Functions to access Netware's Bindery (9)
* Function: N_AcctExpire()
* Purpose: Get a the date this account expires
* Syntax: <dExpire> := N_AcctExpire( cUser )
*
* Arguments: cUser - User bindery name
*
* Returns: dExpire - Expiration date of user's account
*
* Notes: This function returns the user's expiration
* date, which can be used for scheduling purposes
* to prevent future activities from being
* scheduled past the user's access date.
*
* Example: LOCAL dExpire := N_AcctExpire( N_WhoAmI() )
*
***********************************************************************
function N_AcctExpire
PARAMETER cUser
PRIVATE cString,yy,mm,dd
IF PARAMETERS()=0
cUser = N_WhoAmI()
ENDIF
cString = N_PropVal(cUser,1,"LOGIN_CONTROL",.T.)
yy = 1900 + ASC(SUBSTR(cString,1,1))
mm = ASC(SUBSTR(cString,2,1))
dd = ASC(SUBSTR(cString,3,1))
RETURN IIF(mm=0,CTOD(" / / "),CTOD(str(mm,2)+;
"/"+STR(dd,2)+"/"+STR(yy,4)))
**********************************
baze.podataka.346max.headroom,
FoxPro
Functions to access Netware's Bindery (10)
* Function: N_Balance()
* Purpose: Get the current account balance for a user
* Syntax: <nBalance> := N_Balance( cUser )
*
* Arguments: cUser - User bindery name
*
* Returns: nBalance - User's balance if accounting is
* installed
*
* Notes: This function returns the current balance for
* the specified user. If accounting is not
* installed, zero will be returned. You can use
* this function to restrict certain program
* operations to users with sufficient funds.
*
* Example: LOCAL nBalance := N_Balance( N_WhoAmI() )
*
**********************************************************
function N_Balance
PARAMETER cUser
PRIVATE cAmt
IF PARAMETERS()=0
cUser = N_WhoAmI()
ENDIF
cAmt = N_PropVal(cUser,1,"ACCOUNT_BALANCE",.F.)
RETURN Long2Fox(SUBSTR(cAmt,1,4))
**********************************
baze.podataka.347max.headroom,
FoxPro
Functions to access Netware's Bindery (11)
* Function: N_CredLimit()
* Purpose: Get the current credit limit for a user
* Syntax: <nCredLimit> := N_CredLimit( cUser )
*
* Arguments: cUser - User bindery name
*
* Returns: nBalance - User's credit limit if accounting is installed
*
* Notes: This function returns the current credit limit for the
* specified user. If accounting is not installed, zero
* will be returned. You can use this function to restrict
* certain program operations to user with sufficient funds.
*
*
**********************************************************
function N_CredLimit
PARAMETER cUser
PRIVATE cAmt
IF PARAMETERS()=0
cUser = N_WhoAmI()
ENDIF
cAmt = N_PropVal(cUser,1,"ACCOUNT_BALANCE",.F.)
RETURN Long2Fox(SUBSTR(cAmt,5,4))
**********************************************************
baze.podataka.348max.headroom,
FoxPro
Functions to access Netware's Bindery (12)
* Function: N_IsMember()
* Purpose: Check for group membership
* Syntax: <logical> := N_IsMember( cObject,cGroup )
*
* Arguments: cObject - Object to be tested
* cGroup - Group to test
*
* Returns: TRUE if object is a member, FALSE otherwise
*
* Notes: This function is used to see if an object is
* a member of a group. It can be used to
* restrict menu choices to only members of a
* department.
*
**********************************************************
function N_IsMember
PARAMETERS cObject,cGroup
PRIVATE cRequest
cRequest = CHR(67)+;
CHR(0)+CHR(1)+;
Lstring(cObject,48)+;
Lstring("GROUPS_I'M_IN",16)+;
CHR(0)+CHR(2)+;
Lstring(cGroup,48)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.349max.headroom,
FoxPro
Functions to access Netware's Bindery (13)
* Function: N_IsManager()
* Purpose: Check if user is manager of a group
* Syntax: <logical> := N_IsManager( cObject,cGroup )
*
* Arguments: cObject - Object to be tested
* cGroup - Group to test
*
* Returns: TRUE if object is a manager, FALSE otherwise
*
* Notes: This function is used to see if an object is
* a manager of a group. It can be used to
* restrict menu choices to only managers of a
* department.
*
**********************************************************
function N_IsManager
PARAMETERS cObject,cGroup
PRIVATE cRequest
cRequest = CHR(67)+;
CHR(0)+CHR(2)+;
Lstring(cGroup,48)+;
Lstring("OBJ_SUPERVISORS",16)+;
CHR(0)+CHR(1)+;
Lstring(cObject,48)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.350max.headroom,
FoxPro
Functions to access Netware's Bindery (14)
* Function: N_IsInSet()
* Purpose: See if one object is with another's set
* property
* Syntax: <logical> = N_IsInSet( cObject1,nType1,;
* cObject2,nType2,cProperty)
*
* Arguments: cObject1 -Object to be tested for ownership
* nType1 -Type of owner object
* cObject2 -Object to be tested for membership
* nType2 -Type of member object
* cProperty -Set property to test
*
* Returns: TRUE if in group, FALSE otherwise
*
* Notes: This function is used to determine if one
* object is a member of the specified property
* for another object. For example, you can
* use this function to determine if a user
* should be allowed to perform a menu option.
*
**********************************************************
function N_IsInSet
PARAMETER cObject1,nType1,cObject2,nType2,cProperty
PRIVATE cRequest
cRequest = CHR(67)+;
CHR(0)+CHR(nType1)+;
Lstring(cObject1,48)+;
Lstring(cProperty,16)+;
CHR(0)+CHR(nType2)+;
Lstring(cObject2,48)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.351max.headroom,
FoxPro
Functions to access Netware's Bindery (15)
* Function: N_IsOperator( cUser, cServer )
* Purpose: See if the user has operator rights to the
* server
* Syntax: <logical> := N_IsOperator( cUser,cServer )
* Arguments: cUser - User Id to test
* cServer - Server to check
*
* Returns: TRUE if user has rights, FALSE otherwise
*
* Notes: This function is used to see if the user id
* has operator rights on a server. You could
* use this function to control access into
* parts of your FoxPro application.
*
*
**********************************************************
function N_IsOperator
PARAMETERS cUser,cServer
PRIVATE x
X = PARAMETERS()
IF X < 1
cUser = N_WhoAmI()
ENDIF
IF X < 2
DIMENSION arr_(1)
=N_ScanBindery(4,čarr_)
cServer = arr_Š1Ć
ENDIF
RETURN N_IsInSet( cServer,4,cUser,1,"OPERATORS" )
**********************************************************
baze.podataka.352max.headroom,
FoxPro
Functions to access Netware's Bindery (16)
* Function: N_DefExpire()
* Purpose: See the default expiration date for new
* user-ids
* Syntax: <dExpire> := N_DefExpire()
* Arguments: NONE
*
* Returns: An date value or an empty date if a
* problem occurs
*
* Notes: This function is used to see what date the
* user id could expire on. You might use this
* date to limit future scheduling to before
* the expiration date.
*
*
**********************************************************
function N_DefExpire
PRIVATE cString,yy,mm,dd
**
cString = N_PropVal("SUPERVISOR",1,"USER_DEFAULTS",.F.)
yy = 1900 + ASC(SUBSTR(cString,1,1))
mm = ASC(SUBSTR(cString,2,1))
dd = ASC(SUBSTR(cString,3,1))
RETURN IIF(mm=0,CTOD(" / / "),;
CTOD(STR(mm,2)+"/"+STR(dd,2)+"/"+STR(yy,4)))
**********************************************************
baze.podataka.353max.headroom,
FoxPro
Functions to access Netware's Bindery (17)
* Function: N_AddObject()
* Purpose: Adds an object into the bindery
* Syntax: <logical> := N_AddObject(cObject,;
* nType,;
* cFlag,;
* cRead,;
* cWrite )
* Arguments: cObject - Object to be added to the bindery
* nType - Type of object being added
* cFlag - Static/Dynamic
* cRead - Read security
* cWrite - Write security
*
* Returns: TRUE if added, FALSE otherwise
*
* Notes: This function is used to add a new object into the
* bindery. You must specify the object name, type,
* flag and security for any item added.
*
**********************************
function N_AddObject
PARAMETERS cObject, nType, cFlag, cRead, cWrite
PRIVATE cRequest,nRead,nWrite
cRequest = chr(50)
IF PARAMETERS() < 4
cFlag = "S"
ENDIF
IF PARAMETERS() < 5
cRead = "O"
ENDIF
IF PARAMETERS() < 6
cWrite = "O"
ENDIF
nWrite = AT(cWrite,"ALOSN")-1
nRead = AT(cRead ,"ALOSN")-1
cRequest = cRequest + CHR(IIF(cFlag="D", 1, 0))+;
CHR((nWrite * 16) + nRead)+;
CHR(0)+CHR(nType) +;
Lstring(cObject,48)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.354max.headroom,
FoxPro
Functions to access Netware's Bindery (18)
* Function: N_DelObject()
* Purpose: Removes an object from the bindery
* Syntax: <logical> := N_DelObject( cOject,nType )
*
* Arguments: cObject - Object to be remove from bindery
* nType - Type of object being removed
*
* Returns: TRUE if removed, FALSE otherwise
*
* Notes: This function is used to remove a bindery
* object. Keep in mind that Netware's security
* will probably restrict you from removing any
* objects unless the id has supervisory rights.
*
**********************************************************
function N_DelObject
PARAMETERS cObject, nType
PRIVATE cRequest
cRequest = CHR(51)+;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.355max.headroom,
FoxPro
Functions to access Netware's Bindery (19)
* Function: N_RenObject()
* Purpose: Renames a bindery object
* Syntax: <logical> := N_RenObject( cOld,nType,cNew )
*
* Arguments: cOld - Original name of the object
* nType - Type of object being renamed
* cNew - New name of the bindery object
*
* Returns: TRUE if changed, FALSE otherwise
*
* Notes: This function is used to rename an object
* in the bindery.
*
**********************************************************
function N_RenObject
PARAMETERS cOld, nType, cNew
PRIVATE cRequest
cRequest = CHR(52)+;
CHR(0)+CHR(nType)+;
Lstring(cOld,48)+;
Lstring(cNew,48)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.356max.headroom,
FoxPro
Functions to access Netware's Bindery (20)
* Function: N_AddProperty()
* Purpose: Adds a property to a bindery object
* Syntax: <logical> = N_AddProperty( cObject,;
* nType,;
* cProperty,;
* cFlag,;
* cItemSet,;
* cRead,;
* cWrite )
*
* Arguments: cObject - Object to add the property to
* nType - Type of object
* cProperty - Set property to add to object
* cFlag - Property flag, Static or Dynamic
* cItemSet - (I)tem or (S)et property
* cRead - Property read security
* cWrite - Property write security
*
* Returns: TRUE if added, FALSE otherwise
*
* Notes: This function is used to add a property to an
* existing bindery object. For example, you can
* use this function to add a fax number property
* to a user bindery object. Keep in mind this
* function only adds the property, it does not
* assign a value to it.
*
**********************************************************
function N_AddProperty
PARAMETERS cObject,nType,cProperty,cFlag,cItemSet,cRead,cWrite
PRIVATE cRequest,nRead,nWrite
cRequest = CHR(57)+;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)
IF PARAMETERS() < 4
cFlag = "S"
ENDIF
IF PARAMETERS() < 5
cItemSet = "I"
ENDIF
IF PARAMETERS() < 6
cRead = "O"
ENDIF
IF PARAMETERS() < 7
cWrite = "O"
ENDIF
nWrite = AT(cWrite,"ALOSN")-1
nRead = AT(cRead ,"ALOSN")-1
cRequest = cRequest +CHR(IIF(cFlag="D", 1, 0)+;
IIF(cItemSet="S",2,0))+;
CHR((nWrite*16)+nRead)+;
Lstring(UPPER(cProperty),16)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
CONF JOIN PC.PROG.4
CONF REPLY baze.podataka
baze.podataka.357max.headroom,
FoxPro
Functions to access Netware's Bindery (22)
* Function: N_ChgValue()
* Purpose: Changes a property's value
* Syntax: <logical> := N_ChgValue( cObject,nType,;
* cProperty,xValue )
*
* Arguments: cObject - Object name to be updated
* nType - Type of object being updated
* cProperty - Property to change
* xValue - New value for the property
*
* Returns: TRUE if property value was changed,
* FALSE otherwise
*
* Notes: This function is used to change the value
* for a given property. For example, after
* adding a property called FAX_NUMBER to a
* user object, you would use this function
* to write the person's fax number in.
*
**********************************************************
function N_ChgValue
PARAMETERS cObject, nType, cProperty, xValue
PRIVATE cRequest
cRequest = CHR(62)+;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)+;
CHR(1)+CHR(255)+;
Lstring(UPPER(cProperty),16)+;
PADR(xValue,128,CHR(0))
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.358max.headroom,
FoxPro
Functions to access Netware's Bindery (23)
* Function: N_Add2Set()
* Purpose: Adds an object to a set
* Syntax: <logical> := N_Add2Set( cOwner,nOwnType,;
* cObject,nType,cProperty )
*
* Arguments: cOwner - Bindery object that owns the set
* nOwnType - Owner's object type
* cObject - Object to be added to owner set
* nType - Type of object being added
* cProperty - Set property to add cObject to
*
* Returns: TRUE if added, FALSE otherwise
*
* Notes: This function is used to add an object to a
* group owned by another object. For example,
* you can use this function to place a user
* bindery object into a group.
*
**********************************************************
function N_Add2Set
PARAMETERS cOwner, nOwnType, cObject, nType, cProperty
PRIVATE cRequest
cRequest = CHR(65)+;
CHR(0)+CHR(nOwnType)+;
Lstring(cOwner,48)+;
Lstring(UPPER(cProperty),16)+;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.359max.headroom,
FoxPro
Functions to access Netware's Bindery (24)
* Function: N_DelFromSet()
* Purpose: Removes an object from a set
* Syntax: <logical> = N_DelFromSet( cOwner,nOwnType,;
* cObject,nType,cProperty )
*
* Arguments: cOwner - Bindery object that owns the set
* nOwnType - Owner's object type
* cObject - Object to be removed to owner's
* set
* nType - Type of object being removed
* cProperty - Set property to remove cObject
* from
*
* Returns: TRUE if removed, FALSE otherwise
*
* Notes: This function is used to remove an object
* from a group owned by another object.
*
**********************************************************
function N_DelFromSet
PARAMETERS cOwner, nOwnType, cObject, nType, cProperty
PRIVATE cRequest
cRequest = CHR(66)+;
CHR(0)+CHR(nOwnType)+;
Lstring(cOwner,48)+;
Lstring(UPPER(cProperty),16)+;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)
RETURN Netware(227,cRequest,"") == 0
baze.podataka.360max.headroom,
FoxPro
Functions to access Netware's Bindery (25)
* Function: N_Members()
* Purpose: Get members of a group
* Syntax: <nCount> := N_Members( cObject,čALIST )
*
* Arguments: cGroup - Group to test
* aList - List of users
*
* Returns: Number of users found within the group
*
* Notes: This function is used to determine the number
* of members in a group. It also returns a list
* list of members.
*
**********************************************************
function N_Members
PARAMETERS cGroup,aList
PRIVATE nCount
if PARAMETERS() < 2
return 0
endif
nCount= N_PropVal(cGroup,2,"GROUP_MEMBERS",.F.,čALIST)
RETURN nCount
baze.podataka.361max.headroom,
FoxPro
Functions to access Netware's Bindery (26)
* Function: N_Managers()
* Purpose: Get managers of a group
* Syntax: <nCount> := N_Managers( cObject,čALIST )
*
* Arguments: cGroup - Group to test
* aList - List of managers
*
* Returns: Number of managers found within the group
*
* Notes: This function is used to determine the number
* of managers in a group. It also returns a list
* list of managers.
*
**********************************************************
function N_Managers
PARAMETERS cGroup,aList
PRIVATE nCount
if PARAMETERS() < 2
return 0
endif
nCount= N_PropVal(cGroup,2,"OBJ_SUPERVISORS",.F.,čALIST)
RETURN nCount
baze.podataka.362max.headroom,
FoxPro
Functions to access Netware's Bindery (27)
* Function: N_Qdir()
* Purpose: Get the name of the print queue's directory
* Syntax: <cDir> = N_Qdir( nQueueId )
*
* Arguments: nQueueId -Bindery object id of queue
*
* Returns: cDir - Directory where files are stored
*
* Notes: This function is used to determine the name
* of the directory where the print queues files
* are stored until they are printed.
*
**********************************************************
function N_Qdir
PARAMETER nId
PRIVATE cDir
cDir = N_PropVal( nId,3,"Q_DIRECTORY",.T. )
RETURN cDir
baze.podataka.363max.headroom,
FoxPro
Functions to access Netware's Bindery (28)
* Function: N_QOperators()
* Purpose: Get a list of queue operators
* Syntax: <nCount> = N_QOperators( nQueueId,čaList )
*
* Arguments: nQueueId -Bindery object id of queue
* aList -Array passed by reference
*
* Returns: nCount -Number of queue operators
*
* Notes: This function is used to determine the user
* ids of the print queues operators.
*
**********************************************************
function N_QOperators
PARAMETER nId,aList
PRIVATE nCount
nCount = N_PropVal( nId,3,"Q_DIRECTORY",.T.,čALIST )
RETURN nCount
baze.podataka.364max.headroom,
FoxPro
Functions to access Netware's Bindery (29)
* Function: N_NetAddr()
* Purpose: Returns the file server's network address
* Syntax: <nAddr> := N_NetAddr()
* Arguments: cServer
*
* Returns: 0 or the specified servers network
* address
*
**********************************************************
function N_NetAddr
PARAMETERS cServer
PRIVATE cString
IF PARAMETERS() < 1
DIMENSION arr_(1)
=N_ScanBindery(4,čarr_)
cServer = arr_Š1Ć
ENDIF
cString = N_PropVal(cServer,4,"NET_ADDRESS",.F.)
RETURN cString
**********************************************************
baze.podataka.365max.headroom,
FoxPro
Functions to access Netware's Bindery (30)
**********************************************************
* Function: Netware() *
* Purpose: Shell for call Netware's API *
**********************************************************
function Netware
PARAMETERS nService,cRequest,cReply
DIMENSION aRegsŠ10Ć
PRIVATE nReturn
nReturn = -1
aRegsŠ 1Ć = nService * 256
aRegsŠ 5Ć = .T.
aRegsŠ 6Ć = .F.
aRegsŠ 8Ć = CHR(LEN(cRequest))+CHR(0) + cRequest
aRegsŠ 9Ć = CHR(LEN(cReply))+CHR(0) + cReply
IF fp_int86( 33, čaRegs )
nReturn = aRegsŠ1Ć % 256
IF nReturn < 0
nReturn = nReturn +256
ENDIF
ENDIF
cReply = SUBSTR(aRegsŠ9Ć,3)
RETURN nReturn
**********************************************************
Eto i poslednje funkcijice. Gigantsko izvinjenje onima koje ovako
nešto ne zanima, ali bih lično dao i poslednji nerv nervirajući se
zbog većeg broja poruka slične sadržine :) Uskoro sledi i rasprava
vezana za pomenute f-je, te sam ih zato i dao odvojeno, a ne u obliku
fajla (kako bi predložili zli jezici ;), edabi se pozivao na broj
poruke pri detaljisanju.
baze.podataka.366max.headroom,
> P.S. Bolje naka max.headroom javno objavi broj
> ziro-racuna, verovatno nisam jedini koji zeli da konkretno
> zahvali ...
Hvala na pivu, ali predlažem kokakolu :)
Naravno, tek kad nam otvore temu ;)
baze.podataka.367max.headroom,
> Da li bi ti to bila pouzdana informacija o postojanju
> CDX-a? Šta kad ručno izbrišeš CDX, a u DBF-u ostane
> indikator?
U tom slučaju Fox napomene da je došlo do oštećenja/brisanja CDX
fajla, i negde (verovatno u strukturi DBF-a) ukine tu informaciju. Pa
kad sledeći put otvoriš pomenuti DBF ne javlja se nikakva greška,
jerbo su indeksi (CDX) nestali :) A mene brine to ukidanje
informacije, jerbo je greška samim tim jednokratna.
Poruka dela: OBAVEZNO startovati programče koje kontroliše strukture
baza i pripadajuće indekse pri svakom podizanju aplikacije, a sve po
undapred definisanom šablonu. Ako je CDX oštećen, obrisati ga i nanovo
otvoriti bazu pa rekreirati - u svakom drugom slučaju ostaste bez
otvorene baze :)
baze.podataka.368max.headroom,
> Ne upisuje! :)
Bre :), pa zašto onda Fox daje poruku "Structural CDX file reference
removed"?
I još nešto:
1. kreiraš CDX fajl
2. CLOSE DATA
3. zatim ga obrišeš (na kvarno - !DEL *.CDX) i otvoriš bazu
4. Fox kaže "CDX-a nema"
5. ti kažeš "Ignore" i fleg je ukinut
6. CLOSE DATA
7. sada lepo napraviš jedan Undelete tog CDX fajla
8. otvoriš bazu
9. uočiš da nigde nema definicija indeksa (a CDX-a ima - recovered)
10. cvrc! :)
baze.podataka.369max.headroom,
FoxPro
Functions to access Netware's Bindery (21)
* Function: N_DelProperty()
* Purpose: Removes a property from a bindery object
* Syntax: <logical> := N_DelProperty( cObject,nType,;
* cProperty )
*
* Arguments: cObject - Object to be updated
* nType - Type of object being updated
* cProperty - Property to remove from object
*
* Returns: TRUE if removed, FALSE otherwise
*
* Notes: This function is used to remove a property
* from a bindery object. For example, you can
* use this function to remove the FAX_NUMBER
* property from a user-id object
*
**********************************************************
function N_DelProperty
PARAMETERS cObject, nType, cProperty
PRIVATE cRequest
cRequest = CHR(58)+ ;
CHR(0)+CHR(nType)+;
Lstring(cObject,48)+;
Lstring(UPPER(cProperty),16)
RETURN Netware(227,cRequest,"") == 0
**********************************************************
baze.podataka.370dr.grba,
>> ACCESS: If you're looking for a superb Windows development tool,
>> look no further.
Tek sam zagnjurio u Access. Alat je nešto daleko nadmoćnije od svega
što sam dosada video na DOS ili Win platformama, naravno uz ogradu da
nisam video sve (((:
Ali da ždere resurse mašine - ždere. Na 486 DX2 VLB sa 8 MB RAM je tek
podnošljivo. Na 386/40 sa 4 MB RAM ne prestaje da drlja po disku. Istina:
specifikacija je izričita da Access 2.0 zahteva 6 MB RAM za sebe. Ako
hoćete udobnu razvojnu mašinu za Access, stavite u nju 16 MB RAM i
optimizujte parametre rada diska.
I šta činiti, pitanje je sad? Ostati na XT socijali ili ići dalje?
Moj izbor je ovo drugo.
baze.podataka.371djelovic,
> > Ne upisuje! :)
>
> Bre :), pa zašto onda Fox daje poruku "Structural CDX file reference
> removed"?
Bre! :) Zašto jednostavno ne napravite dve baze, jednu sa indeksima i jednu
bez, pa uradite compare? Tako ćete najbrže otkriti u kom zecu leži grm.
baze.podataka.372nkbog,
> U vrlo lepoj knjizici "CA-Clipper 5.2 i mrezno programiranje" od
> J.D.Booth i G.Lief daju se strukture DBF , NDX, CDX i dr.,
U knjižici pod imenom "Update" iz FoxPro-a 2.6 se nalaze sve strukture fajlova
(uključujući i Report, Screen itd), ali tamo nema pomena o identifikatoru
o postojanju .CDX.
Ipak on POSTOJI: na offsetu 0x1C u .DBF se nalazi 01 ako postoji, a 00 ako
ne postoji.
Kad smo kod struktura: .MNX datoteke imaju polje za MESSAGE kojega nema u
dijalozima u Menu Builderu. Kada se podesi ručno (USE kukulele.MNX, pa
BROWSE) GENMENU napravi ispravan menu (sa porukama u na dnu ekrana).
NB.
p.s. Jel' neko uspeo da skreše veličinu .FRX datoteka - t.j. da izbaci
one stvari koje trebaju za Windowse.
baze.podataka.373nkbog,
>> to izbeci (ON ERROR, ON KEY ili nesto slicno).
> Ovo vuče na neki bag iz 2.5, koji se javljao na strelici ulevo na brauzu
> na numeričkom polju. Nisam imao slučaj, mada sam čuo, a prema
> dokumentaciji treba da je ispravljeno u 2.6.
Mea culpa (glupa?): na serveru smo imali i 2.5 i 2.6, a na tim računarima
je bilo mapiranje na katalog 2.5, a ne 2.6... U 2.6 nema tog problema.
NB.
baze.podataka.374djorzor,
Ja sam možda malo glup, ali ...
Kako da u Paradox-u ili Access-u napravim Query
koji vraća samo one record-e koji su u duplikatu?
Na primer, imam spisak imena i adresa i hoću da vidim
koje su unete više od jedanput.
baze.podataka.375zelkop,
Valjda je najjednostavnije da se indeksira, pa se vizuelno
vide duplikati. Ako se postavi i key na indeksiranoj bazi,
trebalo bi da se automatski formira izveštaj tipa
"key violation".
baze.podataka.376max.headroom,
Za sve one koji se bave Fox-om pod Novell-om, evo
zanimljivog materijala za proučavanje. Slede opisi
funkcija navedenih u fajlu NETPRINT.ARJ - a tiču
se mrežnog printera. Sve po Booth-u i Lief-u...
Function: N_STARTCAP()
Purpose: To allow capture of local printers
from within a FoxPro 2.5 program
Syntax: <logical> = N_STARTCAP( Š<nPrinter>Ć )
Arguments: nPrinter - Optional print to capture
Returns: TRUE is successful, FALSE otherwise
Notes: This function is used to start a capture to the
specified printer.
---------------------------------------------------------------------
Function: N_FLUSHCAP()
Purpose: To force the network to print the
current capture file.
Syntax: <nJob> = N_FLUSHCAP( Š<nPrinter>Ć )
Arguments: nPrinter - Optional captured printer to flush
Returns: Job number for print queue handling printing, or
zero if a problem occurs.
Notes: This function is used to send a capture file to
the network printer. The capture will not be
stopped and all subsequent output will be
redirected as well.
---------------------------------------------------------------------
Function: N_CLOSECAP()
Purpose: To close the capture and return control
to the local printer
Syntax: <nJob> = N_CLOSECAP( Š<nPrinter>Ć )
Arguments: nPrinter - Optional captured printer to close
Returns: Job number for print queue handling printing, or
zero if a problem occurs.
Notes: This function is used to close a capture being
run on a printer. The output will be set to the
network printer.
---------------------------------------------------------------------
Function: N_CANCELCAP()
Purpose: To cancel the capture and return control
to the local printer. The file is not printed.
Syntax: <logical> = N_CANCELCAP( Š<nPrinter>Ć )
Arguments: nPrinter - Optional captured printer to cancel
Returns: TRUE if canceled, FALSE otherwise
Notes: This function is used to cancel a capture being
run on a printer. No output will be set to the
network printer, it will all be discarded if the
function returns TRUE.
---------------------------------------------------------------------
Function: N_CAPFLAGS()
Purpose: To set the network capture flags
Syntax: <logical> = N_CapFlags( aOldFlags Š,<aNewFlags>Ć )
Arguments: aOldFlags - Current capture flags
aNewFlags - Optional array of new flags to set
Notes: This function is used to set the capture flags
for the default printer. The array consists of
twelve elements as defined below:
1 Logical Should banners be printed?
2 Char Text of the banner
3 Numeric Which local printer is captured?
4 Numeric Which network printer is serving it?
5 Numeric Bindery print queue object id
6 Numeric Number of copies to print
7 Numeric Form number
8 Char Name of the form to load in printer
9 Numeric Job number
10 Numeric Maximum lines down
11 Numeric Maximum characters across
12 Numeric Timeout value in seconds
---------------------------------------------------------------------
Function: N_QJOBLIST()
Purpose: Get the list of jobs within the queue
Syntax: <nCount> = N_QjobList(nQueue,čaJobs)
---------------------------------------------------------------------
Function: N_QPOSITION()
Purpose: Queries/Changes a job's print position
Syntax: <logical> = N_QPOSITION(nQueue,nJob,nPosition)
---------------------------------------------------------------------
Function: N_QREMOVE()
Purpose: Remove a job from the print queue
Syntax: <logical> = N_QREMOVE(nQueue,nJob)
---------------------------------------------------------------------
Function: Q_INSTALLED()
Purpose: To check installed state of PRINT.EXE
Returns: lInstalled - TRUE if installed, FALSE otherwise
---------------------------------------------------------------------
Function: Q_ADD.PRG
Purpose: To add a file to the print queue
Syntax: Q_add( cFilename )
Parameter: cFilename
Returns: lSuccess - TRUE if file added, FALSE otherwise
---------------------------------------------------------------------
Function: Q_REMOVE()
Purpose: To remove a file from the print queue
Syntax: Q_remove( cFilename )
Parameter: cFilename
Returns: lSuccess - TRUE if removed, FALSE otherwise
---------------------------------------------------------------------
Program: Q_CANCEL.PRG
Purpose: To cancel all jobs in the print queue
Syntax: Q_cancel()
Parameter: NONE
Returns: lSuccess - TRUE if all jobs were canceled
FALSE otherwise
---------------------------------------------------------------------
Function: P_WHERE()
Purpose: Selects where to print a report
Returns: TRUE if printer select,
FALSE if the escape key pressed
---------------------------------------------------------------------
Function: P_START()
Purpose: Sets the environment up to print
---------------------------------------------------------------------
Function: P_CANCEL()
Purpose: Check to see if ESCAPE was pressed
Returns: FALSE to continue printing
TRUE if the escape key pressed
---------------------------------------------------------------------
Function: P_END()
Purpose: Finishes the report and prints it
netprint.arjbaze.podataka.377max.headroom,
* Fox & Novell (1)
*
* Program: SYSINFO.PRG
* Function: N_Login()
* Purpose: Attempt to log in to a server
* Syntax: <logical> = N_Login(cUser,cPassword)
**********************************
function N_login
PARAMETERS cUser,cPassword
PRIVATE cRequest,cReply
cRequest = CHR(14)+;
FOX2LONG(1)+;
LSTRING(UPPER(cUser),48)
IF LEN(TRIM(cPassword)) > 0
cRequest = cRequest + LSTRING(UPPER(cPassword),16)
ENDIF
cReply = SPACE(2)
return ( Netware( 227, cRequest, čcReply ) = 0 )
baze.podataka.378max.headroom,
* Fox & Novell (2)
*
* Function: N_Logout()
* Purpose: Attempt to log out from the server
* Syntax: <logical> := N_Logout()
**********************************
function N_Logout
PRIVATE is_gone
DIMENSION aRegs(10)
STORE 0 TO aRegs
aRegsŠ1Ć = 215 * 256
is_gone = FP_Int86(33,čaRegs)
RETURN is_gone
baze.podataka.379max.headroom,
* Fox & Novell (3)
*
* Function: N_ConInfo()
* Purpose: Get array of connection information
* Syntax: <logical> = N_ConInfo(cUser,čaInfo)
**********************************
function N_ConInfo
PARAMETERS cUser,aInfo
PRIVATE cRequest,cReply,dLogDate,cLogTime,is_ok
DIMENSION aRegs(10),aWhere(1)
STORE 0 TO aRegs
is_ok = .F.
IF N_FINDSTAT(cUser,čaWhere) > 0
cRequest = CHR(22)+CHR( aWhere(1) )
cReply = SPACE(63)
IF Netware(227,cRequest,čcReply) = 0
DIMENSION aInfo(5)
SET LIBRARY TO BLNET ADDITIVE
aInfo(1) = LONG2FOX(SUBSTR(cReply,1,4))
aInfo(2) = INT2FOX(SUBSTR(cReply,5,2))
aInfo(3) = CLEANSTR(SUBSTR(cReply,7,48))
dLogDate = CTOD( STR(ASC(SUBSTR(cReply,56,1)),2)+"/"+;
STR(ASC(SUBSTR(cReply,57,1)),2)+"/"+;
STR(ASC(SUBSTR(cReply,55,1)),2) )
aInfo(4) = dLogDate
cLogTime = STR(ASC(SUBSTR(cReply,58,1)),2)+":"+;
STR(ASC(SUBSTR(cReply,59,1)),2)+":"+;
STR(ASC(SUBSTR(cReply,60,1)),2)
aInfo(5) = cLogTime
is_ok = .T.
ENDIF
ENDIF
RETURN is_ok
baze.podataka.380max.headroom,
* Fox & Novell (4)
*
* Function: N_FindStat()
* Purpose: Get a list of stations for a user
* Syntax: <nCount> = N_FindStat( cUser,čaList )
**********************************
function N_FindStat
PARAMETERS cUser, aStations
PRIVATE cReply,cRequest,nCount,x
cReply = SPACE(103) && Reply buffer
cRequest = CHR(21)+;
FOX2INT(1)+;
LSTRING(cUser,47)
nCount = 0
IF NetWare( 227,cRequest,čcReply ) = 0
nCount = ASC(SUBSTR(cReply,1,1))
IF nCount > 0
DIMENSION aStations(nCount)
FOR x = 1 TO nCount
aStations(x) = ASC(SUBSTR(cReply,x+1,1))
NEXT
ENDIF
ENDIF
RETURN nCount
baze.podataka.381max.headroom,
* Fox & Novell (5)
*
* Function: N_ShellVer()
* Purpose: Retrieves network shell information
* Syntax: cVersion = N_ShellVer()
**********************************
function N_ShellVer
PRIVATE x,cVersion
DIMENSION aRegsŠ10Ć
STORE 0 TO aRegs
cVersion = ""
aRegs(1) = 234 * 256
IF FP_Int86(33,čaRegs)
IF aRegs(1) >= 0
cVersion = ALLTRIM(STR(INT(aRegs(2)/256)))+"."+;
ALLTRIM(STR(INT(aRegs(2)%256)))+;
CHR(65+(aRegs(3)%256))
IF SUBSTR(cVersion,1,1)>="3"
x = aRegs(3)/256
IF x > 0
cVersion = cVersion + IIF(x=1,"e","x")
ENDIF
ENDIF
ENDIF
ENDIF
RETURN cVersion
baze.podataka.382max.headroom,
* Fox & Novell (6)
*
* Function: N_ConsPriv()
* Purpose: Determines if user has console privileges
* Syntax: <logical> := N_ConsPriv()
**********************************
function N_ConsPriv
PRIVATE cReply,cRequest,is_ok
is_ok = .F.
cReply = SPACE(2)
cRequest = CHR(200)
IF Netware(227,cRequest,čcReply) = 0
is_ok = .T.
ENDIF
RETURN is_ok
baze.podataka.383max.headroom,
* Fox & Novell (7)
*
* Function: N_ServLogin()
* Purpose: Get/set block for server logins allowed
* Syntax: <logical> := N_ServLogin( ŠlSettingĆ )
**********************************
function N_ServLogin
PARAMETER lSetting
PRIVATE is_allowed,cReply,pcount
pcount = PARAMETERS()
is_allowed = .T.
cReply = space(1)
IF NetWare(227,CHR(205),čcReply) = 0
is_allowed = ASC(cReply)>0
IF pcount > 0
cReply = SPACE(2)
=NetWare( 227, CHR(IIF(lSetting,204,203)),čcReply )
ENDIF
ENDIF
RETURN is_allowed
baze.podataka.384max.headroom,
* Fox & Novell (8)
*
* Function: FsDateTime()
* Purpose: Get the file server date and time
* Syntax: <array> := FSDateTime()
**********************************
function FsDateTime
PARAMETERS aInfo
DIMENSION aRegs(10)
PRIVATE cReply,dDate,cTime,is_ok
STORE 0 TO aRegs
is_ok = .F.
cReply = SPACE(7)
aRegs(1) = 231 * 256
aRegs(8) = cReply
aRegs(4) = .T.
IF FP_int86( 33, čaRegs )
dDate = CTOD( STR(ASC(SUBSTR(aRegs(8),2,1)),2)+"/"+;
STR(ASC(SUBSTR(aRegs(8),3,1)),2)+"/"+;
STR(ASC(SUBSTR(aRegs(8),1,1)),2) )
cTime = STR(ASC(SUBSTR(aRegs(8),4,1)),2)+":"+;
STR(ASC(SUBSTR(aRegs(8),5,1)),2)+":"+;
STR(ASC(SUBSTR(aRegs(8),6,1)),2)
aInfo(1) = dDate
aInfo(2) = cTime
is_ok = .T.
ENDIF
RETURN is_ok
baze.podataka.385max.headroom,
* Fox & Novell (9)
*
* Function: N_WhoBlame()
* Purpose: Get the file-server installation array
* Syntax: N_WhoBlame( čarray )
**********************************
function N_WhoBlame
PARAMETERS aInfo
PRIVATE cRequest,cReply,x,jj,is_ok
cRequest = CHR(201)
cReply = SPACE(512)
is_ok = .F.
IF Netware( 227, cRequest, čcReply ) = 0
DIMENSION aInfo(4)
FOR jj = 1 TO 4
x = AT(CHR(0),cReply)
IF x > 0
IF jj = 3
aInfoŠjjĆ = CTOD(SUBSTR(cReply,1,x-1))
ELSE
aInfoŠjjĆ = SUBSTR(cReply,1,x-1)
ENDIF
cReply = SUBSTR(cReply,x+1)
ENDIF
NEXT
is_ok = .T.
ENDIF
RETURN is_ok
baze.podataka.386max.headroom,
* Fox & Novell (10)
*
* Function: N_MiscInfo()
* Purpose: Get an array of miscellaneous server information
* Syntax: N_MiscInfo(čarray)
**********************************
function N_MiscInfo
PARAMETERS aInfo
PRIVATE cRequest,cReply,is_ok
cRequest = CHR(17)
cReply = SPACE(130)
is_ok = .F.
IF Netware( 227, cRequest, čcReply ) = 0
DIMENSION aInfo(17)
SET LIBRARY TO BLNET ADDITIVE
aInfoŠ 1Ć = CLEANSTR(SUBSTR(cReply,1,48))
aInfoŠ 2Ć = ASC(SUBSTR(cReply,49,1))
aInfoŠ 3Ć = ASC(SUBSTR(cReply,50,1))
aInfoŠ 4Ć = INT2FOX(SUBSTR(cReply,51,2))
aInfoŠ 5Ć = INT2FOX(SUBSTR(cReply,53,2))
aInfoŠ 6Ć = INT2FOX(SUBSTR(cReply,55,2))
aInfoŠ 7Ć = ASC(SUBSTR(cReply,57,1))
aInfoŠ 8Ć = ASC(SUBSTR(cReply,58,1))
aInfoŠ 9Ć = ASC(SUBSTR(cReply,59,1))
aInfoŠ10Ć = INT2FOX(SUBSTR(cReply,60,2))
aInfoŠ11Ć = ASC(SUBSTR(cReply,62,1))
aInfoŠ12Ć = ASC(SUBSTR(cReply,63,1))
aInfoŠ13Ć = ASC(SUBSTR(cReply,64,1))
aInfoŠ14Ć = ASC(SUBSTR(cReply,65,1))
aInfoŠ15Ć = ASC(SUBSTR(cReply,66,1))
aInfoŠ16Ć = ASC(SUBSTR(cReply,67,1))
aInfoŠ17Ć = ASC(SUBSTR(cReply,68,1))
is_ok = .T.
ENDIF
RETURN is_ok
baze.podataka.387max.headroom,
* Fox & Novell (11)
*
* Function: N_Down()
* Purpose: Brings down the file server
* Syntax: N_Down( lForceDown )
**********************************
function Down
PARAMETER lForceDown
PRIVATE cRequest,cReply
cRequest = CHR(211)+CHR(IIF(lForceDown,1,0))
cReply = SPACE(2)
return NetWare(227,cRequest,čcReply)
baze.podataka.388max.headroom,
* Fox & Novell (12)
*
* Function: N_ClearCon()
* Purpose: Clear an individual connection
* Syntax: N_ClearCon( nConnect )
**********************************
function N_ClearCon
PARAMETER nConnect
PRIVATE cRequest,cReply
cRequest = CHR(210)+CHR(nConnect)
cReply = SPACE(2)
return NetWare(227,cRequest,čcReply)
baze.podataka.389max.headroom,
* Fox & Novell (13)
*
* Function: N_SetDate()
* Purpose: Sets the server's date and time
* Syntax: N_SetDate( dDate,cTime )
**********************************
function N_SetDate
PARAMETERS dDate,cTime
PRIVATE cRequest,cReply
cRequest = CHR(202)+;
CHR(YEAR(dDate)-1900)+;
CHR(MONTH(dDate))+;
CHR(DAY(dDate))+;
CHR(VAL(SUBSTR(cTime,1,2)))+;
CHR(VAL(SUBSTR(cTime,4,2)))+;
CHR(VAL(SUBSTR(cTime,7,2)))
cReply = SPACE(2)
return NetWare(227,cRequest,čcReply)
baze.podataka.390max.headroom,
───────────────────────────────────────────────
PHDBASE 2.0 LAST-MINUTE NOTES AND INFORMATION
SHAREWARE VERSION
Last Updated October 1991
Korenthal Associates, Inc.
───────────────────────────────────────────────
This file contains last-minute notes and instructions on installing
and using the shareware version of PhDbase 2.0.
We welcome all disk vendors and BBS sysops who wish to distribute the
PhDbase utility, and invite them to refer to VENDOR.DOC and SYSOP.DOC
for complete information relating to them. Individuals who wish to
share the PhDbase utility with their friends and colleagues, or to
upload PhDbase to their favorite BBS's, are also welcome; please see
LICENSE.DOC for details. Sample descriptions of PhDbase suitable for
BBS file listings and vendor catalogs are available in DESCRIBE.DOC.
Please note that there are several separate products called the
PhDbase Developer's Editions which are *NOT* shareware and may
*NOT* be freely distributed. See below for additional information.
Information on registering PhDbase and other KA products can be found
in REGISTER.DOC and PRODUCTS.DOC.
─────────────
Introduction:
─────────────
PhDbase ("Phonetic Database") is a FoxPro 2 add-on utility that finds
names based upon the way they sound, rather than the way they're
spelled. Because PhDbase becomes part of the FoxPro system menu, it's
available for use whenever FoxPro's other menu options are available.
And because it's so easy to use, you can put PhDbase's searching power
to work right away!
PhDbase has two ways of finding names. Quick Search finds names when
they appear at the beginning of a search field (such as "amerikin" in
"American Express"). A typical Quick Search for a misspelled personal
or company name will often return a list of most likely selections in
a 100,000 record database in less than five seconds.
Full Search finds names when they appear anywhere in a search field
(such as "pyureena" in "Ralston Purina"), but it takes longer. How
much longer depends upon the number of records that PhDbase has to
scan. If you can create a FoxPro index on one or more fields in the
database (such as STATE), and provide some information about the
contents of this field in the record you're looking for (such as STATE
= "NY"), even a Full Search in a large database can be performed
fairly rapidly.
Last-Minute Information Page 1 of 4
PhDbase 2.0 README.DOC
─────────────────────────────────
The PhDbase Developer's Editions:
─────────────────────────────────
In addition to the PhDbase utility, there are the PhDbase Developer's
Editions, which allow you to incorporate PhDbase technology into your
own database applications. Through a set of simple function calls
such as PHDFIND, PHDTEST, and PHDFUZZY, you'll be able to closely
integrate PhDbase's powerful search capabilities into your own exist-
ing or new applications using whatever user interface code you prefer.
The PhDbase Developer's Editions are separate products available from
Korenthal Associates. Currently, Developer's Editions are available
for FoxPro 2.0, Clipper Summer '87/5.0, and dBase III Plus/IV, with
other platforms coming soon. Please see PRODUCTS.DOC for information
about ordering the PhDbase Developer's Edition.
───────────────────────────
Printing the Documentation:
───────────────────────────
You may print the PhDbase User's Guide directly by typing:
C>copy phdbase.doc prn
If you have a LaserJet or DeskJet, a better way to print the
documentation files is by using Korenthal Associates' popular laser
printing utility 4Print. 4Print saves paper by printing two or three
fully readable pages of text sideways across the page. By printing on
both sides, 4Print can yield four, six, or even more pages of text on
each sheet! As of version 4.1, 4Print includes a booklet-printing
utility called 4Book which is ideal for printing the PhDbase and other
shareware documentation.
─────────────
Installation:
─────────────
If you are installing PhDbase from a floppy disk, change directories
to your FoxPro directory. Place the PhDbase distribution disk in
drive A: or B: and run the installation program:
C>cd Đfoxpro2
C>a:install OR C>b:install
Alternatively, you may install PhDbase without changing to your FoxPro
directory by specifying the FoxPro path on the install command line.
Note that you *MUST* include the trailing backslash!!! For example:
C>a:install c:Đfoxpro2Đ
Last-Minute Information Page 2 of 4
PhDbase 2.0 README.DOC
If you are installing a version of PhDbase that was compressed for
electronic distribution, you should uncompress all the files into a
temporary directory, make that the current directory, and then run
install, specifying the FoxPro directory (with the trailing back-
slash!) on the install command line (see above). Then you can delete
the files from the temporary directory.
The install program will place the files PHDBASE.APP, PHDBASE.SET,
PHDBASE.HLP, PHDBASE.FPT, and PHSAMPLE.DBF in your FoxPro directory.
In addition, the program will create a subdirectory within your FoxPro
directory called PHDBASE (i.e. C:ĐFOXPRO2ĐPHDBASEĐ) in which it will
store the PhDbase documentation files.
─────────────────────
PhDbase is Shareware:
─────────────────────
The PhDbase utility (not the Developer's Edition) is being marketed as
shareware. Shareware gives users an opportunity to evaluate a program
before buying it. If you like PhDbase and wish to continue using it
beyond a 30-day trial period, you must order the registered version.
You'll receive the full retail package including typeset manual.
Please see the text file REGISTER.DOC for more information about the
benefits of becoming a registered user.
For information about shareware and the Association of Shareware
Professionals (ASP), please see the text file SHR-WARE.DOC.
───────────────────────────
Uploading PhDbase to BBS's:
───────────────────────────
We encourage you to give copies of the shareware version of the
PhDbase utility to your friends and colleagues, and to upload it to
any BBS's that you use. When uploading PhDbase, please use the file
name PHD200.ZIP. For sample descriptions of PhDbase suitable for BBS
file listings, please see DESCRIBE.DOC.
Please note that there are several separate products called the
PhDbase Developer's Editions which are *NOT* shareware and may
*NOT* be freely distributed.
──────────
Thank you!
──────────
The latest versions of all Korenthal Associates shareware products can
always be found in our support forum on CompuServe, PCVENB Section 3,
as well as on The Consultant BBS at 1-718-837-3236. Please feel free
Last-Minute Information Page 3 of 4
PhDbase 2.0 README.DOC
phdbase.arjbaze.podataka.391max.headroom,
AD HOC FOXRPT WRITER MODULE
Ad Hoc FOXRPT Writer requires very little from the user
beyond pointing at a desired action and hitting the ENTER key.
It was designed this way from the start.
Reports and mail label definitions created with FOXRPT Writer
can be saved, edited, and rerun at will. All output can be
sent to the printer, screen, or to a disk file. Custom indexes
can be built from within FOXRPT for your report and label runs.
Theses index files can be created with conditional expressions
through the use of a very powerful online Query builder.
( ** VERY IMPORTANT ** ) FOXPRO 2.0 COMPATIBILITY
FOXRPT Writer is completely compatible with Foxpro 2.0
DBF and FPT files. The present version is ONLY COMPATIBLE WITH
Foxpro 2.0 COMPACT .IDX and COMPACT structural .CDX files!
You can create these index files with Foxpro 2.0 with the following
syntax:
.IDX - INDEX ON <field> TO <index file name> COMPACT
.CDX - INDEX ON <field> TAG <tag name> COMPACT
FOXRPT Writer creates these COMPACT indexes by DEFAULT with its
Index Builder module!
The LOG_USEIDX field in the configuration database FOXRPT.DBF will
determine whether FOXRPT.EXE will use COMPACT .IDX or COMPACT structural
.CDX index files. IF LOG_USEIDX is set to .T. COMPACT .IDX indexes are
used. IF LOG_USEIDX is set to .F. COMPACT structural indexes are used.
Report definitions created while using COMPACT .IDX files will have the
"RPI" extension. Report definitions created using COMPACT structural
indexes will have the "RPC" extension. FOXRPT automatically displays the
correct report definitions for selection. FOXRPT will also correctly
diplay either .IDX files or structural index file TAG information during
the index selection phase of report creation. Both types of indexes for
the same files may reside in the same directory. Both types of report
definitions may reside or be created in the same directory. You only
have to remember one thing:
USE ONLY COMPACT INDEXES WITH THIS PROGRAM!
USE ONLY COMPACT INDEXES WITH THIS PROGRAM!
USE ONLY COMPACT INDEXES WITH THIS PROGRAM!
ENVIRONMENT VARIABLE
FOXRPT Writer is written in Clipper 5.01. Since Clipper will
use expanded memory for indexing purposes it is standard practice to
include the following statment in your AUTOEXEC.BAT file if you should
experience corrupt indexes:
SET CLIPPER=E:0
(or) SET CLIPPER=//E:0
Unlikely index corruption of this sort can occur with incompatible
expanded memory managers. This should alleviate any problems with
expanded memory you might encounter.
*-------------------------------------------------------------------*
MAIN MENU
*-------------------------------------------------------------------*
CREATING A REPORT DEFINITION FOR THE FIRST TIME
Ad Hoc Report Writer creates three distinct types of reports.
A single file report uses just one primary file. A relational report
type one uses both a primary and secondary file. There is one record
in the secondary file for each primary record. A relational report
type two uses both a primary and secondary file. There are multiple
secondary records for each primary record. Your data detemines which
type of report you will need to create.
Creating a report is essentially the same process for all report
types. First, the report type is chosen and then report parameters
are entered. You can control things like the left margin, spaces
between printed fields on the report, page width, page length, etc.
The only parameter that may be confusing to the you is the subtotal
parameter.
Say, for example, you have a file of customer purchases like
ORDER.DBF. It is indexed on customer number and you are trying to
total the purchases for each customer and want a grand total of all
purchases. If you choose the subtotal option on the report parameter
screen Ad Hoc Report Writer will print and sum all of the purchases
for customer 100, display a subtotal, space, and then begin printing
and summing the purchases by customer 200 and so forth. Create a
single file report for ORDER.DBF with the subtotal option. Total the
QTY and SELL fields for practice. The subtotal option's use will then
become clear.
You choose your primary and secondary files from a scolling list.
You choose the fields you wish to include in the report from scrolling
lists. Nothing could be easier! Just remember the following:
1. A MAXIUM OF 27 FIELDS FROM EACH FILE MAY BE USED IN THE REPORT.
2. THREE CALCULATED FIELDS MAY BE DEFINED PER FILE.
3. MEMO FIELD PROCESSING IS LIMITED TO ONE MEMO FIELD IN A SINGLE FILE
REPORT.
4. FIELDS APPEAR ON THE PRINTED REPORT IN THE ORDER IN WHICH THEY WERE
SELECTED.
5. IF YOU DO NOT ENTER A COLUMN HEADING FOR A FIELD THE FIELD NAME WILL
BE USED AS A COLUMN HEADING ON THE REPORT.
6. IF YOU ARE USING TOTALS, SUBTOTALS, AND/OR CALCULATED FIELDS EXPECT
YOUR REPORT TO BE WIDER THAN THE WIDTH OF THE SELECTED FIELDS ALONE.
EXTRA SPACE IS ALLOCATED TO A FIELD BEING TOTALLED AND TO A CALC
FIELD BEYOND THAT WHICH IS DISPLAYED BY THE FIELD SELECTION SCREEN.
7. WHEN CREATING RELATIONAL REPORTS OR WHEN SELECTING THE SUBTOTAL
OPTION BE CERTAIN TO SELECT KEY FIELD OF PRIMARY FILE AS FIRST
PRIMARY FIELD SELECTED! (** Very Important **)
8. PRIMARY & SECONDARY FILE KEYS MUST BE COMPATIBLE WHEN CREATING
RELATIONAL REPORTS. (** Very Important **)
9. ALL OUTPUT CAN BE STOPPED WITH THE ESC KEY IF YOU DESIRE.
EXECUTING A REPORT DEFINITION
Simply select the report definition from the scrolling list by
striking enter. You will have an opportunity to edit the report
parameters you entered when you created it. You can also edit or
create a query for the report and save it under the same or differ-
ent name. Output for all reports can go to the printer, screen, or
to a disk file.
*-------------------------------------------------------------------*
MAIL LABELS
*-------------------------------------------------------------------*
CREATING A MAIL LABEL DEFINITION FOR THE FIRST TIME
Ad Hoc Report Writer permits the creation of standard, large,
or cheshire format mailing labels. Simply take the Mailing Label
Print option from the Main Menu. You will be asked to choose a
primary file and primary file index. Next you will be given the
opportunity to query the primary file if you desire. In this manner
you can select to filter out certain zipcodes or cities according to
your preferences and needs.
You will then enter the label module. Choose the create option from
within the label module. Assign the label file a unique and meaningful
name. Select the modify contents option. Press F2 to choose field names
for each line of the label you wish to create. BE SURE TO PLACE THE
CURSOR AT THE BEGINNING OF THE LINE TO WHICH YOU ARE APPENDING FIELD
NAMES! Follow the prompts and press F10 when you are done. Be sure to
choose the proper format and dimensions from within the dimensions
selection.
By experimenting with the other options you'll find that you can
tag select records and print only them if you choose. You can now print
your mail labels and recall the new label definition you've just created
whenever you wish. Just remember the following:
1. Be certain to choose the proper format and dimension from within
the dimension option. You can make adjustments to the default
sizes as you wish. Maximum label size is 24 X 60.
2. Create index files keyed on the fields by which you want to order
your label printout. If you want labels to be printed in zipcode
order then be sure to create an index file keyed on zipcode etc.
3. Make use of the test pattern and correct your alignment before
beginning a large label run. (** Very Important **)
4. Make use of the query builder to select or filter your primary
file when printing labels if you don't wish to create a label for
every record in your file.
5. You can pause printer output with ALT-C if your label run jams in
the printer. It's not the most sophisticated way to do so, but
it certainly works. ESCAPE will ABORT a label printout.
6. A sample label definition (MAIL.LBL) is provided on your diskette.
You can experiment with changes and printing by selecting it. First
you select the Process Mailing Labels option from the Main Menu.
Then select MAIL.DBF and MAIL.IDX as your primary file and index.
7. The copies parameter will determine how many labels for each record
are printed.
8. The blank lines parameter will control the printing of blank lines
in your label definition. Blank lines can be useful for spacers
when printing large labels.
9. If you build a new label or edit an existing one and utilize the
automatic field name selector, be sure to place the cursor at the
BEGINNING of the line you are appending field names to! Experiment
with this and you'll see why!
CREATE A NEW INDEX FILE
( ** VERY IMPORTANT ** )
FOXRPT Writer is compatible with Foxpro 2.0 .IDX COMPACT INDEXES ONLY!
Simply select this option from the Main Menu. Select a primary file.
Then select the field(s) you wish to index on. If you wish to enter a
conditional expression for your new index you may do so at this time with
the use of the powerful online query builder. If you build a query such
as LAST # "ADAMS" .AND. AMOUNT # 500 your new index will only contain
records that meet these criteria. The last step in creating a new index
is giving the new index file a name. That's all! The FOXRPT Writer
does the rest!
( ** VERY IMPORTANT ** )
1. FOXRPT converts numeric and date fields to character values when
you build an index with them. FOXRPT ensures the proper ordering of
values in this manner. Character indexes are completely compatible and
need not be rebuilt. This conversion of numeric & date fields to string
values is standard practice and enables you to build compound keys with
mixed data types. These indexes are not backwards compatible with Foxpro,
but it is a simple procedure to rebuild an index file using Foxpro if you
must for reasons of compatiblity with other programs which access your data
files.
CHANGE THE DIRECTORY
This option enables you to select any directory on your disk
in which you you might have database files. FOXRPT will ask you
which directory you'd like to enter. Enter the name. If you make
a spelling error FOXRPT will report that it is not possible to
enter the directory you keyed in.
** END OF FILE ***
foxrpt.arjbaze.podataka.392max.headroom,
E X E - Q - T E R D O C U M E N T A T I O N
Welcome to Exe-Q-Ter, Exe-Krypter, & Exe-Q-Ter Install. The purpose of
Exe-Q-Ter and the accompanying files is to allow all users and developers of
FoxBase+, FoxPro 1.02, and FoxPro 2.0 the alternative of creating DOS
executable files for their respective FoxBase/FoxPro versions, with the added
capability of password and/or password/encryption protection for their
applications, databases, and memo fields. It is not the intention of Exe-Q-Ter
to imply, either directly or indirectly, that non-registered users of
FoxBase/FoxPro Runtime or FoxPro 2.0 Distribution Kit, should dismiss the laws
of copyright and trademark regulations concerning the distribution of
FoxBase/FoxPro applications. On the contrary, you should know that it is
UNLAWFUL to distribute FoxBase/FoxPro applications unless you are in fact a
registered owner of either the Runtime or Distribution Kit. You may contact
Fox Software, Inc. or a legitimate distributor of Fox products to obtain either
of the above. Any known infringement of the above will be reported to Fox
Software at once.
exeqter.arjbaze.podataka.393max.headroom,
TSR (ali nije TSR ;) clock u Fox-u. Obratiti padžnju i na onaj
drugi .BIN fajl, pored TPCCLOCK.BIN...
SYNTAX: LOAD TPCCLOCK
MEMVAR = "PARAM"
CALL TPCCLOCK WITH MEMVAR
NOTE: These are the valid parameters for use with TPCCLOCK.BIN
MEMVAR = "O" && TURN THE CLOCK ON
MEMVAR = "F" && TURN THE CLOCK OFF
MEMVAR = "/F0" && 24 HOUR DISPLAY
MEMVAR = "/F1" && 12 HOUR DISPLAY
MEMVAR = "/č X,Y" && DISPLAY CLOCK AT ROW,COL
WARNING: This version of TPCClock.BIN requires all params be entered
in UPPER case. When I get more time I will fix this.
WARNING: You MUST be sure to turn the clock OFF before exiting your
database program!! Failing to do this WILL result in
hanging your system. (I suggest using "ON ERROR" to turn
the clock off in case of an error, before "QUIT"ing.)
tpcclo.arjbaze.podataka.394oki.,
>> executable files for their respective FoxBase/FoxPro versions, with the
>> added capability of password and/or password/encryption protection
>> for their applications, databases, and memo fields. It is not the
>> intention of Exe-Q-Ter
Simpatičan program, al' beskoristan. Program napravi mali(?) EXE fajl
koji startuje FOX i odgovarajuću aplikaciju. Glavni fazon je da omogućuje
da se aplikacija kriptuje pa je zaštićena od eventualnih izmena. Međutim,
zaštita je nikakva. Evo kako se razbija. Startujete WIN i zatim odete u
DOS. Tu startujte program i kada počne izvršavanje programa vratite se u
win i sa fajl menadžerom iskopirajte aplikaciju na neko drugo mesto.
Kopirana aplikacija je enkriptovana. Dakle, zaštita ne služi, skoro,
ničemu. Ovo se može poturiti nekome ko ne zna ili nema WIN (ili sličan
multitasking) ;). Ovo me je baš razočaralo. :(
Pozdrav, 3OPAH.
baze.podataka.395bulaja,
│Startujete WIN i zatim odete u DOS. Tu startujte program i kada počne
│izvršavanje programa vratite se u win i sa fajl menadžerom iskopirajte
│aplikaciju na neko drugo mesto.
└───
Može i jednostavnije (ako sam dobro shvatio princip rada programa) -
kada se apilkacija startuje, samo resetovati računar i posle toga bi
trebalo na disku da ostane nekripotovana kopija programa :).
baze.podataka.396ndragan,
/ napraviti procedura za proveru postojanja CDX fajla iz hedera DBF
/ fajla. U
Nalazi se na 28. bajtu (brojeći od nultog) u hederu .dbf fajla:
0 nema cdx
1 ima cdx.
29. bajt sadrži šifru kodne stranice za koju je baza prijavljena. Zasad
sam provalio da je 100 (tj 0x064) za 852 i 0x0c8 za 1250 (tj windows
ee).
Gnjavio sam se sa tim dobrih pola sata :)
/ - proverio bi ispravnost strukture DBF fajla, memo i CDX fajla
U poslednjoj verziji svog (generatora) programa za indeksiranje
forsirano upisujem nulu na 28 bajt, zatim brišem .cdx te tek onda
otvaram bazu (ovog puta se ne buni što nema .cdx, jer mu već piše da ga
nikad nije ni imao :) i indeksiram.
Ako me ne pusti da otvorim bazu za lele, i/o tj fopen(baza,12) vrati -1,
zaključujem da je neko već otvorio i samo javim da nema ništa od
indeksiranja ovog puta.
baze.podataka.397ndragan,
/ p.s. Jel' neko uspeo da skreše veličinu .FRX datoteka - t.j. da izbaci
Mislim da on interno proverava da li ima dovoljan broj polja (ne
proverava baš celu strukturu), pa ako petljaš sa strukturom, probaj da
bar pretvoriš neka memo polja u c(1), mada nisam siguran da će i tako
raditi.
Inače, mislim da možeš ladno da izbrišeš slogove gde Platform # "DOS", a
i da izmisliš neke slogove sa levom platformom - on samo čita one koje
hoće, a ostale ni ne gleda. Wizardi upravo prave neke svoje slogove -
pogledaj šta piše u platformi.
baze.podataka.398ndragan,
/ AFiles_Š1Ć = "EMPLOYEE; F:ĐAPPĐEMPLOYEE ; EMP_INIT,EMP_NAME"
=======
Ovo mi se baš nešto ne sviđa - navođenje konjkretnih direktorija baš
nije zdrava praksa. Preseliš se na drugi disk, drugu mrežu... i sve to
treba menjati.
baze.podataka.399oki.,
>> Može i jednostavnije (ako sam dobro shvatio princip rada programa) -
>> kada se apilkacija startuje, samo resetovati računar i posle toga bi
Da, al' cini mi se da je ovako elegantnije, da ne bi neke datoteke ostale
otvorene i sl.).
Pozdrav, 3OPAH.
baze.podataka.400max.headroom,
> Ovo mi se baš nešto ne sviđa - navođenje konjkretnih
> direktorija baš nije zdrava praksa. Preseliš se na drugi
> disk, drugu mrežu... i sve to treba menjati.
Slažem se - ali to beše "po Booth-u i Lief-u", a oni važe za tipove
koji drže silne seminare po USA (u pitanju je FoxPro, naravo) :)
Ma razume se, poenta njihove literature je: poseti ti lepo naš kurs
Fox-a, pa onda izvodi zaključke. Fušerski, ali pretpostavljam da ima
efekta.
baze.podataka.401bulaja,
U priloženoj datoteci su informacije o Xbase/2 - CA-Clipper
kompatibilnom (bar tako kažu) kompajleru za OS/2. Tekst je
na nemačkom tako da ja uglavnom ništa ne razumem :), pa bi
neko ko zna nemački a interesuje ga ova problematika mogao
lepo da pročita tekst i prepriča nam šta ima unutra :).
xbase2.zipbaze.podataka.402misa.m,
Jedno pitanje za Fox4Win.
Da li je i kako moguće otvori DDE kanal ka drugoj
fox ili bilo kojoj windows aplikaciji koja je startovana
na drugoj mašini (u W4WG)? DDE lepo radi na lokalnoj
mašini ali mi nikako ne uspeva da inicijalizujem vezu
ka aplikaciji na drugoj mašini.
Rekao bih da MSHerc upravo koristi DDE.
baze.podataka.403ikordic,
RE: dBase V for Windows
Par komentara u vezi teksta dejanr-a o dBase V paketu. Naime, neki delovi
teksta su ličili na otkrivanje tople vode. Ako izuzememo grafičku okolinu i
Win-related kerefeke, deo opisanih "noviteta" je postojao i u dBase IV, koji
je kod nas prošao potpuno nezapaženo. žak i sam autor teksta kaže "... to je
razlika između 27.12.'85. kada je izašao dBase III+ i 2.8.'94. kada je
izašao dBase V", kao da međuverzija nije ni postojala! Posle mene i potop
... ;)
Dalje, nisam baš siguran da je iznenađenje što DB5 radi brže od Clipper-a.
Testiranje je vršeno na 486 mašini sa puno memorije, čije performanse DB5
koristi do maksimuma, a siroti mali hrčak, pardon Clipper, ne. Pod ovim
uslovima, mislim da je za sablažnjavanje ako je efekat suprotan.
Zatim, da li je sasvim sigurno da ne postoji Run-Time distribucioni paket?
Ovo je postojalo za dBase IV, postoji i za konkurekciju (Fox), ne vidim što
ovo ne bi izbačili na gladno tržište. Koliko se sećam, odmah posle promocije
poslednje verzije (IV) u cenovnicima su se paralelno pojavili i dBase IV i
dBase IV Prof. Edition sa Run-Time modulom.
Takođe smatram propustom što u tekstu nije obavljen neki osvrt na neposrednu
konkurenciju (Fox, Access, možda i Pdx), uzevši u obzir zastupljenost, kao i
činjenicu da je bilo prepisivanja sa obe strane.
baze.podataka.404mdrazic,
>> Ovo mi se baš nešto ne sviđa - navođenje konjkretnih
>> direktorija baš nije zdrava praksa. Preseliš se na drugi
>> disk, drugu mrežu... i sve to treba menjati.
>
> Slažem se - ali to beše "po Booth-u i Lief-u", a oni važe za tipove
> koji drže silne seminare po USA (u pitanju je FoxPro, naravo) :)
Vrlo zadovoljavajuće rešenje po pitanju promene diska je da NE navodiš
naziv diska veš samo path (npr. ĐappĐbazeĐ ). Tada sve u aplikaciji
mora biti na jednom disku na kojem se trenutno nalaziš, što i nije
neko ograničenje, ali te spasava problema oko raznih particija i
mrežnih naziva diskova. Takođe 'koreni' direktorijum za tvoju
aplikaciju ( ĐappĐ ) možeš definisati preko dos environmenta ili
nekog konfiguracionog fajla, pa da izbegneš i probleme oko raznih
mapiranja u mreži.
Milan
baze.podataka.405max.headroom,
Evo jedne zanimljive poruke sa SETNet-a - tiče se relacionih
baza podataka posmatranih sa teorijskog stanovišta. Ako vam se
poruka učini interesantnom, skinite i vezani fajl (SETNET.ARJ),
u kome ćete naći deo rasprave o navedenoj problematici.
--------------------------------- ■ NET.Base
#767
Datum: 28-08-94 22:52
Od: Goran Turudich
Za: Predrag Supurovic
Odgovor: Relacione baze podataka
#780 ->
...<Text Cut>...
Pocecu sa osnovama. Trebalo bi prvo da uskladimo terminologiju, da bi
se bolje razumeli.
DEF1:
Relacija R duzine n je (matematicka definicija) skup uredjenih n-torki
R(a1, a2, a3,...,an) gde su a1, a2, ... , an clanovi skupova A1, A2, ... ,
An respektivno. Relacija R je podskup dekartovog proizvoda ovih skupova
(A1*A2*...*An). Clanovi a1, a2, ... , an se nazivaju "atributi", a
skupovi A1, A2, ... , An su "domeni". Relacija ima osobinu da u njoj ne
postoje dve iste n-torke! Dakle, da bi se n-torke razlikovale, u relaciji
mora postojati atribut ili kombinacija atributa koja ce igrati ulogu
jedinstvenog identifikatora. Ovaj identifikator se zove primarni kljuc.
NPR: relacija STUDENT je sledeceg oblika:
STUDENT (BRINDEKSA#, IME, DATUMRODJENJA, ADRESA, SIFRASMERA, ...)
Atribut BROJINDEKSA# ima znak "#" na svom kraju da bi se oznacilo da je
on primarni kljuc relacije (nepisano pravilo).
DEF2:
Primarni kljuc (primary key) je atribut (prost ili slozen) koji u
relaciji R ima osobine:
1. Jedinstvenosti - vrednost ovog atributa se pojavljuje samo u jednoj
n-torki relacije R.
2. Neredundantnosti - nijedan deo kljuca ne moze da se izostavi, a da se
ne izgubi osobina jedinstvenosti. NPR: slozeni atribut BRINDEKSA, IME
nije kljuc relacije, jer se IME moze izostaviti, a atribut BRINDEKSA ce
ipak imati osobinu jedinstvenosti. Dakle, primarni kljuc relacije je
minimalna kombinacija atributa koja ima osobinu jedinstvenosti.
U relaciji R moze postojati vise atributa koji imaju navedene osobine i
svi oni su "kandidati za kljuc". Posto u relaciji moze postojati samo
jedan primarni kljuc, onda se od njih bira jedan atribut koji ce biti
primarni kljuc, a ostali kandidati za kljuc se nazivaju "alternativni
kljucevi".
U prethodno pomenutoj relaciji STUDENT, primarni kljuc je atribut
BROJINDEKSA# jer on jedinstveno odredjuje n-toku relacije (ne postoje dva
studenta sa istim brojem indeksa).
DEF2:
Spoljni kljuc (foreign key) je atribut (prost ili slozen) koji u
relaciji R nije primarni kljuc, ali je primarni kljuc u nekoj drugoj
relaciji u modelu. Spoljni kljucevi sluze za povezivanje relacija!
NPR, u relaciji STUDENT, atribut SIFRASMERA nije primarni kljuc, ali
jeste u relaciji SMER: SMER (SIFRASMERA#, NAZIVSMERA, ...). Ovaj atribut u
relaciji STUDENT, znaci, igra ulogu spoljnog kljuca, preko koga se
povezuju relacije STUDENT i SMER (zbog, npr, kreiranja izvestaja o
studentima i smerovima na kojima studiraju).
Cesto se gore pomenuti pojmovi i drugacije nazivaju. Cesto se, npr,
umesto RELACIJA kaze TABELA, jer se svaka relacija moze predstaviti
tabelom. Ali, treba paziti - svaka relacija je tabela, ali svaka tabela ne
mora biti relacija! Takodje, cesto se umesto ATRIBUT kaze POLJE, a umesto
N-TORKA RELACIJE - RED TABELE ili ZAPIS (zbog analogije relacije i
datoteke u konvencionalnoj obradi podataka).
Relaciona baza podataka je skup vremenski promenljivih relacija
(tabela), i ne moze se poistovecivati sa jednom datotekom u
konvencionalnoj obradi podataka. Dakle, ako neko napise aplikaciju za
citanje i azuriranje telefonskog imenika on NIJE napisao bazu podataka,
vec aplikaciju sa svojom privatnom datotekom u koju se podaci smestaju.
Osim toga, baze podataka se NE PISU vec kreiraju, unistavaju, pretrazuju,
azuriraju, a pisu se aplikacije za pretrazivanje, kreiranje, azuriranje
baze podataka.
---------------------End of Message
setnet.arjbaze.podataka.406max.headroom,
Evo skupa interesantnih BIN fajlova, sve raznorazne funkcijice za
rad sa svim i svačim (modemom, na primer). Sledi lista prisutnih:
BIOSDATE ........... Page 35
CAPSOFF ............ Page 66
CAPSON ............. Page 69
CAPSSTAT ........... Page 60
CDROMDRV ........... Page 98
CDROMVER ........... Page 99
COM1200 ............ Page 74
COM2400 ............ Page 75
COM300 ............. Page 73
COM4800 ............ Page 76
COM9600 ............ Page 77
COMBID ............. Page 83
COMDR .............. Page 79
COMFE .............. Page 82
COMOE .............. Page 80
COMPE .............. Page 81
COMSTAT ............ Page 78
COMTHR ............. Page 84
COMTOE ............. Page 86
COMTSR ............. Page 85
CONVMEM ............ Page 36
CREATDIR ........... Page 23
CURSCOL ............ Page 100
CURSOR ............. Page 102
CURSROW ............ Page 101
DAYWEEK ............ Page 103
DOSVERS ............ Page 24
DRIVERDY ........... Page 25
EXTMEM ............. Page 37
GAMEADAP ........... Page 38
GETATTR ............ Page 27
GETDRIVE ........... Page 26
GETVERFY ........... Page 28
INSSTAT ............ Page 61
LEFTSHFT ........... Page 62
LPTINIT ............ Page 87
LPTSTAT ............ Page 88
MATHCOPR ........... Page 39
MCA ................ Page 40
MODMCTS ............ Page 93
MODMDCTS ........... Page 89
MODMDDSR ........... Page 90
MODMDRLS ........... Page 92
MODMDSR ............ Page 94
MODMRI ............. Page 95
MODMRLS ............ Page 96
MODMTER ............ Page 91
MOUSECTR ........... Page 104
MOUSEDRV ........... Page 105
MOUSEHID ........... Page 106
MOUSELFT ........... Page 107
MOUSELNG ........... Page 108
MOUSERHT ........... Page 109
MOUSESHW ........... Page 110
MOUSETYP ........... Page 111
MOUSEVER ........... Page 112
NODRIVES ........... Page 41
NUMCHAR ............ Page 113
NUMOFF ............. Page 67
NUMON .............. Page 70
NUMSTAT ............ Page 63
PARALLEL ........... Page 55
PC ................. Page 43
PCAT ............... Page 45
PCBUS .............. Page 42
PCCONV ............. Page 48
PCJR ............... Page 46
PCXT ............... Page 44
PCXT286 ............ Page 47
PRNTSCRN ........... Page 114
PS2M30 ............. Page 49
PS2M50 ............. Page 50
PS2M55 ............. Page 51
PS2M60 ............. Page 52
PS2M70 ............. Page 53
PS2M80 ............. Page 54
REALTIME ........... Page 56
REMOVDIR ........... Page 29
RGHTSHFT ........... Page 64
SCRLOFF ............ Page 68
SCRLON ............. Page 71
SCRLSTAT ........... Page 65
SCRNSIZE ........... Page 57
SERIAL ............. Page 58
SETATTR ............ Page 32
SETDIR ............. Page 30
SETDRIVE ........... Page 31
SETVERFY ........... Page 33
XMSDRV ............. Page 115
foxlib.arjbaze.podataka.407dejanr,
>> Ako izuzememo grafičku okolinu i Win-related kerefeke, deo opisanih
>> "noviteta" je postojao i u dBase IV, koji je kod nas prošao potpuno
>> nezapaženo. žak i sam autor teksta kaže "... to je razlika između
>> 27.12.'85. kada je izašao dBase III+ i 2.8.'94. kada je izašao dBase
>> V", kao da međuverzija nije ni postojala! Posle mene i potop ... ;)
To je razlika između domaćeg prikaza i nekog prikaza koji bi bio preveden
iz stranog časopisa. Program se poredi sa nečim što je ovde dobro poznato,
primetićeš da je dBASE IV pominjan tamo gde je to bilo relevantno (npr.
specifikacije, dužine polja, imena polja itd). Glavnina poređenja je sa
baterijom dBASE III+/Clipper koja je ovde apsolutno preovlađujuća.
>> Dalje, nisam baš siguran da je iznenađenje što DB5 radi brže od Clipper-a.
>> Testiranje je vršeno na 486 mašini sa puno memorije, čije performanse DB5
>> koristi do maksimuma, a siroti mali hrčak, pardon Clipper, ne. Pod ovim
>> uslovima, mislim da je za sablažnjavanje ako je efekat suprotan.
Pa, to je otprilike i rečeno u tekstu - ubrzanje potiče od internog keširanja.
Međutim, uvek je iznenađenje (bar za mene) kada neki DOS program radi sporije
od "odgovarajućeg" Windows programa. Daj Bože da se taj trend promeni.
>> Zatim, da li je sasvim sigurno da ne postoji Run-Time distribucioni
>> paket? Ovo je postojalo za dBase IV, postoji i za konkurekciju (Fox),
>> ne vidim što ovo ne bi izbačili na gladno tržište.
U trenutku pisanja teksta nije postojao. U dokumentaciji se nigde ne
referencija. U PC Magazine-u od ne-znam-kog oktobra, u kome se reklamira
dBASE 5.0, ne reklamira se run time paket. PC Magazine od 1. novembra još
nisam video (mada bi trebalo da je izašao).
>> Takođe smatram propustom što u tekstu nije obavljen neki osvrt na
>> neposrednu konkurenciju (Fox, Access, možda i Pdx), uzevši u obzir
>> zastupljenost, kao i činjenicu da je bilo prepisivanja sa obe strane.
Uporedni test je ozbiljna stvar. "Računari" će verovatno u sledećem broju
objaviti prikaz paketa Access 2.0, u onim sledećim FoxPro-a 2.6 (mada tu,
izgleda, nema nekih spektakularnih noviteta), za Paradox ćemo videti, a
posle toga je moguć neki uporedni test.
baze.podataka.408eotek,
> U prilozenoj datoteci su informacije o Xbase/2 - CA-Clipper
> kompatibilnom (bar tako kazu) kompajleru za OS/2. Tekst je
sadrzaj: dva fajla, od toga jedan upitnik za potencijalne
beta-testere i drugi "White Paper" koji objasnjava projekt.
Radi se, dakle, o projektu koji je u toku, sa ciljem da se
izradi kompajler koji bi na nivou koda bio 100 % kompatibilan sa
Clipper 5.01, a trebao bi da sadrzi sve mogucnosti 32 bitnog
okruzenja, objekte itd. Projekt je zapoceo sa radom avgusta 1994,
prema tome, po meni - sacekati i videti.
Beta testeri bi dobili posebne popuste prilikom nabavke
kompajlera (kada bude gotov), a beta program bi se realizovao
preko CompuServe, forum OSUGER.
baze.podataka.409ndragan,
/ SYNTAX: LOAD TPCCLOCK
Ubiše čoveka u pojam. Kad je ovo pisao, kanda još nije bilo onog
set hours to 12 (24)
set clock to x,y
set clock on (off)
u samom foksu. Al' sad kad ima, ne znam čemu ovo.
baze.podataka.410isimic,
Ima li neko literaturu za FoxPro 2.6 Library Construction Kit? Ili, kako
se od C programa prave biblioteke za FoxPro 2.6?
Pozdrav!
baze.podataka.411oki.,
>> u samom foksu. Al' sad kad ima, ne znam čemu ovo.
Valjda je za stari Fox (Base)?
baze.podataka.412dpredovic,
Već dosta dugo se bakćem sa clipperom, i kada sam nedavno pogledao fox,
neke stvari mi ne leže baš najbolje...
U mojoj koncepciji pod clipperom osnovni način prikazivanja podataka je
browse, koji je maximalno fleksibilan, služi i za pregled, unos,
brisanje, pretraživanje, menjanje ordera, etc. etc.
Ono što sam video u foxu je sve samo ne fleksibilno, ali pretpostavljam
da postoje fore i fazoni da se ta krutost malo zaobiđe.
Kao 1. - jel postoji neki način da ugasim kursor u browsu (hoću da mi
služi samo za pregled). SET CURSOR OFF se pravi mnogo pametan, pa se
pali i gasi kako se njemu dopada...
Kao 2. - jel postoji još neki način da osvežim browse iz on key... kada
promenim nesto u redosledu baze, a da to nije:
ON KEY LABEL <somekey> DO someproc
internal=.T.
DO WHILE internal
internal=.F.
BROWSE ...
ENDDO
PROC someproc
internal=.T.
...
something_nasty_to_do_with_base_ordering
...
KEYBOARD "CTRL+END"
RETURN
Padalo mi je napamet neko zezanje sa refresh, ali nisam uspeo da izvedem
nista mnogo pametno...
baze.podataka.413misa.m,
>> Ima li neko literaturu za FoxPro 2.6 Library Construction Kit?
Imam za 2.5 i koliko znam iste su.
baze.podataka.414max.headroom,
> Ubiše čoveka u pojam. Kad je ovo pisao, kanda još nije
> bilo onog
>
> set hours to 12 (24)
Becveze. Sada sam tek ukapirao šta sam spustio. Nije bitno, ovih dana
imam dosta sitnih programčića na raspolaganju, pa me stigne haos pri
bacanju nepotrebnog i UL-u kakvo-takvog softvera. Izvinjenje onima
koji su skidali, a svaka čas' onima kojima je ovo koristilo :)
Nego, jedan blesavi problem u Fox-u for Win:
Hteo bih da svako GET polje uokvirim sa još jednim okvirom, dakle, oko
onog koji je kreiran sa SET READBORDER. Dobija se interesantan efekat
dubine, ako parove naspramnih stranica obojite sa
RGB(256,256,256,256,256,256) i RGB(128,128,128,128,128,128)
Elem, šta je suština - htedoh da napravim f-ju koja će ovo raditi, s
tim da kao parametre zadam x-koord, y-koord. i dužinu GET polja, pa bi
program izgledao ovako:
x = SPACE(20)
č 10,5 GET x
=OKVIR(10,5,20)
Ali... Pošto je sve relativno u odnosu na font koji se koristi (moj
slučaj: Arial, 8 pts), meni treba nekakva vrsta ofseta kojim ću
množiti tamo-neke-koordinate i tako dobijati "od-do" vrednosti za
linije tog mog okvira. Zna li neko ofsete (vertikalne i horizontalne)?
(ja dobih 0.8 kao horiz. offset, ali to nije dovoljno precizno - fale
još dve decimale :)
baze.podataka.415djelovic,
> Ali... Pošto je sve relativno u odnosu na font koji se koristi (moj
> slučaj: Arial, 8 pts), meni treba nekakva vrsta ofseta kojim ću
> množiti tamo-neke-koordinate i tako dobijati "od-do" vrednosti za
> linije tog mog okvira. Zna li neko ofsete (vertikalne i horizontalne)?
Dialog Box Measurements
Every dialog box template contains measurements that specify the position,
width, and height of the dialog box and the controls it contains. These
measurements are device independent, so an application can use a single
template to create the same dialog box for all types of display devices.
This ensures that a dialog box will have the same proportions and appearance on
all screens despite differing resolutions and aspect ratios between screens.
Dialog box measurements are given in dialog base units. One horizontal unit is
equal to one-fourth of the average character width for the system font. One
vertical unit is equal to one-eighth of the average character height for the
system font. An application can retrieve the number of pixels per base unit for
the current display by using the GetDialogBaseUnits function. An application
can convert measurements from dialog base units to pixels by using the
MapDialogRect function.
The template must specify the initial coordinates of the upper left corner of
the dialog box. Usually the coordinates are relative to the upper left corner
of the owner window's client area. When the template specifies the DS_ABSALIGN
style or the dialog box has no owner, the position is relative to the upper
left corner of the screen. Windows sets this initial position when it creates
the dialog box, but permits an application to adjust the position before
displaying the dialog box. For example, an application can retrieve the
dimensions of the owner window, calculate a new position that centers the
dialog box in the owner window, then set the position by using the SetWindowPos
function. The template should specify a dialog box width and height that does
not exceed the width and height of the screen and ensures that all controls and
are within the client area of the dialog box. Although Windows permits a dialog
box to be any size, creating one that is too small or too large can prevent
the user from providing input, defeating the purpose of the dialog box. Many
applications use more than one dialog box when there are a large number of
controls. In such cases, the initial dialog box usually contains one or more
push buttons that the user can click to display the next dialog box.
[From the Microsoft(R) Windows(tm) API]
baze.podataka.416moebius,
Pretpostavljam da ovo svi vec znaju, sem mene..
Kako izgleda .DBF na disku?
Hteo bih da napisem C rutine za otvaranje .DBF
pa mi treba opis formata.
Ajde budite dobri, pomozite..
Dragan
baze.podataka.417ndragan,
/ naziv diska veš samo path (npr. ĐappĐbazeĐ ). Tada sve u aplikaciji
Ili još lepše, spakuješ imena direktorija u par javnih promenljivih,
koje definišeš u nekom init programu, pa prilikom selidbe samo to
promeniš.
baze.podataka.418gaston,
>>>Bre! :) Zasto jednostavno ne napravite dve baze, jednu sa indeksima i jednu
>>>bez, pa uradite compare? Tako cete najbrze otkriti u kom zecu lezi grm.
Ozbiljno:
Zahvaljujem djelovic-u na sugestiji o nacinu kako pronaci mesto u FOX DBF-u
gde se belezi informacija o tome da li baza ima CDX ili ne.
Konkretno:
Komparirao sam dve baze, jednu bez CDX i drugu sa njim i otkrio da je oznaka
na 29-om bajtu od pocetka DBF fajla (odnosno zaglavlja).
Kao dokaz prilazem programce za proveru:
procedure CheckCDX
* Proverava treba li DBF da ima CDX fajl ISKLJUCIVO na osnovu
* oznaka u zaglavlju DBF fajla
*
public zagl, name_dbf
************* 1. SLUCAJ: DBF BEZ CDX
* kreiranje DBF fajla sa jednim poljem, bez CDX
name_dbf = "bez_cdx.dbf"
create table (name_dbf) (polje1 N(10,2) )
use
* citanje zaglavlja pomocu funkcije Zaglavlje()
zagl = Zaglavlje("bez_cdx.dbf")
if Empty(zagl)
wait "CITANJE ZAGLAVLJA NIJE USPELO !" window
return
endif
* ispisivanje informacija u fajl
if File("A1.TXT")
Erase A1.TXT
endif
=Ispisi()
* pregled fajla
modi file a1.txt
************* 2. SLUCAJ: DBF SA CDX
* kreiranje DBF fajla sa jednim poljem, SA CDX
name_dbf = "sa_cdx.dbf"
create table (name_dbf) (polje1 N(10,2) )
index on polje1 tag polje1
use
* citanje zaglavlja pomocu funkcije Zaglavlje()
zagl = Zaglavlje("sa_cdx.dbf")
if Empty(zagl)
wait "CITANJE ZAGLAVLJA NIJE USPELO !" window
return
endif
* ispisivanje informacija u fajl
=Ispisi()
* pregled fajla
modi file a1.txt
erase bez_cdx.dbf
erase sa_cdx.dbf
erase sa_cdx.cdx
erase a1.txt
return
********************
function Zaglavlje
*
* Funkcija otvara DBF fajl na niskom nivou, cita zaglavlje
* i smesta ga u znakovnu promenljivu z
*
* parametri: ime_dbf - znakovna promenljiva, ime DBF fajla
* vraca: z - znakovna promenljiva sa rezultatom
*
parameters ime_dbf
private z
* otvaranje DBF fajla na niskom nivou
ff = FOpen( ime_dbf, 12)
if ff < 0
wait 'Greska pri otvaranju fajla.' window nowait
return ""
endif
* postavljanje pokazivaca na pocetak i citanje zaglavlja (prvih 32 bajta)
=FSeek(ff, 0, 0)
z =FRead(ff, 32)
=FClose(ff)
return z
********************
function Ispisi
* ispis ide u tekstualni fajl A1.TXT
SET ALTERNATE TO A1.TXT ADDITIVE
SET ALTERNATE ON
? "Podaci o DBF fajlu: ", name_dbf
* zdraknite malo kako izgleda zaglavlje sa kukama i kvakama ...
? zagl
* a zatim ce biti ispisan broj ASCII koda za svaki bajt (znak) u zaglavlju
for i = 1 to Len(zagl)
s = SubStr( zagl, i, 1)
s = PadL( AllTrim( Str( Asc(s),3,0) ), 3, "0")
? i, " ", s
next
?
?
* specijalno, na 29-om mestu je oznaka da li DBF ima CDX
s = substr( zagl, 29, 1)
if Asc(s) = 1
? CHR(7)
? "29.-ti bajt je: ", Asc(s), " DBF bi trebalo da ima CDX fajl !"
else
? "29.-ti bajt je: ", Asc(s), " DBF --- NEMA --- CDX fajl !"
endif
?
CLOSE ALTERNATE
SET ALTERNATE OFF
SET ALTERNATE TO
return
Eto, toliko od mene ...
P.S. Naravno, to ne oslobadja ndragan-a da ispuni preuzetu obavezu i posalje
celokupnu strukturu FOX DBF i ostalih fajlova ... B)
P.S.2. Zlobno:
A sada malo ciste zlobe: To pokazuje da _lipper-asi koji tajno prate ovu
temu ne bi li nesto naucili, toliko dobro hvataju FOX-ove fazone da ne samo sto
uspesno ucestvuju u raspravama, nego sam vise nego siguran da ce im to jednog
lepog dana, kada ih Svevisnji bude prosvetlio i priveo k pravom programskom
paketu za izradu programa za baze podataka i otimanje para od korisnika, vise
nego korisno posluziti. Stavise, mislim da znam krajnju fazu u preobracenju
_lipper-asa u FOX-ovca: kada pocnu da diskutuju o SQL-u, dan velikog prosvetlj-
enja i konacnog preobracenja nije daleko ... B->>>>>
Neka se djelovic ne ljuti, zloba ionako dolazi od coveka najgore fele:
od bivseg _lipper-asa koji je uspesno presao na FOX ... B--->>>>>>>>>>>>
P.S.3. Zamalo da zaboravim: _lipper-asi ne moraju da se brinu, prilikom
prelaska
iz jedne u drugu veru nisu mi nista odsekli... Cak sam se posle toga uspesno
ozenio i dobio cerkicu ...B)
baze.podataka.419max.headroom,
> služi samo za pregled). SET CURSOR OFF se pravi mnogo
> pametan, pa se
Kursor je isključen (sa SET CURSOR OFF) u samo tri slučaja:
GET nekog polja, INKEY() i za vreme trajanja WAIT komande.
> ON KEY LABEL <somekey> DO someproc
*** TEST.PRG
ON KEY LABEL F2 DO x
USE baza ORDER tag1
DEFINE WINDOW a FROM 1,1 TO 10,50 TITLE "Browser"
BROWSE FIELDS ime, prezime WINDOW a
...
...
*** X.PRG
CLOSE DATA
USE baza ORDER tag2
BROWSE LAST
KEYBOARD "šENTERć"
RETURN
Samo, koncepcija ti loša :) Lakše ti je da mu prvo ponudiš koji ćeš
ORDER da obrađuješ, pa tek kada on kaže "ime" ili "prezime", ti mu
udariš BROWSE.
baze.podataka.420mdrazic,
> A sada malo ciste zlobe: To pokazuje da _lipper-asi koji tajno prate ovu
> temu ne bi li nesto naucili, toliko dobro hvataju FOX-ove fazone da ne
> samo sto uspesno ucestvuju u raspravama, nego sam vise nego siguran da ce
> im to jednog lepog dana, kada ih Svevisnji bude prosvetlio i priveo k
> pravom programskom paketu za izradu programa za baze podataka i otimanje
> para od korisnika, vise nego korisno posluziti. Stavise, mislim da znam
> krajnju fazu u preobracenju _lipper-asa u FOX-ovca: kada pocnu da
> diskutuju o SQL-u, dan velikog prosvetlj- enja i konacnog preobracenja
> nije daleko ... B->>>>>
Možda Clipperaši samo hoće da pomognu braći sapatnicima Foxovcima :)
Clipperaši mogu da biraju: hoće li da rade sa .NTX, .CDX (Fox),
.NDX,.MDX (dBase), .NSX (SiX). Zato Clipperaši znaju neke od problema
koji muče Foxovce.
Kada Clipperaši počnu da diskutuju o SQL-u tada neće pogledavati u
pravcu Fox-a, već će koristiti Visual Objects :)))
Ne shvatite me pogrešno, mislim da je Fox sjajan softver, ali ipak
koristim Clipper zato što: a) u vreme kada sam počeo da radim nisu
mogli da se porede, b) i dalje su jezik, prateće biblioteke, otvorenost,
objektna orijentacija i mogućnost proširenja na strani Clippera.
Kada počnemo nešto ozbiljno da radimo u VO, poredićemo i Windows
aplikacije, za sada Fox ovde vodi 1:0. Nadamo se bar izjednačenju :))
Milan
baze.podataka.421dpredovic,
>> služi samo za pregled). SET CURSOR OFF se pravi mnogo
>> pametan, pa se
>
> Kursor je isključen (sa SET CURSOR OFF) u samo tri slučaja:
> GET nekog polja, INKEY() i za vreme trajanja WAIT komande.
I nema šansone da ga isključim u browsu?
> Samo, koncepcija ti loša :) Lakše ti je da mu prvo ponudiš
> koji ćeš ORDER da obrađuješ, pa tek kada on kaže "ime" ili
> "prezime", ti mu udariš BROWSE.
Koncepcija mi se dopada, em ukida jedan nivo menija, em nema potrebe da
čovek gasi tabelu, pa opet trči kroz menije samo da bi dobio drugi
redosled.
Inače, pronašao sam fazon: SHOW WINDOW REFRESH :)
baze.podataka.422dpredovic,
> Hteo bih da napisem C rutine za otvaranje .DBF
> pa mi treba opis formata.
Jedan source, hiljadu reči... Ovo radi sekvencijalni pregled baze, iz
c-a.
dbflist.zipbaze.podataka.423moebius,
> Jedan source, hiljadu reci... Ovo radi sekvencijalni pregled baze,
> iz c-a.
Pravo u metu!
Hvala
Dragan
baze.podataka.424goxx,
■
■ Komparirao sam dve baze, jednu bez CDX i drugu sa njim i otkrio da je oznaka
■ na 29-om bajtu od pocetka DBF fajla (odnosno zaglavlja).
■ Kao dokaz prilazem programce za proveru:
■ procedure CheckCDX
■ * Proverava treba li DBF da ima CDX fajl ISKLJUCIVO na osnovu
■ * oznaka u zaglavlju DBF fajla
Nekome sam odgovorio (pre petnaestak dana) da u dbf fajlovima nema
informacija o indeksima. Po ovome bi moglo da se kaže da nisam u pravu,
ali ...
Prevashodno nisam mislio na to da li postoji indeksni fajl ili ne već,
ako postoji kako se on zove jer nam je jedino ta informacija relevantna.
Zato je najbolje imati neki rečnik baze podataka pa na osnovu njega
kontrolisati integritet baze (baza = svi fajlovi).
■ P.S.2. Zlobno:
■ ...
■ _lipper-asa u FOX-ovca: kada pocnu da diskutuju o SQL-u, dan velikog
■ prosvetljenja i konacnog preobracenja nije daleko ... B->>>>>
■ ...
■ Neka se djelovic ne ljuti, zloba ionako dolazi od coveka najgore fele:
■ od bivseg _lipper-asa koji je uspesno presao na FOX ... B--->>>>>>>>>>>>
Kad već vučeš za jezik :))
Jel može nešto u tom FOX-u da se napiše, a da izgleda lepo ?
Šta će vam oni silni znaci jednakosti u pozivima funkcija za rad
sa fajlovima na niskom nivou? :))))).
Goran
baze.podataka.425pedjolino,
Jedno ORACLE pitanje. Postoji li nacin da se u
Forms-ima odradi rollback a da ne odradi i clear_form.
Negde pise da ne moze ali me zanima koristi li neko neki
trik za to. Naime posle upotrebe rollbacka u bilo kojoj
proceduri koja odradjuje komplikovanu transakciju ili napolje iz
forme ili ponovni execute_query, pa skok na slog gde je bio
i ostale zezalice.. Ne pomaze ni koriscenje savepointa, bar
ja ne videh kako.
Pozdrav Nenad.
baze.podataka.427bulaja,
Ima li neko Windows ODBC drajver za FoxPro datoteke?
Znači treba mi osim za standardne .DBF baze podataka
još i za .CDX indekse i .FPT memo polja.
baze.podataka.428max.headroom,
> Inače, pronašao sam fazon: SHOW WINDOW REFRESH :)
Jest, ba! :) (Prozori, prozori, a ja kopao po BROWSE-u...)
baze.podataka.429max.headroom,
DATA DICTIONARY
Ako vas pri svakoj novoj aplikaciji (FoxPro v2.5 for Win)
zatrpava sveža gomila papira sa opisima baza, polja, tagova,
relacija i svega ostalog, dakle, relevantnog - ovaj programčić
je prava stvar. Uvek pristupačan i krajnje jednostavan.
"Dolje papir! čivjela elektron'ka!" :)
datad.arjbaze.podataka.430misa.m,
>> Ima li neko Windows ODBC drajver za FoxPro datoteke?
Ima.
baze.podataka.431szeman,
>> Jedan source, hiljadu reči... Ovo radi sekvencijalni pregled baze, iz
>> c-a.
Hvala ti puno i od mene, ubih se sa onim zezalicama iz bltc18z.zip (koja
je, uzgred, sa bug-om.)
baze.podataka.432ndragan,
/ Valjda je za stari Fox (Base)?
Tj. za nešto što bi moglo da trči i na super turbo ih teu sa nan tan
tatasturom? Kome to još treba?
baze.podataka.433ndragan,
/ č 10,5 GET x
/ =OKVIR(10,5,20)
č 10,5 GET x size 1, 28
=OKVIR(10, 5, 1, 28)
S tim da okvir crtaš tako da bude otprilike za 0.1 do 0.2 širi na sve
strane oko polja. E sad, zašto 28. Treba ti oko 30% šire polje, inače
ako uneseš dva tri velika slova, neće ti stati, bez obzira na font.
Takođe, prilikom ubacivanja parametara za tu funkciju bi trebalo da bude
uzeta u obzir i srednja širina fonta za rečeni objekat u odnosu na
širinu fonta za ceo prozor, pošto se veličine za okvir računaju upravo
preko ovog poslednjeg (visina i srednja širina difolt fonta za prozor),
a tvoj objekat može da ima i neki drugi font.
Sve skupa, prilikom prebacivanja aplikacije iz dosa pod pendžere, gdegod
spaziš len( ) i Define window from ... to / size, računaj da ćeš imati
da računaš. Vrednosti preuzete iz dosa će funkcionisati, al' ima da
rodiš mečku dok počne da liči na nešto.
/ (ja dobih 0.8 kao horiz. offset, ali to nije dovoljno precizno - fale
Rešenje je da uzmeš odnos širine fonta za objekat podeljeno sa širinom
fonta za prozor (srednje!) i dobijenim koeficijentom množiš parametre u
proceduri koji se odnose na širinu, a odnosom visina da množiš visinu,
pa onda plus nešto da dobiješ razmak. BTW, kod mene stoji set readborder
off, mnogo je lepše kad sam nacrtaš ispupčeni ili udubljeni okvir, mada
to ume da potraje (masku sa dvadesetak polja i tridesetak takvih okvira
iscrtava do deset sekundi na 486/40 sa 8M) (mada, našli smo načina da i
tome doakamo :).
baze.podataka.434ndragan,
/ Ima li neko literaturu za FoxPro 2.6 Library Construction Kit? Ili,
/ kako se od C programa prave biblioteke za FoxPro 2.6?
Knjiga uopšte nije naivna, samo formatu parametara koji se prosleđuju
tamo i nazad posvećeno je prvih dvadesetak strana. Dovoljno je džebeno
da smo to ostavili za neka vremena kad bude vremena za
eksperimentisanje.
Da, knjiga je ista od 2.5.
baze.podataka.435ndragan,
/ Padalo mi je napamet neko zezanje sa refresh, ali nisam uspeo da
/ izvedem nista mnogo pametno...
Štos je u tome da ne treba da daš refresh na prozor u kome se nalazi
brauz, nego na sam brauz prozor. Njegovo ime je jednako aliasu baze,
osim ako mu daš naslov, kada je jednako prvoj reči naslova, tj. najbolje
je da naslov strpaš u promenljivu, koja ti posle sadrži i ime pendžera
koji treba osvežiti (*) . BTNJ, ako je
instaliran 852 i u config.fp stoji codepage=auto, taj naslov, kao i sva
moguća imena (baza, polja, procedura, promenljivih, pendžera itd) mogu
da sadrže šđžčć, koje ispravno prepoznaje i u velikim i malim slovima.
------
(*) za osvežavanje ne preporučujem ni pepsIkolu ni kokAkolu, čak i moja
najmlađa ćerka je izjavila da je to 'isto govno'. Najbolje samo jedan
Show Window (ime_pengera) Refresh
jer garantovano osvežava, a ne goji.
baze.podataka.436max.headroom,
> off, mnogo je lepše kad sam nacrtaš ispupčeni ili
> udubljeni okvir, mada to ume da potraje (masku sa
> dvadesetak polja i tridesetak takvih okvira iscrtava do
> deset sekundi na 486/40 sa 8M) (mada, našli smo načina da
> i tome doakamo :).
'Ebem li ga da li mu ovo dođe pod "baze.podataka", al' šta ćeš - Win
radi svoje :) Elem, ja setujem READBORDER na ON, a potom nacrtam ivice
da izgleda kao da je udubljeno. Efekat se time malčice pojačava (stvar
ukusa). Nego, za ono "brzo" iscrtavanje prozora: da li je trik da ga
prvo DEFINE, potom crtkaš, pa tek na kraju ACTIVATE? Dobiješ utisak da
ga odmah "baci" na ekran :)
baze.podataka.437aandrejin,
Imam pitanje u vezi sa ACCESS-om 2.
Forma ima 3 polja.
Hoću da izvedem da ako je polje1=null
onda da druga 2 polja budu enabled=false, odnosno da "posive".
Možda je od neke važnosti što je polje1 text, a druga 2 polja datumi.
Ovo je u VBasicu najprostija stvar, ali meni u ACCESSu nikako da
uspe.
Unapred hvala na odgovoru.
HPS: probo sam i sa IsNull funkcijom ali :(
baze.podataka.438peca.st,
Hi svima!
Koristim FoxPro for Windows 2.6. Rade}i sa njim,
uo~io sam potrebu za kori}enjem nekih ve} postoje}ih SW
procedura i funkcija, kako ne bih nanovo izmi{ljao toplu
vodu. Recimo, trenutno sam u "pohodu" za 'Incremental
Search' rutinom.
Znate li mo`da gde mogu na}i neke rutine ove
vrste za svoju vrziju FoxPro-a? Ima li neko od vas ne{to
{to bi mi moglo pomo}i?
Hvala unapred! :)
Puno pozdrava!
baze.podataka.439max.headroom,
VEZA: C => FOXPRO for WIN (1/4)
(Prolog: tekst je za C-debile poput mene, ali može da se iskopa i
ponešto korisnoga - kao i iz svakog tematski uokvirenog štiva,
uostalom. Pod pojmom "C-debil" podrazumevam osobu koja se
programiranja latila tek od mas-manije usmerene na Xbase jezik. Da sam
hteo da učim C, sada bih pisao UNIX za digitalne časovnike, a ne
aplikacije koje ne ispuštaju bazu podataka ni posle shut-down-a.
Drugim rečima - "da sam školu učio, ne bih ovde čučio. Prstom pokaži
gde se kuglica nalazi" ;)
* * *
Iako (svi znamo da) je FoxPro kompletan sistem za razvoj aplikacija,
postoji potreba za njegovom primenom na mestima gde Fox-ova snaga ne
može da dođe do izražaja zbog pomanjkanja funkcija koje podržavaju
željenu vrstu "razonode" (primera radi: komunikacija sa A/D konverto-
rom). Druge aplikacije su u .DLL formatu, i njih možemo koristiti samo
ako je omogućena njihova veza (link) sa FoxPro-om.
Srećom, još od FoxPro-a v2.00 postoji API (Application Programming
Language) koji omogućuje korisniku da postojeći sistem nadogradi
proizvoljnim brojem novih funkcija. Te funkcije se odnose na, kao što
sam pomenuo, pisanje i čitanje sa A/D konvertora, I/O porta (dakle,
raznorazne modemske komunikacije nama dobro znane), itd. Koristeći
API, možemo sistem nadograđivati koliko nam volja što mrežnim,
grafičkim i ostalim funkcijama, i, što je najvažnije, preko njega
dobijamo pristup neograničenom broju Windows aplikacija i .DLL-a.
Da bi pristupili eksternoj biblioteci rutina (.FLL fajlovi), koristimo
komandu SET LIBRARY TO. Najčešće su pomenuti .FLL fajlovi pisani u C-u
ili asembleru. Majkrosoftov "Library Construction Kit" (LCK) sadrži
sav kod neophodan da bi se kreirao jedan .FLL fajl, kao i one osnovne
funkcije koje čine samo jezgro Fox-a (pristup .DBF fajlovima,
prozorima...).
Pošto smo nabavili i instalirali LCK, potrebno je imati i standardni
C-kompajler (kao što su Watcom C, odn. Microsoft C/C++). Tada
posedujete sav alat neophodan za kreiranje, kompajliranje i linkovanje
C programa u .FLL datoteku. Tekst koji sledi pokazuje kako koristiti
API za kreiranje i dodavanje jedne jednostavne funkcije FoxPro-u.
ELEMENTI C PROGRAMA
Xbase jezik je tzv. "weakly typed" jezik. Drugim rečima, u Xbase-u
jedna varijabla pri kreiranju može imati jedan tip (npr. datumski), da
bi se kasnije u programu konvertovala u drugi (npr. karakter). C je,
međutim, "strongly typed" jezik i kod njega je pre-deklaracija
promenljivih određivanje njihovog tipa koji je, kasnije, nepromenljiv.
Hederi
Sve C funkcije se moraju pre-definisati time što se odredi tip
njihovog ulaznog i izlaznog parametra. I umesto da vas primorava da
stalno iznova pišete pre-definicije ili radite njihov cut/paste u nove
programe, C poseduje kompajlersku direktivu #include, koja se može
koristiti da bi se "dodali" posebni fajlovi, tzv. hederi, a koji
sadrže pomenute pre-definicije. Hederi najčešće imaju ekstenziju .H -
LCK ih takođe poseduje; on nudi poseban heder-fajl, PRO_EXT.H, koji
sadrži sve potrebne strukture i definicije f-ja neophodne FoxPro-u.
Globalne promenljive
Kao i kod Fox-a, sve promenljive kreirane u funkciji (dakle, pri
njenom pozivanju) bivaju izgubljene posle izlaska iz iste. C predviđa
postojanje globalnih struktura i promenljivih, slično PUBLIC
promenljivama. Globalne promenljive su deklarisane čim su napisane van
funkcije, i važe za sve vreme njenog izvršavanja.
Rezultati funkcija
Sve C f-je su definisane vrednošću koja se od njih očekuje kao
rezultat (izlazni parametar). Najčešće su one tipa int, float, ili
char. Još jedan tip f-je, void, ne vraća nikakav rezultat. Sve API
f-je koje se pozivaju direktno iz Fox-a moraju biti void tipa. To ne
znači da one ne mogu imati i rezultat (logično, jelte) - to samo znači
da se ne koristi standardni mehanizam vraćanja rečenog rezultata. LCK
nudi posebne f-je za rezultirajuće numerike, stringove i boolean
izraze; one daju FoxPro-u posebnu kontrolu nad memorijom i
formatiranjem.
baze.podataka.440max.headroom,
VEZA: C => FOXPRO for WIN (2/4)
FOXINFO STRUKTURA
FoxInfo je veza između FoxPro-a i rutina pisanih u C-u. FoxInfo
struktura sadrži sledeće: ime f-je, onakvo kakvim će biti pozivana iz
Fox-a; ime C funkcije; broj parametara i njihov tip. Potreban je jedan
podatak u FoxInfo bazi za svaku f-ju koja će biti pozivana iz
FoxPro-a.
Primer jednostavne C funkcije
Najlakši način da se kreira željena API biblioteka rutina, jeste da se
baci pogled na konkretan primer. Ono što sledi je kompletan listing
jedne C funkcije nazvane ARGUTYPE.C, koja je slična Fox-ovoj f-ji
TYPE(), i koja kao rezultat vraća tip podatka zadatog kao ulazni
parametar. Razlika je u tome što ARGUTYPE.C rezultat vraća kao
kompletan string, a ne kao pojedinačni karakter.
/* A R G U T Y P E . C */
#include <stdlib.h>
#include <pro_ext.h>
char *typesŠ Ć = š
"Character", "Date", "Integer", "Float",
"General","Logical","Memo","Numeric",
"Picture","Reference","Unknown"
ć;
void far argutype(ParamBlk FAR *parm)
š
int ix;
int tp = parm->pŠ0Ć.val.ev_type;
for (ix = 0; ix < 10 && tp != typesŠixĆŠ0Ć; ix++);
_RetChar(typesŠixĆ);
FoxInfo myFoxInfoŠ Ć = š
š"ARGUTYPE", argutype, 1, "?"ć,
ć;
FoxTable _FoxTable = š
(FoxTable FAR *)0, sizeof(myFoxInfo) / sizeof(FoxInfo),
myFoxInfo
ć;
Dakle, napisana funkcija je dugačka samo četiri reda, a poznajući C
programere (ne računam sebe, svakako), može biti i kraća. Šta kaže
f-ja? Elem, njena prva linija deklariše promenljivu ix, koja je samo
brojač. Druga linija definiše promenljivu tp. Da bi se shvatilo kako
se promenljiva inicijalizuje, potrebno znati kako API prihvata zadate
parametre.
Svi parametri koji se prosleđuju API-ju moraju biti posebne strukture
nazvane ParamBlk (strukture su u C-u grupa elemenata koja se tretira
kao jedna celina. One su nešto kao matrice (arrays) u Fox-u, u kojima
svaki elemenat može biti posebnog tipa). Pomoću FoxPro-a parametar se
API-ju može proslediti koristeći bilo "call-by-value", bilo "call-by-
reference" pristup. Da bi se došlo da parametra, svaki tip zahteva
posebnu strukturu. "Call-by-value" biva obrađen preko "Value"
(vrednost) strukture, dok "Call-by-reference" (referenca) obrađuje
"Locator" struktura. Kada se dve strukture fizički preklope, oni
kreiraju uniju (union). Tako, ParamBlk struktura je unija Value
i Locator struktura, pa programer mora odlučiti koju "stranu" unije
primenjuje. Prvi bajt strukture sadrži tip poziva i govori koja će se
"strana" koristiti.
"Seciranje" segmenata koda je dobra prilika za dekodiranje C nomenkla-
ture:
tp = parm->pŠ0Ć.val.ev_type;
parm-> Pointer na ParamBlk strukturu
pŠ0Ć. Prvi parametar strukture
val. Koristi "Value" stranu Parameter strukture
ev_type Ovaj element sadrži tip podatka
Konkretno, ova rutina koristi "call-by-value". ParamBlk struktura
omogućuje prosleđivanje više parametara (tzv. subscript struktura, tj.
strukt. sastavljena od elemenata). Elementi se u C-u navode iza
uglastih zagrada (ŠĆ), dok matrice uvek počinju elementom 0.
baze.podataka.441max.headroom,
VEZA: C => FOXPRO for WIN (3/4)
Rutina, potom, uzima prvo slovo tipa parametra i poredi ga sa prvim
slovom proširene definicije (vidi: types). Ako je poređenje uspelo,
kao rezultat se vraća proširena definicija tipa (ond. cela reč). Ako,
pak, poređenje nije uspelo, rutina vraća string "Unknown" (nepoznati
tip). Funkcija _RetChar() vraća sadržaj matrice - ona očekuje pointer
na string koji se završava "null" karakterom, kao svoj jedini
argument.
Na kraju listinga ARGUTYPE.C nalazi se FoxInfo struktura. Ona definiše
svaku novu f-ju koja se dodaje FoxPro-u. Prvi element je ime koje će
Fox koristiti da pristupi novoj funkciji. Njeno ime mora biti navedeno
pod navodnicima i napisano velikim slovima. Drugi element je ime
funkcije u C-u, i ono ne mora biti identično Fox-ovom. Međutim, pošto
je C case-sensitive jezik, ime f-je u koje će koristiti C mora biti
navedeno pazeći na mala i velika slova. Treći element je broj
argumenata koji se prosleđuje (1), a četvrti je pod navodnicima i
definiše njihove tipove. Treći i četvrti element omogućavaju FoxPro-u
da proveri broj i tip argumenata pre nego što je API i pozvan. Program
je smešten u fajl sa ekstenzijom .C i spreman je za kompajliranje.
Kao što je ranije napomenuto, ParamBlk struktura je u stvari unija
Value i Locator struktura. Prvi elementi iz obe strukture se
preklapaju, što se koristi za indikaciju da li je parametar prosleđen
po vrednosti ili po referenci. Value struktura ParamBlk strukture se
definiše na sledeći način:
typedef struct š
char ev_type;
char ev_padding;
short ev_width;
unsigned short ev_length;
long ev_long;
double ev_real;
MHANDLE ev_handle;
ć Value;
Prvi element, ev_type, mora biti jedan od sledećih: C,N,I,D,G,L, ili
M. Ako je R, parametar se prosleđuje po referenci i potrebno je
koristiti Locator "stranu". Pretpostavljajući da je ev_type jedna od
gornjih vrednosti, definicija ostalih elemenata Value strukture zavisi
od tipa parametra koji se prosleđuje. Sledeća tabela prikazuje za šta
se koristi koje polje za koji tipa parametra:
Polja typedef strukture
------------------------------------------------------------------------
Tip elementa Character Numeric Integer Date Logical Memo/Gen
------------------------------------------------------------------------
ev_type 'C' 'N' 'I' 'D' 'L' 'M'
ev_width širina širina FCHAN
ev_length dužina broj logical
stringa decimala
ev_long long duž. memo
integer polja
ev_real double date ofset
precision memo polja
ev_handle MHANDLE
stringa
------------------------------------------------------------------------
Locator struktura se koristi za prosleđivanje argumenata po referenci,
kao i za prosleđivanje matrica, memo-polja i "general" polja. Evo
njene definicije:
typedef struct š
char l_type;
short l_where;
short l_NTI;
short l_offset;
short l_subs;
short l_sub1;
short l_sub2;
ć Locator;
Prvi element, l_type, mora biti "R". Evo i tabele:
Locator polja i njihova upotreba
-----------------------------------------------------------------------
Locator polje Upotreba polja
-----------------------------------------------------------------------
l_type 'R'
l_where -1 za promenljivu, ili broj radne oblasti
l_NTI Ime indeksa
l_offset Broj polja (ako je baza), prvi. el. je 0
l_subs 0 za promenljivu, ili broj elementa matrice
l_sub1 Prvi element (ako je matrica)
l_sub2 Drugi element (ako je matrica dvodimenzionalna)
-----------------------------------------------------------------------
baze.podataka.442max.headroom,
VEZA: C => FOXPRO for WIN (4/4)
KOMPAJLIRANJE
Da bi se ARGUTYPE.C iskompajlirao, koristeći Watcom-ov C 9.0 kompajler,
zadajemo sledeće parametre:
wcc /o1 /of /s /d2 /m1 /fpc argutype
Objašnjenje svičeva:
/o1 loop optimization
/of generate traceable stack frames
/s removes stack overflow checks
/d2 embed symbolic debugging information
/m1 use the large model
/fpc use only the floating point library, not the coprocessor
Kada je kompajliranje uspelo, kao rezultat dobijamo ARGUTYPE.OBJ fajl.
LINKOVANJE
Za linkovanje je potreban jedan "front-end" fajl, koji će u
kombinaciji sa ARGUTYPE.OBJ rezultovati .EXE datotekom. Da bi linkeru
objasnili šta sve treba da uđe u taj .FLL fajl, koristimo .LNK
datoteku. Ona (ARGUTYPE.LNK) izgleda ovako:
debug all
sys windows dll
lib clibl
lib windows
lib proapiwl
name ARGUTYPE.exe
option symfile = ARGUTYPE.map
option heapsize = 5k
option map
option oneautodata
file libentry.obj
file ARGUTYPE.obj
Sve specifične FoxPro f-je vade se iz PROAPIWL.LIB fajla (stiže
zajedno sa LCK-om), dok se opšte C i Windows f-je koje rutina zahteva
dobijaju iz WINDOWS.LIB i CLIBL.LIB fajlova (stižu zajedno sa
kompajlerom). Ako je linkovanje uspelo, kao rezultat se dobija
ARGUTYPE.EXE. Potom je potrebno učiniti sledeće korake da bi Windows
3.1 prepoznao fajl i da bi ga Fox mogao učitati:
rc -31 ARGUTYPE.exe
copy /b ARGUTYPE.exe+ARGUTYPE.map
del ARGUTYPE.fll
rename ARGUTYPE.exe ARGUTYPE.fll
Prva linija poziva resource kompajler koji markira ARGUTYPE.EXE kao
Windows 3.1 executable. Druga linija kombinuje fajl i symb. tabelu u
jedan fajl, dok treća briše postojeću kopiju fajla. Poslednja linija
samo preimenuje ARGUTYPE.EXE u .FLL, što omogućava Fox-u da ga
prepozna kao biblioteku. Sve ovo utrpajte u neki .BAT fajl (dajte da
se automatizujemo), odn. koristite Watcom-ov MAKE.
DODAVANJE NOVE FUNKCIJE FOXPRO-U
Pošto je .FLL kreiran, iz Fox-a ga jednostavno uzmite kao eksternu
biblioteku sa SET LIBRARY TO argutype. LIST STATUS ili DISPLAY STATUS
daju sledeće rezultate:
API library Instance Handle
c:ĐfoxproĐwinapiĐargutype.fll 0031B994
Function Address
ARGUTYPE 08D7:0130
Da bi se novokreirana f-ja testirala, dovoljno je zadati:
? argutype(DATE())
što bi trebalo da rezultuje ispisom stringa "Date". Probajte i ostale
tipove. Ako posedujete više biblioteka, koristite ih sve odjednom
upotrebom: SET LIBRARY TO lib1, lib2, itd... (za korišćenje neke
dodatne biblioteke upotrebite ADDITIVE opciju). Ako vam neka od
biblioteka više ne treba, zadajte: RELEASE LIBRARY lib1.
baze.podataka.443djelovic,
> VEZA: C => FOXPRO for WIN (4/4)
Hvala na veoma zanimljivom primeru!
baze.podataka.444jasicp,
Postoji li grupa za Paradox Engine ? Ako ne postoji, neka interesenti
posalju mail.
baze.podataka.445spantic,
Sećate se Maxovog obećanja da će sve svoje zanimljive poruke o
Fox-u da sredi u fajl? ;)
Dok on to ne uradi evo svih poruka tematske prirode zaključno sa
korišćenjem C-a.
-> Max: Moja škola FOX-a
max.zipbaze.podataka.446ndragan,
/ I nema šansone da ga isključim u browsu?
Browse nowait save
nowait znači da ne čeka da se on šeta kroz brauz, nego program nacrta
brauz i trči dalje. Problem je što tekući slog nije druge boje. Save znači
da ostavi sliku na ekranu iako je brauz izašao.
baze.podataka.447ndragan,
/ P.S. Naravno, to ne oslobadja ndragan-a da ispuni preuzetu obavezu i
/ posalje celokupnu strukturu FOX DBF i ostalih fajlova ... B)
Toga ima kol'ko nećeš, a i to čudo što smo sad kopali uopšte nije
dokumentovano (16-31. bajt zaglavlja, piše Reserved). Mogao bih možda da
fotoklompiram (tamo) par strana pa da pošaljem nekome faks odavde
(knjige su mi u Mađarskoj, a tamo imam druga posla, i stvarno nemam kad
da prekucavam sitan štep iz Razvijačkih Gajdi /Developers' Guide/).
Ima i struktura za Cdx, Scx, Pjx, Frx, Lbx...
baze.podataka.448ndragan,
/ Prevashodno nisam mislio na to da li postoji indeksni fajl ili ne već,
/ ako postoji kako se on zove jer nam je jedino ta informacija
Piše samo ima/nema, a ako ima, zove se isto kao i baza. Toliko može da
stane u ono slobodnog mesta u zaglavlju, inače - gde bi nas odvelo kada
bi ime svakog indeksa trpali u zaglavlje. Prvo, bilo bi glomazno - pod
FoxproX možeš da imaš do 255 indeksa na jednu bazu. Drugo, beleženje
informacija o privremenim indeksima je ne suvišno, nego bi stvaralo
dodatne glavobolje. Zato je i dovoljan onaj jedan bajt.
baze.podataka.449max.headroom,
Još malo o FoxPro-u. Ponosne vlasnike paketa ovo što sledi ne bi
trebalo previše da tangira, jer je tekst napisan sa ciljem da one,
koji još nemaju Fox, uputi u mogućnosti primene Windows verzije. Sve
što sledi uzeto je iz ĐFOXPROWĐGOODIESĐFOXTOOLS direktorijuma.
Kako korisiti Windows API, i sve što on nudi? Kako koristiti moćne
funkcije biblioteka koje upravljaju Windows-om? Na ova pitanja
Microsoft ne nudi direktan odgovor (bar ga u FoxPro help-u nema), ali
se pozivaju na određene reference (knjige, source-ove), i lično
priznaju da pravih "mahera" na ovom polju ima malo, te da pomenuti
nisu bliski ideji da svoja znanja šire dalje. Zato i postoji premalo
primera, ali se nadam da su dovoljni da pokažu gotovo neiscrpne
mogućnosti koje ovakav pristup nudi.
*-------------------- dialer.prg ------------------------
* Jednostavan programčić koji šalje podatke na COM port, a koristi
* FOXTOOLS.FLL biblioteku za generički DLL pristup. FOXTOOLS bibl. nudi
* dve izuzetno korisne f-je: RegFn() i CallFn(). Kao što se iz primera
* da videti, RegFn() (registrovanje f-je) vraća integer vrednost kao
* pointer na Windows API funkciju, a koja se poziva preko f-je CallFn()
* sa odgovarajućim brojem parametara (prvi param. je obavezno pointer).
*
* Dakle, prvo u razmatranje uzmemo biblioteku FOXTOOLS.FLL...
SET LIBRARY TO SYS(2004)+"foxtools.fll" ADDITIVE
* Potom u promenljive OPENCOMM (ptr. na f-ju koja "otvara" serijski
* port). WRITECOMM (ptr. na f-ju koja piše na serijski port), i
* CLOSECOMM (ptr. na f-ju koja "zatvara" COM-port) Fox smešta potrebne
* vrednosti... Funkcija REGFN() ima sledeće parametre (sve Char tipa):
*
* REGFN(ImeFunkcije, TipoviArgumenata, TipRezultata, ImeDLL)
*
* Ako je f-ja registrovana, rezultat je referenca na f-ju (pointer), a
* ako nije ispisuje se message-box i REGFN() vraća -1.
*
* Tipovi argumenata su:
* I - Integer
* L - Long
* C - Character string
* F - Floating point number
* D - Double precision number
opencomm = REGFN("OpenComm", "CII", "I")
writecomm = REGFN("WriteComm", "ICI", "I")
closecomm = REGFN("CloseComm", "I", "I")
* Otvaranje COM-porta zahteva i nešto preciziranja (COM1 promenljiva),
* dok se u promenljivu S smešta string koji će na serijski izlaz biti
* odaslat...
com1 = CALLFN(opencomm, "COM1:", 100, 100)
s = "ATDP 648422" + CHR(13)
* Pisanje na COM1: (u pitanju je promenljiva S, tj. "ATDP 648422")...
=CALLFN(writecomm, com1, s, LEN(s))
* Posle pritiska na bilo koji taster modem ide off-line...
WAIT WINDOW "Pritisni bilo koji taster za hang-up"
s = "ATH0" + CHR(13)
=CALLFN(writecomm, com1, s, LEN(s))
* COM-port se zatvara...
=CALLFN(closecomm, com1)
* Kao i biblioteka koja nam više neće trebati...
RELEASE LIBRARY SYS(2004)+"foxtools.fll"
* EOF dialer.prg
*--------------------------------------------------
baze.podataka.450ndragan,
/ prvo DEFINE, potom crtkaš, pa tek na kraju ACTIVATE? Dobiješ utisak da
/ ga odmah "baci" na ekran :)
Save window trtmrt to memo mrttrt... a posle sam restore i getovi -
ostatak crteža se pojavljuje kao puf iz oblačka.
baze.podataka.451ndragan,
/ vodu. Recimo, trenutno sam u "pohodu" za 'Incremental
/ Search' rutinom.
Ako je to ono na šta ja mislim, napisao sam to još za 1.02 i sad sam već
negde na verziji 4.92, al' nije šarevare (moram i ja od nečeg da živim).
Mogao bih eventualno da bačim ovamo par principa kako bi to moglo da se
napravi, pa se dalje snalazite sami.
BTNJ, jel' zna neko neki trik da tekući slog ostane ofarban kad se da
Browse NoWait? Jednostavno mu se ofarba bojom za ostale slogove čim to
više nije aktivan prozor (a nowait upravo to uradi - deaktivira prozor).
baze.podataka.452ndragan,
/ VEZA: C => FOXPRO for WIN (1/4)
Štos za DOS verziju je da se prave .PLB umesto .FLL bibliotetaka, inače
je mehanizam isti i strukture parametarskih blokova bi trebalo da su
iste. Jedino se, valjda, format dobijene bibliotetke razlikuje, a C sors
treba da može da je isti. Nisam se nešto udubljivao u to - i ja sam isto
C-read-only debil.
Svejedno, preporučujem da se koristi FPATH.PLB odnosno FoxTools.fll -
ima zgodnih stvari koje dosta skraćuju posao (mada bi ista stvar mogla
da se izvede i iz samog foksa, ovako radi brže a i ima manje da se
piše).
Funkcije koje redovno koristim:
JustStem(fname) - daje samo ime fajla (bez nastavka)
JustExt(fname) - obratno
JustFname(fname) - celo ime fajla bez staze
JustPath(fname) - samo staza bez imena fajla
AddBs(dirname) - ime direktorija sa forsiranim bekslešom na kraju
ForceExt(fname,ext) - onaj fajl samo sa novom ekstenzijom
DefaultExt(fname, ext) - onaj fajl samo sa novom ekstenzijom ako je
već nema
Words(string,/graničnik/) broj reči u stringu. difolt graničnik je
chr(32), al može i bilo koji drugi string
WordNum(string, rbr, /graničnik/) - iz stringa vadi reč broj rbr
(graničnik kao malopre). Ne broje se prazne reči, tj kad između dva
graničnika nema ničega to ne računa kao reč.
Strfilter(string,filter) - iz stringa izbacuje sve znakove koji se ne
sadrže u stringu filter. Tako recimo sa
StrFilter("lk jlkjou 4oi3214","0123456789")
izbacujem sve što nisu cifre i dobijam "43214".
baze.podataka.453max.headroom,
> Sećate se Maxovog obećanja da će sve svoje zanimljive
> poruke o Fox-u da sredi u fajl? ;)
Jao :), u pravu si. Nezgoda je u tome što, kada završim jedan deo,
nemam srca a da ga odmah ne spustim na Sezam (sve mislim - nekome će
zatrebati, a zašto bi čovek čekao sledeću godinu da pročita
zanimljivost). A još je veća nezgoda što će Microsoft izbaciti neki
sledeći Fox :) pa će napisano, dotle, izgubiti na vrednosti.
Ma i ovako imamo (uslovno rečeno) sve na jednom mestu, pa ako se ipak
ispostavi da previše tekstualnih poruka nekome smeta - pakovaću tekst
u fajlove.
baze.podataka.454max.headroom,
> Save window trtmrt to memo mrttrt... a posle sam restore i
> getovi - ostatak crteža se pojavljuje kao puf iz oblačka.
Vidiš, zanimljivo :) Probaću obe varijante (486/66) pa ću ostaviti
brojčani utisak.
baze.podataka.455max.headroom,
> Svejedno, preporučujem da se koristi FPATH.PLB odnosno
> FoxTools.fll -
Manimo se toga, pogledaj moju poruku pod 11.449 i - plačimo :) Znam,
niko od C-developera za Windows-e neće da kaže ništa konstruktivno...
a jedino oni imaju brda literature neophodne za neke interesantne
zahvate.
baze.podataka.456max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 1.
(Inkrementirano pretraživanje)
(Upotreba Windows .DLL biblioteka)
Kao što sam ranije napomenuo, API može poslužiti da bi se poboljšale
performanse FoxPro rutina. Ali, pre svega, treba objasniti nešto i o
samoj mehanici Fox-a:
Prvo, to je hibrid između kompajliranih (compiled) i interpretiranih
(interpreted) jezika. Kod, koji se prvobitno u njega unese (.PRG) mora
prvo biti kompajliran u .FXP oblik. .FXP oblik programa je vrlo kompa-
ktni set instrukcija nazvan "p-code"; FoxPro učitava i interpretira
svaku (odn. onu do koje je izvođenje došlo) liniju takvog koda.
Između dva izvođenja linija koda, Fox proverava i razna druga zbivanja
("events", što bi se narodski reklo), kao što su kliktanje miša i
pritisak na neki od tastera. Glavna kontrolna petlja koja kontroliše
izvođenje programa i eksterna zbivanja (events) naziva se "event
loop", dok deo programa koji učitava i izvršava source nosi naziv
"inner loop interpreter". Koristeći API, moguće je uneti vlastite
procese u pomenutu Fox-ovu "event loop". Takvi procesi najčešće vrše
skeniranje nekog od tastera, praćenje klika tastera miša, kontrolu
serijskog porta, kao i razne druge lepote.
Moguće je navesti Fox da pokreće vaš proces pri svakoj iteraciji
"inner loop interpreter"-a, ili ga navesti da proces startuje samo za
vreme "idle time" perioda - tj. za vreme kada Fox očekuje neki unos sa
tastature. Tekst koji sledi je detaljnija razrada navedenog...
DODAVANJE PROCESA U "EVENT LOOP"
Fox-ov Browser je vrlo moćno oružje - on može poslužiti i kao tabela
za unos podataka, i kao alat za prikazivanje istih. Ako je baza
velika, humano je korisniku obezbediti metod (ako zanemarimo zamorni
PageDn) kojim će stizati do željenog zapisa. Najjednostavnija metoda
je programirati 26 ON KEY LABEL tastera koji će čekati da korisnik
pritisne jednog od njih i skočiti na zapis koji počinje željenim
slovom. Metoda je OK, ali je delimično neprecizna.
Bolje rešenje je takozvano inkrementirano pretraživanje, što podrazu-
meva sledeći sistem: što se unese više slova, pointer na traženi zapis
je sve bliže cilju (eno ga živi primer u NCD-u).
Šta bi bilo zanimljivo za razmatranje? Pa, možda da se jednostavno
omogući nekoliko GET polja za slova, poređana jedno do drugog - pa
svako GET polje poseduje odgovarajuću VALID funkciju koja vrši SEEK.
Kursore je moguće naštelovati (ON KEY LABEL) tako da, ako je korisnik
blizu traženog polja, oni dobijaju svoju prvobitnu funkciju u Browse-
ru, da bi mogla da se uradi brža korekcija položaja u bazi. Pošto je
moguće koristiti i miša, dovoljno je pritisnuti Enter ili desni klik i
pretraga se obustavlja, a Browse se gasi.
Sledeća mogućnost je upotrebiti INKEY() f-ju da bi se "hvatale" vre-
dnosti pritisnutih tastera, što radi brže od pomenute GET metode.
Jedini je problem što se preko INKEY() ne može registrovati desni
klik, ali je moguće napisati API rutinu koja proverava status miša i
vraća logičku vrednost.
Medžutim ;) tuj stajem sa razmatranjima i šaljem biblioteku L3INCR.FLL
koja koristi API da bi dodala novi proces u "event loop" za vreme
Browse-a. Dakle, vidi se normalni Browse, ali se skeniraju tasteri od
A do Z i od 0 do 9, vrši se SEEK i radi se radnja. Da bi se skeniralo
desno dugme miša, koristi se f-ja RMDOWN(). Evo, u neku ruku skraćene
verzije L3INCR.FLL
l3srch.fllbaze.podataka.457max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 2.
/* L3INCR.C
Rutinice:
skeyinit - start skeniranja tastera i SEEK-a
skeykill - zaustavljanje skeniranja
*/
#include <dos.h>
#include <pro_ext.h>
/* Globalne promenljive */
int skeyid;
Value val;
MHANDLE mh;
char *cp;
Point pt;
WHANDLE wh;
/* Predefinicija funkcija */
void dbback();
void dbseek(char);
FAR SKHandler (WHandle, EventRec FAR *);
/* Inicijalizacija rutine */
void FAR skeyinit(ParamBlk FAR *parm)
š
wh = _WOnTop(); /* Pointer na prozor na vrhu */
mh = _AllocHand(100); /* Rezerviši nešto memorije */
_HLock(mh); /* Zaključaj rezervisanu memoriju */
val.ev_type = 'C'; /* Definisanje stringa koji se traži */
val.ev_length = 0; /* ...i to kao string dužine 0 */
val.ev_handle = mh; /* Pointer na memoriju */
cp = _HandToPtr(mh); /* Određivanje stvarnog pointera */
/* Sada kačimo naš novi "event-nadler" */
skeyid = _ActivateHandler(SKHandler);
ć
/* Rutina koja završava sa pretraživanjem */
void FAR skeykill(ParamBlk FAR *parm)
š
_HUnlock(mh); /* Otključaj... */
_FreeHand(mh); /* ...i oslobodi memoriju */
/* Uklanjanje "event-handler"-a */
_DeActivateHandler(skeyid);
ć
/* Evo i pravog "event-handler"-a... */
/* ...a koji, trenutno, prati samo pritisak na određene tastere */
FAR SKHandler(WHandle SWin, EventRec FAR *ev)
š
/* Ako je rezultat YES, FoxPro će znati da je došlo do pritiska... */
/* ...ili, ako je NO, treba obraditi tekući event */
int retval = NO;
if (ev->what == keyDownEvent ) š
/* Proveri da li je to jedan od "legalnih" karaktera; velika slova */
if ((ev->message >= ' ' && ev->message < 'a') đđ
(ev->message > 'z' && ev->message <= 0x7E)) š
dbseek(ev->message);
retval = YES;
ć
else š /* Proveri jesu li mala slova */
if (ev->message >= 'a' && ev->message <= 'z')) š
dbseek(ev->message & 0xDF); /* Konvertuj u velika slova */
retval = YES;
ć
else š /* Takođe, izvrši proveru BS-a */
if (ev->message == 'Đb') š
dbback();
retval = YES;
ć
ć
ć
ć
return retval;
ć
/* Ova rutina sastavlja SEEK string konkatenacijom i vrši ispis */
/* istog u prozoru na vrhu. */
void dbseek(char chr)
š
val.ev_length += 1;
cpŠval.ev_length-1Ć = chr; /* Dodaj karakter stringu */
_DBSeek(&val);
pt.h = val.ev_length;
pt.v = 0;
_WPosCursor(wh,pt); /* Pozicija kursora u prozoru */
_WPutChr(wh,chr); /* Ispis karaktera u prozoru */
ć
/* Sledeća rutina briše, ako je potrebno, 1 karakter skraćujući */
/* SEEK string i ponovno aktivirajući pretragu. */
void dbback()
š
if (val.ev_length > 0) š
pt.h = val.ev_length;
pt.v = 0;
_WPutCursor(wh,pt);
_WPutChr(wh,' '); /* Briše poslednji uneti karakter*/
val.ev_length -= 1;
_DBSeek(&val); /* Ponovni SEEK stringa */
ć
else /* Nema karaktera za brisanje... */
_PutChr(7); /* ...pa zvrcni jedared */
ć
FoxInfo myFoxInfoŠ Ć = š
š"SKEYINIT", skeyinit, 0, ""ć,
š"SKEYKILL", skeykill, 0, ""ć,
ć;
FoxTable _FoxTable = š
(FoxTable FAR *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo
ć;
baze.podataka.458max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 3.
Da bi se ovaj program koristio, potrebno je definisati i aktivirati
prozor u kome će se ispisivati sve što se unosi sa tastature. Tada se
poziva SKEYINIT() koji uključuje detektor, a potom se aktivira
normalni BROWSE. Posle korištenja nije na odmet :) rutinu isključiti
pomoću SKEYKILL(). Primer:
č 23,1 SAY PADC(" Pritisni <ENTER> za izbor",80) COLOR GB+/B
SET LIBRARY TO l3incr && Kačenje API rutine
USE laser ORDER utitle && Pažnja: tag je UPPER(title)
DEFINE WINDOW test FROM 4,15 TO 6,60 ;
SYSTEM TITLE "Pretraživanje po naslovu"
ACTIVATE WINDOW test
=skeyinit() && Inicijalizacija detekcije
DEFINE WINDOW brow FROM 6,15 TO 20,60 SYSTEM
ON KEY LABEL ENTER KEYBOARD CHR(23)
ON KEY LABEL RIGHTMOUSE KEYBOARD CHR(23)
BROWSE FIELDS title:42 WINDOW brow
ON KEY
STORE LASTKEY TO lk
=skeykill() && Isključivanje detekcije
RELEASE WINDOW test
CLEAR
IF lk = 27
RETURN "Pritisnut ESCAPE"
ELSE
RETURN title
ENDIF
*----------------------------------------------
PETLJE KOJE PODRAZUMEVAJU "čEŠĆA" IZRAžUNAVANJA
Kao što je prethodno napomenuto, FoxPro koristi "inner loop interpre-
ter" za čitanje i izvršavanje koda. Zbog toga, nezavisno od instrukci-
je, svaka izvršna komanda poseduje određeno "zaglavlje" - to
podrazumeva i konstrukcije petlji tipa SCAN/ENDSCAN i FOR/ENDFOR.
Takvo "zaglavlje" postaje izuzetno važno kod petlji koje zahtevaju
česta matematička izračunavanja. Sa druge strane, "zaglavlja"
konstrukcija petlji u C-u su najčešće zanemarljive kompleksnosti, pa
su rutine koje pretpostavlja FoxPro česti kandidati kod C-a. U većini
slučajeva API rutina se izvršava znatno brže (često - znatno ZNATNO
brže) od njenog ekvivalenta u Fox-u.
Da bi se ovo demonstriralo, sledeći program je napisan u FoxPro-u i
izračunata mu je brzina, a potom je napisana u C-u i, koristeći API,
ponovo izvršena pod Fox-om. Program, nazvan KAMATA.PRG, izračunava
totalnu akumuliranu kamatu za 1000 DIN uplaćenih na račun banke koja
dnevno isplaćuje kamatu u vrednosti od 10% od uplaćene sume, oročene
na 100 godina. Evo FoxPro koda:
rezultat = 1000 && Početni bilans
dnrata = (10/100) / 365 && Dnevna kamata
FOR godina = 1 TO 100
FOR dan = 1 TO 365
rezultat = rezultat + dnrata * rezultat && Dodaj kamatu
ENDFOR
ENDFOR
Program je pokrenut i brzina mu je izmerena na 486/33 mašini sa podo-
sta RAM-a. Izvršen je za 2.13 sekundi. Zatim je unutrašnja petlja
napisana u C-u i pozvana 100 puta. To izvršenje je trajalo 0.309
sekundi, pa je povećanje faktora brzine iznosilo 6.89. Zatim je i
spoljnja petlja napisana u C-u, pa se čitava API rutina pozivala samo
jednom. To je trajalo čitave 0.283 sekunde, što je donelo povećanje
brzine od 7.53. To bi značilo uštedu od skoro 52 minute računanja koje
bi, normalno, trajalo sat vremena!
Međutim, postoji i sistem u kome API usporava rad, jer sam poziv API
rutine pretpostavlja čitanje određenog "zaglavlja", jer je FoxPro
32-bitni, extended mode program, dok se API rutine izvršavaju u
16-bitnom ili standardnom modu. Tako, svaki poziv API-ja natera
procesor da pređe iz protected moda u standardni režim, i nazad. Da
bih ovo ilustrovao, uzeo sam samo onu unutrašnju komandu petlje
("Dodaj kamatu") koja preračunava dnevnu kamatu, napisao je u C-u, i
pozvao 36500 puta. To je trajalo 9.199 sekundi, što je sporije od
FoxPro-ovog koda za faktor od 4.3 Evo i tabele:
baze.podataka.459max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 4.
Pozivi API-ju
-----------------------------------------------------
Tip Puta Izmereno Faktor
poziva pozvan vreme
-----------------------------------------------------
FoxPro ***** 2.130 1.00
Dnevna kamata 36500 9.199 0.23
Kamata za
jednu godinu 100 0.309 6.89
Kamata za
100 godina 1 0.283 7.53
-----------------------------------------------------
Dakle, rešenje za osveženje: koristite API f-ju što je ređe moguće, a
u nju strpajte koda što je više u vašoj moći. Nemo' da vas mrzi da
pravite uporedne benchmark testove.
PRISTUPANJE MATEMATIžKOM KOPROCESORU
Da ste probali dati primer (KAMATA.PRG) na vašoj mašini, pogotovo ako
je to 386-ica, dobili bi ste čak i bolje rezultate. Kompjuter koji je
uradio prikazana izračunavanja, 486-ica, poseduje DX procesor sa
ugrađenim numeričkim koprocesorom. FoxPro pristupa numeričkom koproce-
soru (kao što to čini i Windows), što mu daje kosmičku brzinu. Ako
koristite /fpc svič u WCC komandnoj liniji, sve API rutine neće
koristiti matematički koprocesor već pre 80387 softverski emulator.
Dakle, korištenjem /fp87 ili /fp387 sviča, preusmeravate rutine za
izračunavanje direktno na koprocesor. Paz'te sad: pomenuta rutina je
re-kompajlirana sa /fpi387 svičem i potom testirana. Rezultat je
neverovatan: vreme izvršavanja je 0.36 sekundi, što daje faktor
ubrzanja od 59.17. Iako postoje određene varijabilnosti zbog Windows
multitaskinga, faktor ubrzanja se uvek kretao zdravo preko 50.
Predlog: ako vaša mašina poseduje numerički koprocesor, a želite da
postignete slične rezultate, morate obratiti pažnju na dve začkoljice.
Prvo, iako možete mešano koristiti rutine kompajlirane sa /fpc svičem
(samo emulator) ili /fpi87 odn. /fpi387 (samo koprocesor), ne možete
koristiti /fpi svič. /fpi svič omogućava kodu da odluči, u momentu
izvršavanja, koju biblioteku da koristi, i nije kompatibilan sa
API-jem. Ako je potrebno da napišete rutinu koja će raditi čas ovako,
čas onako, najbolje je da je iskompalirate u dve verzije: jednom sa
/fpc, a drugi put sa /fpi87, odn. /fpi387 svičem. Koristite
_bios_equiplist() da odredite (ne)postojanje matematičkog koprocesora
i, shodno tome, pustite prvu ili drugu verziju u pogon.
Druga začkoljica se tiče rezultata dobijenih od koprocesora. Ako ga
koristite, nemojte upotrebljavati _RetFloat() f-ju da bi vratili
rezultate. Ona ne interpretira izlaz iz koprocesora korektno, pa
umesto nje koristite _RetVal(). _RetVal() radi potrebna preračunavanja
i time vam vraća ispravan rezultat.
ADAPTACIJA POSTOJEĆIH DOS PROGRAMA
Adaptacija već postojećeg DOS ili Windows programa, da radi u Fox-u,
može biti ili izuzetno jednostavna, ili grozomorno komplikovana za
izvesti. Kroz primer ću prikazati jedan jednostavan program koji radi
OK preko RUN komande iz DOS-a i WIndows-a, dok sada želimo da mu
pristupamo direktno iz FoxPro-a.
Zašto, uopšte, praviti izmene? Prvo, nije moguće koristiti standardne
funkcije za alociranje memorije (npr. malloc()) da bi se sačuvao
memorijski blok. Drugo, FoxPro kontroliše svoj vlastiti I/O. Smatra se
gotovo nepristojnim pisanje direktno na konzolu, ili pozivanje "tamo
nekih" low-level I/O funkcija tipa fopen() ili fwrite() za manipulaci-
ju fajlovima. Treće, što su FoxPro-ove mogućnosti debagovanja više
ograničene, to će program manje raditi pod našim budnim okom.
baze.podataka.460max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 5.
Ali, nijedan od pomenutih faktora ne bi trebao da predstavlja pretera-
nu brigu. Određene f-je nisu dozvoljene kao API rutine. U svakom
slučaju, kada god FoxPro "ukrade" f-ju, postoji odgovarajuća zamena. U
najvećem broju slučajeva, konvertovanje postojećih C-programa i njiho-
vo startovanje pod Fox-om je, jednostavno, stvar pozivanja druge
funkcije. U najgorem slučaju, ova konverzija se svodi na dodavanje
jedne ili dve linije dodatnog koda...
Pa da ispitamo primer jedne funkcije koja je napisana pod DOS-om, tj.
da objasnim postupak njenog uvođenja u FoxPro. To će biti WFCOUNT.C,
za jedno sa WENGINE.C:
/* WFCOUNT.C
Funkcija: wcount - vraća broj reči u fajlu
*/
#include <stdlib.h>
#include <dos.h>
#include <pro_ext.h>
/* FUNKCIJA WCOUNT
Poziva se iz FoxPro-a kao:
WCOUNT(filevar) filevar može biti konstanta ili karakter var.
Vraća:
integer - broj reči u fajlu
-1 - što znači "File Not Found"
-2 - što znači "Insufficient Memory"
*/
void far
wcount(ParamBlk FAR *parm)
š
/* Definisanje promenljivih */
FCHAN fh; /* Ptr. na fajl (int), tj. "file handle") */
MHANDLE bmh;
char far *buff,fnameŠ40Ć;
int retval,filen;
struct find_t finfo;
/* Naziv fajla */
filen = parm->pŠ0Ć.val.ev_lenght;
_MemMove(fname,_HandToPtr(parm->pŠ0Ć.val.ev_handle),filen);
fnameŠfilenĆ = 0; /* Dodaj null-terminator */
/* Uzmi veličinu fajla */
_dos_findfirst(fname, _A_NORMAL,&finfo);
/* Vidi da li fajl postoji */
fh = _FOpen(fname, FO_READONLY);
if (fh < 1) š /* Nedozvoljeni naziv fajla */
retval = -1; /* Kaži: "ne mogu ga naći" */
ć
else š /* Naziv fajla je OK */
/* Kreiranje bafera */
bmh = _AllocHand(finfo.size);
buff = (char far *)_HandToPtr(bmh);
if (bmh < 1)
retval = -2; /* Nemaš, ba, memorije */
else š
/* Popuni bafer fajlom */
_FRead(fh,buff,finfo.size);
/* Pozovi "WENGINE" */
retval = nowords(buff,finfo.size-1);
/* Vrati sve na svoje mesto */
_FreeHand(bmh);
_FClose(fh);
ć
ć
/* Kaži čoveku šta je tražio */
_RetInt(retval,10);
ć
#include "wengine.c"
FoxInfo myFoxInfoŠ Ć = š
š"WCOUNT", wcount, 1, "C"ć
ć;
FoxTable _FoxTable = š
(FoxTable FAR *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo
ć;
/* WENGINE.C
Ima dva stanja: inword i !inword.
Ono što će uraditi sa narednim karakterom zavisi od ovog stanja.
Ako je inword, i sledeći karakter je delimiter, wc se inkrementi-
ra, i inword se invertira.
Ako je !inword, i sledeći karakter nije delimiter,
inword se invertira.
*/
extern int
nowords(char far *bf,long sz)
š
int inword,ix,wc;
wc = 0;
inword = !delim(bfŠ0Ć) /* Inicijalizuj stanje */
for (ix=0; ix < szl ix++) š
if (inword) š
if (delim(bfŠixĆ)) š
wc = wc + 1; /* Inkrementiraj brojač reči */
inword = 0; /* Invertiraj inword */
ć
ć
else š /* !inword
if (!delim(bfŠixĆ))
inword = 1; /* Invertiraj inword */
ć
ć /* endfor */
if (inword != 0 && sz != 0)
wc = wc + 1;
return wc;
ć
/* Šta mu dođe delimiter... */
extern int
delim(char ch)
š
return ((ch == ' ') đđ
(ch == '.') đđ
(ch == ',') đđ
(ch == ';') đđ
(ch == '-') đđ
(ch == '?') đđ
(ch == ':') đđ
(ch == 13 ) đđ
(ch == 10 ) đđ
(ch == '!'));
ć
*---------------------------------------------------
baze.podataka.461max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 6.
Ovaj primer, tj. brojač reči prvobitno napisan za DOS, podeljen je u
dva dela. Prvi deo, koji učitava fajl u memoriju, poziva brojač reči
(WENGINE) koji vraća rezultat na konzolu. Pomenuti WENGINE radi i pod
DOS-om i pod FoxPro-om. To je nešto kao šablon za pisanje programa
koji će raditi pod API-jem, iako se ova tehnika ne primenjuje ako su u
problematiku umešane baze ili "event-loop" procesi. Da malo proanali-
ziramo program.
"DEFINISANJE PROMENLJIVIH"
Kao i većina C-programa napisanih za DOS, brojač reči počinje proce-
durom main:
int
main(int argc,char *argvŠ Ć)
š
FILE *fp; /* Pointer na fajl (struktura) */
Promenljiva argc sadrži broj argumenata, a argv je lista pointera na
argumente. Tipično, argvŠ0Ć je pointer na ime programa, a argvŠ1Ć je
pointer na prvi argument - u ovom slučaju, na fajl koji nas
interesuje.
Unutar API-ja, mi pozivamo naše funkcije direktno, koristeći FoxInfo
strukturu. Međutim, u FoxPro verziji ovog programa moramo koristiti
ParamBlk strukturu da prosledimo naziv fajla u kome će reči biti
prebrojane. Kod koji sledi prikazuje kako koristiti ParamBlk strukturu
da bi se argument konvertovao u standardni, tzv. "null-terminated"
string:
void far
wcount(ParamBlk FAR *parm)
š
char fnameŠ40Ć;
int filen;
filen = parm->pŠ0Ć.val.ev_length;
_MemMove(fname,_HandToPtr(parm->pŠ0Ć.val.ev_handle),filen);
fnameŠfilenĆ = 0; /* Dodaj null-terminator */
Uočite da ParamBlk struktura NE sadrži string, već samo mem. pointer
(u stvari indeks na tabelu sa pointerima). Kao rezultat, potrebne su
nam i _HandToPtr() i _MemMove() funkcije da bi konvertovali argument u
null-terminated string.
Funkcija _HandToPtr() (Handle To Pointer) konvertuje "handle" ('ebem
li ga, dođe mi da kažem pointer, a reći ću referenca) u pointer.
Funkcija _MemMove() se koristi da bi se iskopirao broj bajtova određen
u ev_length elementu u vname promenljivu. FoxPro ne garantuje da će
stringovi biti null-terminated (tj. da se završavaju null-bajtom), pa
tako moramo da uradimo eksplicitnu null-terminaciju fname stringa.
Preporučljivo je (iz zdravstvenih razloga) koristiti _MemMove(),
StrCpy() i slične funkcije umesto njihovih DOS ekvivalenata. Te API
rutine omogućavaju bolju kontrolu nad memorijom i sređuju još neke
"sitne" gadosti. Ako neke vaše rutine koriste pomenute f-je, jednosta-
vno ubacite sledeće #define-e na početak vašeg DOS programa, edabi
smanjili broj daljih izmena:
#define _MemMove memmove
#define _MemCmp memcmp
#define _MemFill memfill
#define _StrCpy strcpy
#define _StrCmp strcmp
#define _StrLen strlen
"LOW-LEVEL I/O PRISTUP FAJLOVIMA"
Da bi otvorili fajl u programu napisanom za DOS, definišete pointer na
fajl i zatim koristite fopen() da bi mu pristupili. Na primer:
FILE *fp /* Pointer na fajl (struktura) */
fp = fopen(argvŠ1Ć, "r");
U API rutini koriste se kanali (FCHAN), koji su ekvivalenti "file
handle"-ima, a potom se koristi f-ja _FOpen(). To izgleda ovako:
FCHAN fh; /* File Handle (int) */
fh = _FOpen(fname,FO_READONLY)
Za svaku low-level I/O rutinu, kao što je fread() ili fwrite(),
postoje API ekvivalenti koje bi trebalo koristiti. Može se koristiti i
serija #define-a da bi se izvela translacija funkcija za low-level I/O
rutine. Funkcije _FOpen() i _FWrite() su identične onima koje se
nalaze u samom Fox-u, te, u suštini, file handle brojevi koji se kori-
ste pod FoxPro-om su kompatibilni sa onima koje koristi API.
baze.podataka.462max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 7.
"MEMORIJA"
Kao što je ranije napomenuto, ne možete koristiti malloc() da bi reze-
rvisali memorijski blok. Umesto toga, koristite sledeći sistem za
kreiranje pointera na blok:
MHANDLE bmh;
char far *buff;
bmh = _AllocHand(finfo.size);
buff = (char far *)_HandToPtr(bmh);
Ako navedeno može garantovati zahtevanu količinu bajtova, _AllocHand()
funkcija vraća mem. handle, što je u stvari int. pointer na tabelu.
_HandToPtr() funkcija konvertuje mem. handle u pointer.
Bitno je zapaziti da FoxPro može da reorganizuje memoriju između dva
API poziva, pa je zato potrebno uvek nanovo izdvajati pointer pri
svakom takvom pozivu, ili koristiti _HLock() funkciju koja zaključava
blok memorije. Kada se završi njegova obrada, upotrebite _FreeHand()
f-ju (zajedno sa _HUnlock(), ako je potrebno) da ne bi došlo do
"iznenadnog" nestanka preko potrebne memorije.
"POZIVANJE WENGINE"
Ako su stvari prošle dobro, tj. ako nije nešto palo, puklo, iskočilo
gde ne treba, etc, etc, etc, može se pozvati deo programa koji broji
reči, i koji je isti i za DOS i za FoxPro. Priznajem, to će raditi
samo pod optimalnim uslovima (optimalno: čitaj - zvezde se namestile
baš onako kako programer zahteva). Navedeni brojač reči podrazumeva da
se fajl, nad kojim se vrši pretraživanje, uvek može držati u memoriji.
Ako to ne upali, morate ispitati ulazni stream korištenjem low-level
I/O fajl pristupa. U tom slučaju, #define tehnika i dalje može pratiti
kod.
Poenta je u tome što radimo isključivo testiranje pod DOS-om, gde su
nam pri ruci daleko bolji alati za debagovanje nego oni ponuđeni u
Fox-u. Možda bi pomogla upotreba f-je _BreakPoint() koja se kači na
INT3, i potom manuelno menjanje segmenta i ofseta simbol-tabele iz
debagera... Ovde, očigledno, nema tate.
"REZULTUJUĆE VREDNOSTI"
Veliki broj DOS programa koristi funkcije kao što su printf() da
pošalje rezultat(e) na konzolu. Pod FoxPro-om, potrebno je sumirati
rezultate u brojeve, stringove, ili kodove, pa ih potom vratiti u Fox
koristeću jednu od _RetXXXX() funkcija. Fox ekskluzivno obrađuje ekran
i pojma nema šta je gde ispisano. Ako je potrebno vratiti više vredno-
sti, jedina tehnika koju bi vredelo primeniti je da se pošalje matrica
koristeći call-by-reference pristup, pa da se unesu rezultati upo-
trebom _Store() f-je.
Ako je rezultat potrebno poslati na ekran, najbolje je koristiti f-je
poput _PutChr() i _PutStr(), da bi se štampalo u trenutno aktivni
prozor ili na ekran. Takođe, API sadrži sve funkcije neophodne da bi
se kreirali, birali, održavali i zatvarali prozori. Imate kompletnu
kontrolu nad njihovom veličinom i izgledom.
DAKLE...
Koristeći FoxPro API, imate odrešene ruke (a šta s njima, pitate se)
:) Sa relativno jednostavnim dodacima možete kreirati aplikacije za
vaše instrumentalije: raznorazna logovanja putem dodira dlana,
kontrolu procesa, robotiku, muziku, čitanje i generisanje bar-koda,
spell-checking, pretraživanje teksta, itd. Ako je vašoj API rutini
potrebna funkcija već implementirana u FoxPro, možete je dobiti
jednostavnim korištenjem f-je _Execute(), odn. _Evaluate() da valida-
ciju nekog izraza, pa čak i UDF-e. Sledeće programče kreira prozor,
koristi API da ga aktivira i potom koristi INKEY() da sačeka na neki
od tastera:
baze.podataka.463max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 8.
Value Val;
_Execute("DEFINE WINDOW t1 FROM 0,0 TO 10,10 DOUBLE SHADOW ");
_Execute("ACTIVATE WINDOW t1");
_Evaluate(&Val, "INKEY(1)");
Postoje i specijalni kodovi koje možete koristiti za učitavanje i
pozivanje inicijalizacionih i cleanup procedura. Takođe, može se
kreirati API rutina koja se poziva i koja se nikada ne vraća u FoxPro,
pa se Fox može koristiti kao jedna gigantska biblioteka (koristeći
_Execute() i _Evaluate()). Možete i na Mesec, samo da imate krilca :)
PRISTUPANJE WINDOWS API-JU
Koristeći FoxPro-ov API možete pristupiti i Windows API-ju, koji
sadrži preko 700 funkcija za manipulaciju fontovima, grafikom, itd.
Windows omogućava specifičnu upotrebu rutina iz biblioteka nazvanu
Dynamic Link Libraries (.DLL fajlovi), i njih je potrebno učitati samo
jednom. Potom možete odlučiti da li pojedini delovi odgovarajuće
biblioteke zahtevaju odvajanje dela memorije, odn. da li takva me-
morija može da se deli.
FoxPro for Win koristi .FLL fajlove, koji su, jednostavno, specifičan
oblik .DLL fajlova. Koristeći .DLL mehanizam, .FLL fajlovi se mogu
učitati i prikačiti na druge biblioteke. Mogućnošću da pristupite
Windows API-ju, automatski dobijate odrešene ruke za promenu
MessageBox-a i ChangePrinter dijaloga. Uz to idu i grafika, fontovi,
multimedia, usluge printera, itd.
Postoje dva načina da pristupite Windows API-ju. Prvi je da koristite
.FLL nazvan FOXTOOLS.FLL koji stiže uz FoxPro for Win. Drugi je da
napišete vlastiti ekvivalent FOXTOOLS.FLL-a u C-u.
FOXTOOLS.FLL se nalazi u ĐGOODIES pod-direktorijumu, koji se kreira
kada se pokrene ALLUNPAK.BAT (ili kako se već zove ona gomila upako-
vanih bitnih mapa i ostalih sitnih zezalica). Sa učitanom bibliotekom,
koristeći funkcije RegFn() i CallFn() pristupate Windows API f-jama.
Jedina zabrana koja važi je da pozivane funkcije moraju imati parame-
tre integer, long, float, double, char ili string tipa, a mogu se
predavati bilo call-by-value, bilo call-by-reference motodom. Evo
primera pristupanju MessageBox-a:
SET LIBRARY TO foxtools
tralala = RegFn("MessageBox", "ICCI", "I")
Lista parametara se interpretira na sledeći način: funkcija MessageBox
koja ima četiri argumenta: integer, string, string i integer. Rezultat
je integer tipa. Funkcija se poziva korištenjem CallFn() f-je:
odgovor = CallFn(tralala,0,"Brisanje svih fajlova?","Pažnja",36)
Onaj 36 bit-kodirani parametar govori MessageBox-u da ponudi samo
odgovore Yes i No, i da prikaže ikonicu sa znakom pitanja. FOXTOOLS
može poslužiti i za menjanje izgleda kursora, iznalaženje tekućeg
direktorijuma, manipulaciju nad WIN.INI fajlom, promenu default
printera i štošta drugo.
NESTANDARDNI POZIVI
Ako ste željni pisanja potrebnog koda, možete koristiti bilo koju
funkciju iz bilo koje .DLL biblioteke, ali to, naravno, važi samo za
one funkcije koje ne odgovaraju zahtevima FOXTOOLS.FLL. Dakle, prvo je
potrebno napisati neophodni pomoćni kod u C-u, da bi se pristupilo
.DLL fajlu. Potom se poziva C Windows funkcija LoadLibrary() koja
proverava da li je željena .DLL već učitana i, ako nije, učitava je sa
diska. Potom se poziva Windows funkcija GetProcAddress() da bi se
pronašla i adresa željene funkcije. Odatle je sve lako. Na primer,
možete pozvati ChangeFont dijalog na sledeći način:
LOGFONT lf;
CHOOSEFONT cf;
void NewFont(ParamBlk FAR *parm)
š
HANDLE hLibrary;
FARPROC fnCM;
char szCommNameŠ40Ć;
/* Postavi sva polja strukture na nulu */
memset(&cf, 0, sizeof(CHOOSEFONT));
cf.lStructSize = sizeof(CHOOSEFONT);
cf.hwndOwner = 0;
cf.lpLogFont = &lf;
cf.Flags = CF_SCREENFONTS đ CF_EFFECTS;
cf.rgbColors = RGB(0,255,255); /* Svetlo-plava */
cf.nFontType = SCREEN_FONTTYPE;
_StrCpy(szCommName,"COMMDLG.DLL");
hLibrary = LoadLibrary(szCommName);
if (hLibrary >= 32) š
fnCM = GetProcAddress(hLibrary,"CHOOSEFONT");
(fnCM)(&cf);
ć
return;
ć
Tako možete koristiti i vlastite .DLL fajlove, koristeći sličan meha-
nizam. U narednom jednostavnom primeru šaljemo podatke iz FoxPro pro-
grama u Windows "scrolling graph" program. Prvo, kreirate .FLL sa me-
morijskim baferom koji ćete puniti iz FoxPro-a koristeći API pozive.
"Scrolling graph" program poziva isti .FLL fajl koristeći LoadLibra-
ry() funkciju, i potom čita sadržaj bafera u svoju vlastitu memoriju
(ond. rezervisani blok). Evo source-a:
/* DATAPROC.C
Funkcija: dataproc()
*/
#include <windows.h>
#include "pro_ext.h"
int idatŠ500ĆŠ4Ć; /* Bafer za transfer */
void far dloader(ParamBlk FAR parm*) /* Učitava bafer u FoxPro */
š
int i = parm->pŠ0Ć.val.ev_long;
int j = parm->pŠ1Ć.val.ev_long;
idatŠiĆŠjĆ = parm->pŠ2Ć.val.ev_long;
ć
int FAR _ _export PASCAL uldr(int i, int j) /* Prazni bafer */
š return idatŠiĆŠjĆ; ć
FoxInfo myFoxInfoŠĆ = š
š"DLOADER", dloader, 3, "I,I,I"ć,
ć;
FoxTable _FoxTable = š
(FoxTable FAR *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo
ć;
*--------------------------------------------------------------
Kod potreban da se učita u ovu biblioteku iz Windows funkcije je sli-
čan prethodnom:
dll = LoadLibrary("DATAPROC.FLL");
if (dll >= 32) š
DataProc = GetProcAddress(dll,"uldr"); /* F-ja za transfer */
if (DataProc == NULL)
MessageBox(NULL,"Dobili ste NULL","DataProc Address",MB_OK);
else š
for (i=0; i<500; i++)
for (j=0; j<4; j++)
idatŠiĆŠjĆ = (DataProc)(i,j);
ć
FreeLibrary(dll);
ć
*---------------------------------------------------------------
Nadam se da niste propustili da shvatite da FoxPro for Win omogućava
kreiranje Win-funkcijski dobro podržanih aplikacija (ako ništa drugo,
tj. ako u posedu nemate LCK, zadajte SET LIBRARY TO FOXTOOLS i kopajte
po literaturi. Najzad, sedamstotinak funkcija Windows .DLL-a nije za
bacanje) :)
baze.podataka.464dr.grba,
Pitanje za foksovce, stvar koja me je totalno zbunila i zapanjila:
Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad FoxBase+
programa? Kakva glupost u programu mora postojati, pa da se program pobuni?
BTW, nema nikakve mreže. Share je instaliran zbog testiranja OLE 2.0 podrške
u WIN programima.
baze.podataka.465mdrazic,
> Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad
> FoxBase+ programa? Kakva glupost u programu mora postojati, pa da se
> program pobuni?
Otvaraš li istu tabelu u dve radne oblasti? Ako je to, onda pada ako
otvaraš ekskluzivno. To prolazi bez share, a sa njim neće jer to
ovaj program zabranjuje (kao što ni na mreži iz istih razliga neće
raditi). Izlaz iz ove situacije je da otvaraš tabele u shared modu
i tražiš dozvole pisanja (lock) kada išta menjaš. Takođe je ovo zgodno
ako ne želite da neko koristi vaš program na mreži ali ćete imati muke
sa korisnicima kojima kojekakvi instalacioni programi 'poture' share
u sistemske fajlove.
Milan
baze.podataka.466misa.m,
FoxPro 2.6 for UNIX.
Izgleda da je MS napravio zaista lep paket za rad pod UNIX-om. Ima se utisak
da radite pod DOSom, sve radi identično, boje, miš, tastatura,... Normalno
sve ovo važi za rad na konzoli.
Za terminale je već malo komplikovanije.
Instalacijom dobijate i nekoliko emulacija: wy60fox,wy60-25fox,wy60fox-pc,
wy325fox,wy325-25fox,wy325-25wfox (132*25). Fox pored TERM varijable čita
i FOXTERM tako da dozvoljava da simultano koristite dve emulacije, jednu u
foxu i drugu nakon poziva nekog drugog unix programa (RUN program).
Fox for DOS aplikacije rade direktno ako u sebi nemaju DOS specifičnih komandi,
izgleda da je kod binarno kompatibilan.
Postoji i posebna komanda "proget" (instalira se u /usr/bin), koja se može
pozvati nezavisno ili sa RUN, za transfer DOS aplikacije. Zadajete samo
direktrijum a komanda na osnovu pronađenih ekstenzija obavi odgovarajući
transfer (ASCII ili binary).
Uz poruku je prikačena readme datoteka.
fpu26.arjbaze.podataka.467ndragan,
/ s = "ATDP 648422" + CHR(13)
Za čitaoce sa crnobelim televizorima, linija glasi
/ s = "ATDP ,,,011648422" + CHR(13)
baze.podataka.468ndragan,
Evo, da odužim reda, ono što sam obećao (jesam li, zaista, nešto se ne
sećam... mora da sam bio slabo koncentrisan, tako reći razblažen):
- Struktura zaglavlja .dbf fajla
- Struktura .fpt fajla
- Struktura .idx fajla (nekompaktnog)
Prekucato iz Razvijačkih Gajdi od Fp2.6. Tekst je rađet u 852, mrzelo me
da butiram rodni mi juski/b015 koktel (besplatna reklama za NkBoga, ¸ß˛
ň˘°ńߢ), pošto je tog trenutka TArva za drugom makinom nešto radio, a mi
smo jedan drugom serveri (jel' to neki rod, sinko?), te - ili
iskonjvertujte, ili se oslonite na to da je skoro sve na engleskom (ima
6 naših slova u texsztu).
Eh, da - u prvoj tabeli brojke sam prevodio na heks (real programmers...)
ali me posle mrzelo da pretvaram 235 i slično iz glave, a baška još da
tražim heks kalkulator, tako da su brojke u ostalim tabelama dekadne.
dbfstru.zipbaze.podataka.469zzk.,
> Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad
> FoxBase+ programa? Kakva glupost u programu mora postojati, pa da se
> program pobuni? BTW, nema nikakve mreže. Share je instaliran zbog
> testiranja OLE 2.0 podrške u WIN programima.
Nisi opisao kog tipa je ispad pa nisam siguran da ce ovaj odgovor
pogoditi u metu, ali mozda posluzi onima kojima se desi ono sto je
mene jednom namucilo:
U config.sys stavljamo ono cuveno FILES da bi nase aplikacije radile
sa odredjenim brojem fajlova vecim od podrazumjevajuceg. Za dalje
razmatranje je bitno da se za svaku datoteku trosi 48 bajta RAM-a.
Programi koji pri instalaciji automatski ubace SHARE u autoexec,
ubace ga bez parametara, tako da on obezbjedjuje 20 zakljucanih
slogova i 2048 bajta RAM-a za datoteke. (e tu klopara :) )
Dakle, ako tvoja aplikacija radi sa vecim brojem fajlova moras u
autoexecu SHARE pokrenuti sa parametrom /F:broj bajtova.
Inace, SHARE bez parametara (znaci sa nedovoljno odvojene memorije)
ne smeta kada se masina loguje na mrezu.
baze.podataka.470max.headroom,
Mhm, radim jednu aplikaciju u Fox-u za Win, pa mi neki zlonamerni čika
kaže da želi da vidi naša slova u menijima (a ja lepo isplanirao
nazive barova tako da naša slova niti ne vidi, ali, eto - on hoće da
se jedna stavka zove tako i nikako drugačije). Stoga, ima li neko
ideju gde naći system font sa našim slovcima po XY rasporedu?
(poželjno - na Sezamu)
baze.podataka.471mzdravkovic,
Da li se neko sretao sa sledecim problemom.
U radu sa bazama pod windows-om (DBASE for win i DB-fast), slike koje su
ubacene kao neko polje u bazi, nemogu kasnije da se prikazu u svojim
normalnim bojama. Naime, pri kasnijem pozivu slike, ona ima neku svoju
paletu boja ili jednostavno smanji broj boja. U svakom slucaju kvalitet slike
je nikakav. Zasto baze pod windows-om gube informacije o bojama u slici ?
baze.podataka.472dr.grba,
>> Dakle, ako tvoja aplikacija radi sa vecim brojem fajlova moras u
>> autoexecu SHARE pokrenuti sa parametrom /F:broj bajtova.
Aplikacija nije moja, ali hvala na odgovorima.
baze.podataka.473stosic,
> Da li se neko sretao sa sledecim problemom.
> U radu sa bazama pod windows-om (DBASE for win i DB-fast), slike koje su
> ubacene kao neko polje u bazi, nemogu kasnije da se prikazu u svojim
> normalnim bojama. Naime, pri kasnijem pozivu slike, ona ima neku svoju
> paletu boja ili jednostavno smanji broj boja. U svakom slucaju kvalitet
> slike je nikakav. Zasto baze pod windows-om gube informacije o bojama u
U koliko boja su slike snimljene?
Skoro sam pravio jednu aplikaciju u Visual Basic Proffesional v3.0.
BMP slike (snimljene u 16 boja) su citane iz baze Access v1.1 i bile su,
blago receno, ocajne. Kada sam ih ponovo snimio u 256 boja sve je bilo OK.
baze.podataka.474djelovic,
> BMP slike (snimljene u 16 boja) su citane iz baze Access v1.1 i bile su,
> blago receno, ocajne. Kada sam ih ponovo snimio u 256 boja sve je bilo
> OK.
Razlicite palete.
baze.podataka.476mzdravkovic,
>>> normalnim bojama. Naime, pri kasnijem pozivu slike, ona ima neku
>>> svoju paletu boja ili jednostavno smanji broj boja. U svakom
>>> slucaju kvalitet slike je nikakav. Zasto baze pod windows-om
>> gube informacije o bojama u
>>
>> U koliko boja su slike snimljene?
>> Skoro sam pravio jednu aplikaciju u Visual Basic Proffesional
>> v3.0. BMP slike (snimljene u 16 boja) su citane iz baze Access
>> v1.1 i bile su, blago receno, ocajne. Kada sam ih ponovo snimio u
>> 256 boja sve je bilo OK.
Slike sa kojima sam radio su u 256 boja, i normalno je da svaka od njih ima
svoju paletu. Od windows-a ocekujem da procita paletu slike koje ce da prikaze,
a ne da prikazuje sliku u nekoj svojoj paleti boja. Isti problem sam bojama mi
se javljao i kada je windows bio u nekom od hi-color rezima.
baze.podataka.477tolja,
Ima li neko informacije o problemu koriscenja SPOOL-era pod FoxPro
2.0KKkada radi pod Novell 4.01. Komanda SET PRINTER TO ĐĐSPOOLERĐ... ne vrsi
posao jer ne postuje oznaku forme, broj kopija itd. Dakle, kako u FoxPro 2.0
resiti problem stampe na mreznom stampacu pod Novel 4.ll 4.01 ??
baze.podataka.478max.headroom,
> Ima li neko informacije o problemu koriscenja SPOOL-era
> pod FoxPro 2.0KKkada radi pod Novell 4.01. Komanda SET
> PRINTER TO ĐĐSPOOLERĐ... ne vrsi
Primetio sam isti problem, i pošto sam bio prinuđen da stvar rešim
brzo, napisao sam sitnu funkciju koja je sve to radila jednostavnim
štampanjem u fajl (REPORT FORM TO file) i potom slanje istog na LPT2.
Bez veze :)
baze.podataka.479smarkov,
> Slike sa kojima sam radio su u 256 boja, i normalno je da svaka od njih ima
> svoju paletu. Od windows-a ocekujem da procita paletu slike koje ce da
> prikaze, a ne da prikazuje sliku u nekoj svojoj paleti boja. Isti problem
> sam bojama mi se javljao i kada je windows bio u nekom od hi-color rezima.
Sam po sebi WIN to naravno omogućuje. Pitanje je samo da li softver
koji prikazuje sliku koristi tu mogućnost (CreatePalette,
RealizePalette sa lokalnom paletom). Lako je napraviti WIN
programče ili DLL koje će da korektno prikaže BMP. HINT : Postoji
primer u WIN3.1 SDK-u, (zove se DIBVIEW) gde su demonstrirane mnoge
tehnike u vezi sa BMP-ovima.
pozdrav, smarkov
baze.podataka.480ssava,
Moli se siroki Sezamov auditorijum da po mogucstvu izadje u susret
jednom mom drugaru koji radi u DBASE III (jel radi neko jos u
ovome) :)))). Da ne 'duljim' evo dole original pitanja, pa
saljite savete, mogu i primeri.
Opcija RANGE iz naredbe GET u DBASE III, po primeru iz knjige
javlja sintaksnu gresku kada se koristi sledeci nacin:
@ 12,10 SAY ' poruka ' PICTURE (zeljeni oblik)
@ 12,10 GET promenljiva PICTURE (zeljeni oblik) RANGE (low,high)
Pozdrav, Sava.
baze.podataka.481ndragan,
/ Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad
/ FoxBase+
U kom smislu pad? Ono što se može očekivati je da je to čudo pisano kao
da je na solo makini, a neke naredbe neće da rade pod mrežom dok se malo
ne premundure. Naprimer
Select prva
Replace druga->polje with trt.mrt
neće raditi pod mrežom, jer je, prvo, sintaksa za mrežu 'replace next 1',
što izaziva automatsko zaključavanje sloga i otključavanje nakon upisa.
Međutim, nikako neće raditi u prethodnom primeru, jer odbija da piše u
slogove osim u selektovanoj bazi.
Rešenje (ako se radi o ovom što sam napisao) bi bilo 'Exclusive=on' u
config.fx (odnosno u config.fp za FoxPro), ili Set Exclusive On negde
pre otvaranja bilo kakve baze. Foks inače smatra da je u mreži čim je
učitan Share.exe. Simptom: jel' poruka bila 'record is not locked'?
baze.podataka.482ndragan,
/ Izgleda da je MS napravio zaista lep paket za rad pod UNIX-om. Ima se
Jel' šljaka i na divljega zeniksa, linuksa itd? Na šta je sve
instalirljiv? žuo sam da se vari samo sa Svetim Krstom (Santa Cruz),
pošto je i to čudo vlasništvo malog mekanog, a da se sa ostalima nalazi
u stanju blažeg krstaškog rata.
Pričaj bre još, ovo čekam već tri godine.
baze.podataka.483ndragan,
/ ideju gde naći system font sa našim slovcima po XY rasporedu?
Skini sa sezama sysfon.zip, on od bilo kojeg .ttf pravi .fot. Naravno,
moraš sam da ga instaliraš gde treba. Ja turio Arial CE (ili EE?) i fino
radi.
baze.podataka.484ndragan,
/ je nikakav. Zasto baze pod windows-om gube informacije o bojama u
/ slici ?
Fox4w: vidi help za "set palette" - on ili off zadržava sistemsku paletu
odnosno preuzima paletu sa slike (ne znam koje je za on a koje za off).
baze.podataka.485ndragan,
/ štampanjem u fajl (REPORT FORM TO file) i potom slanje istog na LPT2.
Btw, slanje fajla na štampač sam rešavao tako što sam ga slao red po red
(kasnije u komadima od 4K) proveravajući printstatus() pre svakog
komada. Kasnije, da bih ubrzao posao, otvarao sam štampač sa
y=fopen("lpt1",12) tj bez bafera i sa pravom upisa.
E, to neće da radi pod novelom 4.01, morao sam da šaljem sa ???.
baze.podataka.486dr.grba,
>> Rešenje (ako se radi o ovom što sam napisao) bi bilo 'Exclusive=on' u
>> config.fx (odnosno u config.fp za FoxPro), ili Set Exclusive On negde
>> pre otvaranja bilo kakve baze. Foks inače smatra da je u mreži čim je
Videću da li može da pomogne.
>> učitan Share.exe. Simptom: jel' poruka bila 'record is not locked'?
Mašina je trenutno isključena, pa ne mogu da proverim.
baze.podataka.487max.headroom,
> Skini sa sezama sysfon.zip, on od bilo kojeg .ttf pravi
> .fot. Naravno, moraš sam da ga instaliraš gde treba. Ja
> turio Arial CE (ili EE?) i fino radi.
Selbstverstaendlich :) Dojurio sam SYSFON.ZIP i nekako doakao fontovi-
ma, ali me je "zveknula" ona .obj-ova izvedba internog (programskog)
prebacivanja sa jednog sistemskog fonta na drugi :) (u njegovom Sezam
Offline Reader-u za Win, SDW-u). Pošto nisam C for Windows programer,
tražio sam reference na Windows funkcije koje bi tako nešto omogućile,
jer - ne želim da SVAKA aplikacija koristi izabrani YU-system font,
već samo moja :)
Hmh... mislim da ćemo morati da organizujemo bližu saradnju sa koleza-
ma iz PC.PROG/windows. DJelovicu, naš si čovek :)
baze.podataka.488max.headroom,
> Fox4w: vidi help za "set palette" - on ili off zadržava
> sistemsku paletu odnosno preuzima paletu sa slike (ne znam
> koje je za on a koje za off).
To se i ja spremih da mu kažem, ali mislim da čovek ni ne koristi
Fox4Win :) BTW, SET PALETTE ON - uključuje Fox-vu default paletu, dok
OFF svič koristi paletu .BMP-a (sve ovo važi i za OLE objekte).
baze.podataka.489max.headroom,
> č 12,10 SAY ' poruka ' PICTURE (zeljeni oblik)
:) Zašto bi karakter poruku formatirao kroz PICTURE opciju? Možda ne
navodi dobre template kodove u samoj PICTURE opciji, tj. navodi one
koji se ne slažu sa odgovarajućim RANGE vrednostima (različiti tipovi
podataka)...
baze.podataka.490max.headroom,
> E, to neće da radi pod novelom 4.01, morao sam da šaljem
> sa ???.
Da ga ne bi tako "gnjavio" :), spusti samo gomilu temporary fajlova sa
jedinstvenim nazivima u dir (REPORT FORM TO file), pa ih kokni na LPT2
(ili jedan po jedan), sa tim da se brišu posle uspešne štampe. REPORT
komanda poštuje definisane printer-kodove i onda kada ih šalje u fajl,
i meni do sada nije pravila nikakav karambol (mrežni štampač je
HPLJ4). Do skoro sam koristio biblioteku sa f-jama koje proveravaju
priner-queue, ali, na žalost, biblioteku pisanu za Win3.1... Posle
prelaska na Win4WG, ista je postala delimično neupotrebljiva, plus što
mi je ispisivala neku warning poruku pri SET LIBRARY TO tipa "Ova
Windows verzija mi je nekako sumnjiva" :(
Pošto nemam stalan pristup jedinoj viđenoj verziji Lib. Constr. Kit-a,
nisam u stanju da je valjano prekompajliram.
P.S.
Windows ima onol'ko (500 Fox-u dostupnih) f-ja, a mi se akamo sa
ponuđenim polu-rešenjima :) Uskoro nameravam da uzmem kopiju PETZOLD-a
sa jednog CD-a, pa da prenesem zanimljivi summary :)
Hint: SET LIBRARY TO FOXTOOLS, REGFN(), CALLFN()...
baze.podataka.491djelovic,
> Hmh... mislim da ćemo morati da organizujemo bližu saradnju sa koleza-
> ma iz PC.PROG/windows.
Svakako, kolega. Svratite na kahafu :).
baze.podataka.493gaston,
Hi,
ne bih da mnogo smetam, ali imam jedno pitanjce za koje me je, pravo da
ti kazem, sramota da ga javno postavim, jer mozda je odgovor ocigledan i pred
nosom, ali ja nikako da ga primetim.
Kako da otkrijem je li IDX ili TAG u CDX indeksiran po UNIQUE ?
Sve sam pokusao,
sve funkcije za rad sa indeksima, ali ne ide. To mi treba za jedan mali recnik
podataka i program za proveravanje struktura DBF i CDX prilikom otvaranja baze.
Pozdrav, Nesa Gaston
ş▄┼]¨÷¨ű ű ű ĆŮřÎ
baze.podataka.494mdrazic,
> Kako da otkrijem je li IDX ili TAG u CDX indeksiran po UNIQUE ?
>
> Sve sam pokusao,
> sve funkcije za rad sa indeksima, ali ne ide. To mi treba za jedan mali
> recnik podataka i program za proveravanje struktura DBF i CDX prilikom
> otvaranja baze.
Metod 1 (bez menjanja sadržine tabele):
Napravi dva indeksa po istom ključu, jedan običan, drugi unique.
Zatim uporedi hedere indeksnih fajlova. Mora da to tamo negde stoji kao
informacija u vidu nekog bajta. Problemi nastaju sa CDX i TAG-ovima
jer treba naći heder.
Metod 2 (sa promenom sadržaja tabele, čisto softverski):
- Nađi neki ključ koji do tada nije korišćen u tabeli.
- Dodaj zapis sa tim ključem
- Izbriši zapis (delete)
- Dodaj OPET zapis sa tim ključem ali ga ne briši
- seek ključ će naći zapis (drugi) u slučaju običnog indeksa, ali
ga NEĆE naći ako je indeks unique.
Objašnjenje: Kod unique indeksa samo prvi ključ (po fizičkom
redosledu iz tabele) ide u index, ostali ne. Index se ne obazire na
delete flag pri ažuriranju indeksa, ali se obazire pri pretraživanju.
Tako seek nađe PRVI zapis sa tim ključem (koji je brisan), proveri
flag, vidi da je brisan, i javi da nema zapisa.
Bug or feature? U svakom slučaju, zbog ovoga ne treba koristiti unique!
Milan
baze.podataka.495max.headroom,
Database Related Journal
dbms9108.zipbaze.podataka.496misa.m,
Mali uporedni test prfomanci FoxPro-a 2.6 na tri platforme. Za test
je korišćena datoteka artikala sa ukupno 39322 slogova indeksirana
po sifri C(9) i nazivu C(30).
Ceo test je single-user i obavljen je na Zenith-ovoj mašini:
- 80486/66Mh/EISA/8MB/SVGA/SCSI-540MB
- MSDOS 6.2, WFG 3.11 CEE, SCO UNIX
** Export/Import i Indeksiranje
DOS WIN UNIX
------ ------ -------
Append from SDF Size: 2.649KB Time: 11,640 12,930 11.850
Copy to DELIMITED Size: 2.285KB Time: 15,230 13,240 12.850
Copy to SDF Size: 2.649KB Time: 11,480 12,000 9.900
Append pa Index Size: 2.649KB Time: 43,490 33,050 36.340
Append sa CDX Size: 2.649KB Time: 69,240 55,240 134.330
-------------------------------------------------------------
** Upiti i sumiranje (Uslov za izdvajanje cena > 100 što kao rezultat
izdvaja 3373 od 39322 slogova). Testirana je prvo tabela sa dodatim
tagom u CDX po ceni a zatim bez njega.
Indeksiran po ceni Bez indeksa po ceni
-------------------------- --------------------------
DOS WIN UNIX U-SHR DOS WIN UNIX U-SHR
----- ----- ----- ----- ----- ----- ----- -----
Select 0,030 0,110 0.100 0.240 3,590 3,600 2.540 2.540
Select order 2,900 3,180 3.550 3.820 4,650 4,640 4.110 4.520
Browse for 0,110 0,770 0.120 0.140 0,050 0,100 0.030 0.040
Order Brow for 0,520 0,540 0.330 0.330 1,250 0,990 0.980 1.090
Idx for i Brow 2,080 2,820 3.240 3.160 3,410 4,090 3.420 3.480
Select sum all 5,560 4,420 3.360 4.110 5,060 4,570 3.320 3.970
SUM all 3,410 3,790 6.910 9.250 3,490 3,600 6.870 9.280
---------------------------------------------------------------------
- U-SHR je UNIX sa SHARED otvorenim tabelama
- Očigledno da je UNIX verzija uglavnom brža kada treba obraditi
veću količinu podataka, tj kada rushmore ne nađe indeks.
- I očigledna razlika u implementaciji SELECT SUM(arcena) i komande
SUM TO m.cena za DOS/WIN i UNIX.
baze.podataka.497misa.m,
Dodatak prethodnom testu.
SCO Open Server 3.0, Memorija nakon startovanja:
kernel=3452K, i/o buff=600K, user=4356K
** UNIX sa 6 virtuelnih terminala sa konzole simultano sa datim
vremenom startovanja u varijanti sa i bez indeksa po ceni.
(zgrada se trenutno kablira pa je mreža u rasturu)
Sa indeksom 11:12:32 11:12:43 11:12:44 11:12:49 11:12:59 11:13:26
------------------------------------------------------------------
Select 0.950 1.180 0.230 1.480 1.180 2.060
Select order 17.830 29.870 34.770 40.040 31.990 43.530
Browse for 2.510 5.270 6.130 3.150 4.280 4.140
order Browse 8.200 2.210 2.010 0.390 4.610 0.520
Select sum 34.820 28.970 28.540 40.830 20.430 38.620
SUM all 57.870 59.980 60.440 44.590 52.590 17.360
------------------------------------------------------------------
Bez indeksa 11:20:39 11:20:45 11:20:48 11:20:50 11:21:00 11:21:04
------------------------------------------------------------------
Select 23.600 44.220 52.060 50.860 42.140 39.000
Select order 49.230 37.180 25.740 25.800 27.870 25.810
Browse for 2.090 1.790 2.090 1.880 1.180 1.730
Browse order 8.110 2.940 0.870 11.350 8.790 6.260
Select sum 25.440 37.360 47.180 21.720 22.910 21.820
SUM all 50.120 54.660 46.840 45.100 50.490 61.870
------------------------------------------------------------------
** Mnogo realnije za raspolozivu memoriju, 2 usera
11:28:04 11:28:07
------------------------------
Select 0.540 1.040
Select order 8.840 10.140
Browse 0.310 0.310
Browse order 1.080 0.410
Select sum 7.030 11.560
SUM all 12.640 11.960
------------------------------
baze.podataka.498dr.grba,
>> Append pa Index Size: 2.649KB Time: 43,490 33,050 36.340
>> Append sa CDX Size: 2.649KB Time: 69,240 55,240 134.330
WIN najbrži??? (((:
Alo, mrzioci Wina! Videste li? (:
baze.podataka.499bulaja,
==========
newsbytes/general #3115, from newsbytes, 3105 chars, Tue Dec 6 17:00:10 1994
----------
CA Beefing Up Ingres Marketing 12/06/94
NEW YORK, NEW YORK, U.S.A., 1994 DEC 6 (NB) -- A report card on
Computer Associates International Inc.'s (NYSE:CA) handling of
the Ingres database software it acquired last spring gives the
firm an A. That's not surprising, being as the report card came
from CA itself.
In justifying this pat on its own back, though, CA gave the
impression it is working to correct Ingres' traditional
weaknesses.
At a press conference during the DB/Expo trade show and
conference, and transmitted via telephone to other industry
media and analysts, CA pointed to increased spending on marketing
and incentives for resellers and hardware and software partners.
Also at the press conference, several Ingres users chosen by CA
praised improved technical support and the added visibility of
the product since CA took over The Ask Group Inc., which formerly
sold Ingres.
Sanjay Kumar, president and chief operating officer of CA,
started the conference by saying there are three major trends in
the database market at the moment. Customers are moving toward
enterprise computing, away from relying on a single database
vendor, and from centralized to distributed database systems, he
said.
Kumar argued that CA is well placed to capitalize on these trends
because it is a major vendor of mainframe database software but
also, with the acquisition of Ingres, has prepared itself to
offer customers "a seamless migration path to client/server."
Computer Associates said it will absorb porting and certification
fees for vendors of hardware and operating systems that want to
bring CA-OpenIngres, the cross-platform version of the database
software, to their systems. Computer Associates will also work
closely with those firms to port the software. Sun Microsystems
Inc. will be the first to take part in this program, the company
announced.
The company will also reward value-added resellers (VARs) for
pushing Ingres by returning to them as much as 10 percent of the
license fees it receives for licenses they help to sell, plus
quarterly bonuses based on volume. The resellers can also get as
much as 75 percent of Ingres marketing costs paid by CA, and
those certified as Ingres VARs can now become VARs for CA's
Unicenter systems management software without paying initiation
and training fees.
All this is part of an effort to improve on Ask Group marketing
that Computer Associates officials described as "anemic."
Predrag Dizdarevic, senior vice-president for research and
development at CA, also announced that the new Unix version of
CA-OpenRoad, the company's object-oriented application
development software, is ahead of schedule and will enter beta
testing this month instead of in the first quarter of 1995 as
planned. It will ship at the end of March, CA said. OpenRoad for
Microsoft Corp.'s Windows 3.1 and Windows NT is to be available
by Christmas, Dizdarevic said.
(Grant Buckler/19941206/Press Contact: Bob Gordon, Computer
Associates, 516-342-2391; Public Contact: Computer Associates,
tel 516-342-5224, fax 516-342-5329)
baze.podataka.500fancy,
ŮŢ> Database Related Journal
Da li si _baš_ siguran da si poslao to što si napisao..?
baze.podataka.501mdrazic,
I ove godine je održan u USA "1994 Developers Competition & Advisor
Developers Conference" takmičenje u brzini pravljenja aplikacija iz
oblasti baza podataka. Prijavljeno je bilo na stotine dvočlanih timova
koji su koristili razne alate: client/server, UNIX, Windows, Clipper,
Fox, Magic, Progress, Oracle,...
Prva dva mesta su osvojili timovi koji su koristili Clipper sa "UltimADE
application development environment" paketom koji proizvodi neka Belgijska
firma sa sedištem (i) u USA. Trećeplasirani su koristili Progress, a
četvrti, peti i šesti su radili u Magic-u (prošle godine je Magic bio
prvi).
Procentualno je više timova koristilo Windows alate nego DOS alate, ali
sedam od prvih deset mesta zauzele su DOS aplikacije
Milan
baze.podataka.502mdrazic,
U oktobarskom broju "Data Based Advisor" časopisa koji se bavi bazama
na PC opremi podelili su nagrade i pohvale. Ukratko ću navesti pobednike
i pohvaljene (u zagradi) u kategorijama (na engleskom, da ne prevodim i
bez punog naziva proizvoda ako je poznat):
BEST:
NEW:
new product: Access (BandIt, FoxPro)
new database manager: Access (FoxPro)
new development product: PowerBuilder (FoxPro)
DOS:
database manager: FoxPro (Clipper)
application development tool: Clipper (FoxPro)
database publishing tool: R&R, Ventura
text/program editor: Multi-Edit (Brief, QEdit)
WINDOWS:
database manager: FoxPro (Access, Paradox)
application development tool: FoxPro (Visual Basic)
database publishing tool: Ventura (Crystal Reports)
text/program editor: MS Word
add-on: FoxFire
CLIENT/SERVER:
front end development tool: PowerBuilder (Visual Basic, Gupta SQLWindows)
back end/database server: Oracle, Sybase SQL Server, Microsoft SQL Server
network operating system: Novell NetWare
server operating server: Windows NT (Novell NetWare)
application development tool: PowerBuilder (Visual Basic, Clipper)
THIRD PARTY TOOLS AND UTILITIES:
access add-on: (Code.Print Pro for Access, Intersolv Database Library,
Total Access Analyser)
C/C++ database library: CodeBase
Clipper-add-on: Telepathy
code/function library: FUNCky (Grumpfish Library)
database recovery tool: dSalvage Professional, Norton Utilities
dBASE add-on: R&R Report Writer
documentation tool: TechWriter
FoxPro add-on: Foxfire!
graphics tool for a database manager: dGE (Flipper)
linker: Blinker
lotus notes add-on: (PowerBuilder for Lotus Notes, VB/Link for Lotus Notes)
network library: NovLib (NetLib)
paradox add-on: ObjectSpy
powerbuilder add-on: PowerTOOL
report writer: R&R Report Writer (BandIt, Crystal Reports)
telecommunications tool for a database manager: Telepathy
user interface/screen design tool: Stage
visual basic add-on: VBAssist (SIxBase/VB)
BEST OF BREED: (ono što nije klasifikovano pod gornjim klasama)
database driver: Comix (SIx Driver)
cross platform development tool: FoxPro
query tool: Access (Grumpfish Reporter)
C/C++ compiler: Borland C++ (MS Visual C++)
CASE/design tool: ERWin (EasyCASE)
UNIX database manager: Oracle (Sybase SQL Server, Informix-OnLine)
object-oriented programming language: Clipper with Class(y) (Borland C++,
SmallTalk/V)
database accounting software: SBT Professional Series (AccountMate)
on-line help: Expert help
technical support: Telepathy
developer program: Microsoft Developer Network
Eto toliko. Nadam se da ovo neće započeti rasprave tipa: moj ... je
bolji od tvog ... tri puta.
Milan
baze.podataka.503mdrazic,
Još nešto korisno i interesantno za one koji razmišljaju o moćnijim
sistemima od jedne PC mašine.
Choosing a databased server (decision tree):
Y Y
Single-user ─────────── Upsizing soon ────────── (2)
│ │N
│N (1)
│ N Y
>16 users ─────────── Multiple concurent ───── (2)
│ updates
│Y │N
│ (1)
│ N Y
>200 users ─────────── High availability ───── (3)
│ required
│Y │N
│ (2)
│ Y
Need to preserve ─────── (5)
mainframe
│
│N
│ N
High performance ─────── (3)
required
│
│Y
│ N
Willing to be on ─────── (3)
cutting edge
│
│Y
│
(4)
Legend:
(1) Intel-based, single-user with LAN filesharing option
Pros: Inexpensive, easy-to-use
Cons: Non scalable
(2) Intel-based, uni-processor, workgroup server
Pros: Scalable
Cons: Moderate robustness
(3) RISC-based, uni-processor, UNIX departmental server
Pros: Robust, scalable
Cons: Learning curve for UNIX
(4) Multi-processor, parrallel execution, departmental/enterprise server
Pros: Optimum performance
Cons: Newest technology
(5) Mainframe enterprise server
Pros: Preserves mainframe investment
Cons: Difficult to scale
Zaključak: mainframe kompjuteri se koriste samo ako ih već imate, niko
pametan ne nabavlja mainframe radi baza podataka OSIM u vrlo malom broju
izuzetnih slučajeva sa OGROMNIM bazama (a i to je pitanje).
Milan
baze.podataka.504misa.m,
>> Kako da otkrijem je li IDX ili TAG u CDX indeksiran po UNIQUE ?
Mislim da je jedini način LIST STAT u file pa dalje sa Low-lewel funkcijama.
baze.podataka.505ndragan,
/ To se i ja spremih da mu kažem, ali mislim da čovek ni ne koristi
/ Fox4Win :)
To nešto drugo što on koristi valjda ima neku sintaksu za istu stvar,
pošto pretpostavljam da se u stvari radi o maskiranom pozivu nečega iz
system.dll ili sličnog, a i da iskoristim priliku da (pozdravim čiku)
kažem našima kako se to u foksu rešava.
baze.podataka.506ndragan,
/ jedinstvenim nazivima u dir (REPORT FORM TO file), pa ih kokni na LPT2
Malo lepše od ovoga: mreža mi nema mrežni štampač, pošto je server negde
u podrumu, nego se koriste mali oki320 lokalni štampači. Od spulera se
nigde ne spominje ni q, a novel mi opet ne da da otvorim lokalni lpt1 na
radnoj stanici kao fajl za lele i/o.
Nije bitno, radi ovako, jedino se meni više sviđalo _onako_.
baze.podataka.507ndragan,
/ sve funkcije za rad sa indeksima, ali ne ide. To mi treba za jedan
/ mali recnik
Imaš uz moju poruku #468 strukturu .idx fajla, čini mi se da se tamo
spominje neki bajt u zaglavlju (ne sećam se tačno).
Sam fajl nemam kod sebe, a knjiga će mi ponovo biti pri ruci dogodine.
baze.podataka.508ppekovic,
>> Mali uporedni test prfomanci FoxPro-a 2.6 na tri platforme. Za test
>> je korišćena datoteka artikala sa ukupno 39322 slogova indeksirana
>> po sifri C(9) i nazivu C(30).
Pošto se kod nas prenose SCO news grupe, ovih dana pratim
diskusiju o FoxPro-u za Unix. Ima mnogo pritužbi na račun
implementacije na Unix-u. Pre svega, primedba se odnosi na brzinu
rada sa terminalima, kao i neke probleme sa flow kontrolom. Dalje,
nekoliko korisnika se žalilo da je stari FoxBase+ brži u odnosu na
novi FoxPro.
Paya
baze.podataka.509max.headroom,
> Bug or feature? U svakom slučaju, zbog ovoga ne treba
> koristiti unique!
Gastone, i ja sam istog mišljenja. Za ono što ti je potrebno (znam iz
mail-a) nemaš preke potrebe za UNIQUE poljima. Jednostavno traženi po-
datak "proveri" sa SEEK, pa ako postoji - nemoj raditi APPEND ili šta
ti je već potrebno. Na primer:
IF .NOT. SEEK(ključ)
APPEND BLANK
....
ENDIF
Pretraživanja sa SEEK su izuzetno brza (pogledaj par mojih poruka u
temi vezane za pretraživanja), tako da i u bazi od nekih 100.000 zapi-
sa podatak pronalaziš u trenutku.
baze.podataka.510mzdravkovic,
>>> Fox4w: vidi help za "set palette" - on ili off zadrzava
>>> sistemsku paletu odnosno preuzima paletu sa slike (ne znam
>>> koje je za on a koje za off).
>>
>> To se i ja spremih da mu kazem, ali mislim da covek ni ne
>> koristi Fox4Win :) BTW, SET PALETTE ON - ukljucuje Fox-vu
>> default paletu, dok
Tacno. Ne koristim Fox4Win, vec DBase for Windows. Glavni problem je sto
pri prikazu slike, broj boja je smanjen i time je slika osakacena. Ovo se
desava sa slikama koje imaju 256 i 128 boja, a svi primeri koji su dosli
uz program su u 16 (ili manje boja) pa kod njihovog prikazivanja nema problema.
Da li je moguce da ova prva verzija DBase-a za Windows jos ne moze da podrzi
256 boja ?
baze.podataka.511ndragan,
/>> Append sa CDX Size: 2.649KB Time: 69,240 55,240 134.330
/ WIN najbrži??? (((:
Win je u ovom testu najbolje prošao jer:
- ga je pisao gazda Bidža i dao mu da gazduje memorijom kako hoće,
tako da se cela priča događa negde na tavanu, u gornjim megabajtima. Za
bilo kakvo testiranje produžene verzije foksa (dakle FoxproX, FoxproW)
je od bitnog značaja da li je sa rečenom bazom bilo šta rađeno pre testa
- ne bih se čudio da gomilu stvari odrade interni keševi samog foksa
itd, te da cela baza ostane u memoriji.
- Dos verzija ima da mulja sa ekstenderom (ili sa EMS drajverom),
juniks ima i druga posla oko operativnog sistema (nikad ne spava),
jedino pod prozorom može pošteno da zajaši gornje megabajte i da se
ljudski razbaškari.
- ovde nema šta da radi sa ekranom, te mu osnovni maniri nisu došli
do izražaja ;>
--: ceterum censeo, dos mašinama bi trebalo dati memoriju
baze.podataka.512ndragan,
/ FoxPro add-on: Foxfire!
A jel' neko video to čudo? Šta je to?
baze.podataka.513nbatocanin,
> / FoxPro add-on: Foxfire!
>
> A jel' neko video to čudo? Šta je to?
"FF is a report generator designed for people who need FoxPro queries
or reports fast - without the complexites of programming. FF enables
you to work from multiple xBase databases using familiar 'natural
language' names for data. FF seamlessly integrates into existing
applications. FF's data dictionary lets you store join expressions,
field definitions, privileges and printer information in a set of DBF
files. Storing join conditions means users are freed from setting
relations before running each report. Produce detail, summary and
cross tab reports, browses, text merges, and data files (ASCII, DBF
and several spreadsheet formats). Available in end-user and developer
versions for DOS, Win and Mac."
baze.podataka.514max.headroom,
> Da li si _baš_ siguran da si poslao to što si napisao..?
:) Da se ispravim - nije "Journal", kako sam naveo, već skup rutina
pisanih za XBase. Pošto sam stvar skinuo sa MR-Systems-a, bačih pogled
na prvih par stvari u arhivi, te rekoh - možda će nekoga zanimati. Kad
ono, ispade da od "žurnala" nema ništa. Dakle, samo programski prime-
ri. Veliko izvinjenje svima koji su fajl skinuli i ustanovili da nedo-
staje i nešto "pisanija".
P.S.
Videh na MR-Sys-u podosta softvera, što bi se reklo, "database rela-
ted", ali me linija nije najbolje poslužila. Ako budem nešto od svega
toga skinuo - ostaviću ovde, uz obećanje da, kao file-description,
isečam deo originalnog .DOC fajla iz arhive. Izvini još jednom.
baze.podataka.515mdrazic,
> / FoxPro add-on: Foxfire!
>
> A jel' neko video to čudo? Šta je to?
Baš gledam reklamu pa mi opet nije jasno. Izgleda mi da je to neki
data dictionary koji sadrži definicije polja, relacije među tabelama,
konfiguracije printera, korisničke privilegije i da se te informacije
mogu iskoristiti iz aplikacije pri generisanju izveštaja i slično.
Kažu da može da generiše FoxPro SQL kod za upite/izveštaje koji koristi
(tj. organizuje kod da koristi) Rushmore.
Prodaje se za DOS, Windows i Mac. Cene:
Developers Edition (source code & distribution rights)
Single Platform $295
Any 2 Platforms $499
All 3 Platforms $699
Compiled version (no distribution rights)
Single User $89
10 User LAN $195
25 User LAN $395
Unlimited LAN $795
Demo Disk FREE
S&H $25 (valjda za proizvod, ne za demo)
Adresa:
Micromega Systems, Inc.
832 Baker Street
San Francisco, CA 94115
tel: 415-346-1461
fax: 415-346-6804
CompuServe: 73354,174
Dalje vidite, pa javite rezultate.
Milan
baze.podataka.516mdrazic,
>> Da li si _baš_ siguran da si poslao to što si napisao..?
>
> :) Da se ispravim - nije "Journal", kako sam naveo, već skup rutina
> pisanih za XBase. Pošto sam stvar skinuo sa MR-Systems-a, bačih pogled
Izgleda da je to prateći sadržaj za sam žurnal sa primerima i
potrebnim tabelama, kao malo bogatiji RSOFT. Primetio sam da
su izdavačke kuće prestale da šalju ovakve sadržaje na BBS-ove
i da ih za debele pare šalju uz magazin na pratećoj disketi koju
još popune raznim demo softverom.
Milan
baze.podataka.517misa.m,
>> Pošto se kod nas prenose SCO news grupe, ovih dana pratim
>> diskusiju o FoxPro-u za Unix. Ima mnogo pritužbi na račun
Ima li je na fonu, nisam uspeo da je nađem?
baze.podataka.518misa.m,
>> Win je u ovom testu najbolje prošao jer:
Moguće da je direct file access "krivac".
baze.podataka.519misa.m,
FoxPro 2.6 bug?
1. Prilokom definisanja SKIP FOR uslova za POPUP PAD ako koristite
funkciju ...SKIP FOR !USED("alias") Windows verzija prikazuje
sistemski prozor sa porukom "Alias not found". U dosu se to ne
dešava. Da li se radi o bagu ili je moja verzija za win pomalo
zastarela?
2. Ako liniju komentara završite sa ";" fox će i sledeću komandu
proglasiti komentarom. Zgodno kada treba privremeno isključiti
komandu pisanu u više redova ali sam ja 15 minuta pokušavao da
shvatim šta mi se desilo u programu.
Nas koji koristimo fox ima dosta na sezamu. Svi mi povremeno naletimo
na neku neobičnost koja je možda bug a možda i ne. Predložio bih da
malo više razmenjujemo ova iskustva, svima će biti korisna. A možda
jednog lepog dana i ljudi koji na sezam dovlače tone raznih patch-eva
za clipper prenesu i neku od patch baza za fox.
baze.podataka.520mradic,
HELP!
Radim s paketom ''FoxPro 2.6 for Windows''. U
potrazi sam za gotovim rutinama (funkcijama i
procedurama) koje bi mi olaksale neke zamorne i ucestale
poslove, recimo, kod genetisanja maski i sl. Moze li me
neko uputiti na mesto gde postoji izbor takvih ShareWare
rutina (BBS, CD...)? Mozda ti ima i neko od vas? ;)
Hvala! :)
baze.podataka.521ppekovic,
>>>> Pošto se kod nas prenose SCO news grupe, ovih dana pratim
>>>> diskusiju o FoxPro-u za Unix. Ima mnogo pritužbi na račun
>>
>> Ima li je na fonu, nisam uspeo da je nađem?
Grupe biz.sco.general i biz.sco.opendesktop
Paya
baze.podataka.522ndragan,
/ 2. Ako liniju komentara završite sa ";" fox će i sledeću komandu
/ proglasiti komentarom. Zgodno kada treba privremeno isključiti
:) It's a feature, al' ne pitaj koliko sam se puta i ja zezno prethodnih
godina...
Sad se setih još nečeg: kako iščupati pikčer string pod kojim radi
trenutno aktivni GET? Dok su bila obična polja, bilo je đene-đene, ali
otkako se u tim stringovima nalaze čitavi romani (istina, max 255 chr),
često mi zatreba da taj string iščupam.
baze.podataka.523zorani,
## Nas koji koristimo fox ima dosta na sezamu. Svi mi povremeno
## naletimo na neku neobičnost koja je možda bug a možda i ne.
## Predložio bih da malo više razmenjujemo ova iskustva, svima će biti
## korisna. A možda jednog lepog dana i ljudi koji na sezam dovlače
## tone raznih patch-eva za clipper prenesu i neku od patch baza za
## fox.
Fajlovi za pačovanje DOS i WIN foxa na verziju 2.6a se nalaze na
Microsoft Download Service BBS-u. Podugački su. Spisak bagova koji su
ispravljeni vezan je uz ovu poruku a evo i sadržaja readme.1st fajla
iz fox direktorijuma:
=====================================================================
Introduction
------------
This file contains the current list of files required to patch
version 2.6 of of FoxPro, FoxPro add-ons and the FoxPro
Distribution Kits to the latest version, which is FoxPro 2.6a.
Some previously reported problems have been fixed in FoxPro
2.6a. A complete list of fixes incorporated into FoxPro
2.6a is outlined in the CHG26a.TXT file in the library where
you downloaded this file.
If you are not experiencing one of the problems mentioned in the
CHG26a.TXT file, then you do not need to upgrade to FoxPro 2.6a.
To update your current copy of FoxPro, you will need to download
the appropriate files from this library.
Products which can be patched
-----------------------------
Patches are available for Version 2.6 of FoxPro for Windows and
version 2.6 of FoxPro for MS-DOS. Patches are not available for
any earlier versions of FoxPro for Windows or FoxPro for MS-DOS.
Patches are not available for FoxPro for Macintosh or FoxPro for
UNIX. If you have a version of FoxPro for Windows or FoxPro for
MS-DOS that precedes version 2.6, and you wish to upgrade to
version 2.6a, please contact the Microsoft Sales & Customer
Service office in your country. In the United States, Microsoft
Sales & Customer Service can be reached at (800) 426-9400.
What files should be downloaded?
--------------------------------
If you have FOXPRO FOR WINDOWS version 2.6
(WITHOUT the Distribution Kit), download the
following file (REQUIRED IF YOU HAVE THIS
PRODUCT):
FPW.EXE
If you have FOXPRO FOR WINDOWS version 2.6
(WITH the Distribution Kit), download the
following file (REQUIRED IF YOU HAVE THIS
PRODUCT):
FPW_DK.EXE
If you have FOXPRO FOR MS-DOS version 2.6
(WITHOUT the Distribution Kit), download the
following file (REQUIRED IF YOU HAVE THIS
PRODUCT):
FPD.EXE
If you have FOXPRO FOR MS-DOS version 2.6
(WITH the Distribution Kit), download the
following file (REQUIRED IF YOU HAVE THIS
PRODUCT):
FPD_DK.EXE
If you have the CONNECTIVITY KIT for FoxPro
for MS-DOS, or you have the CONNECTIVITY KIT
for FoxPro for Windows, or you have the
PROFESSIONAL EDITION of FoxPro for MS-DOS,
or you have the PROFESSIONAL EDITION of
FoxPro for Windows, download the following
file (REQUIRED IF YOU HAVE THIS PRODUCT):
CK.EXE
If you wish to update the FOXSTART.APP, or
MIGRATE.APP files download the following
file (this is optional):
APPS.EXE
If you wish to update the DBF style help file, for
use with FoxPro for MS-DOS, download the following
file (this is optional):
DBHLPD.EXE
If you wish to update the DBF style help file, for
use with FoxPro for Windows, download the following
file (this is optional):
DBHLPW.EXE
If you wish to update the FOXAPP files,
download the following file (this is optional):
FOXAPP.EXE
If you wish to update the Windows Help (HLP) help file
for FoxPro for Windows, download the following file (this
is optional):
FPWHLP.EXE
If you wish to update the DRIVER2.FLL,
GEN_PD.PRG, GENPD.APP, GENPD.PJT, or GENPD.PJX
files, download the following file (this is
optional):
GENPD.EXE
If you wish to update the GENGRAPH.APP,
GENMENU.PRG, GENSCRN.PRG, GENXTAB.PRG,
or TRANSPRT.PRG files, download the
following file (this is optional):
GENS.EXE
If you wish to update the CATALOG MANAGER
and WIZARDS, download the following file
(this is optional):
WIZCAT.EXE
How to proceed
--------------
1) Place the file(s) in the directory which contains FoxPro
After the appropriate files have been downloaded, copy the
files into the directory where version 2.6 of FoxPro resides.
Example: If you have FoxPro for Windows 2.6 without
the distribution kit, and it is installed in
"c:Đfpw26", then you should download the file
FPW.EXE and place that file into the c:Đfpw26
directory then execute it.
2) Execute one of the 'required' files
Change to the directory which contains the copy of FoxPro
that needs to be patched and also contains the patch
file (one of the following: FPW.EXE, FPW_DK.EXE, FPD.EXE,
FPD_DK.EXE).
Execute the patch file by typing its name at the MS-DOS
prompt.
When you execute the file, several files will be created,
including a file called PREADME.TXT. The file PREADME.TXT
contains instructions which will tell you how to apply
the patches.
PLEASE READ THE PREADME.TXT FILE BEFORE PROCEEDING. IT
CONTAINS IMPORTANT INFORMATION ABOUT THE PATCH PROCESS.
==================================================================
chg26a.zipbaze.podataka.524max.headroom,
> 2. Ako liniju komentara završite sa ";" fox će i sledeću
> komandu proglasiti komentarom. Zgodno kada treba
> privremeno isključiti komandu pisanu u više redova ali sam
> ja 15 minuta pokušavao da shvatim šta mi se desilo u
> programu.
Ma, ja. To mu dođe concatenation character. Mnogo očiglednija varija-
nta je, kao prvi znak u redu, udariti '*' ili '***', što liniju pro-
glašava komentarom, te je i ne izvršava. žesto sam po sorsovima video
sledeću situaciju:
REPLACE a WITH 1 ;
b WITH 2 ;
c WITH 3
Bljak :) Ako dođe do greške, locira se samo REPLACE komanda - i nada-
lje je sve isključivo do tebe (možda je polje 'a' u bazi obrisano,
možda polje c nije numerik tipa, itd). Sa zdravo mnogo kucanja, ali i
mirnijim snovima, ovo radi istu radnju:
REPLACE a WITH 1
REPLACE b WITH 2
REPLACE c WITH 3
baze.podataka.525rmatijevic,
> Postoji grupa Clarion pa ako si zainteresovan javi se:
svojevremeno je ostavljena poruka, pa ako je grupa još aktivna zainteresovan
sam za pristup, a ako nije predlažem da formiramo istu.