Quelquepart

Blog d'un développeur

Vous êtes ici : Accueil>Général

Général

Comment bien trier un tableau en Javascript

Rédigé par Sébastien Hermann dans Général, javascript - Aucun commentaire

La documentation sur internet concernant le sort est assez complète (ici par exemple), mais commençons malgré tout par un petit rappel.

Tri simple

Pour trier un tableau en JS, il suffit d'utiliser la méthode sort définie dans le prototype de Array.

Le fonctionnement par défaut de cette méthode est de faire un tri alphanumérique. Donc, si vous avez un tableau de chaines de caractères, un simple myArray.sort() devrait faire le job...

Vraiment ? Enfin, seulement si la casse est identique pour toutes vos chaines. Sinon, le résultat risque de ne pas vous plaire.

Que faire alors ?
Que vous ayez autre chose qu'un tableau de string, ou bien que vous souhaitiez que votre tri soit insensible à la casse, vous devrez alors passer à la méthode sort une fonction de tri.

Et la magie opère

const mySortFunction = (prev, next) => {
  if (prev > next) return 1; // Or any positive number
  if (prev < next) return -1; // Or any negative number
  return 0;
};
myArray.sort( mySortFunction );

Voici l'exemple type pour définir une fonction de tri croissant. Pour un tri décroissant, il suffit de retourner -1 au lieu de 1 et 1 au lieu de -1.

C'est simple et cette syntaxe peut vous permettre de gérer tout type de contenu dans votre array (objets par exemple).

Et pour les string ?

Pour trier des chaines en ignorant la casse, vous pouvez vous en sortir seul avec la fonction de tri, en appliquant un .toLowerCase() sur prev et next par exemple. Ce n'est pas très élégant, ni très performant, mais ca fait le job.

Alors on s'arrête là ?
Ce serait dommage, vu qu'il existe une méthode dédiée à la comparaison de chaines de caractères dans le prototype de String : localeCompare !

const mySortFunction = (prev, next) => prev.localeCompare(next);
myArray.sort( mySortFunction );

A propos du tri stable

On dit qu'un algorithme de tri est stable s'il ne modifie pas l'ordre initial des clés identiques (si vous n'êtes pas à l'aise avec cette notion, je vous encourage à aller lire ce très bon article sur le sujet).

Les premières versions de JS n'indiquaient pas clairement que la méthode sort devait retourner un tri stable, et donc, c'était un peu la foire, certains navigateurs l'ayant fait, d'autres non. Heureusement ES2019 a enfin levé le doute et imposé le tri stable.

Petit état des lieux :

  • IE6+: stable
  • Firefox 3+: stable
  • Chrome 70+: stable
  • Opera 10+: stable
  • Safari 4+: stable
  • Node 12+ : stable

En 2021, Node et tous les navigateurs à jour utilisent donc bien un algorithme de tri stable. Pour l'utiliser, il suffit de bien retourner 1, -1 ou 0 dans votre fonction de tri, comme spécifié dans la documentation.

Et avec le temps...

Je fais passer des tests techniques de recrutement dans ma nouvelle boite, et je vois très régulièrement des candidats qui utilisent ce genre de fonction de tri :

array.sort( (a, b) => a > b ? 1 : -1 );

Ou est passé le return 0 ? Pourquoi se contenter de retourner 1 ou -1 ? a ne peut-il donc jamais être égal à b ?

La plupart des devs me répondent qu'ils font toujours comme ca (mode copier/coller) et que "ca marche".

Les plus filous iront même jusqu'à prétendre que leur tri est "optimisé" puisqu'il fait 1 comparaison de moins, alors qu'en fait ils avaient juste la flemme d'écrire quelques caractères de plus.

Alors oui, ca marche. Mais le tri ne sera pas stable !
En effet, seul le fait de préciser un return 0 permet à l'algorithme de tri de savoir que vos 2 éléments sont identiques sur les critères de tri considérés.

Mais non ce n'est pas plus performant, c'est même généralement l'inverse, et pas qu'un peu !
La plupart des algorithmes de tri utilisent l'information d'égalité (le fameux return 0) pour optimiser leur traitement et ainsi réduire le nombre d'itérations nécessaire pour arriver à trier l'ensemble du tableau.

TODO exemple live pour les sceptiques

Empêcher le lancement de RSA1 sur ECC

Rédigé par Sébastien Hermann dans Général, Fonction - Aucun commentaire

RSA1... la transaction magique pour tout consultant BW... Cette transaction est aussi très fourbe. En effet, lorsque vous la lancez, elle crée à votre insu un job nommé BI_WRITE_PROT_TO_APPLLOG, à votre nom, avec une récurrence toutes les 5 minutes !

"Ce job est utile sur BW, donc ce n'est pas un problème", me direz-vous. Oui, mais que ce passe-t-il si vous lancer par erreur RSA1 sur un système ECC ?

La même chose, malheureusement. Même si ce job a une durée généralement inférieure à 1 seconde, il consomme un peu de puissance machine et 1 work process.

Bien sûr, l'auteur de la faute a juste à aller sur SM37 pour supprimer ce job. Mais dans la mesure ou SAP ne l'avertit pas qu'il a créé ce job pour lui, il faut déjà connaître ce mécanisme (ce qui est maintenant le cas de tous mes lecteurs ;) ).

Bien sûr, il est possible de bloquer RSA1 au niveau des autorisations, il suffit de ne pas donner ce TCODE. Mais il peut être compliqué de mettre cela en place, en fonction de la complexité de gestion des autorisations de votre entreprise.

Heureusement, il existe une autre solution, simple et rapide à mettre en place !

Lors du lancement de RSA1, SAP vérifie si le mandant en cours est conforme à celui défini pour l'exécution de BW. Pour bloquer RSA1 sur un système ECC, il suffit donc de définir un mandant "BW" non utilisé !

Comment faire ? Cette information est stockée dans la table RSADMINA, dans le champ BWMANDT. Les 2 vues de gestion permettant de modifier RSADMINA (RSADMINAV et RSADMINAV2) ne donne pas accès à cette zone, de même qu'aucune des transactions RSCUSTxx. Non, non, non, inutile de sortir votre mode debug sur SE16, il existe un module fonction : RSCC_RSADM_ACC.

En exécutant ce module fonction, vous pouvez mettre à jour le champ BWMANDT de la table RSADMINA pour le faire pointer vers un mandant qui n'existe pas sur ECC afin d'y empêcher l'exécution de RSA1.

Ce fonctionnement est décrit dans la note OSS 1949194.

Developer Heroes

Rédigé par Sébastien Hermann dans Général - 7 commentaires

Cela m'est tombé dessus sans que je m'en rende compte. Cette année j'ai été nommé "developer heroes" par la communauté SAP.

Cela commence par un fan qui propose mon nom à SAP. Grâce au système d'alerte de SAP, je suis immédiatement informé. Cela me permet de découvrir cette événement dont je n'avais jamais entendu parler. Pourtant ce n'est pas sa première année. Bref, j'en parle un peu autour de moi, personne ne connait.

Ensuite, durant le mois de vote, d'autres fans "plussoient" ma "candidature" involontaire. Bon j'avoue que quelques amis à qui j'avais parlé de cette aventure ont également participé.

Après, c'est SAP qui délibère pendant un bon mois, et voilà, c'est bouclé, je suis un des héros SAP de l'année.

Alors, la grande question, à quoi cela sert-il ? Ai-je une dotation comme pour les prix Nobel ? Une invitation sur le Tech Ed où sera fait l'annonce ? Peut-être même une tribune pour m'y exprimer publiquement ?

Rien de tout cela. Je me contenterai donc de ma photo faisant le tour du monde ainsi que de la reconnaissance éternelle de mon bien-aimé SAP. Et ça, ça n'a pas de prix !

Mots clés : aucun

Astuce BW : Query sur Info Provider

Rédigé par Sébastien Hermann dans Général - Aucun commentaire

Vous avez surement déjà été agacé par le LISTCUBE et ses nombreuses limitations, nous en avons déjà discuté lors de la présentation de ma solution ZLISTCUBE, souvenez-vous. Aujourd'hui, je viens partager une petite astuce de vieux grognard que je ne connaissais pas.

Vous connaissez surement la transaction RSRT, qui permet de tester/debugger les "requêtes Bex" dans BW. Eh bien cette transaction permet également de visualiser le contenu d'un cube ou de n'importe quel Info Provider comme si une requête Bex avait été créé dessus !

Pour faire cela, il faudra suivre scrupuleusement une syntaxe bien particulière (qui se rapproche plus d'un code de piratage de la NSA que d'une inocente query bex). En nom de requête donc, vous tapez : PROVIDER/!PROVIDER (en remplaçant PROVIDER par le nom technique de votre infoprovider) et c'est tout.

En validant l'écran avec la touche entrée, vous aurez alors le message suivant qui apparait en bas de l'écran :

Vous pouvez désormais exécuter votre "query". Enjoy !

Voir le contenu d'un fichier SAPLINK

Rédigé par Sébastien Hermann dans Général - Aucun commentaire

Vous avez rêvé de pouvoir vérifier le contenu des programmes mis à disposition sur le site sans avoir à les télécharger/installer. Oui je le sais, un de vous m'a même demandé de fournir un fichier texte contenant le code.

Grâce à Sandra Rossi, le rêve devient réalité ! Dorénavant, vous aurez la possibilité, sur chaque page proposant un programme, de voir le contenu du nugget (le fichier .nugg pour saplink). Le code abap donc, mais pas que ! Textes, définition de table, dynpro, rien ne manque. Ansi, si le cœur vous en dit, vous pouvez même recréer "à la main" un programme, sans passer par saplink.

Un exemple : code source de la classe d'abstraction docx

Merci à Sandra pour l'idée originale et sa transformation xslt, je n'ai fait que recoder le tout en php et mettre un coup de peinture.