AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel-Funktion im Hintergrund ablaufen lassen

Ein Thema von Delphi-Narr · begonnen am 11. Dez 2009 · letzter Beitrag vom 16. Dez 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 11. Dez 2009, 19:31
Ok, das Ganze liegt an Schreibrechten... Zu anderen Verzeichnissen kann ich laden. Kann ich das irgendwie abstellen?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 11. Dez 2009, 19:36
"Delphi-Narr", du machst deinem Namen alle Ehre!
Mein Rat war doch kein Excel zu benützen.
Die Anwendung im Anhang zeigt wie einfach man die Umrechnungskurse ohne Excel einlesen kann.
Angehängte Dateien
Dateityp: zip waehrungdownload_204.zip (2,6 KB, 15x aufgerufen)
Dateityp: zip waehrungdoanloadexe_917.zip (238,0 KB, 12x aufgerufen)
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 11. Dez 2009, 20:34
Das "Narr" bezieht sich eigentlich nicht auf "ein Narr sein"->nichts können sondern "vernarrt"->mögen...

Naja,
Dieses Programm benutzt nur die täglichen Daten.
Ich habe mal versucht, die gesamte Datenbank seit 1999 reinzuladen, er lädt nur die ersten beiden Daten. Außerdem fehlt das Datum und mir fehlt die MSXML2_TLB.pas

Ich hatte bisher noch keine Erfahrungen mit XML und auch keine Ahnung von ihm im Zusammenhang mit Delphi.
Ich würde mir das ganze gerne erklären lassen
Da ich Delphi nur in der Schule lerne, ist das, was ich hier mache eigentlich "über meinen Fähigkeiten", also kann ich sowas nicht wissen. Natürlich habe ich schon gegooglet nach XML in Delphi etc. und auch nach der MSXML2_TLB.pas, doch die gefundene Datei hat sich hinterher als HTML-Datei entpuppt und zu XML hab ich nur Beschreibungen ab Delphi 7 gefunden.

Wenn du mir das ganze erklären könntest und die MSXML2_TLB.pas anhängen könntest (sofern erlaubt), wäre ich dir sehr dankbar!
Ich weiß, ich bin manchmal ein bisschen umständlich, liegt aber dadran, dass ich das ganze erst seit August lerne...

Liebe Grüße
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 11. Dez 2009, 21:00
Die Datei MSXML2_TLB lässt man sich am Besten von Delphi erzeugen.
Je nach Delphi Version unterscheiden sich die Schritte etwas.
* Projekt schliesen
* im Menü entweder (D5-D7)Projekt->Typbibliothek importieren oder (D2007)Komponente->Komponente importieren... wählen.
* man bekommt eine sehr umfangreiche Liste von Typbiliotheken auf dem Rechner
* daraus "Microsoft XML, v4.0" auswählen
* keinen Komponentenwrapper erzeugen lassen
* das Defaultverzeichnis ...\Imports nicht ändern
* Unit anlegen
=> es wird MSXML2_TLB.pas in dem Imports-Verzeichnis erzeugt.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 11. Dez 2009, 21:42
Ah, vielen Dank!
Ich arbeite mich dann mal in XML ein...

Gute Nacht allerseits
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#16

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 13. Dez 2009, 10:47
Alternativ kann ich himXML empfehlen.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 13. Dez 2009, 19:10
Delphi-Quellcode:
procedure TForm1.UpdateFromXML(const data: string; dataIsFile:Boolean);
var
   document : IXMLDOMDocument2;
   node, node2 : IXMLDOMNode;
   ElementCube : IXMLDOMElement;
   i : Integer;
   currency : string;
   rate : Double;
begin
   document := CoDOMDocument40.Create;

   if dataIsFile then
      document.load(data)
   else
      document.loadXML(data);

// CheckDocumentError(document);


   node2 := document.documentElement;
   node := node2.lastChild;
// node := document.documentElement.selectSingleNode('//Cube');
   node := node.firstChild;

   // Schleife über alle vorhandenen Währungen
   for i := 0 to node.childNodes.length-1 do
   begin
      ElementCube := node.childnodes.item[i] as IXMLDOMElement;
      currency := ElementCube.getAttribute('currency');
      rate := ElementCube.getAttribute('rate');
      UpdateCurrency(currency, rate);
   end;

end;

Dies ist ja dein Code, data muss also der Dateipfad+Name sein. Also praktisch Ordner/dateiname.xml

So, ich hab das auch mal gemacht. Bei mir kommt allerdings eine Zugriffsverletzung:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
node:IXMLDOMNode;
Element:IXMLDOMELEMENT;
begin
     XMLDokument:=CoDOMDocument40.Create;
     XMLDokument.loadXML('datafiles/euroxref-hist.xml');
     node := XMLdokument.documentElement.selectSingleNode('//Cube');
     Element:=node.childnodes.item[1] as IXMLDOMElement;
end;
variable i ist für spätere Schleife(n)...

Wenn ich dann auf besagten Button klicke, wird die 3. Zeile nach Begin (node := ...) markiert und die Zugriffsverletzungsnachricht

Modul 00442242 Adresse 00000000

erscheint. Ich seh den Unterschied nicht genau... Ok, habe andere Bezeichnungen aber sonst müsste alles gleich sein, oder?
Habe das Tutorial hier mal gelesen, aber ist ja etwas anders aufgebaut, also hab ich da so meine Probleme mit. Ich kann auch nicht dort kopieren, was dort steht, weil mir wieder mal zwei .pas Dateien fehlen...
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 14. Dez 2009, 09:47
Zitat von Delphi-Narr:
... data muss also der Dateipfad+Name sein. Also praktisch Ordner/dateiname.xml
Das hast du falsch verstanden - LoadXML() nimmt einen XML-String entgegen.
Load() holt die Daten aus einer Datei oder URL.
Nach dem Laden muss überprüft werden, ob XMLdokument.documentElement = NIL ist.
Falls ja, ist beim Laden ein Fehler aufgetreten.
Bei deinem Code liegt das daran, dass du fälschlicherweise LoadXML() statt Load() verwendet.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#19

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 14. Dez 2009, 18:48
Achso, ok. Jetzt habe ich die Datei eurofxref-hist.xml

Die ist so aufgebaut:
XML-Code:
<?xml version="1.0" encoding="UTF-8" ?>
- <gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
  <gesmes:subject>Reference rates</gesmes:subject>
- <gesmes:Sender>
  <gesmes:name>European Central Bank</gesmes:name>
  </gesmes:Sender>
- <Cube>
- <Cube time="2009-12-10">
  <Cube currency="USD" rate="1.473" />
  <Cube currency="JPY" rate="130.03" />
  <Cube currency="BGN" rate="1.9558" />
  <Cube currency="CZK" rate="25.705" />
  <Cube currency="DKK" rate="7.4417" />
  <Cube currency="EEK" rate="15.6466" />
  <Cube currency="GBP" rate="0.9043" />
  <Cube currency="HUF" rate="272.05" />
  <Cube currency="LTL" rate="3.4528" />
  <Cube currency="LVL" rate="0.7072" />
  <Cube currency="PLN" rate="4.1405" />
  <Cube currency="RON" rate="4.2382" />
  <Cube currency="SEK" rate="10.4367" />
  <Cube currency="CHF" rate="1.5113" />
  <Cube currency="NOK" rate="8.4355" />
  <Cube currency="HRK" rate="7.2668" />
  <Cube currency="RUB" rate="44.8505" />
  <Cube currency="TRY" rate="2.202" />
  <Cube currency="AUD" rate="1.6074" />
  <Cube currency="BRL" rate="2.5904" />
  <Cube currency="CAD" rate="1.5472" />
  <Cube currency="CNY" rate="10.0556" />
  <Cube currency="HKD" rate="11.4168" />
  <Cube currency="IDR" rate="13905.61" />
  <Cube currency="INR" rate="68.7" />
  <Cube currency="KRW" rate="1716.4" />
  <Cube currency="MXN" rate="19.0312" />
  <Cube currency="MYR" rate="5.0045" />
  <Cube currency="NZD" rate="2.0236" />
  <Cube currency="PHP" rate="68.075" />
  <Cube currency="SGD" rate="2.0473" />
  <Cube currency="THB" rate="48.793" />
  <Cube currency="ZAR" rate="11.0565" />
  </Cube>
- <Cube time="2009-12-09">
  <Cube currency="USD" rate="1.4768" />
  <Cube currency="JPY" rate="129.91" />
  <Cube currency="BGN" rate="1.9558" />
  <Cube currency="CZK" rate="25.749" />
  <Cube currency="DKK" rate="7.4416" />
  ...
  </Cube>
</cube>
Nicht zu jedem Datum ist jede Währung vorhanden. Im Optimalfall sollten es (Stand wie oben) 2802 Einträge sein. 20 Währungen aus dem ersten Cube sind in dieser Zahl vorhanden. Ich habe auch nicht nachgeprüft, ob bei älteren Daten andere Währungen sind. Ist auch ersteinmal unwichtig.
Also zur Auswahl stehen die aufgelisteten Währungen.
Erst muss also das Datum gesucht werden.
Hatte das bisher so, dass alle Daten durchsucht werden, solange das Datum2 (das aus der Datei) > ist als das aus der Datumsauswahl.
Dann wird die Variable i auf die Stelle gesetzt, ab wo der Kurs des eingegebenen Datums gilt.


Also

Eingabe: 27.10.2009


Datei:

0 -> 12.12.2009
1 -> 11.12.2009
2 -> 30.11.2009
3 -> 15.11.2009
4 -> 28.10.2009
5 -> 26.10.2009

als i erhalte ich also 5.

Jetzt müssen alle Unterpunkte von Cube[i] durchsucht werden, bis der Wert von currency gleich die angegebene Währung ist und dann muss die Variable Kurs auf den Wert vom Attribut "rate" gesetzt werden. Wenn die Währung nicht existiert, soll der Anwender dies mitgeteilt bekommen.

Könnte sich jemand die Zeit nehmen, mir mal zu erklären, wie ich das jetzt realisieren kann?
Liebe Grüße!
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#20

Re: Excel-Funktion im Hintergrund ablaufen lassen

  Alt 15. Dez 2009, 14:53
Also ich habe es jetzt so versucht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
node:IXMLDOMNode;
Element:IXMLDOMELEMENT;
begin
     XMLDokument:=CoDOMDocument40.Create;
     XMLDokument.loadXML('datafiles/xref-hist.xml');
     node := XMLdokument.documentElement.lastChild;
     node:=node.firstChild;
     Element:=node.childnodes.item[1] as IXMLDOMElement;
     ...
end;
Ich erhalte jedoch immer eine Zugriffsverletzung bei Adresse 00000000 und die Zeile node := XMLdokument... wird markiert. Ich versteh leider nicht, was ich falsch mache... Den Text aus manchen Nodes kann ich anzeigen lassen, aber ich brauche ja die Attribute. Und an die komm ich nicht ran.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 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