IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Boucle sur formulaire [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    responsable de production
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : responsable de production

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut Boucle sur formulaire
    Bonjour,

    Je sais pas comment aborder mon problème .

    J'ai un formulaire qui envoi une quantité pour sortir une quantité du stock.

    exemple : je souhaite sortir 5 produits, il y a 2 entrées en stock pour ce produits, une de quantité 2 et une de quantité 3 qui feront la sortie de 5.
    Je peux très bien avoir 5 entrées de 1 qui feront la sortie de 5.

    Il faudrait que j’exécute mon contrôleur deux fois comme j'ai deux entrées avec une fois la quantité 2 et une fois la quantité 3.
    Pour garder la traçabilité des sorties par rapport aux entrées car si je dois supprimer une sortie il faut que je puisse la réaffecter à l'entrée initiale.
    Quand j'ai une entrée pour une sortie tout fonctionne très bien.

    Je vois que la boucle et mettre ma variable quantité dans un array puis check a chaque tour la variable.
    Sinon je vois comment faire pour changer la variable quantité a chaque tour.
    Car cette variable est dynamique .

    Je sais pas si mes explications sont très claire, pas simple d'expliquer le problème par écrit.
    Merci de votre aide.
    Cordialement.

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Je ne suis pas sûr de très bien comprendre.
    (Ce que vous appelez entrée c'est un input ? c'est bizarre de le lire en Français ^^)

    Cependant, vous parlez de boucler sur une quantité mais ça ne me semble pas correct.
    Vous devez boucler sur le nombre d'entrées et non sur les quantités.
    De cette façon, à chaque boucle vous retirez la quantité, exactement comme vous avez décrit votre exemple : 1 fois 2 + 1 fois 3; ou; 5 fois 1

  3. #3
    Membre à l'essai
    Homme Profil pro
    responsable de production
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : responsable de production

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut
    merci de prendre le temps de me répondre.

    oui c'est un input number la quantité.

    oui je boucle sur le nombre d'entée soit 2 boucles, mais je sais pas comment faire une première boucle avec la quantité 2 puis une autre boucle avec la quantité 3 une fois les deux boucles passée je redirige vers une autre page.

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 571
    Par défaut
    montrez déjà la structure des tables qui stockent les détails des produits et les quantités.

  5. #5
    Membre à l'essai
    Homme Profil pro
    responsable de production
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : responsable de production

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut
    Voici la structure des 3 tables.

    table des quantités
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE TABLE `stock` (
    	`st_id` INT(11) NOT NULL AUTO_INCREMENT,
    	`st_idEnter` INT(11) NOT NULL DEFAULT NULL,
    	`st_idTool` INT(11) NOT NULL,
    	`st_price` FLOAT(10,2) NULL DEFAULT NULL,
    	`st_stock` INT(11) NOT NULL,
    	`st_wear` INT(11) NULL DEFAULT NULL,
    	`st_date` DATETIME NOT NULL,
    	PRIMARY KEY (`st_id`) USING BTREE,
    	INDEX `FK_st_stock` (`st_stock`) USING BTREE,
    	CONSTRAINT `FK_st_stock` FOREIGN KEY (`st_stock`) REFERENCES `larocheToolsTest`.`location` (`lo_id`) ON UPDATE RESTRICT ON DELETE RESTRICT
    )
    COMMENT='QUANTITE DU STOCK'
    COLLATE='utf8mb4_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=17
    ;
    table des entrées
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    CREATE TABLE `enter` (
    	`id` INT(11) NOT NULL AUTO_INCREMENT,
    	`idTool` INT(11) NOT NULL,
    	`idEnter` INT(11) NOT NULL,
    	`idProvider` INT(11) NOT NULL,
    	`idUser` INT(11) NOT NULL,
    	`idLocation` INT(11) NOT NULL,
    	`quantity` INT(11) NOT NULL,
    	`sumPrice` FLOAT(10,2) NULL DEFAULT NULL,
    	`price` FLOAT(10,2) NULL DEFAULT NULL,
    	`fabricationOrder` INT(11) NULL DEFAULT NULL,
    	`itemNumber` INT(11) NULL DEFAULT NULL,
    	`wear` INT(11) NULL DEFAULT NULL,
    	`date` DATETIME NOT NULL,
    	`dateMove` DATETIME NULL DEFAULT NULL,
    	PRIMARY KEY (`id`) USING BTREE,
    	INDEX `FK_return_idProvider` (`idProvider`) USING BTREE,
    	INDEX `FK_return_dUser` (`idUser`) USING BTREE,
    	INDEX `FK_return_idLocation` (`idLocation`) USING BTREE,
    	CONSTRAINT `FK_return_dUser` FOREIGN KEY (`idUser`) REFERENCES `larocheToolsTest`.`user` (`us_id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
    	CONSTRAINT `FK_return_idLocation` FOREIGN KEY (`idLocation`) REFERENCES `larocheToolsTest`.`location` (`lo_id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
    	CONSTRAINT `FK_return_idProvider` FOREIGN KEY (`idProvider`) REFERENCES `larocheToolsTest`.`provider` (`pr_id`) ON UPDATE RESTRICT ON DELETE RESTRICT
    )
    COMMENT='ENTREE DE STOCK'
    COLLATE='utf8mb4_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=52
    ;
    table des sorties
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    CREATE TABLE `take` (
    	`id` INT(11) NOT NULL AUTO_INCREMENT,
    	`idTool` INT(11) NOT NULL,
    	`idEnter` INT(11) NOT NULL,
    	`idEnterMove` INT(11) NOT NULL,
    	`idProvider` INT(11) NOT NULL,
    	`idUser` INT(11) NOT NULL,
    	`idLocation` INT(11) NOT NULL,
    	`quantity` INT(11) NOT NULL,
    	`sumPrice` FLOAT(10,2) NULL DEFAULT NULL,
    	`price` FLOAT(10,2) NULL DEFAULT NULL,
    	`fabricationOrder` INT(11) NULL DEFAULT NULL,
    	`itemNumber` INT(11) NULL DEFAULT NULL,
    	`wear` INT(11) NULL DEFAULT NULL,
    	`date` DATETIME NOT NULL,
    	`dateMove` DATETIME NOT NULL,
    	PRIMARY KEY (`id`) USING BTREE,
    	INDEX `FK_taken_idProvider` (`idProvider`) USING BTREE,
    	INDEX `FK_taken_idUser` (`idUser`) USING BTREE,
    	INDEX `FK_taken_idLocation` (`idLocation`) USING BTREE,
    	CONSTRAINT `FK_taken_idLocation` FOREIGN KEY (`idLocation`) REFERENCES `larocheToolsTest`.`location` (`lo_id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
    	CONSTRAINT `FK_taken_idProvider` FOREIGN KEY (`idProvider`) REFERENCES `larocheToolsTest`.`provider` (`pr_id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
    	CONSTRAINT `FK_taken_idUser` FOREIGN KEY (`idUser`) REFERENCES `larocheToolsTest`.`user` (`us_id`) ON UPDATE RESTRICT ON DELETE RESTRICT
    )
    COMMENT='SORTIE DE STOCK'
    COLLATE='utf8mb4_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=42

    Et voici la partie php qui gere la sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    				if (!empty($enterTake) && $enterTake == "take"){
     
    					$req_count_enter = $bdd -> prepare("
    						SELECT
    							COUNT(DISTINCT st_idEnter) AS count_enter
    							FROM (
    								SELECT st_idEnter
    								FROM `stock`
    								WHERE
    									st_idTool = 1
    								AND
    									st_stock = 3
    								ORDER BY st_id ASC LIMIT ".$quantity."
    							) AS T1
    					");
    					$req_count_enter ->execute();
    					$data = $req_count_enter->fetch(PDO::FETCH_ASSOC);
    					$req_count_enter -> closeCursor();
    					$req_count_enter = NULL;
     
    					$count_enter = $data['count_enter'];
     
    					/*------- il faut que je bloucle ici------*/
     
                                             for ($i=0; $i < $count_enter; $i++){
     
    						$req_idEnter = $bdd -> prepare('
    							SELECT
    								MAX(idEnter) AS maxIdEnter
    							FROM (
    								SELECT idEnter FROM `enter`
    								UNION ALL
    								SELECT idEnter FROM `take`
    							) AS t
    						');
    						$req_idEnter ->execute();
    						$data_idEnter = $req_idEnter -> fetch(PDO::FETCH_ASSOC);
    						$req_idEnter -> closeCursor();
    						$req_idEnter = NULL;
     
    						$idEnter = $data_idEnter['maxIdEnter'] + 1;
     
    						$req_price = $bdd -> prepare('
    							SELECT SUM(st_price) AS price
    							FROM (
    								SELECT st_price
    								FROM `stock`
    								WHERE
    								st_idTool = ?
    								AND
    								st_stock = ?
    								AND
    								st_wear IS NULL
    								ORDER BY st_date ASC LIMIT '.$quantity.'
    							) AS t1
    						');
    						$req_price ->execute(
    							array(
    								$idTool,
    								$us_idLocation
    							)
    						);
    						$data = $req_price -> fetch(PDO::FETCH_ASSOC);
    						$req_price -> closeCursor();
    						$req_price = NULL;
    						$sumPrice = $data['price'];
     
    						$req_dateMove = $bdd -> prepare('
    							SELECT st_idEnter, st_date
    							FROM `stock`
    							WHERE st_idTool = ?
    							AND
    							st_stock = ?
    							AND
    							st_wear IS NULL
    							ORDER BY st_date ASC LIMIT '.$quantity
    						);
    						$req_dateMove ->execute(
    							array(
    								$idTool,
    								$us_idLocation
    							)
    						);
    						$data = $req_dateMove -> fetch(PDO::FETCH_ASSOC);
    						$req_dateMove -> closeCursor();
    						$req_dateMove = NULL;
    						$idEnterMove = $data['st_idEnter'];
    						$dateMove = $data['st_date'];
     
    						$req_delete = $bdd -> prepare('
    							DELETE
    							FROM `stock` 
    							WHERE
    							st_idTool = ?
    							AND
    							st_stock = ?
    							AND
    							st_wear IS NULL
    							ORDER BY st_date ASC LIMIT '.$quantity
    						);
    						$req_delete ->execute(
    							array(
    								$idTool,
    								$us_idLocation
    							)
    						);
    						$req_delete -> closeCursor();
    						$req_delete = NULL;
     
    						$req_quantity_taken = $bdd->prepare(
    							'INSERT INTO `take` (
    								idTool,
    								idEnter,
    								idEnterMove,
    								idUser,
    								idProvider,
    								quantity,
    								idLocation,
    								sumPrice,
    								price,
    								fabricationOrder,
    								itemNumber,
    								dateMove,
    								date
    							)VALUES(
    								:idTool,
    								:idEnter,
    								:idEnterMove,
    								:idUser,
    								:idProvider,
    								:quantity,
    								:idLocation,
    								:sumPrice,
    								:price,
    								:fabricationOrder,
    								:itemNumber,
    								:dateMove,
    								:date
    							)'
    						);
    						$req_quantity_taken -> execute(
    							array(
    								'idTool' => $idTool,
    								'idEnter' => $idEnter,
    								'idEnterMove' => $idEnterMove,
    								'idUser' => $idUser,
    								'idProvider' => $pr_id,
    								'quantity' => $quantity,
    								'idLocation' => $location,
    								'sumPrice' => $sumPrice,
    								'price' => $price,
    								'fabricationOrder' => $fabricationOrder,
    								'itemNumber' => $itemNumber,
    								'dateMove' => $dateMove,
    								'date' => $date,
    							)
    						);
    						$req_quantity_taken -> closeCursor();
    						$req_quantity_taken = NULL;
    					}

  6. #6
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    Citation Envoyé par sairus95 Voir le message
    exemple :
    • je souhaite sortir 5 produits,
    • il y a 2 entrées en stock pour ce produits, une de quantité 2 et une de quantité 3 qui feront la sortie de 5.
    Je pense avoir compris la problématique.
    Pour la "sortie" de 5 produits, on veut associer :
    • l'entrée en stock de quantité 2
    • l'entrée en stock de quantité 3
    • 2 + 3 = 5 : le compte est bon.

    Si j'ai bien lu le code, tu veux ensuite SUPPRIMER ces 2 lignes de la table 'stock'.
    OK.

    Mais j'ai une question supplémentaire :
    • si on veut sortir 4 produits ??
      Comment ça se passe ?

    on va associer :
    • l'entrée en stock de quantité 2
    • MAIS pour l'entrée en stock de quantité 3, il va rester un résidu de 1. On en fait quoi ?
      Au lieu de SUPPRIMER (DELETE) la ligne, on la met à jour (UPDATE) avec la nouvelle quantité : (3-2) = 1 ?
      C'est bien ça ?


    En supposant que mes hypothèse soient correctes...

    Je pense que tu te trompes complètement de LOGIQUE.
    Il ne faut pas "boucler" comme tu le conçois.

    Il faut :
    1. faire une requête sur toutes les lignes de CE PRODUIT dans le stock, et récupérer l'id et la quantité
    2. ensuite seulement, on peut boucler sur ces lignes, et déduire au fur et à mesure la quantité
    3. enfin un break dans la boucle, quand tu atteins la quantité voulue

    Je ne peux pas te donner de code, car je ne comprends pas tes TABLES SQL :
    • la table 'stock' (que tu appelles "table des quantités") ne contient pas de colonnes "quantity" !
    • id_ceci, id_cela,... lequel correspond au PRODUIT recherché ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    responsable de production
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : responsable de production

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut
    bonjour,

    Dans les tables take et enter je stock les historiques des sorties et entrées, la table stock, je stock la quantité, 5 produits égale 5 lignes, c'est pour cela qu'il y pas de colonne quantité.

    Je pense que tu te trompes complètement de LOGIQUE.
    Il ne faut pas "boucler" comme tu le conçois.
    A force d'essayer je suis perdu dans ma logique !!! j'arrive pas a matérialiser la procédure dans la tête !!!

  8. #8
    Membre à l'essai
    Homme Profil pro
    responsable de production
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : responsable de production

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut
    j'ai résolu mon problème

    je stock les valeurs des variables dans des tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    $req_count_idEnter = $bdd -> prepare("
                                SELECT st_idEnter, COUNT(st_idEnter) AS count_idEnter, st_date 
                                FROM (
    					SELECT st_idEnter, st_date
    					FROM `stock`
    					WHERE
    						st_idTool = 1
    					AND
    						st_stock = 3
    					ORDER BY st_id DESC LIMIT ".$quantity."
    			     ) AS T2
    			     GROUP BY st_idEnter
    			");
    			$req_count_idEnter ->execute();
    			foreach ($req_count_idEnter AS $row){
    				$array_count_idEnter[] = $row['count_idEnter'];
    				$array_st_idEnter[] = $row['st_idEnter'];
    				$array_st_date[] = $row['st_date'];
    			}
    			$req_count_idEnter -> closeCursor();
    			$req_count_idEnter = NULL;
    puis je crée ma boucle comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    $a = $array_count_idEnter;
    $b = $array_st_idEnter;
    $c = $array_st_date;
     
    $a_keys = array_keys($a);
    $b_keys = array_keys($b);
    $c_keys = array_keys($c);
     
    for($i = 0 ; $i < $count_enter ; $i++){
         $quantitys = $a[$a_keys[$i]];
         $st_idEnter = $b[$b_keys[$i]];
         $st_date = $c[$c_keys[$i]];
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/02/2017, 16h30
  2. Boucle sur formulaire et enregistrements multiples
    Par Tyranus dans le forum Langage
    Réponses: 7
    Dernier message: 14/10/2015, 11h25
  3. [AC-2007] Problème de boucle sur formulaire en continu
    Par Daniel-Gérald dans le forum Access
    Réponses: 2
    Dernier message: 13/12/2013, 09h33
  4. Boucle sur formulaire de simulation de clic sur bouton
    Par arnolano0 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/02/2010, 10h34
  5. [MySQL] Boucles sur formulaire
    Par falz222 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/08/2006, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo