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)
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 2019Boa 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 2019Já 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 2019Boa tarde, Everton! Dessa forma funcionou 100%. Obrigado.
— Giordano Trabach Xavier 18 de Jun de 2019