Classe de gravação de dados em VB.NET
Os recursos para desenvolvedores que o Kankei proporciona são bastante completos e produtivos na maioria das situações. No entanto, quando se trata da gravação de um número muito grande de registros, você pode querer manter distância da classe de gravação tradicional do Kankei (ckaRecordset, a classe retornada pelo método K.BD.NovaGravacao).
O grande problema do ckaRecordset é que ele vai guardando os dados em memória até que o usuário chame o método Gravar(). Somente neste momento é que o Kankei envia as instruções de gravação ao banco de dados. Isso quer dizer que se você precisa gravar uma lista de 1000 registros, o sistema irá manter em memória todos os dados destes 1000 registros.
E os dados também não são eliminados da memória após a execução do método Gravar(), pois o ckaRecordset oferece a funcionalidade de você percorrer os dados que você gravou, podendo obter informações como o record ID de cada registro que foi inserido.
A nossa sugestão, nesse tipo de situação, é utilizar a classe de gravação de dados mais básica do Kankei, o cksHCD. Na verdade, o ckaRecordset utiliza internamente o cksHCD para fazer a gravação de seus dados.
Vamos imaginar uma dimensão chamada "Clientes" que tenha 4 questões: "Nome" (texto), "Sexo" (opções), "Nascimento" (data) e "Salário" (número). Utilizando o VB.NET, podemos escrever uma classe como esta:
Imports KankeiObjects
''' <summary>
''' Os valores dos itens do enumerador são as Keys das opções da questão "Sexo"
''' </summary>
Public Enum Sexo
Masculino = 1
Feminino = 2
End Enum
''' <summary>
''' Gravador de clientes, que permite a gravação de dados sem manter os dados
''' já gravados em cache
''' </summary>
Public Class GravadorDeClientes
Private _hcd As cksHCD
Public Sub New(ByVal K As ckpGlobal)
' O objeto HCD precisa ser criado pelo método K.CreateObject
_hcd = DirectCast(K.CreateObject("KankeiObjects.cksHCD"), cksHCD)
' Adiciona os identificadores das questões ao HCD
_hcd.AdicionarCampoEx("cli-Nome")
_hcd.AdicionarCampoEx("cli-Sexo")
_hcd.AdicionarCampoEx("cli-Nascimento")
_hcd.AdicionarCampoEx("cli-Salario")
End Sub
Public Sub NovoRegistro()
_hcd.InicializarDados() ' Inicializa o objeto, limpando o cache
_hcd.NovoRegistroEx() ' Prepara a inclusão de um registro
End Sub
Public Sub AlterarRegistro(ByVal id As Integer)
_hcd.InicializarDados() ' Inicializa o objeto, limpando o cache
_hcd.NovoRegistroEx(, , id) ' Prepara para alterar o registro informado
End Sub
Public Function Gravar() As Integer
_hcd.Gravar() ' Envia as instruções de gravação ao banco de dados
Return _hcd.GetRecordID() ' Retorna o ID do registro que foi gravado
End Function
Public WriteOnly Property Nome() As String
Set(ByVal value As String)
_hcd.ReceberDadoEx("cli-Nome", , , value)
End Set
End Property
Public WriteOnly Property Sexo() As Sexo
Set(ByVal value As Sexo)
' Informa ao HCD para entender o valor como uma key de opção da questão "cli-Sexo"
_hcd.ReceberDadoEx("cli-Sexo", , enmHCDSpecialData.chcdOptionKey, value)
End Set
End Property
Public WriteOnly Property Nascimento() As Date
Set(ByVal value As Date)
_hcd.ReceberDadoEx("cli-Nascimento", , , value)
End Set
End Property
Public WriteOnly Property Salario() As Decimal
Set(ByVal value As Decimal)
_hcd.ReceberDadoEx("cli-Salario", , , value)
End Set
End Property
End Class
A classe GravadorDeClientes possui as seguntes características principais:
- Deve receber o objeto K (área de trabalho do Kankei) no seu construtor;
- O método NovoRegistro(), ou AlterarRegistro() deve ser chamado uma vez para cada registro a ser gravado, antes que os dados em si (nome, sexo, etc.) possam ser informados;
- O método AlterarRegistro() recebe como parâmetro o ID do registro que se quer alterar; durante a alteração de dados, o Kankei só irá enviar instruções de gravação para campos cujos dados tenham sido explicitamente informados. Ex.: Caso não tenha sido definido nenhum valor para a propriedade "Nome", o Kankei não irá gravar para este campo e ele vai continuar com o mesmo valor que tinha antes da gravação.
- Propriedades de dados (Nome, Sexo, Nascimento, Salario): estas propriedades servem como uma interface consistente e tipada para os dados a serem gravados. Atenção especial para a propriedade "Sexo" que faz o tratamento necessário para mapear os valores de um enumerador com as keys das opções da questão.
- Método Gravar(): este método envia as instruções de gravação ao banco de dados e retorna o ID do registro gravado; isso é útil durante uma inclusão onde seja necessário saber o ID do registro que acabou de ser incluído (por exemplo, para ser utilizado ao preencher uma questão do tipo dimensão Cliente, em outra dimensão).
Exemplo de utilização da classe GravadorDeClientes para inclusão de registros:
Dim g As New GravadorDeClientes(K) g.NovoRegistro() g.Nome = "José Alfredo Miaushen" g.Nascimento = DateSerial(1980, 5, 10) g.Sexo = Sexo.Masculino g.Salario = 1500.0 g.Gravar() g.NovoRegistro() g.Nome = "Maria Augusta Imbereçá Tavares Lins" g.Nascimento = DateSerial(1984, 10, 21) g.Sexo = Sexo.Feminino g.Salario = 1400.0 g.Gravar()
