cancel
Showing results for 
Search instead for 
Did you mean: 

Modificar el Folio de una factura de venta

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimados,

Les dejo este codigo en Visual Basic.NET para que puedan cambiar el folio de una factura que por error se le haya asignado, o porque se saltaron algun correlativo, etc.

Este metodo de modificacion usando en DI API de SBO es legal, no como el Update desde SQL.

Para usarlo deben seguir simples pasos.

1) Descargar Visual Basic, puede ser la version EXPRESS, o si ya tienen Visual Studio no lo hagan.

2) Inicien un nuevo proyecto de tipo CONSOLA

3) En la pestaña proyecto --> agregar referencias --> COM --> SAP Business one DI API 8.81 (si tienen 8.8 o 2007 aparecera la version que tengan)

4) Antes de pegar el codigo, ejecuten el proyecto en blanco, luego de eso pegan el siguiente codigo


Module Modificar_folio
 
    Sub main()
 
        'Definir variables
        Dim oCompany As SAPbobsCOM.Company
        Dim lRetCode, ErrorCode As Long
        Dim ErrorMessage As String
 
 
        'Iniciar objeto de la compañia
        oCompany = New SAPbobsCOM.Company
 
        'Definir datos de la coneccion
        oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_MSSQL2008 //Tipo de BD
        oCompany.DbUserName = "sa"
        oCompany.DbPassword = "*****"  //Contraseña usuairo SA
        oCompany.Server = "SERVER" //IP o servidor de SQL
        oCompany.CompanyDB = "SBODemoCL"   //BASE DE DATOS
        oCompany.UserName = "manager"
        oCompany.Password = "******"  //contraseña usuario manager
        oCompany.language = SAPbobsCOM.BoSuppLangs.ln_English //lenguaje de SQL, si esta en español usa SAPbobsCOM.BoSuppLangs.ln_Spanish
        oCompany.UseTrusted = False
 
        'Conectar a la base de SAP B1
        lRetCode = oCompany.Connect()
 
 
        Dim Retval As Long
        Dim Document As SAPbobsCOM.Documents
        Document = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oInvoices)
        If Document.GetByKey(/*DocEntry del documento*/) = True Then
            Document.FolioNumber = /*Folio que asignaras*/
            Document.FolioPrefixString = "/*Prefijo del folio*/"
            Retval = Document.Update()
        Else
            MsgBox("No se encontraron registros")
        End If
 
        Call oCompany.GetLastError(ErrorCode, ErrorMessage)
        If (lRetCode != 0) Then //cambienlo por el otro operador no es igual
            MsgBox("Falló la conección: " + Str(ErrorCode) + "," + ErrorMessage)
        End If
 
        If (Retval != 0) Then //cambienlo por el otro operador no es igual
            MsgBox("Falló la actualización: " + Str(ErrorCode) + "," + ErrorMessage)
        End If
 
    End Sub
 
End Module

5) Luego solo resta colocar los datos que cambiaremos

If Document.GetByKey(5556) -- DocEntry de la factura

Document.FolioNumber = 445 -- Folio a corregir

Document.FolioPrefixString = "FC" -- Prefijo

Luego ejecutar y listo

Espero les sirva y sea una pequeña introduccion a lo que es el SDK de SBO.

Saludos

Accepted Solutions (0)

Answers (5)

Answers (5)

Former Member
0 Kudos

Felipe. Si quiero nullear el Folio como debería hacerlo?

Former Member
0 Kudos

Felipe, como anulo folios ya asignados en SAP B1 9.1, por error factura fue emitida 246 veces y necesito reutilizar folios...

Humberto_Neira
Product and Topic Expert
Product and Topic Expert
0 Kudos

Nicolas,

en que país operas?  sube tu consulta al partner para que te ayuden.

saludos

former_member188471
Active Contributor
0 Kudos

Nicolas, o sea hay 246 facturas con folios que no corresponden?

felipe_loyolarodriguez
Active Contributor
0 Kudos

Buenas tardes


El código solo cambia los folios en los documentos de SAP B1, en caso de que sean folios electrónicos lo mejor es verlo directamente con el proveedor de factura electrónica

Atte.

Former Member
0 Kudos

Estimado Felipe, aprovecho la instancia para preguntar: ¿Como hago para anular el numero de folio?

Lo que pasa es que las facturas clientes las subí por DTW y quedaron con saldo cero

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado Cristobal

Puedes dejar todas las facturas sin folio y cambiar el indicador en la pestaña finanzas a indicador nulo que ustedes usan. Con eso ya no aparecera en los libros legales.

Saludos

Felipe Loyola

Former Member
0 Kudos

Estimado Felipe, buenas tardes.

estimado estoy realizando unas pruebas de un código para actualizar las propiedades del SN (Proveedores) como es la de marcar y desmarcar, pero aun no logro actualizar este reg. para el caso estoy solo cogiendo un código de proveedor como prueba, favor estimado si no fuese mucha molestia me podrías brindar un consejo, la verdad que esta en mi primera practica en SDK y se me dio por tratar de hacerlo.

esperando como siempre tu atención y colaboración, se agradece de antemano.

oForm = oApplication.Forms.GetForm("frmSN", 1);

                       oBP = (SAPbobsCOM.BusinessPartners)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners);

                       ConsultaSQL = "select T0.CardCode";

                       ConsultaSQL = ConsultaSQL + " from OCRD T0";

                       ConsultaSQL = ConsultaSQL + " where T0.QryGroup1='N'";

                       ConsultaSQL = ConsultaSQL + " and T0.GroupCode = '101'";

                       ConsultaSQL = ConsultaSQL + " and T0.CardCode ='P10000450052'";

                       rsTemp = (SAPbobsCOM.Recordset)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);

                       rsTemp.DoQuery(ConsultaSQL);

                       if (rsTemp.RecordCount > 0)

                       {

                           rsTemp.MoveFirst();

                           for (int i = 1; i <= rsTemp.RecordCount; i++)

                           {

                               oBP.GetByKey(rsTemp.Fields.Item(0).Value.ToString());

                               oBP.Properties(1) = SAPbobsCOM.BoYesNoEnum.tYES;

                               lRetCode = oBP.Update();

                               if (lRetCode == 0)

                               {

                                   oApplication.StatusBar.SetText("OK: " + rsTemp.Fields.Item(0).Value.ToString(), SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Success);

                               }

                               else

                               {

                                   sErrMsg = oCompany.GetLastErrorDescription();

                                   oApplication.StatusBar.SetText("MAL: " + sErrMsg, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);

                               }

                               rsTemp.MoveNext();

                           }

                       }

                       break;

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado Carlos

Consulta, ¿Estás realizando un AddOn o una aplicación DI API?

Prueba este código:

private void actualizaBP()

        {

            String connectionString = ("Server=" + "localhost" + ";initial catalog=" + "base de datos" + "; user=" + "sa" + ";password=" + "sa password" + ";Trusted_Connection=FALSE");

            using (SqlConnection connection = new SqlConnection(connectionString))

            {

                connection.Open();

                using (SqlCommand command = new SqlCommand("SELECT T0.CardCode FROM OCRD T0 WHERE T0.QryGroup1='N' AND  T0.CardCode ='P10000450052'", connection))

                {

                    SqlDataReader reader = command.ExecuteReader();                   

                    SAPbobsCOM.BusinessPartners oBP = (SAPbobsCOM.BusinessPartners)(oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners));

                    while (reader.Read())

                    {

                        String Code = reader.GetString(0);

                        if (oBP.GetByKey(Code) == true)

                        {

                            oBP.Properties[1] = SAPbobsCOM.BoYesNoEnum.tYES;

                            lRetCode = oBP.Update();

                            if (lRetCode != 0)

                            {

                                ErrCod = oCompany.GetLastErrorCode();

                                ErrMsg = oCompany.GetLastErrorDescription();

                                MessageBox.Show(ErrCod.ToString() + ErrMsg)

                            }

                        }

                    }

                }

            }

        }

Saludos

Felipe

Former Member
0 Kudos

Hola Felipe, doc. ante todo el agradecimiento por tu colaboración, bueno te comento que aun estoy tratando de ver y adecuar segun tu recomendación pero aun no puedo, envio en mi codigo favor estimado tus recomendaciones.

Ah lo estoy realizando por DI API.. (SBO 2007a)

class SocioDeNegocios

{

    public SocioDeNegocios()

    {

    }

    public SocioDeNegocios(ref SAPbouiCOM.Application oApplication, ref SAPbobsCOM.Company oCompany)

    {

        CreateForm(ref oApplication, ref oCompany);

    }

    private void CreateForm(ref SAPbouiCOM.Application oApplication, ref SAPbobsCOM.Company oCompany)

    {

        try

        {

            SAPbouiCOM.Form oForm;

            SAPbouiCOM.Item oItem;

            SAPbouiCOM.Button oButton;

            SAPbouiCOM.CheckBox oCheck;

            SAPbouiCOM.EditText oEdit;

            SAPbouiCOM.StaticText oStatic;

            SAPbouiCOM.ComboBox oCombo;

            SAPbouiCOM.Grid oGrid;

            SAPbouiCOM.UserDataSource userDS;

            SAPbouiCOM.FormCreationParams CP;

            SAPbouiCOM.Grid oGrid1;

            SAPbouiCOM.StaticText oStat;

            SAPbouiCOM.EditText txt1, txt2, txt3;

            SAPbouiCOM.ComboBox Cmb1, Cmb2, Cmb3;

            SAPbouiCOM.Button oBtn;

            SAPbouiCOM.OptionBtn oOpt;

            //SAPbouiCOM.ComboBox Cmb1, Cmb2, Cmb3;

            /*

        oForm = oApplication.Forms.Add("frmPM", SAPbouiCOM.BoFormTypes.ft_Sizable, -1);

            */

            SAPbouiCOM.FormCreationParams oFormCreationParams;

            oFormCreationParams = (SAPbouiCOM.FormCreationParams)oApplication.CreateObject(SAPbouiCOM.BoCreatableObjectType.cot_FormCreationParams);

            oFormCreationParams.UniqueID = "frmSN";

            oFormCreationParams.FormType = "frmSN";

            //oFormCreationParams.ObjectType = "" // Property For UDO And For replacing system form

            oFormCreationParams.BorderStyle = (SAPbouiCOM.BoFormBorderStyle)SAPbouiCOM.BoFormTypes.ft_Sizable;

            oForm = oApplication.Forms.AddEx(oFormCreationParams);

            oForm.Title = "Textiles Camones: Socios de Negocios";

            oForm.Left = 200;

            oForm.Top = 100;

            oForm.Width = 720;

            oForm.Height = 550;

           

            //  Botones:

         

            //  Botton ActProp

            oItem = oForm.Items.Add("ActProp", SAPbouiCOM.BoFormItemTypes.it_BUTTON);

            oItem.Top = oForm.Height - 85;

            oItem.Left = 380;

            oItem.Width = 80;

            oBtn = ((SAPbouiCOM.Button)(oItem.Specific));

            oBtn.Caption = "Act Propiedad";

             oForm.Visible = true;

        }

        catch (Exception ex)

        {

            oApplication.SetStatusBarMessage(ex.Message, SAPbouiCOM.BoMessageTime.bmt_Long, true);

            //oForm.Close();

        }

    }

    public void HandleItemEvent(ref SAPbouiCOM.Application oApplication, SAPbobsCOM.Company oCompany, SAPbouiCOM.ItemEvent oItemEvent, string FormUID)

    {

         if (FormUID == "frmSN")

        {

            if ((oItemEvent.BeforeAction == false) & (oItemEvent.EventType == SAPbouiCOM.BoEventTypes.et_CLICK))

            {

                SAPbouiCOM.Form oForm;

                SAPbobsCOM.Recordset rsTemp;

                SAPbouiCOM.Grid oGrid;

                SAPbouiCOM.ComboBox oCombo;

                SAPbouiCOM.EditText oEdit;

                SAPbouiCOM.CheckBox oCheck;

                SAPbobsCOM.BusinessPartners oBP;

                SAPbobsCOM.Payments oPayment;

                SAPbobsCOM.Documents oDoc;

                int lRetCode;

                int lErrCode;

                string sErrMsg;

                string ConsultaSQL;

                switch (oItemEvent.ItemUID)

                {

                    case "ActProp":

                        // Actualizar Propiedad

                       oBP = (SAPbobsCOM.BusinessPartners)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners);

                        ConsultaSQL = "select T0.CardCode,T0.CardName,T0.WTLiable";

                        ConsultaSQL = ConsultaSQL + " from OCRD T0";                      

                        ConsultaSQL = ConsultaSQL + " where T0.CardType='S'";

                        ConsultaSQL = ConsultaSQL + " and T0.QryGroup1='N'";

                        ConsultaSQL = ConsultaSQL + " and T0.CardCode = 'P10000450052'";

                        rsTemp = (SAPbobsCOM.Recordset)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);

                        rsTemp.DoQuery(ConsultaSQL);

                        if (rsTemp.RecordCount > 0)

                        {

                            rsTemp.MoveFirst();

                            for (int i = 1; i <= rsTemp.RecordCount; i++)

                            {

                                oBP.GetByKey(rsTemp.Fields.Item(0).Value.ToString());

                               

                                oBP.Properties[1] = SAPbobsCOM.BoYesNoEnum.tYES; 

                               

                               

                               

                                lRetCode = oBP.Update(); 

                              

                                 if (lRetCode == 0)

                                {

                                    oApplication.StatusBar.SetText("OK: " + rsTemp.Fields.Item(0).Value.ToString(), SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Success);

                                }

                                else

                                {

                                    sErrMsg = oCompany.GetLastErrorDescription();

                                    oApplication.StatusBar.SetText("MAL: " + sErrMsg, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);

                                }

                                rsTemp.MoveNext();

                            }

                        }

                        break;

                        }

                 

                }

            }

        }

      }

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado Carlos, si deseas podemos coordinar una sesión team viewer para ver el debug del problema in situ.

Luego dejamos la solución en este hilo.

Saludos

Former Member
0 Kudos

Hola, Felipe, buen dia.

Ok estimado, seria perfecto, favor me puedes indicar tu Correo para darte los datos?, si tienes varios, por favor brindarme de preferencia el de Gmail.

quedo y agradezco de antemano.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Mi mail es felipe.loyolar@gmail.com

Saludos

former_member203638
Active Contributor
0 Kudos

Felipe, ¿Aplicaría este método para cambiar el WhsCode de un Almacen con movimientos?

Saludos.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Alessandro, no es posible cambiar de ninguna manera actual, los códigos de los maestros que tienen movimientos, esto incluye:

Cuentas contables

Almacenes

Items

Socios de negocios

CCosto

Proyectos

y un largo etc.


Saludos

former_member203638
Active Contributor
0 Kudos

Muchas gracias.

Saludos.

former_member203638
Active Contributor
0 Kudos

Gracias Felipe, va a ser de utilidad.

Saludos.

Alessandro.

Former Member
0 Kudos

Hola Felipe:

Estoy intentando modificar una factura en un Campo definido por el usuario a nivel de líneas, y aparentemente no marca ningún error pero los datos no se actualizan. ¿Cuál puede ser mi error?. Este es mi código

String ErrorMessage = "";

int ErrorCode;

long RetCode = oCompany.Connect();

            

if (RetCode != 0)

{

          oCompany.GetLastError(out ErrorCode, out ErrorMessage);

          Console.WriteLine(ErrorCode.ToString() + " " + ErrorMessage);                

  }

else

{

   //Leer el DocEntry correspondiente al NumAtCard

   SqlCommand SqlCmd = new SqlCommand("Select DocEntry from OINV where NumAtCard='MTD0006222'", cn);

   cn.Open();

   Int32 DocEntry = Convert.ToInt32(SqlCmd.ExecuteScalar());

   cn.Close();


   Documents oInvoice = (SAPbobsCOM.Documents)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oInvoices);

   //Si se encuentra la factura

    if (oInvoice.GetByKey(DocEntry))

    {

          for (int i = 0; i < oInvoice.Lines.Count; i++)

          {

                   oInvoice.Lines.SetCurrentLine(i);

                   oInvoice.Lines.UserFields.Fields.Item("U_DetId").Value = i;

           }

          if (oInvoice.Update() != 0)

          {

                   oCompany.GetLastError(out ErrorCode, out ErrorMessage);

                   Console.WriteLine(ErrorCode.ToString() + " " + ErrorMessage);

          }

         else

         {

                  Console.WriteLine("Se Actualizo Factura");

          }

          oCompany.Disconnect();

          Console.WriteLine("Se Cerro Conexión");

     }

  }

Gracias de antemano.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimada Isabel, no puedes modificar campos de linea (nativos o de usuario) (ni por UI API ni por DI API) de documentos que generen asientos contables.

El código está bien.

Saludos

Former Member
0 Kudos

Felipe muchas gracias por tomarse el tiempo de atender mi duda. Utilizare una tabla de usuario para relacionarla con las lineas y poder modificar libremente los datos. Su respuesta me ha sido muy útil.

Former Member
0 Kudos

Me aparece el siguiente error al insertar el codigo: Un espacio de nombres no puede contener directamente miembros como campos o métodos. lo pegue inmediatamente después de

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            También lo pegue aquí, pero los errores aumentan

        }

    }

}

AQUÍ LO PEGUE

------------------------------------------------

Otra prueba que hice fue borrar todo y ponerlo en blanco pero el error persiste.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado Cristobal

Lo que pasa es que nuestra colega Isabel no colocó el codigo completo. Falta toda la conexion a la sociedad y la declaracion de variables.

Ademas debes importar las dll de SAP para que funcionen los objetos de negocios.

Cuando yo hize la prueba del codigo, tuve que reconstruir toda la estructura inicial para probarlo.

Atte.