Chamada descontinuada de driver ISAM

Tenho um fonte que no code analisys apontou para chamada descontinuada de driver ISAM. Por favor, como faço para corrigir este trecho de código para usar a FWTemporaryTable?

cArqTrab := CriaTrab("",.f.) DbCreate(cArqTrab,aStruct) Use &cArqTrab New Alias "TMPB1" cChaveInd := "_ID+_FILIAL+_FORNECE+_LOJA+_CODPROD"

index on &cChaveInd to &cArqTrab cArqTrab := GetNextAlias()

Dayanne, segue um pequeno exemplo de como utilizar a classe FWTemporaryTable.


    Local aCampos    := {}    AS Array
    Local cArqTrab            AS Character
    Local oArqTrab            AS Object

    //Campos da tabela temporária
    aAdd(aCampos,'COLUNA1')
    aAdd(aCampos,'COLUNA2')
    aAdd(aCampos,'COLUNA3')

    //Cria tabela temporária
    oArqTrab := FwTemporaryTable():New(@cArqTrab,aCampos)
    oArqTrab:AddIndex('1',{'COLUNA1','COLUNA2'})
    oArqTrab:Create()

    ... PROCESSAMENTO
    (cArqTrab)->COLUNA1...
    (cArqTrab)->COLUNA2...    

    //Destroi tabela temporaria--------------------------------------------------------------------
    If(oArqTrab <> NIL)
        //Apaga tabela temporaria
        oArqTrab:Delete()

        //Destroi objeto
        FWFreeVar(oArqTrab)
        oArqTrab := NIL
    EndIf

Eu fiz porém ele retorna esse erro:

Alias does not exist: TMPB1
on RECLOCK(APLIB060.PRW)

Fiz de várias maneiras diferentes e ele retorna este mesmo erro

Olá,

A função CriaTrab normalmente pode ser substituída pela classe FWTemporaryTable. Em seu exemplo, a função CriaTrab está sendo utilizada apenas para a criação de um nome, você acaba criando o arquivo abaixo, utilizando da função DBCreate e após isso, cria um índice.

Todo esse código pode ser substituído pela classe FWTemporaryTable, que pode criar uma tabela, com índices e ter uma workarea para ser utilizada com RecLock.

Seu código ficaria mais ou menos da seguinte forma:


oTempTable := FWTemporaryTable():New("TMPB1", aStruct) //Instância da classe, mantendo o alias de trabalho como TMPB1 e com a estrutura já existente em seu código
oTempTable:AddIndex("1", {"_ID", "_FILIAL", "_FORNECE", "_LOJA", "_CODPROD"}) //Criação do índice conforme seu exemplo

oTempTable:Create() //Método que cria a tabela temporária no banco de dados

cArqTrab := oTempTable:GetRealName() //Nome físico da tabela (Pode ser necessário utilizar o método GetTableNameForTCFunctions)

A tabela temporária tem um comportamento de ser excluída após o uso de forma automática, mas é uma boa prática você utilizar do método delete após utilizar a mesma, para já fechar a workarea e deletar a mesma.

O código acima substituí todos esse trecho:


cArqTrab := CriaTrab("",.f.)
DbCreate(cArqTrab,aStruct)   
Use &cArqTrab New Alias "TMPB1" 
cChaveInd := "_ID+_FILIAL+_FORNECE+_LOJA+_CODPROD"

index on &cChaveInd to &cArqTrab

Pois ele cria uma tabela com índices e abre a mesma, pode ser necessário mais alterações que esse sugerida, sendo necessária uma pequena refatoração. Veja que tentei utilizar as mesmas variáveis que você para ficar o mais próximo possível do seu código atual.

Se você utilizada essa tabela em outras threads, a classe FWTemporaryTable pode não lhe atender, sendo necessária a utilização da classe totvs.framework.database.temporary.SharedTable

Documentações:

https://tdn.totvs.com.br/display/public/framework/FWTemporaryTable

https://tdn.totvs.com.br/display/public/framework/totvs.framework.database.temporary.SharedTable

Olá Daniel, também testei essa solução e ele me retorna o mesmo erro que citei na resposta acima: Alias does not exist: TMPB1 on RECLOCK(APLIB060.PRW) 13/12/2022 14:23:45 line : 447

Alguma luz do que possa ser isso?

Obrigada pelo suporte!