Você já precisou buscar as informações da última entrada de um produto via AdvPL? Veja como no artigo de hoje.
A ideia é receber um código de produto via parâmetro, e com isso buscar as informações da última entrada registrada na SD1.
Foi criado então uma função genérica com esse propósito, que retorna os conteúdos de Valor, Quantidade, Data e Fornecedor.
Abaixo o exemplo da função desenvolvida:
#include "Totvs.ch"
#include "TopConn.ch"
/*/{Protheus.doc} zUltCom
Função que retorna um array com informações da ultima compra do produto
@type user function
@author Reies (vinicius@atiliosistemas.com)
@since 04/03/2026
@version 1.0
@param cCodEmp, Character, Código da empresa, se vazio, utiliza a empresa logada
@param cCodFil, Character, Código da filial, se vazio, utiliza a filial logada
@param cCodPro, Character, Código do produto, se vazio, não filtra por produto
@param cCodFor, Character, Código do fornecedor, se vazio, não filtra por fornecedor (nem loja)
@param cLojaFor, Character, Código da loja, só filtra se vier código do fornecedor
@return aInfos, Array, Informações da ultima compra do produto
@example
zUltCom(Empresa, Filial, Produto, Fornecedor, Loja)
/*/
User Function zUltCom(cCodEmp, cCodFil, cCodPro, cCodFor, cLojaFor)
Local aArea := FWGetArea()
Local aInfos := {}
Local cQuery := ""
Default cCodEmp := cEmpAnt
Default cCodFil := FWxFilial("SD1")
Default cCodPro := ""
Default cCodFor := ""
Default cLojaFor := ""
//Busca a ultima entrada do produto
cQuery := " SELECT TOP 1 " + CRLF
cQuery += " D1_VUNIT, " + CRLF
cQuery += " D1_QUANT, " + CRLF
cQuery += " D1_DTDIGIT, " + CRLF
cQuery += " D1_FORNECE, " + CRLF
cQuery += " D1_LOJA " + CRLF
cQuery += " FROM " + CRLF
//Se tiver filtro de empresa, monta o Alias ta tabela
If !Empty(cCodEmp)
cQuery += "SD1" + Alltrim(cCodemp) + "0 as SD1 " + CRLF
//Se não, utiliza a tabela logada
Else
cQuery += RetSqlName("SD1")+" as SD1 " + CRLF
EndIf
cQuery += " WHERE " + CRLF
cQuery += " D1_FILIAL = '"+cCodFil+"' " + CRLF
//Se tiver fornecedor.
If !Empty(cCodFor)
cQuery += " AND D1_FORNECE = '"+cCodFor+"' " + CRLF
//Só vai filtrar loja, se tiver código do fornecedor e loja.
If !Empty(cLojaFor)
cQuery += " AND D1_LOJA = '"+cLojaFor+"' " + CRLF
EndIf
EndIf
//Se tiver código fo produto.
If !Empty(cCodPro)
cQuery += " AND D1_COD = '"+cCodPro+"' " + CRLF
EndIf
cQuery += " AND D1_TIPO NOT IN ('B', 'D') " + CRLF
cQuery += " AND SD1.D_E_L_E_T_ = ' ' " + CRLF
cQuery += " ORDER BY " + CRLF
cQuery += " D1_DTDIGIT DESC " + CRLF
//Execução da query
TCQuery cQuery New Alias "QRY_ULTCOM"
//Definição da coluna de data da ultima compra, como tipo data.
TCSetField("QRY_ULTCOM","D1_DTDIGIT","D")
//Se tiver dados, atualiza o retorno
If ! QRY_ULTCOM->(Eof())
//Preenche o array de retorno com as informações da ultima compra
aAdd(aInfos, {;
QRY_ULTCOM->D1_VUNIT, ; //Valor unitário
QRY_ULTCOM->D1_QUANT, ; //Quantidade
QRY_ULTCOM->D1_DTDIGIT, ; //Data de digitação
QRY_ULTCOM->D1_FORNECE, ; //Código do fornecedor
QRY_ULTCOM->D1_LOJA ; //Código da loja
})
EndIf
//Encerrando query
QRY_ULTCOM->(DBCloseArea())
//Encerrando área
FWRestArea(aArea)
Return aInfos
Essa função foi gentilmente disponibilizada por Vinicius Reies ( LinkedIn ).
Bom pessoal, por hoje é só.
Abraços e até a próxima.