Perguntas Apos gravar dados na base de Dados MVC

Mais
3 anos 1 mês atrás - 3 anos 1 mês atrás #33185 por Wanderson
Boa Tarde Pessoal,

Estou precisando da ajuda de voce para

1º atualizar uma tabela externa depois que o sistema gravar os dados na base de dados do protheus, a tela foi feita em MVC e não sei onde colocar esta chamada para atualizar as tabelas externas, será que alguém pode me ajudar
2º Quando selecionar a opção Alterar o grid deve sofre algumas alterações, tenho um campo VLRECUPERAC que devo abater este de cada item na grid do campo SLD ATUAL D. antes de mostrar os dados ao usuario.

Segue abaixo o Fonte.
#include "protheus.ch"
#include "fwmvcdef.ch"
#INCLUDE 'TOPCONN.CH'

#Define ALIAS_FORM0 "ZB0"
#Define ALIAS_GRID0 ALIAS_FORM0

//
/*/{Protheus.doc} VSPFI31
Tela de Analise do tester
Tipo: MVC

@author Wanderson F.Souza
@type function
@since 14/10/2021
/*/
//
User Function VSPFI31()
Local oBrowse As Object
Local cAliasForm := ALIAS_FORM0
Private aRotina := MenuDef()
Private aSED := {}
oBrowse := FWMBrowse():New()
oBrowse:SetAlias("ZB0")
oBrowse:SetDescription("Transferencias - Quicken")
oBrowse:SetMenuDef("GSFAT097")
/*
oBrowse:AddLegend( cAliasForm+"_STATUS =='N' ", "GREEN", "Nova Rotina para Desenvolvimento" )
oBrowse:AddLegend( cAliasForm+"_STATUS =='D' ", "BR_CANCEL", "Rotina Descontinuada" )
oBrowse:AddLegend( cAliasForm+"_STATUS =='E' ", "BR_LARANJA", "Rotina em Desenvolvimento" )
oBrowse:AddLegend( cAliasForm+"_STATUS =='T' ", "RIGHT", "Enviado para Tester" )
oBrowse:AddLegend( cAliasForm+"_STATUS =='X' ", "PMSSETAESQ", "Item Liberado para Uso em Produção." )
oBrowse:AddLegend( cAliasForm+"_STATUS =='A' ", "PEDIDO", "Aprovado pelo Tester" )
oBrowse:AddLegend( cAliasForm+"_STATUS =='L' .AND. " + cAliasForm+"_TPATIV =='L' .AND. "+ cAliasForm+"_APROVA =='Sim'", "CHECKED", "Rotina Liberado para Uso em producao" )
*/
oBrowse:Activate()

Return NIL

//
/*/{Protheus.doc} MenuDef
Definição do Menu do Programa

@author Wanderson F.Souzas
@since 28/04/2021

/*/
//
Static Function MenuDef()
Local aRotina As Array

aRotina := {}
ADD OPTION aRotina TITLE "Pesquisar" ACTION "VIEWDEF.VSPFI31" OPERATION 1 ACCESS 0
ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.VSPFI31" OPERATION 2 ACCESS 0
ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.VSPFI31" OPERATION 3 ACCESS 0
ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.VSPFI31" OPERATION 4 ACCESS 0
ADD OPTION aRotina TITLE "Imprimir" ACTION "VIEWDEF.VSPFI31" OPERATION 8 ACCESS 0

Return (aRotina)

//
/*/{Protheus.doc} ModelDef
Definição do modelo de Dados

@author Wanderson F.Souzas
@since 28/04/2021

/*/
//
Static Function ModelDef()
Local oMasterZB0 As Object
Local oDetailZB0 As Object
Local oModel As Object

oMasterZB0 := FWFormStruct(1, "ZB0", {|cIdField| VldField(cIdField)})
oDetailZB0 := FWFormStruct(1, "ZB0", {|cIdField| !VldField(cIdField)})

oModel := MPFormModel():New("VSPFI31M", /*bPre*/, /*bPost*/, /*bCommit*/, /*bCancel*/)

oModel:SetDescription("Transferencia")
oModel:AddFields("ZB0MASTER", /*cOwner*/, oMasterZB0)
oModel:SetPrimaryKey({"ZB0_FILIAL", "ZB0_IDSEQ", "ZB0_ITEM"})

oModel:AddGrid("ZB0DETAIL", "ZB0MASTER", oDetailZB0, /*bLinePre*/, /*bLinePost*/, /*bPre*/, /*bLinePost*/, /*bLoad*/)
oModel:SetRelation("ZB0DETAIL", {{"ZB0_FILIAL", "FWxFilial('ZB0')"}, {"ZB0_IDSEQ", "ZB0_IDSEQ"}}, ZB0->(IndexKey(1)))

oModel:GetModel("ZB0DETAIL"):SetUniqueLine({"ZB0_ITEM"})
oModel:GetModel("ZB0MASTER"):SetDescription("Cabecalho")
oModel:GetModel("ZB0DETAIL"):SetDescription("Itens")

//Bloqueia o campo para Edição no Grid
oDetailZB0:SetProperty('ZB0_ITEM', MODEL_FIELD_WHEN, FwBuildFeature(STRUCT_FEATURE_WHEN, '.F.')) //Modo de Edição

Return (oModel)

//
/*/{Protheus.doc} ViewDef
Definição da interface

@author Wanderson F.Souzas
@since 28/04/2021
/*/
//
Static Function ViewDef()
LOCAL oView as Object
LOCAL oModel as Object
LOCAL oMasterZB0 as Object
LOCAL oDetailZB0 as Object

oModel := FWLoadModel("VSPFI31")
oMasterZB0 := FWFormStruct(2, "ZB0", {|cIdField| VldField(cIdField)})
oDetailZB0 := FWFormStruct(2, "ZB0", {|cIdField| !VldField(cIdField)})

//Remove Field da Grid

oDetailZB0:RemoveField("ZB0_IDSEQ")
oDetailZB0:RemoveField("ZB0_FILORI")
oDetailZB0:RemoveField("ZB0_DATA")
oDetailZB0:RemoveField("ZB0_NFIORI")
oDetailZB0:RemoveField("ZB0_SLDIFO")

//Criando grupos
oMasterZB0:AddGroup( 'GRUPO01', 'Cabecalho' , '', 2 )

// Colocando alguns campos por agrupamentos'
oMasterZB0:SetProperty( 'ZB0_IDSEQ' , MVC_VIEW_GROUP_NUMBER , 'GRUPO01' )
oMasterZB0:SetProperty( 'ZB0_DATA' , MVC_VIEW_GROUP_NUMBER , 'GRUPO01' )
oMasterZB0:SetProperty( 'ZB0_FILORI' , MVC_VIEW_GROUP_NUMBER , 'GRUPO01' )
oMasterZB0:SetProperty( 'ZB0_NFIORI' , MVC_VIEW_GROUP_NUMBER , 'GRUPO01' )
oMasterZB0:SetProperty( 'ZB0_SLDIFO' , MVC_VIEW_GROUP_NUMBER , 'GRUPO01' )

oView := FWFormView():New()
oView:SetModel(oModel)

oView:AddField("ZB0MASTER", oMasterZB0)
oView:AddGrid("ZB0DETAIL", oDetailZB0)

oView:AddIncrementField("ZB0DETAIL", "ZB0_ITEM")

oView:CreateHorizontalBox("SUPERIOR", 30)
oView:CreateHorizontalBox("INFERIOR", 70)

oView:SetOwnerView("ZB0MASTER", "SUPERIOR")
oView:SetOwnerView("ZB0DETAIL", "INFERIOR")

&& Gatilho para encrementar o Cabeçalho
oView:SetFieldAction("ZB0_FILORI", {|oView, cIdView, cField, xValue| U_FSLDINI(oView, cIdView, cField, xValue)})

&& Gatilho para Alimentar o Grid
oView:SetFieldAction("ZB0_FILDES", {|oView, cIdView, cField, xValue| U_FAGRID(oView, cIdView, cField, xValue)})


Return (oView)

//
/*/{Protheus.doc} VldField
Define quais campos ficarão do cabeçalho

@author Wanderson F.Souzas
@since 28/04/2021

/*/
//
Static Function VldField(cIdField As Char)
Local aHeader As Array
Local lRet As Logical

aHeader := {}

AAdd(aHeader, "ZB0_IDSEQ")
AAdd(aHeader, "ZB0_DATA")
AAdd(aHeader, "ZB0_FILORI")
AAdd(aHeader, "ZB0_NFIORI")
AAdd(aHeader, "ZB0_SLDIFO")

lRet := (AScan(aHeader, {|x| (x == RTrim(cIdField))}) > 0)

Return (lRet)


// Funcao para Mostrar o Saldo Inicial da Filial Origem
User Function FSLDINI(oView, cIdView, cField, xValue)

//Variaveis para controle do Modelo
Local oModel := oView:GetModel()
Local nOperation := 0
Local cCodFilOrigem := oModel:GetValue("ZB0MASTER", "ZB0_FILORI")
Local nOperation := oModel:GetOperation()

//Variaveis para Controle de Filiais
Local cDesFil := Space(30)
Local nPos := 0
Local xFilial := {}

cQuery:=" SELECT * FROM FLUXO_SALDOINICIAL "
cQuery+=" WHERE "
cQuery+=" FILIAL='" + cCodFilOrigem + "'"
cQuery+=" AND SUBSTRING(DATA,1,6) ='" + Substr(Dtos(Date()),1,6) +"'""

TCQuery cQuery New Alias "SLDINI"
Count To nTotal
dbSelectArea("SLDINI")
dbGoTop()

IF nOperation == MODEL_OPERATION_INSERT .Or. nOperation == MODEL_OPERATION_UPDATE
oModel:GetModel("ZB0MASTER"):SetValue("ZB0_SLDIFO" , SLDINI->VALOR) && Saldo Filial Origem
oView:Refresh()
ENDIF

SLDINI->(dbCloseArea() )

dbSelectArea("SM0")
SM0->(dbGotop())

While !Eof()

// Filiais Desativadas
If SM0->M0_CODIGO == "99" .OR. ;
SM0->M0_CODFIL == "01" .OR. ;
SM0->M0_CODFIL == "02" .OR. ;
SM0->M0_CODFIL == "05" .OR. ;
SM0->M0_CODFIL == "15" .OR. ;
SM0->M0_CODFIL == "45" .OR. ;
SM0->M0_CODFIL == "50" .OR. ;
SM0->M0_CODFIL == "80"
SM0->(dbSkip())
Loop
Endif

aADD(xFilial,{SM0->M0_CODFIL,SM0->M0_FILIAL})

dbSelectArea("SM0")
SM0->(dbSkip())
Enddo

If !Empty(cCodFilOrigem)
nPos := aScan(xFilial,{|x| x[1]==cCodFilOrigem})

If nPos <> 0
cDesFil := xFilial[nPos][2]
EndIf

else
nPos := aScan(xFilial,{|x| x[1]==cCodFilOrigem})

If nPos <> 0
cDesFil := xFilial[nPos][2]
EndIf
Endif

IF nOperation == MODEL_OPERATION_INSERT .Or. nOperation == MODEL_OPERATION_UPDATE
oModel:GetModel("ZB0MASTER"):SetValue("ZB0_NFIORI" , cDesFil) && Nome da Filial
oView:Refresh()
ENDIF

Return()

// Funcao Alimentar o grid
User Function FAGRID(oView, cIdView, cField, xValue)

//Variaveis para controle do Modelo
Local oModel := oView:GetModel()
Local nOperation := 0
Local cCodFilOrigem := oModel:GetValue("ZB0DETAIL", "ZB0_FILDES")
Local nOperation := oModel:GetOperation()

Local cDesFil := Space(30)
Local nPos := 0
Local xFilial := {}
Local nValDest := 0

cQuery:=" SELECT * FROM FLUXO_SALDOINICIAL "
cQuery+=" WHERE "
cQuery+=" FILIAL='" + cCodFilOrigem + "'"
cQuery+=" AND SUBSTRING(DATA,1,6) ='" + Substr(Dtos(Date()),1,6) +"'""

TCQuery cQuery New Alias "TMPGRID"
Count To nTotal
dbSelectArea("TMPGRID")
dbGoTop()
nValDest := TMPGRID->VALOR
TMPGRID->(dbCloseArea())

dbSelectArea("SM0")
SM0->(dbGotop())

While !Eof()

// Filiais Desativadas
If SM0->M0_CODIGO == "99" .OR. ;
SM0->M0_CODFIL == "01" .OR. ;
SM0->M0_CODFIL == "02" .OR. ;
SM0->M0_CODFIL == "05" .OR. ;
SM0->M0_CODFIL == "15" .OR. ;
SM0->M0_CODFIL == "45" .OR. ;
SM0->M0_CODFIL == "50" .OR. ;
SM0->M0_CODFIL == "80"
SM0->(dbSkip())
Loop
Endif

aADD(xFilial,{SM0->M0_CODFIL,SM0->M0_FILIAL})

dbSelectArea("SM0")
SM0->(dbSkip())
Enddo

If !Empty(cCodFilOrigem)
nPos := aScan(xFilial,{|x| x[1]==cCodFilOrigem})

If nPos <> 0
cDesFil := xFilial[nPos][2]
EndIf

else
nPos := aScan(xFilial,{|x| x[1]==cCodFilOrigem})

If nPos <> 0
cDesFil := xFilial[nPos][2]
EndIf
Endif

IF nOperation == MODEL_OPERATION_INSERT .Or. nOperation == MODEL_OPERATION_UPDATE
oModel:GetModel("ZB0DETAIL"):SetValue("ZB0_NFILCR" , cDesFil) && Nome da Filial
oModel:GetModel("ZB0DETAIL"):SetValue("ZB0_SLDATU" , nValDest) && Saldo da Filial de Destino que recebera o Credito
oModel:GetModel("ZB0DETAIL"):SetValue("ZB0_RECVL" , nValDest) && Mantem o Saldo Origem antes da Transferencia,
&& caso seja necessário efetuar uma alteração este VALOR
&& passa a ser o Principal no campo Sld.Atual D. ZB0_SLDATU

ElseIf nOperation == MODEL_OPERATION_UPDATE

oModel:GetModel("ZB0DETAIL"):SetValue("ZB0_SLDATU" , nValDest ) && Saldo da Filial de Destino que recebera o Credito

oView:Refresh()
ENDIF

Return()


// Função para Atualizar base externa
User Function fAtuBex()

Alert('Base externa atualizada')

Endif
Ultima edição: 3 anos 1 mês atrás por Wanderson.

Por favor Acessar ou Registrar para participar da conversa.

Mais
3 anos 1 mês atrás #33186 por Wanderson
Complemento.

Quando Seleciono a Opção alterar, em que ponto do fonte posso colocar uma validação para atualizar campos no grid.

Por favor Acessar ou Registrar para participar da conversa.

Mais
3 anos 1 mês atrás #33187 por admin
Respondido por admin no tópico Apos gravar dados na base de Dados MVC
Na criação do ModelForm vc vai colocar uma função para tratar após gravação.

oModel := MPFormModel():New('IniCuraM',,,{ |oModel| fGrava(oModel)}/*bCommit*/,/*bCancel*/)

Exemplo ai do fGrava.


Static Function fGrava(oModel)
Local aArea := GetArea()

If FWFormCommit( oModel ) // Grava os Dados e Retorna .T.

Aqui vc fara o tratamento que deseja na tabela, os dados já foram gravados ok.

Endif
RestArea(aArea)
Return .T.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.093 segundos
Joomla templates by a4joomla