Autor Beitrag
FrankS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Pro
D2006 Pro
BeitragVerfasst: 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.

ausblenden volle Höhe Delphi-Quelltext
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;       // DataGrid an DataTable anbinden

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 user profile iconraziel: Delphi-Tags hinzugefügt
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194

XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Fr 17.11.06 10:34 
user profile iconFrankS 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Pro
D2006 Pro
BeitragVerfasst: 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 :

ausblenden volle Höhe XML-Daten
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 user profile iconraziel: XML-Tags hinzugefügt
stifflersmom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194

XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Pro
D2006 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194

XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Pro
D2006 Pro
BeitragVerfasst: 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 :wink:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194

XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Pro
D2006 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194

XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
BeitragVerfasst: Do 30.11.06 19:15 
Na ja einfach nicht bis zum Ende der Datei einlesen:

ausblenden 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);   //Datei öffnen
 Reset(F)                   //An den Anfang
 Readln(F,S)                //Erste Zeile der Datei nach S einlesen
 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Pro
D2006 Pro
BeitragVerfasst: 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