1

Konu: TCMB den döviz kurları

********************************************************
lcURL = "http://www.tcmb.gov.tr/kurlar/today.xml"

oForm = Createobject('readxml', m.lcURL)
Select Doviz
browse
COPY TO den

Define Class readxml As Form
Add Object htmlviewer As OleControl With ;
OleClass = 'Shell.Explorer'

Procedure Init
Lparameters tcURL
With Thisform.htmlviewer
.Navigate2(m.tcURL)
Do While .ReadyState # 4 && Wait for ready state
EndDo
XMLToCursor(this.htmLVIEWER.Object.Document.XMLDocument.XML,'Doviz')
Return .F.
Endwith
Endproc
Enddefine

*****************************************

Forumdan aldığım (yada türkçe yürütmek diyelim) bu kodlarla Merkez bankasından döviz kurlarını alabiliyorum.
Ancak bunların içinden sadece bir hücredeki (mesela USD alış hücresi diyelim.) bilgiyi yada rakamı bir değişkene atayabilirmiyim.

Teşekkür edrim.

2

Re: TCMB den döviz kurları

evet crusor olusturdugu için
thisform.text1.Value =banknotebuying
thisform.text2.Value =banknoteselling

şeklinde alıyorum

Bilgi Paylaşıldıkça Artar...!

3

Re: TCMB den döviz kurları

LOCATE FOR isim="AMERİKAN DOLARI" veya CurrancyName="US DOLLAR" gibi komutlar ile aradığınız kura gitmek gerekir demek malumun ilanı olur, ben başka bir şeyi hatırlatmak istedim:

5-6 sene evvel (belki fazla) böyle bir program ile kur arşivi yapan bir program yapmıştım.
Xkuredit = oIE.Document.Body.InnerText  metodu kullanıyordu.
Geçen süre içerisinde TMB kodları değiştirdi - sonradan programa aşağıdaki şekilde bir kontrol modülü yazmıştım, değişiklik halinde yeni formattan parametre üretme ile devam edilsin diye.

kod belki şimdiki VFP versiyonuna göre ilkel olabilir, sadece fikir vermesi için ekledim...

Visual Fox Pro
* kodları .txt dosyasından alıyor

  IF ! FILE("tcmbparametre.txt")
   =STRTOFILE(_USD+CRLF+_EUR+CRLF+_JPY+CRLF,"tcmbparametre.txt")
  ENDI
  Xhandle=FOPEN("tcmbparametre.txt")
  =FSEEK(Xhandle, 0)
  XUSD=ALLT(FGETS(Xhandle))
  XEUR=ALLT(FGETS(Xhandle))
  XJPY=ALLT(FGETS(Xhandle))
  Xvirgül_nokta=ALLT(FGETS(Xhandle))
  =FCLOSE(Xhandle)
  *
  Xtest=0
  Xi=1
  X1=1
  X2=ATC(CRLF,thisForm.kuredit.value,Xi)
  DO WHIL Xtest<3 AND Xi<2500
      Xxx=SUBS(thisForm.kuredit.value,X1,X2-X1)
      DO CASE
      CASE LEFT(Xxx,LEN(XUSD))=XUSD
        Xtest=Xtest+1
      REPL kurlar.d1 WITH _D1
      REPL kurlar.d2 WITH _D2
      REPL kurlar.d3 WITH _D3
      REPL kurlar.d4 WITH _D4
    CASE LEFT(Xxx,LEN(XJPY))=XJPY
        Xtest=Xtest+1
        REPL kurlar.y1 WITH _D1
      REPL kurlar.y2 WITH _D2
      REPL kurlar.y3 WITH _D3
      REPL kurlar.y4 WITH _D4
    CASE LEFT(Xxx,LEN(XEUR))=XEUR
        Xtest=Xtest+1
      REPL kurlar.e1 WITH _D1
      REPL kurlar.e2 WITH _D2
      REPL kurlar.e3 WITH _D3
      REPL kurlar.e4 WITH _D4
    ENDC
    X1=X2+2
    Xi=Xi+1
    X2=ATC(CRLF,thisForm.kuredit.value,Xi)
  ENDD
ENDI
IF Xtest<3
  =MESSAGEBOX("MERKEZ BANKASI DÖVİZ KUR KODLARINI DEĞİŞTİRMİŞ OLABİLİR"+CRLF+;
  "'P' düğmesi ile parametre penceresine girerek UYGUN KODLARI girin"+CRLF+CRLF+ ;
  "daha sonra tekrar kaydedin",40,"KAYIT BAŞARISIZ")
ENDI
ThisForm.Refresh
VFP9 SP2

4

Re: TCMB den döviz kurları

Gokce,
Konuk'un dedigine dikat et. Bugun "US DOLLAR" derler yarin "USD". Onun icin satiri nasil sececegin, araya kullaniciyi koyup koymayacagini hesapla. Kolon adlari daha sabit kalir herhalde ama akillinin biride cikip onlari 'efektifalis' vs'ye cevirir.

Ben o kurlari almak icin form ve Shell.Explorer yerine baska bir sey onerecegim aslinda, bu daha hizli gibi geliyor:

Visual Fox Pro
LOCAL lcURL,lcLocalFile,lcXML

lcURL = "http://www.tcmb.gov.tr/kurlar/today.xml"
lcLocalFile = FORCEPATH(SYS(2015)+'.xml',SYS(2023))
IF getFileFromURL(m.lcURL,m.lcLocalFile) = 0
    lcXML = FILETOSTR(m.lcLocalFile)
    ERASE (m.lcLocalFile)
    XMLToCursor(m.lcXML,'Doviz')
endif
 
 
Procedure getFileFromURL
Lparameters tcRemoteFile,tcLocalFile
Declare Integer URLDownloadToFile In urlmon.Dll;
  INTEGER pCaller, String szURL, String szFileName,;
  INTEGER dwReserved, Integer lpfnCB
RETURN URLDownloadToFile(0, m.tcRemoteFile, m.tcLocalFile, 0, 0)

5

Re: TCMB den döviz kurları

Merkez bankasının geçmiş günlerinle ilgili kurlar için aşağıdaki gibi kodlar kullanıyormuşum.

Visual Fox Pro
LcUrl="http://www.tcmb.gov.tr/kurlar/"

LcUrl = LcUrl + lcyil + lcay + "/" + lcday + lcay + lcyil + ".html"
LcFile=lcday + lcay + lcyil + ".html"


şimdi eski arşive ulaşmak için (gün vererek kur almak- şimdiki today diye) formatı biliyormusunuz ?

VFP9 SP2

6

Re: TCMB den döviz kurları

Visual Fox Pro
LOCAL lcURL,lcLocalFile,lcXML

lcURL = "http://www.tcmb.gov.tr/kurlar/today.xml"
 
 
ldDate = DATE(2006,3,30)
lcUrl =  "http://www.tcmb.gov.tr/kurlar/"+;
TEXTMERGE("<<left(ttoc(m.ldDate,1),6)>>/<<PADL(day(m.ldDate),2,'0')>>")+;
textmerge("<<PADL(month(m.ldDate),2,'0')>><<year(m.ldDate)>>.xml")
 
lcLocalFile = FORCEPATH(SYS(2015)+'.xml',SYS(2023))
IF getFileFromURL(m.lcURL,m.lcLocalFile) = 0
    lcXML = FILETOSTR(m.lcLocalFile)
    ERASE (m.lcLocalFile)
    XMLToCursor(m.lcXML,'Doviz')
    SELECT doviz
    BROWSE
endif
 
 
Procedure getFileFromURL
Lparameters tcRemoteFile,tcLocalFile
Declare Integer URLDownloadToFile In urlmon.Dll;
  INTEGER pCaller, String szURL, String szFileName,;
  INTEGER dwReserved, Integer lpfnCB
RETURN URLDownloadToFile(0, m.tcRemoteFile, m.tcLocalFile, 0, 0)

xml eski tarihler icin olmayabilir o zaman ".html".

7

Re: TCMB den döviz kurları

Bu arada aslinda XML'de XMLToCursor() ile goruntulenenden fazla bilgi varmis, DOM parsin, XMLAdapter filan daha iyi olur.

8

Re: TCMB den döviz kurları

Visual Fox Pro
ldDate = Date(2006,2,20)

 
if GetDovizKuru( Date(2006,2,20) )
  Select doviz
  Browse
else
MessageBox("XML yerine HTML ile deneyin...")
endif
 
Procedure GetDovizKuru(tdDate)
Local lcURL,lcLocalFile,lcXML,ldDate
 
If m.tdDate = Date()
  lcURL = "http://www.tcmb.gov.tr/kurlar/today.xml"
Else
  lcURL =  ;
    "http://www.tcmb.gov.tr/kurlar/"+;
    Left(Ttoc(m.tdDate,1),6)+"/"+;
    PADL(Day(m.tdDate),2,'0')+;
    PADL(Month(m.tdDate),2,'0')+;
    padl(Year(m.tdDate),4)+".xml"
Endif
 
lcLocalFile = Forcepath(Sys(2015)+'.xml',Sys(2023))
If getFileFromURL(m.lcURL,m.lcLocalFile) = 0
  lcXML = Filetostr(m.lcLocalFile)
  Erase (m.lcLocalFile)
  ParseDoviz(m.lcXML)
else
  return .F.
Endif
 
 
Procedure getFileFromURL
  Lparameters tcRemoteFile,tcLocalFile
  Declare Integer URLDownloadToFile In urlmon.Dll;
    INTEGER pCaller, String szURL, String szFileName,;
    INTEGER dwReserved, Integer lpfnCB
  Return URLDownloadToFile(0, m.tcRemoteFile, m.tcLocalFile, 0, 0)
 
 
Procedure ParseDoviz(tcXML)
  Local lcCurrencyCode
  Local Array aReplacement[OCCURS('<Currency ',m.tcXML),2]
  For ix=1 To Occurs('<Currency ',m.tcXML)
    lcCurrencyCode = Strextract(m.tcXML,'<Currency ','>',m.ix,1+4)
    aReplacement[m.ix,1] = m.lcCurrencyCode
    aReplacement[m.ix,2] = ;
      GETWORDNUM(m.lcCurrencyCode,1)+'>'+;
      '<Kod>'+Strextract(Getwordnum(m.lcCurrencyCode,2),'"','"')+'</Kod>'+;
      '<CurrencyCode>'+Strextract(Getwordnum(m.lcCurrencyCode,3),'"','"')+'</CurrencyCode>'
  Endfor
  For ix=1 To Alen(aReplacement,1)
    m.tcXML = Strtran(m.tcXML,aReplacement[m.ix,1],aReplacement[m.ix,2])
  Endfor
  Xmltocursor(m.tcXML,'Doviz')
Endproc

9

Re: TCMB den döviz kurları

teş. hocam

Bilmediğin Neyse Yanıldığındır.

10

Re: TCMB den döviz kurları

cetinbasoz yazdı:
Visual Fox Pro
ldDate = Date(2006,2,20)

 
if GetDovizKuru( Date(2006,2,20) )
  Select doviz
  Browse
else
MessageBox("XML yerine HTML ile deneyin...")
endif
 
Procedure GetDovizKuru(tdDate)
Local lcURL,lcLocalFile,lcXML,ldDate
 
If m.tdDate = Date()
  lcURL = "http://www.tcmb.gov.tr/kurlar/today.xml"
Else
  lcURL =  ;
    "http://www.tcmb.gov.tr/kurlar/"+;
    Left(Ttoc(m.tdDate,1),6)+"/"+;
    PADL(Day(m.tdDate),2,'0')+;
    PADL(Month(m.tdDate),2,'0')+;
    padl(Year(m.tdDate),4)+".xml"
Endif
 
lcLocalFile = Forcepath(Sys(2015)+'.xml',Sys(2023))
If getFileFromURL(m.lcURL,m.lcLocalFile) = 0
  lcXML = Filetostr(m.lcLocalFile)
  Erase (m.lcLocalFile)
  ParseDoviz(m.lcXML)
else
  return .F.
Endif
 
 
Procedure getFileFromURL
  Lparameters tcRemoteFile,tcLocalFile
  Declare Integer URLDownloadToFile In urlmon.Dll;
    INTEGER pCaller, String szURL, String szFileName,;
    INTEGER dwReserved, Integer lpfnCB
  Return URLDownloadToFile(0, m.tcRemoteFile, m.tcLocalFile, 0, 0)
 
 
Procedure ParseDoviz(tcXML)
  Local lcCurrencyCode
  Local Array aReplacement[OCCURS('<Currency ',m.tcXML),2]
  For ix=1 To Occurs('<Currency ',m.tcXML)
    lcCurrencyCode = Strextract(m.tcXML,'<Currency ','>',m.ix,1+4)
    aReplacement[m.ix,1] = m.lcCurrencyCode
    aReplacement[m.ix,2] = ;
      GETWORDNUM(m.lcCurrencyCode,1)+'>'+;
      '<Kod>'+Strextract(Getwordnum(m.lcCurrencyCode,2),'"','"')+'</Kod>'+;
      '<CurrencyCode>'+Strextract(Getwordnum(m.lcCurrencyCode,3),'"','"')+'</CurrencyCode>'
  Endfor
  For ix=1 To Alen(aReplacement,1)
    m.tcXML = Strtran(m.tcXML,aReplacement[m.ix,1],aReplacement[m.ix,2])
  Endfor
  Xmltocursor(m.tcXML,'Doviz')
Endproc


hocam eline sağlık süpersin ya
2 saat kodda neyapmaya çalıştığını anlamak için uğraştım. gecenin 4 de anladığımda birkez daha hayranlığım arttı.

bu arada
  For ix=1 To Alen(aReplacement,1)
    m.tcXML = Strtran(m.tcXML,aReplacement[m.ix,1],aReplacement[m.ix,2])
  Endfor
döngüsünde 32 den sonra hata veriyo kolon devam etmediği için heralde döngüyü 30 sınırladım sorunsuz çalışıyor.

birde vfp8
    lcCurrencyCode = Strextract(m.tcXML,'<Currency ','>',m.ix,1+4)

1+4 flag yok heralde 8 de hata veriyor kaldırdım sorunsuz çalışıyor

çok tşk

11

Re: TCMB den döviz kurları

Eskiden aşağıdaki kodlarla Merkez Bankasından döviz kurlarını çekebiliyordum ama artık hata veriyor.
Önerisi olan veya  bu konuda yeni bir gelişme var mı ?
Şimdiden teşekkürler.

Visual Fox Pro
PROCEDURE DOVIZ

PARAMETERS KURBUL
lcURL = "http://www.tcmb.gov.tr/kurlar/today.xml"
oForm = Createobject('readxml', m.lcURL)
Select Doviz
IF KURBUL=""
    BROWSE
ELSE
    LOCATE FOR ISIM=KURBUL
    IF FOUND()
        DOVIZDEGERI=FOREXSELLING
    ENDIF
ENDIF
USE
RETURN
 
Define Class readxml As Form
Add Object htmlviewer As OleControl With ;
OleClass = 'Shell.Explorer'
 
Procedure Init
Lparameters tcURL
With Thisform.htmlviewer
.Navigate2(m.tcURL)
Do While .ReadyState # 4 && Wait for ready state
EndDo
XMLToCursor(this.htmLVIEWER.Object.Document.XMLDocument.XML,'Doviz')
Return .F.
Endwith
Endproc
Enddefine

12

Re: TCMB den döviz kurları

Yukarida calisan ornekler var zaten. Yine de seninkine benzeyeni ekleyeyim:

Visual Fox Pro
lcURL = "http://www.tcmb.gov.tr/kurlar/today.xml"

lcTemp = Sys(2015)+'.xml'
getfilefromurl(m.lcURL,m.lcTemp)
lcXML = FileToStr(m.lcTemp)
Erase (m.lcTemp)
XMLToCursor(m.lcXML,'Kurlar')
browse
 
Function getfilefromurl
Lparameters lcRemoteFile,lcLocalFile
Local lnReturn
Declare Integer URLDownloadToFile In urlmon.Dll;
  INTEGER pCaller, String szURL, String szFileName,;
  INTEGER dwReserved, Integer lpfnCB
lnReturn = URLDownloadToFile (0, m.lcRemoteFile, m.lcLocalFile, 0, 0)
Return lnReturn=0

13

Re: TCMB den döviz kurları

Çok teşekkürler hocam, elinize ve emeğinize sağlık.