Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Bloco de código
languagejava
themeMidnight
titleExemplo
linenumberstrue
/*/{Protheus.doc} User Function A410GRDW
    Permite manipular a grade de produtos em diversas rotinas do sistema.
    É possível aplicar tratamento pontual utilizando a função FWIsInCallStack
    para verificar a rotina que chamou o ponto de entrada
    Também é possível verificar qual campo está sendo preenchido pelo usuário
    com a função ReadVar()

    Verificar a documentação completa no TDN
    @type  Function
    @author Totvs
    /*/
User Function A410GRDW()
    Local aHeadAux := ParamIXB[1]
    Local aColsAux := ParamIXB[2]
    Local nLinO    := ParamIXB[3]
    Local aArea    := GetArea()
    Local aAreaSB4 := SB4->(GetArea())
    Local aAreaSBV := SBV->(GetArea())
    Local aAreaSB1 := SB1->(GetArea())
    Local aAreas   := {aAreaSB4, aAreaSBV, aAreaSB1, aArea}
    Local aCposTel := oGrade:aCposCtrlGrd
    Local cCampo   := StrTran(ReadVar(), 'M->', '')
    Local cMask    := SuperGetMV('MV_MASCGRD', .F., '')
    Local aMask    := StrTokArr(cMask, ',')
    Local nTamProd := 0
    Local nTamLin  := 0
    Local nTamCol  := 0
    Local nQtdIni  := 0
    Local nVIni1   := 0
    Local nColGrd  := 0
    Local nLinGrd  := 0
    Local nPQINI   := 0
    Local nPVINI1  := 0
    Local nVal     := 0
    Local nPSum    := 0
    Local nPProd   := 0
    Local cProduto := ''
    Local nPQuant  := 0
    Local nQuant   := 0
    Local nPQntC7  := 0
    Local lUsaGrad := .F.
    Local cTabLin  := ''
    Local cTabCol  := ''
    Local aChvLin  := {}
    Local aChvCol  := {}
    Local cChvLin  := ''
    Local aProd    := {}
    Local nProd    := 0

    If Len(aMask) < 3
        Return
    EndIf 
    nTamProd := Val(aMask[1])
    nTamLin  := Val(aMask[2])
    nTamCol  := Val(aMask[3])

    //Exemplo: Tratamento para o saldo inicial
    If FWIsInCallStack('MATA220')
        //Distribui o valor inicial na mesma proporção da quantidade inicial
        If AllTrim(cCampo) == 'B9_VINI1'
            nQtdIni := M->B9_QINI
            nVIni1  := M->B9_VINI1
            nPQINI  := ASCan(aCposTel, {|x| AllTrim(x[1]) == 'B9_QINI'})
            nPVINI1 := ASCan(aCposTel, {|x| AllTrim(x[1]) == 'B9_VINI1'})
            If Len(oGrade:aSumCpos) > 0
                nPSum   := ASCan(oGrade:aSumCpos, {|x| AllTrim(x[1]) == 'B9_VINI1'})
            EndIf
            If nPSum > 0
                oGrade:aSumCpos[nPSum, 2] := 0
            EndIf
            If nQtdIni > 0 .And. nVIni1 > 0 .And. nPQINI > 0 .And. nPVINI1 > 0
                For nLinGrd := 1 To Len(aColsGrade[nLinO])
                    For nColGrd := 2 To Len(aColsGrade[nLinO, nLinGrd])
                        nVal := nVINI1 * aColsGrade[nLinO, nLinGrd, nColGrd, nPQINI] / nQtdIni
                        //Manipular o aColsGrade para futura gravação no banco de dados
                        aColsGrade[nLinO, nLinGrd, nColGrd, nPVINI1] := nVal
                        //Manipular o aCols para que o usuário visualize os valores pré-carregados
                        aCols[nLinGrd, nColGrd] := nVal
                        //Manipular o totalizador, se houver
                        If nPSum > 0
                            oGrade:aSumCpos[nPSum, 2] += nVal
                        EndIf
                    Next nColGrd
                Next nLinGrd
            EndIf
        EndIf
    EndIf

    //Exemplo: Tratamento para o pedido de compras
    If FWIsInCallStack('MATA121') .And. AllTrim(cCampo) == 'C7_QUANT'
        //Distribui o saldo somente na primeira coluna
        nPProd   := ASCan(aHeadAux, {|x| AllTrim(x[2]) == 'C7_PRODUTO'})
        nPQuant  := ASCan(aHeadAux, {|x| AllTrim(x[2]) == 'C7_QUANT'})
        nPQntC7  := ASCan(aCposTel, {|x| AllTrim(x[1]) == 'C7_QUANT'})
        If Len(oGrade:aSumCpos) > 0
            nPSum   := ASCan(oGrade:aSumCpos, {|x| AllTrim(x[1]) == 'C7_QUANT'})
        EndIf
        If nPSum > 0
            oGrade:aSumCpos[nPSum, 2] := 0
        EndIf

        If nPPRod > 0 .And. nPQuant > 0 .And. nPQntC7 > 0
            cProduto := SubStr(aColsAux[nLinO, nPProd], 1, nTamProd) //Código da grade
            nQuant   := M->C7_QUANT //Quantidade digitada no pedido
        EndIf

        If !Empty(cProduto)
            SB4->(DbSetOrder(1)) //B4_FILIAL+B4_COD
            lUsaGrad := SB4->(DbSeek(FWXFilial('SB4')+cProduto))
        EndIf

        If lUsaGrad .And. nPQuant > 0
            cTabLin := SB4->B4_LINHA
            cTabCol := SB4->B4_COLUNA

            //Encontra as chaves das tabelas
            SBV->(DbSetOrder(1)) //BV_FILIAL+BV_TABELA+BV_CHAVE
            If SBV->(DbSeek(FWXFilial('SBV')+cTabLin))
                While !SBV->(EoF()) .And. SBV->(BV_FILIAL+BV_TABELA) == FWXFilial('SBV')+cTabLin
                    AAdd(aChvLin, SubStr(SBV->BV_CHAVE, 1, nTamLin))
                    SBV->(DbSkip())
                EndDo
            EndIf
            If SBV->(DbSeek(FWXFilial('SBV')+cTabCol))
                While !SBV->(EoF()) .And. SBV->(BV_FILIAL+BV_TABELA) == FWXFilial('SBV')+cTabCol
                    AAdd(aChvCol, SubStr(SBV->BV_CHAVE, 1, nTamCol))
                    SBV->(DbSkip())
                EndDo
            EndIf

            //Verifica quais produtos foram cadastrados
            SB1->(DbSetOrder(1)) //B1_FILIAL+B1_COD
            aProd := {}
            nColGrd := 1 //Verifica somente a primeira coluna
            For nLinGrd := 1 To Len(aChvLin)
                If SB1->(DbSeek(FWXFilial('SB1')+cProduto+aChvLin[nLinGrd]+aChvCol[nColGrd]))
                    AAdd(aProd, {SB1->B1_COD, aChvLin[nLinGrd], aChvCol[nColGrd]})
                EndIf
            Next nLinGrd
            nVal := nQuant / Len(aProd) //Valor distribuido em cada linha da 1a coluna
            //Encontra a posição na grade da primeira coluna. Os campos no aHeader são _+chave da coluna
            nColGrd := ASCan(aHeadGrade[nLinO], {|x| ValType(x)=='A' .And. AllTrim(x[2]) == '_'+aChvCol[1]})
            If nColGrd > 0
                For nLinGrd := 1 To Len(aColsGrade[nLinO])
                    //ManipularVerifica se o produto aColsGradeexiste para futuraa gravaçãolinha
 no banco de dados
                cChvLin :=   aColsGrade[nLinO, nLinGrd, nColGrd, nPQntC71] := nVal
       //<- coluna 1 fixa, contem a chave da linha
                    cChvLin := SubStr(cChvLin, At('[', cChvLin)+1, nTamLin)
                    nProd   := AScan(aProd, {|x| x[2] == cChvLin})
                    If nProd > 0
                        //Manipular o aColsGrade para futura gravação no banco de dados
                        aColsGrade[nLinO, nLinGrd, nColGrd, nPQntC7] := nVal
                        //Manipular o aCols para que o usuário visualize os valores pré-carregados
                        aCols[nLinGrd, nColGrd] := nVal
                        //Manipular o totalizador, se houver
                        If nPSum > 0
                            oGrade:aSumCpos[nPSum, 2] += nVal
                        EndIf
                    EndIf
                Next nLinGrd
            EndIf
        EndIf
    EndIf

    //Restaura a área das tabelas
    AEval(aAreas, {|x| RestArea(x)})
Return