FwExecView destruind meu Model

Amigos, boa notie!

Estou com um problema numa tela customizada. Estou criando uma rotina onde eu leio uma tabela 'ZZZ' que tem registros que processam e podem dar erro. Ao analisar o erro mando corrigir pela tela e chamo um FwExecView. Ao retornar do FwExecView, meu model fica inacessível e não consigo mais fazer nada.

Alguém consegue me ajudar?

O cenário é mais ou menos o seguinte:

Clico no botão ERRO, mando corrigir a amarração Produto x Fornecedor, ao retornar para a tela principal clico no botão reprocessar e ele simplesmente diz que o Model não existe.

Segue exemplo abaixo:

//Bibliotecas
#Include 'Protheus.ch'
#Include 'FWMVCDef.ch'

//Variáveis Estáticas
Static cTitulo := "Central de Importação"

/*/{Protheus.doc} XP3IMPORT
Exemplo de rotina com multiplas abas em MVC
@author Atilio
@since 25/07/2017
@version 1.0
@return Nil, Função não tem retorno
@example
u_XP3IMPORT()
/*/

User Function XP3IMPORT()
    Local aArea   := GetArea()
    Local oBrowse
    Local cFunBkp := FunName()
    Private cTabImp     := SuperGetMV("MV_XTBIMP",,"ZZZ")
    Private lCheck1 := .T.
    Private lCheck2 := .T.
    Private lCheck3 := .T.
    Private lImpSE2 := SuperGetMv("P3_IMPSE2",,.F.)
    Private lImpSE1 := SuperGetMv("P3_IMPSE1",,.F.)
    Private lImpSC5 := SuperGetMv("P3_IMPSC5",,.F.)
    Private lImpSC7 := SuperGetMv("P3_IMPSC7",,.F.)
    Private lImpSF1 := SuperGetMv("P3_IMPSF1",,.T.)
    Private lImpSF2 := SuperGetMv("P3_IMPSF2",,.T.)

    oBrowse := FWMBrowse():New()
    oBrowse:SetAlias(cTabImp)
    oBrowse:SetDescription(cTitulo)
    oBrowse:SetMenuDef("XP3IMPORT")
    oBrowse:Activate()

    SetFunName(cFunBkp)
    RestArea(aArea)
Return Nil
/*---------------------------------------------------------------------*
| Func:  MenuDef                                                      |
| Desc:  Criação do menu MVC                                          |
*---------------------------------------------------------------------*/

Static Function MenuDef()
    Local aRot := {}

    //Adicionando opções
    ADD OPTION aRot TITLE 'Visualizar' ACTION 'VIEWDEF.XP3IMPORT' OPERATION MODEL_OPERATION_VIEW ACCESS 0
Return aRot

/*---------------------------------------------------------------------*
| Func:  ModelDef                                                     |
| Desc:  Criação do modelo de dados MVC                               |
*---------------------------------------------------------------------*/

Static Function ModelDef()
    Private oModel     := Nil
    Private oStPai     := FWFormStruct(1, cTabImp)
    Private oStFilho1  := FWFormStruct(1, cTabImp)
    Private oStFilho2  := FWFormStruct(1, cTabImp)
    Private oStFilho3  := FWFormStruct(1, cTabImp)
    Private oStFilho4  := FWFormStruct(1, cTabImp)
    Private oStFilho5  := FWFormStruct(1, cTabImp)
    Private oStFilho6  := FWFormStruct(1, cTabImp)
    //Private cRegra     := ""

    Private aRelFilho1 := {}
    Private aRelFilho2 := {}
    Private aRelFilho3 := {}
    Private aRelFilho4 := {}
    Private aRelFilho5 := {}
    Private aRelFilho6 := {}

    oStFilho1:AddField( ; 
    AllTrim('') , ;             // [01] C Titulo do campo 
    AllTrim('') , ;             // [02] C ToolTip do campo 
    cTabImp+'_LEGEN' , ;             // [03] C identificador (ID) do Field 
    'C' , ;                     // [04] C Tipo do campo 
    50  , ;                     // [05] N Tamanho do campo 
    0   , ;                     // [06] N Decimal do campo 
    NIL , ;                     // [07] B Code-block de validação do campo 
    NIL , ;                     // [08] B Code-block de validação When do campo 
    NIL , ;                     // [09] A Lista de valores permitido do campo 
    NIL , ;                     // [10] L Indica se o campo tem preenchimento obrigatório 
    { |oModel| U_XMLLegen(oModel) } , ;           // [11] B Code-block de inicializacao do campo 
    NIL , ;                     // [12] L Indica se trata de um campo chave 
    NIL , ;                     // [13] L Indica se o campo pode receber valor em uma operação de update. 
    .T. )                       // [14] L Indica se o campo é virtual

    oStFilho2:AddField( ; 
    AllTrim('') , ;             // [01] C Titulo do campo 
    AllTrim('') , ;             // [02] C ToolTip do campo 
    cTabImp+'_LEGEN' , ;             // [03] C identificador (ID) do Field 
    'C' , ;                     // [04] C Tipo do campo 
    50  , ;                     // [05] N Tamanho do campo 
    0   , ;                     // [06] N Decimal do campo 
    NIL , ;                     // [07] B Code-block de validação do campo 
    NIL , ;                     // [08] B Code-block de validação When do campo 
    NIL , ;                     // [09] A Lista de valores permitido do campo 
    NIL , ;                     // [10] L Indica se o campo tem preenchimento obrigatório 
    { |oModel| U_XMLLegen(oModel) } , ;           // [11] B Code-block de inicializacao do campo 
    NIL , ;                     // [12] L Indica se trata de um campo chave 
    NIL , ;                     // [13] L Indica se o campo pode receber valor em uma operação de update. 
    .T. )                       // [14] L Indica se o campo é virtual

    oStFilho3:AddField( ; 
    AllTrim('') , ;             // [01] C Titulo do campo 
    AllTrim('') , ;             // [02] C ToolTip do campo 
    cTabImp+'_LEGEN' , ;             // [03] C identificador (ID) do Field 
    'C' , ;                     // [04] C Tipo do campo 
    50  , ;                     // [05] N Tamanho do campo 
    0   , ;                     // [06] N Decimal do campo 
    NIL , ;                     // [07] B Code-block de validação do campo 
    NIL , ;                     // [08] B Code-block de validação When do campo 
    NIL , ;                     // [09] A Lista de valores permitido do campo 
    NIL , ;                     // [10] L Indica se o campo tem preenchimento obrigatório 
    { |oModel| U_XMLLegen(oModel) } , ;           // [11] B Code-block de inicializacao do campo 
    NIL , ;                     // [12] L Indica se trata de um campo chave 
    NIL , ;                     // [13] L Indica se o campo pode receber valor em uma operação de update. 
    .T. )                       // [14] L Indica se o campo é virtual

    oStFilho4:AddField( ; 
    AllTrim('') , ;             // [01] C Titulo do campo 
    AllTrim('') , ;             // [02] C ToolTip do campo 
    cTabImp+'_LEGEN' , ;             // [03] C identificador (ID) do Field 
    'C' , ;                     // [04] C Tipo do campo 
    50  , ;                     // [05] N Tamanho do campo 
    0   , ;                     // [06] N Decimal do campo 
    NIL , ;                     // [07] B Code-block de validação do campo 
    NIL , ;                     // [08] B Code-block de validação When do campo 
    NIL , ;                     // [09] A Lista de valores permitido do campo 
    NIL , ;                     // [10] L Indica se o campo tem preenchimento obrigatório 
    { |oModel| U_XMLLegen(oModel) } , ;           // [11] B Code-block de inicializacao do campo 
    NIL , ;                     // [12] L Indica se trata de um campo chave 
    NIL , ;                     // [13] L Indica se o campo pode receber valor em uma operação de update. 
    .T. )                       // [14] L Indica se o campo é virtual

    oStFilho5:AddField( ; 
    AllTrim('') , ;             // [01] C Titulo do campo 
    AllTrim('') , ;             // [02] C ToolTip do campo 
    cTabImp+'_LEGEN' , ;             // [03] C identificador (ID) do Field 
    'C' , ;                     // [04] C Tipo do campo 
    50  , ;                     // [05] N Tamanho do campo 
    0   , ;                     // [06] N Decimal do campo 
    NIL , ;                     // [07] B Code-block de validação do campo 
    NIL , ;                     // [08] B Code-block de validação When do campo 
    NIL , ;                     // [09] A Lista de valores permitido do campo 
    NIL , ;                     // [10] L Indica se o campo tem preenchimento obrigatório 
    { |oModel| U_XMLLegen(oModel) } , ;           // [11] B Code-block de inicializacao do campo 
    NIL , ;                     // [12] L Indica se trata de um campo chave 
    NIL , ;                     // [13] L Indica se o campo pode receber valor em uma operação de update. 
    .T. )                       // [14] L Indica se o campo é virtual

    oStFilho6:AddField( ; 
    AllTrim('') , ;             // [01] C Titulo do campo 
    AllTrim('') , ;             // [02] C ToolTip do campo 
    cTabImp+'_LEGEN' , ;             // [03] C identificador (ID) do Field 
    'C' , ;                     // [04] C Tipo do campo 
    50  , ;                     // [05] N Tamanho do campo 
    0   , ;                     // [06] N Decimal do campo 
    NIL , ;                     // [07] B Code-block de validação do campo 
    NIL , ;                     // [08] B Code-block de validação When do campo 
    NIL , ;                     // [09] A Lista de valores permitido do campo 
    NIL , ;                     // [10] L Indica se o campo tem preenchimento obrigatório 
    { |oModel| U_XMLLegen(oModel) } , ;           // [11] B Code-block de inicializacao do campo 
    NIL , ;                     // [12] L Indica se trata de um campo chave 
    NIL , ;                     // [13] L Indica se o campo pode receber valor em uma operação de update. 
    .T. )                       // [14] L Indica se o campo é virtual

    //Criando o modelo
    oModel := MPFormModel():New('MP3IMPORT')
    oModel:AddFields(cTabImp+'_MASTER', /*cOwner*/, oStPai)

    //Criando as grids dos filhos

    IF lImpSE2
        oModel:AddGrid(cTabImp+'_FILHO1', cTabImp+'_MASTER', oStFilho1)
    Endif

    IF lImpSE1
        oModel:AddGrid(cTabImp+'_FILHO2', cTabImp+'_MASTER', oStFilho2)
    Endif

    IF lImpSC5
        oModel:AddGrid(cTabImp+'_FILHO3', cTabImp+'_MASTER', oStFilho3)
    EndIf

    IF lImpSC7
        oModel:AddGrid(cTabImp+'_FILHO4', cTabImp+'_MASTER', oStFilho4)
    EndIf

    IF lImpSF1
        oModel:AddGrid(cTabImp+'_FILHO5', cTabImp+'_MASTER', oStFilho5)
    Endif

    IF lImpSF2
        oModel:AddGrid(cTabImp+'_FILHO6', cTabImp+'_MASTER', oStFilho6)
    Endif

    //Criando os relacionamentos dos pais e filhos
    aAdd(aRelFilho1, {cTabImp+'_TABELA', "'SE2'"})
    aAdd(aRelFilho2, {cTabImp+'_TABELA', "'SE1'"})       
    aAdd(aRelFilho3, {cTabImp+'_TABELA', "'SC5'"})       
    aAdd(aRelFilho4, {cTabImp+'_TABELA', "'SC7'"})       
    aAdd(aRelFilho5, {cTabImp+'_TABELA', "'SF1'"}) 
    aAdd(aRelFilho6, {cTabImp+'_TABELA', "'SF2'"}) 

    IF lImpSE2
        //Criando o relacionamento do Filho 1
        oModel:SetRelation(cTabImp+'_FILHO1', aRelFilho1, &(cTabImp+"->(IndexKey(1))"))
        oModel:GetModel(cTabImp+'_FILHO1'):SetUniqueLine({cTabImp+"_FILIAL",cTabImp+"_OPER",cTabImp+"_TABELA",cTabImp+"_CHAVE"})
    Endif

    IF lImpSE1
        //Criando o relacionamento do Filho 2
        oModel:SetRelation(cTabImp+'_FILHO2', aRelFilho2, &(cTabImp+"->(IndexKey(1))"))
        oModel:GetModel(cTabImp+'_FILHO2'):SetUniqueLine({cTabImp+"_FILIAL",cTabImp+"_OPER",cTabImp+"_TABELA",cTabImp+"_CHAVE"})
    Endif


    IF lImpSC5
        //Criando o relacionamento do Filho 3 - Produtos do Armazém 01
        oModel:SetRelation(cTabImp+'_FILHO3', aRelFilho3, &(cTabImp+"->(IndexKey(1))"))
        oModel:GetModel(cTabImp+'_FILHO3'):SetUniqueLine({cTabImp+"_FILIAL",cTabImp+"_OPER",cTabImp+"_TABELA",cTabImp+"_CHAVE"})
    Endif

    IF lImpSC7
        //Criando o relacionamento do Filho 4 - Produtos do Armazém 01
        oModel:SetRelation(cTabImp+'_FILHO4', aRelFilho4, &(cTabImp+"->(IndexKey(1))"))
        oModel:GetModel(cTabImp+'_FILHO4'):SetUniqueLine({cTabImp+"_FILIAL",cTabImp+"_OPER",cTabImp+"_TABELA",cTabImp+"_CHAVE"})
    Endif

    IF lImpSF1
        //Criando o relacionamento do Filho 5 - Produtos do Armazém 01
        oModel:SetRelation(cTabImp+'_FILHO5', aRelFilho5, &(cTabImp+"->(IndexKey(1))"))
        oModel:GetModel(cTabImp+'_FILHO5'):SetUniqueLine({cTabImp+"_FILIAL",cTabImp+"_OPER",cTabImp+"_TABELA",cTabImp+"_CHAVE"})
    Endif

    IF lImpSF2
        //Criando o relacionamento do Filho 5 - Produtos do Armazém 01
        oModel:SetRelation(cTabImp+'_FILHO6', aRelFilho6, &(cTabImp+"->(IndexKey(1))"))
        oModel:GetModel(cTabImp+'_FILHO6'):SetUniqueLine({cTabImp+"_FILIAL",cTabImp+"_OPER",cTabImp+"_TABELA",cTabImp+"_CHAVE"})
    Endif

    cRegra := cTabImp+"_DATA >= '"+DToS(ddatabase-1)+"' AND "+cTabImp+"_DATA <= '"+DToS(ddatabase)+"' "

    IF RetCodUsr() $ SuperGetMv("P3_XUSRIMP",,"000000,") 
        cRegra += ""
    Else
        cRegra += " AND "+cTabImp+"_FILIAL = '"+xFilial(cTabImp)+"' "
    Endif

    //Finalizando a criação do Model
    oModel:SetPrimaryKey({})
    oModel:SetDescription("Importação XML")
    oModel:GetModel(cTabImp+'_MASTER'):SetDescription('Importação')
    IF lImpSE2
        oModel:GetModel(cTabImp+'_FILHO1'):SetLoadFilter(,cRegra)
        oModel:GetModel(cTabImp+'_FILHO1'):SetDescription('Contas a Pagar')
    Endif

    IF lImpSE1
        oModel:GetModel(cTabImp+'_FILHO2'):SetLoadFilter(,cRegra)
        oModel:GetModel(cTabImp+'_FILHO2'):SetDescription('Contas a Receber')
    Endif

    IF lImpSC5
        oModel:GetModel(cTabImp+'_FILHO3'):SetLoadFilter(,cRegra)
        oModel:GetModel(cTabImp+'_FILHO3'):SetDescription('Pedido de Venda')
    Endif

    IF lImpSC7
        oModel:GetModel(cTabImp+'_FILHO4'):SetLoadFilter(,cRegra)
        oModel:GetModel(cTabImp+'_FILHO4'):SetDescription('Pedido de Compra')
    Endif

    IF lImpSF1
        oModel:GetModel(cTabImp+'_FILHO5'):SetLoadFilter(,cRegra)
        oModel:GetModel(cTabImp+'_FILHO5'):SetDescription('Pre-nota')
    EndIf

    IF lImpSF2
        oModel:GetModel(cTabImp+'_FILHO6'):SetLoadFilter(,cRegra)
        oModel:GetModel(cTabImp+'_FILHO6'):SetDescription('Nota de Saída')
    EndIf
Return oModel

/*---------------------------------------------------------------------*
| Func:  ViewDef                                                      |
| Desc:  Criação da visão MVC                                         |
*---------------------------------------------------------------------*/

Static Function ViewDef()
    Local oView     := Nil
    Local oStPai    := FWFormStruct(2, cTabImp )
    Local oStFilho1 := FWFormStruct(2, cTabImp )
    Local oStFilho2 := FWFormStruct(2, cTabImp )
    Local oStFilho3 := FWFormStruct(2, cTabImp )
    Local oStFilho4 := FWFormStruct(2, cTabImp )
    Local oStFilho5 := FWFormStruct(2, cTabImp )
    Local oStFilho6 := FWFormStruct(2, cTabImp )

    Private oModel    := FWLoadModel('XP3IMPORT')

    oStFilho1:AddField( ;                      // Ord. Tipo Desc. 
    cTabImp+'_LEGEN'       , ;     // [01] C   Nome do Campo 
    "00"              , ;     // [02] C   Ordem 
    AllTrim( '' )     , ;     // [03] C   Titulo do campo 
    AllTrim( '' )     , ;     // [04] C   Descricao do campo 
    , ;     // [05] A   Array com Help 
    'C'               , ;     // [06] C   Tipo do campo 
    '@BMP'            , ;     // [07] C   Picture 
    NIL               , ;     // [08] B   Bloco de Picture Var 
    ''                , ;     // [09] C   Consulta F3 
    .T.               , ;     // [10] L   Indica se o campo é alteravel 
    NIL               , ;     // [11] C   Pasta do campo 
    NIL               , ;     // [12] C   Agrupamento do campo 
    NIL               , ;     // [13] A   Lista de valores permitido do campo (Combo) 
    NIL               , ;     // [14] N   Tamanho maximo da maior opção do combo 
    NIL               , ;     // [15] C   Inicializador de Browse 
    .T.               , ;     // [16] L   Indica se o campo é virtual 
    NIL               , ;     // [17] C   Picture Variavel 
    NIL               )       // [18] L   Indica pulo de linha após o campo

    oStFilho2:AddField( ;                      // Ord. Tipo Desc. 
    cTabImp+'_LEGEN'       , ;     // [01] C   Nome do Campo 
    "00"              , ;     // [02] C   Ordem 
    AllTrim( '' )     , ;     // [03] C   Titulo do campo 
    AllTrim( '' )     , ;     // [04] C   Descricao do campo 
    , ;     // [05] A   Array com Help 
    'C'               , ;     // [06] C   Tipo do campo 
    '@BMP'            , ;     // [07] C   Picture 
    NIL               , ;     // [08] B   Bloco de Picture Var 
    ''                , ;     // [09] C   Consulta F3 
    .T.               , ;     // [10] L   Indica se o campo é alteravel 
    NIL               , ;     // [11] C   Pasta do campo 
    NIL               , ;     // [12] C   Agrupamento do campo 
    NIL               , ;     // [13] A   Lista de valores permitido do campo (Combo) 
    NIL               , ;     // [14] N   Tamanho maximo da maior opção do combo 
    NIL               , ;     // [15] C   Inicializador de Browse 
    .T.               , ;     // [16] L   Indica se o campo é virtual 
    NIL               , ;     // [17] C   Picture Variavel 
    NIL               )       // [18] L   Indica pulo de linha após o campo

    oStFilho3:AddField( ;                      // Ord. Tipo Desc. 
    cTabImp+'_LEGEN'       , ;     // [01] C   Nome do Campo 
    "00"              , ;     // [02] C   Ordem 
    AllTrim( '' )     , ;     // [03] C   Titulo do campo 
    AllTrim( '' )     , ;     // [04] C   Descricao do campo 
    , ;     // [05] A   Array com Help 
    'C'               , ;     // [06] C   Tipo do campo 
    '@BMP'            , ;     // [07] C   Picture 
    NIL               , ;     // [08] B   Bloco de Picture Var 
    ''                , ;     // [09] C   Consulta F3 
    .T.               , ;     // [10] L   Indica se o campo é alteravel 
    NIL               , ;     // [11] C   Pasta do campo 
    NIL               , ;     // [12] C   Agrupamento do campo 
    NIL               , ;     // [13] A   Lista de valores permitido do campo (Combo) 
    NIL               , ;     // [14] N   Tamanho maximo da maior opção do combo 
    NIL               , ;     // [15] C   Inicializador de Browse 
    .T.               , ;     // [16] L   Indica se o campo é virtual 
    NIL               , ;     // [17] C   Picture Variavel 
    NIL               )       // [18] L   Indica pulo de linha após o campo

    oStFilho4:AddField( ;                      // Ord. Tipo Desc. 
    cTabImp+'_LEGEN'       , ;     // [01] C   Nome do Campo 
    "00"              , ;     // [02] C   Ordem 
    AllTrim( '' )     , ;     // [03] C   Titulo do campo 
    AllTrim( '' )     , ;     // [04] C   Descricao do campo 
    , ;     // [05] A   Array com Help 
    'C'               , ;     // [06] C   Tipo do campo 
    '@BMP'            , ;     // [07] C   Picture 
    NIL               , ;     // [08] B   Bloco de Picture Var 
    ''                , ;     // [09] C   Consulta F3 
    .T.               , ;     // [10] L   Indica se o campo é alteravel 
    NIL               , ;     // [11] C   Pasta do campo 
    NIL               , ;     // [12] C   Agrupamento do campo 
    NIL               , ;     // [13] A   Lista de valores permitido do campo (Combo) 
    NIL               , ;     // [14] N   Tamanho maximo da maior opção do combo 
    NIL               , ;     // [15] C   Inicializador de Browse 
    .T.               , ;     // [16] L   Indica se o campo é virtual 
    NIL               , ;     // [17] C   Picture Variavel 
    NIL               )       // [18] L   Indica pulo de linha após o campo

    oStFilho5:AddField( ;                      // Ord. Tipo Desc. 
    cTabImp+'_LEGEN'       , ;     // [01] C   Nome do Campo 
    "00"              , ;     // [02] C   Ordem 
    AllTrim( '' )     , ;     // [03] C   Titulo do campo 
    AllTrim( '' )     , ;     // [04] C   Descricao do campo 
    , ;     // [05] A   Array com Help 
    'C'               , ;     // [06] C   Tipo do campo 
    '@BMP'            , ;     // [07] C   Picture 
    NIL               , ;     // [08] B   Bloco de Picture Var 
    ''                , ;     // [09] C   Consulta F3 
    .T.               , ;     // [10] L   Indica se o campo é alteravel 
    NIL               , ;     // [11] C   Pasta do campo 
    NIL               , ;     // [12] C   Agrupamento do campo 
    NIL               , ;     // [13] A   Lista de valores permitido do campo (Combo) 
    NIL               , ;     // [14] N   Tamanho maximo da maior opção do combo 
    NIL               , ;     // [15] C   Inicializador de Browse 
    .T.               , ;     // [16] L   Indica se o campo é virtual 
    NIL               , ;     // [17] C   Picture Variavel 
    NIL               )       // [18] L   Indica pulo de linha após o campo 

    oStFilho6:AddField( ;                      // Ord. Tipo Desc. 
    cTabImp+'_LEGEN'       , ;     // [01] C   Nome do Campo 
    "00"              , ;     // [02] C   Ordem 
    AllTrim( '' )     , ;     // [03] C   Titulo do campo 
    AllTrim( '' )     , ;     // [04] C   Descricao do campo 
    , ;     // [05] A   Array com Help 
    'C'               , ;     // [06] C   Tipo do campo 
    '@BMP'            , ;     // [07] C   Picture 
    NIL               , ;     // [08] B   Bloco de Picture Var 
    ''                , ;     // [09] C   Consulta F3 
    .T.               , ;     // [10] L   Indica se o campo é alteravel 
    NIL               , ;     // [11] C   Pasta do campo 
    NIL               , ;     // [12] C   Agrupamento do campo 
    NIL               , ;     // [13] A   Lista de valores permitido do campo (Combo) 
    NIL               , ;     // [14] N   Tamanho maximo da maior opção do combo 
    NIL               , ;     // [15] C   Inicializador de Browse 
    .T.               , ;     // [16] L   Indica se o campo é virtual 
    NIL               , ;     // [17] C   Picture Variavel 
    NIL               )       // [18] L   Indica pulo de linha após o campo 

    //Criando a View
    oView := FWFormView():New()
    oView:SetModel(oModel)

    //Adicionando os campos do cabeçalho
    oView:AddField('VIEW_'+cTabImp, oStPai, cTabImp+'_MASTER')

    //Grids dos filhos
    IF lImpSE2
        oView:AddGrid('VIEW_FILHO1', oStFilho1, cTabImp+'_FILHO1')
    Endif

    IF lImpSE1
        oView:AddGrid('VIEW_FILHO2', oStFilho2, cTabImp+'_FILHO2')
    Endif

    IF lImpSC5
        oView:AddGrid('VIEW_FILHO3', oStFilho3, cTabImp+'_FILHO3')
    Endif

    IF lImpSC7
        oView:AddGrid('VIEW_FILHO4', oStFilho4, cTabImp+'_FILHO4')
    EndIf

    IF lImpSF1
        oView:AddGrid('VIEW_FILHO5', oStFilho5, cTabImp+'_FILHO5')
    Endif

    IF lImpSF2
        oView:AddGrid('VIEW_FILHO6', oStFilho6, cTabImp+'_FILHO6')
    Endif


    //Setando o dimensionamento de tamanho
    oView:CreateHorizontalBox('SUPERIOR', 1)
    oView:CreateHorizontalBox('MEIO'    , 29)
    oView:CreateHorizontalBox('INFERIOR', 70)

    oView:CreateVerticalBox("GRIDS",80,"INFERIOR")
    oView:CreateVerticalBox("BOTOES",20,"INFERIOR")

    //Criando a folder dos produtos (filhos)S
    oView:CreateFolder('PASTA_FILHOS', 'GRIDS')
    IF lImpSE2
        oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO01', "Contas a Pagar")
    Endif

    IF lImpSE1
        oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO02', "Contas a Receber")
    Endif

    IF lImpSC5
        oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO03', "Pedido de Venda")
    Endif

    IF lImpSC7
        oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO04', "Pedido de Compra")
    Endif

    IF lImpSF1
        oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO05', "Pre-nota")
    Endif

    IF lImpSF2
        oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO06', "Nota de Saída")
    Endif

    //Cria as caixas onde serão mostrados os dados dos filhos
    IF lImpSE2
        oView:CreateHorizontalBox('ITENS_FILHO01',100 ,,, 'PASTA_FILHOS', 'ABA_FILHO01' )
    Endif

    IF lImpSE1
        oView:CreateHorizontalBox('ITENS_FILHO02',100 ,,, 'PASTA_FILHOS', 'ABA_FILHO02' )
    Endif

    IF lImpSC5
        oView:CreateHorizontalBox('ITENS_FILHO03',100 ,,, 'PASTA_FILHOS', 'ABA_FILHO03' )
    Endif

    IF lImpSC7
        oView:CreateHorizontalBox('ITENS_FILHO04',100 ,,, 'PASTA_FILHOS', 'ABA_FILHO04' )
    Endif

    IF lImpSF1
        oView:CreateHorizontalBox('ITENS_FILHO05',100 ,,, 'PASTA_FILHOS', 'ABA_FILHO05' )
    Endif

    IF lImpSF2
        oView:CreateHorizontalBox('ITENS_FILHO06',100 ,,, 'PASTA_FILHOS', 'ABA_FILHO06' )
    Endif

    oView:AddOtherObject("BOTAO", {|oModel| Botao(oModel) })
    oView:AddOtherObject("MEIO" , {|oModel| Cabecalho(oModel) }) 

    //Amarrando a view com as box
    oView:SetOwnerView('VIEW_'+cTabImp,    'SUPERIOR')
    IF lImpSE2
        oView:SetOwnerView('VIEW_FILHO1', 'ITENS_FILHO01')
    Endif

    IF lImpSE1
        oView:SetOwnerView('VIEW_FILHO2', 'ITENS_FILHO02')
    EndIF

    IF lImpSC5
        oView:SetOwnerView('VIEW_FILHO3', 'ITENS_FILHO03')
    Endif

    IF lImpSC7
        oView:SetOwnerView('VIEW_FILHO4', 'ITENS_FILHO04')
    Endif

    IF lImpSF1
        oView:SetOwnerView('VIEW_FILHO5', 'ITENS_FILHO05')
    Endif

    IF lImpSF2
        oView:SetOwnerView('VIEW_FILHO6', 'ITENS_FILHO06')
    Endif

    oView:SetOwnerView("BOTAO",'BOTOES')

    oView:AddUserButton("Filtro"           ,"Filtro"           ,{|| Filtro() })
    oView:AddUserButton("Limpar Filtro"    ,"Limpar Filtro"    ,{|| Filtro(.T.)})
    oView:AddUserButton("Pedido x Pre-nota","Pedido x Pre-nota",{|| Amarra()})

Return oView

Static Function Amarra()

    Local cCNPJFor      := ""
    Local cDoc          := ""
    Local cSerie        := ""
    Private _cTmpImp     := SuperGetMV("MV_XTBIMP",,"ZZZ")
    Private _oModel        := FWModelActivate()
    Private _oView        := FWViewActive()
    Private _aId        := _oView:GetCurrentSelect()
    Private _cId        := SubStr(_aId[1],At("_FILHO",_aId[1]),7)
    Private _oGrid         := _oModel:GetModel(_cTmpImp+_cId)
    Private _cStatus     := _oGrid:GetValue(_cTmpImp+"_STATUS")

    IF !"_FILHO5" $ _cId .and. !Alltrim(_cStatus) == "P"
        MsgInfo("Opção disponível apenas para pré-nota processada.")
        Return
    Endif

    Private _cJSon     := _oGrid:GetValue(_cTmpImp+"_JSON")
    Private _oParseJSON 

    FWJsonDeserialize(_cJSon, @_oParseJSON)

    cCNPJFor := _oParseJSON:SF1:A2_CGC

    dbSelectArea("SA2")
    SA2->(dbSetOrder(3))
    If SA2->(dbSeek(xFilial("SA2") + cCNPJFor))

        cDoc := StrZero(Val(Right(_oParseJSON:SF1:F1_DOC,9)),9)
        If Type("_oParseJSON:SF1:F1_SERIE") <> "U"
            cSerie    := PadR(_oParseJSON:SF1:F1_SERIE,TamSx3("F1_SERIE")[1])
        EndIf

        dbSelectArea("SF1")
        dbSetOrder(1)
        If dbSeek(xFilial("SF1") + cDoc + cSerie + SA2->(A2_COD+A2_LOJA))
            Pergunte("MTA140",.F.)
            U_P3PREXPED()
        Else
            MsgInfo("Nota fiscal não processada.")
        Endif
    Else
        MsgInfo("Fornecedor não cadastrado.")
    Endif

Return

User function XMLLegen(oModel)

    IF Alltrim(&(cTabImp+"->"+cTabImp+"_STATUS")) == 'NP'
        cCor := "BR_AMARELO"
    ElseIf Alltrim(&(cTabImp+"->"+cTabImp+"_STATUS")) == 'P'
        cCor := "BR_VERDE"
    Else
        cCor := "BR_VERMELHO"
    Endif

Return cCor

Static Function Cabecalho(oModel)

    Local oFont := TFont():New('Arial Black',,40,.T.)

    oSay1:= TSay():New(20,200,{||'Central de Importação'},oModel,,oFont,,,,.T.,CLR_BLUE,CLR_WHITE,200,50)

Return Nil

Static Function Filtro(lFiltro)

    Local oModel    := FWMODELACTIVE()
    Local oView     := FWViewActive()
    Local oModelF1 := IIF(lImpSE2,oModel:GetModel(cTabImp+'_FILHO1'),Nil)
    Local oModelF2 := IIF(lImpSE1,oModel:GetModel(cTabImp+'_FILHO2'),Nil)
    Local oModelF3 := IIF(lImpSC5,oModel:GetModel(cTabImp+'_FILHO3'),Nil)
    Local oModelF4 := IIF(lImpSC7,oModel:GetModel(cTabImp+'_FILHO4'),Nil)
    Local oModelF5 := IIF(lImpSF1,oModel:GetModel(cTabImp+'_FILHO5'),Nil)
    Local oModelF6 := IIF(lImpSF2,oModel:GetModel(cTabImp+'_FILHO6'),Nil)
    //Local cRegra   := " "
    Local aPergs   := {}
    Local aRet     := {}
    Local dDataImp := dDataBase
    Local cExpressao := Space(100)
    Local cFilZZZ  := Space(TamSx3(cTabImp+"_FILIAL")[1])

    Default lFiltro := .F.

    If !lFiltro

        AADD(aPergs,{4,;                    //3 - Checkbox
        "Não processados",;                    //2 - Descrição
        .T.,;                                //3 - .T. - inicia marcado; .F. - inicia desmarcado
        "Não processados",;                    //4 - Texto Checkbox
        50,;                                //5 - Tamanho do radio
        ,;                                //6 - Validação
        .F.;                                //7 - Parametro obrigatorio
        })

        AADD(aPergs,{4,;                    //3 - Checkbox
        "Processados",;                        //2 - Descrição
        .T.,;                                //3 - .T. - inicia marcado; .F. - inicia desmarcado
        "Processados",;                        //4 - Texto Checkbox
        50,;                                //5 - Tamanho do radio
        ,;                                //6 - Validação
        .F.;                                //7 - Parametro obrigatorio
        })

        AADD(aPergs,{4,;                    //3 - Checkbox
        "Erro",;                            //2 - Descrição
        .T.,;                                //3 - .T. - inicia marcado; .F. - inicia desmarcado
        "Erro",;                            //4 - Texto Checkbox
        50,;                                //5 - Tamanho do radio
        ,;                                //6 - Validação
        .F.;                                //7 - Parametro obrigatorio
        })

        AADD(aPergs,{1,;                    //1 - MsMGet
        "Data importação de",;                //2 - Descrição
        dDataImp,;                            //3 - Inicializador do cpo
        "",;                                //4 - Picture
        ".T.",;                                //5 - Validação
        "",;                                //6 - Consulta F3
        "",;                                //7 - Validação 'When' <- deixar sempre editavel
        50,;                                //8 - Tamanho do get
        .T.;                                //9 - Parametro obrigatorio
        })

        AADD(aPergs,{1,;                    //1 - MsMGet
        "Data importação de",;                //2 - Descrição
        dDataImp,;                            //3 - Inicializador do cpo
        "",;                                //4 - Picture
        ".T.",;                                //5 - Validação
        "",;                                //6 - Consulta F3
        "",;                                //7 - Validação 'When' <- deixar sempre editavel
        50,;                                //8 - Tamanho do get
        .T.;                                //9 - Parametro obrigatorio
        })

        AADD(aPergs,{1,;                    //1 - MsMGet
        "Arquivo contém a expressão",;        //2 - Descrição
        cExpressao,;                        //3 - Inicializador do cpo
        "",;                                //4 - Picture
        ".T.",;                                //5 - Validação
        "",;                                //6 - Consulta F3
        "",;                                //7 - Validação 'When' <- deixar sempre editavel
        50,;                                //8 - Tamanho do get
        .F.;                                //9 - Parametro obrigatorio
        })

        AADD(aPergs,{1,;                    //1 - MsMGet
        "Filial",;                            //2 - Descrição
        cFilZZZ,;                            //3 - Inicializador do cpo
        "",;                                //4 - Picture
        ".T.",;                                //5 - Validação
        "XM0",;                                //6 - Consulta F3
        "",;                                //7 - Validação 'When' <- deixar sempre editavel
        50,;                                //8 - Tamanho do get
        .F.;                                //9 - Parametro obrigatorio
        })


        IF !ParamBox(aPergs,"Filtro",aRet)
            Return ""
        Else
            IF !aRet[1] .and. !aRet[2] .and. !aRet[3]
                MsgInfo("Deve-se marcar uma opção de Status.")
                Return ""
            Endif
        Endif

        cRegra := "("

        If aRet[1]
            cRegra += cTabImp+"_STATUS = 'NP' OR "        
        Endif

        If aRet[2]
            cRegra += cTabImp+"_STATUS = 'P' OR "
        Endif

        If aRet[3]
            cRegra += cTabImp+"_STATUS = 'E' OR "
        Endif

        cRegra := SubStr(cRegra,1,Rat("OR",cRegra)-1)

        cRegra += ")"

        IF !Empty(aRet[4])
            cRegra += " AND " + cTabImp+"_DATA >= '"+DtoS(aRet[4])+"' "
        Endif

        IF !Empty(aRet[5])
            cRegra += " AND " + cTabImp+"_DATA <= '"+DtoS(aRet[5])+"' "
        Endif

        IF !Empty(aRet[6])
            cRegra += " AND " + cTabImp+"_ARQ LIKE '%"+Alltrim(aRet[6])+"%' "
        Endif

        IF !Empty(aRet[7])
            cRegra += " AND " + cTabImp+"_FILIAL = '"+Alltrim(aRet[7])+"' "
        Else
            cRegra += " AND " + cTabImp+"_FILIAL = '"+xFilial(cTabImp)+"' "
        Endif
    Else
        IF RetCodUsr() $ SuperGetMv("P3_XUSRIMP",,"000000,") 
            cRegra := ""
        Else
            cRegra := cTabImp+"_FILIAL = '"+xFilial(cTabImp)+"' "
        Endif
    Endif


    If oModelF1 <> Nil
        oModelF1:GoLine(1)
    Endif

    If oModelF2 <> Nil
        oModelF2:GoLine(1)
    Endif

    If oModelF3 <> Nil
        oModelF3:GoLine(1)
    Endif

    If oModelF4 <> Nil
        oModelF4:GoLine(1)
    Endif

    If oModelF5 <> Nil
        oModelF5:GoLine(1)
    Endif

    If oModelF6 <> Nil
        oModelF6:GoLine(1)
    Endif

    oModel:DeActivate()

    If oModelF1 <> Nil
        oModelF1:SetLoadFilter( , cRegra )
    Endif

    If oModelF2 <> Nil
        oModelF2:SetLoadFilter( , cRegra )
    Endif

    If oModelF3 <> Nil
        oModelF3:SetLoadFilter( , cRegra )
    Endif

    If oModelF4 <> Nil
        oModelF4:SetLoadFilter( , cRegra )
    Endif

    If oModelF5 <> Nil
        oModelF5:SetLoadFilter( , cRegra )
    Endif

    If oModelF6 <> Nil
        oModelF6:SetLoadFilter( , cRegra )
    Endif

    oModel:Activate()

    //Refresh no view
    If oModelF1 <> Nil
        oView:Refresh(cTabImp+'_FILHO1')
    Endif

    If oModelF2 <> Nil
        oView:Refresh(cTabImp+'_FILHO2')
    Endif

    If oModelF3 <> Nil
        oView:Refresh(cTabImp+'_FILHO3')
    Endif

    If oModelF4 <> Nil
        oView:Refresh(cTabImp+'_FILHO4')
    Endif

    If oModelF5 <> Nil
        oView:Refresh(cTabImp+'_FILHO5')
    Endif

    If oModelF6 <> Nil
        oView:Refresh(cTabImp+'_FILHO6')
    Endif

Return .T.

Static Function Botao( oModel )  
    Local oBMP
    Local oSay1
    Local oSay2
    Local oSay3
    //Local bErros := {|| oGrid:GetLine(),u_P3ERROS(nLinha) } 
    // Ancoramos os objetos no oModel passado 
    @ 10, 15 Button 'Visualizar Doc'       Size 60, 20 Message 'Visualizar Doc.' Pixel Action U_P3VISDOC(oModel) of oModel 

    @ 38, 15 Button 'Erro'                 Size 60, 20 Message 'Erro'            Pixel Action u_P3ERROS(oModel) of oModel

    @ 66, 15 Button 'Reprocessar'          Size 60, 20 Message 'Reprocessar'     Pixel Action U_P3REPROC(.F.,oModel) of oModel

    @ 94, 15 Button 'Reproc. todos'       Size 60, 20 Message 'Reproc. todos'   Pixel Action U_P3REPROC(.T.,oModel) of oModel

    @ 122, 15 Button 'Atualizar Tela'      Size 60, 20 Message 'Atualizar tela'  Pixel Action U_P3ATU001(oModel) of oModel

    @ 148, 15 Button 'Rel. Erros'          Size 60, 20 Message 'Rel. Erros'        Pixel Action U_P3RelErro(oModel) of oModel

    //aFontes := GetResArray("*.png")

    @ 176, 15 BITMAP oBMP FILE "AMARELO.PNG" SIZE 12, 12 OF oModel PIXEL
    @ 178, 30 SAY oSay1 PROMPT "Não processado" SIZE 100, 10 OF oModel PIXEL    
    @ 188, 15 BITMAP oBMP FILE "VERDE.PNG" SIZE 12, 12 OF oModel PIXEL
    @ 191, 30 SAY oSay2 PROMPT "Processado" SIZE 100, 10 OF oModel PIXEL
    @ 201, 15 BITMAP oBMP FILE "VERMELHO.PNG" SIZE 12, 12 OF oModel PIXEL
    @ 204, 30 SAY oSay3 PROMPT "Erro" SIZE 100, 10 OF oModel PIXEL

Return NIL 

User Function P3ATU001()

    Local oModel    := FWMODELACTIVE()
    Local oView     := FWViewActive()
    Local oModelF1 := IIF(lImpSE2,oModel:GetModel(cTabImp+'_FILHO1'),Nil)
    Local oModelF2 := IIF(lImpSE1,oModel:GetModel(cTabImp+'_FILHO2'),Nil)
    Local oModelF3 := IIF(lImpSC5,oModel:GetModel(cTabImp+'_FILHO3'),Nil)
    Local oModelF4 := IIF(lImpSC7,oModel:GetModel(cTabImp+'_FILHO4'),Nil)
    Local oModelF5 := IIF(lImpSF1,oModel:GetModel(cTabImp+'_FILHO5'),Nil)
    Local oModelF6 := IIF(lImpSF2,oModel:GetModel(cTabImp+'_FILHO6'),Nil)

    oModel:DeActivate()

    oModel:Activate()

    If oModelF1 <> Nil
        oModelF1:GoLine(1)
    Endif
    If oModelF2 <> Nil
        oModelF2:GoLine(1)
    Endif
    If oModelF3 <> Nil
        oModelF3:GoLine(1)
    Endif
    If oModelF4 <> Nil
        oModelF4:GoLine(1)
    Endif
    If oModelF5 <> Nil
        oModelF5:GoLine(1)
    Endif
    If oModelF6 <> Nil
        oModelF6:GoLine(1)
    Endif

    //Refresh no view
    If oModelF1 <> Nil
        oView:Refresh(cTabImp+'_FILHO1')
    Endif
    If oModelF2 <> Nil
        oView:Refresh(cTabImp+'_FILHO2')
    Endif
    If oModelF3 <> Nil
        oView:Refresh(cTabImp+'_FILHO3')
    Endif
    If oModelF4 <> Nil
        oView:Refresh(cTabImp+'_FILHO4')
    Endif
    If oModelF5 <> Nil
        oView:Refresh(cTabImp+'_FILHO5')
    Endif
    If oModelF6 <> Nil
        oView:Refresh(cTabImp+'_FILHO6')
    Endif
Return


User Function P3ERROS()

    //Local oError := ErrorBlock({|e| MsgAlert("Mensagem de Erro: " +chr(10)+ e:Description)})

    Local cTabErr     := SuperGetMV("MV_XTBERR",,"ZZY")
    Local cTmpImp     := SuperGetMV("MV_XTBIMP",,"ZZZ")
    Local aStru        := {}
    Local aCpoBro        := {}
    Local oModelEr        := FwModelActive()
    Local oView            := FwViewActive()
    Local aId            := oView:GetCurrentSelect()
    Local cId            := SubStr(aId[1],At("_FILHO",aId[1]),7)

    IF !"_FILHO" $ cID
        MsgInfo("Se posicione no registro desejado!")
        Return
    Endif

    Private oGrid       := oModelEr:GetModel(cTmpImp+cId)
    Private cChave    := oGrid:GetValue(cTmpImp+"_CHAVE")
    Private cJson     := oGrid:GetValue(cTmpImp+"_JSON")
    Private cDoc      := SubStr(oGrid:GetValue(cTmpImp+"_ARQ"),Len(FwxFilial(cTmpImp)),9)
    Private cAlias    := GetNextAlias()
    Private oTmpTable := FWTemporaryTable():New(cAlias)
    Private oDlg

    //Cria um arquivo de Apoio
    AADD(aStru,{"CODERRO","C", 3    ,0})
    AADD(aStru,{"ERRO"   ,"C", 40   ,0})
    AADD(aStru,{"DETALHE","C", 100  ,0})

    oTmpTable:SetFields(aStru)

    oTmpTable:Create()

    //Alimenta o arquivo de apoio com os registros do cadastro de clientes (SA1)
    DbSelectArea(cTabErr)
    (cTabErr)->(dbSetOrder(1))
    If (cTabErr)->(dbSeek(cChave))

        While  (cTabErr)->(!Eof()) .and. (cTabErr)->&(cTabErr+"_CHAVE") == cChave
            DbSelectArea(cAlias)

            RecLock(cAlias,.T.)
            (cAlias)->CODERRO   :=  (cTabErr)->&(cTabErr+"_CODERR")
            (cAlias)->ERRO      :=  (cTabErr)->&(cTabErr+"_ERRO")
            (cAlias)->DETALHE   :=  (cTabErr)->&(cTabErr+"_DETALH")
            (cAlias)->(MsUnlock())

            (cTabErr)->(DbSkip())
        Enddo

        //Define quais colunas (campos da TTRB) serao exibidas na MsSelect
        aCpoBro    := {;
            { "CODERRO"        ,, "Codigo"         ,"@!"},;
            { "ERRO"        ,, "Erro"           ,"@!"},;
            { "DETALHE"        ,, "Detalhe"        ,"@!"}}

        //Cria uma Dialog
        DEFINE MSDIALOG oDlg TITLE "Erros Doc: " + cDoc  From 9,0 To 350,800 PIXEL
        DbSelectArea(cAlias)
        (cAlias)->(DbGotop())

        //Cria a MsSelect
        /*
        cAlias - Alias da tabela utilizada pela MsSelect para controle dos registros/colunas apresentadas.    
        cCampo - Nome do campo presente na tabela definida em cAlias, qual contemplara a opção de marcação (check/unckeck)    
        cCpo - Campo da tabela informada pelo parametro cAlias ou função que será executada na apresentação da coluna que 
               indica se a linha da MsSelect esta habilitada ou não.    
        aCampos - Vetor com informações dos campos para criação das colunas da MsSelect. Se não for informado, a MsSelect 
                  irá criar as colunas baseado no Dicionário de Campos (SX3) da tabela informada no parametro cAlias.    
        lInv - Indica se MsSelect irá utilizar marcação invertida    
        cMar - Marca que será utilizada pela MsSelect para controle do campo informado pelo parametro cCampo. 
               Para utilizar o parametro cMar, utilize a função GetMark() para retornar a próxima marca disponivel para uso.    
        aCord - Coordenadas para criação da MsSelect, sendo:aCord[1] = Coordenada vertical inicial
                                                            aCord[2] = Coordenada horizontal inicial
                                                            aCord[3] = Altura do objeto MsSelect
                                                            aCord[4] = Largura do objeto MsSelect    
        cTopFun - Função que retornará o conteúdo inicial que a MsSelect utilizará para apresentar a primeira linha da tabela, 
                  como um range, junto com o parametro cBotFun. O conteúdo retornado será utilizado para fazer o posicionamento 
                  da tabela informada pelo parametro cAlias, baseado na chave de índice posicionada para a mesma.    
        cBotFun - Função que retornará o conteúdo final que a MsSelect utilizará para apresentar a última linha da tabela, 
                  como um range, junto com o parametro cTopFun. O conteúdo retornado será utilizado para o posicionamento 
                  final da tabela informada pelo parametro cAlias, baseado na chave de índice posicionada para a mesma.    
        oWnd - Objeto tipo "Dialog" (MSDIALOG, MSWINDOW, MSPANEL, etc.) aonde a MsSelect sera posicionada.    
        uPar11 - Parametro reservado relativo a compatibilidade.    
        aColors - Vetor com regras para a apresentação da coluna de legenda.    
        */
        oMsSel  := MsSelect():New(cAlias,"","",aCpoBro,,,{017,005,150,400},,,,,)
        oButton := TButton():New( 155, 005, "Corrigir",oDlg,{|| Corrigir((cAlias)->CODERRO,cChave,cJson) }, 40,10,,,.F.,.T.,.F.,,.F.,,,.F. )


        //Exibe a Dialog
        ACTIVATE MSDIALOG oDlg CENTERED
    Else
        MsgAlert("Nenhum erro encontrado para o registro selecionado.")
    EndIf

    //Fecha a Area e elimina os arquivos de apoio criados em disco.
    oTmpTable:Delete()

    //ErrorBlock(oError)
Return

Static Function Corrigir(cCodErro,cChave,cJson)

    Local oJson := Nil
    Local nX, nY
    Local aDados
    Local aCabec
    Local aItens

    //nLinAtu := oGrid:GetLine()

    /*
    -- Lista de erros:
    - 001: Sem amarração Produtos X Fornecedor
    - 002: Erro de Rotina Automática
    - 003: Nota Fiscal já cadastrada
    - 004: Fornecedor não cadastrado
    - 005: CNPJ não encontrado entre as filiais
    */

    //Retorna Objetos do Json
    oJson := JsonObject():New()
    oJson:FromJson(cJson)

    IF ValType(oJson) == "J"
        aDados := oJson:GetNames()
        For nX := 1 to Len(aDados)
            IF aDados[nX] == "SF1"
                oCabec := oJson:GetJsonObject(aDados[nX])
                aCabec := oCabec:GetNames()
            Else
                aItem := {}
                aItens := oJson:GetJsonObject(aDados[nX])
                For nY := 1 to Len(aItens)
                    oItens := aItens[nY]
                    aAdd(aItem,aItens[nY]:GetNames())
                Next nX
            Endif
        Next nX
    Else
        MsgAlert('Falha no Json. Contate o Administrador.')
    Endif

    For nX := 1 to Len(aCabec)
        IF aCabec[nx] == "A2_CGC"
            cCnpj := oCabec:GetJsonText(aCabec[nX])
        Endif
    Next nX

    DbSelectArea("SA2")
    SA2->(DbSetOrder(3))
    SA2->(MsSeek(xFilial("SA2") + cCnpj))

    aProdutos := {}
    For nX := 1 to Len(aItem)
        For nY := 1 to Len(aItem[nX])
            //Verifica se existe amarração do produto com o fornecedor
            IF aItem[nX][nY] == "D1_COD"
                DbSelectArea("SA5")
                SA5->(DbSetOrder(14))
                IF !SA5->(MsSeek(xFilial("SA5") + SA2->A2_COD + SA2->A2_LOJA + aItens[nX]:GetJsonText(aItem[nX][nY])))
                    aAdd(aProdutos,aItens[nX]:GetJsonText(aItem[nX][nY]),MODEL_OPERATION_INSERT)
                Else
                    IF Empty(SA5->A5_PRODUTO)
                        aAdd(aProdutos,aItens[nX]:GetJsonText(aItem[nX][nY]),MODEL_OPERATION_UPDATE)
                    EndIf
                Endif
            Endif
        Next nY
    Next nX

    Do Case
    Case "001" $ cCodErro
        AmarraPrdFor(aProdutos)
    Case "002" $ cCodErro
        MsgInfo("Erro ainda não mapeado para correção automática.")
    Case "003" $ cCodErro
        MsgInfo("Nota Fiscal já cadastrada. Não há correção.")
    Case "004" $ cCodErro
        IncluiForn(cCnpj)
    Case "005" $ cCodErro
        MsgInfo("Filial não cadastrada. Não há correção.")
    EndCase
Return


Static Function AmarraPrdFor(aProdutos,nOpc)

    Local oModelA5 := Nil
    Local nX

    For nX := 1 to Len(aProdutos)

        oModelA5 := FWLoadModel('MATA061')

        oModelA5:SetOperation(nOpc)
        oModelA5:Activate()

        //Cabeçalho
        oModelA5:SetValue('MdFieldSA5','A5_PRODUTO','')
        oModelA5:SetValue('MdFieldSA5','A5_NOMPROD','')

        //Grid
        oModelA5:SetValue('MdGridSA5','A5_FORNECE',SA2->A2_COD)
        oModelA5:SetValue('MdGridSA5','A5_LOJA'   ,SA2->A2_LOJA)
        oModelA5:SetValue('MdGridSA5','A5_CODPRF' ,aProdutos[nX])
        //oModelA5:SetValue('MdGridSA5','A5_CODPRF' ,'abc')

        FWExecView("Incluir","MATA061",nOpc,,{|| .T.},,,,,,,oModelA5)

        oModelA5:DeActivate()
        oModelA5:Destroy()
        oModelA5 := Nil
    Next nX

    FreeObj(oModelA5)

Return

Static Function IncluiForn(cCnpj)


    Local oModelA5 := Nil
    Local oRest    := Nil
    Local oResult  := Nil
    Local aHeader  := {}
    Local nZ

    oModelA5 := FWLoadModel('MATA061')

    oRest := FwRest():New("http://receitaws.com.br")
    oRest:SetPath("/v1/cnpj/"+cCnpj)

    aAdd(aHeader,"")

    IF (oRest:Get(aHeader))
        oResult := oRest:GetResult()

        //TODO: Ver cadastro de fornecedor
        oFornece := JsonObject():New()
        oFornece:FromJson(oResult)

        aSA2 := oFornece:GetNames()

        oModelSA2 := FWLoadModel('MATA020')

        oModelSA2:SetOperation(MODEL_OPERATION_INSERT)
        oModelSA2:Activate()

        For nZ := 1 to Len(aSA2)
            Do Case

            Case aSA2[nZ] == "nome"
                oModelSA2:SetValue('SA2MASTER','A2_COD'   ,CriaVar("A2_COD"))
                oModelSA2:SetValue('SA2MASTER','A2_LOJA'  ,CriaVar("A2_LOJA"))
                oModelSA2:SetValue('SA2MASTER','A2_NOME'  ,oFornece:GetJsonText(aSA2[nZ]))
                oModelSA2:SetValue('SA2MASTER','A2_NREDUZ',oFornece:GetJsonText(aSA2[nZ]))
            Case aSA2[nZ] == "email"
                oModelSA2:SetValue('SA2MASTER','A2_EMAIL',oFornece:GetJsonText(aSA2[nZ]))
            Case aSA2[nZ] == "logradouro"
                oModelSA2:SetValue('SA2MASTER','A2_END'    ,oFornece:GetJsonText(aSA2[nZ]))
            Case aSA2[nZ] == "bairro"
                oModelSA2:SetValue('SA2MASTER','A2_BAIRRO' ,oFornece:GetJsonText(aSA2[nZ]))
            Case aSA2[nZ] == "cep"
                oModelSA2:SetValue('SA2MASTER','A2_CEP',StrTran(StrTran(oFornece:GetJsonText(aSA2[nZ]),'.',''),'-',''))
            Case aSA2[nZ] == "uf"
                oModelSA2:SetValue('SA2MASTER','A2_EST' ,oFornece:GetJsonText(aSA2[nZ]))
            Case aSA2[nZ] == "cnpj"
                oModelSA2:SetValue('SA2MASTER','A2_TIPO' ,'J')
                oModelSA2:SetValue('SA2MASTER','A2_CGC'  ,StrTran(StrTran(StrTran(oFornece:GetJsonText(aSA2[nZ]),'.',''),'-',''),'/',''))            
            EndCase
        Next
    Endif

    FWExecView("Incluir","MATA020",MODEL_OPERATION_INSERT,,{|| .T.},,,,,,,oModelSA2)
    oModelSA2:DeActivate()
    oModelSA2:Destroy()
    oModelSA2 := Nil

    FreeObj(oModelSA2)
Return


User Function P3REPROC(lTodos,oModelPai)

    Processa( {|| U_XP3REPROC(lTodos,oModelPai) }, "Aguarde...", "Reprocessando...",.F.)

Return

User Function XP3REPROC(lTodos,oModelPai)
    Local lJob         := .F.
    Local oModel     := FWModelActivate()
    Local cTmpImp     := SuperGetMV("MV_XTBIMP",,"ZZZ")
    Local cTabErr     := SuperGetMV("MV_XTBERR",,"ZZY")
    Local oView     := FWViewActive()
    Local cQuery    := ""
    Local cFiltro   := ""
    Private aId        := oView:GetCurrentSelect()
    Private cId        := SubStr(aId[1],At("_FILHO",aId[1]),7)
    Private oParseJSON

    IF !"_FILHO" $ cID
        MsgInfo("Se posicione no registro desejado!")
        Return
    Endif

    cRegra := ""
     oModel:GetModel(cTabImp+cId):SetLoadFilter(,cRegra)

    oModel:Activate()

    Private oGrid     := oModel:GetModel(cTmpImp+cID)
    Private nOpc     := oGrid:GetValue(cTmpImp+"_OPER")
    Private cChave     := oGrid:GetValue(cTmpImp+"_CHAVE")
    Private cJSon     := oGrid:GetValue(cTmpImp+"_JSON")
    Private nLinha  := oGrid:GetLine()
    Private nRecno  := oGrid:GetDataId(nLinha)

    IF !lTodos
        dbSelectArea(cTmpImp)
        (cTmpImp)->(dbGoTo(nRecno))

        ProcRegua(1)

        If &(cTmpImp+"_STATUS") <> "P"
            If &(cTmpImp+"_EMUSO") <> "S"
                IncProc()
                //Trava registro
                RecLock(cTmpImp,.F.)
                (cTmpImp)->&(cTmpImp+"_EMUSO") := "S"
                (cTmpImp)->(MsUnlock())

                IF nOpc == "I"
                    nOpc := 3
                Else
                    nOpc := 4
                Endif

                FWJsonDeserialize(cJSon, @oParseJSON)

                Do Case
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SF1"
                    FWMsgRun(, {|oSay| U_P3GERNF(nOpc,cChave,lJob,oSay) }, "Aguarde", "Reprocessando Nota Fiscal...")
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SE2"
                    MsgInfo("Este processo é integrado online, não pode ser reprocessado!")
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SC7"
                    FWMsgRun(, {|oSay| U_P3GERSC7(nOpc,cChave,lJob,oSay) }, "Aguarde", "Reprocessando Pedido de Compra...")
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SF2"
                    FWMsgRun(, {|oSay| U_P3GERSAI(nOpc,cChave,lJob,oSay) }, "Aguarde", "Reprocessando Faturamento...")
                EndCase

                //Libera registro
                RecLock(cTmpImp,.F.)
                (cTmpImp)->&(cTmpImp+"_EMUSO") := "N"
                (cTmpImp)->(MsUnlock())
            Else
                MsgAlert("Registro em uso por outro processo.")
            EndIf
        Else
            MsgAlert("Registro já processado.")
        EndIf
    else

        cFiltro := oGrid:GetLoadFilter()[2]

        ProcRegua(100)
        dbSelectArea(cTmpImp)
        (cTmpImp)->(dbGoTo(nRecno))

        cQuery += " SELECT R_E_C_N_O_ RECNO "
        cQuery += " FROM " + RetSqlName(cTmpImp)
        cQuery += " WHERE D_E_L_E_T_ = ' ' "
        cQuery += " AND "+cTmpImp+"_TABELA = '"+(cTmpImp)->&(cTabImp + "_TABELA")+"' "
        cQuery += " AND "+cTmpImp+"_FILIAL = '"+ cFilAnt +"' "
        cQuery += " AND "+cTmpImp+"_STATUS IN ('NP','E') "
        IF !Empty(cFiltro)
            cQuery += " AND " + cFiltro
        Endif
        cQuery += " ORDER BY "+cTmpImp+"_DATA

        cQuery := ChangeQuery(cQuery)

        MPSysOpenQuery( cQuery , "TMP" )

        While !TMP->(Eof())
            //Posiciona com o recno
            dbSelectArea(cTmpImp)
            (cTmpImp)->(dbGoTo(TMP->RECNO))

            If &(cTmpImp+"_EMUSO") <> 'S' .AND. Alltrim(&(cTmpImp+"_STATUS")) $ 'NP#E'
                IncProc()
                //Trava registro
                RecLock(cTmpImp,.F.)
                (cTmpImp)->&(cTmpImp+"_EMUSO") := "S"
                (cTmpImp)->(MsUnlock())

                IF &(cTmpImp+"_OPER") == "I"
                    nOpc := 3
                Else
                    nOpc := 4
                Endif

                FWJsonDeserialize(&(cTmpImp+"_JSON"), @oParseJSON)

                Do Case
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SF1"
                    FWMsgRun(, {|oSay| U_P3GERNF(nOpc,&(cTmpImp+"_CHAVE"),lJob,oSay) }, "Aguarde", "Reprocessando Nota Fiscal...")
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SE2"
                    MsgInfo("Este processo é integrado online, não pode ser reprocessado!")
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SC7"
                    FWMsgRun(, {|oSay| U_P3GERSC7(nOpc,&(cTmpImp+"_CHAVE"),lJob,oSay) }, "Aguarde", "Reprocessando Pedido de Compra...")
                Case (cTmpImp)->&(cTabImp + "_TABELA") == "SF2"
                    FWMsgRun(, {|oSay| U_P3GERSAI(nOpc,&(cTmpImp+"_CHAVE"),lJob,oSay) }, "Aguarde", "Reprocessando Faturamento...")
                EndCase

                //Libera registro
                RecLock(cTmpImp,.F.)
                (cTmpImp)->&(cTmpImp+"_EMUSO") := "N"
                (cTmpImp)->(MsUnlock())
            EndIf
            TMP->(DbSkip())
        EndDo

        TMP->(dbCloseArea())

    Endif

    oModel:DeActivate()
    oModel:Activate()
    oGrid:GoLine(nLinha)
    oView:Refresh(cTabImp+cId)

    //Emite Relatorio de Erros
    U_P3RELERRO(.T.)

Return


User Function fDeleteLog(cTabErr,cChave)
    Local cSQL := ""

    cSQL := " DELETE FROM "+RetSqlName(cTabErr)
    cSQL += " WHERE "+cTabErr+"_CHAVE = '"+Alltrim(cChave)+"' "

    If TCSQLExec(cSQL) < 0
        MsgStop( "Erro ao deletar LOG: " + TCSQLError(), 'Atenção' )
    Endif

Return
compartilhar
  • Só pra ficar mais claro:

    Eu tenho uma tela de erros de uma importação que estou fazendo. Está tudo em MVC. Nesta tela de erro eu tenho um botão chamado CORRIGIR. Neste momento eu chamo as rotinas do Protheus para cadastrar fornecedor, produto ou amarração produto x fornecedor.

    Esta rotina é uma rotina de integração com WS para cadastros de títulos, pedidos, documentos de entrada, etc via integração com outro sistema.

    Só que pode ocorrer de não existir alguns dados no Protheus. O usuário precisa corrigir.

    Sempre que chamo a rotina padrão do Protheus, meu model fica inativo.

    Raphael Neves Pinheiro   26 de Jun de 2021
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags mvc advpl modeldef protheus viewdef ou faça a sua própria pergunta.