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