Faire un INSERT INTO selon la valeur d'un champ

Fermé
Shelhyan Messages postés 11 Date d'inscription mardi 16 mars 2021 Statut Membre Dernière intervention 7 avril 2021 - Modifié le 6 avril 2021 à 13:53
Shelhyan Messages postés 11 Date d'inscription mardi 16 mars 2021 Statut Membre Dernière intervention 7 avril 2021 - 7 avril 2021 à 13:17
Bonjour,

J'ai fais une requête INSERT INTO qui insère autant de lignes que de produits commandés dans ma commande fournisseur courante. Elle fonctionne très bien. Ce que j'aimerai au final, c'est que ma requête fasse ceci, mais je voudrai que l'INSERT crée pour une ligne produit, avec une quantité = 3, 3 lignes. quantité = 2 sur la ligne suivante de la CFR, 2 lignes. Donc il ne s'agirait plus d'un INSERT pour chaque ligne produit commandé, mais pour chAque ligne ET selon la quantité commandée. Je vous montre ma requête actuelle, qui crée une ligne par ligne produit.

function createAssetsFromPO($entity, $currentUser)
{
global $adb;
$cfr = vtws_getIdComponents($entity->getId());
$cfr = $cfr[1];
$currentUser = Users_Record_Model::getCurrentUserModel();
$current_user_id=$currentUser->get('user_name');
$assetManagement = "Oui";


$sql = $adb->pquery("
INSERT INTO table_test (test, color, infos, non_liaison, statut, Nomcompte, Assignement)
SELECT productname, vtiger_inventoryproductrel.productid, 'À renseigner', productname, 'In Service', '31072', ?
FROM vtiger_inventoryproductrel, vtiger_productcf, vtiger_products
WHERE vtiger_inventoryproductrel.productid = vtiger_productcf.productid
AND vtiger_productcf.productid = vtiger_products.productid
AND vtiger_inventoryproductrel.id =
(SELECT purchaseorderid
FROM vtiger_purchaseorder
WHERE purchaseorderid = ?)
AND vtiger_productcf.cf_1929 = ?",
array($current_user_id, $cfr, $assetManagement));

}

7 réponses

yg_be Messages postés 23392 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 Ambassadeur 1 556
6 avril 2021 à 17:16
bonjour,
nous as-tu expliqué d'où venait cette quantité?
0
La quantité est un champ de la table vtiger_inventoryproductrel. C'est le nombre de ligne que je dois créer pour chaque article.
0
yg_be Messages postés 23392 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 1 556 > Shelhyan
6 avril 2021 à 17:57
Je pense qu'il suffit de faire un SELECT pour déterminer cette quantité.
Ensuite, faire une boucle en php pour appeler plusieurs fois pquery pour faire plusieurs INSERT.
0
Shelhyan Messages postés 11 Date d'inscription mardi 16 mars 2021 Statut Membre Dernière intervention 7 avril 2021
6 avril 2021 à 19:03
D'accord, pourrais tu me donner la syntaxe pour faire cela ? J'avoue que je suis débutante et je nage un peu. La requête pour déterminer la quantité, je l'ai :

$qty = $adb->pquery("
SELECT quantity
FROM vtiger_inventoryproductrel, vtiger_productcf, vtiger_products
WHERE vtiger_inventoryproductrel.productid = vtiger_productcf.productid
AND vtiger_productcf.productid = vtiger_products.productid
AND vtiger_inventoryproductrel.id =
(SELECT purchaseorderid
FROM vtiger_purchaseorder
WHERE purchaseorderid = ?)
AND vtiger_productcf.cf_1929 = ?",
array($cfr, $assetManagement));


Mais comment l'utiliser dans une boucle ?
0
yg_be Messages postés 23392 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 1 556
6 avril 2021 à 20:20
suggestion, non testée:
$sqlsource = "
   INSERT INTO table_test (test, color, infos, non_liaison, statut, Nomcompte, Assignement) 
   SELECT productname, vtiger_inventoryproductrel.productid, 'À renseigner', productname, 'In Service', '31072', ? 
   FROM vtiger_inventoryproductrel, vtiger_productcf, vtiger_products 
   WHERE vtiger_inventoryproductrel.productid = vtiger_productcf.productid 
   AND vtiger_productcf.productid = vtiger_products.productid 
   AND vtiger_inventoryproductrel.id = 
    (SELECT purchaseorderid 
    FROM vtiger_purchaseorder 
    WHERE purchaseorderid = ?) 
   AND vtiger_productcf.cf_1929 = ?";
$sqlparams= array($current_user_id, $cfr, $assetManagement));
$qtyrow1 = $qty->fetch();
$quantite= $qtyrow1[0];
for ($i = 1; $i <= $quantite; $i++) {
   $sql = $adb->pquery($sqlsource, $sqlparams);
}
0
Shelhyan Messages postés 11 Date d'inscription mardi 16 mars 2021 Statut Membre Dernière intervention 7 avril 2021
7 avril 2021 à 08:40
Ceci ne fonctionne pas.. Mes deux requêtes fonctionnent bien, mais la boucle ne va pas. Connais tu une autre syntaxe ?
0
yg_be Messages postés 23392 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 1 556
7 avril 2021 à 11:06
"la boucle ne va pas": peux-tu donner quelques faits?
as-tu pu vérifier la valeur de
$quantite
?
0
Shelhyan Messages postés 11 Date d'inscription mardi 16 mars 2021 Statut Membre Dernière intervention 7 avril 2021
7 avril 2021 à 11:10
Non je n'ai pas pu vérifier.. Enfaite la fonction ne passe pas dans la boucle du tout; du coup je n'ai pas pu récupérer la valeur. Sur phpmyadmin, la requête amène bien les valeurs attendues.

Je suis paumée, désolé si j'explique mal la situation :/
0
yg_be Messages postés 23392 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 1 556
7 avril 2021 à 12:04
montre peut-être le code adapté.
$quantite
est assigné hors de la boucle, donc je ne comprends pas ce qui t'empeche de récupérer la valeur.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Shelhyan Messages postés 11 Date d'inscription mardi 16 mars 2021 Statut Membre Dernière intervention 7 avril 2021
7 avril 2021 à 13:07
function createAssetsFromPO($entity, $currentUser)
{
global $adb;
$cfr = vtws_getIdComponents($entity->getId());
$cfr = $cfr[1];
$currentUser = Users_Record_Model::getCurrentUserModel();
$current_user_id=$currentUser->get('user_name');
$assetManagement = "Oui";

$qty = $adb->pquery("
SELECT quantity
FROM vtiger_inventoryproductrel, vtiger_productcf, vtiger_products
WHERE vtiger_inventoryproductrel.productid = vtiger_productcf.productid
AND vtiger_productcf.productid = vtiger_products.productid
AND vtiger_inventoryproductrel.id =
(SELECT purchaseorderid
FROM vtiger_purchaseorder
WHERE purchaseorderid = ?)
AND vtiger_productcf.cf_1929 = ?",
array($cfr, $assetManagement));

$sqlsource = "
INSERT INTO table_test (test, color, infos, non_liaison, statut, Nomcompte, Assignement)
SELECT productname, vtiger_inventoryproductrel.productid, 'À renseigner', productname, 'In Service', '31072', ?
FROM vtiger_inventoryproductrel, vtiger_productcf, vtiger_products
WHERE vtiger_inventoryproductrel.productid = vtiger_productcf.productid
AND vtiger_productcf.productid = vtiger_products.productid
AND vtiger_inventoryproductrel.id =
(SELECT purchaseorderid
FROM vtiger_purchaseorder
WHERE purchaseorderid = ?)
AND vtiger_productcf.cf_1929 = ?";
$sqlparams= array($current_user_id, $cfr, $assetManagement));

$qtyrow1 = $qty->fetch();

$quantite= $qtyrow1[0];

for ($i = 1; $i <= $quantite; $i++) {
$sql = $adb->pquery($sqlsource, $sqlparams);
}
}

Voici le code de ma fonction.
0
yg_be Messages postés 23392 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 Ambassadeur 1 556
7 avril 2021 à 13:15
bonjour,
peux-tu préciser le langage (php) quand tu utilises les balises de code? explications: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
le soucis est probablement dans les deux lignes:
	$qtyrow1 = $qty->fetch();
	$quantite= $qtyrow1[0];

ne peux-tu pas récupérer la valeur de
$quantite
?
0
Shelhyan Messages postés 11 Date d'inscription mardi 16 mars 2021 Statut Membre Dernière intervention 7 avril 2021
Modifié le 7 avril 2021 à 13:32
Oui dsl je le ferai ! Oui le soucis vient surement d'içi. Enfin de compte, le résultat est qu'aucune ligne n'est ajouter par mon INSERT. Comme si du coup il récupère une valeur nulle pour $quantite. et il ne rentre pas dans la boucle, au final il ne ce passe rien du tout.
0