Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi In XML löschen und weitere Einträge aktualisieren (https://www.delphipraxis.net/9920-xml-loeschen-und-weitere-eintraege-aktualisieren.html)

Akut-Programming 7. Okt 2003 19:40


In XML löschen und weitere Einträge aktualisieren
 
Hi!

Ich will in meiner XML Datei die jeweilige ID der darauf folgenden Einträge aktualsieren, sobald ein Eintrag gelöscht wurde. Ich dachte ich nehm ne for Schleife, nur gibts irgendwie Probleme. :wall:

folgender verständlicher Sachverhalt:

Ich habe in meiner XML Datei 4 Einträge und lösche z.B. den 2ten, dann wird zwar der nächste Eintrag(der 3te) aktualisiert - nimmt somit die ID 2 an, doch der danach eigentliche 3te belibt bei ID 4.

Dies wiederum bringt den kompletten Ablauf meines Programms durcheinander - Zugriffsverletzung. :gruebel:

Ich hab hier mal das wichtigtse der ganzen Anweisung, die For Schleife:

Delphi-Quellcode:
...
for i2:=1 to lv_eintraege.Items.Count-1 do begin
    id2 :=StrToInt(lv_eintraege.Items[i].Caption);
    node := xmlDoc.documentElement.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id2)+'"]');
    node.selectSingleNode('terminid').text:=IntToStr(id);
    xmlDoc.save(frm_terminplaner.instpath + xmlfilename);
    frm_terminplaner.UpdateList;
end;
...
Ich hoffe das es reicht und mir jemand helfen kann!?

Gruß,

phlux 7. Okt 2003 20:18

Re: In XML löschen und weitere Einträge aktualisieren
 
Warum brauchst du denn in deiner XML Datei eine Laufvariable (die ID) die sich beim Löschen/Hinzufügen verändert??

CalganX 7. Okt 2003 20:40

Re: In XML löschen und weitere Einträge aktualisieren
 
Damit er immer den Eintrag genau ansprechen kann. Name wäre bspw. problematisch, weil ich z.B. mehrere Einträge "Zahnarzt" habe. ;)

Chris

phlux 7. Okt 2003 20:47

Re: In XML löschen und weitere Einträge aktualisieren
 
Das habe ich mir schon irgendwie gedacht, aber da gibts doch elegantere Lösungen :shock:

CalganX 7. Okt 2003 20:49

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi,
sicherlich, aber da müsste man dann einige Sachen einbauen, von wegen DTD und so weiter (damit sollte es irgendwie möglich sein jedem Eintrag eine eindeutige Nummer zu verpassen). Aber wie genau kann ich jetzt so konkret leider auch nicht sagen. :|

Chris

phlux 7. Okt 2003 20:58

Re: In XML löschen und weitere Einträge aktualisieren
 
Ja dem Forum fehlt echt noch ein Experte der sich mit XML auskennt :mrgreen: ich hoffe der kann dann auch XSL obwohl daran arbeite ich ;)

@akut ich guck mir mal die source morgen an, bin heut zu müde :duck:

CalganX 7. Okt 2003 21:04

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi,
hehe... Google ist Experte in Alles... :mrgreen:
Nene... schon klar. Einfach mal sakura fragen...
Zitat:

Zitat von sakura
Wenn du mal Fragen hast: Frag ich arbeite den ganzen Tag mit XML DOM und das schon seit 4 Jahren.

(Fehler vorbehalten. ;))

Chris

Akut-Programming 8. Okt 2003 06:37

Re: In XML löschen und weitere Einträge aktualisieren
 
Moin Moin!

Also wie Chris schon bemerkt hat, verwende ich die ID um die Einträge ohne Probleme zu identifizieren und ansprechen zu können. Hab schon im Forum gesucht, aber so recht Hilfe find ich da nicht!?

Gruß,

phlux 8. Okt 2003 08:58

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi!
Mir stellen sich ein paar Fragen zu deinem Code...
Delphi-Quellcode:
//Warum fängt i2 bei 1 an zu zählen, meines wissens fängt man bei null an, es sei denn du fängst bei
//deinen XML Eintragen bei eins an zu zählen, was allerdings dann verwirrend wäre
for i2:=1 to lv_eintraege.Items.Count-1 do
  begin
    id2 :=StrToInt(lv_eintraege.Items[i].Caption);//Wo kommt das i her? Müsstest du hier nicht i2
    //nehmen??
    node := xmlDoc.documentElement.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id2)+'"]');
    //Hier würde ein einfache id2-1 reichen und schon hast du eine variable gespart
    node.selectSingleNode('terminid').text:=IntToStr(id);
    //Bitte Lager mich ausserhalb der Schleife aus
    xmlDoc.save(frm_terminplaner.instpath + xmlfilename);
    frm_terminplaner.UpdateList;
    //Bis hier hin, denn bedenke die datei wird jedes mal für x Einträge geöffnet und dann gespeichert,
    //speichere lieber die Datei einmal finalerweise mit allen Änderungen , deshalb hinter das end
    //der for-Schleife damit
  end;
So hoffe dir erstmal geholfen zu haben

mfg phluphie :hi:

[Edit]Ausserdem was mir noch eingefallen ist, du gehst in der Schleife durch die gesamten Einträge, dabei reicht es wenn wir, sagen wir bei y und gelöschten Eintrag hätten du nur die einträge von y+1 bis Items.Count-1 nachbearbeiten müsstest. ;)

Akut-Programming 8. Okt 2003 09:18

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi

Zitat:

//Warum fängt i2 bei 1 an zu zählen, meines wissens fängt man bei null an, es sei denn du fängst bei
//deinen XML Eintragen bei eins an zu zählen, was allerdings dann verwirrend wäre
Da mein erster Eintrag der XML die ID 1 hat. Im Prog würde es mir nichts nutzen die 0 mit zunehemen!

Zitat:

//Wo kommt das i her? Müsstest du hier nicht i2 //nehmen??
Wenn du meinen oberen Beitrag richtig angeschaut hättest, wär dir aufgefallen, das vor und nach der For Schleife "..." steht. Dies soll ansatzweise darstellen, das es davor und danach noch weiter geht. Klar ich hätte auch sonst wieviele Codezeilen posten können, wollt um Platz zu sparen :wink: aber nur die For Schleife posten, da es mir um diese geht.

Den Rest werd ich nach deinen Vorschlägen abändern - Also danke schonmal dafür. Vielleicht behebt das ja auch schon mein Problem.Wie gesagt, ich denke das es nur an der For Schleife liegen kann.

Ciao

Akut-Programming 13. Okt 2003 19:16

Re: In XML löschen und weitere Einträge aktualisieren
 
Hmm.. nach ewigen versuchen und umschreiben bzw. :pale: neu schreiben hats noch nich gefunzt. :wall: Hier is mal der komplette Aufruf meiner Prozedur - Ich hoffe ihr könnt mir nochmal helfen?!

Delphi-Quellcode:
procedure Tfrm_terminplaner.Image2Click(Sender: TObject);
var
  node, parentnode: IXMLDOMNode;
  id,id2,i,i2: integer;
begin
  if lv_eintraege.SelCount=1
    then begin
      Image1.Enabled:=true;
      Image2.Enabled:=true;
    end else
    begin
      Image1.Enabled:=false;
      Image2.Enabled:=false;
    end;
  i:=lv_eintraege.Selected.Index;
  id:=StrToInt(lv_eintraege.Items[i].Caption);
  node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
  if node <> nil
  then begin
    parentnode := node.parentNode;
    parentnode.removeChild(node);
    if id=1
    then begin
      for i2:=1 to lv_eintraege.Items.Count
      do begin
        node := xmlDoc.documentElement.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
        node.selectSingleNode('terminid').text:=IntToStr(id);
      end;
      end else
      for i2:=1 to lv_eintraege.Items.Count-1
      do begin
        node := xmlDoc.documentElement.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
        node.selectSingleNode('terminid').text:=IntToStr(id);
      end;
      status_03.Caption:='Der Termin wurde erfolgreich gelöscht!';
      Timer1.Enabled:=true;
      frm_terminplaner.UpdateList;
    end;
    xmlDoc.save(frm_terminplaner.instpath + xmlfilename);
    frm_terminplaner.UpdateList;
    Label2.Caption:='erfasste Termine ('+IntToStr(lv_eintraege.Items.Count)+')';
end;
[EDIT] Hier springt er immer in ne Zugriffsverletzung, weiß aber nicht warum??
Delphi-Quellcode:
node.selectSingleNode('terminid').text:=IntToStr(id);
Gruß,

Akut-Programming 14. Okt 2003 18:06

Re: In XML löschen und weitere Einträge aktualisieren
 
Also hab jetzt n bissl rum probiert..immer noch nichts. Wollts wie von phlux vorgeschlagen machen. Nur wenn ich das Speichern und ListUpdaten erst zum Schluss mache - was ja auch Sin ergibt, Stresst er wegen dem SelectedNode rum. Poste mal meinen umgestellten Code - So funztz zwar aber immer nur wenn maximal 2 Einträge im XML bzw. ListView sind (Das eigentliche Problem).
Delphi-Quellcode:
procedure Tfrm_terminplaner.Image2Click(Sender: TObject);
var
  node, parentnode: IXMLDOMNode;
  id,id2,i,i2: integer;
begin
  i:=lv_eintraege.Selected.Index;
  id:=StrToInt(lv_eintraege.Items[i].Caption);
  node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
  parentnode := node.parentNode;
  parentnode.removeChild(node);
  xmlDoc.save(frm_terminplaner.instpath + xmlfilename);     // Dies einfach mal wegdenken, wäre dann Phluxs Vorschlag
  frm_terminplaner.UpdateList;                              // -||-
  for i2:=1 to lv_eintraege.Items.Count-1
  do begin
    id:=StrToInt(lv_eintraege.Items[i].Caption);
    node := xmlDoc.documentElement.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
    node.selectSingleNode('terminid').text:=IntToStr(id);
  end;
  xmlDoc.save(frm_terminplaner.instpath + xmlfilename);
  status_03.Caption:='Der Termin wurde erfolgreich gelöscht!';
  Timer1.Enabled:=true;
  frm_terminplaner.UpdateList;

  Label2.Caption:='erfasste Termine ('+IntToStr(lv_eintraege.Items.Count)+')';
end;

CalganX 14. Okt 2003 18:16

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi,
ich habe gerade mal auf die schnelle was gecodet. Das ist komplett ungetestet, weil ich kein funktionsfähiges Delphi im Moment auf dem Laptop habe. Aber es sollte funktionieren.
Delphi-Quellcode:
var
  i: integer;
  xmlNode, xmlParent: IXMLDOMNode;
  xmlXSL, sID: string;
begin
  sID := lv_eintraege.items[i].Caption;
  xmlXSL := '/PlanView/termin[terminid="'+sID+'"]';
  xmlNode := xmlDoc.selectSingleNode(xmlXSL);
  xmlParent.removeChild(xmlNode);

  xmlNode := nil;
  xmlParent := nil;
 
  for i:=0 to lv_eintraege.Items.Count-1 do begin
    sID := lv_eintraege.Items[i].Caption;
    xmlXSL := '/PlanView/termin[terminid="'+sID+'"]';
    xmlNode := xmlDoc.documentElement.selectSingleNode(xmlXSL);
    xmlNode.selectSingleNode('terminid').text := IntToStr(i);
  end;
  xmlDoc.save(self.instpath + xmlfilename);
  {... der ganze Rest von wegen Hinweise etc. ...}
  frm_terminplaner.UpdateList;
end;
Der Source ist komplett optimiert, so gut es geht.
Wenn es nicht geht (präventiver Hinweis): Zeile, Fehlermeldung, etc. angeben! Meine Glaskugel wird gerade von Luckie repariert. ;)

Chris

PS: Dein Fehler liegt einfach darin, dass du immer von 1 nach Items - 1 zählst. Sieh dir meinen Source an und lerne. ;)

[edit=Chakotay1308]Fehler korrigiert.[/edit]

Akut-Programming 14. Okt 2003 20:27

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi Chris! :wink:

Dein Posting war mir wie immer ne rießen Hilfe! :thuimb: Musste dann zwar noch was abändern, so funzt es aber prima:
Delphi-Quellcode:
var
  node, parentnode: IXMLDOMNode;
  i,i2: integer;
  id,xmlXSL: String;
begin
  i:=lv_eintraege.Selected.Index;
  id:=lv_eintraege.Items[i].Caption;
  xmlXSL:='/PlanView/termin[terminid="'+ID+'"]';
  node :=xmlDoc.documentElement.selectSingleNode(xmlXSL);
  parentnode := node.parentNode;
  parentnode.removeChild(node);
  node := nil;
  parentnode := nil;
  frm_terminplaner.UpdateList;
  for i2:=0 to lv_eintraege.Items.Count-1
  do begin
    id:=lv_eintraege.Items[i2].Caption;
    xmlXSL:='/PlanView/termin[terminid="'+id+'"]';
    node := xmlDoc.documentElement.selectSingleNode(xmlXSL);
    node.selectSingleNode('terminid').text:=inttostr(i2+1);
  end;
  xmlDoc.save(frm_terminplaner.instpath + xmlfilename);
  frm_terminplaner.UpdateList;
:dp:


[edit]Stelle euch dann den Link zum Terminplaner unter "Freeware" zur Verfügung, wenn meine Seite fertig ist - Dann könnt ihr euch das Teil mal angucken. Wäre dann Version 1.4[/edit]
Greetz,

CalganX 15. Okt 2003 12:39

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi,
das mit dem +1 ist Ansichtssache. Ich z.B. würde bei 0 anfangen.

Das neue i2 kannst du einsparen in dem du die Zeilen
Delphi-Quellcode:
  i:=lv_eintraege.Selected.Index;
  id:=lv_eintraege.Items[i].Caption;
zusammenfast nach
Delphi-Quellcode:
id:=lv_eintraege.Items[lv_eintraege.Selected.Index].Caption;
Chris

Akut-Programming 15. Okt 2003 12:44

Re: In XML löschen und weitere Einträge aktualisieren
 
Joa, das mit i2 hab ich auch schon mitbekommen. Hatte es ja versucht, ohne i2+1... funzte nich. Und wie du siehst fange ich ja mit i2:=0 an!!

Greetz,

CalganX 15. Okt 2003 14:50

Re: In XML löschen und weitere Einträge aktualisieren
 
Hi,
das ist mir klar, denn startest immer bei 1 und somit musst du es auch hier machen.

Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz