Tema: Re: VBA to T-SQL
Autorius: CurrentUser
Data: 2013-08-14 19:23:17
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.
>>>>
>>>
>>
>