Report Manager
-
Hallo zusammen,
ich habe eigene 2 Kategorien programmiert und funktioniert soweit gut.
Ich habe jetzt aber folgende Probleme:-
Eine von 2 Kategorien lässt sich nicht beim Reportmanager erscheinen. Also ist nicht auf der Liste...
-
Die 2. Kategorie hat Attributen mit Multi-Value, also dialog_plus mit "isys_cmdb_dao_category_pattern::multiselect()"
Hier bekomme ich immer eine Fehlermeldung, wenn ich versuche, einen Report zu erstellen. Unknown column 'j.isys_catg_servicebook_list_2_isys_catg_svb_ori' in 'field list'
Woran liegt das Problem?
Wie kann ich gespeicherte Werten ausgeben?
Unten Codeprotected function properties() { return [ 'orientation' => array_replace_recursive(isys_cmdb_dao_category_pattern::multiselect(), [ C__PROPERTY__INFO => [ C__PROPERTY__INFO__TITLE => 'LC__CMDB__CATG_SERVICEBOOK__ORIENTATION', C__PROPERTY__INFO__DESCRIPTION => 'Orientation' ], C__PROPERTY__DATA => [ C__PROPERTY__DATA__FIELD => 'isys_catg_servicebook_list__id', C__PROPERTY__DATA__TABLE_ALIAS => 'service_orientation', C__PROPERTY__DATA__SOURCE_TABLE => 'isys_catg_svb_ori', C__PROPERTY__DATA__REFERENCES => [ 'isys_catg_servicebook_list_2_isys_catg_svb_ori', 'isys_catg_servicebook_list__id' ], C__PROPERTY__DATA__SELECT => idoit\Module\Report\SqlQuery\Structure\SelectSubSelect::factory( 'SELECT ori.isys_catg_svb_ori__title FROM isys_catg_servicebook_list sel INNER JOIN isys_catg_servicebook_list_2_isys_catg_svb_ori AS sercice2 ON sercice2.isys_catg_servicebook_list__id = sel.isys_catg_servicebook_list__id INNER JOIN isys_catg_svb_ori AS ori ON ori.isys_catg_svb_ori__id = sercice2.isys_catg_svb_ori__id', 'isys_catg_servicebook_list', 'sel.isys_catg_servicebook_list__id', 'sel.isys_catg_servicebook_list__isys_obj__id', 'sel.isys_catg_servicebook_list__id', '', idoit\Module\Report\SqlQuery\Structure\SelectCondition::factory([]), idoit\Module\Report\SqlQuery\Structure\SelectGroupBy::factory(['isys_catg_servicebook_list__isys_obj__id']) ), C__PROPERTY__DATA__JOIN => [ idoit\Module\Report\SqlQuery\Structure\SelectJoin::factory( 'isys_catg_servicebook_list_2_isys_catg_svb_ori', 'LEFT', 'isys_catg_servicebook_list__id', 'isys_catg_servicebook_list_2_isys_catg_svb_ori', 'sel2', 'sel2ori', 'sel2ori' ), idoit\Module\Report\SqlQuery\Structure\SelectJoin::factory( 'isys_catg_svb_ori', 'LEFT', 'isys_catg_svb_ori__id', 'isys_catg_svb_ori__id', 'sel', 'selori', 'selori' ), idoit\Module\Report\SqlQuery\Structure\SelectJoin::factory( 'isys_catg_servicebook_list', 'LEFT', 'isys_catg_servicebook_list__isys_obj__id', 'isys_obj__id' ) ] ], C__PROPERTY__UI => [ C__PROPERTY__UI__ID => 'C__CATG_SERVICEBOOK_ORIENTATION', C__PROPERTY__UI__PARAMS => [ 'type' => 'f_popup', 'p_strPopupType' => 'dialog_plus', 'p_strTable' => 'isys_catg_svb_ori', 'placeholder' => isys_application::instance()->container->get('language') ->get('LC__UNIVERSAL__CHOOSEN_PLACEHOLDER'), 'multiselect' => true ], C__PROPERTY__UI__DEFAULT => null ], C__PROPERTY__PROVIDES => [ C__PROPERTY__PROVIDES__REPORT => true, C__PROPERTY__PROVIDES__LIST => false, C__PROPERTY__PROVIDES__SEARCH => true, C__PROPERTY__PROVIDES__VALIDATION => false, C__PROPERTY__PROVIDES__MULTIEDIT => true ], C__PROPERTY__FORMAT => [ C__PROPERTY__FORMAT__CALLBACK => [ 'isys_export_helper', 'dialog_multiselect' ] ] ])
protected function dynamic_properties() { return [ '_orientation' => new DynamicProperty( 'LC__CMDB__CATG_SERVICEBOOK__ORIENTATION', 'isys_catg_servicebook_list__id', 'isys_catg_servicebook_list', [ $this, 'dynamic_property_callback_ori' ] ), ]; }
public function dynamic_property_callback_ori($p_row) { $l_dao = isys_cmdb_dao_category_g_servicebook::instance(isys_application::instance()->database); $l_res = $l_dao->retrieve('SELECT ori.isys_catg_svb_ori__title AS val FROM isys_catg_servicebook_list AS svcb INNER JOIN isys_catg_servicebook_list_2_isys_catg_svb_ori AS svcb2ori ON svcb2ori.isys_catg_servicebook_list__id = svcb.isys_catg_servicebook_list__id INNER JOIN isys_catg_svb_ori AS ori ON ori.isys_catg_svb_ori__id = svcb2ori.isys_catg_svb_ori__id WHERE svcb.isys_catg_servicebook_list__id = ' . $l_dao->convert_sql_id($p_row['isys_catg_servicebook_list__id'])); $l_return = isys_tenantsettings::get('gui.empty_value', '-'); if ($l_res->num_rows() > 0) { $l_return = ''; while ($l_row = $l_res->get_row()) { $l_return .= $l_row['val'] . ', '; } $l_return = rtrim($l_return, ', '); } return $l_return; }
Danke im Voraus
-
-
Hallo @cherif
warum die Kategorien im Property-Selector nicht auftauchen kann ich leider nicht so pauschal beantworten. Hast du die Kategorie-Attribute indizieren lassen?
Schau mal hier in der Verwaltung:
Bzgl. dem SQL Fehler - da wird aus irgendeinem Grund der "Join" nicht richtig gebildet. Du könntest probieren anstatt
isys_cmdb_dao_category_pattern::multiselect
die neuen "Property" Klassen zu nutzen - das ist für gewöhnlich einfacher und könnte helfenSchau mal ob du den Code
'orientation' => array_replace_recursive(isys_cmdb_dao_category_pattern::multiselect(), [ C__PROPERTY__INFO => [ C__PROPERTY__INFO__TITLE => 'LC__CMDB__CATG_SERVICEBOOK__ORIENTATION', C__PROPERTY__INFO__DESCRIPTION => 'Orientation' ], C__PROPERTY__DATA => [ /* ... */
Hiermit tauschen kannst:
use idoit\Component\Property\Type\DialogPlusMultiselectProperty; 'orientation' => new DialogPlusMultiselectProperty( 'C__CATG_SERVICEBOOK_ORIENTATION', 'LC__CMDB__CATG_SERVICEBOOK__ORIENTATION', 'isys_catg_servicebook_list__id', 'isys_catg_servicebook_list', 'isys_catg_servicebook_list_2_isys_catg_svb_ori', 'isys_catg_svb_ori' ),
Die "Multiselect" Properties sind leider immer etwas schwierig zu handhaben aufgrund der N2M Tabelle
Sollte das nicht helfen kann ich mal einen Kollegen fragen ob er weiterhelfen kann.
VG Leo
-
Hallo @LFischer
vielen Dank für deine Hilfe
Ich habe Kategorie-Attribute neu indizieren ausgeführt. Danach wurden die beiden Probleme behoben.Meine Frage: Hat diese Funktion einen Nachteil ? z.B Datenverlust ?
Nochmal Danke für deine Hilfe
VG, Cherif
-
Hey @cherif
super, das freut mich Die Funktion hat keinen Nachteil - ich kann dir kurz erklären wofür sie benutzt wird:
Alle Attribute sind ja im Kategorie Code hinterlegt - also über hunderte Dateien verteilt. Und für Stellen wie z.B. die Reports brauchen wir "schnell" alle verfügbaren Attribute.
Damit i-doit nicht immer alle Dateien laden muss um alle Attribute zu finden werden diese quasi in der Datenbank "gecached". Und genau das tut die Funktion "Kategorie-Attribute neu indizieren" - sie aktualisiert diesen Cache in der Datenbank, damit i-doit schnell auf alle Attribut-Daten zugreifen kann ohne im Code nachzusehen.
Die Funktion wird übrigens auch immer nach dem i-doit Update ausgeführt oder nachdem man ein Add-on installiert hat.
Viele Grüße
Leo -