| Autor |
Beitrag |
FrankS
      
Beiträge: 18
Win XP Pro
D2006 Pro
|
Verfasst: Di 14.11.06 16:37
Hallo Zusammen,
ich stehe vor einem kleinen Problem, wir bekommen von einem Kunden eine xml Datei mit Verkaufszahlen. Diese will ich in eine Datenbank einlesen, damit wir die Datenauch gescheit auswerten können. Leider fehlt mir ein wenig die richtige Richtung dafür. Ich habe bis jetzt die xml Datei in ein DataGrid eingelesen und das hat auch soweit ganz gut funktioniert. Leider bekomme ich es aber nicht hin, bzw. mir fehlt ein wenig die Idee, wie ich diese verflixte xml Daten in eine Datenbank bekomme.
Hat da jemand mal einen kleinen Anstoß für mich ? Bin auf dem Gebiet xml relativ unerfahren. Ich weiß zwar wie der Aufbau ist un wie die einzelnen Bereiche anzusprechen sind aber ich bekomme es irgendwie nicht kombiniert mit einer Datenbank.
Ich bin über jede Hilfe sehr dankbar.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| constructor TWinForm1.Create; var dt,dd : DataTable;
begin inherited Create; InitializeComponent; ds := DataSet.Create; dt := DataTable.Create('InventoryReport'); dd := DataTable.Create('ReportLine'); ds.Tables.Add(dt); ds.Tables.Add(dd); with dt.Columns.Add('DocumentReference', System.Type.GetType('System.String')) do with dt.Columns.Add('DocumentDate', System.Type.GetType('System.String')) do with dt.Columns.Add('PeriodStartDate', System.Type.GetType('System.String')) do with dt.Columns.Add('PeriodEndDate', System.Type.GetType('System.String')) do with dt.Columns.Add('ReportType', System.Type.GetType('System.String')) do with dt.Columns.Add('VendorId', System.Type.GetType('System.String')) do with dt.Columns.Add('VendorName', System.Type.GetType('System.String')) do with dt.Columns.Add('CountryCode', System.Type.GetType('System.String')) do with dt.Columns.Add('BranchCode', System.Type.GetType('System.String')) do
with dd.Columns.Add('LineNumber', System.Type.GetType('System.String')) do with dd.Columns.Add('VendorCode', System.Type.GetType('System.String')) do with dd.Columns.Add('VikingCode', System.Type.GetType('System.String')) do with dd.Columns.Add('SelloutQuantity', System.Type.GetType('System.String')) do with dd.Columns.Add('OnHandQuantity', System.Type.GetType('System.String')) do with dd.Columns.Add('SafetyStockQuantity', System.Type.GetType('System.String')) do with dd.Columns.Add('TotalReceivedQuantity', System.Type.GetType('System.String')) do with dd.Columns.Add('TotalOpenOrdersQuantity', System.Type.GetType('System.String')) do with dd.Columns.Add('CustomerBackOrdersQuantity', System.Type.GetType('System.String')) do with dd.Columns.Add('MiscellaneousQuantity', System.Type.GetType('System.String')) do with dd.Columns.Add('WatchProductFlag', System.Type.GetType('System.String')) do
dataGrid1.DataSource := ds; end;
procedure TWinForm1.MenuItem1_Click(sender: System.Object; e: System.EventArgs); begin Self.Close; end;
procedure TWinForm1.Button1_Click(sender: System.Object; e: System.EventArgs); begin ds.ReadXml('test.xml'); end; |
Moderiert von raziel: Delphi-Tags hinzugefügt
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 15.11.06 00:53
@franks: sorry dein code dünkt mir 'n wenig daneben...
... hast vielleicht 'n stück xtml welches das licht ein wenig erleuchten könnt...
dank und gruss
|
|
stifflersmom
      
Beiträge: 194
XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
|
Verfasst: Mi 15.11.06 02:55
also, wenn Du schon in der Lage bist die XML-Datei auszulesen, und die werte in ein "DataGriD"? (was ist das) zu schreiben, dann sollte es doch kein Problem sein für Dich die XML-Datei zu öffnen, die Nodes einzulesen und dann in die dementsprechenden felder einer Tabelle einzufügen.
So lange sich die Struktur deiner XML-Datei nicht ändert ist die Sache doch simpel:
erstelle eine Tabelle in einer Datenbank Deiner Wahl und dann ab dafür.
Moin
|
|
Quake User
      
Beiträge: 159
|
Verfasst: Fr 17.11.06 10:34
FrankS hat folgendes geschrieben: | Hallo Zusammen,
ich stehe vor einem kleinen Problem
...
Hat da jemand mal einen kleinen Anstoß für mich ? |
...
Die DB sollte eigene Tools besitzen um die XML Daten einzulesen. Eben das währe ja der Vorteil einer solchen Datenübertragung.
Bspw.:
"Oracle XML DB ist ein neues Feature von Oracle Database 9i und 10g und bietet leistungsstarke XML-Speichertechnologie in Verbindung mit der Verwendung von Oracle 9i und 10g."
Wenn Du die Daten selbst zerlegen und transformieren willst, kannst Du Dir auch jedes andere Format liefern lassen.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 18.11.06 15:42
@franks: post doch mal dein test.xml dann können wir uns eher vorstellen wie man das ganze einlesen und weiterverarbeiten kann
|
|
FrankS 
      
Beiträge: 18
Win XP Pro
D2006 Pro
|
Verfasst: Di 21.11.06 15:32
sorry das ich mich jetzt erst wieder melde aber ich bin zur Zeit ziemlich im Stress.
Hier ein Ausschnitt aus der xml Datei die es gilt einzulesen :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| <?xml version="1.0" encoding="ISO-8859-1" ?> - <wrappedxml> <numberofdocuments>1</numberofdocuments> - <InventoryReport> <DocumentReference>2</DocumentReference> <DocumentDate>2006-11-06</DocumentDate> <PeriodStartDate>2006-11-03</PeriodStartDate> <PeriodEndDate>2006-11-03</PeriodEndDate> <ReportType>SELLOUT</ReportType> <VendorId>495</VendorId> <VendorName>MUSTERFIRMA</VendorName> <CountryCode>GB</CountryCode> <BranchCode>5807</BranchCode> - <ReportLine> <LineNumber>1</LineNumber> <VendorCode>23962</VendorCode> <VikingCode>CHMX05</VikingCode> <SelloutQuantity>0</SelloutQuantity> <OnHandQuantity>0</OnHandQuantity> <SafetyStockQuantity>0</SafetyStockQuantity> <TotalReceivedQuantity>0</TotalReceivedQuantity> <TotalOpenOrdersQuantity>0</TotalOpenOrdersQuantity> <CustomerBackOrdersQuantity>0</CustomerBackOrdersQuantity> <MiscellaneousQuantity>0</MiscellaneousQuantity> <WatchProductFlag>N</WatchProductFlag> </ReportLine> - <ReportLine> <LineNumber>2</LineNumber> <VendorCode>23963</VendorCode> <VikingCode>CHMX10</VikingCode> <SelloutQuantity>0</SelloutQuantity> <OnHandQuantity>46</OnHandQuantity> <SafetyStockQuantity>41</SafetyStockQuantity> <TotalReceivedQuantity>0</TotalReceivedQuantity> <TotalOpenOrdersQuantity>0</TotalOpenOrdersQuantity> <CustomerBackOrdersQuantity>0</CustomerBackOrdersQuantity> <MiscellaneousQuantity>0</MiscellaneousQuantity> <WatchProductFlag>N</WatchProductFlag> </ReportLine> |
Der Aufbau ist mir ja verständlich und ich habe sogar eine xsd - Datei für diesen Aufbau bekommen. Nur leider habe ich noch nie etwas mit xml zu tun gehabt.
Es geht darum, dass wir täglich diese xml Dateien bekommen, diese in eine Datenbank einlesen wollen für die bessere Weiterverarbeitung. Das Problem was ich habe ist, die InventoryReport Section jeder ReportLine zuzuordnen.
Meine Datenbank hat alle Felder wo man die Daten rein schreiben kann nur ich muss jeder Zeile in meiner Datenbank den BranchCode zuordnen aus dem InventoryReport Section.
Ich hoffe mein "Kauderwelch" ist verständlich.
Vielen Dank schon mal.
Moderiert von raziel: XML-Tags hinzugefügt
|
|
stifflersmom
      
Beiträge: 194
XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
|
Verfasst: Di 21.11.06 16:31
So wie ich das sehe,
müßten die ReportLines dem Inventory-Report zugeordnet werden,
das bedeutet so ert mal zwei Tabellen die relational miteinander verknüpft sind.
Moin
|
|
FrankS 
      
Beiträge: 18
Win XP Pro
D2006 Pro
|
Verfasst: Do 23.11.06 19:22
Ja das mit den 2 Tabellen ist ok. Nur wie stelle ich die Verbindung zwischen beiden Tabellen her ? Ich lese die Datei also 2 mal ein einmal den Inventoryreport und dann die Report Lines in jeweils ein Tabelle. Wie stelle ich aber nun die Verbindung zwischen den beiden Tabellen her ? Da steige ich noch nicht so ganz durch, weil ich muss ja den ReportLines sagen zu welcher Inventory Section gehören.
Vielen Dank schon mal im Voraus
Frank
|
|
stifflersmom
      
Beiträge: 194
XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
|
Verfasst: Sa 25.11.06 18:25
Hast Du jetzt generell ein Verständnis-Problem mit dem relationealen Verknüpfen von Tabellen,
oder siehst Du nur hier keine Möglihkeit, diese beiden Tabellen sinnvoll miteinander zu verbinden?
Moin
|
|
FrankS 
      
Beiträge: 18
Win XP Pro
D2006 Pro
|
Verfasst: Mo 27.11.06 07:32
Nein wie ich die Tabelle verknüpfen kann und was eine relationale Verknüpfung ist weiß ich, in meinem Fall könnte man den Branchcode als Verknüpfung nehmen, nur weiß ich leider niht wie ich dieses Realisieren kann, da die Schleife einmal durchläuft und den Branchcode nur einmal einliest und ich nun das Problem habe wie kann ich den BranchCode den einzelnen ReportLines zuordnen. Wenn ich das hinbekommen würde, wäre ich schon einen riesen Schritt weiter
Ich habe zwischenzeitlich die Daten testweise per csv Datei schicken lassen, nur stehe ich da vor dem gleichen Problem. Die erste Zeile ich der Kopf und alle nachfolgenden Zeilen sind die ReportLines. Die ReportLines einlesen geht schon sehr gut nur fehlt mir die Zuordnung nun wieder zur ersten Zeile und da hapert es schon wieder, wie man nur die erste Zeile einer csv Datei ausliest und dann den Reportlines zuordnet. Das befüllen einer Tabelle ist eine leicht zu lösende Aufgabe nur halt die Daten so aufzuarbeiten, dass es passt will mir nicht gelingen.
Gruß Frank
|
|
stifflersmom
      
Beiträge: 194
XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
|
Verfasst: Di 28.11.06 19:31
Also, wenn der BranchCode für Dich als Verknüpfung geeignet erscheint,
dann nimm doch den.
Das bedeutet für Dich nichts weiter, als das Deine Tabelle die die ReportLines aufnehmen soll,
eben auch ein Feld für den BranchCode braucht, und schon kannst Du die beiden Tabellen miteinander verknüfen.
Beim einlesen des InventoryReports merkst Du dir den BranchCode, und schreibst dann beim einlesen der ReportLines,
eben diesen gemerkten Wert in das Feld BrachCode in die Tabelle mit den ReportLines.
Ob nun aus der XML-Datei oder CVS ist doch abschließend egal.
Allerdings bin ich mit CVS leichter dabei als mit der ganzen XML-Geschichte.
Moin
|
|
FrankS 
      
Beiträge: 18
Win XP Pro
D2006 Pro
|
Verfasst: Do 30.11.06 15:51
Hallo Stifflersmon,
ich weiß, ich müsste eigentlich ein neues Thema anfangen dafür aber stell die Frage trotzdem mal hier.
Kann ich es eigentlich realisieren, dass ich aus einer csv Datei nur die erste Zeile auslese und dann
nur einen Bestimmten Wert aus dieser Zeile in meinen Speicher schreibe ?
Mir fällt da nichts zu ein. Eine csv Datei komplett einlesen ist kein Problem.
Danke schon mal für die Hilfe.
Frank
|
|
stifflersmom
      
Beiträge: 194
XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
|
Verfasst: Do 30.11.06 19:15
Na ja einfach nicht bis zum Ende der Datei einlesen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function LiesersteZeilevonDatei(Dateiname:String):String; Var F : File of Text; S:String; Begin AssignFile(F,Dateiname); Reset(F) Readln(F,S) CloseFile(F); Result := S; End; |
Ist ungetestet, habe ich gerade nur so reingetippt,
Wenn Du so eine funktion verwenden willst solltest Du sie noch ein wenig
verfeinern, nach dem Motto: gibt es die Datei, welche Zeile will ich auslesen, try...finally und so weiter
Moin
|
|
FrankS 
      
Beiträge: 18
Win XP Pro
D2006 Pro
|
Verfasst: Di 12.12.06 11:10
Hallo,
sorry, dass ich mich jetzt erst wieder melde, lag letzte Woche mit einen bösen Grippe im Bett.
Ich habe es nun alles hinbekommen, ich werde in den nächsten Tagen die Lösung einstellen damit jeder es sich anschauen kann der evtl. auch mal das gleiche Problem hat.
Vielen Dank noch einmal
Frank
|
|