Greške #25891
Zatvorenupdate_rec_dbf_and_server() bug, problem kada u id-ovima imamo numerička polja
100%
Opis
Ovo je recimo interesantno kod LD-a
Kod LD-a su nam ključna polja
- godina (N)
- mjesec (N)
- idrj (C)
- idradn (C)
- obr (C)
Povezani tiketi 3 (0 otvoreno — 3 zatvorenih)
Izmjenjeno od Saša Vranić prije oko 13 godina
ovo je ta kritična tačka
https://github.com/knowhow/F18_knowhow/blob/298ff27cdd5bdf453a4a35e/common/f18_db.prg#L366
kada se puni string _full_id_dbf a vrijednost _values_dbf[_field] je zapravo numeričko polje godina ili mjesec
Izmjenjeno od Saša Vranić prije oko 13 godina
Evo kako se to u LD-u sve inicijalizuje
https://github.com/knowhow/F18_knowhow/blob/298ff27cdd5bdf453a4a/ld/ld_obracun_unos.prg#L71
evo kako sam ja to ranije morao raditi
https://github.com/knowhow/F18_knowhow/blob/298ff27cdd5bdf453a4a/ld/ld_semaphores.prg#L23
da bih dobio ispravno ids matricu
Izmjenjeno od Ernad Husremović prije oko 13 godina
if !update_rec_server_and_dbf( nil, _vals, _fields, ; { |x| "godina=" + _sql_quote(STR(x["godina"],4)) + ; " and mjesec=" + _sql_quote(STR(x["mjesec"],2)) + ; " and idrj=" + _sql_quote(x["idrj"]) + ; " and idradn=" + _sql_quote(x["idradn"]) + ; " and obr=" + _sql_quote(x["obr"]) } ) ....
ovaj kodni blok tvori sql where izraz
u njemu ne vidim potrebu za STR operacije
"godina=" + _sql_quote(x["godina"])) + ; " and mjesec=" + _sql_quote(x["mjesec"]) + ; " and idrj=" + _sql_quote(x["idrj"]) + ; ...
ovaj where izraz je korektan godina je numeričko polje i usporedba mora biti sa numeričkim poljem u SQL izrazu
Izmjenjeno od Ernad Husremović prije oko 13 godina
hmm a ovdje je problem sabiranja dbf numeričkih i string polja
https://github.com/knowhow/F18_knowhow/blob/298ff27cdd5bdf453a4a35e/common/f18_db.prg#L371
Izmjenjeno od Ernad Husremović prije oko 13 godina
fokusirajmo se na semaphores sifrarnici ovaj HSEEK
tu se znači jednostavno prebacujemo na index tag i radimo HSEEK po ključu IDS-a
Izmjenjeno od Ernad Husremović prije oko 13 godina
i brišemo lokalno slogove koji su predmet sinhronizacije
Izmjenjeno od Ernad Husremović prije oko 13 godina
znači što se tiče sql upita ono što sam rekao u predhodnom komentaru stoji - ne treba str u SQL izrazu
Izmjenjeno od Ernad Husremović prije oko 13 godina
mi ovo trebamo uraditi za numerička polja:
_fields := { "godina", "mjesec", "idrj", "idradn", "obr" }
_fields := { {"godina", 4}, {"mjesec", 2}, "idrj", "idradn", "obr" }
konda u update rec dbf_and server ova polja STR-ovati sa brojem koji je naveden ... to je čisto
Izmjenjeno od Ernad Husremović prije oko 13 godina
- Status promijenjeno iz Novo u Dodijeljeno
- Odgovorna osoba promijenjeno iz Ernad Husremović u Saša Vranić
- Prioritet promijenjeno iz Normalan u Odmah riješiti
ovo sam uradio na core librariju
nisam testirao. uzmi to na konkretnom problemu
Izmjenjeno od Ernad Husremović prije oko 13 godina
- % završeno promijenjeno iz 10 u 90
znači ispravi where_block sql i setuj fields num polja kao što sam naveo
Izmjenjeno od Saša Vranić prije oko 13 godina
korigovao sam funkciju, još dosta je tu bilo za ispravke.. ako je numerička varijabla itd...
https://github.com/knowhow/F18_knowhow/commit/c3764a865dab4a7055d4b8e1f084164011839f13
Izmjenjeno od Saša Vranić prije oko 13 godina
mislim da ovdje postoji još jedan problem, ova funkcija pretpostavlja postojeće zapise u dbf-u da bi radila update i provjeravala da li treba raditi update
ako nema zapisa, onda mislim da je problem, ali to je puko nagađanje, to sam trebao sa debugerom da vidim šta se događa
Izmjenjeno od Ernad Husremović prije oko 13 godina
- Odgovorna osoba promijenjeno iz Saša Vranić u Ernad Husremović
Izmjenjeno od Ernad Husremović prije oko 13 godina
Izmjenjeno od Ernad Husremović prije oko 13 godina
// http://redmine.bring.out.ba/issues/25891#note-9 // {"num_polje", length} _t_field := _field[1] _t_field_dec := _field[2] _values_dbf[_t_field] := EVAL(FIELDBLOCK(_t_field)) if _values_dbf[_t_field] != values[ _t_field ] _changed_id := .t. endif _full_id_dbf += STR(_values_dbf[ _t_field ], _t_field_dec) _full_id_mem += STR( values[ _t_field ], _t_field_dec ) ...
ključna stvar je ta što se _values_dbf puni sa numeričkim vrijednostima dok se _full_id_dbf formira kao string varijabla i taj string šalje u semafor na IDS polje.
kasnije će se taj kompozitni ključ koristiti za sekvenciu brisanja dbf-a drugih korisnika
Izmjenjeno od Ernad Husremović prije oko 13 godina
gaDBFs u RADKR¶
za kraj evo stavke za RADKR:
https://github.com/knowhow/F18_knowhow/blob/7664236718e2b4a0be3e00a/common/a_dbfs.prg#L214
Izmjenjeno od Ernad Husremović prije oko 13 godina
AADD(gaDBFs, { F_RADKR , "RADKR" , "ld_radkr", { |alg| ld_radkr_from_sql_server(alg) }, "IDS", { "idradn", "idkred", "naosnovu", {"godina", 4}, {"mjesec", 2 } }, <<<<<<<< dbf fields {|x| "idradn=" + _sql_quote(x["idradn"]) + " AND idkred=" + _sql_quote(x["idkred"]) + " AND naosnovu=" + _sql_quote(x["naosnovu"]) + " AND godina=" + STR(x["godina"], 4) + " AND mjesec=" + STR(x["mjesec"], 2) }, <<<<<<< where_block za SQL where "2" } ) <<<<<<<<< tag "2"
Izmjenjeno od Ernad Husremović prije oko 13 godina
u where_block-u koristimo STR za numerička polja. bitno je da ta vrijednost bude identične širine kao što je i samo polje
Izmjenjeno od Ernad Husremović prije oko 13 godina
- Status promijenjeno iz Dodijeljeno u Zatvoreno
- % završeno promijenjeno iz 90 u 100