Quindi come potrei fare?
Quindi come potrei fare?
Ma perché controlli il successivo? Se devi trovare dei buchi non puoi controllare il precedente?Originariamente inviato da Fabietto206
Quindi come potrei fare?
Ora non mi da più errori, però sbaglio qualcosa nella logica:
codice:for(int i=0; i<vettoreNumeroDDT.length-1; i++){ vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted()); if (i > 0){ Integer elPrec = vettoreNumeroDDT[i-1].intValue(); // caso in cui il numero successivo è = if(!vettoreNumeroDDT[i].getFormatted().equals(elPrec) || !vettoreNumeroDDT[i].getFormatted().equals(elPrec - 1)){ // ci sono buchi Integer elCorrente = vettoreNumeroDDT[i].intValue(); Integer elCor = elCorrente + 1; while(elCor < elPrec){ arrayBuchi[cont.intValue()] = elCor; cont.add(uno); elCor++; pdf.writeNewRow(FieldMapping.getValueOfAttribute(elCor, "numeroDDTCliente"), 0); } } }
Parti da 1, tanto il primo non devi controllarlo, e ti eviti quell'if. Inoltre, perché ti fermi al penultimo elemento?Originariamente inviato da Fabietto206
Ora non mi da più errori, però sbaglio qualcosa nella logica:
codice:for(int i=0; i<vettoreNumeroDDT.length-1; i++){ vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted()); if (i > 0){ Integer elPrec = vettoreNumeroDDT[i-1].intValue(); // caso in cui il numero successivo è = if(!vettoreNumeroDDT[i].getFormatted().equals(elPrec) || !vettoreNumeroDDT[i].getFormatted().equals(elPrec - 1)){ // ci sono buchi Integer elCorrente = vettoreNumeroDDT[i].intValue(); Integer elCor = elCorrente + 1; while(elCor < elPrec){ arrayBuchi[cont.intValue()] = elCor; cont.add(uno); elCor++; pdf.writeNewRow(FieldMapping.getValueOfAttribute(elCor, "numeroDDTCliente"), 0); } } }
Inoltre la condizione che hai messo nel controllo si verifica sempre, hai scritto, semplificando:
se (i != prec OR i != prec - 1)
Si verifica sempre, non può essere uguale a due numeri diversi... il controllo da fare sarebbe
codice:if (v[i] > v[i - 1] + 1) // c'è un buco, che è proprio v[i - 1]+1
Ho sistemato così:
Però elCorrente e elPrec valgono sempre 1. Mentre dal db da cui vado a leggere i dati ho i seguenti valori: 1 1 2 2 3 4 5 7 ecc.codice:while (nav.hasNextElement()) { ddt = (DocumentoVenditaTes) nav.nextElement(); if(!ddt.getNumeroDDTCliente().getFormatted().equals(ddt.getNumeroDDTCliente().getNullValue())){ for(int i=0; i<vettoreNumeroDDT.length; i++){ vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted()); if (i > 0){ Integer elCorrente = vettoreNumeroDDT[i].intValue(); Integer elPrec = vettoreNumeroDDT[i-1].intValue(); System.out.println("Corrente: " + elCorrente + " Precedente: " + elPrec); // caso in cui il numero successivo è = if(elCorrente > (elPrec + 1)){ // ci sono buchi Integer elCor = elCorrente + 1; while(elCor < elPrec){ arrayBuchi[cont.intValue()] = elCor; cont.add(uno); elCor++; pdf.writeNewRow(FieldMapping.getValueOfAttribute(elCor, "numeroDDTCliente"), 0); } } } }
Beh questo è un problema del tuo codice di lettura dal database evidentemente, che da questo pezzo di codice dubito possiamo risolvere.Originariamente inviato da Fabietto206
Ho sistemato così:
Però elCorrente e elPrec valgono sempre 1. Mentre dal db da cui vado a leggere i dati ho i seguenti valori: 1 1 2 2 3 4 5 7 ecc.codice:while (nav.hasNextElement()) { ddt = (DocumentoVenditaTes) nav.nextElement(); if(!ddt.getNumeroDDTCliente().getFormatted().equals(ddt.getNumeroDDTCliente().getNullValue())){ for(int i=0; i<vettoreNumeroDDT.length; i++){ vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted()); if (i > 0){ Integer elCorrente = vettoreNumeroDDT[i].intValue(); Integer elPrec = vettoreNumeroDDT[i-1].intValue(); System.out.println("Corrente: " + elCorrente + " Precedente: " + elPrec); // caso in cui il numero successivo è = if(elCorrente > (elPrec + 1)){ // ci sono buchi Integer elCor = elCorrente + 1; while(elCor < elPrec){ arrayBuchi[cont.intValue()] = elCor; cont.add(uno); elCor++; pdf.writeNewRow(FieldMapping.getValueOfAttribute(elCor, "numeroDDTCliente"), 0); } } } }
Il codice che legge dal db è il seguente (oltre a dichiarare 2 array e 2 variabili):
codice:// Lettura numero ddt DocumentoVenditaTes ddt = (DocumentoVenditaTes) Factory.createObject(DocumentoVenditaTes.class, app); String orderBy = SQLHelpler.compressKey(new String[]{"numeroDDTCliente"}); NavigableList nav = ddt.read(orderBy); NumericLTBL[] vettoreNumeroDDT = new NumericLTBL[nav.size()]; Integer[] arrayBuchi = new Integer[nav.size()]; NumericLTBL cont = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); cont.setFormatted("0"); NumericLTBL uno = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); uno.setFormatted("1");
Facendo in questo modo mi legge correttamente tutti i valori presenti nel db e li confronta correttamente, entrando nell'if quando è presente un buco tra due numeri
Ora devo stampare il valore mancante in un pdfcodice:while (nav.hasNextElement()) { ddt = (DocumentoVenditaTes) nav.nextElement(); if(!ddt.getNumeroDDTCliente().getFormatted().equals(ddt.getNumeroDDTCliente().getNullValue())){ for(int i=0; i<vettoreNumeroDDT.length; i++){ vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted()); if (i > 0){ ddt = (DocumentoVenditaTes) nav.nextElement(); Integer elCorrente = vettoreNumeroDDT[i].intValue(); Integer elPrec = vettoreNumeroDDT[i-1].intValue(); System.out.println("Corrente: " + elCorrente + " Precedente: " + elPrec); // controllo se c'è un buco tra 2 numeri if(elCorrente > (elPrec + 1)){ // c'è un buco Integer elCor = elCorrente + 1; while(elCor < elPrec){ arrayBuchi[cont.intValue()] = elCor; cont.add(uno); elCor++; pdf.writeNewRow(FieldMapping.getValueOfAttribute(elCor, "numeroDDTCliente"), 0); } } } } }
Sono arrivato a questo punto: i buchi vengono rilevati correttamente, però viene generato il seguente errore:
Mentre il codice che lo genera è:org.ltblfw.exception.NavigableListException: Error: There are no such elements to read. Detail=Class: it.suiteone.vendite.DocumentoVenditaTes Total Number of Object on DB: 63
at org.ltblfw.collector.NavigableList.nextElement(Nav igableList.java:509)
at it.suiteone.vendite.roob.ControlloNumerazione.eseg uiStampa(ControlloNumerazione.java:133)
at it.suiteone.vendite.roob.ControlloNumerazione.exec ute(ControlloNumerazione.java:94)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknow n Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Un known Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.ltblfw.utility.Executory.executClassMethod(Exe cutory.java:235)
at org.ltblfw.utility.Executory.executClassMethod(Exe cutory.java:368)
at org.ltblfw.utility.Executory.executClassMethod(Exe cutory.java:345)
at org.ltblfw.server.JobExecutory.runInteractiveJob(J obExecutory.java:245)
at org.ltblfw.batch.BatchJob.runInteractive(BatchJob. java:495)
at org.ltblfw.batch.servlet.ServletSubmit.doPost(Serv letSubmit.java:144)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:717)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at com.cj.encflt.EncodingFilter.doFilter(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:291)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11Conn ectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run( JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Dove può essere il problema?codice:// Lettura numero ddt DocumentoVenditaTes ddt = (DocumentoVenditaTes) Factory.createObject(DocumentoVenditaTes.class, app); String orderBy = SQLHelpler.compressKey(new String[]{"numeroDDTCliente"}); NavigableList nav = ddt.read(orderBy); NumericLTBL[] vettoreNumeroDDT = new NumericLTBL[nav.size()]; NumericLTBL uno = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); uno.setFormatted("1"); while (nav.hasNextElement()) { ddt = (DocumentoVenditaTes) nav.nextElement(); if(!ddt.getNumeroDDTCliente().getFormatted().equals(ddt.getNumeroDDTCliente().getNullValue())){ for(int i=0; i<=vettoreNumeroDDT.length; i++){ // inizializzo array vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted()); if (i > 0){ ddt = (DocumentoVenditaTes) nav.nextElement(); // elemento precedente all'i-esimo Integer elPrec = vettoreNumeroDDT[i-1].intValue(); // controllo se c'è un buco tra 2 numeri if(vettoreNumeroDDT[i].intValue() > (elPrec+1)){ // c'è un buco NumericLTBL buco = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName()); // valore mancante = elemento precedente (i-esimo -1) + 1 buco.setFormatted(elPrec.toString()); buco.add(uno); // controllo se il valore mancante è < dell'elemento i-esimo (utile nel caso di più valori mancanti vicini) while(buco.isSmoller(vettoreNumeroDDT[i])){ pdf.writeNewRowFromRight("Numero DDT mancante: " + buco.getFormatted(), 0,true); if (pdf.isOverFlow()) { writeHeader(pdf); } buco.add(uno); } } } } } } nav.free(); }
all'interno del while chiami due volte il metodo nextElement (dallo stacktrace sembra questo il metodo che genera l'errore).
La prima volta sei sicuro il nextElement ci sia (nel while invochi hasNextElement), la seconda no perché non fai nessun controllo.
"Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
Linus Torvalds