Fala galera, alguém já usou a classe FwBulk? Para uma tabela padrão o Recno devemos passar, ou ele é atualizado pela Classe?
Fala galera, alguém já usou a classe FwBulk? Para uma tabela padrão o Recno devemos passar, ou ele é atualizado pela Classe?
Sergio,
A classe FWBulk
utiliza de recursos do DBAccess, que por sua vez fica responsável pela geração do campo R_E_C_N_O_
, portanto não é necessário enviar ou preocupar-se com o mesmo.
Abaixo um exemplo da classe FWBulk
utilizando uma tabela do padrão, no caso a SED
:
#include "protheus.ch"
//-------------------------------------------------------------------
/*/{Protheus.doc} sedBulk
Exemplo da classe FWBulk efetuando inserção de dados na SED
@author Daniel Mendes
@since 15/03/2021
@version 1.0
/*/
//-------------------------------------------------------------------
user function sedBulk()
local oBulk as object
local aFields as array
local cFilSED as char
local nI as numeric
if FWBulk():canBulk()
rpcSetEnv("99", "01")
oBulk := FWBulk():new(RetSqlName("SED"))
cFilSED := xFilial("SED")
aFields := {}
aAdd(aFields, {"ED_FILIAL"})
aAdd(aFields, {"ED_CODIGO"})
aAdd(aFields, {"ED_DESCRIC"})
// É possível informar a tabela e os campos também dessa forma
// oBulk:setTable(RetSqlName("SED"))
// oBulk:setFields(SED->(DBStruct()))
oBulk:setFields(aFields)
for nI := 1 to 10
oBulk:addData({cFilSED, StrZero(nI, 5), "Descrição " + StrZero(nI, 2)})
next
oBulk:close()
oBulk:destroy()
FreeObj(oBulk)
rpcClearEnv()
else
//Essa classe não funciona com SQLite
ConErr("Atualize o DBAccess")
endif
return
Documentação: https://tdn.engpro.totvs.com.br/display/public/PROT/FWBulk
Daniel, Fiz o teste e ocorreu de violação de Primary Key, a tabela tem que estar com o autoincremento do RECNO? Percebi uma coisa, fui verificar minha tabela e notei uma coisa, se no momento que estiver fazendo o BULK e por algum motivo esteja sendo feito uma inclusão com Reclock o RECNO da erro de chave primaria.
— Sergio Martinez Martinez 16 de Mar de 2021Daniel, permita-me perguntar: Essa classe (FWBulk) é uma alternativa ao uso do RecLock?
— Maicon Macedo 16 de Mar de 2021O exemplo acima se for rodado mais de uma vez, vai gerar erro mesmo, pois os registros estão vão ficar iguais, mas não, não é necessário estar com recno automático, eu fiz esse exemplo e homologuei em uma base que não possui recno automático, como citei, quem gera o recno é o DBAccess.
— Daniel Mendes 16 de Mar de 2021Maicon, essa é uma classe para inserção em lote, logo e não fará lock nem nada, é bem distinta da RecLock que faz o lock do registro para possíveis inclusões, alterações e deleções.
— Daniel Mendes 16 de Mar de 2021Mas eu fiz um teste com uma rotina minha que gera vários registros numa abela, esta tabela não tem X2_UNICO então a chave primaria é o RecNo. Eu fiz o teste novamente, e pelo que percebi ele adicona os registros necessário + RECNO e grava na tabela, mas se tiver um reclock sendo executado e for gravado antes do buffer do bulk o recno gerado nele fica em duplicidade.
— Sergio Martinez Martinez 16 de Mar de 2021