Error al especificar fecha de vencimiento


#1

Buen día expertos, tengo un programa que crea una cotización en SAP B1 (Oferta de venta / Quotation) a través del DI API, pero me encontré con un problema al querer asignarle una fecha de vencimiento (Válido hasta / DocDueDate), debido a que no me la acepta en ningún formato.

Revisando el XML de un documento creado en el cliente, veo que la fecha está en el siguiente formato:

<DocDueDate>20180410</DocDueDate>

Es decir “yyyyMMdd”, y he intentado asignarla tanto por un campo de fecha, como manualmente:

DateTime fechaPrueba = DateTime.Parse("20180523");
DateTime fechaPrueba = new DateTime(2018, 05, 23, 6, 30, 0);
Cotizacion.DocDueDate = Convert.ToDateTime( txtFecha.Text.ToString(), System.Globalization.CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);
Cotizacion.DocDueDate = DateTime.Now.AddMonths(1);

Pero de ninguna forma consigo que aparezca la fecha personalizada, en algunos casos sólo me le agrega un día a la fecha de vencimiento, es decir, las que creé el día de hoy me aparecen con vencimiento mañana. En otros casos me arroja un mensaje indicando que la cadena de fecha tiene un formato incorrecto.

¿Alguien ha tenido algún problema similar? Revisé en el foro y no encontré ninguna entrada relacionada con este tema.

Gracias de antemano por cualquier ejemplo, comentario u orientación que puedan brindarme. Saludos cordiales.


#2

Hola, el formato de fecha que debes mandar debe ser igual al que tengas en parametrizaciones generales
image

Esto sucede porque el sistema toma las condiciones de pago que tiene el socio de negocios, por default al crear la base de datos Condición de Pago de deudor por defecto es 1

Saludos.


#3

Gracias por tu respuesta @pcarrasco, revisando el formato de fecha en el SAP, es el mismo que el de tu ejemplo (DD/MM/AAAA). Intenté pasarle la fecha de esta forma:

DateTime fechaPrueba = DateTime.ParseExact(txtFechaSeleccionada.Text.ToString(), "DD/MM/YYYY", CultureInfo.InvariantCulture);

Pero me apareció el error: No se puede reconocer la cadena como valor DateTime válido.

Si cambio el formato a dd/MM/yyyy no me aparece ese error, se crea el documento, pero a la fecha le agrega un día, es decir, no le asigna lo que capturo en el cuadro de texto.

Intenté también de estas dos formas:

DateTime fechaPrueba = DateTime.Parse("08/08/2018");
DateTime fechaPrueba = Convert.ToDateTime(txtFechaSeleccionada.Text.ToString(), CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);

Sin embargo pasa lo mismo, me deja crear el documento (no me aparece error de que el formato de la fecha esté incorrecto), pero a la fecha le agrega un día solamente.
¿Se te ocurre alguna otra cosa con la que pueda probar? Gracias de antemano por tu apoyo.


#4

Buenos días @l.villarreal

Debería ser el mismo formato que la fecha de contabilización “DocDate”, en lo personal, en los documentos que yo he creado mediante DI API, cualquiera de las fechas, como “DocDate”, “DocDueDate” y “TaxDate”, las puedo asignar de diferentes formas, siempre y cuando lo que asignes sea un dato tipo “DateTime”, es la única condición.

1.- Cuando se trata de asignar la fecha actual lo hago con “DateTime.Now”
2.- Cuando se trata de una fecha específica, lo hago con…
a).- new DateTime(2018,5,23); con el orden, año, mes, dia
b).- Cualquier variable tipo “DateTime”

Saludos
SAP B1, v9.2 PL03
México


#5

Que tal buen día @chavalito, gracias por tu comentario! y sí de hecho precisamente es como lo declaro, perdón por ser tan cansino pero ya no encuentro de qué otra forma intentarlo. Seguí tu recomendación y traté de estas dos formas:

Cotizacion.DocDueDate = DateTime.Now.AddDays(10);
DateTime fechaPrueba = new DateTime(2018, 05, 23);
Cotizacion.DocDueDate = fechaPrueba;

Pero sigo sin conseguir que funcione. Vaya, en el XML si se guarda el valor correspondiente:

<DocNum>110063877</DocNum>
<DocDate>20180507</DocDate>
<DocDueDate>20180517</DocDueDate>

Pero en el documento de SAP aparece así:
image

Alguna otra sugerencia? Gracias de antemano!


#6

Que tal @l.villarreal

En realidad yo no utilizo XML, yo lo realizo de la siguiente forma; realicé pruebas asignando la fecha de vencimiento tanto con “DateTime.Now” como con “new DateTime(2018,6,15)” como muestro en el código ejemplo.

NOTA: No interfiere las condiciones de pago del socio de negocios.

private void btnCrearOfertaDeVentas_Click(object sender, EventArgs e) {
            Company oEmpresa = new Company();

            try {
                string baseDeDatosEMPRESA = "NOMBRE_BD";
                oEmpresa.Server = "SERVIDOR";
                oEmpresa.LicenseServer = "SERVIDOR:30000";
                oEmpresa.CompanyDB = baseDeDatosEMPRESA;
                oEmpresa.UserName = "manager";
                oEmpresa.Password = "password";
                oEmpresa.DbUserName = "sa";
                oEmpresa.DbPassword = "password";
                oEmpresa.DbServerType = BoDataServerTypes.dst_MSSQL2014;
                oEmpresa.language = BoSuppLangs.ln_Spanish_La;
                oEmpresa.UseTrusted = false;

                if (oEmpresa.Connect() != 0) {
                    //int errNumero = 0; string errMensaje = "";
                    oEmpresa.GetLastError(out int errNumero, out string errMensaje);
                    oEmpresa.Disconnect();
                    Marshal.ReleaseComObject(oEmpresa);
                    oEmpresa = null;
                    MessageBox.Show("Ha ocurrido el siguiente error al intentar conectar a la Base de Datos " + baseDeDatosEMPRESA + " en SAP\n\n" + errMensaje, tituloMSGBOX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                // inicia transaction para asegurarse de que si NO se realicen con éxito todas las operaciones, deshaga cualquier cambio realizado hasta antes del error en caso de ocurrir
                oEmpresa.StartTransaction();

                // procede a crear la oferta de ventas
                SAPbobsCOM.Documents OfertaDeVentas = oEmpresa.GetBusinessObject(BoObjectTypes.oQuotations);
                OfertaDeVentas.CardCode = "C100013";
                OfertaDeVentas.DocDate = DateTime.Now;
                OfertaDeVentas.DocDueDate = new DateTime(2018,6,15);
                OfertaDeVentas.TaxDate = DateTime.Now;
                OfertaDeVentas.Lines.ItemCode = "07008";
                OfertaDeVentas.Lines.Quantity = 12;
                OfertaDeVentas.Lines.UnitPrice = 5;
                OfertaDeVentas.Lines.TaxCode = "IVAT0001";
                OfertaDeVentas.Comments = "Concepto del documento";

                int resultado = OfertaDeVentas.Add();
                if (resultado != 0) {
                    //int errNumero = 0; string errMensaje = "";
                    oEmpresa.GetLastError(out int errNumero, out string errMensaje);
                    if (oEmpresa.InTransaction == true) {
                        oEmpresa.EndTransaction(BoWfTransOpt.wf_RollBack);
                    }        // si la transacción sigue abierta, la cierra deshaciendo todos los cambios realizados hasta el momento
                    throw new Exception("Ha ocurrido el siguiente error, al intentar crear la Oferta de Ventas, revise por favor ...\n\n" + errMensaje);
                }

                // guarda en firme la información en la base de datos
                oEmpresa.EndTransaction(BoWfTransOpt.wf_Commit);
                MessageBox.Show("Las operaciones fueron realizadas con éxito, revise por favor ...", tituloMSGBOX, MessageBoxButtons.OK, MessageBoxIcon.Information);
                if (oEmpresa.Connected) {
                    oEmpresa.Disconnect();
                }
                oEmpresa = null;
            }
            catch (Exception err) {
                // Control de errores
                MessageBox.Show(err.Message, tituloMSGBOX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                if (oEmpresa.InTransaction == true) {
                    oEmpresa.EndTransaction(BoWfTransOpt.wf_RollBack);
                }        // si la transacción sigue abierta, la cierra deshaciendo todos los cambios realizados hasta el momento
                if (oEmpresa.Connected) {
                    oEmpresa.Disconnect();
                }
                oEmpresa = null;
            }
        }

Imagen del documento creado en SAP
imagen

No resuelve tu problema, sin embargo, deja constancia de que no debería haber problema, ahora, no se si por medio del archivo XML haga algo diferente.

Saludos
SAP B1, v9.2 PL03
México


#7

Está tan interesante el tema que no me quiero quedar sin participar…

Para complementar lo siguiente:

He descubierto algo que en lo personal no sabía, hablando de ofertas de venta, si bien no se toman en cuenta las condiciones de pago del SN, el sistema en automática asigna 30 días de valides tomando como referencia la fecha del documento, así lo expresa SAP:

Válido hasta
Introduzca la fecha hasta la cual es válida la oferta de venta. La fecha por defecto es 30 días después de la fecha de contabilización. Puede modificarse manualmente si es necesario. El campo es únicamente informativo.

Suerte compañero.

Saludos a todos.
:wink:


#8

Buenas tardes

Gracias por tu aportación Gera, tampoco sabía que estaba documentado, sin embargo, efectivamente, si tu capturas directo en el cliente de SAP, te asigna 30 días por default.

Lo extraño es que a Luis, no le respeta la fecha especificada en el archivo XML por medio de DI API.

Saludos
SAP B1, v9.2 PL03
México


#9

Me percate de ello por eso lo menciono a manera “informativa”, en definitiva no va por ahí el asunto pero me pareció un dato interesante. :sweat_smile:


#10

Gracias por sus comentarios @chavalito y @Gera_Mendez, tristemente les informo que no pude dar con la solución a este problema, pero estoy bastante seguro que el ejemplo de Salvador es el correcto y debe ser otro factor el que me impida conseguir el objetivo. Lo marqué como solución para cerrar el tema y que les pueda ayudar a más personas.

De nuevo gracias! Un saludo desde Monterrey.


#11

A mi me funciona de esta forma…validalo y comenta. De igual forma estoy trabajando con XML.

DateTime.ParseExact(FechaPoliza.Value, “yyyyMMdd”, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None)

saludos


#12

Que tal @l.villarreal, buenas tardes

Me tienes tan intrigado con este tema, jajajaja, que hice una prueba sencilla, importando al información de un XML, y en realidad si me respeta las fechas:

Ejemplo del código:

Company oEmpresa = new Company();

try {
    string baseDeDatosEMPRESA = "NOMBRE_BD";
    oEmpresa.Server = "SERVIDOR";
    oEmpresa.LicenseServer = "SERVIDOR:30000";
    oEmpresa.CompanyDB = baseDeDatosEMPRESA;
    oEmpresa.UserName = "usuario";
    oEmpresa.Password = "pass";
    oEmpresa.DbUserName = "sa";
    oEmpresa.DbPassword = "pass";
    oEmpresa.DbServerType = BoDataServerTypes.dst_MSSQL2014;
    oEmpresa.language = BoSuppLangs.ln_Spanish_La;
    oEmpresa.UseTrusted = false;

    if (oEmpresa.Connect() != 0) {
        //int errNumero = 0; string errMensaje = "";
        oEmpresa.GetLastError(out int errNumero, out string errMensaje);
        oEmpresa.Disconnect();
        Marshal.ReleaseComObject(oEmpresa);
        oEmpresa = null;
        MessageBox.Show("Ha ocurrido el siguiente error al intentar conectar a la Base de Datos " + baseDeDatosEMPRESA + " en SAP\n\n" + errMensaje, tituloMSGBOX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
    }

    oEmpresa.StartTransaction();

    int resultado = 0;
    string strArchivoXML = @"C:\Ruta\archivoOfertaDeVentas.xml";
    Documents OfertaDeVentas = ((Documents)(oEmpresa.GetBusinessObjectFromXML(strArchivoXML, 0)));

    resultado = OfertaDeVentas.Add();
    if (resultado != 0) {
        //int errNumero = 0; string errMensaje = "";
        oEmpresa.GetLastError(out int errNumero, out string errMensaje);
        if (oEmpresa.InTransaction == true) {
            oEmpresa.EndTransaction(BoWfTransOpt.wf_RollBack);
        }        // si la transacción sigue abierta, la cierra deshaciendo todos los cambios realizados hasta el momento
        throw new Exception("Ha ocurrido el siguiente error, al intentar crear la Oferta de Ventas, revise por favor ...\n\n" + errMensaje);
    }


    // guarda en firme la información en la base de datos
    oEmpresa.EndTransaction(BoWfTransOpt.wf_Commit);
    MessageBox.Show("La Oferta de Ventas fue generada con éxito, revise por favor ...", tituloMSGBOX, MessageBoxButtons.OK, MessageBoxIcon.Information);
    if (oEmpresa.Connected) {
        oEmpresa.Disconnect();
    }
    oEmpresa = null;
}
catch (Exception err) {
    // Control de errores
    MessageBox.Show(err.Message, tituloMSGBOX, MessageBoxButtons.OK, MessageBoxIcon.Warning);
    if (oEmpresa.InTransaction == true) {
        oEmpresa.EndTransaction(BoWfTransOpt.wf_RollBack);
    }        // si la transacción sigue abierta, la cierra deshaciendo todos los cambios realizados hasta el momento
    if (oEmpresa.Connected) {
        oEmpresa.Disconnect();
    }
    oEmpresa = null;
}

Imagen del XML:
imagen

Texto del XML…

<?xml version="1.0" encoding="UTF-16"?>23I232018051320180615C10001320180514Concepto del documento0700812.0000005.000000IVAT0001

Imagen del documento ya creado en SAP (DI API)

Funcionó correctamente, después de no se cuantos intentos, porque yo no lo había realizado de esta forma, mi caso en particular no le veo sentido, a menos que el XML lo genere un proceso ajeno al mío, igual y tu caso es muy particular. No se que más decirte, lamento no poder ayudarte con lo que necesitas.

NOTA: Lo único raro que veo es que internamente en el texto del XML, tiene encoding=“UTF-16”, y al abrirlo con el explorador de windows Microsoft Edge muestra encoding=“ISO-8859-1”., búscale por ese lado, pero porqué las otras fechas si te las respeta ?

Saludos
SAP B1, v9.2 PL03
México


#13

Buen día, gracias por la sugerencia @juliancab, desafortunadamente no me funcionó tampoco de esa forma.

Que tal @chavalito la verdad es que me di por vencido porque traté de todas las formas posibles, mira nadamas cómo quedó lleno de comentarios probando cada posibilidad:

//Cotizacion.DocDate = DateTime.Now;
//Cotizacion.DocDueDate = DateTime.ParseExact((new DateTime(2018, 6, 23)).ToString(), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
//Cotizacion.DocDueDate = new DateTime(2018, 6, 15);

//Cotizacion.DocDueDate = DateTime.ParseExact(txtFecha.Text, "DD/MM/YYYY", CultureInfo.InvariantCulture);

//DateTime fechaPrueba = DateTime.Parse("08/08/2018");
//DateTime fechaPrueba = Convert.ToDateTime(txtFechaSeleccionada.Text.ToString(), CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);
//DateTime fechaPrueba = DateTime.ParseExact(txtFechaSeleccionada.Text.ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);

//DateTime fechaPrueba = new DateTime(2018, 05, 23);
//Cotizacion.DocDueDate = fechaPrueba;

//DateTime fechaPrueba = DateTime.Parse("20180523");
//DateTime fechaPrueba = DateTime.ParseExact("20180511", "yyyyMMdd", CultureInfo.InvariantCulture);
//DateTime fechaPrueba = new DateTime(2018, 05, 23, 6, 30, 0);
//Cotizacion.DocDueDate = DateTime.ParseExact(txtFechaSeleccionada.Text.ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);
//Cotizacion.DocDueDate = Convert.ToDateTime( txtFecha.Text.ToString(), System.Globalization.CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);

//Cotizacion.DocDueDate = DateTime.Now.AddMonths(1);

Creo que me expliqué mal con el tema del XML, la cotización NO la genero apartir de un XML, lo que hace realmente el programa es generar la cotización a través del DI API, así como el primer ejemplo que me proporcionaste hace 10 días.

En realidad no respeta ninguna jajaja, bien puedo crear la cotización sin asignar DocDate y DocDueDate, y automaticamente se ponen hoy y mañana respectivamente. Aquí un ejemplo de un documento al que no le declaré fechas:

image

Así que las declare o no, no lo respeta. Lo que mencionaba del XML era que, una vez creado el documento (por DI API) yo extraía el código XML de esa cotización recién creada para ver el detalle de las líneas, y lo que me pareció más curioso es que en el archivo XML resultante SI se tenía la fecha que yo había especificado por medio del DI API, y en el formato que debe ser, pero cuando abro ese documento en SAP, la cabecera muestra la fecha mal (como la captura), en la fecha de contabilización viene la fecha actual, y en válido hasta aparece mañana.

Este problema ya agotó mi paciencia, ya lo dejé por la paz. Muchas gracias por todo tu tiempo y esfuerzo. En un momento más abriré un tema respecto a Crystal Reports, espero que me puedas ayudar jeje ya te volviste mi consejero profesional.


#14

Buenos días @l.villarreal

De acuerdo, una disculpa por la confusión del XML, ya decía yo que no tenía sentido, jajajajaja

Es muy extraño tu caso, en lo personal he creado pedidos de cliente, entrada de proveedores, factura de clientes y proveedores, incluso con documentos base/destino, pagos, polizas, etc, y hasta el momento no he tenido problemas en ninguna de las TRES fechas, en fin.

Solo por curiosidad, y para tenerlo en cuenta, que versión y PL de SAP B1 tienes ???

Saludos
SAP B1, v9.2 PL02
México


#15

Buen día, disculpa la demora en responder. Actualmente estoy en SAP B1 v9.2 | PL 09.

¿Crees que sea tema de la versión o que le falte algún permiso al usuario con el que me conecto a través del DI API?

Gracias de antemano, saludos cordiales.


#16

Habria que revisar la regionalización de la PC donde estas desarrollando y donde implementas el exe


#17

Buen día @juliancab, pues la PC donde ejecuto el proyecto está en idioma español, de igual manera el SAP lo tengo en español.

Traté de forzar el idioma al conectarme al objeto oCompany de la siguiente forma:

oCompany.language = BoSuppLangs.ln_Spanish;

Pero ni siquiera con eso logré solucionarlo. Muy probablemente tenga una maldición.
Muchas gracias por todo su apoyo.

Saludos cordiales.


#18

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.