on 09-09-2011 1:02 PM
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
Felipe. Si quiero nullear el Folio como debería hacerlo?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Felipe, como anulo folios ya asignados en SAP B1 9.1, por error factura fue emitida 246 veces y necesito reutilizar folios...
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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;
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
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;
}
}
}
}
}
Mi mail es felipe.loyolar@gmail.com
Saludos
Gracias Felipe, va a ser de utilidad.
Saludos.
Alessandro.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
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.
User | Count |
---|---|
91 | |
7 | |
7 | |
4 | |
3 | |
3 | |
3 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.