Se alguma pergunta ou resposta lhe foi útil, não deixe de dar seu voto positivo!

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
compartilhar
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags mata311 ou faça a sua própria pergunta.