Ich sitze hier vor einen kleinen Problem was mich etwas trollt.
Ich habe ein XML Datei, die aus einem SAP (AX) exportiert wird. Dieses lese ich in PHP zeilenmäßig ein und trage die Werte in eine SQL Datenbank ein. Die Tabelle (Main) füllt sich somit nach und nach. Allerdings fallen nach und nach auch wieder Werte aus der Tabelle, bis dato aber händisch.
Nun wollte ich das automatsieren, die exportierte XML liefert immer nur die aktuellen Artikel. Sodass ich dachte, ich kann dies zum abgleich nutzen. So wollte ich ich, wenn er in die Dankbank (Main) die neuen Artikel schreibt. Ebenfalls in eine zweite Datenbank (Temp) die eindeutigen, einmaligen Prod-Nummern der Artikel schreibt.
Der nächste Schritt wäre nun der Abgleich zwischen Datenbank (Main) und der Datenbank (Temp) auf vorhanden sein der Prod-Nummer. Wenn diese in beiden vorhanden ist, ist der Artikel noch aktuell und soll in der Datenbank (Main) verbleiben. Wenn die Prod-Nummer in der Datenbank (Temp) nicht mehr vorhanden ist, soll der entsprechende Datensatz (Artikel) in der Datenbank (Main) gelöscht werden.
Am Ende soll dann jedesmal die Datenbank (Temp) zurückgesetzt werden.
Der Effekt ist nun, das er zwar die nicht mehr vorhanden Artikel zwar löscht aus der Main tabelle, diese aber komplett neuschreibt und die Temp tabelle mit Inhalt belässt. ID Nummer zählt hoch und alle Änderung in der Main tabelle sind verschwunden (man kann händisch bei Spalte out ja/nein setzen in einer Eingabemaske).
Ich habe ein XML Datei, die aus einem SAP (AX) exportiert wird. Dieses lese ich in PHP zeilenmäßig ein und trage die Werte in eine SQL Datenbank ein. Die Tabelle (Main) füllt sich somit nach und nach. Allerdings fallen nach und nach auch wieder Werte aus der Tabelle, bis dato aber händisch.
Code:
// Code nur für das eintragen neuer Artikel
if(file_exists($filename))
{
$xml = simplexml_load_file($filename);
if($xml)
{
foreach($xml->ProdOverviewDSTable0->Detail_Collection->Detail AS $article)
{
$sql = "SELECT prod FROM tabelle WHERE prod='".$article['ProdId1']."'";
$result = mysqli_query ($mysqli, $sql);
if (mysqli_num_rows ($result) > 0)
{
?><script>alert("Datensatz schon vorhanden"); window.location = overview.php';</script><?php
}
else
{
$sql = "INSERT INTO tabelle (id, pos, prod, qyt, name, kdartnr, out) VALUES ('', '".$number."', '".$article['ProdId1']."', '".$article['QtyCalc1']."', '".$article['Name1']."', '".$article['pdtgetCustItemId1']."', "")";
if(mysqli_query($mysqli, $sql))
{
?><script>alert("Datensatz erfolgreich übernommen"); window.location = overview.php';</script><?php
}
else
{
echo "Fehler: Could not able to execute $sql1. ".mysqli_error($mysqli)."";
}
}
}
}
}
Nun wollte ich das automatsieren, die exportierte XML liefert immer nur die aktuellen Artikel. Sodass ich dachte, ich kann dies zum abgleich nutzen. So wollte ich ich, wenn er in die Dankbank (Main) die neuen Artikel schreibt. Ebenfalls in eine zweite Datenbank (Temp) die eindeutigen, einmaligen Prod-Nummern der Artikel schreibt.
Der nächste Schritt wäre nun der Abgleich zwischen Datenbank (Main) und der Datenbank (Temp) auf vorhanden sein der Prod-Nummer. Wenn diese in beiden vorhanden ist, ist der Artikel noch aktuell und soll in der Datenbank (Main) verbleiben. Wenn die Prod-Nummer in der Datenbank (Temp) nicht mehr vorhanden ist, soll der entsprechende Datensatz (Artikel) in der Datenbank (Main) gelöscht werden.
Am Ende soll dann jedesmal die Datenbank (Temp) zurückgesetzt werden.
Code:
// Code Erweiterung das eintragen neuer Artikel und löschen alter, ungültiger
if(file_exists($filename))
{
$xml = simplexml_load_file($filename);
if($xml)
{
foreach($xml->ProdOverviewDSTable0->Detail_Collection->Detail AS $article)
{
$sql = "SELECT prod FROM tabelle WHERE prod='".$article['ProdId1']."'";
$result = mysqli_query ($mysqli, $sql);
if (mysqli_num_rows ($result) > 0)
{
$sql = "INSERT INTO tabelle_temp (id, prod) VALUES ('', '".$article['ProdId1']."')";
if(mysqli_query($mysqli, $sql))
{
$sql = "DELETE FROM tabelle WHERE prod NOT EXISTS (SELECT prod FROM database_temp)";
if(mysqli_query($mysqli, $sql))
{
$sql = "TRUNCATE TABLE tabelle_temp";
if(mysqli_query($mysqli, $sql))
{
?><script>alert("Datensatz schon vorhanden"); window.location = overview.php';</script><?php
}
}
}
}
else
{
$sql = "INSERT INTO tabelle (id, pos, prod, qyt, name, kdartnr, out) VALUES ('', '".$number."', '".$article['ProdId1']."', '".$article['QtyCalc1']."', '".$article['Name1']."', '".$article['pdtgetCustItemId1']."', "")";
if(mysqli_query($mysqli, $sql))
{
$sql = "INSERT INTO tabelle_temp (id, prod) VALUES ('', '".$article['ProdId1']."')";
if(mysqli_query($mysqli, $sql))
{
$sql = "DELETE FROM tabelle WHERE prod NOT EXISTS (SELECT prod FROM tabelle_temp)";
if(mysqli_query($mysqli, $sql))
{
$sql = "TRUNCATE TABLE tabelle_temp";
if(mysqli_query($mysqli, $sql))
{
?><script>alert("Datensatz erfolgreich übernommen"); window.location = overview.php';</script><?php
}
}
}
}
else
{
echo "Fehler: Could not able to execute $sql1. ".mysqli_error($mysqli)."";
}
}
}
}
}
Der Effekt ist nun, das er zwar die nicht mehr vorhanden Artikel zwar löscht aus der Main tabelle, diese aber komplett neuschreibt und die Temp tabelle mit Inhalt belässt. ID Nummer zählt hoch und alle Änderung in der Main tabelle sind verschwunden (man kann händisch bei Spalte out ja/nein setzen in einer Eingabemaske).
Zuletzt bearbeitet: