UDF Skripte
Währungskurse der ECB einlesen
Dieses Script liesst Währungskurse der ECB ein.
program wechselkurs;
type
rWaehr = record
waehrid:integer;
ISOWaCode:string;
WaCode:string;
einheit:integer;
end;
var
WebConnector:TSQLConnector;
M:TMemoryStream;
rueckgabe:string;
cGet:string;
ADoc: TNativeXml;
ANode,ANodeCubes: TXMLNode;
cECBDate:string;
cCurrency,cRate:string;
i,nAID:integer;
aWaehr: array of rWaehr;
nAdded,nUpdated:integer;
function GetAID( ISOWaCode:string):integer;
var i:integer;
begin
result := -1;
for i := 0 to Length(aWaehr)-1 do
begin
if aWaehr[i].ISOWaCode = ISOWaCode then
begin
result := i;
end;
end;
end;
begin
oQuery.SQL.Text := 'SELECT * FROM waehr';
oQuery.open;
while not oQuery.eof do
begin
i := Length(aWaehr);
Setlength(aWaehr, i+1);
aWaehr[i].waehrid := oQuery.FieldByName('waehrid').AsInteger;
aWaehr[i].ISOWaCode := oQuery.FieldByName('ISOWaCode').AsString;
aWaehr[i].WaCode := oQuery.FieldByName('WaCode').AsString;
aWaehr[i].Einheit := oQuery.FieldByName('Einheit').AsInteger;
oQuery.Next;
end;
WebConnector := TSQLConnector.Create(nil);
M := TMemoryStream.Create;
ADoc := TNativeXml.Create;
ADoc.Utf8Encoded := True;
try
with WebConnector do
begin
// Falls mit .htaccess user/pw
auth := False;
authname := '';
authpw := '';
ResetParams;
cGet := 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';
if Get(cGet,M) then
begin
ADoc.LoadFromStream(M);
ADoc.XmlFormat := xfReadable;
writeln(ADoc.WriteToString);
if assigned(ADoc.Root) then with ADoc.Root do
begin
ANode := NodeByName('Cube');
if ANode <> nil then
begin
ANodeCubes := ANode.NodeByName('Cube');
if ANodeCubes <> nil then
begin
cECBDate := ANodeCubes.AttributeByName['time'];
writeln( 'Datum: '+cECBDate );
oQuery1.RequestLive := True;
nAdded := 0;
nUpdated := 0;
if cECBDate <> '' then
begin
for i := 0 to ANodeCubes.NodeCount - 1 do
begin
cCurrency := ANodeCubes.Nodes[i].AttributeByName['currency'];
cRate := ANodeCubes.Nodes[i].AttributeByName['rate'];
writeln(cCurrency+' :: '+cRate);
nAID := GetAID(cCurrency);
if nAID > -1 then
begin
oQuery1.SQL.Text := 'UPDATE waehr SET kurs='+cRate+
' WHERE waehrid='+inttostr(aWaehr[nAID].waehrid);
oQuery1.ExecSQL;
oQuery1.SQL.Text := 'SELECT * FROM waehrk'+
' WHERE waehrid='+inttostr( aWaehr[nAID].waehrid )+
' AND datum='+ datestring(date);
oQuery1.Open;
if oQuery1.RecordCount = 0 then
begin
oQuery1.SQL.Text := 'INSERT INTO waehrk '+
'(waehrid,wacode,datum,einheit,kurs)VALUES('+
inttostr(aWaehr[nAID].waehrid)+
','+quotedstring(aWaehr[nAID].wacode)+
','+datestring(date)+
','+inttostr(aWaehr[nAID].Einheit)+
','+cRate+
')';
oQuery1.ExecSQL;
nAdded := nAdded + 1;
end
else
begin
oQuery1.SQL.Text := 'UPDATE waehrk SET kurs='+cRate+
' WHERE waehrid='+inttostr(aWaehr[nAID].waehrid)+
' AND datum='+datestring(date);
oQuery1.ExecSQL;
nUpdated := nUpdated+1;
end;
end;
end;
end;
end;
end;
end;
ShowMeldung('Neue Tageskurse: '+inttostr(nAdded)+#13+#10+
'Tageskurs Updates: '+inttostr(nUpdated));
end
else
begin
// nur bei Fehler
rueckgabe := StreamToString(M);
writeln(rueckgabe);
ShowMeldung('Abruf nicht erfolgreich: '+rueckgabe);
end;
end;
finally
SetLength(aWaehr,0);
oQuery.Close;
oQuery1.Close;
WebConnector.Close;
M.Free;
ADoc.Free;
end;
end.