Fórum
Ver pergunta

Processo demorado ao gravar um documento   

139 visualizações
0
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;
}

 

 

Faça login para poder traduzir
Integração
Marcado como spam
Criado há 5 anos e 5 meses patrickarsenio
p
patrickarsenio Iniciante
1 respostas
0
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.

Faça login para poder traduzir
Marcado como spam
Criado há 5 anos e 5 meses sergiosereno
sergiosereno Most Valuable Professional
    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
    5 anos e 5 meses
    patrickarsenio
      @sergiosereno Olá sergio, como é que posso criar um rascunho? não encontro a função. Obrigado.
      5 anos e 5 meses
      patrickarsenio
        @patrickarsenio, julgo que para gravares em rascunho basta que coloques a propriedade set_Rascunho a true.
        5 anos e 5 meses
        nunogonalves