Faire un INSERT INTO selon la valeur d'un champ

Signaler
Messages postés
11
Date d'inscription
mardi 16 mars 2021
Statut
Membre
Dernière intervention
7 avril 2021
-
Messages postés
11
Date d'inscription
mardi 16 mars 2021
Statut
Membre
Dernière intervention
7 avril 2021
-
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

Messages postés
15026
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
bonjour,
nous as-tu expliqué d'où venait cette quantité?
La quantité est un champ de la table vtiger_inventoryproductrel. C'est le nombre de ligne que je dois créer pour chaque article.
Messages postés
15026
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827 > Shelhyan
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.
Messages postés
11
Date d'inscription
mardi 16 mars 2021
Statut
Membre
Dernière intervention
7 avril 2021

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 ?
Messages postés
15026
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
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);
}
Messages postés
11
Date d'inscription
mardi 16 mars 2021
Statut
Membre
Dernière intervention
7 avril 2021

Ceci ne fonctionne pas.. Mes deux requêtes fonctionnent bien, mais la boucle ne va pas. Connais tu une autre syntaxe ?
Messages postés
15026
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
"la boucle ne va pas": peux-tu donner quelques faits?
as-tu pu vérifier la valeur de
$quantite
?
Messages postés
11
Date d'inscription
mardi 16 mars 2021
Statut
Membre
Dernière intervention
7 avril 2021

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 :/
Messages postés
15026
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
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.
Messages postés
11
Date d'inscription
mardi 16 mars 2021
Statut
Membre
Dernière intervention
7 avril 2021

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.
Messages postés
15026
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
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
?
Messages postés
11
Date d'inscription
mardi 16 mars 2021
Statut
Membre
Dernière intervention
7 avril 2021

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.