| ♥ 0 | Ao criar um documento de composição (InvBEDocumentoComposicao) é possível evocar algum método (possivelmente do IInvBSComposicoes) para recalcular o preço de uma linha de composto com base nas respectivas linhas de componentes inseridas com preço? Procuro um comportamento similar ao editor, em este recálculo é automático e se baseia das propriedades “TipoQtdComposicaoTotal” e “TipoPreco”. Sei como efectuar este recálculo “manualmente”, pois já o codifiquei na v9 (nos antigos docs de stock de composição), mas acho estranho que, existindo um novo BS dedicado (IInvBSComposicoes) a este tipo de documentos, tal funcionalidade não exista. Obrigado. Anexo código de teste: public string TesteDocComposicao()
{
InvBEDocumentoComposicao docComposicao;
IInvBSComposicoes bsComposicoes;
InvBELinhaComposto linComposto;
InvBELinhaComponente linComponente;
try
{
//iniciar doc de composição
bsComposicoes = PriEngine.Engine.Inventario.Composicoes;
docComposicao = new InvBEDocumentoComposicao();
docComposicao.Tipodoc = "COM";
docComposicao.Data = DateTime.Today;
//adquirir série de defeito
docComposicao.Serie = PriEngine.Engine.Base.Series.DaSerieDefeito("S", docComposicao.Tipodoc, docComposicao.Data);
//definir regras de funcionamento
docComposicao.TipoQtdComposicaoTotal = true;
docComposicao.TipoPreco = "P";
bsComposicoes.PreencheDadosRelacionados(docComposicao);
//criar linha de composto de um artigo com gestão de lotes (lote existente)
bsComposicoes.AdicionaLinhaComposto(docComposicao, "PROD02L", 100, "A1", Lote: "LP4");//artigo com gestão de lotes
linComposto = docComposicao.LinhasCompostos.GetEdita(docComposicao.LinhasCompostos.NumItens);
//associar um componente de um artigo com gestão de lotes
bsComposicoes.AdicionaLinhaComponente(docComposicao, linComposto, "CONS01L", 10, "A1", Lote: "LC1");
linComponente = linComposto.LinhasComponentes.GetEdita(linComposto.LinhasComponentes.NumItens);
linComponente.PrecUnit = bsComposicoes.SugerePrecoUnitario(linComponente.Artigo, linComponente.Armazem, linComponente.Lote);
//associar outro componente de um artigo com gestão de lotes
bsComposicoes.AdicionaLinhaComponente(docComposicao, linComposto, "CONS03SL", 5, "A1"); //artigo sem gestão de lotes
linComponente = linComposto.LinhasComponentes.GetEdita(linComposto.LinhasComponentes.NumItens);
linComponente.PrecUnit = bsComposicoes.SugerePrecoUnitario(linComponente.Artigo, linComponente.Armazem, linComponente.Lote);
//Precisava de alguma função aqui semelhante a esta...
//bsComposicoes.RecalculaPrecoLinhaComposto(docComposicao, linComposto);
//Ou pelo como esta...
//bsComposicoes.RecalculaPrecoLinhasCompostos(docComposicao);
//validar e gravar
string strErro = string.Empty;
bool resposta = bsComposicoes.ValidaActualizacao(docComposicao, ref strErro);
if (resposta)
{
bsComposicoes.Actualiza(docComposicao, ref strErro);
if (strErro.Length > 0)
{
throw new Exception("Erro ao gravar documento no PRIMAVERA!" + Environment.NewLine + "Erro:" + strErro);
}
else
{
return docComposicao.ID;
}
}
else
{
throw new Exception("Documento não validado no PRIMAVERA!" + Environment.NewLine + "Erro:" + strErro);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
linComponente = null;
linComposto = null;
docComposicao = null;
}
}
Marcado como spam |