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:

NomeTipoDescriçãoObrigatório
cTableCaráctertabela que será utilizada no processo de bulkinsertX
nLimitNuméricoQuantidade 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:

NomeTipoDescriçãoObrigató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:

NomeTipoDescriçãoObrigatório
cTable CarácterNome da tabela do banco de dadosX


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:

NomeTipoDescriçãoObrigatório
aDataArray 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:


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