none
Script Component Transform - Variables RRS feed

  • Pergunta

  • Boa tarde,

    Estou com um problema no script component transform do meu dataflow.

     

    Tenho o seguinte codigo:

     

    Imports System

    Imports System.Data

    Imports System.Math

    Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

    Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

    Imports Microsoft.SqlServer.Dts.Runtime

     

    Public Class ScriptMain

    Inherits UserComponent

    Dim counter As Integer

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    counter = counter + 1

    Row.TesteKey = counter

    End Sub

    Public Overrides Sub PreExecute()

    MyBase.PreExecute()

    counter = 0

    'Me.Variables("Nome_variavel")

    'dts.

    End Sub

    End Class

     

     

     

    Pretendo ler o valor de uma variavel global "Nome_variavel" e atribuir o valor a counter.

    Tenho visto varios exemplos como:

     

    1.

    Public Sub Main()
       
    Dim vars As Variables
       Dts.VariableDispenser.LockOneForWrite(
    "AlertAdmin", vars)
       vars("AlertAdmin").Value = True
       Dts.TaskResult = Dts.Results.Success
      End Sub

     

    2.

    Public Sub Main()
       Dts.Variables(
    "AlertAdmin").Value = True
       Dts.TaskResult = Dts.Results.Success
    End Sub

     

     

    Mas nao estou o meu script nao reconhece o 'Dts' o que é necessario para reconhecer o 'Dts' no meu codigo?
    Obrigado

    quarta-feira, 9 de maio de 2007 15:41

Respostas

  • É isso mesmo Pedro o Main só é usado no script task também.. falha minha....

    o que vc precisa é mais ou menos isso:

     

    Public Class ScriptMain

    Inherits UserComponent

    Dim counter As Integer

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    counter = counter + 1

    End Sub

    Public Overrides Sub PreExecute()

    MyBase.PreExecute()

    counter = 0

    End Sub

    Public Overrides Sub PostExecute()

    Me.ReadWriteVariables("teste").Value = counter

    End Sub

    End Class

     

     

    Agora vc precisa brincar com o código e montar sua lógica.

    Abraço

    quinta-feira, 10 de maio de 2007 17:45

Todas as Respostas

  • Pedro, DTS só funciona em Script Task...

     

    para Script  Component vc faz assim...

     

    Imports System

    Imports System.Data

    Imports System.Math

    Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

    Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

    Imports Microsoft.SqlServer.Dts.Runtime

     

    Public Class ScriptMain

    Inherits UserComponent

    Dim counter As Integer

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    counter = counter + 1

    Row.TesteKey = counter

    End Sub

    Public Overrides Sub PreExecute()

    MyBase.PreExecute()

    counter = 0

    If Me.ReadWriteVariables.Contains("Nome_variavel") Then

    Me.ReadWriteVariables("Nome_variavel").Value = counter

    End If

    End Sub

    End Class

     

     

    Abraço

    quarta-feira, 9 de maio de 2007 16:53
  • Obrigado... e como eu no fim actualizo a variavel global? Tipo:

    variavel Global = variavel Global + counter?

     

    é possivel fazer update a uma variavel global á medida que se lê linha a linha?

    o objectivo é ter dataflows a executar em paralelo e usarem sempre o ultimo valor da variavel global...

     

    a variabel global em cause é a Identity de uma tabela... que é actualizada em paralelo com outros dataflows...

    Obrigado!

    quarta-feira, 9 de maio de 2007 17:04
  • é só fazer asim:

     

    Me.ReadWriteVariables("Nome_variavel").Value  = Me.ReadWriteVariables("Nome_variavel").Value + counter

     

    Abraço

    quarta-feira, 9 de maio de 2007 17:22
  • mas em que procedimento?

    Finish? PreExecute?

     

    Em finish dá erro inesperado e em Input0_ProcessInputRow dá:

    "The collection of variables locked for read and write access is not available outside of PostExecute."

     

    como faço isso apenas no final deste transform, depois de concluir todas as linhas?

    quarta-feira, 9 de maio de 2007 17:28
  • Crie um bloco main....

     

    Sub Main()

     

    End Sub

     

     

    faz dentro dele tudo o que vc tem que fazer.

     

    Abraço

    quarta-feira, 9 de maio de 2007 18:09
  • Main não é só usado em script task?

    O que faz disparar o evento main em script component?

    Tem a certeza??

    quinta-feira, 10 de maio de 2007 11:44
  • É isso mesmo Pedro o Main só é usado no script task também.. falha minha....

    o que vc precisa é mais ou menos isso:

     

    Public Class ScriptMain

    Inherits UserComponent

    Dim counter As Integer

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    counter = counter + 1

    End Sub

    Public Overrides Sub PreExecute()

    MyBase.PreExecute()

    counter = 0

    End Sub

    Public Overrides Sub PostExecute()

    Me.ReadWriteVariables("teste").Value = counter

    End Sub

    End Class

     

     

    Agora vc precisa brincar com o código e montar sua lógica.

    Abraço

    quinta-feira, 10 de maio de 2007 17:45