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