PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 Re : MySQL, PostgreSQL, etc... » Procédure stocké avec variable NULL » 01-04-2013 05:28:40

OK, pour la déclaration de variable, je ne savais pas que c'était juste de l'information..

Pour ta note, oui je suis d'accord que le résultat sera null, mais c'est pour ca que j'avais tester différente chose, y compris ca :
IF somme_mise_perdant = null THEN SET gain_du_joueur = somme; END IF;
pour faire un forcage en cas de null, mais ca ne fonctionne pas.

Sinon, pour le contrôle de type de variable et de leur contenu, tu ferai quoi de plus que ce que j'ai écris?

Merci
Et oui bonne fin de weekend de paques (et vive le chocolat!)

#2 Re : MySQL, PostgreSQL, etc... » Procédure stocké avec variable NULL » 01-04-2013 05:28:40

Bonjour,

Outch ca fait mal, je pensais que c'était pas mal fait pourtant.
Le controle de type de variable est fait pourtant, non? il y a le INT dans la déclaration de variable
Pour le controle de NULL, j'ai rien trouvé et je suppose que isset existe pas.
Sinon ce qu'on pourrait faire pour amélioré c'est rajouter la valeur par défaut :

DECLARE gain_du_joueur INT DEFAULT 0;
DECLARE gain_a_repartir INT DEFAULT 0;

Mais à part ca je ne vois pas quoi.
Et non, le résultat de la formule n'est pas négatif
A+

#3 MySQL, PostgreSQL, etc... » Procédure stocké avec variable NULL » 01-04-2013 05:28:40

ebouilleur
Réponses : 5

Bonjour,

J'ai un truc que je m'explique pas avec ma procédure stocké.

Quand sous phpmyadmin, je fais : SELECT calc_gain_parieur( 5000, 5000, NULL , 5, 5 ) le résultat qui s'affiche est NULL.
Alors que je ne veut pas, et d'après mon code, ca ne debvrait pas (enfin j'ai du me tromper sur qqchose.


CREATE DEFINER=`admin`@`localhost`
FUNCTION `calc_gain_parieur`(somme int, somme_mise_gagnant int, somme_mise_perdant int, employe_gagnant int, id_employe int)
RETURNS int
BEGIN

DECLARE gain_du_joueur INT;
DECLARE gain_a_repartir INT;

IF employe_gagnant = id_employe THEN
  SET gain_a_repartir = somme_mise_perdant - (somme_mise_perdant*10/100);  
  SET gain_du_joueur = (gain_a_repartir * somme / somme_mise_gagnant) + somme;
  IF somme_mise_perdant = 0 THEN SET gain_du_joueur = somme; END IF;
END IF;  
IF employe_gagnant != id_employe THEN
      SET gain_du_joueur = 0 ;
END IF;
   
RETURN gain_du_joueur;
END##
 

Une idée?
Merci

#4 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Salut,

Une bonne année à toi aussi smile
Pour le LEFT, j'ai finalement compris ou tu voulais que je le met, en tombant sur une de mes requêtes ou j'en avait fait un...

Pour ma table suivi, je vois un peu ce que tu veux dire, mais j'ai du mal a voir ce que ca changerai par rapport a ma table, ca ne ferai que peu de différence je trouve, ou alors j'ai mal compris.

Merci en tt cas pour toujours me répondre wink

#5 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Je suis désolé JC, mais je n'arrive pas a placer ton LEFT dans la requete...
Mes tests ne m'ont retournés que des erreurs, et j'ai pas trouvé d'exemples sur google...
Si tu pouvais me montrer stp
Merci

Edit du 20/12
En fait on a oublié un GROUP BY dans les select des left join, car sinon il faut un group_concat de toute les dates sur 1 seul et meme enregistrement,
donc ca c'est mieux :


    SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM(t.total) AS prixFacture,
    s2.date_send_doc, s1.date_send_fact
    FROM fact_facture AS f
    INNER JOIN fact_client AS c ON f.id_client = c.id_client
    LEFT JOIN (SELECT id_facture, group_concat(date_send SEPARATOR ',') AS date_send_fact FROM fact_suivi WHERE stype=1 GROUP BY id_facture ORDER BY date_send) AS s1 ON f.id_facture=s1.id_facture
    LEFT JOIN (SELECT id_facture, group_concat(date_send SEPARATOR ',') AS date_send_doc FROM fact_suivi WHERE stype=2 GROUP BY id_facture ORDER BY date_send) AS s2 ON f.id_facture=s2.id_facture
    INNER JOIN (SELECT id_facture, ((quantite*prix_htva) * (1+(tva/100))) AS total FROM fact_prestation) AS t ON f.id_facture=t.id_facture
    GROUP BY f.id_facture, f.montant_paye, date_send_fact, date_send_doc
    HAVING f.montant_paye < SUM(t.total) OR date_send_fact IS NULL OR date_send_doc IS NULL
 

#6 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Jc a écrit :

Ensuite, de voir une facture avec une date de paiement effectué et avec un montant payé de 0 est l'illustre conséquence pourrait-on dire de tout ce que je viens de dire précédemment. A moins qu'il y ait un client qui s'est amusé à faire un chèque de zéro euro en paiement, ca fait tâche, et ca remet encore une fois en question la qualité et la consistance des données.

En fait, l'idée c'est que si le client ne paye pas tout d'un coup, on pouvait indiqué la somme payé et la date du 1er payement

Jc a écrit :

Pour tes deux lignes, je pense que tu es victime de ton modèle, en ayant utilisé la table de suivi comme d'un log action sur les factures. Ca te démontre aussi vu que le doc peut être envoyé plusieurs fois à des dates différentes, qu'il n'est pas pertinent d'en afficher la date d'envoi dans ton tableau contrairement à un nombre d'envoi par exemple.

Je ne vois pas comment j'aurai pu créé la table suivi d'un autre manière, mais si tu as une idée je veux bien la connaitre.
Oui ça montre que le doc peut être envoyé plusieurs fois. Et là ou c'est pertinent, c'est de savoir quand/comment/a qui il a été envoyé. Pour prendre un exemple concret, imagine que tu relances un client pour une facture non payé et qu'il te dise "non je n'ai rien reçu", avec ma table suivi, tu saura quand, comment et a qui tu l'as envoyé, c'est ça le but. Donc dans mon tableau de récapitulatif de suivi, il n'est intéressant que de savoir si ça été envoyé ou non. A partir du moment ou ça été envoyé 1 fois, c'est que tu as fait ton boulot.

Je vais essayer de faire une requete avec les éléments que tu m'a fourni.
(edit de 17h32)
Avec la requete :


    SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM(t.total) AS prixFacture,
    s2.date_send_doc, s1.date_send_fact
    FROM fact_facture AS f
    INNER JOIN fact_client AS c ON f.id_client = c.id_client
    LEFT JOIN (SELECT id_facture, group_concat(date_send) AS date_send_fact FROM fact_suivi WHERE stype=1 ORDER BY date_send) AS s1 ON f.id_facture=s1.id_facture
    LEFT JOIN (SELECT id_facture, group_concat(date_send) AS date_send_doc FROM fact_suivi WHERE stype=2 ORDER BY date_send) AS s2 ON f.id_facture=s2.id_facture
    INNER JOIN (SELECT id_facture, ((quantite*prix_htva) * (1+(tva/100))) AS total FROM fact_prestation) AS t ON f.id_facture=t.id_facture
    GROUP BY f.id_facture, f.montant_paye, date_send_fact, date_send_doc
    HAVING f.montant_paye < SUM(t.total) OR date_send_fact IS NULL OR date_send_doc IS NULL
 

Ca fonctionne, j'ai en effet plus qu'une ligne. en plus j'ai utilisé group_concat que je n'avais jamais utilisé wink
Par contre je n'ai pas saisi ce que je devais faire avec le LEFT de la requete principale, surtout vu que ca fonctionne là?
(fin du edit de 17h32)

Sinon, pour InnoDB et les modif que j'ai effectué :
Sur ma table fact_suivi, j'ai donc relié mon id_facture a celui de la table fact_facture.
Pour le ON DELETE tu me conseilles de mettre CASCADE j'imagine?
ET pour le ON UPDATE, je pense qu'il ne faut rien mettre ?

Merci

#7 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Salut,

J'avais fait la correction des INT(10), mais a priori l'erreur était peut etre du a une facture qui n'existait plus dans la table fact_facture mais dont le suivi était toujours là.
Oublie la phrase que tu n'as pas compris, on va parti sur des copie d'écran.

Pour la requete :


    SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM(t.total) AS prixFacture,
    s2.date_send_doc, s1.date_send_fact
    FROM fact_facture AS f
    INNER JOIN fact_client AS c ON f.id_client = c.id_client
    LEFT JOIN (SELECT id_facture, date_send AS date_send_fact FROM fact_suivi WHERE stype=1 ORDER BY date_send) AS s1 ON f.id_facture=s1.id_facture
    LEFT JOIN (SELECT id_facture, date_send AS date_send_doc FROM fact_suivi WHERE stype=2 ORDER BY date_send) AS s2 ON f.id_facture=s2.id_facture
    INNER JOIN (SELECT id_facture, ((quantite*prix_htva) * (1+(tva/100))) AS total FROM fact_prestation) AS t ON f.id_facture=t.id_facture
    GROUP BY f.id_facture, f.montant_paye, date_send_fact, date_send_doc
    HAVING f.montant_paye < SUM(t.total) OR date_send_fact IS NULL OR date_send_doc IS NULL
 

J'obtient ca en résultat :
2012-12-18%2009-58-44_sqlprive.ovh.net%20_%2010.0.242.92%20_%20fact_peb_test%20_%20fact_facture%20_%20phpMyAdmin%202.11.png

2 lignes pour la factire id 13, alors qu'il m'en faudrait que 1 (si j'enleve le group by date, j'ai plus qu'une ligne, mais le prixFacture est alors de 24.84..
Car dans la table fact_suivi j'ai :


CREATE TABLE IF NOT EXISTS `fact_suivi` (
  `id_suivi` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `id_facture` INT(10) UNSIGNED NOT NULL,
  `date_send` VARCHAR(10) NOT NULL,
  `who_send` VARCHAR(50) NOT NULL,
  `how_send` VARCHAR(50) NOT NULL,
  `stype` tinyint(3) UNSIGNED NOT NULL,
  UNIQUE KEY `id_suivi` (`id_suivi`),
  KEY `id_facture` (`id_facture`),
  KEY `stype` (`stype`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

--
-- Contenu de la table `fact_suivi`
--

INSERT INTO `fact_suivi` (`id_suivi`, `id_facture`, `date_send`, `who_send`, `how_send`, `stype`) VALUES
(13, 13, '2012-12-06', 'tata', 'courrier', 1),
(30, 13, '2012-12-12', 'toto', 'mail', 2),
(33, 13, '2012-12-17', 'titi', 'fax', 2);

--
-- Contraintes pour les tables exportées
--

--
-- Contraintes pour la table `fact_suivi`
--
ALTER TABLE `fact_suivi`
  ADD CONSTRAINT `fact_suivi_ibfk_1` FOREIGN KEY (`id_facture`) REFERENCES `fact_facture` (`id_facture`);
 

Si ça peut aider, je peux te donner un accès a phpmyadmin..
Merci

#8 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Salut,

J'ai fait des modif sur mes tables. j'ai changé type en stype, j'ai tout passé en InnoDB, créé un lien entre id_facture de la table fact_prestation et fact_facture et je voulais faire de même entre le id_facture de la table fact_facture et fact_suivi, mais ca me génère un erreur (que je n'arrive pas a résoudre). Est ce que l'on peut faire une contrainte de clés étrangères sur un champ qui est le meme sur plusieurs enregistrement?

Sinon pour ta requete : elle fonctionne (et me retourne le bon prixFacture) seulement si je n'ai que 1 ligne avec stype=1 et stype=2. si j'ai plusieurs lignes prixfacture n'est plus correcte. J'ai essayé plusieurs choses, (même des trucs idiots genre rajouter un LIMIT 1 dans les sous requete...) mais ca ne me donne toujours rien de bon sad

#9 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Pour la date, on s'en fout un peu en fait (si c'est la 1ere date ou juste testé si la date existe),  mais c'est plus cohérent la 1ère date

Pour la tva, c'est la tva belge : 0, 6 ou 21% donc ca va TINYINT non?

Sinon pour info, que la facture ai 1 ou plusieurs prestations, le prixFacture n'est pas bon
Exemple
table fact_facture :

id_facture     id_client     id_membre     numero_facture     date_facture     date_echeance     date_payement     montant_paye     provenance     prestataire     note    
13                   123                     1                   2012/80    2012-10-29    2012-11-03    2001-01-01         12.00    Notaire derb    Iso-peb          test

Table prestation   
id_prestation     id_facture     type     autre     date_prestation     adresse        cp     ville     pays     quantite     prix_htva     tva
10                   13                14            2012-11-26    Rue Verte, 999       7000    Mons    Belgique  1.0000      2.0000                 21
11                   13            12            2012-12-15    Rue l\'Averte, 999  7000    Mons    Belgique      1.0000                10.0000       0

Table suivi (ici 2 envois de facture et 0 de doc):
id_suivi     id_facture     date_send     who_send     how_send     type
4        13               2012-12-01    A toto                    3                 1
5        13                2012-12-01    au pape                    2                 1

Merci

#10 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Jc a écrit :

Dans ta modélisation actuelle donc, quel est le critère qui doit être retenu en interne pour dire parmi x dates d'envoi quel est la date qui doit être considérée comme étant la date d'envoi officielle pour la facture? Si c'est la dernière, ton MAX est justifié, si c'est la première, ton MAX est faux. Si en interne il suffit de vérifier qu'une date d'envoi existe pour dire qu'elle a été envoyée, alors tu peux t'en sortir avec ta modélisation actuelle et adapter ta requête en conséquence.

C'est en effet la 1ère date qui m'intéresse, donc pas de max, ok.
Et oui il me suffit d'avoir 1 date pour dire que c'est envoyé.
Mais pour ce qui est de la récupération de date, ca fonctionne, ce qui ne fonctionne pas correctement, c'est le montant de prixFacture qui est doublé, triplé, a priori en fonction du nombre d'enregistrement dans la table suivi. Je vais continuer a travailler dessus.

Et pour le reste, ce qui ne me parlait pas était juste le terme : 3FN

Merci JC
Bon dimanche à toi.

#11 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Oula, il y a des termes que je lis pour la 1ere fois hmm je vais aller me documenter un peu...

Et pour ta question :
- dans la table fact_facture : OUI 1 seul enregistrement par facture
- dans la table fact_suivi : NON, pas toujours. En principe il doit y avoir au minimum 2 enregistrements (1 pour la facture et 1 pour le doc), mais il est possible (dans 20% des cas) de trouver plusieurs ligne pour le doc (ou la facture) si celui-ci a été envoyé plusieurs fois (pour plusieurs personne par exemple)
Merci

#12 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Oui il y a avoir plusieurs enregistrement dans la table suivi pour la meme facture (en principe quand c tout bien fait il y a a minimum 2 ligne : 1 facture et 1 doc). Si il y a 4 envoie de doc, c'est comme si il y en avait que 1 seul. 1 ou plus c'est quand meme 1 ^^

Humm j'ai du mal a saisir ta 2eme requete. Il est possible que le MAX n'était pas très utile, mais la impossible d'avoir l'information de la date d'envoie de ma facture (s1.type=1) et en meme temps la date d'envoie du doc (s1.type=2)

J'en profite pour te glisser le code d'affichage du résultat de la requete :


<table align="center" width="100%" cellpadding="0" cellspacing="0" class="">       
  <tr align="center">
    <td class="about">
    <b><?php echo sort_link('N° Factures', 'id_facture') ?></b>
    </td>  
    <td class="about">
    <b>Facture envoyée</b>
    </td>
    <td class="about">
    <b>Payement reçu</b>
    </td>    
    <td class="about">
    <b>PEB envoyé</b>
    </td>  
    <td class="about">
    <b><?php echo sort_link('Date Facture', 'date_facture') ?></b>    
    </td>                          
  </tr>  
  <?php
  while($var_news = mysql_fetch_array($req)) {   
  ?> 
  <tr class="topjoueur" onmouseover="this.className='topjoueur2';" onMouseOut="this.className='topjoueur';" align="center">
    <td class="">
    <?php
    $date_du_jour = date('Y-m-d');
    //if (date_diff($var_news['date_facture'], $date_du_jour) > 240 ) $style=' style="color:#FF0000" ';
    ?>
    <a href='m_facture_suivi.php?id_facture=<?php echo $var_news['id_facture'];?>'>
      <span <?php echo $style; ?>><?php echo $var_news['numero_facture']; ?></span>
    </a> 
    </td>
    <td>
    <?php if(!empty($var_news['date_send_fact'])) {echo "<img src='images/OK.png' />"; }else{ echo "<img src='images/No.png' />";} ?>
    </td>      
    <td>
    <?php if($var_news['montant_paye']>=$var_news['prixFacture']) {echo "<img src='images/OK.png' />"; }else{ echo "<img src='images/No.png' />";} ?>
    </td>  
    <td>
    <?php if(!empty($var_news['date_send_doc'])) {echo "<img src='images/OK.png' />"; }else{ echo "<img src='images/No.png' />";} ?> 
    </td>
    <td>
    <?php echo convert_date_us2fr($var_news['date_facture']); ?> 
    </td>                  
  </tr>
  <?php $style=''; } ?>                                          
</table>
 

je vais au lit wink
Bye

#13 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Ah... ca te plait pas comme bdd? qu'est ce qui te convient pas? qu'est ce qui doit être amélioré?

La requete telle qu'elle ne passe pas, il ne connais pas date_send_fact et date_send_doc dans le where. En remplacant le where par un having, ca passe sans erreur, mais ca ne ressort qu'une ligne... je fais des tests, mais j'arrive pas a adapté ta requête pour qu'elle ressorte ce que j'ai besoin, je continu

#14 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Oui la table fact_facture ne contient qu'1 seul enregistrement par facture.
Pour le reste j'ai pas tout compris, donc je colle mes table pour déjà etre sur que tu es sur la bonne voie wink


CREATE TABLE IF NOT EXISTS `fact_facture` (
  `id_facture` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `id_client` INT(11) NOT NULL,
  `id_membre` INT(11) NOT NULL,
  `numero_facture` VARCHAR(15) NOT NULL,
  `date_facture` DATE NOT NULL,
  `date_echeance` DATE NOT NULL,
  `date_payement` DATE NOT NULL,
  `montant_paye` DECIMAL(10,2) UNSIGNED NOT NULL,
  `provenance` VARCHAR(40) NOT NULL,
  `prestataire` VARCHAR(40) NOT NULL,
  `note` text NOT NULL,
  `date_creation` DATE NOT NULL,
  UNIQUE KEY `id_facture` (`id_facture`),
  KEY `id_client` (`id_client`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

CREATE TABLE IF NOT EXISTS `fact_prestation` (
  `id_prestation` INT(11) NOT NULL AUTO_INCREMENT,
  `id_facture` INT(11) NOT NULL,
  `type` tinyint(3) UNSIGNED NOT NULL,
  `autre` text NOT NULL,
  `date_prestation` DATE NOT NULL,
  `adresse` text NOT NULL,
  `cp` INT(10) NOT NULL,
  `ville` VARCHAR(50) NOT NULL,
  `pays` VARCHAR(50) NOT NULL,
  `quantite` DECIMAL(6,4) NOT NULL,
  `prix_htva` DECIMAL(10,4) NOT NULL,
  `tva` tinyint(4) NOT NULL,
  UNIQUE KEY `id_prestation` (`id_prestation`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;


CREATE TABLE IF NOT EXISTS `fact_suivi` (
  `id_suivi` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `id_facture` INT(10) UNSIGNED NOT NULL,
  `date_send` VARCHAR(10) NOT NULL,
  `who_send` VARCHAR(50) NOT NULL,
  `how_send` VARCHAR(50) NOT NULL,
  `type` tinyint(3) UNSIGNED NOT NULL,
  UNIQUE KEY `id_suivi` (`id_suivi`),
  KEY `id_facture` (`id_facture`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=29 ;
 

voilà...

#15 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Merci pour ton aide mémoire wink

Pour le AS c'est vrai que je le met quasiment toujours, même si là je l'ai oublié pour les tables. Sinon, si mysql gère aussi quand tu ne met pas le AS, mais j'aime bien le mettre, c'est plus clair au niveau du code, je suis d'accord.

Donc ca donnerai :


    SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM( (
    p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) AS prixFacture,
    MAX(CASE WHEN s1.TYPE = '1' THEN date_send END) AS date_send_fact,
    MAX(CASE WHEN s1.TYPE = '2' THEN date_send END) AS date_send_doc
    FROM fact_facture AS f
    INNER JOIN fact_client AS c ON ( f.id_client = c.id_client )
    LEFT OUTER JOIN fact_prestation AS p ON ( f.id_facture = p.id_facture )
    LEFT OUTER JOIN fact_suivi AS s1 ON ( f.id_facture = s1.id_facture )
    GROUP BY f.id_facture
    HAVING f.montant_paye<SUM( (p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) OR date_send_fact IS NULL OR date_send_doc IS NULL
 

Pour le HAVING et ce que je souhaite, c'est simple pourtant, disons que ce tableau de suivi de facture permet de :
- voir si la facture a été envoyé
- ou voir le le doc a été envoyé
- ou voir si la facture a été payé

Mais que ce soit le "problème" de AS ou de Having, le résultat de prixFacture bizarre ne s'explique pas
(pour info j'ai aussi tester ma requête sans le having, et prixFacture est tjs aussi bizarre)

Edit :
Par contre, après d'autres tests, j'ai remarqué que si dans ma table fact_suivi, je n'ai aucun enregistrement, ou 1 seul, la valeur de prixFacture sera bonne, et elle devient fausse quand j'ai 2 ou plus d'enregistrement. (pour 2 enregistrement, prixFacture est en fait le double de la valeur qu'il devrait avoir)

#16 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Salut,

Dans mon 1er post, Kris me disait juste de mettre f.montant_paye <= prixFacture dans le having à la place du where, mais il ne me disait pas de mettre SUM( (p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) à la place de prixFacture, enfin si j'ai bien compris.

Donc ça donnerai la requête suivante :


    SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM( (
    p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) AS prixFacture,
    MAX(CASE WHEN s1.TYPE = '1' THEN date_send END) AS date_send_fact,
    MAX(CASE WHEN s1.TYPE = '2' THEN date_send END) AS date_send_doc
    FROM fact_facture f
    INNER JOIN fact_client c ON ( f.id_client = c.id_client )
    LEFT OUTER JOIN fact_prestation p ON ( f.id_facture = p.id_facture )
    LEFT OUTER JOIN fact_suivi s1 ON ( f.id_facture = s1.id_facture )
    GROUP BY f.id_facture
    HAVING f.montant_paye<SUM( (p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) OR date_send_fact IS NULL OR date_send_doc IS NULL
 

Pour mon having, j'ai du mal a comprendre ta proposition, car j'ai besoin de voir toutes les factures dont au moins 1 des 3 actions (payement, envoie de facture et envoie de doc) ne sont pas effectuées. Donc si le client n'a rien payé, ça doit être listé alors que si je met (f.montant_paye >0 AND f.montant_paye <= prixFacture) ca ne listera rien, non?

Pour visualisé un peu mon tableau d'affichage, ca donne qqchose du genre :

Facture    Payé   Facture envoyé     Doc envoyé
31             OK             OK                   NOK
13             OK             NOK                 NOK
58             NOK           NOK                  NOK 

Sinon voici une exemple de résultat de la requête actuelle :
id_facture                montant_paye             prixFacture                     date_send_fact              date_send_doc
31                               716.00                  2860.260920000000             2012-12-09          2012-12-09
13                                   12.00                  7.260000000000                        2012-12-01             NULL

Et ce que je devrais avoir :
31                               716.00                  715.065230000000             2012-12-09          2012-12-09
13                                   12.00                  2.420000000000                        2012-12-01             NULL


Voila,
Merci

#17 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Bonsoir smile
Je reviens avec ma requête fini.. enfin je croyais sad
Elle fonctionne, pas d'erreur, mais les valeurs obtenu pour prixFacture ne sont pas correctes.
Voici la requête :


SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM( (
          p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) AS prixFacture,  
          MAX(CASE WHEN s1.TYPE = '1' THEN date_send END) AS date_send_fact,
          MAX(CASE WHEN s1.TYPE = '2' THEN date_send END) AS date_send_doc
FROM fact_facture f
INNER JOIN fact_client c ON ( f.id_client = c.id_client )
LEFT OUTER JOIN fact_prestation p ON ( f.id_facture = p.id_facture )
LEFT OUTER JOIN fact_suivi s1 ON ( f.id_facture = s1.id_facture )  
GROUP BY f.id_facture
HAVING f.montant_paye<prixFacture OR date_send_fact IS NULL OR date_send_doc IS NULL
 

J'ai des valeurs bizarre (et pour le moment inexpliqué) pour prixFacture.
Si je simplifie la requête a ça, je n'ai plus de soucis :


SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM( (
          p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) AS prixFacture
FROM fact_facture f
INNER JOIN fact_client c ON ( f.id_client = c.id_client )
LEFT OUTER JOIN fact_prestation p ON ( f.id_facture = p.id_facture )
GROUP BY f.id_facture
HAVING f.montant_paye<prixFacture
 

Mais ce n'est pas ce que j'ai besoin... une idée de ce qu'il se passe? On dirait que la requete boucle ce qui fait grimper la valeur de prixFacture

Merci pour votre aide
Yves

#18 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Humm tu me donnes des idées, faudrait tester.
Mais ce que je voulais faire, c'est lister toutes les factures pour lesquelles une ou plusieurs étapes n'avaient pas été faite et donc avoir une requete du genre :


SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, sum( (
          p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) AS prixFacture,
          s.date_send_fact, s.date_send_doc
        FROM fact_facture f
        INNER JOIN fact_client c ON ( f.id_client = c.id_client )
        LEFT OUTER JOIN fact_prestation p ON ( f.id_facture = p.id_facture )
        LEFT OUTER JOIN fact_suivi s ON ( f.id_facture = s.id_facture )
        WHERE f.date_payement='0000-00-00' OR s.date_send_fact='' OR s.date_send_doc=''
        GROUP BY f.id_facture
        ORDER BY $order_by $order_dir limit $limite,$nombre
 

Mais si la facture n'a pas d'enregistrement dans la table fact_suivi, ca ne me ressort rien du coup..

#19 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

En fait c'est un table qui permet de faire le suivi d'une facture.
Elle contient des informations comme : date d'envoi de la facture, méthode d'envoi, a qui elle a été envoyé, date d'envoi du doc complémentaire, etc...
L'enregistrement correspondant a une facture n'existe qu'a partir du moment ou le membre a renseigné (via un formulaire) l'une de ses informations (cad qu'il a déja commencer a faire le suivi).
"date_send_fact" et "date_send_doc" sont au format varchar(10).
DOnc en faite, ce que je veux faire, c'est afficher un tableau qui contient les informations suivante :
numéro de facture, la date d'envoie de la facture, la date de payement (contenu dans la table facture donc pas de soucis) et la date d'envoi du doc

Mais si les 3 champs date contiennent qqchose (ce qui veut donc dire que le suivi est complet), il n'est pas necessaire d'afficher la ligne de la facture.
Est ce que je suis plus clair?
Merci

#20 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Je reviens avec une autre question sur une requete similaire :


SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, sum( (
          p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) AS prixFacture,
          date_send_fact, date_send_doc
        FROM fact_facture f
        INNER JOIN fact_client c ON ( f.id_client = c.id_client )
        LEFT OUTER JOIN fact_prestation p ON ( f.id_facture = p.id_facture )
        LEFT OUTER JOIN fact_suivi s ON ( f.id_facture = s.id_facture )
        WHERE f.date_payement='0000-00-00'
        GROUP BY f.id_facture
        ORDER BY $order_by $order_dir limit $limite,$nombre
 

La requete fonctionne bien, cependant, j'aimerais afficher que les résultats qui pour date "date_send_fact" et "date_send_doc" vide
Facile me direz vous, mais non, car ces champs sont des la tables fact_suivi et il est possible qu'il n'existe pas... et si il n'y a pas d'enregistrement il ne me les affiches pas (alors que si ils sont vides ou inexistant, pour moi c'est la meme chose)

Une idée svp?
Merci
Yves

#21 Re : MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

Ah oui c'est vrai, le having smile
Je ne l'utilise jamais (a tort peut etre)
Merci je vais tester ca (et merci pr les petites astuces/infos)

#22 MySQL, PostgreSQL, etc... » Requete SQL avec tri suivant le contenu de la requete » 07-01-2013 22:30:45

ebouilleur
Réponses : 38

Bonjour,

J'ai essayer de faire un titre clair, mais pas sur que ce soit le cas ^^
En fait, j'ai besoin de faire une requete qui me permet d'afficher les factures qui n'ont pas été payées (ou pas complètement).
J'ai une table facture qui contient entre autre le montant que le client a deja payé.
Le prix de la facture n'existe pas tel quel. Il est obtenu a partir de la somme des cout des prestations lié a la facture (chaque prestation est dans la table prestation).

L'idée pour afficher les factures non payées est donc de comparer le prix payés par le client aux totales des couts des prestation.
Est ce que l'on peut faire ca en 1 requetes?

Voila ce que j'ai essayer de faire, tout en sachant que ca ne fonctionnerait pas...


SELECT f.id_facture, f.numero_facture, f.date_facture, f.date_payement, f.montant_paye, c.nom, c.ville, c.societe, SUM( (
          p.prix_htva + ( (p.prix_htva * p.tva) /100 ) ) * p.quantite) AS prixFacture
        FROM fact_facture f
        LEFT OUTER JOIN fact_client c ON ( f.id_client = c.id_client )
        LEFT OUTER JOIN fact_prestation p ON ( f.id_facture = p.id_facture )
        WHERE f.id_membre=$sess_id_pseudo AND f.montant_paye<prixFacture GROUP BY f.id_facture ORDER BY date_facture LIMIT $limite,$nombre
 

Merci pour vos idées

#23 Recrutement » Développeur script allopass (api) [PHP/JS/MySql/Ajax/XML] » 18-10-2012 13:24:16

ebouilleur
Réponses : 0

Bonjour,

Par manque de temps, je cherche quelqu'un qui serait capable de me développer en php/ajax un module allopass qui puisse être intégrer à mon site.
Le travail ne concerne que le développement pur, je m'occuperai du css.

Il faut donc une première page avec :
- affichage des différents pays supporter et des différents mode de payement  (ici utilisation de l'ajax pourquoi pas)
- formulaire pour que le membre puisse indiquer le code allopass obtenu

Une deuxième page :
- vérification du code allopass chez allopass (via leur api)
- si code ok alors "ca travaillerai et sauvegardera en bdd le code -> boulot pour moi ca)
- si code no ok, alors msg d'erreur "mauvais code" + msg d'erreur de chez allopas

Il faut biensur que le script fonctionne sur des pages avec des sessions

PS : si besoin, j'ai la doc allopass sur les api en anglais

Si vous etes inetressé, merci de me contacter via cette interface de ticket : http://support.attitude-web.fr/index.php?a=add

Merci
Yves

#24 Forum Général PHP » Somme de champs de certains enregistrements » 03-09-2012 10:55:27

ebouilleur
Réponses : 0

Bonjour,

J'ai essayer plusieurs méthodes, qui ne me donne pas ce que je souhaite, donc me voila...

Voici un copie d'écran d'un certain enregistrement de ma table. pour simplifier j'ai deja fait un GROUP BY nombre, mais dans la table il y en a plein plein plein
tableau

Ce que je souhaite faire, c'est calculer le temps entre le status résolu et Fermé.
MAIS, il faut seulement prendre "comme départ" l'avant dernier résolu, car il peut y en avoir d'autre avant (pour le meme dossier (=nombre) ).
Le dernier status résolu est en principe tjs d'une durée tres petite (inférieur a 10secondes)
closedtotal correspond a la durée en second du status

ce que j'ai essayer de faire :

Dans un 1er temps je prendre le nombre et le closedtotal du dernier enregistrement au status résolu, qui est "significatif" :


INSERT INTO temp_dossierclos2
SELECT i1.nombre, max( i1.updatetime ) , max( i1.closedtotal )
FROM incident AS i1
WHERE i1.nombre = 'IM 2012-052659'
AND problemstatus = 'Résolu'
AND closedtotal >9
 

Et ensuite je pensais faire la somme de closedtotal de tous les enregistrement qui sont apres la date updatetime récupéré dans ma table temp_dossierclos2, mais ca ne fonctionne pas sad



SELECT DISTINCT i1.nombre, i1.closedtotal, sum(i1.closedtotal), i1.problemstatus, max(i1.updatetime)
FROM incident as i1
LEFT JOIN temp_dossierclos2 as i2 ON (i1.nombre = i2.nombre)
WHERE
UNIX_TIMESTAMP(i2.updatetime)<UNIX_TIMESTAMP(i1.updatetime)
AND i1.nombre IN (SELECT nombre FROM temp_dossierclos2)
GROUP BY i1.nombre
 

j'ai fait une erreur quelques part?
Merci

Edit : j'ai trouvé l'erreur... je me suis trompé dans le sens de mon signe a la comparaison de date. c ok maintenant smile

#25 Re : Forum Général PHP » Question basique d'un debutant » 03-09-2012 10:35:34

Bonjour,

Ce sont surement les mêmes pages, sauf que le language html est interprété par un nivateur web sur le poste client (donc ton pc) et php est interprété par un serveur web.
Le seul moyen pour toi de lire un fichier php est donc de mettre cette page sur un serveur web.
Mais sinon, tu peux ouvrir les 2 pages avec le bloc note et voir si le code source est le meme, si oui, ce sont les meme pages

Yves

Pied de page des forums

Propulsé par FluxBB