Utilização da classe FwBulk

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.

Daniel, permita-me perguntar: Essa classe (FWBulk) é uma alternativa ao uso do RecLock?

O 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.

Maicon, 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.

Mas 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.

Se isso está ocorrendo, será necessário entrar em contato com a TOTVS e abrir uma issue para a equipe responsável pela manutenção do DBAccess, precisa verificar se existe essa limitação mesmo e quem melhor pode responder é a equipe do DBAccess que faz o controle do recno.