Guten Morgen Gerhard,
Christian hat den Nagel auf den Kopf getroffen. Der Punkt das natürlich Unterbaugruppen evtl. ganz anders bezogen.
Aber für deine Anwendung lässt sich ja auch eine Lösung finden.
Hoffe du verwendest ein Tool wie MySQL Workbench oder Heidi SQL damit ist es sehr einfach nachvollziehbar.
Die Fertigungsaufträge sind in der Tabelle: llx_mrp_mo gespeichert. Dort stehen z.B. in fk_produkt der Link zu welches Produkt überhaupt gefertigt werden soll.
Die Spalte fk_bom enthält den Link zur Stückliste (BOM).
Stücklisten (Grunddaten) sind in llx_bom_bom abgelegt. Die einzelnen Elemente (lines) in llx_bom_bomline.
hier müsste deine Erweiterung ansetzen und auflösen, dass wenn in in einer Zeile ein weiter BOM steht diese dann auch aufgelöst wird.
Ich habe mir ein Tool erstellt, mit dem ich Produkte aus allen BOMs in denen es vorkommt austauschen kann. Typischer Anwendungsfall: Schraube A wird durch Schraube B ersetzt. Nun möchte man ja nicht alle BOMs in denen die Schraube vorkommt manuell ändern.
Von den SQL Abfragen her dürfte das ziemlich ähnlich sein.
foreach ($selected_boms as $bom_id) {
// Get affected lines details before update for logging
$sql_lines = "SELECT rowid, qty FROM ".MAIN_DB_PREFIX.„bom_bomline“;
$sql_lines .= " WHERE fk_bom = ".((int) $bom_id);
$sql_lines .= " AND fk_product = ".((int) $search_product_id);
$resql_lines = $db->query($sql_lines);
$affected_lines = array();
if ($resql_lines) {
while ($obj = $db->fetch_object($resql_lines)) {
$affected_lines\[\] = array('rowid' => $obj->rowid, 'qty' => $obj->qty);
}
}
// Update BOM lines - replace search_product with replace_product, keeping same quantity
$sql = "UPDATE ".MAIN_DB_PREFIX."bom_bomline";
$sql .= " SET fk_product = ".((int) $replace_product_id);
$sql .= " WHERE fk_bom = ".((int) $bom_id);
$sql .= " AND fk_product = ".((int) $search_product_id);
$resql = $db->query($sql);
if ($resql) {
$affected = $db->affected_rows($resql);
if ($affected > 0) {
$updated_count++;
$lines_updated += $affected;
// Log each affected line
foreach ($affected_lines as $line) {
$sql_log = "INSERT INTO ".MAIN_DB_PREFIX."masschangebom_log";
$sql_log .= " (date_creation, fk_user, fk_bom, old_product_id, new_product_id,";
$sql_log .= " old_product_ref, new_product_ref, old_product_label, new_product_label, qty)";
$sql_log .= " VALUES (";
$sql_log .= "'".$db->idate(dol_now())."',";
$sql_log .= " ".((int) $user->id).",";
$sql_log .= " ".((int) $bom_id).",";
$sql_log .= " ".((int) $search_product_id).",";
$sql_log .= " ".((int) $replace_product_id).",";
$sql_log .= " '".$db->escape($old_product->ref)."',";
$sql_log .= " '".$db->escape($new_product->ref)."',";
$sql_log .= " '".$db->escape($old_product->label)."',";
$sql_log .= " '".$db->escape($new_product->label)."',";
$sql_log .= " ".((float) $line\['qty'\]);
$sql_log .= ")";
$resql_log = $db->query($sql_log);
if (!$resql_log) {
$error++;
setEventMessages($db->lasterror(), null, 'errors');
}
}
}
} else {
$error++;
setEventMessages($db->lasterror(), null, 'errors');
break;
}
}
if (!$error) {
$db->commit();
setEventMessages($langs->trans(„MassChangeBomSuccess“, $updated_count).’ - ‚.$lines_updated.‘ '.$langs->trans(„LinesUpdated“), null, ‚mesgs‘);
header(„Location: „.$_SERVER[„PHP_SELF“].“?search_product_id=“.$search_product_id);
exit;
} else {
$db->rollback();
}
}