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::multiselectdie neuen "Property" Klassen zu nutzen - das ist für gewöhnlich einfacher und könnte helfen
Schau 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 -
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login