clipper.206bceklic,
POtreban mi je neki pointer na temu kako klipper prenosi parametre
asm kodu. Uz clipper se dobija primer kako se radi ali je ocigledno pisan
za kompajliranje sa masm-om jer tasm izbacuje gomilu upozorenja. Ukljucna
datoteka sadrzi makroe za CLfunc,Clcode,CLret sto bi trebalo da bude sasvim
dovoljno za ok rad ali tasm nece ni da cuje. Ugradjivao sam yu font direktno
u clipper program pomocu asm funkcija koje sam pisao (za instaliranje i
resetovanje fonta). Sam problem sam resio bez problema jer nisam prenosio
nikakve parametre niti funkcije vracaju bilo kakve parametre. Samo sam
vodio racuna o tome da sacuvam stek i registre, ostalo je klasican asm kod
pri cemu su mi funkcije deklarisane kao private. Blinker takodje nije pravio
probleme. Za vracanje parametara za sada koristim _retNI() i sl.
Dakle, kombinacija Tasm,Blinker,EXTENDA.INC sa prenosenjem parametara.
Uzgred, da li neko ima ideju kako neterati Blinker da sav overley strpa u
OVL fajl a da sam EXE ne sadrzi overlay? POstavljajuci Section Into blinker
ipak ostavi jedan mali deo (oko 5 kb, mali exe program nisam siguran o cemu
se radi, sadrzi nekakvu tabelu(najverovatnije ukazuje na OVL))
POzdrav!
clipper.207bulaja,
-> #197, snemcev│U Nanfor-u 3 nema funkcije FT_FLOPYTST (ili kako se već zvaše).
│Slučajno ili namerno?
└───
Nedostaje još nekoliko funkcija - do sada sam primeio da fali
FT_HandCount() (ništa strašno) i ceo skup FT_F* funkcija (za rad
sa tekst datotekama, ovo je već stvar koja se češće koristila).
Pretpostavljam da za FT_F* nisu stigli da naprave PM kompatibilnu
verziju (doduše takvu stvar više nema ni svrhe raditi osim kao RDD),
a ove druge su možda suviše prljave - ipak s obzirom da je FlopyTst
pisana u ASM, pokušaj da ulinkuješ verziju iz 2.1 (javi da li radi
u PM:).
clipper.208mdrazic,
-> #196, dzoric> kojem sistemu treba dati prednost. Ako su tabele zavisne jedna
> od druge bolje ih je imati sve otvorene, narocito ako su
> azuriranja transakciono orijentisana jer transakcija mora
> trajati sto krace. Ako su u pitanju tabele koje se retko
Sigurno da pre početka transakcije moraš imati sve tabele otvorene
(i lokotiro šta treba!) ali ne moraju biti i tabele koje nemaju
veze sa poslom koji se trenutno radi. Na početku diskusije je
pomenuto rešenje da se sve tabele otvore na POžETKU aplikacije,
protiv čega su neki izneli svoje argumente protiv.
Milan
clipper.209mdrazic,
Evo nekih odgovora za probleme sa SIx-om.
Preko cele strane SuccessWare objavljuje otvoreno pismo gde se posipa
pepelom za ranije verzije i hvali novu verziju SIx Drivera.
Ukratko. Kažu da je verzija 1.0 bila čist hakeraj uz pomoć inverznog
inženjeringa Clipper koda da vide kako bi trebao da radi RDD sistem.
Pošto nisu imali želju ili vremena za inverzni inženjering VM sistema
nisu se ni javljale VM greške, ali je kod bio veći. Da bi smanjili
kod, od 1.1 su uveli korišćenje VM-a za alokaciju memorije. I od tada
SIx počinje da puca jer je to razotkrilo i druge greške pri projektovanju
celog sistema. RDD kada je konačno dokumentovan je ispalo da (treba da)
radi drugačije nego što su oni mislili, a bilo je kažu i drugih grešaka.
Osamnaest meseci su ispravljali bagove i krpili gde 'curi' sve dok nisu
ceo kod projektovali i napisali od početka poštujući specifikacije za
RDD i ostalo. Rezultat je verzija 2.0 (2.01) za koju trvde da je
žestoko testiraju pre završetka za razliku od ver 1.x koju su testirali
mnogo površnije.
Sada nude besplatno ko hoće SIx Driver na 30 dana na probu i uz to
besplatno HiPer-SIx RDD.
Izgleda da ih onaj Comix baš guši. (moja primedba)
Milan
clipper.210bceklic,
-> #200, mdrazic> Z .., .. get Obelezje picture '99999'
> when True( Poruka('Samo pozitivni brojevi, molim!') ) ;
> valid Obelezje > 0
Moje pitanje nije bilo dovoljno jasno. Kada sam spominjao validaciju
i kodne blokove nisam mislio na proste validacije. POkusacu da razjasnim
celu stvar....
Naime napisao sam univerzalne funkcije za dodavanje i brisanje podataka
iz neke baze. Ovim funkcijama se prenosi ime baze, komentari za get sistem
(njihov broj mora da odgovara broju polja), uslovi za valid get sistema
(u obliku kodnih blokova koji sadrze funkcije o kojima ce biti reci nesto
kasnije). Komentari i valid opcije se prenose kao indexiran promenjljive.
Funkcije za dodavanje i brisanje vrse isctavanje prozora u meni sistemu
na osnovu poznatih velicine (komentara za get, kao i duzine polja u bazi)
a potom uspostavljaju get sistem cije valid opcije sadrze prenete kodne
blokove kojima se kao argument prenosi promenjljiva koja se trenutno unosi.
Valid kodni blokovi najcesce sadrze pozive odredjenim funkcijama.
Obicno se radi o funkcijama koje vrse proveru jedinstvenosti kljuca pri
dodavanju ili provere postojanja nekog podatka pri brisanju. Ovo su
najednostaviji slucajevi. Cesto se desava da ove funkcije sadrze gomilu
uslova koje uneti podatak treba da zadovolji i sto je najvaznije omogucavaju
korisniku da ako pogresi moze lako da dodje do tacnog podatka.
Npr. Korisnik pokusa da unese neku vrednost. Funkcija izvrsi sve
jednostavnije provere i ukoliko nisu zadovoljeni svi uslovi pokusa da
pomogne korisniku da dodje to tacnog podatka. Tako se u nekim slucajevima
moze desiti da je potrebno omoguciti korisniku koji je uneo pogresan
podatak da browsuje odgovarajucu bazu po nekoliko uslova.
Citav ovaj sistem je dosta komplikovan i ide dosta u dubinu. Ukoliko se
prvi korak izvede kako treba kod za operaciju dodavanja ili brisanje podataka
bi mogao da bude veoma kratak. Definisu se odgovarajuce indexne promenjljive
i proslede funkciji.
Same funkcije vode racuna i o mnogim drugim stvarima a sustina svega
ovoga je pokusaj da se izbegne ponavljanje istog koda u mnogim delovima
programa sto je u clipperu tako cest slucaj.
Nadam se da sam sad bio malo jasniji....
Pozdrav!
clipper.211bceklic,
-> #201, mdrazic> Ja retko eksplicitno koristim set relation komandu. Vise
> volim sam sa trazim CHILD->( dbseek( Kljuc S,.t.C ) ) kada
> treba.
I ja koristim isti princip. Relacije do sada nisam ni
upotrebljavao. Ovaj nacin je brzi i nije nikakav problem za
izvodjenje (cak je i laksi)
> U mojim aplikacijama dok si u meniju sve je zatvoreno. Kad
> pokrenes neki modul iz menija, za njega otvorim sve tabele i
> potrebne indekse (pazi, potrebne, ne obavezno sve) a pri
> napustanju modula sve to lepo pozatvaram da bude urednije od
> moga stola, za sobu i da ne pricam :)
Dvoumio sam se izmedju tvog i principa koji trenutno koristim.
Kako vidim da vecina ovde koristi otvaranje po potrebi izvrsicu
potrebne korekcije. Bojim se da ce mi za to sada trebati dosta vremena
(projekat mi je odmakao)
POzdrav!
clipper.212bceklic,
-> #203, dvesic> Stvar ukusa i resursa. Ako je mali broj baza u pitanju, ovo
> resenje je ok. Ako je veliki broj baza ili mrezno okruzenje, to
> ce usporiti rad programa.
Ajde da probamo da definisemo to "mali broj baza"? Koliki je
prosecni broj baza i indexnih fajlova u tvojim programima (naravno
orjentaciono, jer ovaj broj zavisi od velicine projekta)
Uzgred kako sam ja asm coder koji trenutno radi u cliperu
interesuje me na koji nacin organizujes pisanje programa? Da li
npr. za svaku stavku iz menija radis poseban .prg ili recimo za
svaki meni box (par opcija). Ja za sada koristim ovaj drugi princip,
pri cemu pojedniacni .prg bude oko 20k.
POzdrav!
clipper.213mileusna,
-> #196, dzoric>> A kako ti kod sistema OPEN-CLOSE resavas ovaj problem ???
Ja posle svakog upisa pozovem DBCOMMIT(), a može i DBCOMMITALL(). U NG-u se
savetuje da se, pri radu u mreži, DBCOMMIT() poziva pre upotrebe UNLOCK komande
Što se tiče otvaranje datoteka, radim slično kao i mdrazic: tabele otvaram
tek kada se startuje deo programa u kojem će iste biti korišćene. Tako mi se
više sviđa, a i manja je šansa da se program slučajno izgubi u bezbroj baza i
indeksa.
clipper.214snowwhite,
Pomagajte drugovi, i to sto pre jer je hitno!
U ruke mi je pao R104, i u njemu Clipper savetnik.
Covek dao dobre ideje, ali ima jedna specificnost
koja nije obradjena.
Ja isto imam datoteku sifarnika i datoteku stanja
kao sto je u tekstu.Da se nepotrebno ne bi pojavlji-
vao naziv artikla na x mesta, naziv artikla se nalazi
samo u sifarniku (sto je i logicno), te je veza izvedena
preko sifre artikla.
E sada ono najvaznije.
Korisnik hoce da lista stanje magacina, i to po
abecednom redu, sto automatski onemogucava bilo
kakve relacije STANJE->ROBA. Sada nije ni to
problem vec ovo. U sifarniku se nalazi 3393(tacna
cifra) artikala , a na stanju je 800 artikala.
Covek nece da se zamara da gleda silne nuletine
u kolonama tabele stanja, vec hoce samo one
stavke koje se nalaze na Stanju.
Na pamet mi je padala ideja da se obrisu svi slogovi
koji se ne poljavljuju na stanju, ali to nije to.
P.S. Ukoliko nekoga cudi odnos artikala stanje/sifarnik
u pitanju je apoteka.Uz program isporucujem
gotov spisak lekova, a od apoteke zavisi koliko
ona ima lekova na lageru.
Koristim priliku da se zahvalim ljudima,koji su odvojili
malo slobodnog vremena da mi odgovore na moje prethodno
pitanje uvezi boja i fontova.
Snow.
clipper.215zkrstic,
-> #207, bulaja>> Pretpostavljam da za FT_F* nisu stigli da naprave PM kompatibilnu
>> verziju (doduše takvu stvar više nema ni svrhe raditi osim kao RDD),
>> a ove druge su možda suviše prljave - ipak s obzirom da je FlopyTst
>> pisana u ASM, pokušaj da ulinkuješ verziju iz 2.1 (javi da li radi
Funkcije za rad sa text fajlovima, FTTEXT.OBJ iz Nanfor-a 2.1 rade,
( mala ograda, za sada, već skoro dve nedelje ) kod mene u radnji, znači arče
se u proseku 10 sati dnevno, vezane sa novim nanforom i onim CPMI.LIB-om koji
ide i ulinkovane sa EXOSPACE 1.0F. Tu su još i CA-Tools & Six 201. Da kucnem u
kukavicu... fdercera za sada. Tu i tamo sam primetio problem da mi tastatura na
jednom nodu malo luduje... ali pritisak na oba SHIFT-a rešava problem.
Pozdrav, Zkr
PS. Ako enkom treba taj FTTEXT, vičite ako ste ga obrisali.
clipper.216zkrstic,
Apropos teorije šta je starije kokoška ili jaje, ili ti kada otvarati baze,
na početku ili kada treba, evo malog priloga:
- sve baze se otvaraju na početku
- izuzetak koji potvrdjuje pravilo - pojedine (exclusive) lične ili ti
temp bazew otvaram kada mi trebaju
Kao prilog ovoj teoriji, postavljam jedno prosto pitanje: Ako uzmemo da
otvaram baze kada mi trebaju, program radi u mreži, šta kada neko zapne da radi
reindex ili kako nekom dati da radi pack ili slične operacije koje traže
exclusive pristup. Odgovor je semafor, ali probajte da razgrnete malo, nije ni
maaalo naivno rešenje. Najbezbolniji način je s početka, 'apsi sve exclusive,
uradi šta imaš pa uzmi shared. Ako neemože exclusive, uzimaj shared i to je to.
Nema potrebe za preteranim filozofiranjem.
Pozdrav, Zkr
clipper.217dvesic,
-> #214, snowwhite>> problem vec ovo. U sifarniku se nalazi 3393(tacna
>> cifra) artikala , a na stanju je 800 artikala.
>> Covek nece da se zamara da gleda silne nuletine
>> u kolonama tabele stanja, vec hoce samo one
>> stavke koje se nalaze na Stanju.
>> Na pamet mi je padala ideja da se obrisu svi slogovi
>> koji se ne poljavljuju na stanju, ali to nije to.
Nisam siguran da sam dobro shvatio, možda je ovako :
Jednostavno nad tabelama kreiraj indeks npr.
INDEX ON Upper(Naziv_Artikla) FOR Stanje <> 0
pa uradi Browse sa ovim indeksom aktivnim.
Ovim si poređao po abecedi, i elminisao one sa 0 stanjem. Ako je to
to, ok. Ako nije, pojasni mi malkice problem.
clipper.218dvesic,
-> #216, zkrstic>> otvaram baze kada mi trebaju, program radi u mreži, šta kada
>> neko zapne da radi reindex ili kako nekom dati da radi pack
>> ili slične operacije koje traže exclusive pristup. Odgovor je
>> semafor, ali probajte da razgrnete malo, nije ni
Nije ni preterano teško. Na nivou aplikacije postoji flag DozvoliOtvaranje
i rečnik podataka gde uz svaku tabelu stoji lokalni flag DozvoliOtvaranje,
i BrKorisnikaKojiJeOTvorioBazu.
E sad, ako imaš dovoljno prava ;) postaviš generalni flag DozvoliOtvaranje
na false. Prilikom zatvaranja tabele taj generalni flag se kopira u lokalni
na nivou tabele. Sačekaš malo i u trenutku kada su sve tabele zatvorene,
uradiš
ReIndex i Pack.
clipper.219dr.grba,
-> #209, mdrazic>> Ukratko. Kažu da je verzija 1.0 bila čist hakeraj uz pomoć inverznog
>> inženjeringa Clipper koda da vide kako bi trebao da radi RDD sistem.
Sorry, but...
"Inverzni inženjering", "reverzibilni inženjering"....
Izrazi stoje k'o piletu sise. Kao kad bi za švercera rekao "referent
spoljne trgovine".
clipper.220vlaslo,
Da li zna neko sta bi to trebalo da zanci
ADAM: Error opening application catalog
kod CA-VO. Instalacija je ok, ali nista ne radi zbog gornje
greske.
cu Zoli
clipper.221vlaslo,
-> #162, dr.grba> Ne interesuje me cena kod pirata, vec kod dilera. Pod ovim ne
> bas lepim, ali uobicajenim izrazom smatram one koji prodaju
> legalne kopije softvera. Znas, odavno sam naucio da se
> piratskom kopijom programa ne stize jako daleko ili je cena
> stizanja do cilja previsoka.
Ima u Subotici jedan (pre neki dan smo se sreli kod pirata
:-)) ) on je kupio CAVO i poslali su mu prvo pre release
verziju pa onda pravu, obe sa kompletnom dokumentacijom.
Rekao je da bi prodao kopiju disketa ver 1.0a i knjige sa
pre releaseom (kako kaze izmene su neznatne) . Cena je negde
oko 600-700 DM.
Vucem vreme :-)) na zalost ne znam tel tipa, ali ako ima
zainteresovani, raspitacu se...
cu Zoli
clipper.222vlaslo,
Da li neko ima ideju :-)
Gde bih mogao dobiti (kupiti ) exospace i six
Molio bih broj bbs-a ili nekog kome bih mogao platiti
poduzecem.
cu Zoli
clipper.223vlaslo,
-> #204, dvesic>>> Sto se tice pucanja indexa, koliko se meni cini pri nestanku
>>> struje moze doci do ostecenja samo na indexima trenutno
>>> selektovane baze ili one u koju se vrsi indirektan upis preko
>>> aliasa. Isti slucaj je kada se koristi open-close princip?
>>> Sta kazu ostali? Koji princip koristite?
>
> Ja koristim otvaranje po zahtevu : obicno se na nivou jedne
> celine (procedure) otvore sve baze i indeksi za tu i child
> procedure a na njenom kraju se zatvore.
Moja iskustva kazuju da je najbolje koristiti CDX fileove,
iz dva razloga. Zauzima samo 1 handle a ima 49 kjuceva, sa
druge strane (u mrezi ) odmah ljavlja da je greska u indeksu
pa se preusmerenjem errorsys-a lako moze resiti problem.
U lokalu ovo zadnje ne vazi :-((
Inace za gornju svrhu, napravio sam jedan project checker
koji ide sa mojim projektima i kod prvog (usera) poziva
proveri integritet projekta( vise projekta).
A posle sve drzim zatvoreno do zadnjeg momenta i otvaram ih
po potrebi.
cu Zoli
clipper.224d.petrovic,
-> #216, zkrstic> Kao prilog ovoj teoriji, postavljam jedno prosto pitanje: Ako
> uzmemo da otvaram baze kada mi trebaju, program radi u mreži,
> šta kada neko zapne da radi
Nijedna baza nije otvorena u osnovnom meniju. Odmah zatim se otvaraju
SVE koje će trebati.
> exclusive pristup. Odgovor je semafor, ali probajte da
> razgrnete malo, nije ni maaalo naivno rešenje. Najbezbolniji
> način je s početka, 'apsi sve exclusive,
Šta je semafor? Viđevah to svuda, ali mi ne pade na pamet da koristim.
clipper.225mdrazic,
-> #205, dvesic>>> U mojim aplikacijama dok si u meniju sve je zatvoreno. Kad
>>> pokreneš neki modul iz menija, za njega otvorim sve tabele ...
>
> Ovo sam i ja hteo da kažem prethodnom porukom :)
Danas sam prisustvovao prezentaciji jednog softvera koji obrađuje
veću količinu podataka (na disku zauzima 200 MB, min. 50 MB) iako je
sam Clipper EXE manji od 1 MB. Program je pisan tako da je dizajnerski
perfektno urađen, bolji nisam video, radi sve poslove koje treba i
to uz promišljene testove protiv pokušaja varanja sistema (pare su
u pitanju). Izveštaji na laseru izgledaju da bolje nisam video.
Ali. Na ulasku u paket se otvara 70-80 fajlova koji ostaju otvoreni
do izlaska iz paketa. Još gore. Lokotiranje su ugradili u get (!)
sistem, pa zapisuju svako polje ponaosob kad prelaziš na sledeće i
to zovu "zaključavanje polja". Lokotiranje zapisa i tabela su
uglavnom jeres (mada de facto lokotiraju zapis kada menjaju svako polje).
I to su kažu uradili po zahtevu kupca (?!). Još sam se čudio zašto
otvore gomilu šifara sa praznim ostalim sadržajem koji posle popune.
Znači, za upis novih zapisa prvo treba da 'otvoriš' šifru ako već
ranije nije neka 'otvorena' pa onda da tu šifru popunjavaš sadržajem
(i svako polje čini transakciju!). Ovako projektovani sistemi mogu
da se koriste i čak da budu vrlo upotrebljivi, ali pate od odsustva
provere konzistencije na ulazu podataka u sistem i vrlo teško se posle
mogu preneti na neki SQL DBMS zbog ozbiljnih prepravki koje to traži.
Milan
clipper.226bulaja,
-> #214, snowwhite│Korisnik hoce da lista stanje magacina, i to po abecednom redu, sto
│automatski onemogucava bilo kakve relacije STANJE->ROBA. Sada nije ni to
│problem vec ovo. U sifarniku se nalazi 3393(tacna cifra) artikala , a na
│stanju je 800 artikala. Covek nece da se zamara da gleda silne nuletine
│u kolonama tabele stanja, vec hoce samo one stavke koje se nalaze na
│Stanju. Na pamet mi je padala ideja da se obrisu svi slogovi koji se ne
│poljavljuju na stanju, ali to nije to.
└───
Ovo možeš rešiti na više načina, predlažem ti sledeći (koji je dobar
zato što ne zahteva nikakve izmene u sadašnjoj strukturi podataka,
kreiranje novog indeksa i sl.):
1) Kreiraj niz koji sadrži pointere u sifarniku (RecNo()) na sve artikle
kojih ima na zalihama (odnosno imaju ne-nula stanje) kao i nazive
artikala. Znači prvo aktiviraj indeks po stanju (pretpostavljam da ga
imaš:), zatim jedno dbSeek(1) (skače na prvi artikal sa ne-nula tj.
pozitivnim stanjem) i puni niz sve do EOF. Za 800 (verovatno kratkih)
slogova ova operacija neće dugo trajati, u svakom slučaju neoporedivo
kraće od raznih kreiranja indeksa, brisanja, filtera ili sličnih
alternativnih rešenja.
2) Sortiraj (ASort()) niz po nazivima artikala.
3) Kreiraj TBrowse objekat koji umesto Skip, GoTop i GoBottom metoda
skače po bazi na osnovu record pointera iz sortiranog niza, a kao kolone
stavi one kolone koje inače imaš u pregledu sifarnika. To je sve :).
clipper.227bulaja,
-> #215, zkrstic│PS. Ako nekom treba taj FTTEXT, vičite ako ste ga obrisali.
└───
Stari (v2.1) NanForum Toolkit je još uvek (i nemam nameru da ga brišem
odatle:) u R:\CLIPPER direktorijumu (lib, source i sve zarkpe) tako da
kome nešto treba ima ga i tamo :).
clipper.228goxx,
-> #181, bceklic■ > Temp := & 'sdd Obelezje > "' + Var + '" c'
■ >
■ > pa je blok Temp (koji prosledujes kompiliran sa vrednoscu Var a
■ > ne sa referencom na nju.
Ne praktikujem makroe (samo u krajnjoj nuzdi, a ovo to jeste). Međutim, ne
vidim razlog zašto ne bi moglo sa promenljivom.
■ Da li koristis slican princip pri validaciji unetih podataka u
■ get sistemu?
Ja koristim isti princip.
Primer:
1. GET ima u VALID klauzuli poziv funkcije za proveru šifre organizacione
jedinice. pored šifre se posle uspešne provere ispisuje naziv jedinice.
(ovo je već stvar ukusa)
2. funkcija za proveru se sada može pozivati na svim mestima gde je potreban
unos organizacione jedinice (sektor+odeljenje; 2+2 char). u funkciji nije
dozvoljen unos samo sektora bez odeljenja (sektor+"00").
treba obratiti pažnju na poziv funkcije AppChooseCode(), a radi lakšeg
kapiranja parametara evo i strukture datoteke SSB000:
// Organizacione jedinice
SSB000
rsb030 C 2 0 Sifra sektora
rsb031 C 2 0 Sifra odelenja
rsb032 C 30 0 Naziv organizacione jedinice
rsb033 L 1 0 Status (T-izbrisana, F-aktivna)
// index po sifri organiozacione jedinice
ssb000->rsb030 + ssb000->rsb031
// odeljenje 00 je u stvari naziv sektora i ne može se uneti u GET-u
// šifra 0100 ili recimo 0200. primer:
01 00 sektor Beograd
01 01 odeljenje 1
01 02 odeljenje 2
01 03 odeljenje 3
02 00 sektor Novi Sad
01 01 odeljenje 1
01 01 odeljenje 2
3. generalna funkcija koja služi za biranje šifre iz šifarnika odnosno
jednog sloga iz neke datoteke (ili njenog jednog dela) uz postavljanje
filtera za određene slogove (i ti slogovi se vide, ali se ne mogu
izabrati i ispisani su u drugoj boji). ako nema podataka koji bi se
ponudili za biranje u zadnjem redu se ispisuje poruka o tome i prekida
se rad funkcije.
parametri: (******* su obavezni)
naziv opis default
----- ---- -------
cAlias alias datoteke-šifarnika *******
cHeader naslov tabele ""
bColumn kodni blok za kolonu prikaza *******
cTop vrh podataka "" (početak baze)
cBottom podatak iza dna "■... (kraj baze)
bSkip kodni blok za kretanje kroz bazu šđđ .T.ć
uz poštovanje cTop i cBottom
bValid kodni blok za validaciju izbora šđđ .T.ć
bEsc kodni blok koji se izvršava prilikom *******
prekida biranja (ESC taster)
bEnter kodni blok koji se izvršava po biranju *******
sloga
NAPOMENA: primer je "sirov" iz mojih programa, pa može da (malo :) zbuni,
jer koristim gomilu mojih funkcija i objektno proširenje clipper-a
oClip. Ipak mislim da nije teško za razumevanje ideje i suštine.
ako bude nejasnoća pitajte.
1.
...
LOCAL cSek := SPACE(4)
...
č nY+3, nX+13 GET cSek PICTURE "čK" WHEN _AZURIRANJE ;
VALID šđxđ;
x := ONOkSektor(čcSek, čcON),;
SETPOS(nY+3, nX+18), DISPOUT(cON,aClrŠ2Ć),;
x;
ć
...
READ
2.
// ----------------------------------------------------------------------
// kontrola sektora i odeljenja
FUNCTION ONOkSektor(cSek, cON)
LOCAL lOk := .F.
Push(ssb000->(RECNO()))
IF EMPTY(cSek)
AppChooseCode(;
"SSB000", " ■2Organiz. jedinice ",;
šđđ " "+ssb000->rsb030+IF(ssb000->rsb031 <> "00", ssb000->rsb031, "
")+;
IF(ssb000->rsb033,"*"," ")+LEFT(ssb000->rsb032,20)+" " ć, ,,,;
šđđ .NOT. ssb000->rsb033 .AND. ssb000->rsb031 <> "00"ć,;
šđđ cSek := SPACE(4), cON := SPACE(30) ć,;
šđđ cSek := ssb000->rsb030+ssb000->rsb031, cON := ssb000->rsb032ć )
ELSE
cSek := PADL(ALLTRIM(cSek),4,"0")
ENDIF
IF .NOT. ssb000->(DBSEEK(cSek,.T.)) .OR. ssb000->rsb033 .OR.;
RIGHT(cSek,2) == "00"
msg:display("ON0011")
ELSE
lOk := .T.
cON := ssb000->rsb032
ENDIF
ssb000->(DBGOTO(Pop()))
RETURN lOk
3.
// ---------------------------------------------------------------------
// funkcija za biranje sifre iz odredjenog sifarnika
FUNCTION AppChooseCode(cAlias, cHeader, bColumn, cTop, cBottom, bSkip,;
bValid, bEsc, bEnter)
LOCAL wnd, tbl, nW, lOk := .T., ch, cKey, nRecNo, nMax
VideoPush(SC_NONE)
PushLastRow()
// stara radna oblast se sacuva i selektuje se nova
PushSelect(nW := SELECT(cAlias))
Push((nW)->(RECNO()))
// brojanje slogova
IF (nMax := (nW)->(DbfCount(_Default(cTop,""),;
_Default(bSkip, šđđ .T.ć)))) > 0
AppBottomRow(" Enter-■2Prenos sifre ■1Esc-■2Izlazak")
// otvaranje prozora (donji desni ugao ekrana)
wnd := Window():New(;
MAXROW()-3-2-MIN(nMax-1,MAXROW()-8),;
MAXCOL()-4-1-LEN(EVAL(bColumn)),;
MAXROW()-3,MAXCOL()-4,;
sys:get("choose.color"), WNDF_EDGE,B_SINGLE, cHeader)
DISPBEGIN()
wnd:Open()
// tabela
tbl := TBrowseNew(wnd:WTop, wnd:WLeft, wnd:WBottom, wnd:WRight)
tbl:colorSpec := _NizUStr(sys:get("choose.color"))
tbl:addColumn(TBColumnNew(,bColumn))
// pozicioniranje na vrh podataka
IF cTop <> NIL
tbl:goTopBlock :=;
šđđ (nW)->(DBSEEK(cTop,.T.)),;
IF(.NOT. EVAL(bSkip),;
( (nW)->(DBGOBOTTOM()), (nW)->(DBSKIP()) ),;
);
ć
ELSE
tbl:goTopBlock := šđđ (nW)->(DBGOTOP()) ć
cTop := ""
ENDIF
// pozicioniranje na dno podataka
IF cBottom <> NIL
tbl:goBottomBlock :=;
šđđ (nW)->(DBSEEK(cBottom,.T.)),;
IF(.NOT. (nW)->(EOF()), (nW)->(DBSKIP(-1)), );
ć
ELSE
tbl:goBottomBlock := šđđ (nW)->(DBGOBOTTOM()) ć
cBottom := REPLICATE(CHR(255),10)
ENDIF
// pomeranje po podacima
IF bSkip <> NIL
tbl:skipBlock := šđnSkipđ (nW)->(DBFSkip(nSkip,bSkip)) ć
ELSE
tbl:skipBlock := šđnSkipđ (nW)->(DBFSkip(nSkip,šđđ.T.ć )) ć
ENDIF
tbl:getcolumn(1):colorblock := šđđ IF(EVAL(bValid), š1,3ć, š4,3ć)ć
DISPEND()
// pozicioniranje na prvi ispravan slog
(nW)->(DBSEEK(cTop,.T.))
ELSE
AppBottomRow("■2NEMA PODATAKA ZA IZBOR. PRITISNITE...")
TONE(100,1); TONE(500,1); TONE(200,1)
INKEY(0)
lOk := .F.
ENDIF
SETCURSOR(SC_NONE)
DO WHILE lOk
DO WHILE .NOT. ( tbl:stabilize() .OR. NEXTKEY() <> 0 ); ENDDO
ch := INKEY(0)
DO CASE
CASE ch == K_ESC ; EVAL(bEsc); EXIT;
CASE ch == K_ENTER ; IF EVAL(bValid); EVAL(bEnter); EXIT; ENDIF
CASE ch == K_UP ; tbl:Up()
CASE ch == K_DOWN ; tbl:Down()
CASE ch == K_PGUP ; tbl:PageUp()
CASE ch == K_PGDN ; tbl:PageDown()
CASE ch == K_CTRL_PGUP ; tbl:goTop()
CASE ch == K_CTRL_PGDN ; tbl:goBottom()
ENDCASE
ENDDO
// zatvaranje prozora, ako je uopste bio otvoren
IF nMax > 0
wnd:close()
ENDIF
(nW)->(DBGOTO(Pop()))
// povratak stare radne oblasti
PopSelect()
PopLastRow()
VideoPop()
RETURN NIL
Goran
clipper.229goxx,
-> #183, nbatocanin■ > ErrorBlock(bSave_Eb) // Stari error handler
■ > ... Inace funkcija Isprinter() cesto vraca .f. ...
■ Izgleda da je greška u proceduri za obradu greške.
■ IsPrinter zaista nije baš idealna za upotrebu, bolje je koristiti
■ neku alternativnu funkciju ili iz neke biblioteke ili napisati svoju
■ pomoću odgovarajućih funkcija BIOS-a.
Moja iskustva:
Pre otprilike pola godine (ili je bilo godinu dana?) i ja sam postavljao
ovakva pitanja u ovoj konferenciji i dobijao sam slične odgovore što mi
na kraju nije baš previše pomoglo, ali glavna smernica je ostala da se
štampač tretira kao binarni fajl.
Zaboravio sam na ISPRINTER() i pozivanje interapta i sada me, da kucnem u
drvo, glava više ne boli. Ovakav način rada omogućava i paralelno upisivanje
u dva fajla (ili štampac i fajl) na primer izveštaj i rekapitulacija
izveštaja.
Ovo što šaljem dole bi trebalo da radi bez problema, ali ako ih kojim
slučajem bude (malo sam sekao neke svoje funkcije da bi se ovo dobilo,
a nema vremena za proveru) ukažite na njih pa ću da ih izmenim.
I na kraju, što je najlepše od svega nema ERRORBLOCK( :).
...
#define PRN_READY 0
#define PRN_NOT_READY 1
#define PRN_EXIT 2
#define PRN_INTERRUPT 3
#define PRN_EMPTY 4
#define PRN_UNKNOWN 5
#define PRN_GET_READY 6
#define PRN_FERROR 7
#define PRN_EXIST 8
// uredjaj za izlaz !!! moraju da budu ovakvi brojevi zbog DOS handle-a
#define PRN_SCREEN 99999
#define PRN_PRINTER 99998
#define PRN_FILE 99997
#define CRLF CHR(13) + CHR(10)
#include "FileIO.Ch"
STATIC _Status := PRN_GET_READY, _Device := 0, _FileName := "PRN",;
_TimeOut := 2.5
...
// ---------------------------------
// ime stampaca ili fajla na disku
_FileName := "PRN"
_Device := FOPEN(_FileName, FO_WRITE)
Print("Ode na štampač kao u fajl!" + CRLF)
// sitna stampa sa malim proredom
Print(CHR(15) + CHR(27) + CHR(48))
Print("Vidi me tek sad" + CRLF +;
"kako sam ga usitnio," + CRLF +;
"a šta kažeš?")
// za fajlove potrebno i ovo da bi se odsekao kraj fajla
// ako je on ranije imao vecu duzinu
FWRITE(_Device, "", 0)
FCLOSE(_Device)
...
// ------------------------------------
// stampa odredjene sekvence
FUNCTION Print(cSeq)
LOCAL nSeconds := SECONDS(), nLen := LEN(cSeq), nDone
DO WHILE _Status == PRN_READY
IF Inkey() == K_ESC
_Status := PRN_INTERRUPT
Message()
LOOP
ENDIF
// upis sekvence
nDone := FWRITE(_Device,cSeq)
// da li je nastupila greska prilikom upisa
IF FERROR() > 0
// da li se sve odstampalo
IF nDone < nLen
cSeq := RIGHT(cSeq, (nLen -= nDone))
ELSE
EXIT
ENDIF
// neko vreme se pokusava sa operacijom
IF SECONDS() - nSeconds > _TimeOut
_Status := PRN_NOT_READY
Message()
nSeconds := SECONDS()
ENDIF
LOOP
ENDIF
EXIT
ENDDO
RETURN _Status
// ------------------------------------
// obrada poruke
FUNCTION Message()
// promenljiva _Status mora da se postavi na vrednost PRN_READY
// (ako korisnik zeli da ponovo proba stampu) ili na PRN_EXIT
RETURN NIL
Goran
clipper.230goxx,
O otvaranju i zatvaranju datoteka.
Ja lično, sam pobornik ideje (kakav početak rečenice, užas :) da ono što ne
treba da bude otvoreno ne treba ni otvarati. Pošto su mi aplikacije
organizovane po menijima tj. po ulasku u program korisnik je u glavnom
meniju gde posle biranja neke opcije uglavnom ulazi u program koji otvara
sve potrebne datoteke i obično tabelarno prikaže podatke (jedna, dve ili
tri povezane tabele, a može i više). pri izlasku iz programa sve što je
otvoreno to se i zatvara i korisnik se vraća na glavni meni (otkriće tople
vode u organizovanju aplikacije :)
Otvoriti sve datoteke na početku programa je gubljenje resursa (memorija),
a stalno otvarati i zatvarati datoteku u nekom programu kad je nešto iz
nje potrebno (čitanje ili upis) je gubljenje vremena. Znači, potrebna je
(gore opisana) međuvarijanta.
Goran
clipper.231snowwhite,
-> #217, dvesic■ Nisam siguran da sam dobro shvatio, možda je ovako :
■
■ Jednostavno nad tabelama kreiraj indeks npr.
■
■ INDEX ON Upper(Naziv_Artikla) FOR Stanje <> 0
■
■ pa uradi Browse sa ovim indeksom aktivnim.
■ Ovim si poređao po abecedi, i elminisao one sa 0 stanjem. Ako je
to
■ to, ok. Ako nije, pojasni mi malkice problem.
Izvinjavam se zbog nejasnoca.
Vidis u jednoj bazi je cist sifarnik robe sa cca 3400 lekova,
a u drugoj bazi je stanje sa 800 artikala. Jedina veza je
preko polja koji oznacava sifru robe u obe baze.
Baza za artikle je indexirana i po nazivu, a baza za stanje
samo po sifri robe.
ROBA.DBF STANJE.DBF
-------- ----------
sifra n8 0 st_sifra n8 0
naziv c30 st_kolic n15 3
jdm c3
barcode c13
farmgr c5
..
..
Indexi: Index:
_______ ------
ROBA1 Str(sifra,8) Str(st_sifra,8)
ROBA2 farmgr
ROBA3 SubStr(naziv,1,13)
Nadam se da je sada jasnije.
Pozdrav.
clipper.232snowwhite,
-> #226, bulaja■ Ovo možeš rešiti na više načina, predlažem ti sledeći (koji je
dobar
■ zato što ne zahteva nikakve izmene u sadašnjoj strukturi podataka,
■ kreiranje novog indeksa i sl.):
Nije neophodno, posto aplikacija nije jos u potpunosti zazivela.
■ 1) Kreiraj niz koji sadrži pointere u sifarniku (RecNo()) na sve
artikle
■ kojih ima na zalihama (odnosno imaju ne-nula stanje) kao i nazive
■ artikala. Znači prvo aktiviraj indeks po stanju (pretpostavljam da
ga
■ imaš:), zatim jedno dbSeek(1) (skače na prvi artikal sa ne-nula tj.
Index postoji :).
Ova brojka 800 je cirka. Problem je pokazati na ekranu.
3400 lekova je ppo sifarniku iz 1993. Za sada je taj broj
cca4000-4500
i plus razne cetkice,cuclice,....
Znaci broj artikala je preko 5000. E sada na stanju recimo ima vise
od 4096 artikala sa stanjem != 0 (Jedno veledrogerija).
E sta sada ?
■ Za 800 (verovatno kratkih)
■ slogova ova operacija neće dugo trajati, u svakom slučaju
neoporedivo
■ kraće od raznih kreiranja indeksa, brisanja, filtera ili sličnih
■ alternativnih rešenja.
Krace hoce za 800, ali je potrebno da radi i za 50000!
Molio bih neke vratolomije preko baza, ili nesto slicno
P.S. Radio sam na taj nacin, i OK je ali broj artikala je vec frka
Hvala ti puno na opsirnom odgovoru.
Pozdrav.
clipper.233goxx,
-> #202, nbatocanin■ > promenljive kao private. Na kraju sam se odlucio da ipak
■ > uvedem tri private promenljive za definisanje granica za
■...
■ Ovo ti nikako ne preporučujem: ...
Ja takođe :)
Goran
clipper.234goxx,
-> #216, zkrstic■ Kao prilog ovoj teoriji, postavljam jedno prosto pitanje: Ako uzmemo da
■ otvaram baze kada mi trebaju, program radi u mreži, šta kada neko zapne da
■ radi reindex ili kako nekom dati da radi pack ili slične operacije koje traže
■ exclusive pristup. Odgovor je semafor, ali probajte da razgrnete malo,
■ nije ni
Šta ima svaka šuša kog đavola da reindeksira (osim toga ako ne može da
ekskluzivno otvori fajl nema indeksiranja) ili nedaj bože da pakuje bazu.
I dalje mislim da otvaranje svih baza na početku samo nepotrebno "jede"
memoriju (baferi za baze i baferi za indekse).
Kad smo već kod indeksa. Uvek sa otvaranjem baze otvaram i sve njene indekse.
Ako je potrebno da nešto ažuriram u svakom slučaju moram da ažuriram i indekse,
a ako nema ažuriranja i program pukne, nema šta da ošteti u indeksima koji su
mi višak, jer i ne treba da ažurira bazu iz bafera.
Goran
clipper.235goxx,
-> #214, snowwhite■ problem vec ovo. U sifarniku se nalazi 3393(tacna
■ cifra) artikala , a na stanju je 800 artikala.
■ Covek nece da se zamara da gleda silne nuletine
Video sam Vesićevo i Bulajino rešenje. Koji je clipper u pitanju.
Koliko se sećam, clipper 5.01 nema FOR klauzulu u INDEX komandi.
// novi index po stanju
INDEX ON stanje->(Kljuc()) TO Stanje01
// funkcija ne može da bude STATIC
FUNCTION Kljuc()
RETURN IF(stanje->kolicina > 0,;
( roba->(DBSEEK(stanje->sifra_robe)),;
UPPER(roba->naziv_robe) ),;
SPACE(_duzina_polja_naziv_robe),
)
podrazumeva se da ti je sifarnik vec otvoren i pravilno indeksiran po
sifri robe. sada prikazuj stanje od slova "A" pa do kraja datoteke.
(to znači da ćeš morati da napraviš CUSTOM blokove za TBrowse() kao
što je bulaja rekao - nemoj da te ovo plaši, to je sasvim trivijalna
stvar)
stanje->(DBSEEK("A")) // za početak podataka
ako promeniš kolicinu (stanje) funkcija pravilno preuredi index.
Goran
clipper.236goxx,
-> #225, mdrazic■ Danas sam prisustvovao prezentaciji jednog softvera koji obrađuje
■ veću količinu podataka (na disku zauzima 200 MB, min. 50 MB) iako je
■ sam Clipper EXE manji od 1 MB. Program je pisan tako da je dizajnerski
■ perfektno urađen, bolji nisam video, radi sve poslove koje treba i
■ to uz promišljene testove protiv pokušaja varanja sistema (pare su
■ u pitanju). Izveštaji na laseru izgledaju da bolje nisam video.
Ko, gde, šta? Gde može da se nabavi demo tog programa. U stvari interesuje
me samo taj perfektni dizajn i eventualno ta štampa na laseru.
Goran
clipper.237dvesic,
-> #212, bceklic>> Ajde da probamo da definisemo to "mali broj baza"? ...
>> prosecni broj baza i indexnih fajlova u tvojim programima ...
Oko 12-tak baza (toliko i indeksnih datoteka, koristim Six).
Kod najvećeg (Velikoprodaja, maloprodaja, ...) je 22 baze.
>> Uzgred kako sam ja asm coder koji trenutno radi u
>> cliperu interesuje me na koji nacin organizujes pisanje
>> programa? Da li npr. za svaku stavku iz menija radis poseban
>> .prg ili recimo za svaki meni box (par opcija)....
Odavno sam napisao svoju biblioteku koja se brine oko ispisa na
ekran, Yu slova, štampača, faksa, browse baze, itd, itd ...
Obično stvari vezane za jednu tabelu stavljam u jedan prg.
(oko 10Kb u proseku).
Što se organizacije datoteka tiče (na nivou projekta) to izgleda
ovako :
APP───┬─DBF
│
├─OBJ_WORK
│
└─OBJ_EXE
U APP su PRG, CH i jedan RMK fajl. U DBF rečnik, tabela menija, INI datoteke
i naravno DBF, FPT i CDX fajlovi. U OBJ_WORK OBJ fajlovi razvojne verzije
u OBJ_EXE finalne verzije programa. Zašto ovako ? Dok sam radio još na 286
ovo mi je garantovalo da će se sa minimalnim brojem kompajliranja i
linkovanja
doći do rezultata. Za sve se brine jedan generalizovani RMK fajl koji po
potrebi generiše i LNK fajl.
clipper.238dvesic,
-> #231, snowwhite>> ROBA.DBF STANJE.DBF
>> -------- ----------
>> sifra n8 0 st_sifra n8 0
>> naziv c30 st_kolic n15 3
>>
>> Indexi: Index:
>> _______ ------
>> ROBA1 Str(sifra,8) Str(st_sifra,8)
>> ROBA2 farmgr
>> ROBA3 SubStr(naziv,1,13)
Evo ti jedne teške prljavštine, koju primenjujem samo u krajnjim
slučajevima :)))
(Pošto nisi rekao koji RDD koristiš, smatraću da se radi o CDX tipu).
Use Roba Index Roba Exclusive New
Set Order To Tag Roba1
Use Stanje Exclusive New // Sada ćemo kreirati potrebni indeks
Set Relation To Str(st_Sifra,8) Into Roba
Index On Upper(Roba->Naziv) To TAG MojIndeks For st_Kolic <> 0
// U ovom trenutku si kreirao indeks MojIndeks
Sada je moguće da radiš Browse nad STANJE.DBF i da ostale podatke
o artiklu kupiš iz ROBA.DBF jer su u relaciji. Indeks zadovoljava
ono što si tražio : sortirano je po abecedi, prikazuju se samo oni
koji imaju nešto na lageru. Naravno, moguće je i obrnuto : da relaciju
usmeriš iz ROBA ka STAVKE i izvedeš sličnu vratolomiju.
Ovo rešenje ima puno loših strana : ako želiš ažuran indeks, moraš se
potruditi da prilikom unosa/izmene sloga važi ova relacija kao i aktivni
indeksi. No, dok se ne setim nečeg pametnijeg, probaj ovo :)
clipper.239spantic,
-> #224, d.petrovic> Šta je semafor? Viđevah to svuda, ali mi ne pade na pamet da koristim.
Semafore prvi spominje i uvodi u računarsku teoriju Dajkstra 1968. godine.
Koristimo ih za obezbeđivanje međusobnog isključivanja kritičnih sekcija. Što
je od vitalnog značaja kada god imamo slučaj pristupa dva procesa nekom
resursu.
Recimo da imaš nenegativnu celobrojnz promenljivu nad kojom su
definisane dve operacije:
P (ili Wait) i V (ili Signal), (ako se neko čudi P, V su od holandskih reči
:)
Pri čemu ih definišemo kao:
P(S): for(;;;)
{
if s > 0 then
{
s = s-1;
break;
}
}
V(S): s++;
Operacije koristimo pri radu sa kritičnom sekcijom, i P i V se sigurno
obavljaju cele, kao nedeljive operacije. Pre ulaska u kritičku sekciju
koristimo P, posle izlaska V.
Na početku se semafor (ovde S) postavi na 1.
BTW. semafori koji imaju vrednost 1 i 0 su binarni semafori. Uzajamno
isključivanje se obavlja binarnim semaforima.
clipper.240bceklic,
-> #233, goxx> ■ > promenljive kao private. Na kraju sam se odlucio da ipak
> ■ > uvedem tri private promenljive za definisanje granica za
> ■ Ovo ti nikako ne preporucujem: ...
> Ja takode :)
Izbaceno, uzgred izmenio sam i sistem otvaranja baza i indexa.
Sada ih otvaram po potrebi u modulima. Uzgred, ono pitanje o Blinkeru
vise nije aktuelno, uspeo sam da resim problem velikih overleya...
Sada se sa Pc Guard-om mogu zastiti i veliki kliper programi.
POzdrav!
clipper.241bceklic,
-> #229, goxx> Ovo sto saljem dole bi trebalo da radi bez problema, ali ako ih
> kojim slucajem bude (malo sam sekao neke svoje funkcije da bi
> se ovo dobilo, a nema vremena za proveru) ukazite na njih pa cu
> da ih izmenim.
Mnogo hvala na primeru, trenutno nemam vremena da ga proverim
jer imam gomilu obaveza ali cu sigurno javiti da li sljaka ok!
POzdrav!
clipper.242bulaja,
-> #232, snowwhite│Znaci broj artikala je preko 5000. E sada na stanju recimo ima vise od
│4096 artikala sa stanjem != 0 (Jedno veledrogerija). E sta sada ?
└───
Pa ništa :). Samo umesto niza koristi privremenu bazu (sa dva sloga,
RECNO i ARTIKAL, indeksirano po ARTIKAL) koju ćeš puniti na isti način
kao niz. Rešenje sa nizom je u slučaju manjeg broja slogova bolje zato
što je brže.
Možeš čak i da napraviš funkcije za rad sa velikim virtuelnim nizovima,
koji prividno imaju i više od 4096 članova. Interno takav niz dobija
jednu dodatnu dimenziju koja se koristi sa subindeksiranje (nešto slično
segmentnom adresiranju kod *86 procesora) - svaki segment je i dalje
ograničen na max 4096 elemenata, ali možeš imati još 4096 segmenata
(naravno i manje, po želji:) odnosno virtulni niz od 16M članova.
Potrebno je samo da napraviš svoje A* funkcije za linearni korišćenje
(dodavanje, brisanje, pristup) ovakvog niza (tako da ne moraš da ga
adresiraš npr. sa aNiz[16,0], već sa AGetClan (aNiz, 65536)).
Btw ovi virtuelni nizovi nemaju baš mnogo veze sa osnovnom dikskusijom,
ali nema veze :).
clipper.243bulaja,
-> #229, goxx│Ovo što šaljem dole bi trebalo da radi bez problema, ali ako ih kojim
│slučajem bude (malo sam sekao neke svoje funkcije da bi se ovo dobilo,
│a nema vremena za proveru) ukažite na njih pa ću da ih izmenim.
└───
Osnovni problem je - ne radi uvek :). I ja sam ranije imao rešeno
štampanja na sličan način, tako što sam tretirao printer kao običnu
binarnu datoteku. Međutim ispostavilo se da u velikom broju slučajeva
FOpen() nad nekim PRN portom ima tendenciju da se zaglavi (a ne da javi
grešku) ukoliko je štampač priključen ili je off-line. Računar bi ostao
potpuno blokiran sve do uključenja računara.
Trenutno koristim rešenje koje se oslanja na FUNCKy funkcije PrnStatus
(vraća status štampača - ready, off-line, out of paper,..) i lPrintByte
(šalje jedan bajt na štampač i vraća status operacije). Inače postoje i
BIOS funkcije koje rade isto to (dakle ako već i BIOS tretira štampač
drugačije od datoteke, zašto onda ne bi smo i mi:), FUNCKy koristim
čisto zato što me mrzelo da se petljam oko tih nekoliko INT poziva :).
Ovakvo rešenje mi radi pouzdano već nekih godinu dana, tako da ga
preporučujem :).
clipper.244mdrazic,
-> #219, dr.grba> "Inverzni inženjering", "reverzibilni inženjering"....
>
> Izrazi stoje k'o piletu sise. Kao kad bi za švercera rekao "referent
> spoljne trgovine".
I meni zvuči nakaradno, ali je smisao 'obrnuti inženjering' (reverse
engineering), tj. da od gotovog proizvoda dobiješ od čega je on nastao.
Termin 'reverzibilni' je pogrešan (reversible) jer se on odnosi da
opiše procese koji su u stanju da dovedu do istog početnog stanja od
kojeg su krenuli. Izvinite što ne upotrebljavam zvanične (?) termine
ali se nadam da ste me u prethodnoj poruci razumeli.
Milan
clipper.245mdrazic,
-> #211, bceklic> Dvoumio sam se izmedju tvog i principa koji trenutno koristim.
> Kako vidim da vecina ovde koristi otvaranje po potrebi izvrsicu
> potrebne korekcije. Bojim se da ce mi za to sada trebati dosta vremena
> (projekat mi je odmakao)
To nema veze sa projektom, već implementacijom. I nije teško.
Napravi jednu funkciju koja otvori sve šta treba a sve to je
zapisano u nekoj listi, recimo, ili kako zoveš indeksiranoj
promenljivoj. Zatim napravi drugu funkciju koja sve to zatvara.
I još reši kako ćeš postupiti ako se nešto ne može otvoriti.
Recimo:
proc Obrada
local aTabele := š š'PRVA','shared',,'IND11','IND12'ć, ;
š'DRUGA','exclusive','ALIAS2','IND21'ć )
begin sequence
OtvoriTabele( aTabele )
recover
ZatvoriTabele( aTabele )
return
end sequence
...
ZatvoriTabele( aTabele )
return
Funkcija OtvoriTabele() izvršava break ako se posao otvaranja ne da
završiti do kraja iz nekog razloga.
Ovako u osnovi i ja radim i ne predstavlja nikakav problem, a kao
dobru stranu imaš da se sve tabele otvaraju tvojom jednom funkcijom
i kasnije prelaženje na drugi drajver (na primer) je trivijalno.
Milan
clipper.246mdrazic,
-> #210, bceklic> Citav ovaj sistem je dosta komplikovan i ide dosta u dubinu. Ukoliko se
> prvi korak izvede kako treba kod za operaciju dodavanja ili brisanje
> podataka bi mogao da bude veoma kratak. Definisu se odgovarajuce indexne
> promenjljive i proslede funkciji.
Ja više volim da u validaciji ako treba ispišem uslove u nekom stringu,
a da ga funkcija koja taj string sa uslovom (filter,...) primi, ako je
potrebno pretvori u kodni blok i tako koristi. Znači kod samog geta
nemam ispisane blokove čime izbegavam probleme vidljivosti. I kod mene
moje funkcije u validu odrađuju i pretraživanje šifarnika ako se traži
i slične ljubaznosti.
Milan
clipper.247mdrazic,
-> #213, mileusna> Ja posle svakog upisa pozovem DBCOMMIT(), a može i DBCOMMITALL(). U NG-u
> se savetuje da se, pri radu u mreži, DBCOMMIT() poziva pre upotrebe
> UNLOCK komande
Napravite vašu funkciju za unlock u kojoj možete automatski pre toga
da komitujete i još mnogo drugih stvari da automatski uradite:
function MojUnlock()
dbcommit()
// mogu se ovde i trigeri implementirati
// može i neki žurnal fajl (log) da se ažurira po potrebi, itd.
unlock
// dodajte po željama šta je potrebno
return nil
A može se napraviti i funkcija za lokotiranje i delokotiranje više
radnih oblasti odjednom. Time vaš osnovni kod postaje pregledniji,
lake su izmene tipa 'da li commit ili ne', a i doslednije se držite
osnovne filozofije pri transakcionom radu:
- faza širenja (lokotiranje svega što će se menjati
- upisivanje
- commit
- faza skupljanja (delokotiranje svega gornjeg)
Milan
clipper.248mdrazic,
-> #218, dvesic>>> otvaram baze kada mi trebaju, program radi u mreži, šta kada
>>> neko zapne da radi reindex ili kako nekom dati da radi pack
>>> ili slične operacije koje traže exclusive pristup. Odgovor je
>>> semafor, ali probajte da razgrnete malo, nije ni
Da bi neko radio reindex ili pack mora otvoriti tabelu ekskluzivno.
Ako to ne može, nema ni reindexa ili pakovanja. A ako je otvorio
ekskluzivno od ostalih je bezbedan jer ne vide tu tabelu. Sam način
otvaranja tabele je neka vrsta semafora, drugi ne treba.
Na mreži je princip: ništa nije sigurno da te čeka na izvol'te.
Svaki put moraš da probaš, pa ako dobiješ, dobiješ, ako ne, drugi
put. Ali kad dobiješ neka prava, dok ih se sam ne odrekneš možeš
sve raditi mirno (dok ne padne mreža :> ).
Ako je neko u toku (re)indeksiranja neke tabele, i ako ti otvaraš sve
tabele na početku, ti uopšte i ne možeš startovati program. Pri drugoj
filozofiji otvaranja onih tabela na početku procedure koje tamo stvarno
trebaju ti i tada možeš neke poslove da radiš mimo dotične tabele.
Samo ponekad u nekim opcijama menija se može desiti da dobiješ
poruku tipa: 'tabela trenutno nedostupna, ponovi pokušaj ili odustani?' .
> Nije ni preterano teško. Na nivou aplikacije postoji flag
> DozvoliOtvaranje i rečnik podataka gde uz svaku tabelu stoji lokalni flag
> DozvoliOtvaranje, i BrKorisnikaKojiJeOTvorioBazu.
A šta da radiš kada više aplikacija napada iste tabele (tvoj program,
dBase, DBU, DBX, Excell, Quattro, itd. ? Ne tiču se njih tvoji semafori.
Tvoja aplikacija treba da otrpi i takve napade kao nešto sasvim realno.
Milan
clipper.249mdrazic,
-> #224, d.petrovic> Šta je semafor? Viđevah to svuda, ali mi ne pade na pamet da koristim.
Pa znaš ono: crveno svetlo, zeleno svetlo. čuto još nisu izmislili.
Na Novellu postoji mogućnost da postaviš neki imenovani semafor i da
kontrološeš maksimalan broj korisnika koji 'prolaze tom raskrsnicom'
istovremeno. Međutim sama aplikacija treba da pali i gasi te
imenovane semafore. Za bezobrazne aplikacije tipa dBase i sl. nema
pomoći, one su daltonisti i nemaš kontrolu nad njima pomoću semafora.
Semafore možemo pametno koristiti samo ako smo disciplinovani.
Semafori se mogu i simulirati recimo formiranjem tabele SEMAFORI u
koju ćemo upisivati potrebne podatke i koja će nam odgovarati na
pitanje 'Da li više od 5 korisnika trenutno radi?' ili 'Da li neko
želi sam da koristi tabelu XYZ ?'
Milan
clipper.250mdrazic,
Testiranje aplikacije. Bolna tema :(
Evo informacije o dva alata koji pomažu testiranje:
Coverage - prilikom izvršavanja programa registruje koje su sve
linije koda izvršavane a koje nisu. Jako zgodno pri
testiranju da se prođu sve grane u do case i sličnim
strukturama.
Scrutiny - error sistem koji omogućava da se u kodu deklarišu
neki uslovi i pretpostavke koji moraju važiti i koji
se mogu proveravati u cilju testiranja i eksploatacije
programa. Pri greškama vrlo elegantno i opširno daje
podatke o tome šta se desilo i nudi izlaz iz neugodnih
situacija.
Ako vas neko iz inostranstva pita šta vam treba, eto dva predloga :)
Ja ovo nemam, ali bih voleo da vidim.
Milan
clipper.251goxx,
-> #237, dvesic■ >> Ajde da probamo da definisemo to "mali broj baza"? ...
■ >> prosecni broj baza i indexnih fajlova u tvojim programima ...
■ Oko 12-tak baza (toliko i indeksnih datoteka, koristim Six).
■ Kod najvećeg (Velikoprodaja, maloprodaja, ...) je 22 baze.
Mala baza do 5 dbf-a; velika preko 20.
■ APP───┬─DBF
■ ├─OBJ_WORK
■ └─OBJ_EXE
Kod mene:
// opšti programi
APP─┬─LIBR (prg, bat, ch, pl?) prg moduli koje koriste sve aplikacije
└─BAK
// aplikacije (svaka posebno)
SERVIS─┬─PRG (prg, ch, bat, clp, obj)
├─SYS (exe, DICT, MESSAGE, CONFIG, USER, FORM, LOGO, DRIVER)
│ sve datoteke tekstualne zbog lakše izmene i
│ rasterećenja exe programa
├─DBF (dbf, ntx)
├─PRT lokalni spool
├─COM komunikacija i transfer podataka iz poslovnica
└─BAK
PS.
Mogu da organizujem prezentaciju svih programa koje smo napravili
(moje kolege i ja), normalno ako ima zainteresovanih.
PSPS.
Pade mi na pamet. Zašto ne bi mogla da se organizuje jedna velika
prezentacija, recimo programa za knjigovodstvo (ili nešto drugo),
gde bi se pojavilo jedno 20-tak programa (a definitivno ih ima
milion različitih) iz te oblasti pa da se vidi ko je lep.
Zašto recimo računari ne bi mogli da naprave neki "Editor/User choice"
takvih programa jer na našem tržištu zasigurno nema domaćih tekst
procesora ili spredšitova već samo knjigovodstvenih i evidencionih
programa iz mnogih oblasti.
Ovo je možda trebalo pod razno, ali nema veze.
Goran
clipper.252bpekic,
-> #220, vlasloMislim da se radi o nedostatku memorije prilikom automatskog kreiranja
osnovnih modula kada pravis nov progra űm.
To se meni desavalo kada sam probe radi, pokusao da napravim nov program
na masini sa 2MB memorije. Tada uspeva eventaualno da napravi samo
START modul i nista vise, pa i taj START je neki puta bez ijedne
metode, definicije, potpuno prazan.
Nisam siguran u to, ali izgleda da je memorija u pitanju. Na kucnom
racunaru (8MB) to mi se jos nije desilo.
Pozdrav!
clipper.253dvesic,
-> #248, mdrazic>> A šta da radiš kada više aplikacija napada iste tabele (tvoj
>> program, dBase, DBU, DBX, Excell, Quattro, itd. ? Ne tiču se
>> njih tvoji semafori. Tvoja aplikacija treba da otrpi i takve
>> napade kao nešto sasvim realno.
A šta se njih tiču moje tabele ? :) Da se niko nije usudio da ih
dira ! :)))
clipper.254d.petrovic,
-> #243, bulaja> grešku) ukoliko je štampač priključen ili je off-line. Računar
> bi ostao potpuno blokiran sve do uključenja računara.
Sasvim logično ;)
clipper.255d.petrovic,
-> #240, bceklic> Izbaceno, uzgred izmenio sam i sistem otvaranja baza i indexa.
> Sada ih otvaram po potrebi u modulima. Uzgred, ono pitanje o
> Blinkeru
Opet ne valja ;))).
Treba centralizovati otvaranje baza pa ih onda otvarati po modulima.
Naime često mi se desi da mi treba novi indeks. Ako ne obiđem sve
postojeće module ostaće indeks neažuran. Zato napraviš sa svakim programom
po jedan modul koji otvara traženu bazu, na traženi način i uz to otvori
SVE njegove indekse. Onda postavi Order na 0 (malo brži rad) pa se ti
posle zezaj prema potrebi.
clipper.256d.petrovic,
-> #245, mdrazic> local aTabele := š š'PRVA','shared',,'IND11','IND12'ć, ;
> š'DRUGA','exclusive','ALIAS2','IND21'ć )
Ovo sam malopre opisao. Neka funkcija ima svoje podatke o indeksima
pridruženim bazi, ti samo reci koje baze.
clipper.257markoni,
Ako koristite 4dos, može vam se desiti da imate problema sa nekim
programima pisanim na Clipper-u. Naime, ukoliko program koristi naredbu
RUN da bi izvršio neki eksterni program to neće raditi. Rešenje je da
podesite promenljivu okruženja COMSPEC na COMMAND.COM sa recimo
SET COMSPEC=C:\DOS\COMMAND.COM.
Verujem da je bilo, ali nije na odmet da se podsetimo :))
clipper.258bceklic,
-> #246, mdrazic> tako koristi. Znaci kod samog geta nemam ispisane blokove cime
> izbegavam probleme vidljivosti. I kod mene moje funkcije u
> validu odraduju i pretrazivanje sifarnika ako se trazi i slicne
> ljubaznosti.
Kada si spomominjao problem vidljivosti prepostavljam da si mislio
na promenljivu koja se unosi (ciju validaciju i vrsimo). Ja taj
problem u funkcijama kojima se prenosi valid kodni blok resavam na taj
nacin sto direktno pristupim promenjljivoj koja se unosi u aktivni
get. U tim funkcijama i menjam njenu vrednost. Jedini problem je
sto u tom slucaju Update() ne javlja zeljene rezultate (reaguje samo
na keyboard)..
Pozdrav!
clipper.259bceklic,
-> #245, mdrazic> To nema veze sa projektom, vec implementacijom. I nije tesko.
> Napravi jednu funkciju koja otvori sve sta treba a sve to je
> zapisano u nekoj listi, recimo, ili kako zoves indeksiranoj
> promenljivoj. Zatim napravi drugu funkciju koja sve to
> zatvara. I jos resi kako ces postupiti ako se nesto ne moze
> otvoriti. Recimo:
Ne znam da li si videom jednu od mojih prethodnih poruka u kojoj
pise da sam vec presao na modularni nacin otvaranja. Naravno napisao
sam svoje funkcije za otvaranje i zatvaranje grupe baza. Prenose se samo
imena baza a funkcija pootvara sve sto je potrebno (ukljucujuci i
indexe naravno). Citava struktura baza se kao sto rekoh nalazi u jednoj
'listi'....
Problemi koje sam spominjao odnose se na to da sam morao da prekopam sve
do tada napisane module u kojima se podrazumevalo da su sve datoteke otvorene
i da na njihovim pocecima (odnosno krajevima) postavim funkcije za otvaranje
i zatvaranje. Zatim su usledile izmene u funkcijama za pakovanje i
reindexiranje (koje su takodje pretpostavljale da su sve baze otvorene)
Pozdrav!
clipper.260mdrazic,
-> #236, goxx> Ko, gde, šta? Gde može da se nabavi demo tog programa. U stvari
> interesuje me samo taj perfektni dizajn i eventualno ta štampa na laseru.
Bili ljudi i na živim podacima demonstrirali. Softver prvenstveno služi
za obračun utrošene električne energije. Tu ima puno detalja o kojima
mi iz klase 'domaćinstva' i ne sanjamo. Za preduzeća se račun pravi
drugačije i sadrži još brdo detalja, informacija itd. Praćenje plaćanja
firmi liči na knjigovodstvo. Računi se štampaju na laseru sa senčenim
poljima, kućicama itd. sa kontrolom fontova, vertikalnog proreda.
Pošto ne mogu da opišem te 'kućice', pogledaj Računare 105, str.67.
E, pa bolje od toga.
Svaki korisnik određuje koje će podatke da ima u browse-ima i na koji način
sintetizovane (i to može da menja vrlo elegantno), rad je uglavnom
organizovan po prozorima (DOS karakter grafika na VGA sa nekim predefini-
sanim karakterima da liči na Windows) kojima se položaj i veličina mogu
lako menjati, izmenjive palete za korisnike itd. Vidi se da je veliki
trud uložen u dizajn user interface-a. Međutim, moje zamerke se odnose
na osnovno projektovanje i orgainzaciju transakcija.
Milan
clipper.261mdrazic,
-> #226, bulaja> 1) Kreiraj niz koji sadrži pointere u sifarniku (RecNo()) na sve artikle
...
> pozitivnim stanjem) i puni niz sve do EOF. Za 800 (verovatno kratkih)
> slogova ova operacija neće dugo trajati, u svakom slučaju neoporedivo
...
> 2) Sortiraj (ASort()) niz po nazivima artikala.
Neupotrebljivo. Sortiranje niza samo po sebi dugo traje, takođe i
drljanje po celoj tabeli da se niz formira. Bolje je održavati
jedan (ili više) indeksa po nazivu uz uslov isti onaj koji ti puni
niz. Indeks se ažurira samo pri promenama u tabeli i uvek je
spreman za rad i ne troši memoriju i ...
Milan
clipper.262mdrazic,
-> #228, goxx> // Organizacione jedinice
> SSB000
> rsb030 C 2 0 Sifra sektora
> rsb031 C 2 0 Sifra odelenja
> rsb032 C 30 0 Naziv organizacione jedinice
> rsb033 L 1 0 Status (T-izbrisana, F-aktivna)
>
> // index po sifri organiozacione jedinice
> ssb000->rsb030 + ssb000->rsb031
>
> // odeljenje 00 je u stvari naziv sektora i ne može se uneti u GET-u
> // šifra 0100 ili recimo 0200. primer:
> 01 00 sektor Beograd
> 01 01 odeljenje 1
> 01 02 odeljenje 2
> 01 03 odeljenje 3
> 02 00 sektor Novi Sad
> 01 01 odeljenje 1
> 01 01 odeljenje 2
Jel ovo rađeno sa iskustvom u COBOL-u ? Aman, zaman, normalizujte te
tabele i koristite smislenije nazive polja. Kada budete jednog dana
prelazili na SQL (a biće i toga, iako sad ne vidite kad) ovakve strukture
su neprenosive. Jednostavno, jeres za relacione baze.
Bolje je:
ORGJED
ODELJENJE C 2 0 Sifra odelenja
NAZIV C 30 0 Naziv odeljenja
STATUS C 1 0 Status ('T'-izbrisana, 'F'-aktivna, 'R'-...)
SEKTORI
ODELJENJE C 2 0 Sifra odelenja
SEKTOR C 2 0 Sifra sektora
NAZIV C 30 0 Naziv sektora
STATUS C 1 0 Status ('T'-izbrisana, 'F'-aktivna, ...)
Sadržaj tabela otprilike:
01 sektor Beograd 01 01 odeljenje 1
02 sektor Novi Sad 01 02 odeljenje 2
01 03 odeljenje 3
02 01 odeljenje 1
02 01 odeljenje 2
i uvedeš vezu između preko ODELJENJE. I statusi ako su C 1 mogu da
nose mnogo više informacija nego ako su L 1 a i lakše se barata njima.
A i konzistencija se lakše ovako održava.
Milan
clipper.263mdrazic,
-> #231, snowwhite> ROBA.DBF STANJE.DBF
> -------- ----------
> sifra n8 0 st_sifra n8 0
> naziv c30 st_kolic n15 3
> jdm c3
> barcode c13
> farmgr c5
> ..
> ..
0. Ne deklarišite polje kao numerik ukoliko sa njim ne računate! Da li
se sa šifrom nešto računa? (a može i sa val() ako treba).
Numerik se pamti u tabeli kao niz cifara, dakle u ASCII obliku. Kad
god čitaš, to se konvertuje u IEEE numerik format što oduzima vreme
i taj numerik zauzima 10 bajtova. Kada se nešto upisuje oper se
numerik konvertuje u ASCII (interno naravno, ali se ne može mimoići).
1. rešenje
ROBA.DBF STANJE.DBF
-------- ----------
sifra c8
naziv c30 ukini tabelu
jdm c3
barcode c13
farmgr c5
..
..
st_kolic n15 3
2. rešenje
ROBA.DBF STANJE.DBF
-------- ----------
sifra c8 st_sifra c8 0
naziv c30 st_kolic n15 3
jdm c3 naziv c30
barcode c13
farmgr c5
..
..
Prenošenjem imena u stanje dobijaš mogućnost indeksiranja u toj tabeli
po nazivu, ali uvodiš i redundansu u bazu pa moraš biti vrlo disciplinovan
pri promenama u tabelama (da jedna izmena imena ažurira i one u drugoj
tabeli).
Milan
clipper.264mdrazic,
-> #238, dvesic> Use Roba Index Roba Exclusive New
> Set Order To Tag Roba1
> Use Stanje Exclusive New // Sada ćemo kreirati potrebni indeks
> Set Relation To Str(st_Sifra,8) Into Roba
> Index On Upper(Roba->Naziv) To TAG MojIndeks For st_Kolic <> 0
Ne valja. Osim tvog programa sa obe otvorene tabele i postavljenom
relacijom među njima nećeš moći ažurirati zapise. Iz DBX-a nećeš
ni moći čak da koristiš index za pregled. Da ne pričamo ako još
neka aplikacija treba da koristi ove podatke.
Milan
P.S. Dejane, mani se motora na flopi drajvovima, spremaj ispite :)
clipper.265mdrazic,
-> #237, dvesic> APP───┬─DBF
> ├─OBJ_WORK
> └─OBJ_EXE
SHELL───┬─FT_DOC (!)
├─OBJ_WORK
└─OBJ_FINAL
APP───┬─DBF
├─BACKUP
├─IZVESTAJ
├─TEMP
├─PRINTER
├─ ... prema aplikaciji
├─DOC za aplikaciju
├─OBJ_WORK
└─OBJ_FINAL
> U APP su PRG, CH i jedan RMK fajl. U DBF rečnik, tabela menija, INI
takođe :)
> sam radio još na 286 ovo mi je garantovalo da će se sa minimalnim brojem
> kompajliranja i linkovanja
> doći do rezultata. Za sve se brine jedan generalizovani RMK fajl koji po
> potrebi generiše i LNK fajl(ove).
i meni je to iz 286 perioda, ali tako treba :) I još je štos da omogućiš
da više ljudi radi istovremeno na aplikaciji po svojim kućama a da se
aplikacija 'sastavi' samo kopiranjem odgovarajućih fajlova, bez ikakvog
editovanja bilo kog fajla radi sastavljanja aplikacije (da to istrpi i
dodavanje novih modula u menije, nove .prg fajlove itd.).
Milan
clipper.266bulaja,
-> #252, bpekic│Mislim da se radi o nedostatku memorije prilikom automatskog kreiranja
│osnovnih modula kada pravis nov program.
└───
Imao sam i ja sličnih problema u početku :). Međutim krivica je izgleda
do nestabilno podešenog računara (matične ploče) i glupih Windows-a koji
to ne detektuju. To "nestabilno podešen" obično znači da su u BIOS
setapu neki parametri preforsirani - obično stanja čekanja ili refresh
cache ili RAM memorije. Do pojave grešaka (GPF-ova ili sasvim levih) u
tom slučaju izgleda dolazi najčešće prilikom obraćanja virtuelnoj
memoriji (Windows swap fajlu), pa zato prividno deluje da više memorije
otklanja uzrok. Dakle pokušajte u BIOS Setup-u malo da usporite računar
:) i probajte da li se problemi javljaju i posle toga.
clipper.267goxx,
-> #262, mdrazic■ > 02 00 sektor Novi Sad
■ > 01 01 odeljenje 1
■ > 01 01 odeljenje 2
■
■ Jel ovo rađeno sa iskustvom u COBOL-u ? Aman, zaman, normalizujte te
■ tabele i koristite smislenije nazive polja. Kada budete jednog dana
Cobol radim samo po potrebi (nisam ga radio barem poslednjih godinu dana :), a
što se tiče naziva polja mislim da se ovako lakše radi bez obzira što izgleda
nerazumljivo. Na neki način to je dodatna zaštita programa, a i imena se,
normalno, daju po nekim pravilima a ne bezveze.
Tabela stvarno može da se normalizuje, ali u ovom slučaju nema potrebe, jer
ni u jednoj bazi ne stoji samo šifra sektora već je uvek jedinica koja se
posmatra odeljenje, znači 4 char (2+2), (uzgred šta je veće sektor ili
odeljenje ? kod mene je sektor > odeljenje).
Na kraju, ne toliko bitno, tu je i manja potrošnja memorije u radu programa
(fajl + index umesto dvostruko više). Pa još jedan program i opcija na meniju
manje. (racionalno do krjaja :)
Goran
clipper.268goxx,
-> #263, mdrazic■ 0. Ne deklarišite polje kao numerik ukoliko sa njim ne računate! Da li
■ se sa šifrom nešto računa? (a može i sa val() ako treba).
Saglasan sam u potpunosti. Naročito kada su šifre u pitanju.
■ 1. rešenje
■ ... STANJE.DBF ... ukini tabelu
Mislim da ipak nije dobro brkati šifarnik i datoteku stanja (babe i žabe :).
■ 2. rešenje
■ ... ali uvodiš i redundansu u bazu pa moraš biti vrlo disciplinovan
■ pri promenama u tabelama (da jedna izmena imena ažurira i one u drugoj
■ tabeli).
Redudansa bi stvarno bila beznačajna da je u pitanju polje koje se ne
ažurira u osnovnoj bazi i to bi bilo najbolje rešenje.
Goran
clipper.269snowwhite,
-> #263, mdrazic■1. rešenje
■
■2. rešenje
Ne valja. Ali nisi ti kriv.
Zaboravio sam da u stanje.dbf stavim st_mag c 3!!!
Ipak hvala na trudu.
Snow.
clipper.270nbatocanin,
-> #187, bceklic> U mojoj ili u njihovoj?
> Moja funkcija ni ne dobije kontrolu prilikom greske?
U tvojoj. Verovatno je neka banalna greška, samo ju je nezgodno
uočiti. Napravi neki mali primer i probaj ga.
>> koristiti neku alternativnu funkciju ili iz neke
> biblioteke ili
> Preporuka?
Ja koristim ovih nekoliko ASM funkcija.
clipper.271nbatocanin,
-> #187, bceklic> U mojoj ili u njihovoj?
> Moja funkcija ni ne dobije kontrolu prilikom greske?
U tvojoj. Verovatno je neka banalna greška, samo ju je nezgodno
uočiti. Napravi neki mali primer i probaj ga.
>> koristiti neku alternativnu funkciju ili iz neke
> biblioteke ili
> Preporuka?
Ja koristim ovih nekoliko ASM funkcija.
print.zipclipper.272nbatocanin,
U vezi sistema za otvaranje datoteka...
Ja sam dugo tražio dobar način za ovo i mislim da sam ga pronašao. To
je sistem pseudo-transakcija koji sam opisao u nekim Računarima. Da
ne hvalim sopstvene ideje, ali taj sistem se pokazao izuzetno u
praksi i svakim danom uviđam sve više njegovih prednosti. Jednostavan
je za realizaciju i krajnje jednostavan za upotrebu.
Prva faza ovog rešenje bi bila da uvedete neki rečnik podataka: nije
bitno kakav, ali važno je da ne vodite računa o otvaranju indeksa
pridruženih DBF-u i sl.
U sledećoj fazi sam definisao kao elementarne transakcije sledeće operacije:
- Otvaranje DBF datoteke sa indeksima (T_USE)
- Selektovanje radne oblasti (T_SELECT)
- Izbor aktivnog indeksa (T_ORDER)
- Zaključavanje sloga ili datoteke (T_?Lock)
- šta vam još zatreba
Za svaku od el.transakcija napravio sam funkciju koja obavlja šta
treba, pri čemu vodi računa da u mreži u slučaju neuspeha postavi
kontrolno pitanje o nastavku operacije i sl. Takođe, funkcija za
otvaranje koristi rečnik podataka i otvara sve pridružene indekse.
Može se lako uključiti i SET RELATION, ali ovo ne koristim. Veoma je
važno da svaka transakcija kada obavi posao u specijalni LOG upiše
šta je urađeno.
E, sad: kada mi zatrebaju podaci iz baze, pravim niz transakcija u
okviru specijalne konstrukcije. Na primer, ako neka procedura treba
da prelistava par DBF datoteka, telo te procedure izgleda ovako:
T_BEGIN
T_USE Artikli
T_USE MagKol
T_USE Magacini
// obrada...
T_END
Kako ovo radi: redom se otvaraju ove datoteke. Ako negde zapne, pravi
se ponovni pokušaj, pri čemu se posle nekoliko pokušaja pita korisnik
hoće li da nastavi ili odustane. No, to nije bitno: krajnji rezultat
su ili sve otvorene datoteke ili se sve zatvaraju, a kontrola prelazi
iza T_END naredbe. Pri restauraciji se koristi prethodno pomenuti LOG
(običan niz). Naravno, ovo prethodno može biti i komplikovanije: može
se tražiti otvaranje, zaključavanje i još svašta po želji: postoji i
posebna naredba koja prekida transakciju. Na primer:
T_BEGIN
T_USE Artikli
T_Order ("Art_Naz")
IF NextID() == NIL ; T_BREAK ; END IF
T_END
Ako se obrada uspešno završi, T_END zatvara sve otvoreno, skidaju se
lokovi, vraćaju kontrolni indeksi, i uopšte, sistem je opet u
stanju pre naredbe T_BEGIN. Može li bolje? Možda, ali ja ne znam
kako. Ovako nema zezanja sa "zaboraviš da vratiš aktivnu oblast",
zaboraviš da zatvoriš otvoreno i sl. Sve je maksimalno pregledno i
jednostavno. Prelaz sa jednog na drugi RDD je trivijalan. Izmene
takođe.
Dalje: zaključavanja baze sam vremenski sveo na najmanju moguću meru:
prvo se sve spremi u memoriji i tek onda se sve upisuje na disk u
novoj (ugnježdenoj) transakciji. Na primer:
T_BEGIN
T_FLock ("Artikli")
T_RLock ("MagKol")
// upis...
T_END
Inače, kod "velikih" baza je pitanje otvaranja i zatvaranja datoteka
besmislen i o njemu vodi računa sistem za upravljanje bazom. Na
primer, ObjectDB vodi evidenciju otvorenih datoteka po LRU algoritmu,
pa kad mu zafali file handleova, on zatvori koji DBF, otvori novi i
tako u krug. Ovo bi se moglo lepo primeniti gore i tako dobiti
beskonočano file handleova. Eto meni ideje za proširenje :)
clipper.273nbatocanin,
-> #188, bceklic>> cb := &("{|| x < " + Str(n) + "}")
>
> Kasnije bi on koristio ovu istu konstantu
> (pri ponovnom pozivu ove funkcije) sto meni ne odgovara,
> zar ne?
Da, ali kako ti onda ne rešava problem običan kodni blok? Jer, on
deli promenljive sa funkcijom u kojoj je definisan. To znači da će
izmene promenljive van kodnog bloka videti i on.
clipper.274nbatocanin,
-> #210, bceklic> Same funkcije vode racuna i o mnogim drugim stvarima a
> sustina svega ovoga je pokusaj da se izbegne ponavljanje
> istog koda u mnogim delovima programa sto je u clipperu
> tako cest slucaj.
Da ti dam jedan savet: nemoj dozvoliti da te želja za uopštavanjem
procedura odvede u krajnost previše uopštenih komplikovanih procedura
kojima je teško upravljati. Moraš naći pravu meru kako bi očuvao
kontrolu. Da ne ispadne da popujem, i sam sam dosta često pravio ovu
grešku. Procedure RadimSveŠtaOćeš nisu baš dobre za kvalitet
programa. Rekao bih da je ovo klasična greška _dobrih_ ne-Clipper
programera kad pređu na Clipper.
clipper.275nbatocanin,
-> #206, bceklic> POtreban mi je neki pointer na temu kako klipper prenosi
> parametre asm kodu. Uz clipper se dobija primer kako se
> radi ali je ocigledno pisan za kompajliranje sa masm-om
> jer tasm izbacuje gomilu upozorenja.
Imaš detalje u NG-u. Makroi su tu da bi ti samo olakšali pozive, ali
se ne moraju koristiti. Inače, ja nisam uspeo da nateram TASM da
prevede EXTENDA.INC, mada se reklamira kao 100% MASM kompatibilan ;)
Mada, čini mi se da je neko rekao da ovo može.
clipper.276nbatocanin,
-> #229, goxx> Moja iskustva:
>
> Pre otprilike pola godine (ili je bilo godinu dana?) i ja
> sam postavljao ovakva pitanja u ovoj konferenciji i
> dobijao sam slične odgovore što mi na kraju nije baš
> previše pomoglo, ali glavna smernica je ostala da se
> štampač tretira kao binarni fajl.
Rešenje nije loše, ali mislim da ćeš imati problema u neregularnim
situacijama. Inače, ja koristim sistem sa INT 17, ali nemam nikakvih
problema. Pošto svo štampanje ide preko jedne funkcije, nije mi
problem usmeriti sve na drugi port, datoteku i sl.
clipper.277nbatocanin,
-> #214, snowwhite> U ruke mi je pao R104, i u njemu Clipper savetnik.
> Covek dao dobre ideje, ali ima jedna specificnost
> koja nije obradjena.
Hm, ja ovo nisam obrađivao, ali evo kako bi moglo:
1) Korišćenjem uslovnog indeksa, indeksiraš po uslovu MagKol->Kol<>0
2) Napraviš poseban skipBlock za TBrowse koji za sledeći element bira
onaj koji ima količinu <> 0. Ovo je mnogo bolje rešenje.
clipper.284dvesic,
-> #264, mdrazic>> Ne valja. Osim tvog programa sa obe otvorene tabele i
>> postavljenom relacijom među njima nećeš moći ažurirati zapise.
>> Iz DBX-a nećeš ni moći čak da koristiš index za pregled. Da
>> ne pričamo ako još neka aplikacija treba da koristi ove
>> podatke.
Nisam ni ja rekao da je rešenje savršeno (daleko od toga!),
ali radi posao, bar dok ne prestruktuira baze :)))
clipper.285bceklic,
-> #271, nbatocanin> U tvojoj. Verovatno je neka banalna greska, samo ju je nezgodno
> uociti. Napravi neki mali primer i probaj ga.
Vec sam pisao o tome da je problem u tome sto ona ni ne dobije
kontrolu.
> Ja koristim ovih nekoliko ASM funkcija.
Pogledacu, vec sam planirao da napisem nekiliko funkcija baziranih
na int 17..Thanx
clipper.286dvesic,
-> #257, markoni>> Ako koristite 4dos, može vam se desiti da imate problema sa
>> nekim programima pisanim na Clipper-u. Naime, ukoliko program
>> koristi naredbu
U kom Clipper-u (S'87 ili 5.2d) i kakvih problema ? Radim sa šest
mašina (5 na poslu, 1 kući), SVE koriste 4dos 5.5 i nemam ama baš
nikakvih problema sa RUN komandom.
clipper.287bceklic,
-> #274, nbatocanin> komplikovanih procedura kojima je tesko upravljati. Moras naci
> pravu meru kako bi ocuvao kontrolu. Da ne ispadne da popujem, i
> sam sam dosta cesto pravio ovu gresku. Procedure
> RadimSveStaOces nisu bas dobre za kvalitet programa. Rekao bih
> da je ovo klasicna greska _dobrih_ ne-Clipper programera kad
> predu na Clipper.
Moram priznati da sam ovaj problem vec osetio. Jednostavno nemoguce
je napraviti potpuno univerzalnu proceduru a da njena upotreba bude
jednostavna. Zato sam citav posao zaustavio na odredjenoj granici a
posebne zahteve resavam posebnim procedurama. Kako istovremeno radim
na dva velika projekta (jedan u asm-u a drugi u clipper-u) moram
priznati da mi nije ni malo lako, jer vrlo cesto moram da menjam
nacin razmisljanja. Pc guard (program za zastitu i izradu instalacionih
disketa na kome radim) sastoji se iz nekoliko nezavisnih programa,ukupno
oko 500 kb sorsa. Istovremeno clipper exe mi je presao 500 kb.
Ipak bez obzira na sve najvise volim da radim u asm-u.
clipper.288bceklic,
-> #273, nbatocanin> Da, ali kako ti onda ne resava problem obican kodni blok? Jer,
> on deli promenljive sa funkcijom u kojoj je definisan. To znaci
> da ce izmene promenljive van kodnog bloka videti i on.
Kodni blok samo sadrzi poziv funkcije a njemu se prenosi promenjljiva
iz trenutno aktivnog get-a. Problem resen...:)
clipper.290mileusna,
-> #260, mdrazic>> organizovan po prozorima (DOS karakter grafika na VGA sa nekim predefini-
>> sanim karakterima da liči na Windows) kojima se položaj i veličina mogu
>> lako menjati, izmenjive palete za korisnike itd. Vidi se da je veliki
Time sam se i ja zanimao jedno vreme (CA-TOOLS). Ali, odustao sam od fontova
jer nisam našao način kako da moja aplikacija detektuje da li je slučajno
startovana u _prozoru_, pa bi se onda umesto lepih okvira pojavile kuke i kvake
Inače, svojevremeno sam nabavio i neku biblioteku (PROVISION.WIN) za koju mi
je rečeno da pravi Win Clipper programe. Međutim, :)) radi se o tome da se sve
zasniva upravo na baratanju sa fonovima, tako da aplikacija liči na Win.
(tasteri, prozori, itd.) O nekom pravljenju Win programa nema ni govora. A što
je najlepše, i oni imaju problem sa Win prozorom, tako da u Prozoru sve liči na
lošu vezu bez MNP-a :)
clipper.291dpredovic,
-> #213, mileusnaSubject: Re: Open-close
> Što se tiče otvaranje datoteka, radim slično kao i mdrazic: tabele
> otvaram tek kada se startuje deo programa u kojem će iste biti korišćene.
> Tako mi se više sviđa, a i manja je šansa da se program slučajno izgubi u
> bezbroj baza i indeksa.
ObjectDB ima prilično inteligentnu taktiku: jednom otvoren fajl više se
ne zatvara, sve dok ne ponestane hendlova, a onda zatvori fajl koji najduže
nije korišćen. Doduše, ima i opcija da pri startovanju otvori sve, pa kud
puklo.
clipper.292dpredovic,
-> #201, mdrazicSubject: Re: relacije
> Ako ti uvek za svaki 'parent' zapis trebaju svi 'child' zapisi
> onda nema usporenja. Ako ne treba, radi se nepotreban posao
> seekovanja na 'child' zapise koji ti ne trebaju.
Hmh... Gledajući onaj NG za pravljenje RDDova, čini mi se da je dobar
deo njegovih aktivnosti posvećen "stabilizovanju" relacija, što bi trebalo
da znači da child->dbseek sledi tek ako se explicitno obratiš child bazi.
clipper.293dpredovic,
Subject: funcky
Ni funcky nije što je nekad bio... I u ovom final patchu ima jedan
vrlo blesav bag u dual modu: javlja gpf pri fast-formatizovanu diskete.
Razlog? Izgleda da je u rootvx zaostala real-mode verzija funkcije.
Rešenje?
SEARCH rootvx
MODULE _fastfor FROM funcky2x
MODULE __fmt FROM NUL
BEGINAREA
LIB funcky52
LIB funckyvm
LIB funcky2x
ENDAREA
Pošto ovo i nije baš najčistije rešenje (ali radi) trebalo bi videti
da nije izašao i neki super-extra-final patch.
clipper.294mdrazic,
-> #267, goxx> ■ > 02 00 sektor Novi Sad
> ■ > 01 01 odeljenje 1
> ■ > 01 01 odeljenje 2
> Tabela stvarno može da se normalizuje, ali u ovom slučaju nema potrebe,
> jer ni u jednoj bazi ne stoji samo šifra sektora već je uvek jedinica
> koja se posmatra odeljenje, znači 4 char (2+2), (uzgred šta je veće
> sektor ili odeljenje ? kod mene je sektor > odeljenje).
Ali 02 00 nije odeljenje već sektor.
> Na kraju, ne toliko bitno, tu je i manja potrošnja memorije u radu
> programa (fajl + index umesto dvostruko više). Pa još jedan program i
> opcija na meniju manje. (racionalno do krjaja :)
Zašto bilo kakva promena menija. Može sve da se radi i bez dodatnih
menija (osim ako samo otvoriš browse na tabelu pa da se puni bez kontrole
recimo da ne uđe odeljenje a da nema definisan sektor kome pripada).
Sa više fajlova smanjuješ vreme obrade ako želiš recimo samo da listaš
i/ili pretražuješ sektore. Kako rešavaš upit tipa: daj sva odeljenja
sektora iz Novog Sada (a ne znamo mu šifru)?
Milan
clipper.295mdrazic,
-> #268, goxx> Mislim da ipak nije dobro brkati šifarnik i datoteku stanja (babe i žabe
> :).
A zašto ne bi moglo da stanje uđe u tabelu artikala? Razmisli. Da li
taj šifarnik održava neko drugi, a ti ga dobiješ gotovog?
> ■ ... ali uvodiš i redundansu u bazu pa moraš biti vrlo disciplinovan
> ■ pri promenama u tabelama (da jedna izmena imena ažurira i one u drugoj
> Redudansa bi stvarno bila beznačajna da je u pitanju polje koje se ne
> ažurira u osnovnoj bazi i to bi bilo najbolje rešenje.
Treba samo pri ažuriranju prve tabele automatski da se ažurira i to
polje u drugoj. Ako samo tvoja aplikacija radi sa tim podacima, to
je sve što je potrebno. Ako ne, postoji problem. Možeš i da uradiš
neku 'utility' opciju za ažuriranje ovih polja u drugoj tabeli za ne
daj bože.
Milan
clipper.296goxx,
-> #294, mdrazic■ > jer ni u jednoj bazi ne stoji samo šifra sektora već je uvek jedinica
■ > koja se posmatra odeljenje, znači 4 char (2+2), (uzgred šta je veće
■ Ali 02 00 nije odeljenje već sektor.
Na primer, slog ulaznog računa. Ne stoji da je račun iz 02 00, već iz
02 01 (sve mora da bude iz nekog odeljenja).
■ Zašto bilo kakva promena menija. Može sve da se radi i bez dodatnih
■ menija (osim ako samo otvoriš browse na tabelu pa da se puni bez kontrole
■ recimo da ne uđe odeljenje a da nema definisan sektor kome pripada).
Pa, na meniju "Šifarnici", imam opciju "Organizacione jedinice", a sa dve
datoteke bih morao da napravim opcije "Sektori" i "Odeljenja", ili da
iskomplikujem jedan program da radi sa dve tabele ili sa jednom tabelom
koja kombinuje podatke iz dve datoteke :)
■ ... Kako rešavaš upit tipa: daj sva odeljenja sektora iz Novog Sada
■ (a ne znamo mu šifru)?
I da pravim upit po odeljenjima, morao bih da imam indeks po tom polju
koje u sebi ima na dva prva mesta, šifru sektora, i na sledeća dva
šifru odeljenja. Naziv sektora dobijam sa org_jed->(DBSEEK(sektor+"00")).
Naziv sektora je u stvari neko nulto odeljenje koje inače ne postoji
(nije dozvoljeno za korisnika). Znači "0201" .. "0299" je sektor Novi Sad.
Goran
clipper.297markoni,
-> #286, dvesic> U kom Clipper-u (S'87 ili 5.2d) i kakvih problema ? Radim sa šest
> mašina (5 na poslu, 1 kući), SVE koriste 4dos 5.5 i nemam ama baš
> nikakvih problema sa RUN komandom.
U 5.2d. Ne znam kako ti nemaš problema, ali kod mene je upravo kako
sam opisao. Dok ručno ne postavim COMSPEC, uopšte neće da pokrene
neki eksterni program, a što je najžalosnije ne prijavljuje nikakvu
grešku, nego samo pređe preko takve naredbe :(( Na šta ti je
postavljen COMSPEC? Probao sam još na jednoj mašini i isto ne radi.
Inače, 4dos je takođe 5.5, dos 6.20 (u oba slučaja).
clipper.298vlaslo,
-> #220, vlaslo> Da li zna neko sta bi to trebalo da zanci
> ADAM: Error opening application catalog
> kod CA-VO. Instalacija je ok, ali nista ne radi zbog gornje
> greske.
Sorry... izgleda da je uzbuna bila lazna. Malo ceprkanje po *.ini
i namestanje dir-ova na pravo mesto sve je resio problem...
10x
cu Zoli
clipper.299bulaja,
-> #261, mdrazic│Indeks se ažurira samo pri promenama u tabeli i uvek je spreman za rad
│i ne troši memoriju i ...
└───
... i za druge stvari sem pregleda po tom fiksnom uslovu je neupotrebljiv
:). Teorijski posmatrano, ovakvi indeksi nisu dobro rešenje i ne treba ni
razmišljati o njihovom korišćenju :). Idealno bi bilo da ne postoje ovakvi
složeni indeksi i da programer mnogo ne razmišlja o optimizaciji uputa -
nek RDD-u samo prosledi željeni uslov pregleda (odnosno filtriranja baze),
a RDD bi dalje trebao da se brine o optimizaciji. To je npr. princip po
kome radi MachSIx ili Comix-ov ClipMore (za ovaj drugi pretpostavljam,
nisam ga još koristio:) ili (u određenoj meri) i SIx-ov SET SCOPE.
Ono rešenje sa nizom je u osnovi slično načinu na koji ovi optimizatori
inače rade - iz cele baze se izdvoje samo slogovi koji zadovoljavaju
određeni uslov, koristeći pri tome postojeće indekse i što većoj meri.
Pošto ne pravimo RDD koji to sve radi transparentno, potrebno je još i
predefinisati standardne metode za skakanje po bazi.
Određivanje redosleda pregleda (koje se u mom primeru obavlja sortiranjem
niza) je nažalost stvar koju Mach SIx ne radi (doduše može se aktivirati
neki indeks u MachSIx filtirranoj oblasti, ali je to jako sporo), iako to
nije neki problem za izvođenje - npr. može se izvesti tako da prilikom
kreiranja preseka dve liste slogova (JOIN-ovanja po AND uslovu) ostaje
aktivan redosled u prvoj listi (a taj redosled je uslovljen indeksom na
osnovu koga je izdvojen skup slogova).
clipper.300bulaja,
-> #268, goxx│Mislim da ipak nije dobro brkati šifarnik i datoteku stanja (babe i žabe :).
└───
A što :)? I naziv artikla (i druge informacije za čije potrebe se
koriste šifarnici) i stanje su na isti način (1-1) vezani za neki
artikal (odnosno njegovu šifru) pa nema potrebe koristiti odvojene
baze (sem ukoliko se šifarnik održava na nekom drugom mestu).
clipper.301bulaja,
-> #277, nbatocanin│2) Napraviš poseban skipBlock za TBrowse koji za sledeći element bira
│onaj koji ima količinu <> 0. Ovo je mnogo bolje rešenje.
└───
Ovo je praktično isto (po koncepciji, a i po "brzini") što i SET FILTER
(koji nije lepo koristiti:), s tim što se prilikom ulaza u browse
izračunava samo za vidljive slogove (SET FILTER prođe kroz celu bazu) pa
nema neprijatnog čekanja, a dobro je što ostavlja mogućnosti za neke
optimizacije (npr. čuvanje liste slogova za koje je već jednom izračunat
uslov).
clipper.302bulaja,
-> #290, mileusna│Inače, svojevremeno sam nabavio i neku biblioteku (PROVISION.WIN) za
│koju mi je rečeno da pravi Win Clipper programe. Međutim, :)) radi se o
│tome da se sve zasniva upravo na baratanju sa fonovima, tako da
│aplikacija liči na Win. (tasteri, prozori, itd.) O nekom pravljenju Win
│programa nema ni govora.
└───
Biblioteka koja omogućuje da Clipper programi rade pod Windows-ima zove
se "Clip for Win" (izdaju je Grumpfish Inc.). ProVision:Windows je
kompletna biblioteka za event-driven user interface za Clipper (dakle
nešto :) više od običnog redizajniranja text mode fontova). U slučaju da
detektuješ da ti program radi pod Win, PW-u se može naložiti da ne
koristi redefiniciju fontova (oni to zovu TMR - Text Mode Redefinition
mode), u kom slučaju program radi sa standardnim line-draw karakterima
(kad izgleda ružno:) koje PV:W i inače koristi kad radi na herculesu.
clipper.303stosic,
Zatvaranje dijalog prozora (u VO) pomocu ESC tastera se moze resiti na sledeci
nacin (primer je za Standard MDI aplikaciju):
1. Dodati self:Override() u init() metod klase HelpAbout
2. Napisati Dispatch() metod:
method Dispatch(oEV) class HelpAbout
local strucEVENTMSG as NB_EVENTMSG
strucEVENTMSG := memalloc (_sizeof (NB_EVENTMSG) )
strucEVENTMSG := ptr (_cast, oEV:__pCat)
if strucEVENTMSG.Message == WM_COMMAND
if strucEVENTMSG.wParam == 2
self:EndDialog()
endif
endif
strucEVENTMSG := NULL_PTR
memfree (strucEVENTMSG)
return super:Dispatch(oEV)
clipper.304nbatocanin,
-> #285, bceklic> Vec sam pisao o tome da je problem u tome sto ona ni ne
> dobije kontrolu.
To i kažem: mora biti da nešto trivijalno grešiš.
clipper.305dsisic,
Six patch...
sx202.zipclipper.306dsisic,
A tu je i internacionalna verzija...
sx202i.zipclipper.307milanv,
-> #191, milanv║║ - Da li postoji mogućnost (ma znam da postoji:) korišćenja
║║ dugižih polja nego što mogu da stanu u predviđeni prostor za
║║ Browse()? Mislim na nešto kao PICTURE "čS30".
║║ - Kako se najlakše aktivira MemoEdit() iz Browse()?
Da li to što nema odgovora na ova dva pitanja znači da su
suviše trivijalna ili su suviše složena/nerešiva (ma, dobro,
znam da nije ovo drugo:)?
U vezi prvog pitanja, recite bar da li je rešenje u liniji:
- AADD (cols, TBColumnNew ('Naziv artikla', šđđ ar_nazivć))
ili u
- browser:addColumn (colsŠiĆ).
clipper.308vlaslo,
hi :-)
Ima li neko iskustva sa Clipper 5.2d International ver.
Uz njega se dobijaju neki obj-evi...
Problen je sledeci: tu se nalaze objevi za ntx i mdx,
interesuje me da kakva su iskustva ako se neki koristi sa
cdx driverom.
Moji rezultati su sledeci:
- svi vrse date konvrezije i sorteve
- ntx trazi nesto vise memorije nego mdx
Pa sta kazete...
cu Zoli
clipper.309d.petrovic,
-> #297, markoni> U 5.2d. Ne znam kako ti nemaš problema, ali kod mene je upravo
> kako sam opisao. Dok ručno ne postavim COMSPEC, uopšte neće da
> pokrene neki eksterni program, a što je najžalosnije ne
> prijavljuje nikakvu
5.01 nigde ne zeza. Probaj da izvrsis run 4dos.com
clipper.310mileusna,
-> #302, bulaja>> se "Clip for Win" (izdaju je Grumpfish Inc.). ProVision:Windows je
>> kompletna biblioteka za event-driven user interface za Clipper (dakle
>> nešto :) više od običnog redizajniranja text mode fontova). U slučaju da
Da, u pravu si. Gledajući Demo dalo se naslutiti da ima tu "nečeg", ali, ja
sam očekivao "prozore", pa sam zato bio razočaran te se nisam puno ni obraćao
pažnju na ostalo. Inače, oni moji fontovi nemaju nikakve veze sa ovom
bibliotekom. Sve je u stilu novijih verzija NORTON UTILITY-a, ali, kao što
rekoh od toga sam odustao iz pomenutih razloga, a i našao sam prelazno rešenje
za izradu okvira koje mi savršeno odgovara i ne dira fontove.
clipper.311bceklic,
-> #302, bulaja> redizajniranja text mode fontova). U slucaju da detektujes da
> ti program radi pod Win, PW-u se moze naloziti da ne koristi
Kad smo vec kod toga, kako se najlakse a sa najvecom sigurnoscu moze
ustvrditi da je dos program startovan pod Win-om. Ja na svojoj masini
i nemam Win...:(
clipper.312mdrazic,
-> #299, bulaja> ... i za druge stvari sem pregleda po tom fiksnom uslovu je neupotrebljiv
> :). Teorijski posmatrano, ovakvi indeksi nisu dobro rešenje i ne treba ni
> razmišljati o njihovom korišćenju :). Idealno bi bilo da ne postoje
Zavisi koliko često ti treba pregled po tom fiksnom uslovu.
> ovakvi složeni indeksi i da programer mnogo ne razmišlja o optimizaciji
> uputa - nek RDD-u samo prosledi željeni uslov pregleda (odnosno
> filtriranja baze), a RDD bi dalje trebao da se brine o optimizaciji. To
> je npr. princip po kome radi MachSIx ili Comix-ov ClipMore (za ovaj drugi
Pa ko može bolje da izvrši optimizaciju od tebe koji znaš i posao koji se
radi i obim podataka. MachSix, Rushmore i slični su dobri kada bazu
napadaš sa 'dot prompta' ali ne vidim da mogu da poboljšaju rad kod
poznatog posla koji je predviđen i ugrađen u aplikaciju. Ako neko misli
da glupa mašina može bolje da optimizuje upit od njega samog, bolje
da traži drugi posao :)
Kada brdo poslova prevališ na mašinu (optimizacija upita, organizacija
transakcija, održavanje integriteta) dobiješ aplikaciju pisanu bez
neposredne brige (i rada) po ovim stvarima. A onda se iznenadiš kako
to recimo u Oracle-u na 8MB RAM radi sporije nego na Clipper-u sa 1MB.
Milan