| ♥ 0 | Viva, como já referi noutros posts estou a tentar expor alguns métodos da API do primavera a uma REST API, até agora com mais ou menos problemas estou a conseguir criar o que preciso, no entanto, agora tentei fazer uma coisa diferente, uma vez que o numero de linhas de um documento pode mudar, estou a tentar criar as mesmas de forma dinâmica. Ora eu consigo criar as linhas e adiciona-las a um documento, mas depois quando tento fazer a verificação e introdução do documento o processo demora alguns minutos e não estou a perceber o porque, quando eu estava a inserir as linhas 1 por 1 funcionava bem. O meu problema não está no ciclo for pois ao fazer debug eu vejo que o processo fica mesmo travado é na validação e introdução. Aqui vai o codido que estou a utilizar. public HttpResponseMessage Post(HttpRequestMessage documento)
{
var data = documento.Content.ReadAsStringAsync().Result;
JObject obj_documento = JObject.Parse(data);
short ano = Int16.Parse(obj_documento["DocContabilidade"]["ano"].ToString());
Byte mes = Convert.ToByte(obj_documento["DocContabilidade"]["mes"].ToString());
Byte dia = Convert.ToByte(obj_documento["DocContabilidade"]["dia"].ToString());
string doc = obj_documento["DocContabilidade"]["doc"].ToString();
string diario = obj_documento["DocContabilidade"]["diario"].ToString();
string doc_moeda = obj_documento["DocContabilidade"]["moeda"].ToString();
string modulo = obj_documento["DocContabilidade"]["modulo"].ToString();
string descricao = obj_documento["DocContabilidade"]["descricao"].ToString();
string num_doc_externo = obj_documento["DocContabilidade"]["num_doc_externo"].ToString();
CblBEDocumento DocInserir = new CblBEDocumento();
DocInserir.set_Ano(ano);
DocInserir.set_Doc(doc);
DocInserir.set_NumDoc(-1);
DocInserir.set_Diario(diario);
DocInserir.set_NumDiario(-1);
DocInserir.set_Mes(mes);
DocInserir.set_Dia(dia);
DocInserir.set_Moeda(doc_moeda);
DocInserir.set_Modulo(modulo);
DocInserir.set_Descricao(descricao);
DocInserir.set_NumeroDocExterno(num_doc_externo);
int num_linhas = Int16.Parse(obj_documento["DocContabilidade"]["numlinhas"].ToString());
for (int linha=1; linha <= num_linhas; linha++)
{
string linha_ = "Linha" + linha;
CblBELinhaDocGeral Linha_Inserir = new CblBELinhaDocGeral();
string tipo_linha= obj_documento[linha_]["tipo_linha"].ToString();
string conta= obj_documento[linha_]["conta"].ToString();
string natureza= obj_documento[linha_]["natureza"].ToString();
string moeda_linha= obj_documento[linha_]["moeda"].ToString();
string tipo_entidade= obj_documento[linha_]["tipo_entidade"].ToString();
string entidade= obj_documento[linha_]["entidade"].ToString();
decimal valor= Convert.ToDecimal(obj_documento[linha_]["valor"].ToString());
decimal valor_alt= Convert.ToDecimal(obj_documento[linha_]["valor_alt"].ToString());
decimal valor_origem= Convert.ToDecimal(obj_documento[linha_]["valor_origem"].ToString());
string descricao_linha= obj_documento[linha_]["descricao"].ToString();
short lote= Int16.Parse(obj_documento[linha_]["lote"].ToString());
string iva;
if (obj_documento[linha_]["iva"] != null)
{
iva = obj_documento[linha_]["iva"].ToString();
}
else
{
iva = null;
}
Linha_Inserir.set_TipoLinha(tipo_linha);
Linha_Inserir.set_Conta(conta);
Linha_Inserir.set_Natureza(natureza);
Linha_Inserir.set_Iva(iva);
Linha_Inserir.set_Moeda(moeda_linha);
Linha_Inserir.set_TipoEntidade(tipo_entidade);
Linha_Inserir.set_Entidade(entidade);
Linha_Inserir.set_Valor(valor);
Linha_Inserir.set_ValorAlt(valor_alt);
Linha_Inserir.set_ValorOrigem(valor_origem);
Linha_Inserir.set_Cambio(1);
Linha_Inserir.set_CambioMAlt(1);
Linha_Inserir.set_CambioOrigem(1);
Linha_Inserir.set_Lote(lote);
Linha_Inserir.set_Descricao(descricao_linha);
DocInserir.LinhasGeral.Insere(Linha_Inserir);
}
EnumTipoPlataforma tipoplat = new EnumTipoPlataforma();
StdBETransaccao trans = new StdBETransaccao();
ErpBS motor = new ErpBS();
motor.AbreEmpresaTrabalho(tipoplat, "123123", "Primavera", "Primavera.123", trans, "1");
string strAvisos = string.Empty;
// aqui fica preso e demora alguns minutos
Boolean doc_valido = motor.Contabilidade.Documentos.ValidaActualizacao(DocInserir, strAvisos);
if (doc_valido)
{
// aqui tb ica preso
motor.Contabilidade.Documentos.Actualiza(DocInserir);
strAvisos = "Doc inserido";
}
else
{
strAvisos = "Doc nao inserido";
}
var response = Request.CreateResponse(System.Net.HttpStatusCode.Created, "as");
return response;
}
Marcado como spam |
| Resposta privada Olá, antes de mais não tens de necessidade de chamar o valida da API o proprio Actualiza() já faz isso internamente. Quanto a lentidão não tenho uma resposta clara para te dar porque pode ser devido a várias coisas, ISS, a tranaformação de .NET para COM, concorrencia de numeradores, enfim uma serie de coisas. Podes tentar gravar como rascunho para ver se é disso, se form integra com rascunho e depois chamas um processo assincrono para efetivar os documentos. Marcado como spam Comentários Boas,
vou tentar o que sugeriste, quanto á validação como posso devolver uma mensagem de erro quando existe algum?
existe alguma exeção que possa chamar num try catch? porque neste momento se tiver algum erro do documento o processo para.
Cpts @sergiosereno Olá sergio, como é que posso criar um rascunho? não encontro a função.
Obrigado. @patrickarsenio, julgo que para gravares em rascunho basta que coloques a propriedade set_Rascunho a true. |