Umfassendes Problem mit XMLPort

27. September 2007 16:16

Offtopic:

Ich glaube das wird ein sehr langer Beitrag. :)
Einmal: Ich musste mich leider neu anmelden. Hatte bei meinem alten Account die E-Mail Adresse geändert und diese ist aber zur Zeit noch falsch eingestellt so dass ich keine E-Mails von außen bekommen kann. Somit auch nicht die Reaktivierungsmail von diesem Forum. Und als Gast konnte ich im Problemforum leider auch nichts schreiben da ich anscheinend zu blöd für den Anti-Robot Code bin *seufz*
[Edit by Timo: Problem wird gerade behoben.]
/Offtopic

So jetzt zu meinem bzw. unserem Problem. Wie einige wenige von euch ja schon mitbekommen haben, habe ich ein größeres Projekt mit einem XML-Port.
Im Grunde geht es darum mit Hilfe des XMLPorts Daten aus einigen Tabellen auszulesen, diese in eine XML-Datei zu schreiben um diese wiederum auf unseren CommerceServer auzuspielen.

Damit der CommerceServer die Daten ordentlich einspielt sollte die XML-Datei so aussehen wenn sie fertig ist (unwichtige Attribute, also die keine Probleme machen, lasse ich mal weg):

Code:
<MSCommerceCatalogCollection2>
 <Catalog>
  <Category name="1">
    <DisplayName Value="1"/>
  </Category>
  <Category name="2">
    <DisplayName Value="2"/>
  </Category>
  <Category name="4">
    <DisplayName Value="4"/>
  </Category>
  <Category name="4">
    <DisplayName Value="4"/>
  </Category>
  <Category name="77_1">
   <DisplayName Value="Wundversorgung"/>
   <ParentCategory>1</ParentCategory>
  </Category>
  <Category name="77_2">
   <DisplayName Value="Wundversorgung"/>
   <ParentCategory>2</ParentCategory>
  </Category>
  <Category name="77_4">
   <DisplayName Value="Wundversorgung"/>
   <ParentCategory>4</ParentCategory>
  </Category>
  <Category name="21_4">
   <DisplayName Value="Fell/Haut"/>
   <ParentCategory>4</ParentCategory>
  </Category>
  <Category name="15_77_1">
   <DisplayName Value="Alfavet"/>
   <ParentCategory>77_1</ParentCategory>
  </Category>
  <Category name="15_77_2">
   <DisplayName Value="Alfavet"/>
   <ParentCategory>77_2</ParentCategory>
  </Category>
  <Category name="15_77_4">
   <DisplayName Value="Alfavet"/>
   <ParentCategory>77_4</ParentCategory>
  </Category>
  <Category name="15_21_4">
   <DisplayName Value="Alfavet"/>
   <ParentCategory>21_1</ParentCategory>
  </Category>
  <Product ProductID="120000031">
   <DisplayName/>
   <Description/>
   <ParentCategory>1</ParentCategory>
   <ParentCategory>2</ParentCategory>
   <ParentCategory>4</ParentCategory>
   <ParentCategory>4</ParentCategory>
   <ParentCategory>77_1</ParentCategory>
   <ParentCategory>77_2</ParentCategory>
   <ParentCategory>77_4</ParentCategory>
   <ParentCategory>21_4</ParentCategory>
   <ParentCategory>15_77_1</ParentCategory>
   <ParentCategory>15_77_2</ParentCategory>
   <ParentCategory>15_77_4</ParentCategory>
   <ParentCategory>15_21_4</ParentCategory>
  </Product>
 </Catalog>
</MSCommerceCatalogCollection2>


Kleine Erläuterung:

ProductID ist die Artikelnummer (ID 120000031). Dieser Artikel ist einmal in der Gruppe Wundversorgung (ID 77) mit der Untergruppe Alfavet (ID 15) und einmal in der Gruppe Fell/Haut (ID 21) mit der Untergruppe Alfavet (ID 15).
In der ersten Konstellation ist er im Katalog Hund (ID 1), Katze (ID 2) und Pferd (ID 4). In der zweiten Konstellation ist der Artikel nur im Katalog Pferd (ID 4).

Der Artikel soll halt nur einmal aufgelistet werden und alle Kategorien in denen er ist sollen um ihm herum nacheinander aufgelistet werden. Aber das schaffen wir nicht.
Die Tabellen sehen wie folgt aus:

Tabelle Item
- Feld ArtNr (Schlüssel) -> Code
(Weitere Felder)

Tabelle Gruppe
- Feld GruppeID (Schlüssel) -> Integer
- Feld Gruppe -> Text

Tabelle UnterGruppe
- Feld UnterGruppenID (Schlüssel) -> Integer
- Feld UGruppe -> Text

Tabelle Cataloge
- Feld CatalogNr (Schlüssel) -> Integer
- Feld Catalog -> Text

Tabelle Gruppe_UGruppe (JoinTabelle)
- Feld GruppenID (Schlüssel) -> Integer
- Feld GruppeID (TableRelation zur Tabelle Gruppe) -> Integer
- Feld UnterGruppenID (TableRelation zur Tabelle UnterGruppe) -> Integer

Tabelle Cataloge_Gruppen (JoinTabelle)
- Feld CatalogGruppenNr (Schlüssel) -> Integer
- Feld CatalogNr (TableRelation zur Tabelle Cataloge) -> Integer
- Feld GruppenID (TableRelation zur Tabelle Gruppe_UGruppe) -> Integer

Tabelle Artikel_Gruppen (JoinTabelle)
- Feld Nr (Schlüssel) -> Integer
- Feld CatalogGruppenNr (TableRelation zur Tabelle Cataloge_Gruppen) -> Integer
- Feld ArtNr (TableRelation zur Tabelle Item) -> Code

Der XMLPort ist ähnlich aufgebaut wie die XML-Datei oben. Über dem Product sind halt 3x Category und unter dem Product 3x ParentCategory.

Zwischenzeitlich hatten wir es so gelöst das unsere Haupttabelle die Artikel_Gruppen war. Er wiederholt dann auch die Kategorien.. jedoch so oft wie Daten in der Tabelle sind. Wir wollen aber das er nur so oft wiederholt wie Daten für den Artikel in der Tabelle sind.
Setzen wir die Haupttabelle auf Item geht er alle Artikel durch.. und das sind ziemlich viele. Und das soll er ja auch nicht.

Mit Einrückung der Elemente funktioniert es leider auch nicht. SourceTableView funktioniert in dem Fall auch nicht. Und auch die LinkTable mit dem LinkField hat uns nicht weiter gebracht.

Der Code für die erste Kategorie (welche die Kataloge aufzählen soll in denen der Artikel vorhanden ist) sieht derzeit so aus:

Code:

Artikel_Gruppen.SETRANGE(Artikel_Gruppen.ArtNr,"<Item>"."No.");
  IF Artikel_Gruppen.FIND('-') THEN BEGIN
   Cataloge_Gruppen.SETRANGE(Cataloge_Gruppen.CatalogGruppenNr,Artikel_Gruppen.CatalogGruppenNr);
      IF Cataloge_Gruppen.FIND('-') THEN
      "<cat1name>" := FORMAT(Cataloge_Gruppen.CatalogNr);
END;



Alle Tabellen die wir brauchten haben wir als Globale Variabeln als Records definiert.
(Im oberen Beispiel also Artikel_Gruppen und Cataloge_Gruppen)

Ich hoffe ich habe jetzt nichts vergessen und ich habe auch alles einigermaßen verständlich erklärt. Über Hilfe würden wir uns total freuen. Verzweifeln mitlerweile zu dritt an dem Projekt.

18. Oktober 2007 09:03

Ich weiß das Problem ist sehr umfassend. Aber hat irgendjemand ne Idee? :oops:

14. Dezember 2007 12:09

Das Problem ist endlich gelöst. Zwar etwas umständlich aber es funktioniert. Und damit ihr nicht dumm sterben müsst :wink: wollte ich euch an der Lösung teilhaben lassen.

Wir haben den XMLPort ersteinmal gesplittet. Einmal einen der die Kategorien anlegt und einen dann für die Artikel.
Wir haben Reports gebastelt die aus allen Tabellen die Infos raus holen die wir für die XML Datei brauchen, und diese Reports schreiben diese Daten in dafür extra angelegte Tabellen.
Auf diese Tabellen greift der XMLPort dann zu.
Wir hatten dann aber immernoch Probleme dem Artikel seine Kategorien zuzuweisen. Also haben wir es so gehandelt das er schaut, welchen Artikel er gerade hat und sich dazu dann passend die Kategorien raus sucht (mit dem Report) und diese dann erst in die Tabelle schreibt. Bei jedem Artikel wird diese Tabelle vorher wieder gelöscht. So dass für jeden Artikel wirklich nur seine Kategorien drinn sind.

War zwar vorher etwas mehr arbeit die ganzen Objekte anzulegen, aber dafür funktioniert es jetzt so wie wir es haben möchten.
Mit Hilfe einer CodeUnit die alle Reports und XMLPorts nacheinander aufruft soll es dann auch in Zukunft per Objektaufrufplaner automatisch gehandelt werden.