V9 Primavera - C# error in attribute "Comercial.Vendas.Davaloratributo"

Asked

Viewed 263 times

0

Good afternoon to all,

And thanks for your attention,

I created a C# code to transform documents.

I’m making a mistake:

Microsoft.CSharp.Runtimebinder.Runtimebinderexception
Hresult=0x80131500 Message='Object' does not contain a Definition for 'Davaloratributo' #Source= Stacktrace:

In VBA this code works perfectly, which I have done before successfully.

I marked the "-------------" line and commented on the line giving me the error.

...C#


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Interop.ErpBS900;
using Interop.StdPlatBS900;
using Interop.StdBE900;
using Interop.GcpBE900;
using Interop.IGcpBS900;

namespace Docs_Trans
{
    class Program
    {

        public static StdPlatBS Platform { get; set; }

        /// <summary>
        ///  Returns the engine that allows acess to the modules.
        /// </summary>
        public static ErpBS Engine { get; set; }



       public static void InitializeCompany()
        {

            StdBSConfApl objAplConf = new StdBSConfApl();
            StdPlatBS Plataforma = new StdPlatBS();
            ErpBS MotorLE = new ErpBS();

            EnumTipoPlataforma objTipoPlataforma = new EnumTipoPlataforma();
            objTipoPlataforma = EnumTipoPlataforma.tpEmpresarial;

            objAplConf.Instancia = "Default";
            objAplConf.AbvtApl = "ERP";
            objAplConf.PwdUtilizador = "pass";
            objAplConf.Utilizador = "user";
            objAplConf.LicVersaoMinima = "9.00";

            StdBETransaccao objStdTransac = new StdBETransaccao();

            Plataforma.AbrePlataformaEmpresa("empres", ref objStdTransac, ref objAplConf, ref objTipoPlataforma, "");


            if (Plataforma.Inicializada)
            {

                Platform = Plataforma;

                bool blnModoPrimario = true;

                MotorLE.AbreEmpresaTrabalho(EnumTipoPlataforma.tpEmpresarial, "empresa", "user", "pass", ref objStdTransac, "Default", ref blnModoPrimario);
                MotorLE.set_CacheActiva(true);

                Engine = MotorLE;

                ////MOTORES DE CRIAR E TRANSFORMAR DOCUmento
                ///


                ////Query de pesquisa de documentos e colocação em lista para fazer o ciclo

                StdBELista ListaDocsAtransformar = new StdBELista();

                ListaDocsAtransformar = Engine.Consulta("select TipoDoc, Serie, NumDoc from CabecDoc where tipodoc in (select CDU_PNT_TIPODOCEQUIORIG from tdu_pnt_docsequivalencia) and serie in (select CDU_PNT_SERIEEQUIORIG from tdu_pnt_docsequivalencia) and CDU_PNT_TRANSFORMADO <> 1");


                while (!ListaDocsAtransformar.NoFim())
                {



                    GcpBEDocumentoVenda DocVendaTransformado = new GcpBEDocumentoVenda();


                    object DocumentosOrigem;


                    /// DocumentosOrigem = Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo( "000", "ECN", "serie", "numdoc", "ID"));


///----------
//// aqui tenho o erro a indicar que davaloratributo, não existe no object???
///----------


                    object IDDoc = Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID");





                    DocumentosOrigem = Engine.Comercial.Vendas.EditaID(IDDoc.ToString());


                    string[] DocumentosOrigemArray = (string[])DocumentosOrigem;

                    object DocInicial;

                    DocInicial = Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_TipoEntidade();


                    ////Vai verificar qual o documento e serie correspondente 
                    ///

                    StdBELista ListaTipoDocSerie = new StdBELista();

                    ListaTipoDocSerie = Engine.Consulta("select CDU_PNT_TIPODOCEQUITRANS, CDU_PNT_SERIEEQUITRANS from tdu_pnt_DOCSEQUIVALENCIA where CDU_PNT_TIPODOCEQUIORIG = 'gr' and CDU_PNT_SERIEEQUIORIG = '2019'");


                    DocVendaTransformado.set_Serie(ListaTipoDocSerie.Valor("CDU_PNT_SERIEEQUITRANS").ToString());
                    DocVendaTransformado.set_DataDoc(DateTime.Today);
                    DocVendaTransformado.set_TipoEntidade(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_TipoEntidade());
                    DocVendaTransformado.set_TipoEntidadeFac(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_TipoEntidadeFac());
                    DocVendaTransformado.set_Entidade(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_Entidade());
                    DocVendaTransformado.set_EntidadeFac(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_EntidadeFac());
                    DocVendaTransformado.set_Filial(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_Filial());
                    DocVendaTransformado.set_Moeda(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_Moeda());
                    DocVendaTransformado.set_Cambio(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_Cambio());
                    DocVendaTransformado.set_CambioMAlt(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_CambioMAlt());
                    DocVendaTransformado.set_CambioMBase(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_CambioMBase());
                    DocVendaTransformado.set_Tipodoc(ListaTipoDocSerie.Valor("CDU_PNT_TIPODOCEQUITRANS").ToString());
                    DocVendaTransformado.set_CondPag(Engine.Comercial.Vendas.EditaID(Engine.Comercial.Vendas.DaValorAtributo("000", ListaDocsAtransformar.Valor("tipodoc").ToString(), ListaDocsAtransformar.Valor("serie").ToString(), Int32.Parse(ListaDocsAtransformar.Valor("numdoc").ToString()), "ID").ToString()).get_CondPag());


                    Engine.Comercial.Vendas.TransformaDocumentoEX2(DocumentosOrigemArray, DocVendaTransformado, true, "", false);

                    //cria historico
                    Platform.ExecSql.ExecutaXML("");
                    //update que foi transformado na CDU_PNT_TRANSFORMADO do cabecdoc
                    Platform.ExecSql.ExecutaXML("");


                    ListaDocsAtransformar.Seguinte();

                }

            }

        }
        static void Main(string[] args)
        {

            InitializeCompany();

        }



    }

}

...

2 answers

1


Well, there are some things in there that don’t seem right, like doing a document search and not pulling the ID instead of the typodoc, serie and numdoc. Another thing you are doing is editing the document several times to fetch the information. Just edit once. I put here the example:

        if (Plataforma.Inicializada)
        {

            Platform = Plataforma;

            bool blnModoPrimario = true;

            MotorLE.AbreEmpresaTrabalho(EnumTipoPlataforma.tpEmpresarial, "empresa", "user", "pass", ref objStdTransac, "Default", ref blnModoPrimario);
            MotorLE.set_CacheActiva(true);

            Engine = MotorLE;

            StdBELista ListaDocsAtransformar = new StdBELista();

            //Alterei aqui, indo buscar o Id, em vez dos outros campos
            ListaDocsAtransformar = Engine.Consulta("select Id from CabecDoc where tipodoc in (select CDU_PNT_TIPODOCEQUIORIG from tdu_pnt_docsequivalencia) and serie in (select CDU_PNT_SERIEEQUIORIG from tdu_pnt_docsequivalencia) and CDU_PNT_TRANSFORMADO <> 1");


            while (!ListaDocsAtransformar.NoFim())
            {

                GcpBEDocumentoVenda DocVendaTransformado = new GcpBEDocumentoVenda();

                //Alterei aqui. Editar o documento com o ID
                GcpBEDocumentoVenda DocumentosOrigem = Engine.Comercial.Vendas.EditaID(ListaDocsAtransformar.Valor("Id").ToString());

                object[] DocumentosOrigemArray = new object[] { DocumentosOrigem };

                StdBELista ListaTipoDocSerie = Engine.Consulta("select CDU_PNT_TIPODOCEQUITRANS, CDU_PNT_SERIEEQUITRANS from tdu_pnt_DOCSEQUIVALENCIA where CDU_PNT_TIPODOCEQUIORIG = 'gr' and CDU_PNT_SERIEEQUIORIG = '2019'");

                DocVendaTransformado.set_Serie(ListaTipoDocSerie.Valor("CDU_PNT_SERIEEQUITRANS").ToString());
                DocVendaTransformado.set_DataDoc(DateTime.Today);
                DocVendaTransformado.set_TipoEntidade(DocumentosOrigem.get_TipoEntidade());
                DocVendaTransformado.set_TipoEntidadeFac(DocumentosOrigem.get_TipoEntidadeFac());
                DocVendaTransformado.set_Entidade(DocumentosOrigem.get_Entidade());
                DocVendaTransformado.set_EntidadeFac(DocumentosOrigem.get_EntidadeFac());
                DocVendaTransformado.set_Filial(DocumentosOrigem.get_Filial());
                DocVendaTransformado.set_Moeda(DocumentosOrigem.get_Moeda());
                DocVendaTransformado.set_Cambio(DocumentosOrigem.get_Cambio());
                DocVendaTransformado.set_CambioMAlt(DocumentosOrigem.get_CambioMAlt());
                DocVendaTransformado.set_CambioMBase(DocumentosOrigem.get_CambioMBase());
                DocVendaTransformado.set_Tipodoc(ListaTipoDocSerie.Valor("CDU_PNT_TIPODOCEQUITRANS").ToString());
                DocVendaTransformado.set_CondPag(DocumentosOrigem.get_CondPag());


                Engine.Comercial.Vendas.TransformaDocumentoEX2(DocumentosOrigemArray, DocVendaTransformado, true, "", false);

                //cria historico
                Platform.ExecSql.ExecutaXML("");
                //update que foi transformado na CDU_PNT_TRANSFORMADO do cabecdoc
                Platform.ExecSql.ExecutaXML("");


                ListaDocsAtransformar.Seguinte();

            }
  • Good morning, Solved the question of davalorAtribute is solved. Thanks This object to array conversion gives me the error of: "Unable to cast COM Object of type 'Interop.GCPBE900.Gcpbedocumentovendaclass' to class type System.String[]" "string[] Documentsorigemarray = (string[])((Object)Documentsorigem);" , which is also an issue I’m struggling with. If it is preferable I create another question.

  • I edited the code and I put the correct one ( Object[] Documentosorigemarray = new Object[] { Documentosorigem }; ). Actually the array should be objects and not strings, as you were putting. If you solved the problem, mark the answer as valid ;)

0

Good morning, try changing the code to something like this:

StdBELista lista = PriEngine.BSO.Consulta("Select tipodoc, serie, numdoc from cabecdoc where id = 'F1772FAA-EBD8-11DD-8838-000C2989A062'");
string tipodoc = lista.Valor("tipodoc").ToString();
string serie = lista.Valor("serie").ToString();
int numdoc = Convert.ToInt32(lista.Valor("numdoc"));
dynamic IDDoc = PriEngine.BSO.Comercial.Vendas.DaValorAtributo("000", tipodoc, serie, numdoc, "ID");
  • Yes that was one of the solutions I applied, but I always prefer to use the Spring engines whenever possible.

  • This solution uses engines equally, but the problem is that the method has the parameters by reference.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.