Fonction "tout selectionner" sur une liste

Tags: #<Tag:0x00007f9e55b02548>

Bonjour,

Comment fonctionne l’option “tout sélectionner” sur une liste ?

J’ai une publication excel qui fonctionne lorsque j’utilise l’option “Sélectionner cette page” ou lorsque je ne sélectionne rien; mais lorsque j’utilise l’option “tout sélectionner” j’ai une exception :

ERROR|system|com.simplicite.webapp.ObjectPrint|printlist||Evénement: [1] com.simplicite.util.exceptions.PrintException […]
Caused by: java.lang.NullPointerException

Avez-vous une idée d’où cela peut provenir ?

Merci de copier/coller le code.

J’ai enrichi cette doc car je pense que ton pb c’est la gestion des selected IDs vs no selected ID: https://docs.simplicite.io/documentation/01-core/publication-examples.md#multiplerecords

il doit manque le cas null dans l’exemple :
getSelectedIds

  • vaut une liste d’ids sélectionné, potentiellement vide
  • mais vaut null quand tout est sélectionné pour une question d’optimisation de la mémoire

imaginons un objet à 10M de lignes, l’utilisateur peut en sélectionner certains (taille limitée), mais l’action “tout sélectionner” ne mémorisera pas 10M d’ids en mémoire, juste null (qui ne signifie pas liste vide, mais bien “tout”).

Il est donc impossible de tout sélectionner et décocher quelques lignes uniquement.
L’action “Tout sélectionner” positionne des check non modifiable.

Bref il faut gérer le cas ids==null explicitement.

J’ai réduit au max la méthode, cela donne cela :

public Object printExcelAll(PrintTemplate pt) {
		try {
			ExcelPOITool xls = new ExcelPOITool(true);
			ExcelPOITool.ExcelSheet sh = xls.newSheet("Effluent");
			ExcelRow titlerow = xls.newRow(0), Effrow = null;
			ExcelCell cell =  xls.newCell(0, 0), titlecell =  xls.newCell(0, 0);
			int  effcount = 0, i = 1;
			boolean title1 = true;
			String rowsEffluent[] = {"osiEffNom", "osiPosteRelLib","osiStepNom"};
			
			//Get Ids
			List<String> ids = getSelectedIds();
			if (Tool.isEmpty(ids)) {
				List<String[]>rows = new ArrayList<>();
				rows = this.search(false);
				for(String[] row : rows) {
					ids.add(row[0].toString());
				}
			}
			
			for (int idlist = 0; idlist < ids.size(); idlist++) {
					ObjectDB osieffluent = getGrant().getTmpObject("OsiEffluent");
					synchronized(osieffluent){
					osieffluent.select(ids.get(idlist));
					Effrow = xls.newRow(i);
												
					for(String rowEff : rowsEffluent){	
						if(title1) {
							titlecell = xls.newCell(effcount, osieffluent.getField(rowEff).getDisplay());
							titlerow.add(titlecell);
						}
							cell = xls.newCell(effcount++, osieffluent.getField(rowEff).getValue());
							Effrow.add(cell);
					}
					}
				
				title1 = false;
				Effrow = null;
				effcount=0;
			}
			sh.add(titlerow);
			xls.add(sh);
			return xls.generateToByteArray();

		} catch (Exception e) {
			AppLog.error(getClass(), "printExcelAll", "Unable to publish", e, getGrant());
			return null;
		}

	}

Effectivement c’était ça merci, j’ai résolu le problème en faisant :

           //Get Ids
			List<String> ids = new ArrayList<>();					
			if (Tool.isEmpty(getSelectedIds())) {
				List<String[]>rows = new ArrayList<>();
				rows = search(false);
				for(String[] row : rows) {
					ids.add(row[0].toString());
				}
			}
			else {
				ids = getSelectedIds();
			}

je veux aussi récupérer toutes les lignes sélectionnées mais après avoir appliqué des filtres.

avec ce code, dans ids, je récupère toutes les lignes de la liste, sans que cela tienne compte de mes filtres.

  • cette méthode retourne null si l’utilisateur a coché “Sélectionner toutes les pages” pour éviter d’exploser la mémoire (mettre tous les ids en mémoire)
  • ou elle contient la liste des Ids des cases cochées unitairement par l’utilisateur (ou la sélection de la page uniquement)

Cela indépendamment des filtres.
Chaque nouvelle recherche (avec de nouveaux filtres) fait un “reset” des lignes précédemment sélectionnées. Par contre, elles sont bien gardées en mémoire de page en page, car l’utilisateur peut “picorer” au sein de sa recherche courante.