делаем функцию в базе
Код: Выделить всё
ALTER function [LSDBO].[Ric_Get_Zodiac]
/*вернуть строку со знаком зодиака, дату привести к текущему году*/
(@bDate datetime --День рождения
)
--Returns xml
Returns varchar(255)
Begin
Declare @uName varchar(255),
@bsDate varchar(10),
@Rd int,
@d int,
@m int
Set @d = DAY(@bDate)
Set @m = MONTH(@bDate)
Set @bsDate = ltrim(left(CONVERT (varchar,@bDate,104),6)+ Convert(varchar,year(GETDATE())))
Set @Rd=DATEDIFF(day, GETDATE(),CONVERT(datetime, @bsDate, 104))
--если день рождения уже прошел - увеличить год на 1
if @Rd<0 begin
Set @bsDate = left(CONVERT (varchar,@bDate,104),6)+ Convert(varchar,year(GETDATE())+1)
Set @Rd=DATEDIFF(day,GETDATE(),CONVERT(datetime, @bsDate, 104))
end
Select @uName=
Case
When (@m=3 AND @d>20) OR (@m=4 AND @d<21) Then '<En>Aries</En><Ru>Овен</Ru><Ch>94</Ch>'
When (@m=4 AND @d>20) OR (@m=5 AND @d<21) Then '<En>Taurus</En><Ru>Телец</Ru><Ch>95</Ch>'
When (@m=5 AND @d>20) OR (@m=6 AND @d<22) Then '<En>Gemini</En><Ru>Близнецы</Ru><Ch>96</Ch>'
When (@m=6 AND @d>21) OR (@m=7 AND @d<23) Then '<En>Cancer</En><Ru>Рак</Ru><Ch>97</Ch>'
When (@m=7 AND @d>22) OR (@m=8 AND @d<24) Then '<En>Leo</En><Ru>Лев</Ru><Ch>98</Ch>'
When (@m=8 AND @d>23) OR (@m=9 AND @d<24) Then '<En>Virgo</En><Ru>Дева</Ru><Ch>99</Ch>'
When (@m=9 AND @d>23) OR (@m=10 AND @d<24) Then '<En>Libra</En><Ru>Весы</Ru><Ch>100</Ch>'
When (@m=10 AND @d>23) OR (@m=11 AND @d<23) Then '<En>Scorpio</En><Ru>Скорпион</Ru><Ch>101</Ch>'
When (@m=11 AND @d>22) OR (@m=12 AND @d<22) Then '<En>Sagittarius</En><Ru>Стрелец</Ru><Ch>102</Ch>'
When (@m=12 AND @d>21) OR (@m=1 AND @d<21) Then '<En>Capricorn</En><Ru>Козерог</Ru><Ch>103</Ch>'
When (@m=1 AND @d>20) OR (@m=2 AND @d<21) Then '<En>Aquarius</En><Ru>Водолей</Ru><Ch>104</Ch>'
When (@m=2 AND @d>20) OR (@m=3 AND @d<21) Then '<En>Pisces</En><Ru>Рыбы</Ru><Ch>105</Ch>'
End
--вернуть строку формата строки/xml
--<Bd> - день и месяц рождения + год (текущий или следующий)
--<Rd> - осталось до дня рождения
--<En> - наименование знака гороскопа по англицки
--<Ru> - наименование знака гороскопа по русски
--<Ch> - код знака зодиака для функции Char (шрифт Windings)
-- Return convert (xml,'<Zodiac><Bd>'+left(@bsDate,10)+'</Bd><Rd>'+CONVERT(varchar,@Rd)+'</Rd>' + @uName+'</Zodiac>')
Return '<Zodiac><Bd>'+left(@bsDate,10)+'</Bd><Rd>'+CONVERT(varchar,@Rd)+'</Rd>' + @uName+'</Zodiac>'
End
Код: Выделить всё
Dim XML
Sub Goroskop()
Dim xmlHTTP, Root, Find, Node, t,url
Dim Desc, gA, gB, gF,mD,UserName, sel,tmp
tmp = LsVars.GetVarValue("tmp")
find=lCase(mid(tmp,InStr(1,tmp,"<En>")+4,InStr(1,tmp,"</En>")-(InStr(1,tmp,"<En>")+4))) 'достанем англоязычное название знака
md = FormatDateTime(Now(), 2)
md = Right("0000" + CStr(Year(md)), 4) + Right("00" + CStr(Month(md)), 2) + Right("00" + CStr(Day(md)), 2)
' md = Right("0000" + CStr(Year(Now())), 4) + Right("00" + CStr(Month(Now())), 2) + Right("00" + CStr(Day(Now())), 2)
url = "http://i.horo.ru/rss/" & Find & ".xml" 'сформируем адрес
Set XML = CreateObject("Msxml.DOMDocument")
XML.async = False
If Not XML.Load(url) = True Then
MsgBox "Документ не загружен" '& vbcr & url
Exit Sub
Else
Set Root = XML.documentElement
For Each Node In Root.GetElementsByTagName("channel")
Desc = Node.childNodes(2).Text 'прочитаем заголовок
Next
For Each Node In Root.GetElementsByTagName("item") 'прочитаем 3 гороскопа
If Left(Node.childNodes(1).Text, Len(Node.childNodes(1).Text) - 2) = "http://www.ignio.com/r/daily/?rss" & mD Then gA = Node.childNodes(2).Text
If Left(Node.childNodes(1).Text, Len(Node.childNodes(1).Text) - 2) = "http://www.ignio.com/r/dailybus/?rss" & mD Then gB = Node.childNodes(2).Text
If Left(Node.childNodes(1).Text, Len(Node.childNodes(1).Text) - 2) = "http://www.ignio.com/r/dailycook/?rss" & mD Then gF = Node.childNodes(2).Text
Next
End If
Set Root = Nothing
Set XML = Nothing
find=mid(tmp,InStr(1,tmp,"<Rd>")+4,InStr(1,tmp,"</Rd>")-(InStr(1,tmp,"<Rd>")+4))
if find=0 then
find="Поздравляем с днем рождения!!!"
else
find="До Вашего дня рождения осталось всего "+find+" д."
end if
Код: Выделить всё
z_data = AttribGetDefault ( User_Obj , LinkID_0 , z_data_atr , today() )
tmp = Set ( f_ExecSQLSelect_2 ( 'select lsdbo.ric_get_zodiac(~''+string(z_data ,'yyyy.mm.dd')+'~')' , '' , '' ) )
Код: Выделить всё
f_ExecSQLSelect_3 ( 'select lsdbo.ric_get_zodiac(~''+string(a100000006300005,'yyyy.mm.dd')+'~')' , '' , '' , '' , 10)
русское название
Код: Выделить всё
mid(zodiac,pos(zodiac,'<Ru>',1)+4,pos(zodiac,'</Ru>',1)-(pos(zodiac,'<Ru>',1)+4))
Код: Выделить всё
Char( number(mid(zodiac,pos(zodiac,'<Ch>',1)+4,pos(zodiac,'</Ch>',1)-(pos(zodiac,'<Ch>',1)+4)) ) )
Код: Выделить всё
select * from LSDBO.Ric_Get_ePersonnel(:id) order by ffio
Код: Выделить всё
......Select *
From
(Select isobject_id, fFIO, fID, uCn from LSDBO.Ric_Get_Personnel(@ObjID) /*where dMnemo='Подч'*/) as tPersonnel
left join
(Select
(select lsdbo.ric_get_zodiac(vv6.value)) as fBdDate, --День рождения
vv7.value as fStatus, --Статус ...........
....
два важных момента
1й - дата передаваемая в процедуру в виде строки должна быть отформатирована как в атрибуте или так 'dd.mm.yyyy' или так 'yyyy.mm.dd'
2й - гороскоп гораздо позитивнее первого варианта (другой сайт) - и что характерно - он действительно работает







да и 3й момент
конечно мы обратились к администрации сайта с гороскопами и они любезно согласились на то что мы используем их контент (нас правда мало....) так что перед плотным использованием лучше спросить разрешение у них - а то отключат нафиг всех



