Accueil > > > EXÉCUTER DES REQUETE STYLE SQL SUR UN ARRAY
EXÉCUTER DES REQUETE STYLE SQL SUR UN ARRAY
Information sur la source
Description
La classe myArray, pour l'instant en version "j'ai codé comme un cochon" permet l'exécution de requête de type sql sur un tableau (Array). Elle peut être utile, par exemple, lorsque l'on travaille avec une DB et que des données que l'on y récupère sont stockées dans un tableau. Ce tableau pourra ainsi être traitée via la classe myArray pour ainsi faciliter sa manipulation la structure du tableau a traiter doit se présenter de la maniere suivante: $toto = Array { [x] => Array( champ1 => x1, champ2 => x2, champ3 => x3 ), [y] => Array( champ1 => y1, champ2 => y2, champ3 => y3 ), [z] => Array( champ1 => z1, champ2 => z2, champ3 => z3 ) } ainsi les cas d'utilisation: - myArray::query($toto, "select champ1,champ2 ") donnera : Array { [x] => Array( champ1 => x1, champ1 => x2 ), [y] => Array( champ1 => y1, champ1 => y2 ), [z] => Array( champ1 => z1, champ1 => z2 ) } - myArray::query($toto, "select champ1,champ2 group by champ1") donnera : Array { [x1] => Array( [x] => Array( champ1 => x1, champ1 => x2 ) ), [y1] => Array( [y] => Array( champ1 => y1, champ1 => y2 ) ), [z1] => Array( [z] => Array( champ1 => z1, champ1 => z2 ) ) }
Source
- <?
- /**
- * class facilitant la manipulation de tableau
- * @author: p418
- * @version: 0.9b
- *
- **/
- class myArray
- {
-
-
- /**
- * ranger un tableau associatif par rapport a un champs
- * ne marche que sur un array de type
- *
- * toto {
- * [x] => Array(
- * champ1 => x1,
- * champ2 => x2,
- * champ3 => x3
- * ),
- * [y] => Array(
- * champ1 => y1,
- * champ2 => y2,
- * champ3 => y3
- * ),
- * [z] => Array(
- * champ1 => z1,
- * champ2 => z2,
- * champ3 => z3
- * )
- * }
- * @access private
- * <code>
- * myArray::orderby($toto,"champ1")
- * retournera un tableau avec x,y,z ordonnés par champs1
- * </code>
- * @param (array) $arrayToOrder
- * @param (string) $orderBy
- * @return (array)
- */
- public static function orderBy($arrayToOrder,$orderBy)
- {
-
- $result = array();
-
- if(!is_array($arrayToOrder) || count($arrayToOrder) == 0)
- return $result ;
- $tmp = $arrayToOrder;
- $sorting = $tmp[0][$orderBy];
- for($i=0;$i<count($arrayToOrder);$i++)
- {
- if($tmp[$i][$orderBy]==$sorting)
- {
- $result[]=$tmp[$i];
- array_splice($tmp,$i,1);
- }
- }
- return array_merge($result,self::orderBy($tmp,$orderBy));
- }
-
- /**
- * semblable a array_unique mais basé sur un champs donné.
- * le tableau en entrée doit avoir la meme structure que pour la fontion orderby
- *
- * @access private
- * @param (array) $arrayToOrder
- * @param (string) $orderBy
- * @param (bool) $distinct
- * @return array
- */
- public static function groupBy($arrayToOrder,$orderBy,$distinct=false)
- {
- $exists = self::fieldExists($orderBy,$arrayToOrder);
- if($exists !== true)
- throw new Exception("Champs '$orderBy' inconnu dans la clause 'group by' $idx");
- $res = array();
- while(list($k,$v) = each($arrayToOrder))
- $res[$v[$orderBy]][]=$v;
- return $res;
- }
-
- /**
- * Interprete la requete donnée en parametre sur le tableau $myArray
- * @access private
- * @param (Array) $myArray
- * @param (string) $query
- * @return (array)
- */
- public static function query($myArray,$query)
- {
-
- try
- {
- if(eregi("(select|delete) *([\*a-zA-Z,_\(\)]*) *(where)? *(.*)",$query,$reg))
- {
- $todo = array();
- $res = array();
- $columns = explode(",",str_replace(" ","",$reg[2]));
-
- if(empty($reg[4]))
- $reg[4]="";
- else
- {
- $groupBy = preg_split("/group by/i",$reg[4]);
- $reg[4] = empty($groupBy[0])?"":$groupBy[0];
-
- }
-
- //on exécute, la reqquete
- while(list($idx,$champs) = each($columns))
- {
- if(eregi("([0-9a-z_]*)\((.*)\)",$champs,$func))
- {
- $todo[$func[1]]=$func[2];
- continue;
- }
-
- if($champs=='*')
- foreach( self::getFields($myArray) as $field )
- $res=array_merge($res,self::select($myArray,$field,$reg[4]));
- else
- {
- $exists=self::fieldExists($champs,$myArray);
- if($exists!==true)
- throw new Exception("Champs '$champs' inexistant à l'index '$exists'\n".print_r($myArray,true));
- $res=array_merge($res,self::select($myArray,$champs,$reg[4]));
- }
- }
- $tmp = array();
- $size = self::getMaxSize($res);
- for($i=0;$i<$size;$i++)
- foreach($res as $nom => $tab)
- $tmp[$i][$nom]=isset($tab[$i])?$tab[$i]:'';
-
- /**
- *
- * action spécifique
- *
- **/
-
- // si on veut grouper
- if(!empty($groupBy[1]))
- $tmp=self::groupBy($tmp,trim($groupBy[1]));
-
- //autre actions
- if(count($todo))
- {
- foreach($todo as $func => &$do)
- if(!self::functionExists($func))
- throw new Exception("Fonction '$func()' inconnue");
- }
- //*****
- return $tmp;
- }
- else
- throw new Exception("requete incomprise");
-
-
- }
- catch(Exception $e)
- {
- throw new Exception("[myArrayError] une erreur dans la requete : '$query'\n\t{$e->getMessage()}\n");
- }
- }
-
-
- /**
- * retourne un array contenant les valeurs du champs $fieldName dans le tableau $myArray
- * une condition peut etre définie pour la récupération.
- * cette condition est évaluée par la fonction eval() de php
- *
- * pour faire appel a la valeur d'un champs donné, il suffit dencadrer ce nom de champs par des %%
- * ainsi %mon_champs% fera référence à la valeur de $row['mon_champs']
- *
- * @access private
- * @param (array) $myArray
- * @param (string) $fieldName
- * @param (string) $condition
- * @return (array)
- */
- public static function getField($myArray,$fieldName,$condition=true)
- {
- try
- {
-
- $res = array();
-
- //préparation de la condition
- if(is_string($condition) && trim($condition)!="")
- {
- $patterns=array("/^(.*)$/","/\s*([\*<>=+-]{1,2})\s*/");
- $condition=preg_replace($patterns," \$1 ",$condition);
- $condition=preg_replace("/\s+=\s+/"," == ",$condition);
-
- if(preg_match_all("/[\s]?%?([a-z_]+[\w]+)%?[\s]+/i",$condition,$reg))
- {
- while(list($idx,$field) = each($reg[0]))
- {
- $cleanned_field = $reg[1][$idx];
- if(in_array(strtolower($cleanned_field),array("and","or","between")) or self::functionExists($cleanned_field))
- continue;
-
- $fieldExists = self::fieldExists($cleanned_field,$myArray);
- if($fieldExists===true)
- $condition = str_ireplace($field,' $row["'.$cleanned_field.'"] ',$condition);
- else
- throw new Exception("Champs '{$cleanned_field}' à l'index '$fieldExists' inconnu dans la clause 'where'");
- }
-
- }
- }
- else
- $condition = "1";
-
- //global $row;
- while( list($row_idx,$row) = each($myArray))
- if(isset($row[$fieldName]) && self::where($condition,array("row" => $row)))
- $res[$fieldName][]=$row[$fieldName];
- return $res;
- }
- catch(Exception $e)
- {
- throw $e;
- }
- }
-
- /**
- * Alias de la méthode getField
- *
- * @see getField
- */
- public static function select($myArray,$fieldName,$condition){ return self::getField($myArray,$fieldName,$condition);}
-
-
- /**
- *
- */
- private static function where($condition,$scope=null)
- {
- //on défini le scope par défaut
- $myScope = $GLOBALS;
- //si un scope a été spécifié
- if(is_array($scope))
- $myScope = $scope;
- //on charge les variables du scope pour pourvoir faire lévaluation
- extract($myScope,EXTR_OVERWRITE);
-
- // on utilise les saut de lignes pour pouvoir se repérer si une erreur est générée
- // car eval ne spécifie qu'un numéro de ligne pour une erreur.
- $condition = str_replace(" ","\n",$condition);
-
- //inhibition du mess d'erreur
- //j'ai pas trouvé de vraie méthode pour ca :( cest crade
- ob_start();
- $evaluation = eval("return $condition;");
- $errorMsg = ob_get_clean();
-
- if(!empty($errorMsg))
- $error = error_get_last();
- $error_msg = "Erreur de syntaxe dans la clause 'where': ";
- $arrow_pad = strlen($error_msg);
-
- // si une erreur à été généré lors de l'eval, on va préciser où se trouve l'erreur
- if(!empty($error['line']))
- {
- $error_line = $error['line'];
-
- for($i=1,$pos = strpos($condition,"\n");$i<$error_line-1;$pos=strpos($condition,"\n",$pos+1),$i++ ){}
- $condition = str_replace("\n"," ",$condition);
-
- $arrow_pad += ($pos-2);
- $arrow_pad += strlen($condition);
-
- $arrow = str_repeat(' ',$arrow_pad).'^';
- throw new Exception("$error_msg$condition \n\t $arrow ({$error['message']})");
- }
-
- return $evaluation;
- }
-
-
- /**
- * retourne la taille la plus grande parmis les array contenu dans $myArray
- *
- * @param (array) $myArray
- * @return (int)
- */
- public static function getMaxSize($myArray)
- {
- $sizes = self::count($myArray);
- if(!count($sizes))
- return 0;
- return max($sizes);
- }
-
-
- /**
- * retourne l'existence d'une clé dans l'ensemble des sous tableau de $myArray
- *
- * @param (string) $aColumnName
- * @param (array) $myArray
- * @return (bool)
- */
- public static function fieldExists($aColumnName,Array $myArray)
- {
- if(empty($myArray))
- {
- //print_r(debug_backtrace());
- throw new Exception("Erreur test d'existence");
- }
- while(list($idx,$row)=each($myArray))
- if(!array_key_exists($aColumnName,$row))
- return $idx;
- return (bool)true;
- }
-
-
- public static function functionExists($funcName)
- {
- return method_exists(get_class(),$funcName);
- }
- /**
- * retourne les champs
- * si le parametre optionel $all est définie à true (false par défaut),
- * alors ce sont tous les champs qui sont retournés
- * sans se soucier si ils sont tous commun aux sous-tableaux
- *
- * @param (array) $myArray
- * @param (bool) [$all]
- * @return (array)
- **/
- public static function getFields($myArray,$all=false)
- {
- $res= array();
- while(list($idx,$row)=each($myArray))
- $res = ($all)?$res+array_keys($row):(count($res)?array_intersect($res,array_keys($row)):array_keys($row));
- return $res;
-
- }
-
-
- /**
- * Fonctions type msyql
- */
-
-
- /**
- * retourne pour chaque ligne du tableau la taille
- *
- * @param (array) $myArray
- * @return (array)
- */
- public static function count($myArray)
- {
- $res = array();
- while(list($idx,$row) = each($myArray))
- $res[$idx] = count($row);
- return $res;
- }
-
- }
-
- ?>
<?
/**
* class facilitant la manipulation de tableau
* @author: p418
* @version: 0.9b
*
**/
class myArray
{
/**
* ranger un tableau associatif par rapport a un champs
* ne marche que sur un array de type
*
* toto {
* [x] => Array(
* champ1 => x1,
* champ2 => x2,
* champ3 => x3
* ),
* [y] => Array(
* champ1 => y1,
* champ2 => y2,
* champ3 => y3
* ),
* [z] => Array(
* champ1 => z1,
* champ2 => z2,
* champ3 => z3
* )
* }
* @access private
* <code>
* myArray::orderby($toto,"champ1")
* retournera un tableau avec x,y,z ordonnés par champs1
* </code>
* @param (array) $arrayToOrder
* @param (string) $orderBy
* @return (array)
*/
public static function orderBy($arrayToOrder,$orderBy)
{
$result = array();
if(!is_array($arrayToOrder) || count($arrayToOrder) == 0)
return $result ;
$tmp = $arrayToOrder;
$sorting = $tmp[0][$orderBy];
for($i=0;$i<count($arrayToOrder);$i++)
{
if($tmp[$i][$orderBy]==$sorting)
{
$result[]=$tmp[$i];
array_splice($tmp,$i,1);
}
}
return array_merge($result,self::orderBy($tmp,$orderBy));
}
/**
* semblable a array_unique mais basé sur un champs donné.
* le tableau en entrée doit avoir la meme structure que pour la fontion orderby
*
* @access private
* @param (array) $arrayToOrder
* @param (string) $orderBy
* @param (bool) $distinct
* @return array
*/
public static function groupBy($arrayToOrder,$orderBy,$distinct=false)
{
$exists = self::fieldExists($orderBy,$arrayToOrder);
if($exists !== true)
throw new Exception("Champs '$orderBy' inconnu dans la clause 'group by' $idx");
$res = array();
while(list($k,$v) = each($arrayToOrder))
$res[$v[$orderBy]][]=$v;
return $res;
}
/**
* Interprete la requete donnée en parametre sur le tableau $myArray
* @access private
* @param (Array) $myArray
* @param (string) $query
* @return (array)
*/
public static function query($myArray,$query)
{
try
{
if(eregi("(select|delete) *([\*a-zA-Z,_\(\)]*) *(where)? *(.*)",$query,$reg))
{
$todo = array();
$res = array();
$columns = explode(",",str_replace(" ","",$reg[2]));
if(empty($reg[4]))
$reg[4]="";
else
{
$groupBy = preg_split("/group by/i",$reg[4]);
$reg[4] = empty($groupBy[0])?"":$groupBy[0];
}
//on exécute, la reqquete
while(list($idx,$champs) = each($columns))
{
if(eregi("([0-9a-z_]*)\((.*)\)",$champs,$func))
{
$todo[$func[1]]=$func[2];
continue;
}
if($champs=='*')
foreach( self::getFields($myArray) as $field )
$res=array_merge($res,self::select($myArray,$field,$reg[4]));
else
{
$exists=self::fieldExists($champs,$myArray);
if($exists!==true)
throw new Exception("Champs '$champs' inexistant à l'index '$exists'\n".print_r($myArray,true));
$res=array_merge($res,self::select($myArray,$champs,$reg[4]));
}
}
$tmp = array();
$size = self::getMaxSize($res);
for($i=0;$i<$size;$i++)
foreach($res as $nom => $tab)
$tmp[$i][$nom]=isset($tab[$i])?$tab[$i]:'';
/**
*
* action spécifique
*
**/
// si on veut grouper
if(!empty($groupBy[1]))
$tmp=self::groupBy($tmp,trim($groupBy[1]));
//autre actions
if(count($todo))
{
foreach($todo as $func => &$do)
if(!self::functionExists($func))
throw new Exception("Fonction '$func()' inconnue");
}
//*****
return $tmp;
}
else
throw new Exception("requete incomprise");
}
catch(Exception $e)
{
throw new Exception("[myArrayError] une erreur dans la requete : '$query'\n\t{$e->getMessage()}\n");
}
}
/**
* retourne un array contenant les valeurs du champs $fieldName dans le tableau $myArray
* une condition peut etre définie pour la récupération.
* cette condition est évaluée par la fonction eval() de php
*
* pour faire appel a la valeur d'un champs donné, il suffit dencadrer ce nom de champs par des %%
* ainsi %mon_champs% fera référence à la valeur de $row['mon_champs']
*
* @access private
* @param (array) $myArray
* @param (string) $fieldName
* @param (string) $condition
* @return (array)
*/
public static function getField($myArray,$fieldName,$condition=true)
{
try
{
$res = array();
//préparation de la condition
if(is_string($condition) && trim($condition)!="")
{
$patterns=array("/^(.*)$/","/\s*([\*<>=+-]{1,2})\s*/");
$condition=preg_replace($patterns," \$1 ",$condition);
$condition=preg_replace("/\s+=\s+/"," == ",$condition);
if(preg_match_all("/[\s]?%?([a-z_]+[\w]+)%?[\s]+/i",$condition,$reg))
{
while(list($idx,$field) = each($reg[0]))
{
$cleanned_field = $reg[1][$idx];
if(in_array(strtolower($cleanned_field),array("and","or","between")) or self::functionExists($cleanned_field))
continue;
$fieldExists = self::fieldExists($cleanned_field,$myArray);
if($fieldExists===true)
$condition = str_ireplace($field,' $row["'.$cleanned_field.'"] ',$condition);
else
throw new Exception("Champs '{$cleanned_field}' à l'index '$fieldExists' inconnu dans la clause 'where'");
}
}
}
else
$condition = "1";
//global $row;
while( list($row_idx,$row) = each($myArray))
if(isset($row[$fieldName]) && self::where($condition,array("row" => $row)))
$res[$fieldName][]=$row[$fieldName];
return $res;
}
catch(Exception $e)
{
throw $e;
}
}
/**
* Alias de la méthode getField
*
* @see getField
*/
public static function select($myArray,$fieldName,$condition){ return self::getField($myArray,$fieldName,$condition);}
/**
*
*/
private static function where($condition,$scope=null)
{
//on défini le scope par défaut
$myScope = $GLOBALS;
//si un scope a été spécifié
if(is_array($scope))
$myScope = $scope;
//on charge les variables du scope pour pourvoir faire lévaluation
extract($myScope,EXTR_OVERWRITE);
// on utilise les saut de lignes pour pouvoir se repérer si une erreur est générée
// car eval ne spécifie qu'un numéro de ligne pour une erreur.
$condition = str_replace(" ","\n",$condition);
//inhibition du mess d'erreur
//j'ai pas trouvé de vraie méthode pour ca :( cest crade
ob_start();
$evaluation = eval("return $condition;");
$errorMsg = ob_get_clean();
if(!empty($errorMsg))
$error = error_get_last();
$error_msg = "Erreur de syntaxe dans la clause 'where': ";
$arrow_pad = strlen($error_msg);
// si une erreur à été généré lors de l'eval, on va préciser où se trouve l'erreur
if(!empty($error['line']))
{
$error_line = $error['line'];
for($i=1,$pos = strpos($condition,"\n");$i<$error_line-1;$pos=strpos($condition,"\n",$pos+1),$i++ ){}
$condition = str_replace("\n"," ",$condition);
$arrow_pad += ($pos-2);
$arrow_pad += strlen($condition);
$arrow = str_repeat(' ',$arrow_pad).'^';
throw new Exception("$error_msg$condition \n\t $arrow ({$error['message']})");
}
return $evaluation;
}
/**
* retourne la taille la plus grande parmis les array contenu dans $myArray
*
* @param (array) $myArray
* @return (int)
*/
public static function getMaxSize($myArray)
{
$sizes = self::count($myArray);
if(!count($sizes))
return 0;
return max($sizes);
}
/**
* retourne l'existence d'une clé dans l'ensemble des sous tableau de $myArray
*
* @param (string) $aColumnName
* @param (array) $myArray
* @return (bool)
*/
public static function fieldExists($aColumnName,Array $myArray)
{
if(empty($myArray))
{
//print_r(debug_backtrace());
throw new Exception("Erreur test d'existence");
}
while(list($idx,$row)=each($myArray))
if(!array_key_exists($aColumnName,$row))
return $idx;
return (bool)true;
}
public static function functionExists($funcName)
{
return method_exists(get_class(),$funcName);
}
/**
* retourne les champs
* si le parametre optionel $all est définie à true (false par défaut),
* alors ce sont tous les champs qui sont retournés
* sans se soucier si ils sont tous commun aux sous-tableaux
*
* @param (array) $myArray
* @param (bool) [$all]
* @return (array)
**/
public static function getFields($myArray,$all=false)
{
$res= array();
while(list($idx,$row)=each($myArray))
$res = ($all)?$res+array_keys($row):(count($res)?array_intersect($res,array_keys($row)):array_keys($row));
return $res;
}
/**
* Fonctions type msyql
*/
/**
* retourne pour chaque ligne du tableau la taille
*
* @param (array) $myArray
* @return (array)
*/
public static function count($myArray)
{
$res = array();
while(list($idx,$row) = each($myArray))
$res[$idx] = count($row);
return $res;
}
}
?>
Conclusion
@TODO:
- Remettre au propre le code - Revoir le "moteur" - faire une version réellement orientée objet
what else...
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
tri tableau 2 dimensions [ par lebobby ]
Bonjour je voudrais savoir comment je pourrais faire pour trier ce tableau :$tab[0]=array("i"=>"23", "c" => "rge", "date" =>'2002-08-03 12:00
[MySQL] Sauvegarde d'un tableau dans une table [ par cedvoyage ]
Bonjour,J'aimerais sauvegarder un tableau (multimensionnel) dans ma base MySQL.Or quand j'essaye je n'ai que 'Array' de marquer dans le champ de ma ta
résultat d'une requete dans un tableau [ par guixyz ]
Bonjour à tous, j'aimerais afficher le résultat d'1 requete ds 1 tableau de 5 colonnes sur 3 lignes. En fait les 5 cellules de la 1ère ligne contiendr
récursivité quand tu me tiens [ par livingdead ]
j'ai une requete qui traite de catégrorie, et ses catégories peuvent avoir une catégorie parent qui peut elle aussi avoir un parent etc ..............
code php [ par filali19 ]
bonjour les amis,j'ai un petit problème je voudrai afficher plusieurs tableau en tant que résultat d'une requetel'affichage je veux qu'il soit comme s
probleme array tableau [ par guiguipumpkin ]
bonjour,je ne trouve pas la fonction php qui permet de supprimer un element d'un tableau array, suivant un indice iun peu comme array_shift mais en po
Tableau (array) (pour les pros du PHP) [ par jockos ]
Bonjour,J'ai 2 questions très techniques auxquel je n'ai trouvé AUCUNE réponse sur les nombreux sites et manuels PHP.Est-ce que les élements d'un tabl
Tableau array etc... [ par Cestmoi ]
J'affiche des données de la facon suivante :foreach($server->rules as $key => $value) { echo $key." = ".$value."<br>"; }
Charger un array depuis mysql [ par mdog ]
bonjour, je cherche a charger depuis mysql un tableau array pour pouvoir l'integrer dans une page, seulement je ne sais pas coment faire, avec ma syta
Problem d'affichage de resultat de requete sous forme de tableau [ par jbcaiz ]
explication : je fais un requete de recherche dans ma base, qui doit normalement me sortir plusieur résultat.je veux que ces résultat s'affiche dans u
|
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
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
|