private void OKPress() { Window owner = win.getOwner(); if (table.isEditing()) table.removeEditor(); if (win != null) { win.dispose(); win = null; } raProcess.runChild( owner, new Runnable() { public void run() { performMatching(); } }); if (total.one == 0 && raProcess.isCompleted()) JOptionPane.showMessageDialog( owner, "Nema stavaka za pokrivanje!", "Poruka", JOptionPane.INFORMATION_MESSAGE); else if (total.one > 0) JOptionPane.showMessageDialog( owner, Aus.getNumDep( total.one, "Pokriven " + total.one + " saldo", "Pokrivena " + total.one + " salda", "Pokriveno " + total.one + " salda") + " na ukupno " + Aus.getNum(total.two, "stavci.", "stavke.", "stavaka."), "Poruka", JOptionPane.INFORMATION_MESSAGE); }
private void performMatching() { QueryDataSet sks = null, pok = null; Int2 run = new Int2(); String lastcpar = ""; total.clear(); for (int row = 0; row < model.getRowCount(); row++) if (model.isRowSelected(row)) { MatchableCollection mc = (MatchableCollection) model.getValueAt(row, 0); String mkey = mc.getRow(0).getMasterKey(); String cpar = mkey.substring(0, mkey.indexOf('$')); if (!cpar.equals(lastcpar)) { if (sks != null && raTransaction.saveChangesInTransaction(new QueryDataSet[] {sks, pok})) total = total.add(run); run.clear(); sks = dM.getDataModule().getSkstavke(); Skstavke.getDataModule() .setFilter( Aus.getKnjigCond() .and(Aus.getFreeYearCond()) .and(Condition.equal("CPAR", Aus.getNumber(lastcpar = cpar)))); sks.open(); pok = Pokriveni.getDataModule().getFilteredDataSet("1=0"); pok.open(); } PotentialMatch pm = new PotentialMatch(); for (int i = 0; i < mc.getRowCount(); i++) pm.addStavka(mc.getRow(i)); for (int i = 0; i < mc.getMatch().getRowCount(); i++) pm.addStavka(mc.getMatch().getRow(i)); run = run.add(pm.realize(sks, pok)); } if (sks != null && R2Handler.saveChangesInTransaction(new QueryDataSet[] {sks, pok})) total = total.add(run); dM.getDataModule().getSynchronizer().markAsDirty("pokriveni"); }
public void globalChangeFont(String defaultFont, String newFont) { double ratio; String pr = frmParam.getParam( "sisfun", "globalRatio", "1.0", "Faktor rastezanja reporta zbog promjene fonta"); if (pr == null || pr.length() == 0) ratio = Aus.getFontHeightRatio(defaultFont, newFont); else ratio = Aus.getDecNumber(pr).doubleValue(); raReportSection s; Iterator i = sections.iterator(); while (i.hasNext()) { s = (raReportSection) i.next(); s.changeFont(defaultFont, newFont, ratio <= 0 ? 1.0 : ratio); // s.enlargeElementsVertical(1.1); } }
/** * Pokrece pilot-beanshell skripte za ubacivanje podataka iz stranih baza Potrebno je prijaviti * reportext sa NASLOVOM kao naziv klase za knjizenje, te aplikacijum sisfun npr. IME=1, * NASLOV=hr.restart.robno.frmKnjRobno, URL=robnoloader.sql, APP=sisfun i sve skripte sa tim * naslovom ce se izvrsiti prije validacija() metode u NASLOV klasi sortirane by IME (pazi string * sort!) * * @return */ private boolean runPreloader() { try { String cname = this.getClass().getName(); // executeReport(java.net.URL rep, String title, Window owner) QueryDataSet preloaders = Reportext.getDataModule() .getFilteredDataSet( Condition.whereAllEqual( new String[] {"NASLOV", "APP"}, new String[] {cname, "sisfun"})); preloaders.open(); if (preloaders.getRowCount() == 0) return true; preloaders.setSort(new SortDescriptor("IME")); for (preloaders.first(); preloaders.inBounds(); preloaders.next()) { // // raPilot.executeReport(Aus.findFileAnywhere(preloaders.getString("URL")).toURL(),cname, // this ); Interpreter interpreter = new Interpreter(); Object ret = interpreter.eval( FileHandler.readFile( Aus.findFileAnywhere(preloaders.getString("URL")).getAbsolutePath())); return ((Boolean) ret).booleanValue(); } } catch (Exception e) { e.printStackTrace(); return false; } return true; }
public int getPJ(int cpar) { QueryDataSet qds = new QueryDataSet(); String qStr = "select max(pj) as PJ from pjpar where cpar = " + cpar; Aus.refilter(qds, qStr); if (qds.getRowCount() > 0) return qds.getInt("PJ"); return 0; }
public double getMatchFactor(MatchableCollection other) { if (rows.size() > 1 && other.rows.size() > 1) return getMultiMatch(other); if (rows.size() > 1) return other.getMatchFactor(this); String brdok = getRow(0).getBrojDok(); double sim = 0; for (int i = 0; i < other.getRowCount(); i++) sim += Aus.heuristicCompare(brdok, other.getRow(i).getBrojDok(), raOptimisticMatch.getIgnore()); if (sim == 0) sim = 0.01; return sim / other.getRowCount(); }
private double getMultiMatch(MatchableCollection other) { if (rows.size() > other.rows.size()) return other.getMultiMatch(this); double sim = 0; for (int j = 0; j < other.getRowCount(); j++) { String brdok = other.getRow(j).getBrojDok(); double best = 0, now; for (int i = 0; i < getRowCount(); i++) if ((now = Aus.heuristicCompare(brdok, getRow(i).getBrojDok())) > best) best = now; sim += best; } if (sim == 0) sim = 0.01; return sim / other.getRowCount(); }
public boolean Validacija() { if (jlrCorg.getText().equals("")) { jlrCorg.requestFocus(); javax.swing.JOptionPane.showMessageDialog( this.getWindow(), "Obvezatan unos - ORG. JEDINICA !", "Greška", javax.swing.JOptionPane.ERROR_MESSAGE); return false; } if (rpcskl.getCSKL().equals("")) { rpcskl.jrfCSKL.requestFocus(); javax.swing.JOptionPane.showMessageDialog( this.getWindow(), "Obvezatan unos - SKLADIŠTE !", "Greška", javax.swing.JOptionPane.ERROR_MESSAGE); return false; } if (!hr.restart.util.Aus.checkDateRange(jtfPocDatum, jtfZavDatum)) return false; if (!rpcart.getCGRART().equals("") && (rpcart.getCART().equals("") && rpcart.getCART1().equals("")) && !doubleClicked) { int grupe = javax.swing.JOptionPane.showConfirmDialog( this.getWindow(), "Ukljuèiti i podgrupe?", "Grupe artikala", javax.swing.JOptionPane.YES_NO_OPTION); if (grupe == javax.swing.JOptionPane.CANCEL_OPTION) return false; if (grupe == javax.swing.JOptionPane.NO_OPTION) { podgrupe = false; } else { podgrupe = true; } } return true; }
private boolean findAll(int maxDepth, Condition cond) { // nadji sve stavke koje zadovoljavaju uvjet, a nisu pokrivene. DataSet ds = Skstavke.getDataModule() .getTempSet( Aus.getKnjigCond() .and(cond) .and(Aus.getFreeYearCond()) .and(Condition.equal(raSaldaKonti.colPok(), "N"))); // ako je metoda pozvana iz raProcess sustava, iskoristi ga if (!raProcess.isRunning()) ds.open(); else { raProcess.setMessage("Dohvat nepokrivenih stavaka salda konti ...", true); raProcess.openScratchDataSet(ds); } // najprije prevrti cijeli dataset i prebaci sve stavke u MatchRow, // te ih napuni u LinkedList iz kojih cemo ih izbacivati kad i ako // pronadjemo kombinaciju u kojoj se moze pokriti. LinkedList stavke = new LinkedList(); for (ds.first(); ds.inBounds(); ds.next()) stavke.addLast(new MatchRow(ds)); // pocni raditi kombinacije. Najprije svaka stavka pojedinacno, // onda sve do 'maxDepth' stavki po kombinaciji. Prati i potrosnju // objekata da ne predje neku razumnu granicu. int slots = 0, collections = 0; master.clear(); for (int depth = 1; depth <= maxDepth; depth++) { if (raProcess.isRunning()) raProcess.setMessage("Provjera moguæeg pokrivanja stupnja " + depth + " ...", false); // prodji kroz sve preostale stavke i puni glavnu mapu, // koja se sastoji od po jedne mape salda na popis dokumenata za // svaku razlicitu kombinaciju cpar$konto$valuta$godina$uloga // koja postoji u nadjenim stavkama. Jebeno. for (Iterator st = stavke.iterator(); st.hasNext(); ) { MatchRow mr = (MatchRow) st.next(); if (raProcess.isRunning()) raProcess.checkClosing(); // probaj naci vec postojecu grupu salda za ovaj kljuc ili napravi novu SaldoGroup salda = (SaldoGroup) master.get(mr.getMasterKey()); if (salda == null) master.put(mr.getMasterKey(), salda = new SaldoGroup()); // Inicijaliziraj listu kombinacija koja ce se kasnije ubaciti u mapu salda. // Kombinacije se ne mogu odmah ubacivati u mapu jer se po njoj iterira, pa // bi to rezultiralo gadnim kolizijama. Ako je depth 1, onda se napravi // kombinacija od samo teukce stavke, inace se prolazi kroz cijelu mapu // salda i priprema dodavanje novih kombinacija duljine depth. ArrayList toAdd = new ArrayList(); if (depth == 1) toAdd.add(new MatchableCollection(mr)); else for (Iterator it = salda.slotIterator(); it.hasNext(); ) { SaldoSlot ss = (SaldoSlot) it.next(); if (raProcess.isRunning()) raProcess.checkClosing(); // prodji koz sve kombinacije u ovom slotu (koje imaju taj saldo) // i pripremi dodavanje po jedne nove kombinacije za svaku koja // ima depth-1 clanova, i koja je istog tipa kao nova stavka // (tip racuni ili uplate), te koja vec nije u toj kombinaciji. for (int i = 0; i < ss.getCollectionCount(); i++) { MatchableCollection mc = ss.getCollection(i); if (mc.checkAdd(mr, depth)) toAdd.add(mc.copyAndExtend(mr)); } } // i na kraju ubaci sve pripremljene kombinacije iz liste toAdd // u odgovarajuce slotove mape salda. slots -= salda.countSlots(); for (int i = 0; i < toAdd.size(); i++) { MatchableCollection mc = (MatchableCollection) toAdd.get(i); if (raProcess.isRunning()) raProcess.checkClosing(); // probaj naci postojeci saldo slot ili napravi novog ako ga nema, // te dodaj ovu kombinaciju u njega. SaldoSlot ss = (SaldoSlot) salda.getSlot(mc.getMatchSaldo()); if (ss == null) salda.addSlot(mc.getMatchSaldo(), ss = new SaldoSlot()); ss.addCollection(mc); mc.setOwner(ss); } slots += salda.countSlots(); collections += toAdd.size(); if (collections > 100000) break; } if (collections > 100000) break; // ako se stavka vec nalazi u nekoj kombinaciji koja se moze pokriti, // nema potrebe traziti daljnje kombinacije s njom, tj kombinacije s // vise clanova. Cilj je da se minimiziraju visestruka pokrivanja. for (Iterator st = stavke.iterator(); st.hasNext(); ) { MatchRow mr = (MatchRow) st.next(); if (mr.isMatchable()) st.remove(); } } // na kraju balade, u glavnoj mapi imamo mnostvo mapa (za svaki kljuc // cpar$konto$valuta$godina$uloga po jedna) u cijim slotovima se // potencijalno nalaze kombinacije stavaka koje se mogu medjusobno // pokriti. Sve te kombinacije bit ce ponudjene za pokrivanje, grupirane // po saldu. No najprije treba izbaciti iz mape sve one slotove kod kojih // nema bar po jedna kombinacija tipa uplate i jedna tipa racun. for (Iterator it = master.values().iterator(); it.hasNext(); ) { SaldoGroup salda = (SaldoGroup) it.next(); for (Iterator s = salda.slotIterator(); s.hasNext(); ) { SaldoSlot ss = (SaldoSlot) s.next(); if (!ss.isMatchable()) s.remove(); } if (salda.countSlots() == 0) it.remove(); } // medju preostalim mapama probaj naci najbolje matcheve. for (Iterator it = master.values().iterator(); it.hasNext(); ) { SaldoGroup salda = (SaldoGroup) it.next(); for (Iterator s = salda.slotIterator(); s.hasNext(); ) { SaldoSlot ss = (SaldoSlot) s.next(); for (int i = 0; i < ss.getCollectionCount(); i++) { MatchableCollection mi = ss.getCollection(i); mi.findRepresentations(); double now; for (int j = 0; j < ss.getCollectionCount(); j++) { MatchableCollection mj = ss.getCollection(j); if (mi.isRacunTip() != mj.isRacunTip() && (now = mi.getMatchFactor(mj)) > mi.getMatchedFactor() && now > mj.getMatchedFactor() && now > mi.getMaxMatchStrength() && now > mj.getMaxMatchStrength()) mi.setMatch(mj); } } } salda.findMarks(); } return master.size() > 0; }