Versão atual:

Rotina automatica MATA311

Estou testando a rotina automatica de transferencia entre filiais (mata311), utilizando o exemplo do link abaixo. No meu teste estou utilizando 3 itens para transferencia, mas está sendo gravado apenas o ultimo, o exemplo utiliza o SetValue(), a maneira que estou utilizando está errada ?

https://tdn.totvs.com/pages/releaseview.action?pageId=554642567


User Function M311Inc() // U_M311Inc()

Local oModel
Local aLog
Local cMensLog
Local nX
Local cAlias := GetNextAlias()

// PREPARE ENVIRONMENT EMPRESA '01' FILIAL '01' USER 'admin' PASSWORD 'Hudson20!' MODULO "EST"

// pega o codigo do cliente
cQuery := " SELECT A1_COD, A1_LOJA, A1_COND"+ chr(13)
cQuery += " FROM " + RetSqlName("SA1") + " SA1 with (nolock)" 
cQuery += " WHERE SA1.D_E_L_E_T_=''"+ chr(13)
cQuery += " AND A1_FILTRF = '" + xFilial("SF2") + "'"
dbUseArea(.T., "TOPCONN",TCGenQry(,,cQuery),cAlias,.T., .T.)

cCliente := (cAlias)->A1_COD
cLojaCli := (cAlias)->A1_LOJA
cCondPag := (cAlias)->A1_COND

(cAlias)->(DBCLOSEAREA())

// pegar a filial de destino
cFilialDest = '04' 

// pega o codigo do fornecedor
cAlias := GetNextAlias()
cQuery := " SELECT A2_COD, A2_LOJA"+ chr(13)
cQuery += " FROM " + RetSqlName("SA2") + " SA2 with (nolock)"
cQuery += " WHERE SA2.D_E_L_E_T_=''"+ chr(13)
cQuery += " AND A2_FILTRF = '" + cFilialDest + "'"
dbUseArea(.T., "TOPCONN",TCGenQry(,,cQuery),cAlias,.T., .T.)

cFornec  := (cAlias)->A2_COD
cLojaFor := (cAlias)->A2_LOJA
(cAlias)->(DBCLOSEAREA())

// teste com os itens que irão para transferencia
cAlias := GetNextAlias()
cQuery := " SELECT D2_COD, SUM(D2_QUANT) AS D2_QUANT " + chr(13)
cQuery += " FROM " + RetSqlName("SD2") + " SD2 WITH (NOLOCK) " 
cQuery += " WHERE D2_EMISSAO = '20210616' " + chr(13)
cQuery += " AND D2_FILIAL = '01' " + chr(13)
cQuery += " AND D2_DOC = '000038783' "+ chr(13)
cQuery += " AND D2_SERIE = '2' "+ chr(13)
cQuery += " GROUP BY D2_COD " + chr(13)
dbUseArea(.T., "TOPCONN",TCGenQry(,,cQuery),cAlias,.T., .T.)

oModel := FWLoadModel("MATA311") //Carrega o modelo

oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão
oModel:Activate() // Ativa o Modelo

//Cabeçalho da solicitacao
oModel:SetValue( 'NNSMASTER', 'NNS_CLASS', '1' )
oModel:SetValue( 'NNSMASTER', 'NNS_ESPECI', ' ' )

// itens da transferencia
(cAlias)->(DbGoTop())

Do while .not. (cAlias)->(eof())

    cNNT_TS := MaTesInt(2,'25',cCliente,cLojaCli,"C",(cAlias)->D2_COD) // tes de saida
    //cNNT_TE := MaTesInt(1,'25',cFornec,cLojaFor,"F",(cAlias)->D2_COD,"C6_TES") // tes de entrada
    // produto e local de origem
    oModel:SetValue( 'NNTDETAIL', 'NNT_FILORI', '01' )
    oModel:SetValue( 'NNTDETAIL', 'NNT_PROD', (cAlias)->D2_COD )
    oModel:SetValue( 'NNTDETAIL', 'NNT_LOCAL', '0110' )
    oModel:SetValue( 'NNTDETAIL', 'NNT_TS', '633' )
    oModel:SetValue( 'NNTDETAIL', 'NNT_UM', 'UN' )    

    oModel:SetValue( 'NNTDETAIL', 'NNT_QUANT', (cAlias)->D2_QUANT )

    // produto e local de destino
    oModel:SetValue( 'NNTDETAIL', 'NNT_FILDES', '04' )
    oModel:SetValue( 'NNTDETAIL', 'NNT_PRODD', (cAlias)->D2_QUANT )
    oModel:SetValue( 'NNTDETAIL', 'NNT_LOCLD', '0300' )
    oModel:SetValue( 'NNTDETAIL', 'NNT_TE', '122' )   
    oModel:SetValue( 'NNTDETAIL', 'NNT_UMD', 'UN' )         
    (cAlias)->(DbSkip())
enddo 
(cAlias)->(DBCLOSEAREA())

If oModel:VldData() //Validação do modelo
    oModel:CommitData() // Gravação do Modelo
    cCodigo    := oModelNNS:GetValue("NNS_COD")

Else
    aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
    cMensLog := ''
    //laco para gravar em string cLog conteudo do array aLog
    For nX := 1 to Len(aLog)
        If !Empty(aLog[nX])
            cMensLog += Alltrim(aLog[nX]) + CHR(13)+CHR(10)
        EndIf
    Next nX

    lMsErroAuto := .T. //seta variavel private como erro
    AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
    MostraErro()
EndIf

oModel:DeActivate() //desativa modelo

Return NIL

Versão (1):

Ver a versão formatada

Rotina automatica MATA311

Comentário

new question