$rqlibt=db_query("SELECT LIBELLE, ".$GLOBALS["NmChpComment"]." from $TBDname where NM_TABLE='$NM_TABLE' AND NM_CHAMP='$NmChDT'");
         if (db_num_rows($rqlibt) >0) {
	     $rwlibt=db_fetch_assoc($rqlibt);
	     $table0cexists=true;
	 } else {
	     $table0cexists=false;
	 }
	 $ult=rtb_ultchp();
	 echo "<H3>Table <I>".$NM_TABLE."</I> (".$rwlibt[$ult[LIBELLE]].")</H3>";
	 
	if ($rwlibt[$ult[$GLOBALS["NmChpComment"]]]) echo "<small>".$rwlibt[$ult[$GLOBALS["NmChpComment"]]]."</small><br/>";
	if ($CREATION=="false") { // on affiche les champ dans l'ordre d�ition
		$resf= db_query("SELECT NM_CHAMP FROM $TBDname WHERE NM_TABLE='$NM_TABLE' AND NM_CHAMP!='$NmChDT' ORDER BY ORDAFF");
		while ($rf=db_fetch_row($resf)) $tbLCHP[]=$rf[0];
	}
    $resf=db_query(addwherefORlimit("select * from $CSpIC$NM_TABLE$CSpIC",1)); // uniquement pour avoir la liste des champs
	$nfields=db_num_fields($resf);
      	
	if ($AFFALL=="vrai") echo "<BLOCKQUOTE>La table $NM_TABLE comporte ".$nfields." champs :<BR><FONT SIZE=\"-1\">"; 	 
	
	echo '<TABLE BORDER="1"><THEAD><TH>NOM CHAMP</TH><TH>TYPE</TH><TH>LIBELLE</TH><TH>TYP. AFF</TH><TH>VALEURS</TH><TH>COMMENTAIRE</TH></THEAD>';
	
	// DU au fait que la fonction mysql_field_flags ne fonctionne correctement qu'avec un resultat "NORMAL" et pas avec une requete du type SHOW FIELDS
         if ($_SESSION[db_type]=="mysql") $table_def = mysql_query("SHOW FIELDS FROM $CSpIC$NM_TABLE$CSpIC");
        //$resf=mysql_list_fields ($DBName, $CSpIC$NM_TABLE$CSpIC);
        // ins�e un champ commun de description de la table s'il n'existe pas

	$rpct=db_query("SELECT NM_CHAMP FROM $TBDname WHERE NM_TABLE='$NM_TABLE' AND NM_CHAMP='$NmChDT'");
        if (db_num_rows($rpct)==0) db_query("INSERT INTO $TBDname (NM_TABLE, NM_CHAMP,LIBELLE, ORDAFF, ORDAFF_L) values
	  ('$NM_TABLE','$NmChDT','$NM_TABLE', '$i', '$i')");
function ttChpLink($valb0,$reqsup="",$valc=""){
	//echo $reqsup;
	global $DBHost,$DBUser,$DBName,$DBPass,$carsepldef,$TBDname,$maxrepld;
	$valbrut=explode(';',$valb0);
	/// en cas de modif de la syntaxe, checker aussi PYAObj
	/// methode echoFilt, case LDLLV qui se sert de la chaine valb0 pour une requete imbriquée  
	if (count($valbrut)>1) { // connection �une base diff�ente
		$lntable=$valbrut[1];
		$defdb=explode(',',$valbrut[0]);
		$newbase=true;
		// si user et/ou hote d'acc� �la Bdd est diff�ent, on etablit une nvlle connexion
		// on fait une nouvelle connection syst�atiquement pourt etre compatioble avec pg_sql
		//if (($defdb[1]!="" && $defdb[1]!=$DBHost)||($defdb[2]!="" && $defdb[2]!=$DBUser)) {
		$lnc=db_connect($defdb[1],$defdb[2],$defdb[3],$defdb[0]) or die ("Impossible de se connecter au serveur $defdb[1], user: $defdb[2], passwd: $defdb[3]");
		$newconnect=true;
		//}
	} else { //commme avant
		$lntable=$valbrut[0];
		$newbase=false;
		$newconnect=false;
	}
	// gestion condition AND depuis PYA
	$valb2 = explode("[[",$lntable);
	if (count($valb2)>1) {
		$lntable=$valb2[0];
		if ($reqsup!="") {
			$reqsup= "(".$this->Val2." AND ".$valb2[1].")";
		} else $reqsup = $valb2[1];
	}
	// si une seule valeur a chercher, on ignore $reqsup sinon ça met la merde
	if ($valc != "") $reqsup = "";

	// 0: table, 1: champ lié(clé(s)); 2: ET SUIVANTS champs affiches
	$defl = explode(',',$lntable);
	$nbca = 0; // on regarde les suivants pour construire la requete
	$rcaf = "";
	$tbmultk = explode(":",$defl[1]); // on gère les clé multiples: le nom du champ clé est dans ce cas clé1:clé2:clé3
	// on boucle sur les champs à afficher
	while ($defl[$nbca+2]!="") {
		$nmchp=$defl[$nbca+2];
		$c2aff=true; // champ a afficher effectivement
		if (strstr($nmchp,"!")) { // caractere separateur defini
			$nmchp=explode("!",$nmchp);
			$tbcs[$nbca+1]=$nmchp[0]; // separateur avant le "!"
			$nmchp=$nmchp[1];
		}
		/* si le chp a afficher champ comporte un & au debut, il faut aller cherche les valeurs dans une
		table; les parametres sont  indiques dans les caracteristiques d'édition de CE champ dans la table  de définition*/
       	if (strstr($nmchp,"&")) { // si chainage
			$nmchp=substr ($nmchp,1); // enl�e le &
			if (strstr($nmchp,"~@")) { // si classement inverse en plus sur ce champ
				$nmchp=substr ($nmchp,2); // enl�e le @
				$orderby=" order by $nmchp DESC "; 
			} elseif (strstr($nmchp,"@")) { // si classement en plus sur ce champ
				$nmchp=substr ($nmchp,1); // enl�e le @
				$orderby=" order by $nmchp "; 
			}
     	 	$rqvc=db_query("select VALEURS from $TBDname where NM_CHAMP='$nmchp' AND NM_TABLE='$defl[0]'");
      	 	$resvc=db_fetch_row($rqvc);
     	 	$valbchain[$nbca+1]=$resvc[0]; /// TODO la syntaxe de Valeurs a évolué !!
    	}
       	if (strstr($nmchp,"@@")) { // si ce champ indique un champ de structure hierarchique avec la clé de type pid= parent id
			$cppid = substr ($nmchp,2); // enleve le @@
			$c2aff=false;
	 	} elseif (strstr($nmchp,"~@")) { // si classement inverse sur ce champ
			$nmchp=substr ($nmchp,2); // enleve le ~@
			$orderby=" order by $nmchp DESC";
		} elseif (strstr($nmchp,"@")) { // si classement sur ce champ
			$nmchp=substr ($nmchp,1); // enleve le @
			$orderby=" order by $nmchp ";
		}
		if ($c2aff) { // si champ à afficher
			$rcaf=$rcaf.",".$nmchp;
			$tbc2a[]=$nmchp; // tableau des champs où chercher
		}
		$nbca++;
	} // fin boucle
	if ($cppid) $nbca=$nbca-1; 

	
	if  ($valc!="") { // soit on cherche 1 et 1 seule valeur, ou plusieurs si $valc est un tableau, ou une chaine de caractères
		if (is_array($valc)) { // on a un tableau, donc plusieurs enregistrements recherchés
			if (count($tbmultk) > 1) { // si FK clé multiple
				foreach ($valc as $val1c) {
					$whsmk = "";
					$uval = explode(":",$val1c);
					$ik = 0;
					foreach($tbmultk as $ck) {
						$whsmk.=" $ck='".$uval[$ik]."' AND ";
						$ik++;
					}
					$whsl.="(".vdc($whsmk,5).") OR ";
				}
			} else { // pas clé multiple
				foreach($valc as $uval) {
					$whsl.=" $defl[1]='$uval' OR ";
				}
			} // fin si pas clémltiple
			$whsl=" where ".vdc($whsl,3);
		} elseif (strstr($valc,'__str2f__')) { // on cherche une chaine parmi les champs à afficher (utilisé par la popup de sel générique)
			$val2s=str_replace('__str2f__','',$valc);
			foreach($tbc2a as $chp) {
				$whsl.=" $chp LIKE '%$val2s%' OR ";
			}
			$whsl=" where ".vdc($whsl,3);
		} else { // on cherche une valeur
			if (count($tbmultk) > 1) { // clé multiple
				$whsmk = "";
				$uval = explode(":",$valc);
				$ik = 0;
				foreach($tbmultk as $ck) {
					$whsmk.=" $ck='".$uval[$ik]."' AND ";
					$ik++;
				}
				$whsl.= ' where ('.vdc($whsmk,5).')';
			} else $whsl=" where $defl[1]='$valc'"; // normal
		}
		if ($reqsup!="") { // rajoute req suppl eventuelle
			$whsl="(".$whsl.") AND ".$reqsup;
		}
	} else { 	// soit la liste est simplement limité par une clause where supplémentaire
			$whsl= ($reqsup != "" ? "WHERE ".$reqsup : "");
	}


	if ($cppid && $valc=="") { //on a une structure hierarchique et plus d'une valeur à chercher
		// on cherche les parents initiaux, ie ceux dont le pid est null ou egal a la cle du meme enregistrement
		if ($reqsup!="") $whreqsup=" AND $reqsup ";
		$rql=db_query("SELECT $defl[1], $cppid $rcaf from $defl[0] WHERE ($cppid IS NULL OR $cppid=$defl[1] OR $cppid=0) $whreqsup $orderby");
		while ($rw=db_fetch_row($rql)) {
			if($rw[0] !="") { // si cle valide
				$resaf=tradLib($rw[2]);
				for ($k=2;$k<=$nbca;$k++) {
					$cs=($tbcs[$k]!="" ? $tbcs[$k] : $carsepldef);
					if ($valbchain[$k]!="") {
						$resaf=$resaf.$cs.ttChpLink($valbchain[$k],"",$rw[$k + 1]);
					} else $resaf=$resaf.$cs.tradLib($rw[$k +1]);
				} // boucle sur chps �entuels en plus
				$tabCorlb[$rw[0]]=$resaf;
				rettarbo($tabCorlb,$rw[0],$defl,$cppid,$rcaf,$orderby,$nbca,$tbcs,0,$whreqsup); 
				//print_r($tabCorlb);				
			} // fin si cl�valide
		} // fin boucle reponses
		if (!is_array($tabCorlb)) { // pas de reponses
			$tabCorlb[err]="Error ! impossible construire l'arbre ";
		}
	} else { // pas hierarchique => normal
		$defl[1] = str_replace(":",",",$defl[1]); // au cas ou clé multiple
		$sqln =  addwherefORlimit("SELECT $defl[1] $rcaf from $defl[0] $whsl $orderby",$maxrepld);
		
		$rql=db_query($sqln);
		// constitution du tableau associatif a2 dim de corresp code ->lib
		//echo "<!--debug2 rql=SELECT $defl[1] $rcaf from $defl[0] $whsl $orderby <br/>-->";
		$tabCorlb=array();
		$nbkm = count($tbmultk)>1 ? count($tbmultk) : 1; // nbre clé
		while ($resl=db_fetch_row($rql)) {
			$cle = $resaf = "";
			if ($nbkm > 1) { // clé multiple
				for ($k=0;$k<$nbkm;$k++) $cle .= $resl[$k].":";
				$cle = vdc($cle,1);
			} else { // clé simple
				$nbkm = 1;
				$cle=$resl[0];
			}
			for ($k=$nbkm;$k < ($nbca + $nbkm);$k++) {
				$cs=($tbcs[$k]!="" ? $tbcs[$k] : ($k!=$nbkm ? $carsepldef : ""));
				if ($valbchain[$k]!="") {
					$resaf=$resaf.$cs.ttChpLink($valbchain[$k],"",$resl[$k]);
				} else $resaf = $resaf.$cs.tradLib($resl[$k]);
			}
			$tabCorlb[$cle]=stripslashes($resaf); // tableau associatif de correspondance code -> libell�
			//echo "<!--debug2 cle: $cle; val: $resaf ; valverif:   ".$tabCorlb[$cle]."-->\n";
		}
		// fin boucle sur les r�ultats
	} // fin si pas hierarchique=normal

	// retablit les param�res normaux si n��saire
	if ($newconnect || $newbase) {
		db_close($lnc);
		db_connect($DBHost,$DBUser,$DBPass,$DBName);// r�uvre la session normale
		}
	//if ($newbase) mysql_select_db($DBName) or die ("Impossible d'ouvrir la base de donn�s $DBName.");
	if ($valc!="" && !strstr($valc,'__str2f__')) {
		if ($resaf=="") $resaf="N.C.";
		return ($resaf);
	} else {
		return($tabCorlb); // retourne le tableau associatif
	}
}