Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 32
  1. #11
    Quindi come potrei fare?

  2. #12
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fabietto206
    Quindi come potrei fare?
    Ma perché controlli il successivo? Se devi trovare dei buchi non puoi controllare il precedente?

  3. #13
    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);
                  	}
                	}
            		}

  4. #14
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    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);
                  	}
                	}
            		}
    Parti da 1, tanto il primo non devi controllarlo, e ti eviti quell'if. Inoltre, perché ti fermi al penultimo elemento?

    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

  5. #15
    Ho sistemato così:
    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);
                  	}
                	}
            		}     		     		
            	}
    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.

  6. #16
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fabietto206
    Ho sistemato così:
    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);
                  	}
                	}
            		}     		     		
            	}
    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.
    Beh questo è un problema del tuo codice di lettura dal database evidentemente, che da questo pezzo di codice dubito possiamo risolvere.

  7. #17
    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");

  8. #18
    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
    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){
            			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);
                  	}
                	}
            		}     		     		
            	}
          	}
    Ora devo stampare il valore mancante in un pdf

  9. #19
    Sono arrivato a questo punto: i buchi vengono rilevati correttamente, però viene generato il seguente errore:
    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)
    Mentre il codice che lo genera è:
    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();
      	}
    Dove può essere il problema?

  10. #20
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.