Tema: Re: VBA to T-SQL
Autorius: Raimis
Data: 2013-08-16 16:16:13
Cia aprasyta, kaip padaryti: 
http://www.slxdeveloper.com/page.aspx?action=viewarticle&articleid=103
Pats nebandziau.

"CurrentUser" <ne_toks@yahoo.com> wrote in message 
news:kug7d4$thc$1@trimpas.omnitel.net...
> Sutinku - galimas ir toks variantas. Bet kai funkcija pasiekiama iš 
> bibliotekos, tai daug racionaliau, kadangi nereikia atskirai kiekvienam 
> reikiamam raportui kurti atskiro view'-o, ypač jei recordsource naudojamos 
> tik lenteles.
>
> "Raimis"  wrote in message news:ktq3re$p6d$1@trimpas.omnitel.net...
>
> ....
> Del funkcijos kisimo i dll, tai nelabai suprantu - kam? Galima crystal
> reportui paduoti jau apdirbtus, linksniuotus duomenis per view'a ar stored
> procedure, kuriuose bus panaudota si funkcija.
>
>
>
>
> "CurrentUser" <ne_toks@yahoo.com> wrote in message
> news:kth34c$fn5$1@trimpas.omnitel.net...
>> Vėl puikiai.
>> Dabar viskas ore. O apskritai, tokia abejonė, ar normalu, kai yra ~200 
>> Case, kišti į funkciją (stabdymo nėra?). Gal logiškiau sukišti į lentelę 
>> i per ryšius paimti reikšmę. Aišku, funkciją gali plačiau naudoti. Tik 
>> blogai va, kad neina į dll sudėti - dabar dar nepatogumas bus 
>> kiekvienąkart įkelt į crystal raportą kaip user-defined funkciją.
>>
>> "Raimis"  wrote in message news:ktfoe9$caf$1@trimpas.omnitel.net...
>>
>> Klaida, vykdant funkcija, gali buti del to, kad nepilnai nurodytas 
>> funkcijos
>> vardas - reikia butinai nurodyti owner'i , pvz (owner dbo):
>>
>> SELECT dbo.linksniuotas('vienas', 2)
>>
>>
>>
>> "CurrentUser" <ne_toks@yahoo.com> wrote in message
>> news:kte5ov$8ok$1@trimpas.omnitel.net...
>>> DJ gerb. Raimi,
>>>
>>> Sukišau šį kodą į db, niekas nesikeikia, tai turbūt parašyta 
>>> gramatiškai. Sakau, 'turbūt' todėl, kad negaliu patikrinti: darant kokį 
>>> view'ą keikiasi, kad 'it's not a built-in function. Nežinau, kodėl gi 
>>> jūzerio funkcijos turėtų nepriimti. Tikriausiai todėl, kad aš visapusis 
>>> oluchas: šitos kalbos (T-SQL, C++, Crystal ir pan.) totaliai žalias, 
>>> todėl praleidęs šiąnakt prie googlo padariau išvadą, kad per vėlu jau 
>>> man į šitai lįst. Beieškodamas išeities radau, kad Crystal Reports 
>>> priima ir Basic syntaksę, tai truputį pertvarkęs kodą įkėliau tas (VB) 
>>> funkcijas į ten ir viskas važiuoja. Dabar tik dar viena bėda iškilo, kad 
>>> būtų labai patogu tas funkcijas sukelt į dll, kad būtų pasiekiama kaip 
>>> ir kitos bibliotekos - iš sistemos, bet irgi paryčiais pasidaviau - nėra 
>>> pagrindų, kad suprast kaip ją sukurt.
>>> Tokie va reikalai.
>>>
>>> "Raimis"  wrote in message news:ktaaub$bkb$1@trimpas.omnitel.net...
>>>
>>> Pirmas blynas ...
>>>
>>> Funkcijos naudojimas:
>>> SELECT dbo.linksniuotas('duodu vienas kirtis-gaunu du', 3)
>>>
>>> SQL:
>>>
>>> IF EXISTS (SELECT *
>>>    FROM   sysobjects
>>>    WHERE  name = N'linksnis')
>>> DROP FUNCTION linksnis
>>> GO
>>>
>>> CREATE FUNCTION linksnis(@Zodis nvarchar(1000), @linksnis int)
>>> RETURNS nvarchar(1000)
>>> AS
>>> BEGIN
>>> DECLARE @galune nvarchar(3), @galune_n nvarchar(10)
>>> IF Len(Rtrim(@Zodis))>=3
>>> BEGIN
>>> SELECT @galune = Right(Rtrim(@Zodis),3)
>>>
>>> SELECT @galune_n=
>>>  CASE @galune
>>>   WHEN 'nas' THEN
>>>   CASE @linksnis
>>>    WHEN 1 THEN 'no'
>>>    WHEN 2 THEN 'nui'
>>>    WHEN 3 THEN 'ną'
>>>    WHEN 4 THEN 'nu'
>>>    WHEN 5 THEN 'ne'
>>>    ELSE ''
>>>   END
>>>   WHEN 'tis' THEN
>>>   CASE @linksnis
>>>    WHEN 1 THEN 'čio'
>>>    WHEN 2 THEN 'čiui'
>>>    WHEN 3 THEN 'tį'
>>>    WHEN 4 THEN 'čiu'
>>>    WHEN 5 THEN 'tyje'
>>>    ELSE ''
>>>   END
>>>  ELSE @galune
>>>  END
>>> SELECT @Zodis = Substring(@Zodis, 1,Len(@Zodis) - 3) + @galune_n
>>> END
>>>
>>> RETURN @Zodis
>>> END
>>> GO
>>>
>>> IF EXISTS (SELECT *
>>>    FROM   sysobjects
>>>    WHERE  name = N'linksniuotas')
>>> DROP FUNCTION linksniuotas
>>> GO
>>>
>>> CREATE FUNCTION linksniuotas(@sakinys nvarchar(2000), @linksnis int)
>>> RETURNS nvarchar(2000)
>>> AS
>>> BEGIN
>>>
>>>
>>>
>>>
>>> DECLARE @sakinys_n nvarchar(2000), @Zodis nvarchar(1000)
>>> SELECT @sakinys_n=''
>>>
>>>
>>>
>>> SELECT @sakinys = Rtrim(@sakinys) + ' '
>>>
>>> WHILE CHARINDEX(' ', @sakinys) > 0
>>> Begin
>>> SET @Zodis = LEFT(@sakinys, CHARINDEX(' ', @sakinys))
>>>
>>>
>>> IF CHARINDEX('-',@Zodis)>0
>>> BEGIN
>>>  DECLARE @zod nvarchar(1000), @nsak nvarchar(1000)
>>>  SELECT @zod=  replace(@Zodis,'-',' '), @nsak=''
>>>
>>>
>>>  WHILE CHARINDEX(' ', @zod) > 0
>>>  BEGIN
>>>    SET @Zodis = LEFT(@zod, CHARINDEX(' ', @zod))
>>>    SELECT @nsak =  @nsak + dbo.linksnis(@Zodis, @linksnis) + '-'
>>>    SET @zod = SUBSTRING(@zod,CHARINDEX(' ', @zod)+1,len(@zod))
>>>  END
>>>  SELECT @sakinys_n =  @sakinys_n + ' ' + LEFT(@nsak,LEN(@nsak)-1)
>>> END
>>> ELSE
>>>  BEGIN
>>>    SELECT @sakinys_n =  @sakinys_n + ' ' + dbo.linksnis(@Zodis, 
>>> @linksnis)
>>>  END
>>>
>>> SET @sakinys = SUBSTRING(@sakinys,CHARINDEX(' ', 
>>> @sakinys)+1,len(@sakinys))
>>> End
>>>
>>> RETURN @sakinys_n
>>> END
>>>
>>>
>>>
>>>
>>>
>>>
>>> "CurrentUser" <ne_toks@yahoo.com> wrote in message
>>> news:kt68m1$lhc$1@trimpas.omnitel.net...
>>>> Dedu. Prašymas labai nesityzdavot. Esu tik 'amateur', neturiu jokio IT 
>>>> išsilavinimo, bet kai ką pasidarau dėl automatizacijos. Taigi
>>>>
>>>> Function Linksniavimas(Name, Lin As Integer)
>>>> On Error Resume Next
>>>> Dim ar_su_bruksniu As Integer
>>>>
>>>> ar_su_bruksniu = InStr(1, Name, "-", vbTextCompare) 'nustatoma, ar yra 
>>>> stringe brūkšnys
>>>>    If ar_su_bruksniu > 0 Then 'jei yra brūkšnys
>>>>        Linksniavimas = Bruksnys(Name, Lin) 'su brūkšniu
>>>>    Else                        ' jei nėra brūkšnio
>>>>        Linksniavimas = separate(Name, Lin) 'be brūkšnio
>>>>    End If
>>>>
>>>> End Function
>>>> Function Bruksnys(Name, Lin)
>>>> On Error Resume Next
>>>> Dim pos As Integer
>>>> Dim iki_bruksnio, po_bruksnio
>>>>
>>>>    pos = InStr(Name, "-") 'nustatoma, kur yra brūkšnys
>>>>    iki_bruksnio = Mid(Name, 1, pos - 1) 'paimamas Str iki brūkšnio
>>>>    po_bruksnio = Mid(Name, pos + 1) 'paimamas Str nuo brūkšnio
>>>>
>>>>    Bruksnys = separate(iki_bruksnio, Lin) & "-" & separate(po_bruksnio, 
>>>> Lin) 'viskas linksniuojama ir sujungiama
>>>>
>>>> End Function
>>>>
>>>> Function separate(Name, Lin)
>>>> On Error Resume Next
>>>> Dim num, poz As Integer
>>>>
>>>> If IsNull(Name) Then
>>>>    separate = ""
>>>>    Exit Function
>>>> Else
>>>>    Name = Replace(Name, "-", " ")
>>>>    seka = Split(Name, , , vbTextCompare) 'Išskirstomi stringo žodžiai į 
>>>> Seką
>>>>    For num = 0 To UBound(seka)
>>>>        zodzio_gal = IIf(linksnis(seka(num), Lin) = "", Right(seka(num), 
>>>> 3), linksnis(seka(num), Lin))
>>>>        'suformuojama seka iš naujai gautų žodžių
>>>>        seka(num) = Replace(seka(num), Right(seka(num), 3), zodzio_gal)
>>>>    Next num
>>>> End If
>>>> separate = Trim(Join(seka)) 'sujungiama seka i nauja string'-a
>>>>
>>>> End Function
>>>> 'Identifikuojama galūnė
>>>> Function linksnis(Name, Lin)
>>>> galune = Right(Name, 3)
>>>> Select Case galune
>>>>    Case "nas"
>>>>        linksniai = Array("no", "nui", "ną", "nu", "ne")
>>>>    Case "tis"
>>>>        linksniai = Array("čio", "čiui", "tį", "čiu", "tyje")
>>>>    Case Else
>>>>        linksniai = Array("", "", "", "", "")
>>>>    End Select
>>>>
>>>> linksnis = linksniai(Lin)
>>>>
>>>> End Function
>>>>
>>>> "zZz"  wrote in message news:kt3uii$vrv$1@trimpas.omnitel.net...
>>>>
>>>> Įmesk kodą ;)
>>>>
>>>> "CurrentUser" <ne_toks@yahoo.com> wrote in message 
>>>> news:ks1ht5$tou$1@trimpas.omnitel.net...
>>>>> Sveiki,
>>>>>
>>>>> Kas galetu konvertuoti VBA koda (tokia nedidele 'user function' (50
>>>>> eiluciu)) i SQL Serveriui (2008 R2) suprantama kalba (gal T-SQL, ar 
>>>>> koki
>>>>> biesa - cia as ABS. zalias)?
>>>>> atlygis alumi vln
>>>>>
>>>>> Pagarba.
>>>>>
>>>>
>>>
>>
>