--[[ 873a0867104de66f ]] local caption = 'Prečíslovanie dokladov' if not db.Opened then MessageBox('Otvorte prosím účtovníctvo, v ktorom si želáte prečíslovať ' .. 'doklady a spustite tento skript znovu.', caption, 64) return false else local frm = New 'TForm' frm.Caption = caption frm.Position = 'poMainFormCenter' frm.Width = 280 std_gui:Init(frm) std_gui:Add('edtCisRada', 'TCiselnikEdit', 'Číselná rada', 'ciselna_rada') std_gui:Add('edtDatumOd', 'TDateEdit', 'Od dátumu').Date = date.encode(Settings.Year, 1, 1) local ud = std_gui:Add('edtCounter', 'TUpDownEdit', 'Počítadlo') ud.Min = 1 ud.Max = 32000 ud.Position = 1 std_gui:Add('', 'TOkCancelButtons', '') frm.ClientHeight = std_gui.Y frm.btnOk.OnClick = function(Sender) -- pozor; Sender ukazuje na gombik btnOk, a nie na formular! local result = true local form = Sender.Parent if not misc.ValidCiselnikID(form.edtCisRada, 'ciselna_rada', false, true) or not misc.ValidDate(form.edtDatumOd) then result = false end if result and date.year(form.edtDatumOd.Date) ~= Settings.Year then misc.ShowInputError(form.edtDatumOd, 'Dátum musí spadať do aktuálneho roku ' .. Settings.Year .. '.') result = false end if not result then form.ModalResult = 0 end end; if frm:ShowModal() == 1 then local res = false local year = Settings.Year local locked_obd = Settings.LockedObdobie local locked_problem = false local cis_rada = frm.edtCisRada.CiselnikID local poradie = frm.edtCounter.Position local ch_total = 0 local ch_changed = 0 if db:locktable 'obrat' then res = true db:begin() -- ziskaj zoznam vsetkych dokladov, ktore su z daneho roku a maju -- datum zauctovania podla nastaveneho filtra, a maju danu ciselnu -- radu pouzitu na cislo dokladu. zorad ich podla datumu zauctovania, -- pre rovnaky datum potom zorad podla rowid - pretoze zaznamy ktore -- boli do databazy pridane neskor, maju vacsie rowid local doklady = db:table('SELECT RowID, ID_obdobie, ID_najomcu ' .. 'FROM obrat WHERE round(ID_obdobie / 100) = ' .. year .. ' AND DatumZauct >= ' .. frm.edtDatumOd.Date .. ' AND ID_dokladu IN (SELECT RowID FROM doklad WHERE ' .. 'ID_CisRadaCislo = ' .. cis_rada .. ') ' .. 'ORDER BY DatumZauct, RowID;' ) ch_total = doklady.RowCount if ch_total > 0 then -- skontroluj zamknute obdobie doklady:First() while not doklady.Eof do if doklady:Field(1) <= locked_obd then res = false locked_problem = true break end doklady:Next() end if res then -- uprav ciselnu radu na zadane pocitadlo. -- todo: POZOR! Toto nie je pekne riesenie, do business treba pridat CiselnaRadaSave... db:exec(string.format('INSERT OR REPLACE INTO ciselna_rada_obdobie ' .. '(ID_ciselnej_rady, ObdobieOD, ObdobieDO, Poradie) VALUES (' .. '%d, %d, %d, %d);', cis_rada, obdobie.encode(year, 0), obdobie.encode(year, 12), poradie )) -- teraz prejdi vsetky doklady a nahod im nove cisla doklady:First() while res and not doklady.Eof do local nove_cislo = business.CiselnaRada( cis_rada, -- ciselna rada doklady:Field(1), -- obdobie doklady:Field(2), -- najomca false -- temporary ) if nove_cislo and db:exec('UPDATE obrat SET ' .. 'Cislo = ' .. misc.SqlString(nove_cislo) .. ' WHERE ' .. 'RowID = ' .. doklady:Field(0) .. ' AND ' .. 'Cislo <> ' .. misc.SqlString(nove_cislo) .. ';') then ch_changed = ch_changed + db.Changes else res = false end doklady:Next() end end end db:finish(res) db:unlocktable 'obrat' if locked_problem then MessageBox('Niektoré zo zvolených obratov sú v zamknutom období. Žiadne obraty neboli zmenené.', caption, 0x10) elseif not res then MessageBox('Počas prečíslovania sa vyskytla chyba. Žiadne obraty neboli zmenené.', caption, 0x10) else MessageBox(string.format('Prečíslovanie obratov je ukončené. ' .. 'Zo všetkých zvolených dokladov (%d) sa číslo zmenilo na %d ' .. 'dokladoch.', ch_total, ch_changed), caption, 0x40 ) end end return res end return false end