Podrška #26954
Zatvorenmodul FAKT, mrežna numeracija dokumenata
Dodano od Saša Vranić prije skoro 13 godina. Izmjenjeno prije više od 12 godina.
50%
Povezani tiketi 2 (0 otvoreno — 2 zatvorenih)
Izmjenjeno od Saša Vranić prije skoro 13 godina
Sada radi po principu:
- napravim dokument u pripremi
- na opciju štampe dokumenta iz pripreme setuje se u tabeli fakt_doks master zapis te se pri tome setuje:
- dodjuje se novi broj dokumenta na osnovu zadnjeg broja iz doks
- polje m1 se setuje na "Z" (kao rezervisan zapis)
- setuje se broj dokumenta u tabeli pripreme
- prilikom ažuriranja dokumenta, ako je mrežna numeracija, pronalazi se ovaj broj dokumenta sa markerom "Z" i radi se update tog zapisa u fakt_doks i dodaju stavke u fakt_fakt tabelu
Izmjenjeno od Saša Vranić prije skoro 13 godina
- % završeno promijenjeno iz 0 u 10
Izmjenjeno od Saša Vranić prije skoro 13 godina
Postoji otvoren i ovaj tiket #25077 gdje smo već pisali na tu temu
Izmjenjeno od Ernad Husremović prije skoro 13 godina
ovaj gornji algoritam bi trebao bez problema raditi i na F18. provjeri.
Uključiti kod nas.
Izmjenjeno od Saša Vranić prije skoro 13 godina
I to u F18 ne radi!
Treba ispravit par stvari
Izmjenjeno od Ernad Husremović prije skoro 13 godina
kada već radiš ... preskoči dbf/semafore na ključnim mjestima.
znači kada se "uzima" novi broj gledaj bazu.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
mislim naravno na server db tabele
Izmjenjeno od Saša Vranić prije skoro 13 godina
ispravio sam dio gdje se dodaje append u bazu fakt_doks, to sada radi, međutim ažuriranje ne radi, ažuriranje se desi ali dokumenta nigdje
moram pogledati šta se događa kod ažuriranja u ovoj varijanti
Sama procedura ažuriranja će se trebati ispraviti, jer se uvijek dešava "INSERT" transakcija, u ovoj varijanti će trebati "UPDATE" da se dešava
Izmjenjeno od Saša Vranić prije skoro 13 godina
- % završeno promijenjeno iz 10 u 20
Izmjenjeno od Ernad Husremović prije skoro 13 godina
čini mi se da ideš u pogrešnom smijeru.
Ovdje je (u dijelu koji utvrđuje broj dokumenta je) potrebno napustiti FMK logiku ...
zaključavanje dbf + server db putem semafora ovdje treba skroz isključiti ...
Izmjenjeno od Ernad Husremović prije skoro 13 godina
po svemu sudeći pogrešno da debugiraš FMK kod i bakćeš se sa logikom dbf/semafori.
treba direktno ažurirati serversku tabelu čime će se postići i kvalitetnije i jednostavnije rješenje.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
da stvar preciziram:
1) utvrđivanje broja dokumenta treba da gleda isključivo serverske tabele, uopšte ne treba gledati dbf.
Ako ti je lakše možeš slijediti tu logiku rezervacije brojeva koja se koristila
daj_mi_slobodan_broj_dokumenta() => stavlja se broj , stavlja se ime usera da se zna ko je zauzeo tabelu
(u slučaju brisanja dokumenta pojavljuje se rupa u fakt_doks koja se popunjava kod sljedeceg uzimanja broja)
ono što je ovdje bitno jeste da funkcija daj_mi_broj_dokumenta() ne gleda dbf-ove nego serverske tabele.
kasnije se ažurira lokalno stanje ali ne sa update_server_and_dbf nego sa update_server
2) kada je korisnik dobio broj koji je validan, operacija ažuriranja je identična onoj koja trenutno funkcioniše u F18
nikakvko žongliranje i komplikovanje sa markerima nije potrebno.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
trenutno je problem sve ovo "umotati" u jednu transakciju (za to su potrebni semafori v1.1) što bi proceduri dalo potrebnu robusnost, ali se i sada bez problema može dobiti zadovoljavajuče, sigurno puno bolje i jednostavnje rješenje nego je to postojeća implementacija mrežne numeracija u FMK koja je zbog tehnoloških ograničenja neminovno bila komplikovana.
Izmjenjeno od Saša Vranić prije skoro 13 godina
Ma da ti kažem, nisam ni mislio nastavljati tako, nego sam samo postojeći kod otkočio pošto je izbacivao greške.
Izmjenjeno od Saša Vranić prije skoro 13 godina
a ono rekao si da provjerim da bi to trebalo raditi bez problema, mislim postojeći kod, pa eto
Izmjenjeno od Ernad Husremović prije skoro 13 godina
pretpostavio sam, ali svakako od početka moramo imati jasnu strategiju šta želimo.
dovođenje stanja na nulu u ovom slučaju će najprije biti izbacivanje nepotrebnog koda za mrežnu numeraciju.
Kada uključiš mrežnu numeraciju sam dio ažuiraranja dokumenta treba biti 99% identičan postojećem kada je mrežna numeracija = N.
ključna razilika je dodjeljivanje broja i nju treba napisati u par čistih funkcija koje direktno rade sa serverskim tabelama.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
evo jedne super jednostavne implementacije
funkcija get_next_broj_fakture() cBroj := get_globalni_parametar(10/broj_dokumenta")
ova implementacija znači ima brojače za svaki tip dokumenta posebno kao globalne serverske parametre
Ona ne handlira rupe (ako jedan korisnik izbriše dokument iz pripreme, a ranije je uzeo broj)
sljedeća je već puno pametnija:
Izmjenjeno od Ernad Husremović prije skoro 13 godina
cBroj := get_globalni_parametar( ...) for i:=1 to 10 // da li je zauzet raniji broj, pogledaj na serveru if da_li_je_zauzet_broj(cBroj minus i) daj korisniku raniji broj endif next
ova implementacija znači gleda 10 brojeva unazad i popunjava rupe u numeraciji.
čitav ovaj algoritam riješen je znači sa par serverskih parametara i provjerom da li na serveru imamo određeni broj dokumenta u fakt_doks.
Ovo je jednostavno ali radi posao siguran sam puno bolje nego li FMK mrežna numeracija
Nikakvi lokovi fakt_doks nam ne trebaju
Izmjenjeno od Ernad Husremović prije skoro 13 godina
- Status promijenjeno iz Novo u Dodijeljeno
- Prioritet promijenjeno iz Odmah riješiti u Visok
danas se posvetiti migraciji čago na terenu.
Izmjenjeno od Saša Vranić prije skoro 13 godina
Međutim i dalje mi nije jasno...
radna stanica 1 pravi dokument i dodjeli joj sa servera novi broj, recimo 00532 (dokument je u pripremi)
radna stanica 2 pravi dokument i dobija identičan broj 00532
opet imamo 2 ista broja.
Treba napraviti na način da se dodjeljeni broj upiše kao parametar, nešto slično kao kod automatskih PLU kodova...
Tako da ćemo u parametrima imati:
- fakt_10_broj = 00520
- fakt_11_broj = 00125
- kalk_10_broj = 00012
- itd...
Kada pozovem funkciju ona mi praktično treba uvećati ovaj broj i upisati ga na server tako da drugi operater dobija odmah drugi broj i slično.
Brojač dokumenata treba upakovati u jednu funkciju, gdje će se koristiti za sve module.
Parametri su:
- modul
- firma
- tip dokumenta
E sada, imamo i one varijante sa sufiksima i prefiksima itd... znam da to KALK koristi recimo.
Izmjenjeno od Saša Vranić prije skoro 13 godina
ako napravim ovako:
- daj_mi_zadnji_broj_iz_sql -> i da mi broj 00520
- pravim insert na server -> tabela doks sa brojem 00521 (uvećan broj za 1)
zatim u fakt-u recimo se mora izmjeniti logika ažuriranja dokumenta, treba se izbaciti postojeća sql funkcija ažuriranja i ići na varijantu
- update_rec_server...
jer ta funkcija onda odradi
- delete
- insert
tako da će mi pobrisati ovaj append koji sam dodao i zamjeniti ga sa pravim dokumentom
hm...
Izmjenjeno od Saša Vranić prije skoro 13 godina
- Prioritet promijenjeno iz Visok u Odmah riješiti
Izmjenjeno od Saša Vranić prije skoro 13 godina
Ali je onda to uvijek mrežna numeracija dokumenta.
Izmjenjeno od Saša Vranić prije skoro 13 godina
da, tako nešto slično si ti već stavio na 18 komentaru...
znači čak i taj update fakt_doks na serveru ne treba, nego upravo sa globalnim parametrima.
Ima samo jedan problem u cijeloj priči a on je sljedeći:
- radna stanica 1 uzme novi broj - globalni parmetar se setuje 00520
- radna stanica 2 uzme novi broj - opet se setuje na 00521
- radna stanica 2 ažurira dokument - ok
- radna stanica 3 uzima novi broj - globalni parametar prolazi zadnjih 10 i vidi da u bazi nema 00520 ažiriran i daje taj broj
jer radna stanica 1 još radi na dokumentu
Izmjenjeno od Saša Vranić prije skoro 13 godina
to je varijanta koja popunjava praznine i ona će tu napraviti problem
Izmjenjeno od Saša Vranić prije skoro 13 godina
U slučaju da samo gledamo brojač globalnog parametra stvar će raditi, ali su moguće rupe.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
Saša Vranić je napisao/la:
Ali je onda to uvijek mrežna numeracija dokumenta.
Pa naravno
F18 treba napraviti da svi brojači dokumenata funkcionišu po sličnom principu kao što smo radili kod FMK FAKT mrežne numeracije.
To ne treba biti nikakva posebna opcija nego standardno funkcionisanje brojača dokumenata.
Kada se to napravi za FAKT, isto treba uraditi za sve brojače
Izmjenjeno od Ernad Husremović prije skoro 13 godina
Saša Vranić je napisao/la:
U slučaju da samo gledamo brojač globalnog parametra stvar će raditi, ali su moguće rupe.
To nije neki problem. Kao da se i sada ne može desiti rupa.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
Bitno je da se u normalnom scenariju rada ne dešavaju konflikti. Bitno je i da algoritam ne bude "rocket science" kako je manje-više sada.
Izmjenjeno od Saša Vranić prije skoro 13 godina
Dobro, znači idemo na tu varijantu
Izmjenjeno od Ernad Husremović prije skoro 13 godina
čitav koncept dodjeljivanja broja je po meni sporan, i o tome sam već pisao.
Do ažuriranja broj dokumenta ne bi ni trebao da postoji, odnosno trebalo bi da stoji jasna oznak PRIPREMA pa neki privremeni broj koji u konačnici može biti zamjenjen brojem koji nam brojač nudi.
Ali za sada ćemo ostaviti nešto između, da bude slično onome što su FMK korisnici navikli:- broj dokumenta se dobija kada se izvrši privi puta štampa dokumenta iz pripreme
- ako se nakon toga dokument izbriše moguća je rupa u numeraciji
- rupa se može popuniti ručnim navođenjem - ispravkom broja dokumenta
Izmjenjeno od Ernad Husremović prije skoro 13 godina
Saša Vranić je napisao/la:
da, tako nešto slično si ti već stavio na 18 komentaru...
znači čak i taj update fakt_doks na serveru ne treba, nego upravo sa globalnim parametrima.
Ima samo jedan problem u cijeloj priči a on je sljedeći:
- radna stanica 1 uzme novi broj - globalni parmetar se setuje 00520
- radna stanica 2 uzme novi broj - opet se setuje na 00521
- radna stanica 2 ažurira dokument - ok
- radna stanica 3 uzima novi broj - globalni parametar prolazi zadnjih 10 i vidi da u bazi nema 00520 ažiriran i daje taj broj
jer radna stanica 1 još radi na dokumentu
ne. mislim da komplikuješ.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
posljednji dokument tipa 10 je 100, u pripremi.
Brojač 10-last_brdok = 100
user hernad unosi u pripremu novi dokument. Dobija broj 00000 (nema broja)
Vrši štampu dokumenta => dobija broj 100 + 1 = 00101
Izmjenjeno od Ernad Husremović prije skoro 13 godina
user vsasa unosi istovremeno kada i hernad drugi dokument tipa 10.
Dobija isti broj 00000 (nema dodjeljen broj)
Šalje dokument na štampu. hernad je već odštampao dokument 00101.
Brojač je u tom trenutku 101, on dobija 102 => broj dokumenta = 00102.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
Znači davanje broja dokumenta TEK prilikom prve štampe omogućava nam da započnemo unos dokumenta i odustanemo bez ikakvih konsekvenci, odnosno "rupa".
Izmjenjeno od Ernad Husremović prije skoro 13 godina
takođe broj dokumenta 0 (odnosno 00000 ovisno od načina generacije brdok-a) nam jasno kazuje stanje - ovo je dokument koji tek unosimo, sa njim možemo raditi šta god želimo.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
praktično sve što dodajemo je jedan jednostavni globalni brojač po tipovima dokumenata.
kada proširim priču na sve programske module imam:
fakt/10/brdok fakt/20/brdok fakt/25/brdok fin/10/brdok fin/IF/brdok kalk/16/brdok
brojač treba biti najobičnija numerička vrijednost
Izmjenjeno od Saša Vranić prije skoro 13 godina
dobro, to je jednostavna priča :)
Imamo brojače po kontima, sufiksi, prefiksi koji se koriste i aktuelni su
Izmjenjeno od Ernad Husremović prije skoro 13 godina
Saša Vranić je napisao/la:
dobro, to je jednostavna priča :)
Imamo brojače po kontima, sufiksi, prefiksi koji se koriste i aktuelni su
sve to možeš zadržati.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
sufiksi se tvore opet na osnovu broja
Izmjenjeno od Ernad Husremović prije skoro 13 godina
znam da kod nekih korisnika postoje varijante kod kojih su se koristili i neki dodatni uslovi za brojače dokumenata
ali to sve se može primjeniti na ovaj gornji princip bez ikakvih problema.
recimo želim da svaki korisnik ima svoj brojač. To naravno mora biti poseban parametar na nivou korisnika.
Ali se opet svodi na to da dodajemo brojače koji funkcionišu:
fakt/10/hernad/brdok
fakt/10/vsasa/brdok
i opet su sami parametri najibičniji globalni parametri - brojevi.
Izmjenjeno od Ernad Husremović prije skoro 13 godina
na chatu govoriš da su brojači dokumenata u KALK po brojevima konta.
To ima smisla.
Evo takvog seta parametara
kalk/10/1310/brdok
kalk/10/1311/brdok
ukratko opet se sve svodi na istu priču - obične brojače. samo što ih ima više.
Izmjenjeno od Saša Vranić prije skoro 13 godina
mislim na ovo:
magacin 13201 koristi sufix /1 i brojač mu ide:
- 00001/1
- 00002/1
- itd...
magacin 13202 koristi sufix /2 i brojač mu ide:
- 00001/2
- 00002/2
- itd..
Izmjenjeno od Ernad Husremović prije skoro 13 godina
ključna stvar je da se logika ažuiranja uopšet ne mjenja i da se sve te specifičnosti bez problema mogu dodavati.
Naravno bitno je da sve te specifičnosti budu nešto što opet neće činiti kod nepreglednim.
Zato je bolje, ako je to neophodno, uraditi glavne - najjednostavnije varijante a onda te specifične varijante dodavati jednu po jednu.
Bitno je da iz svega ovoga dobijemo pregledan kod i da ono što smo osposobili radi kako treba.
Izmjenjeno od Saša Vranić prije skoro 13 godina
Logika koju ćemo ovdje primjeniti sa pripremom i "0" brojem dokumenta je već aktuelna u modulu RNAL.
Izmjenjeno od Saša Vranić prije skoro 13 godina
Prva varijanta je pala :)
znači kod unosa dokumenta sam ukinuo dodjeljivanje broja
prilikom štampe se provjerava da li treba dodjeliti broj pa se i dodjeljuje...
ili ako drito ažuriramo
Znači u pitanju su dvije funkcije koje se koriste:
Prilikom štampe prvo se poziva fakt_set_broj_dokumenta() funkcija koja odlučuje da li će puniti broj dokumenta ili ne.
Funkcija koja generiše novi broj je fakt_novi_broj_dokumenta()
Evo obrade štampe (c+P) ovdje čisto da se vidi kako se koristi.
Izmjenjeno od Saša Vranić prije skoro 13 godina
Funkcija za dodajeljivanje broja također, ako nema broja u parametru potraži zadnji iz baze pa setuje...
To je kada prvi put nakon uvođenja štampamo
Izmjenjeno od Saša Vranić prije skoro 13 godina
Izbrisao sam iz fakt-a jedno 10 funkcija za određivanje novog broja.
fanovibroj()
fakt_naredni_broj()
odredinbroj()
nbroj()
itd...
dobro, nastavljam sutra
Izmjenjeno od Saša Vranić prije skoro 13 godina
očistiti još kod ažuriranja, ono gMrezno itd..
Izmjenjeno od Saša Vranić prije skoro 13 godina
- % završeno promijenjeno iz 20 u 50
Izmjenjeno od Saša Vranić prije skoro 13 godina
Kod ažuriranja je sve ok, ta je funkcija davno korigovana.
Izmjenjeno od Saša Vranić prije više od 12 godina
- Status promijenjeno iz Dodijeljeno u Zatvoreno