baze.podataka.102mjevta,
-> #98, djelovic>> 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,
-> #98, djelovic> 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,
-> #98, djelovic>> 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,
-> #97, dkrstic>> 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,
-> #103, spantic│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,
-> #103, spantic> 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,
-> #93, sikima> 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,
-> #93, sikima> 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,
-> #96, lkudlik> Da li neko ima na disketi u vezi ORACLE-a nesto ?
-------
Trebace ti nesto vise od diskete ;)
baze.podataka.111spantic,
-> #106, bulaja> 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,
-> #107, djelovic> 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,
-> #108, djorzor> 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,
-> #113, neman│> 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,
-> #114, dcolak> Mada, kada vidim sta sve ljudi rade na XT-u sa ORACLE-om..
Mazohisti ???
baze.podataka.116nbatocanin,
-> #107, djelovic> 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,
-> #115, neman│> 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,
-> #109, neman>>> 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,
-> #111, spantic> 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,
-> #119, nbatocanin> 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,
-> #123, peca.stŮŢ> 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,
-> #123, peca.st#=> 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,
-> #123, peca.st> 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,
-> #125, vitez.koja█ 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,
-> #127, peca.st>> 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,
-> #132, sinfosU 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,
-> #132, sinfos> 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,
-> #135, jolicm> 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,
-> #135, jolicmŁ 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,
-> #131, bulaja>> 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,
-> #132, sinfos> 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,
-> #144, mmitrovic>> 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,
-> #132, sinfos=> 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,
-> #105, ppekovicIma 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,
-> #146, dr.grbaŮ█▀█Ţ 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,
-> #149, mmitrovicTrenutno 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,
-> #149, mmitrovic║║ Ů█▀█Ţ 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,
-> #65, zakic/ 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,
-> #86, isimic/ 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,
-> #156, iritel> 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,
-> #158, ndragan> 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,
-> #157, djelovic>>> 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,
-> #160, iritel> 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,
-> #159, djelovic/ Š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,
-> #161, djelovic>> 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,
-> #157, djelovic=> 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,
-> #166, ikordic> Ima li neko iskustva sa ovim? Komfor, brzina, pozdanost, neka paralela sa
> Clipper-om, ...
Nije ni do kolena Clipperu.
baze.podataka.168nbatocanin,
-> #160, iritel> 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,
-> #162, ndragan#=> 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,
-> #168, nbatocanin>> 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,
-> #170, iritel│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,
-> #170, iritel>>> 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,
-> #181, max.headroom> 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,
-> #182, djelovic> 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,
-> #184, max.headroom> - 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,
-> #184, max.headroom>> 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,
-> #184, max.headroomJa 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,
-> #175, milanv 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,
-> #188, milanv> 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,
-> #184, max.headroom> - 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,
-> #193, mdrazic> 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,
-> #184, max.headroom> 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,
-> #169, vitez.koja> 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,
-> #197, djelovic│> 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,
-> #196, feniks>> 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,
-> #196, feniks>> 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,
-> #199, dr.grba│ 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,
-> #198, feniks> Hvala na pointeru, valjda ću pronaći tamo...
Ako ne nađeš, podseti me da spustim u konf.
baze.podataka.203max.headroom,
-> #194, djelovic> 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,
-> #203, max.headroom> 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,
-> #208, djelovic> 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).