Descrição:
Classe que realiza a inserção de diversos registros no banco de dados em bloco. Desta forma, ao invés de ser enviada uma instrução de insert para cada linha inserida é enviado um único comando de insert para a quantidade de registros definidos no buffer.
Muito mais desempenho
A utilização da classe FWBulk comparada com um processo que envolva diversos inserts no banco chega a ser de 30% a 40% mais performática.
Importante
Para a sua utilização é necessário possuir DBAccess com versão maior ou igual a 20181212 e versão de lib maior ou igual a 20201009.
Métodos:
New()
Sintaxe:
FwBulk():New()
Descrição:
Método de inicialização da classe
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
cTable | Carácter | tabela que será utilizada no processo de bulkinsert | X |
nLimit | Numérico | Quantidade de registro que será utilizado no flush dos dados. Opcional. Default 600 |
Retorno:
Objeto da classe FWBulk
SetFields(aFields)
Sintaxe:
FWBulk():SetFields( aFields )
Descrição:
Indica para a classe FWBulk quais os campos serão utilizados no processo
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
aFields | Array | Array dos campos, onde {{Campo},{Campo}}. Pode-se enviar como conteúdo o retorno da função dbstruct. | X |
Importante!
A ordem desse array deve ser a mesma dos dados informados no método AddData.
SetTable( cTable )
Sintaxe:
FWBulk():SetTable( cTable )
Descrição:
Indica o nome da tabela no banco de dados
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
cTable | Carácter | Nome da tabela do banco de dados | X |
AddData( aData )
Sintaxe:
FWBulk():AddData( aData )
Descrição:
Adiciona dados ao bulk. Caso o limite de dados seja alcançado, também faz o flush dos dados.
Parâmetros:
Nome | Tipo | Descrição | Obrigatório |
aData | Array | Array dos dados que serão persistidos no banco de dados, onde {valor,valor} | X |
Importante!
A ordem desse array deve ser a mesma dos dados informados no método SetFields.
Retorno:
lRet lógico, verdadeiro se conseguiu adicionar os dados ou fazer o flush
Flush()
Sintaxe:
FWBulk():Flush()
Descrição:
Faz o flush dos dados no sistema
Retorno:
lRet lógico, verdadeiro se conseguiu fazer o flush dos dados, caso contrário o erro pode ser resgatado pelo método GetError().
Close()
Sintaxe:
FWBulk():Close()
Descrição:
Finaliza o Bulk no sistema e atualiza a tabela. Caso existem dados em cache, faz o flush dos mesmos.
Retorno:
lRet lógico, verdadeiro se conseguiu fazer o flush dos dados, caso contrário o erro pode ser resgatado pelo método GetError().
Destroy()
Sintaxe:
FWBulk():Destroy()
Descrição:
Limpa o conteúdo do objeto da classe
Count()
Sintaxe:
FWBulk():Count()
Descrição:
Informa quantas linhas de dados já foram adicionadas no cache em espera para o flush
Retorno:
nCount numérico, quantidade de linhas de dados adicionadas ao cache
GetError()
Sintaxe:
FWBulk():GetError()
Descrição:
Método que retorna a string do último erro apresentado
Retorno:
cError string que contém o último erro apresentado
Reset()
Sintaxe:
FWBulk():Reset()
Descrição:
Limpa toda a classe retornando ao estado inicial
CanBulk()
Sintaxe:
FWBulk():CanBulk()
Descrição:
Indica se Bulk pode ser utilizado
Importante!
Não é possível a utilização desta classe em ambiente com banco SQLite!
Retorno:
lCanUse lógico, se verdadeiro, o bulk está disponível para uso.
Obs.: Este método não depende da classe FWBulk ser inicializada por New, por este motivo, deve-se utilizar FWBulk():CanBulk()
Exemplo:
User Function myBulk() Local oBulk as object Local aStruct as array Local nX as numeric Local lCanUseBulk as logical aStruct := {} aAdd( aStruct, { 'FIELD1', 'C', 10, 0 } ) aAdd( aStruct, { 'FIELD2', 'N', 10, 2 } ) aAdd( aStruct, { 'FIELD3', 'M', 10, 0 } ) aAdd( aStruct, { 'FIELD4', 'D', 8, 0 } ) aAdd( aStruct, { 'FIELD5', 'L', 1, 0 } ) FWDBCreate( 'BULKTBL', aStruct , 'TOPCONN' , .T.) oBulk := FwBulk():New('BULKTBL') lCanUseBulk := FwBulk():CanBulk() // Este método não depende da classe FWBulk ser inicializada por NEW if lCanUseBulk oBulk:SetFields(aStruct) endif For nX := 1 to 5 if lCanUseBulk oBulk:AddData({cValToChar(nX),(nX,nX),cValToChar(nX),Date(),mod(nX,2)==0}) else RecLock("BULKTBL",.T.) BULKTBL->FIELD1 := cValToChar(nX) BULKTBL->FIELD2 := (nX,nX) BULKTBL->FIELD3 := cValToChar(nX) BULKTBL->FIELD4 := Date() BULKTBL->FIELD5 := mod(nX,2)==0 MsUnLock() endif Next if lCanUseBulk oBulk:Close() oBulk:Destroy() oBulk := nil endif Return