attribute_17 != '') { $sql = "SELECT * FROM import_geraetezuordnung WHERE anr='".$obj->attribute_17."'"; $result = $this->db->query($sql); } else { $sql = "SELECT * FROM import_geraetezuordnung WHERE anr='".$obj->number."'"; $result = $this->db->query($sql); }*/ $result = null; // COMMENTED OUT - Wrong mapping logic /*if (strlen($obj->number) == 8) { $sql = "SELECT g.* FROM krempl_geraete_22 g INNER JOIN krempl_artikelgeraet_22 ag ON g.id = ag.geraet INNER JOIN krempl_passendwie pw ON ag.ersatzteil = pw.id INNER JOIN items i ON pw.navisionid = i.krempl_id WHERE i.number = ".$this->db->real_escape_string($obj->number).";"; $result = $this->db->query($sql); }*/ // ORIGINAL MONSTER-SQL (PERFORMANCE-KILLER!) // 4-fach JOIN über 1.3M Zeilen krempl_artikelgeraet_22 = HORROR! /* ORIGINAL MONSTER-QUERY - AUSKOMMENTIERT FÜR STEP-BY-STEP ZERLEGUNG: SELECT g.* FROM krempl_geraete_22 g -- Gerätedaten (Ziel) INNER JOIN krempl_artikelgeraet_22 ag ON g.id = ag.geraet -- 1.3M ROWS N:M Mapping! INNER JOIN krempl_passendwie pw ON ag.ersatzteil = pw.id -- Ersatzteil-Mapping INNER JOIN items i ON ( -- Item-Verknüpfung pw.navisionid = i.attribute_7 -- Legacy Items OR (LENGTH(i.number) >= 8 AND pw.navisionid = i.number) -- Moderne Items ) WHERE i.number = obj->number LOGIK: 1. Items (i) → finde Ersatzteile über attribute_7 oder number 2. Ersatzteile (pw) → finde krempl_artikelgeraet_22 Mappings 3. Mappings (ag) → finde passende Geräte 4. Geräte (g) → liefere Gerätedaten */ // STEP-BY-STEP ZERLEGUNG (Performance-Optimiert): // FIX: Läuft für number >= 8 ODER wenn attribute_7 vorhanden (Legacy-Artikel) if (strlen($obj->number) >= 8 || !empty($obj->attribute_7)) { // STEP 1: Finde Ersatzteil-IDs für dieses Item $ersatzteil_ids = array(); // Query 1A: Legacy Items (über attribute_7) if (!empty($obj->attribute_7)) { $sql1a = "SELECT id FROM krempl_passendwie WHERE navisionid = ".$this->db->real_escape_string($obj->attribute_7); $result1a = $this->db->query($sql1a); if ($result1a) { while ($row = $result1a->fetch_assoc()) { $ersatzteil_ids[] = $row['id']; } } } // Query 1B: Moderne Items (über number, wenn >= 8 Zeichen) $sql1b = "SELECT id FROM krempl_passendwie WHERE navisionid = ".$this->db->real_escape_string($obj->number); $result1b = $this->db->query($sql1b); if ($result1b) { while ($row = $result1b->fetch_assoc()) { $ersatzteil_ids[] = $row['id']; } } // STEP 2: Finde Geräte-IDs für diese Ersatzteile $geraet_ids = array(); if (!empty($ersatzteil_ids)) { $ersatzteil_list = implode(',', array_map('intval', $ersatzteil_ids)); $sql2 = "SELECT DISTINCT geraet FROM krempl_artikelgeraet_22 WHERE ersatzteil IN ($ersatzteil_list)"; $result2 = $this->db->query($sql2); if ($result2) { while ($row = $result2->fetch_assoc()) { $geraet_ids[] = $row['geraet']; } } } // STEP 3: Hole finale Gerätedaten $result = false; if (!empty($geraet_ids)) { $geraet_list = implode(',', array_map('intval', $geraet_ids)); $sql3 = "SELECT * FROM krempl_geraete_22 WHERE id IN ($geraet_list)"; $result = $this->db->query($sql3); if (!$result) { $result = false; // Explizit setzen für Fallback } } else { $result = false; // Explizit setzen für Fallback } } if (!empty($obj->krempl_id) && (!isset($result) || !$result || $result->num_rows < 1)) { $sql = "SELECT * FROM krempl_artikelgeraet_22 ka left join krempl_geraete_22 kg on kg.id=ka.geraet WHERE ka.ersatzteil=".$this->db->real_escape_string($obj->krempl_id)." AND not isnull(nr)"; $result = $this->db->query($sql); } $obj->geraetezuordnung = array(); if ($result) { while ($obj1 = $result->fetch_object()) { $obj->geraetezuordnung[] = $obj1; } } // get parent warengruppe $sql = "select i.name, s.name, s2.name as wg from items i left join item_structure_assign isa on isa.item_id=i.id left join structure s on s.id=isa.structure_id left join structure s2 on s2.id=s.parent_id where i.id=".$obj->id.' AND s.active=1 LIMIT 1'; $result = $this->db->query($sql); $parent_warengruppe = ''; if ($result) { while ($obj1 = $result->fetch_object()) { $parent_warengruppe = $obj1->wg; } } $table_data = array(); foreach ($obj->geraetezuordnung as $geraet) { $nr1 = str_replace('#', '', $geraet->nr); $nr1 = str_replace('_', ' ', $nr1); $nr2 = str_replace('#', '', $geraet->produktionsstart); $nr2 = str_replace('_', ' ', $nr2); $nr3 = str_replace('#', '', $geraet->produktionsende); $nr3 = str_replace('_', ' ', $nr3); $nr3 = empty($nr3) ? "" : " - ".$nr3; $nr2 = $nr2.$nr3; $bezeichnungoriginal = str_replace('#', '', $geraet->bezeichnungoriginal); $bezeichnungoriginal = str_replace('_', ' ', $bezeichnungoriginal); $bezeichnungoriginal = preg_replace('/\r\n|\n|\r/', '', $bezeichnungoriginal); // Überprüfe, ob $bezeichnungoriginal leer ist, und verwende $geraet->modellBezeichnung falls ja if (empty($bezeichnungoriginal) && !empty($geraet->modellBezeichnung)) { $bezeichnungoriginal = str_replace('#', '', $geraet->modellBezeichnung); $bezeichnungoriginal = str_replace('_', ' ', $bezeichnungoriginal);// Ersetze durch modellBezeichnung } elseif (empty($bezeichnungoriginal)) { $bezeichnungoriginal = "-"; // Oder einen Platzhalter, wenn auch modellBezeichnung leer ist } $einkaufsmoeglichkeitencached = $nr1." ".$nr2; $table_data[$einkaufsmoeglichkeitencached][$bezeichnungoriginal][] = array($nr1, $nr2); } /* $html = '
'.$obj->name.' passend zu '.$key.' '.$parent_warengruppe.' | ||
| Geräte-/Modellbezeichnung | E-, Service-, Produktions- oder Hauptnummer | Zusatz-, F- oder Seriennummer oder Fertigungsdatum |
| '.$geraet.' | '.$nummer[0].' | '.$nummer[1].' |
| '.$nummer[0].' | '.$nummer[1].' | |