PCPROG.5

05 Jan 1995 - 02 Oct 1995

Topics

  1. algoritmi (106)
  2. comment (2)
  3. ms.dos (27)
  4. windows (332)
  5. asembler (203)
  6. basic (228)
  7. jezici (126)
  8. pascal (1085)
  9. cccc (546)
  10. cpp (117)
  11. clipper (1048)
  12. baze.podataka (194)
  13. fox (231)
  14. cavo (192)
  15. razno (593)

Messages - clipper

clipper.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. 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.207 bulaja, -> #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.208 mdrazic, -> #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.209 mdrazic,
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.210 bceklic, -> #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.211 bceklic, -> #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.212 bceklic, -> #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.213 mileusna, -> #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.214 snowwhite,
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.215 zkrstic, -> #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.216 zkrstic,
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.217 dvesic, -> #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.218 dvesic, -> #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.219 dr.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.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. cu Zoli
clipper.221 vlaslo, -> #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.222 vlaslo,
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.223 vlaslo, -> #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.224 d.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.225 mdrazic, -> #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.226 bulaja, -> #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.227 bulaja, -> #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.228 goxx, -> #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.229 goxx, -> #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.230 goxx,
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.231 snowwhite, -> #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.232 snowwhite, -> #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.233 goxx, -> #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.234 goxx, -> #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.235 goxx, -> #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.236 goxx, -> #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.237 dvesic, -> #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.238 dvesic, -> #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.239 spantic, -> #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.240 bceklic, -> #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.241 bceklic, -> #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.242 bulaja, -> #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.243 bulaja, -> #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.244 mdrazic, -> #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.245 mdrazic, -> #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.246 mdrazic, -> #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.247 mdrazic, -> #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.248 mdrazic, -> #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.249 mdrazic, -> #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.250 mdrazic,
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.251 goxx, -> #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.252 bpekic, -> #220, vlaslo
Mislim 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.253 dvesic, -> #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.254 d.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.255 d.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.256 d.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.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 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.258 bceklic, -> #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.259 bceklic, -> #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.260 mdrazic, -> #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.261 mdrazic, -> #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.262 mdrazic, -> #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.263 mdrazic, -> #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.264 mdrazic, -> #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.265 mdrazic, -> #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.266 bulaja, -> #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.267 goxx, -> #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.268 goxx, -> #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.269 snowwhite, -> #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.270 nbatocanin, -> #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.271 nbatocanin, -> #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.zip
clipper.272 nbatocanin,
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.273 nbatocanin, -> #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.274 nbatocanin, -> #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.275 nbatocanin, -> #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.276 nbatocanin, -> #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.277 nbatocanin, -> #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.284 dvesic, -> #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.285 bceklic, -> #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.286 dvesic, -> #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.287 bceklic, -> #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.288 bceklic, -> #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.290 mileusna, -> #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.291 dpredovic, -> #213, mileusna
Subject: 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.292 dpredovic, -> #201, mdrazic
Subject: 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.293 dpredovic,
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.294 mdrazic, -> #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.295 mdrazic, -> #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.296 goxx, -> #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.297 markoni, -> #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.298 vlaslo, -> #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.299 bulaja, -> #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.300 bulaja, -> #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.301 bulaja, -> #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.302 bulaja, -> #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.303 stosic,
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.304 nbatocanin, -> #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.305 dsisic,
Six patch... sx202.zip
clipper.306 dsisic,
A tu je i internacionalna verzija... sx202i.zip
clipper.307 milanv, -> #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.308 vlaslo,
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.309 d.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.310 mileusna, -> #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.311 bceklic, -> #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.312 mdrazic, -> #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