CrossTab Impossible d'obtenir le HTML toHTML

Bonjour

j’ai besoin de récupérer le HTML d’une crossTab.
Lorsque j’exécute l’action createReport, il récupère bien le crosstable mais cela plante lors de l’instruction .toHTML().

	public void createRCMReport() {
		com.simplicite.util.Crosstab  o = this.getCrosstab("BCSIRCMModificationRequestStatus-vs-Type");
		String crossTab = o.toHTML(this.getGrant(), false);
	}

J’obtiens alors ceci :

Aucune autre trace dans les logs.
Mon utilisateur a bien tous les droits.

Pouvez-vous m’indiquer où est mon erreur ?

Cordialement
Amandine T.

[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-09-08 13:58 (revision cc3e1c0a38d7b0549d655541696b9efd34201031)
Encoding=UTF-8
EndpointIP=21.0.9.8
EndpointURL=http://e1f8baa69103:8080
TimeZone=Europe/Paris
SystemDate=2020-09-22 18:07:23

J’imagine que votre tableau n’a pas été calculé. pour exporter les données toJSON, toExcel… il faut préparer les données en mémoire sur un objet métier via build :

Crosstab c = getCrosstab("name");
if (c!=null) {
  c.build(this); // this = current instance or any object with filters
  String html = c.toHTML(getGrant(), false);
}
1 Like

Merci pour votre retour. J’avais pas vu cette instructions dans les tutoriels.
Nous sommes bien d’accord que la méthode toHTML est censée me retourner directement le HTML, non ?

Lorsque j’applique votre code ma variable html contient la référence à un printer (exemple : java.io.PrintWriter@c05da15)

Ai-je louper quelque chose ?

Cordialement

Il y a 2 verbes toHTML, le second premet de préciser un PrintWriter autre qu’un simple String (pour écrire dans un fichier, output stream http…)

	/**
	 * Publish pivot table as raw HTML
	 * @param g Grant
	 * @param cubes true generate data as cubes, false generates as pivot table
	 * @return Publish pivot table as raw HTML
	 */
	public String toHTML(Grant g, boolean cubes)
	{
		PrintWriter out = new PrintWriter(new StringWriter());
		toHTML(g, cubes, out);
		return out.toString();
	}

	/**
	 * Publish pivot table as raw HTML on specified print writer.
	 * @param g Grant
	 * @param cubes true generate data as cubes, false generates as pivot table
	 * @param out Print writer
	 */
	public void toHTML(Grant g, boolean cubes, PrintWriter out)

Merci j’avais bien compris la javadoc .
Toutefois j’ai un soucis avec la méthode toHTML(Grant g, boolean cubes) . Au lieu de me retourner le contenu de mon StringWriter, elle me retourne un texte contenant le nom de l’objet StringWriter.
Comment puis-je faire pour obtenir “…

” ?

Quel est votre code ? C’est sans doute un toString explicite ou implicite qui pose pb quelque part

	public void createRCMReport() {
			Crosstab crosstab = this.getCrosstab("BCSIRCMModificationRequestStatus-vs-Type");
			String htmlCrossTab;
			if (crosstab == null) {
				htmlCrossTab = "";
			} else {
			  crosstab.build(this);
			  htmlCrossTab = crosstab.toHTML(getGrant(), false);
			}
AppLog.info(htmlCrossTab, getGrant()); // Ici je m'attends à récupérer mon crosstab au format HTML "<table>...</table>". Au lieu de ça je récupère java.io.PrintWriter@c05da15

	}

Oui la méthode toHTML qui renvoie un String ne fait pas ce qu’il faut. On regarde

C’est bon c’est corrigé. C’est poussé donc ce sera disponible chez vous dès demain.

J’ai fait un test (affichage du HTML du tableau croisé en texte via une action):

	public String action2() {
		try {
			Crosstab ct = getCrosstab(getName() + "-T1");
			ct.build(this);
			String t = ct.toHTML(getGrant(), false);
			return Message.formatSimpleText(t);
		} catch (Exception e) {
			return Message.formatSimpleError(e);
		}
	}

Ca marche:

Merci cela marche nickel.

Savez-vous s’il y a un moyen rapide de récupérer le CSS du thème admin pour l’intégrer dans le HTML généré ?

N’êtes vous pas en train de réinventer l’export du tableau croisé ?

C’est possible :s
Mon besoin est : je veux qu’un des mes tableaux croisés soit envoyé par mail toutes les semaines.
J’ai donc créé une action qui lance une alerte. J’ai défini le contenu de l’alerte avec un message contenant le mot [CROSSTAB] et je souhaite remplacer ce texte par le contenu du crosstab.

Y a t’il une meilleure façon de faire ?

Cordialement

J’avoue ne pas savoir si les APIs d’export du tableau croisé sont facilement utilisables dans votre contexte. Je vais regarder.

En tout cas le HTML issu de toHTML est volontairement minimaliste (<table><tr><td>) car sa raison d’être était de pouvoir être récupéré par les Excel legacy comme source de données externe (ce qui est deprecated avec les versions modernes d’Excel qui savent appeler des services REST).

Bref ajouter des styles issus de la UI à ce HTML n’a donc aucun de sens, ça n’améliorera en rien la présentation de ce HTML brut.

Si vous voulez vraiment intégrer (inliner) ce HTML dans le corps HTML d’un mail (i.e. pas en pièce jointe) mieux vaut mettre vos propres styles (et faire attention de n’intégrer que le contenu du <body> de ce HTML dans le HTML de votre mail, pour ne pas avoir 2 tags body).

Votre besoin c’est d’inliner le tableau croisé dans le corps de votre mail ou de le mettre dans un format X ou Y en pièce jointe de ce mail ?

inliner le tableau.
Merci pour votre réponse et vos explications.

OK dans ce cas qques styles ad hoc dans le corps de votre mail + un coup de JSoup (lib intégrée à Simplicité) pour extraire le body (ex: https://jsoup.org/cookbook/input/parse-body-fragment) et ou l’enrichir et ça devrait le faire.

Autre approche on peut ajouter une variante de la méthode toHTML qui ne générerait que le contenu du body, j’ai regardé c’est facile à faire, ça peut être fait aujourd’hui.

PS: Pour une pièce jointe la bonne approche aurait effectivement été plutôt de taper sur les APIs d’export standard du tableau croisé, je ne creuse pas ce sujet donc.

Il suffit de faire un replace dans le preAlert.

public String preAlert(Alert a) {
	if (a!=null && "myAlert".equals(a.getName()) {
		String lang = getGrant().getLang();
		String body = a.getContent(lang);
		body = body.replace("[CROSSTAB]", "...");
		a.setContent(lang, body);
	}
	return null; // no error
}

Merci @david pour tes retours.

@Francois c’est effectivement ce que j’ai déjà implémenté. ^^

Ah ben je passe pour quoi avec mes approches compliquées maintenant… ;-)

Cela dit mon point sur le contenu du body reste valable. Il ne faut pas remettre un <html>, <head> ou <body> dans un body. Donc avoir un toHTML avec un argument embedded = true/false ne serait pas inutile.

Done: https://docs.simplicite.io/4.0/javadoc-beta/com/simplicite/util/Crosstab.html#toHTML(com.simplicite.util.Grant,boolean,boolean)

Il faut mettre embedded = true pour n’avoir que la table.

C’est en train d’être poussé sur toutes les branches

1 Like