|
Slujbi dla MsSQL na FoxPro.
#32308693
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
|
|
|
Почитать можно вот тут
http://vfpdev.narod.ru/docs/mtscom_r.html
Привожу VFP и затем TSQL код. За качество извиняюсь..., потому как на скорую руку на шлепал...
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178.
*/////////////////////////////////////////////////////////////
* coclass downloading exchange rate from CBR
*/////////////////////////////////////////////////////////////
#DEFINE LOGFILE "c:\Temp\Vfpcom.log"
#DEFINE METHODLEN 13
#DEFINE MTXAPPSRV "MTxAS.AppServer.1 "
DEFINE CLASS ExchangeRate AS SESSION OLEPUBLIC
PROTECTED oCtx
IMPLEMENTS IObjectControl IN "comsvcs.dll"
*****************************************************************
PROTECTED PROCEDURE IObjectControl_Activate() AS VOID;
HELPSTRING "Called when this object is Activated"
* THIS.GetObjectContext()
* This.WriteToLog( "Activate()" )
ENDPROC
PROTECTED PROCEDURE IObjectControl_Deactivate() AS VOID;
HELPSTRING "Called when this object is Deactivated"
* This.WriteToLog( "Deactivate()" )
* THIS.oCtx = NULL
ENDPROC
PROTECTED PROCEDURE IObjectControl_CanBePooled() AS Number;
HELPSTRING "Called when deactivated to see if this object can be pooled."
* This.WriteToLog( "CanBePooled()" )
RETURN .F.
ENDPROC
************************************************
PROTECTED FUNCTION GetObjectContext()
IF VARTYPE(THIS.oCtx) # 'O'
LOCAL loMtx
loMtx = CREATEOBJECT(MTXAPPSRV)
IF VARTYPE(loMtx) = 'O'
THIS.oCtx = loMtx.GetObjectContext()
ENDIF
ENDIF
RETURN (VARTYPE(THIS.oCtx) = 'O')
ENDFUNC
****************************************************
PROTECTED FUNCTION SetComplete(tbResult)
IF VARTYPE(THIS.oCtx) = 'O'
IF tbResult
THIS.oCtx.SetComplete()
ELSE
THIS.oCtx.SetAbort()
ENDIF
RETURN .T.
ELSE
RETURN .F.
ENDIF
ENDFUNC
***************************************************
PROTECTED FUNCTION WriteToLog(tcMethod)
IF VARTYPE(tcMethod) # 'C'
tcMethod = '(Unknown)'
ENDIF
tcMethod = PADR(tcMethod, METHODLEN)
*
* -- See Q261096 in MSDN
LOCAL lcObjectContextInfo
IF VARTYPE(THIS.oCtx) = 'O'
lcObjectContextInfo = "Yes " ;
+ TRANSFORM(THIS.oCtx.ContextInfo.GetContextId())
ELSE
lcObjectContextInfo = "No"
ENDIF
STRTOFILE(TTOC(DATETIME()) ;
+ " ThreadID: " + TRANSFORM(THIS.GetThreadID(), '9999') ;
+ " " + tcMethod + " fired! ObjectContext: " ;
+ lcObjectContextInfo ;
+ CHR( 13 ) + CHR( 10 ) , LOGFILE, .T.)
ENDFUNC
*********************
*** get currency from CBR
FUNCTION GetRateValueFromRBC(CurrencyCode as String,cYMDDate as String) as String
SET DATE TO YMD
SET CENTURY ON
lcData =this.ReadUrl([http://cbrates.rbc.ru/tsv/]+;
ALLTRIM(CurrencyCode)+ "/" +;
IIF(TYPE( "cYMDDate" ) <> [C],DTOC(DATE()),ALLTRIM(cYMDDate))+ ".tsv" )
LOCAL ARRAY laWords[ 1 ]
lnaCount = ALINES(laWords,lcData,.T.,CHR( 9 ))
IF lnaCount <> 2 OR VAL(laWords[ 2 ]) = 0
RETURN "0 "
ELSE
RETURN TRANSFORM(VAL(laWords[ 2 ])/VAL(laWords[ 1 ]))
ENDIF
ENDPROC
*********************
*** get currency from CBR
FUNCTION GetXMLDataFromCBR() as String
SET DATE TO BRITISH
SET CENTURY ON
RETURN STRTRAN(this.ReadUrl(;
[http://www.cbr.ru/scripts/XML_daily.asp?date_req=]+DTOC(DATE())), "," , "." )
ENDPROC
****************************
PROTECTED FUNCTION ReadUrl
LPARAMETERS UrlName
DECLARE INTEGER InternetOpen IN wininet.DLL STRING sAgent, ;
INTEGER lAccessType, STRING sProxyName, ;
STRING sProxyBypass, INTEGER lFlags
DECLARE INTEGER InternetOpenUrl IN wininet.DLL ;
INTEGER hInternetSession, STRING sUrl, STRING sHeaders, ;
INTEGER lHeadersLength, INTEGER lFlags, INTEGER lContext
DECLARE INTEGER InternetReadFile IN wininet.DLL INTEGER hfile, ;
STRING @sBuffer, INTEGER lNumberofBytesToRead, INTEGER @lBytesRead
DECLARE short InternetCloseHandle IN wininet.DLL INTEGER hInst
#DEFINE INTERNET_OPEN_TYPE_PRECONFIG 0
#DEFINE INTERNET_OPEN_TYPE_DIRECT 1
#DEFINE INTERNET_OPEN_TYPE_PROXY 3
#DEFINE SYNCHRONOUS 0
#DEFINE INTERNET_FLAG_RELOAD 2147483648
sAgent = "VFP 8 . 0 "
hInternetSession = InternetOpen(sAgent, INTERNET_OPEN_TYPE_PRECONFIG, ;
'', '', SYNCHRONOUS)
IF hInternetSession = 0
RETURN ''
ENDIF
hUrlFile = InternetOpenUrl(hInternetSession, UrlName, '', ;
0 , INTERNET_FLAG_RELOAD, 0 )
IF hUrlFile = 0
RETURN ''
ENDIF
LOCAL lcFile
lcFile = ""
DO WHILE .T.
* set aside a big buffer
sReadBuffer = SPACE( 32767 )
lBytesRead = 0
m.OK = InternetReadFile(hUrlFile, @sReadBuffer, ;
LEN(sReadBuffer), @lBytesRead)
* error trap - either a read failure or read past eof()
lcFile = lcFile + sReadBuffer
IF m.OK = 0 OR lBytesRead = 0
EXIT
ENDIF
ENDDO
* close all the handles we opened
=InternetCloseHandle(hUrlFile)
=InternetCloseHandle(hInternetSession)
RETURN ALLTRIM(lcFile)
ENDFUNC
*******************
PROTECTED FUNCTION SystemMessage
LPARAMETERS lcTitle,lcMes
DECLARE INTEGER MessageBox IN WIN32API as mgb integer,string,string,integer
mgb( 0 ,lcTitle,lcMes, 0 )
ENDFUNC
ENDDEFINE
Использование на TSQL
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
ALTER PROCEDURE dbo.GetCurrencyFromRBC
AS
DECLARE @object int
DECLARE @hr int
declare @nValue varchar( 100 )
declare @cDate varchar( 10 ) ,@cCurCode varchar( 10 ),
@iCurID int
EXEC @hr = sp_OACreate 's_components.exchangerate', @object OUT
if @hr <> 0
begin
raiserror 99999 'no creation'
return
end
declare curValut cursor local static
for select ID,Curr_Code from CurrencyMain where Curr_Code != ''
open curValut
while ( 1 = 1 )
begin
fetch next from curValut into @iCurID,@cCurCode
if @@fetch_status <> 0
break
set @cDate = convert(varchar( 10 ),getdate()+ 1 , 111 )
EXEC @hr = sp_OAMethod @object, 'GetRateValueFromRBC', @nValue OUT,@cCurCode,@cDate
if @hr <> 0
begin
raiserror 99999 'no execution'
EXEC @hr = sp_OADestroy @object
return
end
set @cDate = convert(varchar( 10 ),getdate()+ 1 , 112 )
if cast(@nValue as numeric( 10 , 4 )) = 0
continue
if not exists (select * from Currency where Curr_ID = @iCurID
and Start_date = @cDate)
insert Currency( Curr_ID,Start_time,Curr_value)
select @iCurID,@cDate,cast(@nValue as numeric( 10 , 4 ))
else
Update Currency
set Curr_value = cast(@nValue as numeric( 10 , 4 ))
where Curr_ID=@iCurID and Start_date= @cDate
end
EXEC @hr = sp_OADestroy @object
|
|
|