Хьюстон
Joined: 19 Oct 2007 Posts: 1 Location: Хардырбиев Occupation: Урсам Interests: Урсамович
|
Posted: 19 Oct 2007 20:32 Post subject: Курсы валют чз Интернет в Б4+ |
|
|
// Всем нуждающимся посвящается !
// замечания принимаются по адресу 43valery@mail.ru
Code: |
#include "s_public.ch"
#include "set.ch"
#include "s_refer.ch"
#include "inkey.ch"
#include "my.ch"
Function OldCurs()
Local aSet := SaveSet()
Local nTop := 4,nBottom:=21
Local cBoxHead := 'БЭСТ: Курсы валют [Интернет версия] 1.01'
Local cHead:=' Справочник курсов валют '
Local cColHead:={'Валюта Дата Курс ' }
Local aHeads:={{'Код валюты.................: ','Valuta'},;
{'Дата установки ............: ','Date'},;
{'Курс к основной валюте.... : ','VCurs'} }
Local aBlockCols := { { {|| Valuta}, 1 },;
{ {|| Date }, 8 },;
{ {|| vCurs }, 18 } ;
}
Local aWhen := {{|| nApp != 1 },{|| nApp != 1 }}
Local aValid := {,,{|| !Empty(aIn[3]) }}
Local aPict := {,,'9999999.9999'}
Local aRef := {'RefVal'}
Local nUniMode := 2
Local bDelInit := {|| IsDel()}
Local bScrInit
Local aSortSeek:={;
{'По валютам и датам',{'Введите код валюты.:',;
' и дату.....:'},{'Valuta','DATE'},;
"UPPER(aIn[1])+DTOS(aIn[2])",{'XXX','@D 99/99/99'},,,'VALUTA' },;
{'По датам и валютам', {'Введите дату.......:',;
' и код валюты.:'},{'DATE','Valuta'},;
"DTOS(aIn[1])+UPPER(aIn[2])",{'@D 99/99/99',"XXX"},,,'DATE' } ;
}
Local aPrintHeads:={'Справочник курсов валют','Код','Дата','Курс'}
Local cCurProc
Local bPost ,bDelPost ,aGetBlock ,bColor ,bColor1 ,;
nLeftBrd ,bScrPost ,cFindMacro,cCol_Browse,lYesClear ,;
bPreGet ,bPostGet ,nTag ,nDispRow ,aHotKey ,;
bRestSave,bPostRead,lSubIndex ,bSayHead ,bKeyHead
bPreGet := {|| if( nApp==2 ,(aIn[2] := Date(),aIn[3] := 0.0000),) }
ScrMain()
ScrTitul(1,cBoxHead)
ScrTitul(24,;
"┘:Изм F2:Узнать F3:Сорт F4:Ввод F5:Обновить F6:Фильтр F7:Пск F8:Удалить")
ShadowBox(cHead,3,20,22,60,COL_BROWSE)
if m_Open_Base( {'Valuta','vCurs','Plan0','Main'} )
UT_SetFilter('Upper(Code) != GlobalValuta','Valuta')
MakeRefer("RefVal","Валюта",1,{"Код","Наименование"},{4,43,12},COL_REFER, {"Code"},{"aIn[1]"},"aIn[1]")
SetKey(K_F5 ,{|| IRefresh() })
SetKey(K_F2 ,{|| IKnown() })
Select vCurs
InitList(nTop,nBottom,cColHead,aBlockCols,cCurProc,aHeads,aRef,;
aPict,aWhen,aValid,nUniMode,bDelInit,bScrInit,aSortSeek,aPrintHeads,;
bPost ,bDelPost ,aGetBlock ,bColor ,bColor1 ,;
nLeftBrd ,bScrPost ,cFindMacro,cCol_Browse,lYesClear ,;
bPreGet ,bPostGet ,nTag ,nDispRow ,aHotKey ,;
bRestSave,bPostRead,lSubIndex ,bSayHead ,bKeyHead )
ClearRefer()
m_Close_Base( {'Valuta','vCurs','Plan0','Main'} )
endif
RestSet(aSet)
Return NIL
static Function IsDel()
Local OldSel := Select()
Local lResult
Begin Sequence
lResult := .f.
Main->(__dbLocate( {|| Upper( Main->Valuta ) == Upper(vCurs->Valuta).and.Main->DataOper == vCurs->Date},,,, .F. ))
if Found()
SayError( "Значение курса использовано в проводках" )
Break
endif
Plan0->(__dbLocate( {|| Upper( Plan0->Valuta ) == Upper(vCurs->Valuta).and.Plan0->Date - 1 == vCurs->Date},,,, .F. ))
if Found()
SayError( "Значение курса использовано в вступительном балансе" )
Break
endif
lResult := .t.
End Sequence
Select( OldSel)
Return (lResult)
Static Function IRefresh()
Local aSet:={SaveSet(),SaveSetKey()}
Local GetList := {},oGet
Local OldDateFormat:=Set(_SET_DATEFORMAT,"dd.mm.yyyy")
Local nTop := 10,nLeft := 10,nBottom:=16,nRight:=71
Local nOff := 29
Local xmlDoc,nodeList,xmlNode,node_attr
Local url_request
Local iIndex,iEnd,i,n
Local bDate,eDate
Local cDate,dDate,cCurs,nCurs,cCode,cName,xDate
Local aPrev := NIL
Private aDop:={;
{.T.," Да "},;
{.F.," Нет "} ;
}
Private aIn:=Array(5)
Private aCBR := {; // 12345678901234567890
{'R01235',"Доллар США "};
}
aIn[1] := vCurs->Valuta
aIn[2] := 'R01235'
aIn[3] := Bom(Date())
aIn[4] := Date()
aIn[5] := .f.
Begin Sequence
TRY
xmlDoc := CreateObject( "MSXML2.DomDocument" )
CATCH
TRY
xmlDoc := CreateObject( "MSXML2.DomDocument.4.0" )
CATCH
SayError( "MsXml2 не доступен!")
Break
END
END
xmlDoc:async := .f.
url_request := "http://www.cbr.ru/scripts/XML_val.asp?d=0"
Busy(.T.,"Запрос справочника валют")
if !xmldoc:Load(url_request)
SayError("Cправочник валют не загружен !")
Busy(.F.)
Break
end
Busy(.F.)
NodeList := xmldoc:selectNodes("*/Item")
iEnd := NodeList:length - 1
if iEnd < 0
SayError( "Справочник валют не загружен !")
Break
endif
aCBR := {}
For iIndex := 0 To iEnd
xmlNode := NodeList:Item(iIndex):cloneNode(.t.)
cCode := xmlNode:Attributes(0):Value // Код валюты
cName := AnsiToOem(xmlNode:childNodes(0):Text) // Наименование
cName := Left(cName,30)
cName := Padr(cName,30)
aadd(aCBR,{cCode,cName})
next
ShadowBox("",nTop,nLeft,nBottom,nRight,COL_INPUT,)
// 12345678901234567890123456789
@ nTop+1,nLeft +1 Say "Валюта БЭСТ :" Color 'w/bg'
@ nTop+2,nLeft +1 Say "Валюта ЦБР :" Color 'w/bg'
@ nTop+3,nLeft +1 Say "Начальная дата дд.мм.гггг :" Color 'w/bg'
@ nTop+4,nLeft +1 Say "Конечная дата дд.мм.гггг :" Color 'w/bg'
@ nTop+5,nLeft +1 Say "Дополнять вых. и пр. дни :" Color 'w/bg'
@ nTop+1,nLeft+nOff REFER 'RefVal' GET aIn[1] PICTURE "XXX" Color COL_GET
oGet:=GETNEW(nTop+2,nLeft+nOff,{|x|IF(x=NIL,aIn[2],aIn[2] := aCBR[1])})
oGet:block:={|x|RotateBlock(x,aCBR,'aIn[2]')}
oGet:reader := {|x|RotateAndReader(x,aCBR) }
oGet:ColorSpec := COL_GET
AADD(GetList, oGet)
@ nTop+3,nLeft+nOff GET aIn[3] PICTURE "@D" Color COL_GET VALID aIn[3] <= aIn[4]
@ nTop+4,nLeft+nOff GET aIn[4] PICTURE "@D" Color COL_GET VALID aIn[4] >= aIn[3]
oGet:=GETNEW(nTop+5,nLeft+nOff,{|x|IF(x=NIL,aIn[5],aIn[5] := aDop[1])})
oGet:block:={|x|RotateBlock(x,aDop,'aIn[5]')}
oGet:reader := {|x|RotateAndReader(x,aDop) }
oGet:ColorSpec := COL_GET
AADD(GetList, oGet)
AEVAL( GetList, {|x| x:Display() } )
SetCursor(1)
READ
SetCursor(0)
if LastKey() != K_ESC.and. YesOrNo({"Запросить курсы валюты "+aIn[1]+ " ?",;
"Период запроса с "+Dtoc(aIn[3])+" по "+Dtoc(aIn[4])},,,,,,COL_BROWSE)
bDate := DTOC(aIn[3])
eDate := DTOC(aIn[4])
url_request := "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1="+bDate+"&date_req2="+eDate+"&VAL_NM_RQ="+aIn[2]
Busy(.T.,"Выполнение запроса")
if !xmldoc:Load(url_request)
SayError("Курсы валют не загружены !")
Busy(.F.)
Break
end
Busy(.F.)
NodeList := xmldoc:selectNodes("*/Record")
iEnd := NodeList:length - 1
if iEnd < 0
SayError( "Курсы валют не загружены !")
Break
endif
Busy(.T.,"Обработка результата запроса")
For iIndex := 0 To iEnd
xmlNode := NodeList:Item(iIndex):cloneNode(.t.)
cDate := xmlNode:Attributes(0):Value // Дата
cCode := xmlNode:Attributes(1):Value // Код валюты
cCurs := xmlNode:childNodes(1):Text // Курс
cCurs := StrTran( cCurs, ',','.')
nCurs := Val(cCurs)
dDate := CTOD(cDate)
altd()
if aIn[5].and.aPrev != NIL
if dDate != aPrev[1] + 1
xDate := aPrev[1] + 1
while xDate != dDate
if vCurs->(dbSeek( Upper(aIn[1])+DTOS(xDate) ))
if vCurs->(RecLock())
vCurs->vCurs := aPrev[2]
vCurs->(dbUnLock())
endif
else
if vCurs->(AddRec())
vCurs->Valuta := aIn[1]
vCurs->Date := xDate
vCurs->vCurs := aPrev[2]
vCurs->(dbUnLock())
endif
endif
xDate++
enddo
endif
endif
aPrev := {dDate,nCurs}
if vCurs->(dbSeek( Upper(aIn[1])+DTOS(dDate) ))
if vCurs->(RecLock())
vCurs->vCurs := nCurs
vCurs->(dbUnLock())
endif
else
if vCurs->(AddRec())
vCurs->Valuta := aIn[1]
vCurs->Date := dDate
vCurs->vCurs := nCurs
vCurs->(dbUnLock())
endif
endif
next
vCurs->(dbSeek( Upper(aIn[1])+DTOS(aIn[3]) ))
// vCurs->(dbGoTop())
Busy(.F.)
SayAndWait("Курсы валюты "+aIn[1]+ " обновлены успешно.")
endif
End Sequence
Set(_SET_DATEFORMAT,OldDateFormat)
RestSet(aSet[1])
RestSetKey(aSet[2])
Return NIL
static Function UT_SetFilter(cFilter,cAlias,cFocus)
cAlias := if(cAlias == NIL,,cAlias)
cFocus := if(cFocus == NIL,,cFocus )
cFilter := if(cFilter == NIL,,cFilter )
if Empty(cFilter)
Return .f.
end
if !Empty(cAlias)
dbSelectArea(cAlias)
end
if !Empty(cFocus)
OrdSetFocus(cFocus)
end
dbSetFilter({|| &cFilter}, cFilter)
dbGoTop()
Return .t.
Static Function IKnown()
Local aSet:={SaveSet(),SaveSetKey()}
Local GetList := {},oGet
Local OldDateFormat:=Set(_SET_DATEFORMAT,"dd.mm.yyyy")
Local nTop := 10,nLeft := 10,nBottom:=13,nRight:=71
Local nOff := 29
Local xmlDoc,nodeList,xmlNode,node_attr
Local url_request
Local iIndex,iEnd,i,n
Local bDate,eDate
Local cDate,dDate,cCurs,nCurs,cCode,cName,xDate
Local aPrev := NIL
Private aIn:=Array(2)
Private aCBR := {; // 12345678901234567890
{'R01235',"Доллар США "};
}
aIn[1] := 'R01235'
aIn[2] := Date()
Begin Sequence
TRY
xmlDoc := CreateObject( "MSXML2.DomDocument" )
CATCH
TRY
xmlDoc := CreateObject( "MSXML2.DomDocument.4.0" )
CATCH
SayError( "MsXml2 не доступен!")
Break
END
END
xmlDoc:async := .f.
url_request := "http://www.cbr.ru/scripts/XML_val.asp?d=0"
Busy(.T.,"Запрос справочника валют")
if !xmldoc:Load(url_request)
SayError("Cправочник валют не загружен !")
Busy(.F.)
Break
end
Busy(.F.)
NodeList := xmldoc:selectNodes("*/Item")
iEnd := NodeList:length - 1
if iEnd < 0
SayError( "Справочник валют не загружен !")
Break
endif
aCBR := {}
For iIndex := 0 To iEnd
xmlNode := NodeList:Item(iIndex):cloneNode(.t.)
cCode := xmlNode:Attributes(0):Value // Код валюты
cName := AnsiToOem(xmlNode:childNodes(0):Text) // Наименование
cName := Left(cName,30)
cName := Padr(cName,30)
aadd(aCBR,{cCode,cName})
next
ShadowBox("",nTop,nLeft,nBottom,nRight,COL_INPUT,)
// 12345678901234567890123456789
@ nTop+1,nLeft +1 Say "Валюта ЦБР :" Color 'w/bg'
@ nTop+2,nLeft +1 Say "Дата запроса дд.мм.гггг :" Color 'w/bg'
oGet:=GETNEW(nTop+1,nLeft+nOff,{|x|IF(x=NIL,aIn[1],aIn[1] := aCBR[1])})
oGet:block:={|x|RotateBlock(x,aCBR,'aIn[1]')}
oGet:reader := {|x|RotateAndReader(x,aCBR) }
oGet:ColorSpec := COL_GET
AADD(GetList, oGet)
@ nTop+2,nLeft+nOff GET aIn[2] PICTURE "@D" Color COL_GET
AEVAL( GetList, {|x| x:Display() } )
SetCursor(1)
READ
SetCursor(0)
if LastKey() != K_ESC.and. YesOrNo({"Запросить курс валюты ?",;
"Запрос на "+Dtoc(aIn[2])},,,,,,COL_BROWSE)
bDate := DTOC(aIn[2])
eDate := DTOC(aIn[2])
url_request := "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1="+bDate+"&date_req2="+eDate+"&VAL_NM_RQ="+AllTrim(aIn[1])
Busy(.T.,"Выполнение запроса")
if !xmldoc:Load(url_request)
SayError("Курс валюты не загружены !")
Busy(.F.)
Break
end
Busy(.F.)
NodeList := xmldoc:selectNodes("*/Record")
iEnd := NodeList:length - 1
if iEnd < 0
SayError( "Курс валюты не найден !")
Break
endif
Busy(.T.,"Обработка результата запроса")
For iIndex := 0 To iEnd
xmlNode := NodeList:Item(iIndex):cloneNode(.t.)
cDate := xmlNode:Attributes(0):Value // Дата
cCode := xmlNode:Attributes(1):Value // Код валюты
cCurs := xmlNode:childNodes(1):Text // Курс
cCurs := StrTran( cCurs, ',','.')
nCurs := Val(cCurs)
dDate := CTOD(cDate)
Next
Busy(.F.)
SayAndWait({"Курс валюты на "+Dtoc(aIn[2]) +" = "+ cCurs })
endif
End Sequence
Set(_SET_DATEFORMAT,OldDateFormat)
RestSet(aSet[1])
RestSetKey(aSet[2])
Return NIL |
|
|