5002 - Invalid value [OCRD.PriceMode]

Buenas estoy desarrollando en sap b1 9.3 PL:03.

Al tratar de crear un Business Partner. Se me presentan los siguientes errores:

1.- Si esta null.

  •   InnerException	"{\n   \"error\" : {\n      \"code\" : -8118,\n      \"message\" : {\n         \"lang\" : \"en-us\",\n         \"value\" : \"Enum property 'PriceMode' cannot be assigned as null\"\n      }\n   }\n}\n"	System.Exception {System.Data.Services.Client.DataServiceClientException}
    

2.- Si se coloca un valor cualquiera (Exeptuando ‘pmNet’, ‘N’, ‘pmGross’ y ‘G’)

  •   InnerException	"{\n   \"error\" : {\n      \"code\" : -1013,\n      \"message\" : {\n         \"lang\" : \"en-us\",\n         \"value\" : \"Invalid item name 'Gross' in Enum 'PriceModeEnum'. The valid names are: 'pmNet'-'N', 'pmGross'-'G'\"\n      }\n   }\n}\n"	System.Exception {System.Data.Services.Client.DataServiceClientException}
    

3.- Si se coloca uno de estos valores (‘pmNet’, ‘N’, ‘pmGross’ y ‘G’)

  •   InnerException	"{\n   \"error\" : {\n      \"code\" : -5002,\n      \"message\" : {\n         \"lang\" : \"en-us\",\n         \"value\" : \"Invalid value  [OCRD.PriceMode]\"\n      }\n   }\n}\n"	System.Exception {System.Data.Services.Client.DataServiceClientException}
    

Estoy trabajando con “Service Layer”, en MVC 5 (C#). He intentado de todo pero ya no se que hacer.

1 me gusta

Hola CarloZX, podrías adjuntar el body del Business Partner que estas intentando crear para las tres opciones que mencionas, me parece mas que estas asignando mas valores de los necesarios y podría estar chocando ahí, ese campo no es necesario ingresarlo, a menos claro que tengas configurado la lista de precios para ese SN en bruto o nett

Buenas, lamento la demora en mi respuesta.

public int AgregarCliente(string codCliente, string rutCliente, string nomCliente, List<SAP_API.Dir> ld, string comentario, string email,
                                   string phone1, string phone2, string gruposCliente, string gruposPago, string limitCredit, string salesP)
        {
            int error = 0;//0 = OK, 1 = error en agregar al cliente, 2 error al agregar alguna de las dorecciones, 3 error de codigo
            try
            {
                int ret = 0;
                BusinessPartner oBusinessPartners = new BusinessPartner();

                oBusinessPartners.CardCode = codCliente;
                oBusinessPartners.CardName = nomCliente;
                oBusinessPartners.CardType = "cCustomer";
                oBusinessPartners.Currency = "CLP";
                oBusinessPartners.Phone1 = phone1;
                oBusinessPartners.Phone2 = phone2;
                oBusinessPartners.EmailAddress = email;
                oBusinessPartners.FederalTaxID = rutCliente;//Rut del cliente para poma
                oBusinessPartners.GroupCode = Convert.ToInt32(gruposCliente);//[100 es el canal minorista,] No debe ser fijo
                oBusinessPartners.CreditLimit = Convert.ToInt32(limitCredit);//Limite de credito 500.000 No deberia ser fijo
                //No pude encontrar el DebLine o Payment Limit.
                oBusinessPartners.PayTermsGrpCode = Convert.ToInt32(gruposPago);//GroupNum (1 CONTADO)
                oBusinessPartners.FreeText = comentario;//Comentarios
                oBusinessPartners.SalesPersonCode = Convert.ToInt32(salesP);//Empleado del depto. ventas.(10 el es DISTRIBUIDORA)
                oBusinessPartners.U_GSP_SubGroupCode = "1";//Codigo del sub grupo (Campo definido por el usuario).

                //codigo que agrega los metodos de pago
                BPPaymentMethod bpm = new BPPaymentMethod();
                bpm.PaymentMethodCode = "CHEQUE";
                oBusinessPartners.BPPaymentMethods.Add(bpm);
                bpm = new BPPaymentMethod();
                bpm.PaymentMethodCode = "EFECTIVO";
                oBusinessPartners.BPPaymentMethods.Add(bpm);
                bpm = new BPPaymentMethod();
                bpm.PaymentMethodCode = "T_CREDITO";
                oBusinessPartners.BPPaymentMethods.Add(bpm);
                bpm = new BPPaymentMethod();
                bpm.PaymentMethodCode = "T_DEBITO";
                oBusinessPartners.BPPaymentMethods.Add(bpm);
                bpm = new BPPaymentMethod();
                bpm.PaymentMethodCode = "TRANSFERENCIA";
                oBusinessPartners.BPPaymentMethods.Add(bpm);

                //Agregar direcciones
                bool veri = true;
                string nom = "DESPACHO1";
                int pos = 0;
                for (int i = 0; i < ld.Count; i++)
                {
                    //Codigo POMA
                    BPAddress direccion = new BPAddress();
                    direccion.AddressName = nom;
                    direccion.State = ld[i].region;
                    direccion.Street = ld[i].Calle;
                    direccion.City = ld[i].ciudad;
                    direccion.Country = "CL";//Pais, Por ahora fijo
                    direccion.County = ld[i].provincia;//Provincia
                    direccion.Block = ld[i].comuna;//Comuna
                    pos++;
                    //Obligatorios por service layer
                    direccion.GstType = "cCustomer";
                    if (veri)//si es facturacion
                    {
                        direccion.AddressType = "bo_BillTo";
                        oBusinessPartners.BPAddresses.Add(direccion);
                        veri = false;
                        i--;
                        nom = "FACTURACION" + (i + 2);
                    }
                    else//si es despacho
                    {
                        direccion.AddressType = "bo_ShipTo";
                        oBusinessPartners.BPAddresses.Add(direccion);
                        veri = true;
                        nom = "DESPACHO" + (i + 2);
                    }
                }

                //Obligatorios por service layer
                oBusinessPartners.AcceptsEndorsedChecks = "tYES";
                oBusinessPartners.AccrualCriteria = "tYES";
                oBusinessPartners.Affiliate = "tYES";
                oBusinessPartners.AutomaticPosting = "apNo";
                oBusinessPartners.BPIntrastatExtension.IntrastatRelevant = "tYES";
                oBusinessPartners.BackOrder = "tYES";
                oBusinessPartners.BlockDunning = "tYES";
                oBusinessPartners.BlockSendingMarketingContent = "tYES";
                oBusinessPartners.BookkeepingCertified = "tYES";
                oBusinessPartners.CollectionAuthorization = "tYES";
                oBusinessPartners.CompanyPrivate = "cPrivate";
                oBusinessPartners.DatevFirstDataEntry = "tYES";
                oBusinessPartners.DeductibleAtSource = "tYES";
                oBusinessPartners.DeferredTax = "tYES";
                oBusinessPartners.DiscountBaseObject = "dgboNone";
                oBusinessPartners.DiscountRelations = "dgrAverageDiscount";
                oBusinessPartners.EDocGenerationType = "edocGenerate";
                oBusinessPartners.EffectiveDiscount = "dgrAverageDiscount";
                oBusinessPartners.EffectivePrice = "epDefaultPriority";
                oBusinessPartners.EndorsableChecksFromBP = "tYES";
                oBusinessPartners.Equalization = "tYES";
                oBusinessPartners.ExemptionMaxAmountValidationType = "emaIndividual";
                oBusinessPartners.FatherType = "cPayments_sum";
                oBusinessPartners.Frozen = "tNO";
                oBusinessPartners.HierarchicalDeduction = "tNO";
                oBusinessPartners.InsuranceOperation347 = "tNO";
                oBusinessPartners.NoDiscounts = "tNO";
                oBusinessPartners.OperationCode347 = "ocGoodsOrServiciesAcquisitions";
                oBusinessPartners.PartialDelivery = "tNO";
                oBusinessPartners.PaymentBlock = "tNO";
                oBusinessPartners.PriceMode = "N"; //El que presenta problemas
                oBusinessPartners.Properties1 = "tNO";
                oBusinessPartners.Properties2 = "tNO";
                oBusinessPartners.Properties3 = "tNO";
                oBusinessPartners.Properties4 = "tNO";
                oBusinessPartners.Properties5 = "tNO";
                oBusinessPartners.Properties6 = "tNO";
                oBusinessPartners.Properties7 = "tNO";
                oBusinessPartners.Properties8 = "tNO";
                oBusinessPartners.Properties9 = "tNO";
                oBusinessPartners.Properties10 = "tNO";
                oBusinessPartners.Properties11 = "tNO";
                oBusinessPartners.Properties12 = "tNO";
                oBusinessPartners.Properties13 = "tNO";
                oBusinessPartners.Properties14 = "tNO";
                oBusinessPartners.Properties15 = "tNO";
                oBusinessPartners.Properties16 = "tNO";
                oBusinessPartners.Properties17 = "tNO";
                oBusinessPartners.Properties18 = "tNO";
                oBusinessPartners.Properties19 = "tNO";
                oBusinessPartners.Properties20 = "tNO";
                oBusinessPartners.Properties21 = "tNO";
                oBusinessPartners.Properties22 = "tNO";
                oBusinessPartners.Properties23 = "tNO";
                oBusinessPartners.Properties24 = "tNO";
                oBusinessPartners.Properties25 = "tNO";
                oBusinessPartners.Properties26 = "tNO";
                oBusinessPartners.Properties27 = "tNO";
                oBusinessPartners.Properties28 = "tNO";
                oBusinessPartners.Properties29 = "tNO";
                oBusinessPartners.Properties30 = "tNO";
                oBusinessPartners.Properties31 = "tNO";
                oBusinessPartners.Properties32 = "tNO";
                oBusinessPartners.Properties33 = "tNO";
                oBusinessPartners.Properties34 = "tNO";
                oBusinessPartners.Properties35 = "tNO";
                oBusinessPartners.Properties36 = "tNO";
                oBusinessPartners.Properties37 = "tNO";
                oBusinessPartners.Properties38 = "tNO";
                oBusinessPartners.Properties39 = "tNO";
                oBusinessPartners.Properties40 = "tNO";
                oBusinessPartners.Properties41 = "tNO";
                oBusinessPartners.Properties42 = "tNO";
                oBusinessPartners.Properties43 = "tNO";
                oBusinessPartners.Properties44 = "tNO";
                oBusinessPartners.Properties45 = "tNO";
                oBusinessPartners.Properties46 = "tNO";
                oBusinessPartners.Properties47 = "tNO";
                oBusinessPartners.Properties48 = "tNO";
                oBusinessPartners.Properties49 = "tNO";
                oBusinessPartners.Properties50 = "tNO";
                oBusinessPartners.Properties51 = "tNO";
                oBusinessPartners.Properties52 = "tNO";
                oBusinessPartners.Properties53 = "tNO";
                oBusinessPartners.Properties54 = "tNO";
                oBusinessPartners.Properties55 = "tNO";
                oBusinessPartners.Properties56 = "tNO";
                oBusinessPartners.Properties57 = "tNO";
                oBusinessPartners.Properties58 = "tNO";
                oBusinessPartners.Properties59 = "tNO";
                oBusinessPartners.Properties60 = "tNO";
                oBusinessPartners.Properties61 = "tNO";
                oBusinessPartners.Properties62 = "tNO";
                oBusinessPartners.Properties63 = "tNO";
                oBusinessPartners.Properties64 = "tNO";
                oBusinessPartners.ResidenNumber = "rntSpanishFiscalID";
                oBusinessPartners.ShaamGroup = "sgServicesAndAsset";
                oBusinessPartners.SinglePayment = "tYES";
                oBusinessPartners.SubjectToWithholdingTax = "tNO";
                oBusinessPartners.SurchargeOverlook = "tNO";
                oBusinessPartners.TaxRoundingRule = "trr_RoundOff";
                oBusinessPartners.ThresholdOverlook = "tNO";
                oBusinessPartners.TypeOfOperation = "tooOthers";
                oBusinessPartners.TypeReport = "atOthers";
                oBusinessPartners.UseBillToAddrToDetermineTax = "tNO";
                oBusinessPartners.Valid = "tYES";
                oBusinessPartners.VatLiable = "vLiable";
                oBusinessPartners.WithholdingTaxCertified = "tYES";

                oBusinessPartners = currentOdataService.AddBP(oBusinessPartners);
                if (oBusinessPartners == null)
                {
                    return error;
                }
                error = 1;
                return error;
            }
            catch (Exception errMsg)
            {
                //throw errMsg;
                error = 3;
                return error;
            }
        }

El error 5002 lo da sin importar si:
oBusinessPartners.PriceMode = “pmNet”;, oBusinessPartners.PriceMode = “N”; ,oBusinessPartners.PriceMode = “pmGross”; o oBusinessPartners.PriceMode = “G”;

Hola @CarloZX
Lo primero es aclarar que NO estas trabajando con Service Layer, ya que el SL funciona mediante servicios REST.
Es este caso estas utilizando la DI-API y debes de tener en cuenta que si trabajas con precios de venta NETOS y BRUTOS al socio de negocio solamente le puedes asignar una lista de precios del mismo tipo.

precio bruto1

En resumen esta faltando asignar la propiedad PriceListNum, la cual debe ser del mismo modo de precio (PriceMode)

Andres Ramirez Jaramillo :colombia:

como dice Andres no veo seteado el campo PriceListNum, que es obligatorio para usar el otro campo, por lo que revise estas usando algun framework propio, como tambien menciona Andres el servicelayer son servicios REST, para crear un proveedor los campos obligatorios son:

  • CardCode
  • CardName
  • CardType
  • FederalTaxID
    veo un montón de campos que nisiquiera hacen falta, como las propiedades

Buenas, mi intención no es llevar la contraria llevo un par de meses en esto así que soy consiente ignoro varias cosas. Pero en este caso yo me estoy basando en el código de esta pagina (h_tps://blogs.sap.com/2015/07/15/how-to-consume-service-layer-odata-services-from-net-via-wcf/) donde se explica como integrar Service Layer con visual studio.

Por otro lado yo ya realice esto con DI-API este es mi código en DI-API:

public int AgregarCliente(string codCliente, string rutCliente, string nomCliente, List<Dir> ld, string comentario, string email,
                                    string phone1, string phone2, string gruposCliente, string gruposPago, string limitCredit, string salesP)
        {
            Company oCompany = conexion();
            int error = 0;//0 = OK, 1 = error en agregar al cliente, 2 error al agregar alguna de las dorecciones, 3 error de codigo
            try
            {
                if (oCompany == null)
                {
                    Exception e = new Exception("Error con la conxion de Sap");
                    throw e;
                }
                /*SAPbobsCOM.BusinessPartners bp2;
                bp2 = (SAPbobsCOM.BusinessPartners)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners);
                bp2.GetByKey(codCliente);
                int cod = bp2.Remove();*///Este codigo era para remover al usuario de prueba y para luego volver a crearlo.

                string errMsg1 = oCompany.GetLastErrorDescription();
                int ErroNo1 = oCompany.GetLastErrorCode();

                int ret = 0;
                SAPbobsCOM.BusinessPartners oBusinessPartners = (SAPbobsCOM.BusinessPartners)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners);

                oBusinessPartners.CardCode = codCliente;
                oBusinessPartners.CardName = nomCliente;
                oBusinessPartners.CardType = SAPbobsCOM.BoCardTypes.cCustomer;
                oBusinessPartners.Currency = "CLP";
                oBusinessPartners.Phone1 = phone1;
                oBusinessPartners.Phone2 = phone2;
                oBusinessPartners.EmailAddress = email;
                oBusinessPartners.FederalTaxID = rutCliente;//Rut del cliente para poma
                oBusinessPartners.GroupCode = Convert.ToInt32(gruposCliente);//[100 es el canal minorista,] No debe ser fijo
                oBusinessPartners.CreditLimit = Convert.ToInt32(limitCredit);//Limite de credito 500.000 No deberia ser fijo
                //No pude encontrar el DebLine o Payment Limit.
                oBusinessPartners.PayTermsGrpCode = Convert.ToInt32(gruposPago);//GroupNum (1 CONTADO)
                oBusinessPartners.FreeText = comentario;//Comentarios
                oBusinessPartners.SalesPersonCode = Convert.ToInt32(salesP);//Empleado del depto. ventas.(10 el es DISTRIBUIDORA)
                oBusinessPartners.UserFields.Fields.Item("U_GSP_SubGroupCode").Value = "1";//Codigo del sub grupo (Campo definido por el usuario).

                //codigo que agrega los metodos de pago
                oBusinessPartners.BPPaymentMethods.PaymentMethodCode = "CHEQUE";
                oBusinessPartners.BPPaymentMethods.Add();
                oBusinessPartners.BPPaymentMethods.PaymentMethodCode = "EFECTIVO";
                oBusinessPartners.BPPaymentMethods.Add();
                oBusinessPartners.BPPaymentMethods.PaymentMethodCode = "T_CREDITO";
                oBusinessPartners.BPPaymentMethods.Add();
                oBusinessPartners.BPPaymentMethods.PaymentMethodCode = "T_DEBITO";
                oBusinessPartners.BPPaymentMethods.Add();
                oBusinessPartners.BPPaymentMethods.PaymentMethodCode = "TRANSFERENCIA";
                oBusinessPartners.BPPaymentMethods.Add();

                //Agregar direcciones
                bool veri = true;
                string nom = "DESPACHO";
                int pos = 0;
                for (int i = 0; i < ld.Count; i++)
                {
                    //Codigo POMA
                    oBusinessPartners.Addresses.Add();
                    oBusinessPartners.Addresses.SetCurrentLine(pos);
                    oBusinessPartners.Addresses.AddressName = nom;
                    oBusinessPartners.Addresses.State = ld[i].region;
                    oBusinessPartners.Addresses.Street = ld[i].Calle;
                    oBusinessPartners.Addresses.City = ld[i].ciudad;
                    oBusinessPartners.Addresses.Country = "CL";//Pais, Por ahora fijo
                    oBusinessPartners.Addresses.County = ld[i].provincia;//Provincia
                    oBusinessPartners.Addresses.Block = ld[i].comuna;//Comuna
                    pos++;
                    if (veri)//si es facturacion
                    {
                        oBusinessPartners.Addresses.AddressType = SAPbobsCOM.BoAddressType.bo_BillTo;
                        veri = false;
                        i--;
                        nom = "FACTURACION";
                    }
                    else//si es despacho
                    {
                        oBusinessPartners.Addresses.AddressType = SAPbobsCOM.BoAddressType.bo_ShipTo;
                        veri = true;
                        nom = "DESPACHO";
                    }
                }

                ret = oBusinessPartners.Add();//Agrega a SAP al cliete y retorna un valor 0 si todo sale bien.
                if (ret == 0)
                {
                    return error;
                }

                string errMsg = oCompany.GetLastErrorDescription();
                int ErroNo = oCompany.GetLastErrorCode();
                error = 1;
                return error;
            }
            catch (Exception errMsg)
            {
                oCompany.Disconnect();
                //throw errMsg;
                error = 3;
                return error;
            }
        }

Y este me funciona perfectamente. Pero mi problema esta que a mitad del desarrollo la empresa decidió migrar a cloud y los proveedores del servicio solo nos permiten comunicar por “service layer”. Debido a eso estube trasladando todo basándome en la pagina anterior, no es exactamente lo mismo que el DI-API, pero se parecen en algunas cosas.

Igualmente muchas gracias por tu respuesta.

PD: Probé agregar la PriceListNum y me sigue dando el mismo error

lo que hacen es el sitio es integrar el ODATA del SL y llevarlo como un servicio utilizando WCF, no se si es lo mejor, mejor seria hacer un servicio REST, y consumir directamente.
lo que puedes intentar es eliminar todo el código que tienes, partir por los cuatro campos que te menciono, y luego ir agregando lo que vayas necesitando de atributos

Buenas probé pasarlo a un servicio REST y resulto, gracias por la sugerencia.