Accueil > > > TRI DÉCROISSANT ET CROISSANT D'UN TABLEAU DYNAMIQUE REMPLIE PAR UN INTERNAUTE
TRI DÉCROISSANT ET CROISSANT D'UN TABLEAU DYNAMIQUE REMPLIE PAR UN INTERNAUTE
Information sur la source
Description
Coucou tout le monde, bonje ne l'ai pas trouvé sur ce site donc peut-être qu'il n'y est pas : j'ai réalisé dernièrement le tri d'un tableau dynamique remplie par un utilisateur, donc il ne contient que des zones de textes. et de quoi supprimer et ajouter des lignes. Pour la partie ajout et suppression, elle n'est pas de moi, donc ne vous étonnez pas de ne pas y trouver les sources, je ne pense pas avoir le droit de les donner (vous pouvez me les demander par message privé). Pour la partie trie j'ai essayé de faire simple , mais je compte sur vous pour me proposer des optimisations bien sûr... L'algorithme a été testé sur environ une trentaine de lignes, je le testerais plus tard avec le contenu d'une base de données (une fois certains identifiants reçues pour exporter le site et la base). J'espère qu'il vous sera utile!
Source
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
- ///////// partie triage des données ///////
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
- var copieTableau = new Array(); // tableau javascript contenant les données de celui en HTML
- var tableauLignesCasesVides = new Array(); // Sert à enregistrer les lignes contenant les cellules vides se trouvant dans la colonne à trier
- function sort_int(p1,p2) { return p1-p2; } //fonction pour trier les nombres
- function sort_char(p1,p2) { return ((p1>=p2)<<1)-1; } //fonction pour trier les strings
-
-
-
- function echange (p1, p2, nbLignes, nbColonnes) // une fois le tri d'un colonne effectué, il faut mettre à la bonne place les autres éléments du tableau, j'effectue donc ici un échange de //places entre deux lignes.
- {
- for (var index1 = p1, index2 = p2; index1 <= (nbLignes * nbColonnes) - (nbLignes - p1); index1 = index1 + nbLignes, index2 = index2 + nbLignes)
- {
- var temp = copieTableau[index1];
- copieTableau[index1] = copieTableau[index2];
- copieTableau[index2] = temp;
- }
- }
-
-
- function verifCaseVide(ligne, index) // vérifie si la cellule en cours de la colonne à trier est vide ou non
- {
- if (copieTableau[index + ligne] == "") // on se positionne sur la cellule correspondant à la colonne et à la ligne en cours de traitement
- return true; // si c'est vide
- else
- return false;
- }
-
- function enregistrementLignesCasesVides(ligne, nbLignes, nbColonnes, cpt) // si la cellule traitée est vide, on enregistre toute la ligne dans le tableau "tableauLignesCasesVides"
- {
- for(var indice = ligne; indice <= (nbColonnes * nbLignes) - (nbLignes - ligne); indice += nbLignes) // déplacement colonne par colonne
- {
- tableauLignesCasesVides[cpt] = indice; // on enregistre donc les indices des cellules appartennant à la ligne concernée
- cpt ++;
- }
-
- return cpt;
- }
-
- /* tri du tableau */
-
- // triOrdre -> 1 pour décroissant, 0 pour croissant
- // numeroColonne -< pour savoir où se trouve la colonne cliquée dans le tableau
-
- function TableOrder(triOrdre, numeroColonne)
- {
- var tableau = document.getElementById('tableau'); // on va enregistrer notre objet tableau
- var nbLignes = tableau.rows.length - 3; // on prend le nombre de lignes qui le compose (-3 viens du fait qu'il existe une première ligne cachée qui sert de modèle à dupliquer lors d'un //ajout de ligne)
-
- if (nbLignes > 1) // Sinon ça sert à rien de trier ...
- {
- var nbColonnes = tableau.rows[0].cells.length; // on enregistre le nombre de colonnes existantes.
- var FntSort = sort_int; // Cette variable enregistre le type de tri à effectuer, pourquoi on l'initialise avec un sort_int, nous le verrons par la suite.
-
- var index = nbLignes * (numeroColonne - 1); // Une fois que l'on a copié le tableau HTML dans le tableau javascript, il faut savoir où se trouve dans ce dernier les éléments à trier,
- // index va contenir l'indice correspondant au numéro de la première cellule de la colonne à trier.
-
- var tableauSort = new Array(); // ce tableau contient le contenu de la colonne à trier
-
- var cpt = 0; // un compteur pour parcourir un tableau.
-
- var indice = 0; // idem
-
- for (var colonne = 0; colonne < nbColonnes; colonne ++) // et c'est partie pour copier le tableau HTML dans le tableau javascript "copieTableau"
- {
- for (var ligne = colonne + nbColonnes; ligne <= (nbLignes * nbColonnes) + cpt; ligne = ligne + nbColonnes) // afin de retrouver facilement les données à trier, on va copier les //données du tableau HTML colonne par colonne.
- {
- copieTableau[indice] = document.listing.champ[ligne].value; // Donc on aboutit à un tableau en une dimension contenant les données du tableau HTML colonne par colonne
- indice ++; // D'ou le besoin d'un autre indice de parcourt s'incrémentant différemment
- }
-
- cpt ++; // un compteur pour éviter de dépasser la taille du tableau HTML lors de sa copie
- }
-
- // après il va falloir définir si l'on tri des nombres ou des chaines de caractères.
-
- cpt = index; // on va donc parcourir copieTableau à partir de l'indice correspondant au début de la colonne à trier.
- var verifInt = true; // on va vérifier si l'on a dans la colonne à trier QUE des nombres
-
- while (cpt < index + nbLignes && verifInt == true)
- {
- if (!copieTableau[cpt].match(/^[0-9£¤$\.\s-]+$/) && copieTableau[cpt] != "") // Si jamais on a rien qui est inscrit dans une cellule, on l'intèrprète comme un 0
- {
- FntSort=sort_char; // hop, on a trouvé une chaine de caractères.
- verifInt = false; // Bin voilà quoi, y a pas que des nombres finalement
- }
-
- cpt ++;
- }
-
- tableauSort = copieTableau.slice(index, index + nbLignes); // Et maintenant on copie les données de la colonne à copier dans le tableau servant au triage
-
- tableauSort.sort(FntSort); // on trie de façon croissante
-
- if (triOrdre == 1) // si on avait choisie de trier de façon décroissante
- tableauSort.reverse(); // on inverse les données dans le tableau de triage
-
- // Maintenant il va falloir faire correspondre les données triées avec le reste des champs du tableau copieTableau
- for (var indiceTabSort = 0, indiceCopieTab = index; indiceTabSort < tableauSort.length; indiceTabSort ++, indiceCopieTab ++)
- {
- if (tableauSort[indiceTabSort] != copieTableau[indiceCopieTab]) // on va alors comparer la place des données triées dans le tableau de triage avec celle qu'elles occupent dans le //tableau copieTableau. La condition est vérifiée lorsque la place d'une donnée ne correspond pas d'un tableau à // l'autre
- {
- var trouve = false;
- indice = indiceCopieTab + 1;
-
- while (!trouve && indice < numeroColonne * nbLignes) // On va devoir alors rechercher où se trouve la donnée triée dans le tableau copieTableau, pas besoin de rechercher sur // tout le tableau, on regarde juste dans l'intervalle de données correspondant à l'étendue de la colonne à trier.
- {
- if (tableauSort[indiceTabSort] == copieTableau[indice]) // Ah! On a trouvé l'indice de la valeur triée dans le tableau copieTableau ( c'est l'image du tableau HTML colonne // par colonne pour rappel)
- {
- indice = indice - ((numeroColonne-1) * nbLignes); // Comme copieTableau est une image du tableau HTML colonne par colonne, on peut dire ici que l'on calcule l'indice
- // de la ligne à déplacer dans copieTableau
- echange (indiceTabSort, indice, nbLignes, nbColonnes); // On échange les deux lignes
- trouve = true;
- }
-
- indice ++;
- }
- }
- }
-
- indice = nbColonnes;
- cpt = 0;
- var indiceTabLCV = 0; // cette variable contient en fait la taille du tableau "tableauLignesCasesVides"
-
- for (var ligne = 0; ligne < nbLignes; ligne ++) // Maintenant c'est comme au début, sauf que cette fois-ci on copie les données du tableau copieTableau dans celui en HTML
- {
- if (verifCaseVide(ligne, index)) // on vérifie sur la ligne en cours si la cellule se trouvant dans la colonne à trier est vide ou non
- indiceTabLCV = enregistrementLignesCasesVides(ligne, nbLignes, nbColonnes, indiceTabLCV); // si c'est le cas on enregistre les indices des cellules de la ligne
-
- else // sinon on recopie la ligne dans le tableau HTML
- {
- for (var colonne = ligne; colonne <= (nbLignes * (nbColonnes - 1)) + cpt; colonne = colonne + nbLignes )
- {
- document.listing.champ[indice].value = copieTableau[colonne];
- indice ++;
- }
- }
-
- cpt ++;
- }
-
- if (indiceTabLCV > 0) // si on a détecté une ou plusieurs cellules vides dans la colonne à trier, il faut alors rechercher les lignes enregistrées dans le tableau // "tableauLignesCasesVides" et les placer à la fin du tableau HTML
- {
- var taille = indiceTabLCV; // on enregistre la taille du tableau
-
- for (indiceTabLCV = 0; indiceTabLCV < taille; indiceTabLCV += nbColonnes) // comme on a enregistré des lignes entières dans ce tableau, on peut avancer qu'il est divisé en // tranches dont l'étendue correspond au nombre de colonnes.
- for (cpt = indiceTabLCV; cpt < nbColonnes + indiceTabLCV; cpt ++) // on va donc parcourir chacune de ces divisions
- {
- document.listing.champ[indice].value = copieTableau[tableauLignesCasesVides[cpt]]; // pour les enregistrer l'une à la suite de l'autre dans le tableau HTML
- indice ++; // indice reprend là où il s'était arrêté lors de la copie des lignes contenant les cellules pleines de la colonne à trier
- }
- }
- }
- }
-
- // Bon bon j'espère que c'était assez clair, , n'hésitez pas à poser vos questions et vos solutions d'optimisations.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////// partie triage des données ///////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var copieTableau = new Array(); // tableau javascript contenant les données de celui en HTML
var tableauLignesCasesVides = new Array(); // Sert à enregistrer les lignes contenant les cellules vides se trouvant dans la colonne à trier
function sort_int(p1,p2) { return p1-p2; } //fonction pour trier les nombres
function sort_char(p1,p2) { return ((p1>=p2)<<1)-1; } //fonction pour trier les strings
function echange (p1, p2, nbLignes, nbColonnes) // une fois le tri d'un colonne effectué, il faut mettre à la bonne place les autres éléments du tableau, j'effectue donc ici un échange de //places entre deux lignes.
{
for (var index1 = p1, index2 = p2; index1 <= (nbLignes * nbColonnes) - (nbLignes - p1); index1 = index1 + nbLignes, index2 = index2 + nbLignes)
{
var temp = copieTableau[index1];
copieTableau[index1] = copieTableau[index2];
copieTableau[index2] = temp;
}
}
function verifCaseVide(ligne, index) // vérifie si la cellule en cours de la colonne à trier est vide ou non
{
if (copieTableau[index + ligne] == "") // on se positionne sur la cellule correspondant à la colonne et à la ligne en cours de traitement
return true; // si c'est vide
else
return false;
}
function enregistrementLignesCasesVides(ligne, nbLignes, nbColonnes, cpt) // si la cellule traitée est vide, on enregistre toute la ligne dans le tableau "tableauLignesCasesVides"
{
for(var indice = ligne; indice <= (nbColonnes * nbLignes) - (nbLignes - ligne); indice += nbLignes) // déplacement colonne par colonne
{
tableauLignesCasesVides[cpt] = indice; // on enregistre donc les indices des cellules appartennant à la ligne concernée
cpt ++;
}
return cpt;
}
/* tri du tableau */
// triOrdre -> 1 pour décroissant, 0 pour croissant
// numeroColonne -< pour savoir où se trouve la colonne cliquée dans le tableau
function TableOrder(triOrdre, numeroColonne)
{
var tableau = document.getElementById('tableau'); // on va enregistrer notre objet tableau
var nbLignes = tableau.rows.length - 3; // on prend le nombre de lignes qui le compose (-3 viens du fait qu'il existe une première ligne cachée qui sert de modèle à dupliquer lors d'un //ajout de ligne)
if (nbLignes > 1) // Sinon ça sert à rien de trier ...
{
var nbColonnes = tableau.rows[0].cells.length; // on enregistre le nombre de colonnes existantes.
var FntSort = sort_int; // Cette variable enregistre le type de tri à effectuer, pourquoi on l'initialise avec un sort_int, nous le verrons par la suite.
var index = nbLignes * (numeroColonne - 1); // Une fois que l'on a copié le tableau HTML dans le tableau javascript, il faut savoir où se trouve dans ce dernier les éléments à trier,
// index va contenir l'indice correspondant au numéro de la première cellule de la colonne à trier.
var tableauSort = new Array(); // ce tableau contient le contenu de la colonne à trier
var cpt = 0; // un compteur pour parcourir un tableau.
var indice = 0; // idem
for (var colonne = 0; colonne < nbColonnes; colonne ++) // et c'est partie pour copier le tableau HTML dans le tableau javascript "copieTableau"
{
for (var ligne = colonne + nbColonnes; ligne <= (nbLignes * nbColonnes) + cpt; ligne = ligne + nbColonnes) // afin de retrouver facilement les données à trier, on va copier les //données du tableau HTML colonne par colonne.
{
copieTableau[indice] = document.listing.champ[ligne].value; // Donc on aboutit à un tableau en une dimension contenant les données du tableau HTML colonne par colonne
indice ++; // D'ou le besoin d'un autre indice de parcourt s'incrémentant différemment
}
cpt ++; // un compteur pour éviter de dépasser la taille du tableau HTML lors de sa copie
}
// après il va falloir définir si l'on tri des nombres ou des chaines de caractères.
cpt = index; // on va donc parcourir copieTableau à partir de l'indice correspondant au début de la colonne à trier.
var verifInt = true; // on va vérifier si l'on a dans la colonne à trier QUE des nombres
while (cpt < index + nbLignes && verifInt == true)
{
if (!copieTableau[cpt].match(/^[0-9£¤$\.\s-]+$/) && copieTableau[cpt] != "") // Si jamais on a rien qui est inscrit dans une cellule, on l'intèrprète comme un 0
{
FntSort=sort_char; // hop, on a trouvé une chaine de caractères.
verifInt = false; // Bin voilà quoi, y a pas que des nombres finalement
}
cpt ++;
}
tableauSort = copieTableau.slice(index, index + nbLignes); // Et maintenant on copie les données de la colonne à copier dans le tableau servant au triage
tableauSort.sort(FntSort); // on trie de façon croissante
if (triOrdre == 1) // si on avait choisie de trier de façon décroissante
tableauSort.reverse(); // on inverse les données dans le tableau de triage
// Maintenant il va falloir faire correspondre les données triées avec le reste des champs du tableau copieTableau
for (var indiceTabSort = 0, indiceCopieTab = index; indiceTabSort < tableauSort.length; indiceTabSort ++, indiceCopieTab ++)
{
if (tableauSort[indiceTabSort] != copieTableau[indiceCopieTab]) // on va alors comparer la place des données triées dans le tableau de triage avec celle qu'elles occupent dans le //tableau copieTableau. La condition est vérifiée lorsque la place d'une donnée ne correspond pas d'un tableau à // l'autre
{
var trouve = false;
indice = indiceCopieTab + 1;
while (!trouve && indice < numeroColonne * nbLignes) // On va devoir alors rechercher où se trouve la donnée triée dans le tableau copieTableau, pas besoin de rechercher sur // tout le tableau, on regarde juste dans l'intervalle de données correspondant à l'étendue de la colonne à trier.
{
if (tableauSort[indiceTabSort] == copieTableau[indice]) // Ah! On a trouvé l'indice de la valeur triée dans le tableau copieTableau ( c'est l'image du tableau HTML colonne // par colonne pour rappel)
{
indice = indice - ((numeroColonne-1) * nbLignes); // Comme copieTableau est une image du tableau HTML colonne par colonne, on peut dire ici que l'on calcule l'indice
// de la ligne à déplacer dans copieTableau
echange (indiceTabSort, indice, nbLignes, nbColonnes); // On échange les deux lignes
trouve = true;
}
indice ++;
}
}
}
indice = nbColonnes;
cpt = 0;
var indiceTabLCV = 0; // cette variable contient en fait la taille du tableau "tableauLignesCasesVides"
for (var ligne = 0; ligne < nbLignes; ligne ++) // Maintenant c'est comme au début, sauf que cette fois-ci on copie les données du tableau copieTableau dans celui en HTML
{
if (verifCaseVide(ligne, index)) // on vérifie sur la ligne en cours si la cellule se trouvant dans la colonne à trier est vide ou non
indiceTabLCV = enregistrementLignesCasesVides(ligne, nbLignes, nbColonnes, indiceTabLCV); // si c'est le cas on enregistre les indices des cellules de la ligne
else // sinon on recopie la ligne dans le tableau HTML
{
for (var colonne = ligne; colonne <= (nbLignes * (nbColonnes - 1)) + cpt; colonne = colonne + nbLignes )
{
document.listing.champ[indice].value = copieTableau[colonne];
indice ++;
}
}
cpt ++;
}
if (indiceTabLCV > 0) // si on a détecté une ou plusieurs cellules vides dans la colonne à trier, il faut alors rechercher les lignes enregistrées dans le tableau // "tableauLignesCasesVides" et les placer à la fin du tableau HTML
{
var taille = indiceTabLCV; // on enregistre la taille du tableau
for (indiceTabLCV = 0; indiceTabLCV < taille; indiceTabLCV += nbColonnes) // comme on a enregistré des lignes entières dans ce tableau, on peut avancer qu'il est divisé en // tranches dont l'étendue correspond au nombre de colonnes.
for (cpt = indiceTabLCV; cpt < nbColonnes + indiceTabLCV; cpt ++) // on va donc parcourir chacune de ces divisions
{
document.listing.champ[indice].value = copieTableau[tableauLignesCasesVides[cpt]]; // pour les enregistrer l'une à la suite de l'autre dans le tableau HTML
indice ++; // indice reprend là où il s'était arrêté lors de la copie des lignes contenant les cellules pleines de la colonne à trier
}
}
}
}
// Bon bon j'espère que c'était assez clair, , n'hésitez pas à poser vos questions et vos solutions d'optimisations.
Conclusion
La différence par rapport à d'autres codes sources du site réside, je pense, dans le fait que le tri s'effectue à partir de données de textArea et non pas de simples cellules ne contenant que du texte.
Historique
- 28 avril 2009 11:19:15 :
- Modification du code pour ne plus prendre en compte les cases vides dans un trie
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
menu dynamique dans cellule tableau ? [ par seb_divweb ]
bonjour je debute et je cherche a faire la chose suivante : j'ai un tableau avec 3 colones. dans la colonne de gauche j'ai une image, qui change au s
mettre transparent une ligne d un tableau dynamique...NET [ par Poulipe ]
Bonjour,je voudrais au survol des lignes de mon tableau, fait en dynamique (sous .net), que la transparence change...je fais donc newline.Attributes("
Tableau dynamique asp + controle bt radio javascript [ par ROM105 ]
Bonjour je réalise actuellement une application pour mon stage afin de rechercher et réserver un bouquin et j apprends à manipuler asp + javascript.J'
Ajout de lignes dans un tableau dynamique a l'aide d'un bouton [ par raven44 ]
Je possède deux formulaires, le premier dispose d'information recherché dans une base mysql, sur ce formulaire je dispose également d'u
valeurs de formulaire 'select' dynamique [ par DarkTiteuf ]
Voila bonsoir j'ai le cas suivant : et je voudrais que lorsque je clique sur une valeur a gauche cela change le tableau de droite. La propriét&
Creation dynamique d'un tableau en HTML [ par AllalcoolG ]
Bonjour,j'aimerais savoir s'il est possible d'ajouter des lignes à un tableau existant en HTML.En fait j'ai un script vbs qui me permet de retourner d
Tableau dynamique [ par alia10 ]
Salut,J'aimerais que vous m'aidez à créer des tableaux dynamiques en HTML: ajouter, modifier et supprimer des lignes.Merci d'avance!
drag & drop d'un tableau dynamique [ par czar ]
j'ai une application a faire en dhtml & javascript... enfin bref, je connais pas grand chose en javascript & dhtml et g mal a trouver comment
Tableau dynamique (nbr ligne fonction d'un nbr d'enregistrement dans une table) [ par zxr_stinger ]
Bonjour à tous Je voudrais créer un tableau dans lequel le nombre de ligne de celui-ci soit fonction d'une variable préalablement établie. Possible en
Jquery : tableau dynamique [ par lenneth666 ]
Bonjour Sur l'une de mes pages web j'ai un formulaire. j'aimerais que lorsque je valide les données du formulaire, mon tableau se rafraîchisse dynam
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
UTILISER UN .JSUTILISER UN .JS par zaikoe
Cliquez pour lire la suite par zaikoe
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|