Forum: PC-Programmierung [part-db] Wie importiert man geschachtelte Kategorien?


von Uhu U. (uhu)


Lesenswert?

Ich habe einen Kategorienbaum mit einer Höhe > 1.

Nun will ich per Import-Funktion Daten in die Kategorie
Passiv | Widerstand | smd | 0805 importieren.

Wie muss ich die Kategorie in der csv-Datei schreiben?

von Gelöscht (kami89)


Lesenswert?

Hallo Uhu,

Leider können in der CSV Datei keine verschachtelten Kategorien 
angegeben werden. Der Import funktioniert sehr primitiv, er sucht 
einfach nach Kategorien die den gleichen Namen wie die im CSV definierte 
Kategorie haben. Gibt es keine Kategorie mit diesem Namen, wird eine 
neue angelegt (mit "Import" als Elternkategorie). Gibt es eine oder 
mehrere Kategiren mit diesem Namen, wird einfach die erste davon 
genommen, deren Elternkategorien werden komplett ignoriert.

Sofern du also nur eine Kategorie mit dem Namen "0805" hast, kannst du 
einfach "0805" im CSV angeben. Wenn aber mehrere Kategorien mit dem 
Namen "0805" vorhanden sind, müsstest du als Workaround (zumindest für 
dem Import) die Kategorien umbenennen, so dass der Name eindeutig ist 
(z.B. "R-0805" und "C-0805").

mfg
Urban

von Uhu U. (uhu)


Lesenswert?

Das ist sehr schade. Man spart zwar einiges an Schreibarbeit durch den 
Import, muss aber dann jeden Artikel nochmal anfassen um ihn in die 
richtige Kategorie zu bekommen.

Wäre es denkbar, die Daten direkt in die DB zu bekommen?

von Gelöscht (kami89)


Lesenswert?

Naja, jeden Artikel nochmal anfassen musst du eben nicht, der Import 
funktioniert ja einwandfrei wenn die Kategorien eindeutige Namen haben. 
Du musst also höchstens vor dem Import ein paar wenige Kategorien leicht 
umbenennen, danach geht alles vollautomatisch. Ich denke damit kann man 
ganz gut leben, da es ja nur selten Kategorien mit gleichem Namen gibt.

Falls deine gewünschten Kategorien noch nicht existieren und du dir 
erhoffst dass beim Import auch alle Kategorien inklusive Hierarchie 
angelegt werden: Das ist auch nicht soo tragisch, dann wird halt beim 
Import eine Kategorie mit dem Namen "Passiv | Widerstand | smd | 0805" 
(ohne Hierarchie) in der Unterkategorie "Import" angelegt und alle 
entsprechenden Bauteile dieser Kategorie zugeordnet. Dann musst du halt 
nach dem Import noch die Kategorien "Passiv" -> "Widerstand" -> "smd" 
erstellen (inkl. Hierarchie) und die vom Importer angelegte Kategorie in 
"0805" umbenennen und als Elternkategorie "smd" zuweisen. Alle Bauteile 
von "0805" bleiben weiterhin dort drin, du brauchst die Bauteile nicht 
auch noch anzupassen.

Die Daten direkt in die DB importieren geht theoretisch auch, allerdings 
hast du dann keinerlei Überprüfung ob die Daten auch für Part-DB gültig 
sind, das könnte zu weiteren Problemen führen. Und ob das einfacher ist 
als die oben genannte Variante bezweifle ich (musst selbst ein Import 
Script schreiben)...

: Bearbeitet durch User
von Uhu U. (uhu)


Lesenswert?

OK, das mit dem flache Kategorie in geschachtelte umbenennen, ist eine 
Lösung. Danke für den Tipp.

von Uhu U. (uhu)


Lesenswert?

Jetzt habe ich einen Schwung Teile erfasst und er liest sie auch ein. 
Die Liste mit den Daten sieht gut aus - nur übernimmt er nicht einen 
einzigen Artikel.

Footprints und Kategorien existieren.

Die Spalten Beschreibung, Kommentar, Hersteller, Lieferant und 
Bestellnummer sind leer. Der Preis ist überall 0. Liegt das evtl. daran?

: Bearbeitet durch User
von Gelöscht (kami89)


Lesenswert?

Das ist merkwürdig... Die leeren Spalten sollten jedenfalls eigentlich 
kein Problem darstellen.

Kommt keinerlei Fehlermeldung?
Welche Part-DB Version verwendest du (Release oder git)?

von Uhu U. (uhu)


Lesenswert?

Ich habe Version: 0.3.1 (stable) in einer VM von VirtualBox unter Linux 
Mint 17 laufen.

Es kommt überhaupt keine Meldung beim Übernehmen der Daten, lediglich 
die Liste mit den den Spalten zugeordneten Daten verschwindet. Die 
.csv-Datei wird noch angezeigt.

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

Also ich habs mal mit dem Beispiel-CSV ausprobiert, das funktioniert 
einwandfrei: 
https://raw.githubusercontent.com/sandboxgangster/Part-DB/master/development/testfiles/import_parts/csv_correct.csv

Du hast schon gesehen dass man nach dem Übernehmen der Daten noch auf 
einen weiteren Button "Daten importieren!" (siehe Bild) klicken muss, 
oder? :) Oder erscheint dieser Button bei dir gar nicht erst?

Evtl. liegts ja aber auch an deinem CSV. Wenn du willst kannst du mir 
die Datei schicken, dann schaue ich mir das mal an.

Ansonsten bräuchte ich eine genauere Fehlerbeschreibung (welche Buttons 
klickst du in welcher Reihenfolge und wann kommt welcher Output)...

: Bearbeitet durch User
von Uhu U. (uhu)


Angehängte Dateien:

Lesenswert?

Der Daten Importieren - Button fehlt hier.

Ich hab dir eine PN mit dem Dropbox-Link geschickt.

von Gelöscht (kami89)


Lesenswert?

Ok ich konnte das Problem reproduzieren und beheben. Und zwar wird beim 
Import schnell mal das PHP Limit "max_input_vars" überschritten, wodurch 
Part-DB ein unvollständiges array zurückgeliefert bekommt und nicht mehr 
richtig funktioniert.

Die Lösung ist also in der PHP Konfiguration (z.B. 
/etc/php5/apache2/php.ini) den Wert von "max_input_vars" zu erhöhen, 
z.B. auf 10'000 (Standard ist 1'000).

Ich mach auf unserer Github Projektseite grad noch ein Issue auf zu 
diesem Thema...

von Gelöscht (kami89)


Lesenswert?

Ach ja, anstatt die globale PHP Konfiguration zu ändern, kann man 
natürlich auch die .htaccess anpassen...

Hier übrigens noch das neue Issue: 
https://github.com/sandboxgangster/Part-DB/issues/47

von Uhu U. (uhu)


Lesenswert?

Ich frage mich, wozu eigentlich alle Felder in Edits angezeigt werden 
müssen. .csv-Daten kann man mit jeder Tabellenkalkulation inspizieren 
und für das xml-Format müsste es doch auch die Möglichkeit geben, die 
Daten außerhalb part-db zu inspizieren und zu konnigieren.

Dann könnte man die Editiererei aus part-db einfach rausschmeißen und 
das Problem ist aus der Welt.

von Gelöscht (kami89)


Lesenswert?

Das ist natürlich auch eine Möglichkeit. Allerdings ist es halt schon 
angenehm wenn man direkt in Part-DB gewisse Angaben korrigieren kann. 
Insbesondere für XML kenne ich kein eigenständiges Tool um das gescheit 
machen zu können.

Immerhin gibt es ja einen Workaround um trotzdem grössere Dateien 
importieren zu können. Wie das Problem behoben werden soll, kann jetzt 
auf Github diskutiert werden (bitte nicht hier).

von Uhu U. (uhu)


Lesenswert?

Urban B. schrieb:
> Immerhin gibt es ja einen Workaround um trotzdem grössere Dateien
> importieren zu können. Wie das Problem behoben werden soll, kann jetzt
> auf Github diskutiert werden (bitte nicht hier).

Das ist halt eine ewige Fehlerquelle, zumal man überhaupt keine Hinweise 
auf die Ursache bekommt.

Woher kommen denn diese xml-Dateien?

von Uhu U. (uhu)


Lesenswert?

Nochmal zurück zum Ausgangsproblem: geschachtelte Kategorien.

Bei mir gibt es bereits eine nichtleere Kategorie _0805. Nun habe ich 
weitere Teile in eine neue Kategorie R0805 importiert.

Wenn ich diese Kategorie nach _0805 umbenennen will, dann mault er - 
zurecht -, die _0805 gäbe es bereits.

Der Trick mit dem Kategorie umbenennen geht also leider nur, wenn die 
Zielkategorie noch nicht existiert...

von Gelöscht (kami89)


Lesenswert?

Uhu U. schrieb:
> Der Trick mit dem Kategorie umbenennen geht also leider nur, wenn die
> Zielkategorie noch nicht existiert...

Das ist richtig. Wenn die Zielkategorie schon existiert, müssen die 
Teile einfach direkt in diese Kategorie importiert werden, also in 
deinem Fall "_0805".

: Bearbeitet durch User
von Nase (Gast)


Lesenswert?

Urban B. schrieb:
> Ach ja, anstatt die globale PHP Konfiguration zu ändern, kann man
> natürlich auch die .htaccess anpassen...
>
> Hier übrigens noch das neue Issue:
> https://github.com/sandboxgangster/Part-DB/issues/47

Das Problem mit den "max_input_vars" könnte man eventuell beheben, wenn 
man das Formular in der Tabelle sinnvoller aufbaut.
So wie ich das interpretiere, erzeugt das eine Unmenge an Input-Feldern 
mit fortlaufend numerierten Namen:

<pre>
<input type="text" style="width:45px" name="instock_{TMPL_VAR 
NAME="row_index"}" value="{TMPL_VAR NAME="instock"}" 
onkeypress="validatePosIntNumber(event)"></td>
</pre>

Das erzeugt halt Input-Felder mit Namen wie "instock_0", "instock_1", 
"instock_2" und so weiter. Man sollte da besser ein Array draus machen, 
das zählt dann nämlich als eine einzige Variable. Die Input-Felder 
müssten dann entweder alle "instock[]" heißen oder numeriert sein, etwa 
"instock[0]", "instock[1]" und so weiter.

von Udo N. (weinbauer73)


Lesenswert?

Dein Ansatz hat leider eine andere Falle, nämlich der Datenmenge selbst. 
Besser ist es, den Import vorher in eine temporäre Tabelle zu machen und 
von dort aus die Bauteile in den Bestand zu übernehmen. Hier wird nur 
noch der Index benötigt, was vieles vereinfacht.

Ich werde mich da mal dran machen, kann aber etwas dauern.

von Nase (Gast)


Lesenswert?

Udo N. schrieb:
> Dein Ansatz hat leider eine andere Falle, nämlich der Datenmenge selbst.
Diese Falle ist aber arbiträr.
Bei phpMyAdmin und wie sie alle heißen, hast du das ja auch.

max_input_vars hat seine Ursache angeblich in den PHP-internen 
Hashtabellen, glaubt man der Doku[1]. Die Datenmenge an sich ist eine 
Frage, was man denn können will. Die Grenze kann man problem- und 
weitgehend risikolos anheben.
Bei max_input_vars hingegen hat man eher ein Designproblem...


[1]: http://php.net/manual/de/info.configuration.php#ini.max-input-vars

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.