Sage es un sistema de automatización de soluciones de gestión para pequeñas y medianas empresas. Se utiliza en sectores como la contabilidad, las nóminas, la fabricación, la distribución, las ventas, la educación y las finanzas. Sage cuenta con muchos productos de software que pueden clasificarse según el tamaño de la empresa, el sector y las necesidades del negocio. El software de Sage incluye soluciones de software financiero, sistemas CRM, soluciones de recursos humanos y sistemas ERP. Profundicemos en uno de ellos.
Evolución de Sage
Sage Evolution es un sistema ERP que ofrece una solución completa de gestión empresarial, da la oportunidad de controlar la situación financiera, así como las relaciones con los clientes, proveedores y empleados. Todos los componentes y módulos desarrollados como parte del marco de Sage Evolution están totalmente integrados y tienen una interfaz común.
Cómo se puede utilizar
Hemos utilizado Sage Evolution ERP cuando trabajábamos en un proyecto en el que teníamos que crear/editar pedidos de venta, clientes e inventarios, sincronizando Sage ERP con otro ERP. Sage Evolution sólo funciona en el sistema operativo Windows. Se utiliza MS SQL Server como DBMS. Y aunque se puede conectar directamente a la base de datos de Sage Evolution, es mejor interactuar a través del SDK de Sage Pastel, ya que es más conveniente y garantiza la integridad de los datos.
El SDK de Sage Evolution está empaquetado como un ensamblaje de Microsoft .NET y es la plataforma ideal para utilizar .NET Framework. Pero la integración a través de COM sólo es posible utilizando lenguajes como Visual Basic, C ++ y Delphi
Hemos utilizado el SDK de Sage para sincronizar los datos de clientes, productos, transacciones y almacenes de la empresa con otro sistema. Veamos cómo puede hacerlo exactamente.
Usando Sage SDK
Para empezar, asegúrese de que utiliza las mismas versiones de Sage SD K y Sage Evolution. Así, si utiliza Sage Evolution 7.00.210, entonces utilice Sage SDK 7.00.120.
Además, recuerde que necesita una licencia de desarrollador (número de serie y código de autorización) para utilizar Sage SDK
Ahora, cuando esté todo listo, pasemos a los ejemplos reales.
1. Conectar con la base de datos
En primer lugar, es necesario conectarse a la base de datos. Tenemos dos bases de datos: La base de datos Empresa/Cliente que contiene los datos relacionados con la empresa/cliente y la base de datos Común que contiene la información de registro. Nos conectamos en este orden:
1 2 3 4 5 | DatabaseContext.CreateCommonDBConnection(server, commonDatabase, String.Empty, String.Empty, true); DatabaseContext.SetLicense(serialNumber, authKey); DatabaseContext.CreateConnection(server, companyDatabase, login, password, true); |
A continuación, escribimos consultas a la base de datos para obtener las selecciones necesarias.
2. Clientes
Por ejemplo, aquí tenemos una solicitud para todos los clientes, en los que la fecha de creación / edición es más reciente que la fecha de actualización:
1 2 3 4 5 6 7 8 | string criteria = $"Client_dModifiedDate > '{updatedDate}'"; var customers = Customer.List(criteria); foreach (DataRow matchP in customers.Rows) { Customer customer = new Customer(matchP["Account"].ToString()); } |
Es mejor enviar la fecha en el formato aaaa-MM-dd HH: mm: ss.fff, para que no se produzca el error “SQL Server: datetime out of range error”.
Puede encontrar un cliente por código. Si no hay ningún cliente, el método devolverá null
Por ejemplo:
1 2 3 | Customer searchCustomer = Customer.GetByCode(code); |
También puede actualizar los campos del cliente:
1 2 3 4 5 6 7 | Customer customer = Customer.GetByCode(item.code); customer.Description = item.name; customer.Telephone = item.telephone; customer.IsOnHold = item.status; customer.Save(); |
3. Productos
Ahora sincronizamos el InventoryItem. El SDK de Sage tiene una Rama (Empresa) por defecto Global (BranchId = 0), pero puede haber otras Ramas.
Por ejemplo, podemos seleccionar productos para una Rama específica:
1 2 3 4 5 6 7 8 | var criteria = $"StkItem_iBranchID = {branchId}"; var inventories = InventoryItem.List(criteria); foreach (DataRow matchP in inventories.Rows) { InventoryItem inventory = new InventoryItem((Int32)matchP["StockLink"]); } |
Los productos tienen un precio/ y podemos obtener tanto los precios individuales (SellingPrice1, SellingPrice2 y SellingPrice3) como la colección SellingPrices. En términos de tiempo, obtener los precios de algunos productos puede llevar segundos o hasta 5-10 minutos.
Por ejemplo, obtener el precio del producto desde el almacén tiene el siguiente aspecto:
1 2 3 4 5 6 7 8 9 10 11 12 | SellingPriceCollection sellingPrices = inventory.SellingPrices; double sellingPrice = 0; foreach (SellingPrice sp in sellingPrices) { if (sp.Warehouse != null && sp.Warehouse.Code.Equals(defaultWarehouse)) { sellingPrice = sp.PriceIncl; break; } } |
4. Transacciones
Ahora sincronizamos el Pedido de Venta. A través del SDK de Sage, podemos recibir transacciones no procesadas, procesadas y archivadas.
Por ejemplo, obtenga SalesOrder procesado, DocState = 3 (PartiallyProcessed):
1 2 3 4 5 6 7 8 | var criteria = $"DocState = {3} ORDER BY Client_dModifiedDate"; var orders = SalesOrder.List(criteria); foreach (DataRow matchP in orders.Rows) { SalesOrder order = new SalesOrder((Int32)matchP["AutoIndex"]); } |
Obtenga las transacciones archivadas:
1 2 3 4 | var criteria = $"DocState = {4} ORDER BY Client_dModifiedDate"; var orders = SalesOrder.ListArchived(criteria); |
Buscar la transacción por número de pedido:
1 2 3 | var order = SalesOrder.List("ordernum = 'searchOrder'"); |
Al editar las transacciones, puede cambiar varios campos, como el número de pedido, el cliente y los detalles. Puede establecer el almacén de la siguiente manera:
1 2 3 4 5 6 7 8 9 | var order = new SalesOrder(id); order.Customer = Customer.GetByCode(customerCode); order.OrderNo = orderNumber; order.Detail[i].InventoryItem = inventory; order.Detail[i].Quantity = item.deals[i].sales_quantity; order.Detail[i].Warehouse = warehouse; order.Save(); |
5. Almacenes
Hemos utilizado InventoryTransaction para detectar cuántas piezas se han movido entre almacenes:
1 2 3 4 5 6 7 8 9 10 11 | var criteria = $"PostST_dModifiedDate > '{updatedDate}'"; var inventories = InventoryTransaction.List(criteria); foreach (DataRow matchP in inventories.Rows) { InventoryItem inventoryItem = new InventoryItem((Int32)matchP["AccountLink"]); Warehouse warehouse = new Warehouse((Int32)matchP["WarehouseID"]); WarehouseContext context = new WarehouseContext(inventoryItem, warehouse); double warehouseQuantity = context.QtyOnHand; } |
Entonces, ¿debería optar por el SDK de Sage?
Es más fácil utilizar Sage SDK que entender toda la base de datos con todas sus relaciones. Además, el uso de Sage SDK garantiza la integridad de los datos.
Pero aún así, el uso de Sage SDK da lugar a la escritura de consultas SQL no puras y campos que no coinciden con los campos de Sage SDK. Y eso implica que hay que obtener una lista de todos los campos para entender qué campos hay que seleccionar. Además, si alguien abrió un pedido para verlo en Sage UI, no puede cambiar este pedido por Sage SDK o Sage UI. Esto significa que no se puede trabajar en paralelo.
En definitiva, Sage SDK proporciona a los desarrolladores de terceros acceso a las entidades de la base de datos de Sage. También hay una documentación de Sage SDK. Por eso recomendamos utilizar Sage SDK para ahorrar tiempo y asegurar la integridad de los datos.