Como atualizar informações de um orçamento através do valid de um campo

Hoje vou mostrar uma dica de como atualizar informações da grid de um orçamento de venda via AdvPL.

Geralmente quando fazemos um valid de usuário, um ponto de entrada ou um gatilho que precise atualizar dados de uma grid, temos 3 formas principais de se fazer:

  • Manipular direto o aCols em gris antigas
  • Utilizar referência do M-> (em caso de RegToMemory)
  • Se for em MVC, manipular direto o model da grid ou usar FWFldGet

Porém na tela de orçamentos de vendas, ela utiliza um conceito diferente de tela, ela cria uma tabela temporária para ser usada na grid.

O nome dessa temporária é TMP1, então para buscar valores nós usamos ela como referência ( TMP1-> ), e se quisermos manipular, utilizamos RecLock.

Abaixo um exemplo de uma função acionada na validação ao digitar o preço de venda:

User Function zVldCampo()
    Local aArea    := GetArea()
    Local aAreaCJ  := SCJ->(GetArea())
    Local aAreaCK  := SCK->(GetArea())
    Local cTabAtu  := M->CJ_TABELA
    Local cCodProd := ""
    Local nPrcProd := 0
    Local lRet     := .T.
     
    //Se tiver tabela de preço preenchida
    If ! Empty(cTabAtu)
        DbSelectArea('DA1')
        DA1->(DbSetOrder(1)) //DA1_FILIAL+DA1_CODTAB+DA1_CODPRO+DA1_INDLOT+DA1_ITEM
        DA1->(DbGoTop())
         
        //Pega as informações do produto da grid e preço
        cCodProd := TMP1->CK_PRODUTO
        nPrcProd := TMP1->CK_PRCVEN
     
        //Se conseguir posicionar na tabela de preço + produto
        If DA1->(DbSeek(FWxFilial('DA1') + cTabAtu + cCodProd ))
            //Verifica se o preço do produto no orçamento é maior que o preço máximo da tabela
            If nPrcProd > DA1->DA1_PRCMAX
                lRet := .F.
                MsgStop("Preço digitado maior que o preço máximo!", "Atenção")
                 
            //Senão verifica se é menor que o preço de venda
            ElseIf nPrcProd < DA1->DA1_PRCVEN
                lRet := .F.
                MsgStop("Preço digitado menor que o preço padrão!", "Atenção")
            EndIf
        EndIf
    EndIf
     
    RestArea(aAreaCK)
    RestArea(aAreaCJ)
    RestArea(aArea)
Return lRet

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta