dolibarr-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Dolibarr-dev] ajout bouton sup primer sur la fiche produit si ce de


From: Laurent Destailleur (Eldy)
Subject: Re: [Dolibarr-dev] ajout bouton sup primer sur la fiche produit si ce dernier n'est pas utilisé
Date: Sat, 08 Apr 2006 01:03:52 +0200
User-agent: Thunderbird 1.5 (Windows/20051201)

Régis Houssin a écrit :
bonjour,

tout est dans le titre,
par contre j'ai ajouté une fonction dans la classe product qui vérifie si le
produit est utilisé dans une propal, commande, facture ou contrat.

j'ai fait une requête avec des OR car avec des AND il me mettait le bouton
si un de ces 4 modules ne contenait pas le produit.
par contre la requête met un temps fou a s'exécuter.
En effet, ta requête est mauvaise.
Si chaque table a une taille de 1000, le temps de traitement sera de 1000 puissance 4 (produit cartésien de 4 tables sur du fait qu'il n'y a pas de jointures).

Pour résoudre cela, il te faut faire 4 requetes. Dans ce cas, le temps de traitement sera de 4 x 1000 et vu que le champ sur lequel on compte est indexé, ce sera meme 4x1 (l'index faut passer le cout du full scan de 1000 à 1*alpha avec alpha tres proche de 1).

Bref, tes temps auront un indice de perf de presque 4 en faisant 4 requetes de suite alors qu'ils ont un indice de perf de 1000000000000 par ta methode (Et je parle pas de la mémoire et swap utilisée...). Bilan: les 4 requetes sont 150000000000 fois plus rapide que ta requete unique et meme plus encore si on imageine que les tables ont plus de lignes. Autant te dire que ce ne passe même pas sur une table de cent milles lignes de factures, contrats ou autres.

En résumé: Faire 4 appels et oops, c'est résolu.

-----------------------------------------------------------------------
function verif_prod_use($id)
{
 $sql = "SELECT COUNT(*)";
 $sql.= " FROM ".MAIN_DB_PREFIX."propaldet as p,
".MAIN_DB_PREFIX."commandedet as c";
 $sql.= ", ".MAIN_DB_PREFIX."facturedet as f, ".MAIN_DB_PREFIX."contratdet
as ct";
 $sql.= " WHERE p.fk_product = ".$id." OR c.fk_product = ".$id." OR
f.fk_product = ".$id." OR ct.fk_product = ".$id;
 $resql = $this->db->query($sql);
 if ($resql)
 {
   $row = $this->db->fetch_row($resql);
   $nbuse = $row[0];
 }
 if ($nbuse == 0)
 {
  return 0;
 }
 else
 {
  return -1;
 }
}
------------------------------------------------------------------------

Quelqu'un aurait-il une idée ?

Merci beaucoup
Régis




_______________________________________________
Dolibarr-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev




--
Laurent Destailleur.
---------------------------------------------------------------
EMail: address@hidden
Web: http://www.destailleur.fr
IM: IRC=Eldy, Jabber=Eldy

AWStats (Author) : http://awstats.sourceforge.net
Dolibarr (Contributor) : http//www.dolibarr.com
CVSChangeLogBuilder (Author) : http://cvschangelogb.sourceforge.net
AWBot (Author) : http://awbot.sourceforge.net





reply via email to

[Prev in Thread] Current Thread [Next in Thread]