Diogo acho que pode funcionar da seguinte forma:
1) Criar um gatilho no campo Centro de Custo (Ficha) chamando uma função customizada.
2) Na função customizada você faria o seguinte tratamento:
oModel := FWModelActive()
oGrid := oModel:GetModel('MODEL_GRID')
If ! Empty(M->CAMPO_CC_FICHA) //Se campo preenchido não permite alteração
oGrid:ClearData() //Limpa os dados digitados (acho que você precisa limpar caso o usuário já tenha digitado, ANALISE!)
oGrid:SetNoInsertLine(.T.) //Não insire linhas
oGrid:SetNoUpdateLine(.T.) //Não altera linhas
oGrid:SetNoDeleteLine(.T.) //Não deleta linhas
Else
oGrid:SetNoInsertLine(.F.) //Permite insirir linhas
oGrid:SetNoUpdateLine(.F.) //Permite alterar linhas
oGrid:SetNoDeleteLine(.F.) //Permite deletar linhas
EndIF
Na função utilizada no valid, faça a seguinte avaliação:
Static Function fVldCC
Local lRet := .T.
Local oView := FwViewActive()
Local oModel := FwModelActive()
If(!Empty(oModel:GetValue('ModelFicha','ZTC_CC')))
// Limpa os dados da grid
oModel:GetModel('ModelRateio'):ClearData(.F., .T.)
// Bloqueia a inserção, alteração e exclusão de linhas na grid
oModel:GetModel('ModelRateio'):SetNoInsertLine(.T.)
oModel:GetModel('ModelRateio'):SetNoUpdateLine(.T.)
oModel:GetModel('ModelRateio'):SetNoDeleteLine(.T.)
Else
// Limpa os dados da grid
oModel:GetModel('ModelRateio'):ClearData(.F., .T.)
// Habilita a inserção, alteração e exclusão de linhas na grid
oModel:GetModel('ModelRateio'):SetNoInsertLine(.F.)
oModel:GetModel('ModelRateio'):SetNoUpdateLine(.F.)
oModel:GetModel('ModelRateio'):SetNoDeleteLine(.F.)
EndIf
oView:Refresh()
Return(lRet)
Importante ressaltar que o método ClearData limpa os dados na grid apenas visualmente, e não no banco de dados. Sendo assim, seu uso só deve ser feito se a operação do modelo for inclusão. Caso contrário, você deve varrer sua grid e deletar linha por linha.