Dynamische Felder konvertieren?

Allgemein Fragen, deutsche News, Ankündigungen & Events zum OTRS
Post Reply
ncmbu
Znuny advanced
Posts: 111
Joined: 23 Jun 2016, 17:11
Znuny Version: 5.0.23

Dynamische Felder konvertieren?

Post by ncmbu »

Hi,

nach dem Update von einem OTRS 2.4.9 auf die aktuelle 5er Version würde ich gerne die Datenbank ein wenig aufräumen.
Insbesondere wurden zahlreiche FreeKey/FreeText-Felder übernommen, die ich nun gerne in neu angelegte DynamicFields übertragen würde.
Gibt es dafür evtl. ein fertiges Skript oder so?
wurzel
Znuny guru
Posts: 3232
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Dynamische Felder konvertieren?

Post by wurzel »

Hi

die sollten durch die Migration bereits umgewandelt sein.

Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
ncmbu
Znuny advanced
Posts: 111
Joined: 23 Jun 2016, 17:11
Znuny Version: 5.0.23

Re: Dynamische Felder konvertieren?

Post by ncmbu »

Dann habe ich offenbar was falsch gemacht. Ich habe jedenfalls hier nur einen Haufen Dynamischer Felder mit Namen "TicketFreeKey<NR>" und "TicketFreeText<NR>". Eine korrekt Umwandlung in dynamische Felder Key => Value hat nicht stattgefunden.
wurzel
Znuny guru
Posts: 3232
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Dynamische Felder konvertieren?

Post by wurzel »

Hi,

der Name des Dynamischen Feldes ändert sich durch die Migration nicht.

Heissen tun die so wie vorher (FreeKey1 oder was)

Alle die, die nicht benutzt wurden sollten zumindest auf invalid gesetzt worden sein.


Wenn Du während der Migrationen keine Fehler hattest, sollte es schon passen.


Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
ncmbu
Znuny advanced
Posts: 111
Joined: 23 Jun 2016, 17:11
Znuny Version: 5.0.23

Re: Dynamische Felder konvertieren?

Post by ncmbu »

Das entspricht aber eigentlich nicht dem, was ich möchte.
Ich hätte gerne, dass alle Felder, deren Key im alten System XY lautete nach der Migration in einem Dynamischen Feld mit dem Namen "XY" stecken.
Daher halt die Frage nach einer Konvertierung.
wurzel
Znuny guru
Posts: 3232
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Dynamische Felder konvertieren?

Post by wurzel »

Hi,

Musst du manuell ändern.

Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
Ebebalf
Znuny newbie
Posts: 43
Joined: 07 May 2015, 13:26
Znuny Version: 4 Free

Re: Dynamische Felder konvertieren?

Post by Ebebalf »

ncmbu wrote:Das entspricht aber eigentlich nicht dem, was ich möchte.
Ich hätte gerne, dass alle Felder, deren Key im alten System XY lautete nach der Migration in einem Dynamischen Feld mit dem Namen "XY" stecken.
Daher halt die Frage nach einer Konvertierung.
Wenn du in OTRS das neue dynamische Feld anlegst, dann kannst du in der Datenbank in der Tabelle 'dynamic_field' die id deines neu angelegten Feldes auslesen.
Anschließend musst du nur noch in der Tabelle 'dynamic_field_value' die Spalte „field_id“ durch die ID deines angelegten Feldes ersetzen.
ncmbu
Znuny advanced
Posts: 111
Joined: 23 Jun 2016, 17:11
Znuny Version: 5.0.23

Re: Dynamische Felder konvertieren?

Post by ncmbu »

wurzel wrote: Musst du manuell ändern.
Bei 80000+ Einträgen in der dynamic_field_value-Tabelle will ich die nicht wirklich manuell durchgehen, selbst wenn ich davon ausgehe, dass ich die Hälfte ignorieren kann (weils die Keys sind) ist das immer noch zu viel um es per Hand anzupassen.

Ebebalf wrote:Anschließend musst du nur noch in der Tabelle 'dynamic_field_value' die Spalte „field_id“ durch die ID deines angelegten Feldes ersetzen.
Zuerst muss ich ja irgendwie die Zeilen selektieren, die entsprechend angepasst werden müssen. Das funktioniert dann recht gut, wenn die Werte vorhersehbar sind (z.B. auf ein RegExp passen), aber bei scheinbar willkürlichen Werten muss ich zwingend den Key berücksichtigen.

Außerdem funktioniert es so simpel auch nur, wenn ich Felder anpasse, die vom Typ "Ticket" sind. Wenn ich Felder, die sich eigentlich auf Artikel beziehen anpassen will muss ich zudem noch die object_id vom Ticket auf den Artikel ändern.

Ich hatte gehofft, dass jemand möglicherweise schon mal eine ähnliche Anforderung hatte und es ein Skript gäbe, dass diese Prozesse automatisiert.
wurzel
Znuny guru
Posts: 3232
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Dynamische Felder konvertieren?

Post by wurzel »

Hi,

also dann versteh' ich Dich nicht. :?

Du kannst doch einfach nur den Namen des dynamischen Feldes ändern. Reicht Dir das nicht? So ganz hab' ich nicht nachvollziehen können, wo genau Dein Problem liegt und was Dein Ziel ist ;)

Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
ncmbu
Znuny advanced
Posts: 111
Joined: 23 Jun 2016, 17:11
Znuny Version: 5.0.23

Re: Dynamische Felder konvertieren?

Post by ncmbu »

Dann versuche ich das mal anhand eines Beispiels zu erklären:
Im alten OTRS hatten wir verschiedene Freitext-Felder, zum Beispiel: "Ort", "Telefon" etc.
Beispiel-Screenshot:
beispiel.png
Da aber sowohl die Keys, als auch die Werte frei eingetragen werden konnten ist die Reihenfolge hier nicht fest.

Nach der Migration auf OTRS 5 habe ich jetzt die dynamischen Felder TicketFreeKey1 bis TicketFreeKey3 und TicketFreeText1 bis TicketFreeText3.
Screenshot:
after.png
Jetzt ist aber zum Beispiel bei einem Ticket der String "Ort" in TicketFreeKey1 gespeichert, bei einem anderen aber in TicketFreeKey3. Der dazugehörige Wert ist entsprechend mal im Feld TicketFreeText1 und mal in TicketFreeText3. Ich kann also keines dieser Felder einfach umbenennen, weil in jedem der Felder alle möglichen Werte drin sein können.
You do not have the required permissions to view the files attached to this post.
wurzel
Znuny guru
Posts: 3232
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Dynamische Felder konvertieren?

Post by wurzel »

Hi,

das sieht danach aus, als wären die Dynamischen Felder (bzw. FreeTextFelder der Version2) von Anfang an falsch angelegt waren.

Normalerweise ist nämlich die Konvertierung/Migration problemlos.


Da kann ich Dir dann leider auch nicht weiterhelfen. Dieses Issue ist mir nicht bekannt. Sorry



viele Grüße
Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
ncmbu
Znuny advanced
Posts: 111
Joined: 23 Jun 2016, 17:11
Znuny Version: 5.0.23

Re: Dynamische Felder konvertieren?

Post by ncmbu »

Hallo,

ich habe die Dynamischen Felder in der Datenbank jetzt manuell angepasst. Dafür habe ich mir ein paar komplexere SQL-Queries gebaut. Da ich diese vermutlich nie wieder benötigen werde, aber vielleicht irgendwann man jemand anders vor dem gleichen Problem stehen könnte, wollte ich diese hier dokumentieren:

Also die Grundvoraussetzung ist, wie in meinem Fall beschrieben: Nach Updates bestehen eine Reihe von FreeKey<X> und FreeText<X> Feldern, bei denen jeweils im FreeKey<X> ein eindeutiger Bezeichner steht, dessen Wert im zugehörigen FreeText<X> zu finden ist, wobei die Zahl X unterschiedliche sein kann und in keinem Zusammenhang zum Inhalt des Keys steht. Das ganze soll jeweils in ein neues dynamisches Feld überführt werden, dessen Name dem Key entspricht (bzw. der Name kann auch völlig anders sein, entscheidend ist, dass die Werte eines Keys in ein neues dynamisches Feld übertragen werden sollen).

Vorarbeit:
Da ich nicht aus der gleichen Tabelle lesen und schreiben will verschiebe ich erstmals die existierende Tabelle:

Code: Select all

ALTER TABLE dynamic_field_value RENAME dynamic_field_val_bak;
Anschließend muss die eigentliche Tabelle neu erstellt werden:

Code: Select all

SHOW CREATE TABLE dynamic_field_val_bak;
CREATE TABLE `dynamic_field_value` …
Die Ausgabe des ersten Befehls kann kopiert und der Name angepasst werden. Unter Umständen kann die neue Tabelle nicht angelegt werden, weil ein ForeignKeey-Constraint den gleichen Namen hat wie in der existierenden. Dann muss man diesen von der alten Tabelle entfernen; z.B:

Code: Select all

ALTER TABLE dynamic_field_val_bak  DROP FOREIGN KEY  `FK_dynamic_field_value_field_id_id`;
Somit sind unsere Vorarbeiten abgeschlossen. Wir haben jetzt eine neue, leere dynamic_field_values-Tabelle und unsere Ausgangsdaten befinden sich in der Tabelle dynamic_field_val_bak. (Achtung: Sollten weitere reguläre dynamische Felder bestehen, müssen die entsprechenden Einträge nun ebenfalls in die neue Tabelle übertragen werden)


Konvertierung:
Nachdem die Vorarbeiten abgeschlossen wurden, geht es an die Konvertierung. Die neuen dynamischen Felder sollten bereits angelegt sein (Typ Ticket oder Typ Article). Mit folgendem Query kann man sich die zugehörigen IDs anzeigen lassen:

Code: Select all

SELECT id,name FROM dynamic_field;
Die IDs benötigen wir nun in den nächsten Schritten. Für jedes zu konvertierende Feld sind die folgenden Schritte separat auszuführen:

Code: Select all

SET @key = "Schluesselwert" COLLATE utf8_general_ci;
SET @kid = "47" COLLATE utf8_general_ci;
Hier werden zwei Variablen gesetzt.
@key enthält den String, nach dem im folgenden in den FreeKey<X>-Werten gesucht wird.
@kid enthält die ID zu dem dynamischen Feld, welches die Werte aus den FreeText<X>-Feldern zugewiesen bekommt (aus der Liste übernommen).
Die COLLATE-Angaben musste ich in meinem Fall machen, da ich sonst beim nächsten Schritt eine Fehlermeldung erhalten hätte; evtl. geht es bei anderen auch ohne.

Nun gilt es zu unterscheiden: Handelt es sich bei dem neuen dynamischen Feld um ein Feld vom Typ Ticket, oder um ein Feld vom Typ Article? Beim Typ Article bestünde im Grunde die zusätzliche Frage welchem Artikel innerhalb eines Tickets das Feld zugeordnet werden muss. In meinem Fall war es jedoch so, dass die Felder immer zum ersten Artikel eines Tickets gehört haben.
Hier jedenfalls die auszuführenden SQL-Statements:
Fall Ticket:

Code: Select all

INSERT INTO dynamic_field_value (field_id,object_id,value_text) SELECT @kid AS field_id,B.object_id,TRIM(B.value_text) AS value_text FROM dynamic_field_val_bak AS A, dynamic_field_val_bak AS B WHERE (A.object_id=B.object_id AND (A.field_id IN (1,3,5,7)) AND (A.field_id=B.field_id-1) AND A.value_text=@key);
Fall Article:

Code: Select all

INSERT INTO dynamic_field_value (field_id,object_id,value_text) SELECT @kid AS field_id,C.id AS object_id,TRIM(B.value_text) AS value_text FROM dynamic_field_val_bak AS A, dynamic_field_val_bak AS B LEFT JOIN (SELECT MIN(id) AS id, ticket_id FROM article GROUP BY ticket_id) AS C ON (B.object_id = C.ticket_id ) WHERE (A.object_id=B.object_id AND (A.field_id IN (1,3,5,7)) AND (A.field_id = B.field_id-1) AND A.value_text=@key);
Anschließend die Variablen @key und @kid anpassen und für's nächste Feld fortfahren.

Hinweise:
Bei dem SQL-Query habe ich mir zu Nutze gemacht, dass die ID der FreeKey<X> Felder immer genau eins kleiner war, als das zugehörige FreeText<X>-Feld. Ich glaube dies ist Standard, aber sollte jemand dies nachmachen wollen, prüft dies für eure Tabelle nochmals!
Die IDs der FreeKey<X>-Felder, die überprüft werden sind in dem IN-Statement (1,3,5,7); für meinen Fall hat es gereicht vier Felder zu prüfen. Auch hier: Das muss nicht immer so sein.

Das war's.
Post Reply