Accueil > Forum > > > > Aide pour ameliorer un code
Aide pour ameliorer un code
dimanche 29 octobre 2006 à 20:37:52 |
Aide pour ameliorer un code

audayls
|
Bonsoir, J'essaye en ce moment de faire un système EBS ( un système qui "agit" comme un serveur MySQL). J'aimerai avoir vos avis pour l'amélioré ( au niveau du codage) car je ne suis pas un pro ( je le serai peut etre jamais) mais je veux avoir un code propre. Donc autant prendre maintenant les bonnes habitudes ! Voici le code ( et profitez des couleurs parce que c'est entièrement fait à la main lol) <?php define('BASE', 'txt');// La Constante BASE défini la base (MySQL ou txt). // Si on utilise une base MySQL il faut définir le serveur, les identifiants et la base. define('LOCALHOST', '');// Serveur. define('ROOT', '');// Utilisateur. define('PASSWORD', '');// Mot de passe. define('BASE', '');// Base. class ebs { var $error = FALSE;// Variable empêchant le script d'envoyer les requêtes si un problème de connection à eu lieu (bool) var $logfun =FALSE; // Variable indiquant si la fonction log est activé(bool) Par défaut => FALSE. var $logfile = 'EBSLOG.txt'; // Variable indiquant le chemin du fichier log (string) Par défaut => EBSLOG.txt. var $root = './'; // Variable indiquant le dossier contenant les tables en format txt (string) Par défaut => ./ var $nb_query = 0;// Variable indiquant le nombre de query effectué par ce script (int) Par défaut => 0. var $rows = array();// Variable indiquant les champs et les expressions d'une table en cours de modification (array). var $newrows = array(); // Variable indiquant les champs a vérifier pour la table en cours de modification (array). //---Fonction ebs----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// function ebs($logfun,$logfile,$root) { // Si $logfun equivaut à TRUE et que $logfile correspond à un fichier dans lequel on peut écrire => La fonction enregistre les paramètres dans les variables de la Class. if ($logfun === TRUE) { if (!empty($logfile)) $this->logfile = $logfile; $this->logfun = $logfun; } // Si la constante BASE équivaut à MySQL => La fonction tente de se connecter au serveur, en retournant TRUE en cas de succès ou FALSE en cas d'échec. if (BASE === 'MySQL') { if (mysql_connect(LOCALHOST,ROOT,PASSWORD)) { if (mysql_select_db(BASE)) return TRUE; else { if ($this->logfun === TRUE) $this->log(1,'La connection à la base "'.BASE.'" du serveur "'.LOCALHOST.'" a échoué.'); $this->error = TRUE; return FALSE; } } else { if ($this->logfun === TRUE) $this->log(1,'La connection au serveur "'.LOCALHOST.'" a échoué.'); $this->error = TRUE; return FALSE; } } // Si la constante BASE équivaut à txt => la fonction vérifie si le dossier $root existe, si oui elle l'enregistre dans $this->root puis retourne TRUE, sinon elle retourne FALSE. elseif (BASE === 'txt') { if (empty($root)) $root = './'; elseif (!ereg('/$',$root)) $root .= '/'; if (is_dir($root)) { $this->root = $root; return TRUE; clearstatcache(); } else { $this->log(1,'Le dossier "'.$root.'" n\'existe pas.'); $this->error = TRUE; return FALSE; } } } //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// //---Fonction log-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// function log($action,$text) { if ($this->logfun === TRUE) { // Si $action equivaut à 1 => la fonction enregistre $text à la suite du fichier $this->logfile en retournant TRUE en cas de succès ou FALSE en cas d'échec. if ($action === 1) { $text .= ' ==> Le '.date('d-m-Y').' à '.date('H:i')."\n"; if ($fp = fopen($this->logfile,'a')) { fwrite($fp,$text); fclose($fp); } } // Si $action equivaut à 2 => la fonction vide le fichier $this->logfile en retournant TRUE en cas de succès ou FALSE en cas d'échec. elseif ($action === 2) { if ($fp = fopen($this->logfile,'w')) { fclose($fp); return TRUE; } else return FALSE; } // Si $action equivaut à 3 => la fonction retourne le fichier $this->logfile ou FALSE en cas d'échec. elseif ($action === 3) { $text = ''; if ($fp = fopen($this->logfile,'r')) { while(!feof($fp)) $text .= fgets($fp,4096); fclose($fp); return $text; } else return FALSE; } } } //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// //--Fonction query--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// function query($query) { if ($this->error === FALSE) { // Si la constante BASE équivaut à MySQL => la fonction envoie la query au serveur en retournant TRUE en cas de succès ou FALSE en cas d'échec. if (BASE === 'MySQL') { $this->nb_query++; if (mysql_query($query)) return TRUE; else { $this->log(1,'La requête "'.$query.'" a échoué.'); return FALSE; } } // Si la constante BASE équivaut à text => La fonction à l'aide de preg_match_all décompose la query pour en appeller la fonction correspondante. Elle retourne ce que renvoie la fonction appellée. elseif (BASE === 'txt') { preg_match_all('`([[:alpha:]]+)`sim',$query,$type); switch($type[0][0]) { case 'CREATE': preg_match_all('`CREATE TABLE [\`]?([[:alnum:]]+)[\`]? \((.+?)\);`sim',$query,$values); preg_match_all('`[\`]?([[:alnum:]]+)[\`]? (([[:alnum:]]*[ \_(\)][[:alnum:]]*)*)`sim',$values[2][0],$temp); $name = $values[1][0]; $i = 0; while(isset($temp[1][$i])) { $temp[2][$i] = str_replace('NOT NULL','NOTNULL',$temp[2][$i]); preg_match_all('`VARCHAR\(([[:digit:]]+)\)`sim',$temp[2][$i],$values); $temp[2][$i] = preg_replace('`VARCHAR\(([[:digit:]]+)\)`sim','VARCHAR',$temp[2][$i]); $temp[2][$i] = explode(' ',$temp[2][$i]); if (!empty($values[1][0])) $temp[2][$i][] = $values[1][0]; $rows[$i] = array($temp[1][$i],$temp[2][$i]); $i++; } if ($this->ebs_create($name,$rows) === TRUE) return TRUE; else return FALSE; break; case 'INSERT': preg_match_all('`INSERT INTO [\`]?([[:alnum:]]+)[\`]? VALUES\((.+?)\)`sim',$query,$values); $values[2][0] = explode(',',$values[2][0]); $values[2][0] = str_replace('\'','',$values[2][0]); $values[2][0] = str_replace('"','',$values[2][0]); if ($this->ebs_insert($values[1][0],$values[2][0]) === TRUE)return TRUE; else return FALSE; break; case 'UPDATE': $query = str_replace('?','',$query); $query .= '?'; preg_match_all('`UPDATE ([[:alnum:]]+) SET (.+?) WHERE (.+?)?`sim',$query,$values); $values[2][0] = str_replace('\'','',$values[2][0]); $values[2][0] = str_replace('"','',$values[2][0]); $values[2][0] = explode(',',$values[2][0]); $values[3][0] = str_replace('\'','',$values[3][0]); $values[3][0] = str_replace('"','',$values[3][0]); $values[3][0] = explode(',',$values[3][0]); $i = 0; while(isset($values[2][0][$i])) { $values[2][0][$i] = explode('=',$values[2][0][$i]); $i++; } $i = 0; while(isset($values[3][0][$i])) { $values[3][0][$i] = explode('=',$values[3][0][$i]); $i++; } // Appel de la fonction ebs_update break; } } } // Si $this->error équivaut à TRUE => La fonction n'execute pas la query et retourne FALSE. else { $this->log(1,'La connection a échoué. Aucune query ne peut être envoyée.'); return FALSE; } } //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// //---Fonction ebs_create---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// function ebs_create($name,$rows) { $this->nb_query++; // La fonction ajoute 1 dans $this->nb_query. $auto = FALSE; // Variable indiquant si un champs auto-incrementer a déjà été indiqué. $error = FALSE; // Variable indiquant si une erreur a été détecter. $i =0; $temp = ''; // Variable contenant la future table. while (isset($rows[$i]) AND $error === FALSE) { $temp .= '?'; if (!empty($rows[$i][0])) { $temp .= $rows[$i][0]; $j =0; while (isset($rows[$i][1][$j]) AND $error === FALSE) { if ($rows[$i][1][$j] === 'AUTO_INCREMENT' AND $auto === TRUE) { $this->log(1,'La table "'.$name.'" n\'a pu être crée (le champs "'.$rows[$i][0].'" ne peut être auto-incrémenté car il y a déjà un champs auto-incrémenté).'); $error = TRUE; return FALSE; } $temp .= '#='.$rows[$i][1][$j]; $j++; } } else { $this->log(1,'La table "'.$name.'" n\'a pu être crée (Un des champs de la table n\'a pas de nom).'); $error = TRUE; return FALSE; } $i++; } if ($error === FALSE) { if (is_file($this->root.$name.'.txt')) { $this->log(1,'La table "'.$name.'" n\'a pu être crée (Elle existe déjà).'); return FALSE; } else { if ($fp = fopen($this->root.$name.'.txt','w')) { fwrite($fp,$temp."\n"); fclose($fp); return TRUE; } else { $this->log(1,'La table "'.$name.'" n\'a pu être crée (Son fichier n\'a pu être crée. Veuillez vérifier vos CHMOD).'); return FALSE; } } } } //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
//---Fonction expression----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// function expression($i) { // Expression NOT NULL if (array_search('NOTNULL',$this->rows[$i+1]) AND empty($this->newsrows[$i])) return FALSE; // Expression NULL elseif (array_search('NULL',$this->rows[$i+1]) AND $this->newsrows[$i] !== NULL) return FALSE; // Expression MEDIUMINT + UNSIGNED if (array_search('MEDIUMINT',$this->rows[$i+1]) AND array_search('UNSIGNED',$this->rows[$i+1])) if ($this->newsrows[$i] >= 0AND $this->newsrows[$i] <= 16777215) return TRUE; else return FALSE; // Expression MEDIUMINT elseif (array_search('MEDIUMINT',$this->rows[$i+1])) if (is_numeric($this->newsrows[$i]) AND $this->newsrows[$i] >=-8388608AND $this->newsrows[$i] <=8388607) return TRUE; else return FALSE; // Expression MEDIUMBLOB ou MEDIUM TEXT elseif (array_search('MEDIUMBLOB',$this->rows[$i+1]) OR array_search('MEDIUMTEXT',$this->rows[$i+1])) if (strlen($this->newsrows[$i]) <= 16000000) { $this->newsrows[$i] = str_replace('?','',$this->newsrows[$i]); return TRUE; } else return FALSE; // Expression BLOB ou TEXT elseif (array_search('BLOB',$this->rows[$i+1]) OR array_search('TEXT',$this->rows[$i+1])) if (strlen($this->newsrows[$i]) <= 65535) { $this->newsrows[$i] = str_replace('?','',$this->newsrows[$i]); return TRUE; } else return FALSE; // Expression TINYBLOB ou TINYTEXT elseif (array_search('TINYBLOB',$this->rows[$i+1]) OR array_search('TINYTEXT',$this->rows[$i+1])) if (strlen($this->newsrows[$i]) <= 255) { $this->newsrows[$i] = str_replace('?','',$this->newsrows[$i]); return TRUE; } else return FALSE; // Expression VARCHAR ou CHAR elseif (array_search('VARCHAR',$this->rows[$i+1]) OR array_search('CHAR',$this->rows[$i+1])) { $nb = count($this->rows[$i+1]); $nb--; if (strlen($this->newsrows[$i]) <= $this->rows[$i+1][$nb]) { $this->newsrows[$i] = str_replace('?','',$this->newsrows[$i]); return TRUE; } else return FALSE; } } //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// //---Fonction ebs_insert--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// function ebs_insert($name,$newrows) { $this->nb_query++; // La fonction ajoute 1 à $this->nb_query. $this->newsrows = $newrows;// La fonction copie $newrows dans $this->newsrows (pour que les données soit accessibles et modifiables entre fonctions). if (is_file($this->root.$name.'.txt')) { $file = file($this->root.$name.'.txt'); // La fonction ouvre le fichier grâce à file() qui va retourner le fichier sous forme d'un array. $nb_rows = count($rows); $nb_rows--;// La fonction compte le nombre de champs de la table (pour vérifier sa validité). $nb_newchamps = count($newrows); // La fonction compte le nombre de champs à inserer. if ($nb_rows < 1 AND $nb_rows !== $nb_newchamps) { $this->rows = explode('?',$file[0]); // La fonction sépare ? de $this->rows pour séparer les différents champs. $i = 1; while(isset($this->rows[$i])) { $this->rows[$i] = explode('#=',$this->rows[$i]);// La fonction sépare #= de $this->rows pour séparer le nom du champ de son ou ses expressions $i++; } $auto = count($file); // La fonction compte le nombre de ligne du fichier pour l'utiliser sur le champs Auto-incrementé si il existe. $error = FALSE; // Variable indiquant si une erreur a été détecter. $temp = ''; $i =0; // Variable contenant le futur champ. while(isset($newrows[$i]) AND $error === FALSE) { $temp .= '?'; if (array_search('AUTO_INCREMENTE',$this->rows[$i+1]) !== FALSE) $this->newsrows[$i] = $auto; // La fonction appelle la fonction expression qui vérifie si le champs à insérer correspond bien à ou aux expressions du champs. // Si la fonction renvoie TRUE => la fonction enregistre dans $temp la valeur du nouveau champs if ($this->expression($i) === TRUE) $temp .= $this->newsrows[$i]; else { $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Une expression d\'un des champs n\'est pas respecter ou n\'est pas reconnu)'); $error = TRUE; return FALSE; } $i++; } if ($error === FALSE) { if ($fp = fopen($this->root.$name.'.txt','a')) { fwrite($fp,$temp."\n"); fclose($fp); return TRUE; } else { $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Son fichier n\'a pu être modifié. Veuillez vérifier vos CHMOD).'); return FALSE; } } } // Si le nombre de champs de la table n'est supérieur à 1 et qu'elle est pas égale au nombre de champs à inserer => La fonction renvoie FALSE. else { $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Le nombre de champs indiqué et différent du nombre de champs de la table).'); return FALSE; } } // Si le fichier n'existe pas => La fonction retourne FALSE. else { $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Le fichier "'.$this->root.$name.'.txt" n\'existe pas).'); return FALSE; } } //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// } ?>For every choice, a consequence ( Fable)
|
|
lundi 30 octobre 2006 à 09:34:38 |
Re : Aide pour ameliorer un code

syndrael
|
Ke de code !!! Tu peux intégrer des Array dans tes str_replace mais je peux po t'en dire plus.. Bon courage S.
|
|
lundi 30 octobre 2006 à 11:00:47 |
Re : Aide pour ameliorer un code

malalam
|
Hello,
en vrac :
Méthode ebs() : return TRUE; clearstatcache(); Tu fais un return, donc tu n'iras jamais sur clearstatcache ()...
dans la méthode expression() je doute que tes conditions fonctionnent, vu qu'il manque des accolades : if () if () // else // le premier if () n'a pas d'accolade et compte pourtant plusieurs lignes de traitements.
Dans ebs_insert (), cette ligne : $nb_rows = count($rows); $nb_rows--; tu le sors d'où, ton tableau $rows...?
Si tu utilises des constantes pour la connexion à la DB...Ok, mais dans ce cas, tu devrais plutôt utiliser une méthode à laquelle tu passes ces constantes, pour effectuer la connexion. Plutôt que de demander la définition de constantes et de les utiliser directement dans ta classe, sans même vérifier si elles sont bien définies. Quant à la constante BASE par exemple, ce devrait plutôt être une propriété de ta classe (modifiable, qui plus est...).
Tien d'ailleurs, je vois mal comment ça peut marcher, tu définis 2 fois la constante BASE. Il te faut une propriété de type (mysql, txt...), et une constante pour le nom de la base si on est en type mysql.
ereg() pour vérifier si tu as un / en fin de chaîne, c'est un peu utiliser un tank pour flinguer des taupes (j'ai lu cette expression ici pour la même remarque, et j'ai bien aimé ;-) ). En plus, ereg () est lent...
|
|
lundi 30 octobre 2006 à 14:10:35 |
Re : Aide pour ameliorer un code

syndrael
|
Ben dis donc.. Il faut ke je file mon code à ta sagacité..LOL !! S.
|
|
lundi 30 octobre 2006 à 14:53:41 |
Re : Aide pour ameliorer un code

audayls
|
"c'est un peu utiliser un tank pour flinguer des taupes" exelente la citation, il faut récompenser son auteur lol (en plus tu as raison (en même temps cela change pas :-P ) je vais retirer cette partie après tout cela coûte rien à l'utilisateur de mettre un "/")
J'ai corrigé le problème "clearstatcache()" en le passant avant le "return TRUE" (tiens une question en passant, je crois avoir lu un commentaire de FhX sur une des tes sources qui disait que un constructeur ne devait rien returner, donc il faut que j'enleve mes "return" ?), j'ai rajouté les accolades dans la fonction expression, et bien vu j'ai completement oublié de décomposer les champs donc il faut déplacer "$this->rows = explode('?',$file[0]);" quelques lignes après et placer cette ligne avant "$nb_rows = count($rows); $nb_rows--;" et remplacer "$nb_rows = count($rows); $nb_rows--;" par ceci "$nb_rows = count($this->rows); $nb_rows--;"
Pour les "str_replace" cela apporte-t-il quelque chose si on mets en argument search un tableau ?
Sinon je capte pas trop le passage avec les constantes (c'est les vacances il faut y aller plus doucement mdr)
For every choice, a consequence (Fable)
|
|
lundi 30 octobre 2006 à 15:20:02 |
Re : Aide pour ameliorer un code

malalam
|
En effet, ton constructeur ne doit rien renvoyer. Normalement. Pour le str_replace : ça économis des lignes de code inutiles, et c'est plus rapide (tu ne rappelles pas str_replace à la mano pour chaque remplacement).
|
|
Cette discussion est classée dans : true, rows, return, false, values
Répondre à ce message
Sujets en rapport avec ce message
Problème pour afficher le résultat de 2 liste déroulantes en php [ par sand285 ]
Salut,J n'arrive pas à obtenir le résultat de mes 2 listes déroulantes.Cad: quand je sélectionne une couleur dans le premier choix et le deuxième choi
fonction + renvoie d'erreur [ par caviar ]
Saluté ...j'ai une question sur les fonctions... Comme j'ai appris une 'vrai' fonction est censée renvoyer un résultat true ou false de façon à pouvoi
Condition: true et false [ par djack69 ]
Bonsoir tout le monde, Je créé un site en ce moment et je suis sur une partie du site ou je bloque. je créé une partie tuto avec un petit système
probleme de couleur [ par mike501 ]
Bonjour,j ai un code qui me permet de creer un galerie photo mes le souci c est que j arrive pas a changer la couleur du fondcar meme si je change le
formulaire trop complexe pour moi ! sos [ par bg62 ]
bonjour, je me suis lancé dans l'élaboration d'un formulaire (en php mais avec aussi du javascript) et je rame complètement, malgré toutes les astuces
timestamp et dates : interrogation [ par malalam ]
Hello,là, les gars, si quelqu'un a une explication, elle est la bienvenue :/*** function getDatesBetween* renvoie un tableau contenant toutes les date
Convertir du JSON en PHP [ par Noizet ]
Bonjour,Je vais vous expliquer mon problème:Je reçois de mon formulaire ceci (c'est du JSON):{"id":"id1","txt":"text1","img":"page.gif","imgopen":"fo
xml et php [ par djbabou ]
Bonjour a tous... Après avoir fait le tour de pas mal de site, j'ai une question que je me pose quand à l'utilisation de simplexml. Si j'ai bien comp
formulaire [ par Nadmy ]
bjr les gars é ben g fé un code pour reservation demenagement , dont un formulaire a remplir é g mi une dans une div en bas une calendrier pour choisi
Doxygene et une class PHP [ par banbanfr ]
Bonjour à tous,Voilà je souhaite faire une doc technique via Doxygene d'ailleurs j'y arrive a peu prêt mais des notions me reste encore mystérieuses e
Livres en rapport
|
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
RE : GOOGLE MAPRE : GOOGLE MAP par inwebo
Cliquez pour lire la suite par inwebo GOOGLE MAPGOOGLE MAP par fatmanajjar
Cliquez pour lire la suite par fatmanajjar
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
|