Salvando dados de um Grid MVC

Boa noite!

Prezados, gostaria de tirar uma dúvida sobre qual a melhor maneira de salvar dados de um Grid MVC.

Atualmente estou usando da maneira como enviei abaixo, mas não sei se é a melhor.

Static Function fCommit(oModel)
Local nX            := 0
Local nY         := 0
local nOpc          := oModel:GetOperation()
Local oForm         := oModel:GetModel('ModelHead')
Local oGrid         := oModel:GetModel('ModelGrid')
Local aCposForm  := oForm:GetStruct():GetFields()
Local aCposGrid  := oGrid:GetStruct():GetFields()

    If(nOpc == MODEL_OPERATION_UPDATE)

        RecLock('ZT8',.F.)

            For nY := 1 To Len(aCposForm)

                If(ZT8->(FieldPos(aCposForm[nY,3])) > 0)

                    ZT8->&(aCposForm[nY,3]) := oForm:GetValue(aCposForm[nY,3])

                EndIf

            Next nY

        ZT8->(MsUnlock())

        For nX := 1 To oGrid:GetQtdLine()

            oGrid:GoLine(nX)
            ZT9->(DbGoTo(oGrid:GetDataID()))

            If(oGrid:IsDeleted())

                RecLock('ZT9',.F.)
                    ZT9->(DbDelete())
                ZT9->(MsUnlock())

            Else

                RecLock('ZT9',ZT9->(EoF()))

                    For nY := 1 To Len(aCposGrid)

                        If(aCposGrid[nY,3] = 'ZT9_CODIGO')

                            ZT9->&(aCposGrid[nY,3]) := ZT8->ZT8_CODIGO

                        Else

                            ZT9->&(aCposGrid[nY,3]) := oGrid:GetValue(aCposGrid[nY,3])

                        EndIf

                    Next nY

                ZT9->(MsUnlock())

            EndIf

        Next    

Return .T.

Existe alguma função que facilite a gravação desses dados ou da forma acima está correta?

Observação : ZT8 = Cabeçalho e ZT9 = Itens.

No caso a seguir, o campo de Filial do grid não é preenchido (ZD1_FILIAL):

Static Function ModelDef
Local oModel     := Nil
Local oStruHead    := FwFormStruct(1,'ZF1')
Local oStruGrid := FwFormStruct(1,'ZD1')

    //Monta o modelo principal
    oModel := MpFormModel():New('FATA20MVC',{ |oModel| fPreVld(oModel) },/*Validação*/,/*Commit*/)

    //Monta os dados do cabeçalho
    oModel:AddFields('ModelHead',,oStruHead)
    oModel:SetPrimaryKey({'ZF1_FILIAL','ZF1_NUM','ZF1_VEND','ZF1_CODCLI','ZF1_LOJA'})

    oModel:GetModel('ModelHead'):SetDescription('Cabecalho')

    //Monta os dados dos itens
    oModel:AddGrid('ModelGrid','ModelHead',oStruGrid,,{ |oGrid| fLinOK(oGrid) },/*bPreGrid*/,/*bProsGrid*/)
    oModel:SetRelation('ModelGrid',{{'ZD1_FILIAL','ZF1_FILIAL'},{'ZD1_NUM','ZF1_NUM'},{'ZD1_VEND','ZF1_VEND'},{'ZD1_CODCLI','ZF1_CODCLI'},{'ZD1_LOJA','ZF1_LOJA'}}, ZD1->(IndexKey(2)))

    oModel:GetModel('ModelGrid'):SetDescription('Itens')        
    oModel:GetModel('ModelGrid'):SetDelAllLine(.T.)
    oModel:GetModel('ModelGrid'):SetOptional(.F.)

    //Seta o nome da rotina na enchoice
    oModel:SetDescription('Pedidos de Troca')

Return(oModel)
compartilhar
  • Boa noite Giordano, pelo que uso o MVC, ele já tem toda essa implementação pronta, basta de definir corretamente a relação do modelo (fields) e grid, a chave única que o bloco de commit padrão do MVC efetuará essa gravação. Já tentou fazer dessa forma?

    Daniel Mendes   17 de Jun de 2019
  • Boa tarde, Daniel! Tentei porém o campo de Filial nunca é preenchido corretamente na tabela filho (grid). Estou colocando meu ModelDef acima.

    Giordano Trabach Xavier   18 de Jun de 2019
  • Já tive um problema parecido utilizando a filial da seguinte forma:

    {'ZD1_FILIAL','ZF1_FILIAL'}

    O problema foi resolvido utilizando o xFilial:

    {'ZD1_FILIAL','xFilial("ZD1")'}

    Everton Alves   18 de Jun de 2019
  • Boa tarde, Everton! Dessa forma funcionou 100%. Obrigado.

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

2 respostas

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