CODEX

5 consejos b√°sicos de desarrollo sobre el SDK de SAP Business One

Esenciales para todo aquel que esté empezando

Probablemente estos consejos ya los teng√°is en cuenta o no os hagan falta, pero en mi caso me hubiera gustado tenerlos asimilados al empezar a desarrollar.

1 Usar las herramientas disponibles en la DI API para modificar el contenido y/o el esquema de la base de datos.

Esto m√°s que un consejo, se trata de una ‚Äúley‚ÄĚ, puesto que como todos sabemos es una condici√≥n indispensable para que nuestros clientes no pierdan el soporte de SAP. Usando la DI API, tanto sus objetos de negocio como el objeto Recordset, debemos ser capaces de actualizar y leer la informaci√≥n de las tablas est√°ndar y de nuestras propias tablas (UDTs) o nuestros campos (UDFs).

2 Dejar un log ‚Äúclaro‚ÄĚ de los errores que se suceden en nuestro addon.

A la hora de corregir los errores que surgen a un usuario de nuestro addon, es de mucha ayuda el contar con una tabla UDT (por ejemplo) a la que podamos acceder para comprobar el estado de la pila de llamadas del addon en el momento de la excepción.

3 Usar siempre bloques try catch finally.

Debemos tratar de ‚Äúblindar‚ÄĚ nuestro c√≥digo mediante el uso de bloques ‚Äútry catch finally‚ÄĚ, con el objetivo de que no se produzcan excepciones no controladas que provoquen la interrupci√≥n y desconexi√≥n de nuestro addon sin dar informaci√≥n al usuario.

Esta captura de excepciones es especialmente sensible a la hora de introducir datos, ya sea a través de la interfaz de usuario o a través de interfaces con otros sistemas.

4 Liberar los objetos COM cuando hayamos terminados de usarlos.

Supongamos que necesitamos usar un Recordset para ejecutar una determinada consuta. En el momento en que hayamos ejecutado dicha consulta y extraído la información necesaria, debemos liberar nuestro Recordset, haya o no ocurrido una excepción:

Recordset rs = null;
try{
  rs = kernel.Company.GetBusinessObject(BoObjectTypes.BoRecordset) as   Recordset;
  rs.DoQuery("SELECT ...");
if (rs.RecordCount > 0)
//Procesar la información del recordset
} catch (Exception ex) {
//Procesar la excepción y dejar log del error
} finally {
  if (rs != null) //Liberamos el Recordset haya habido o no excepción
  System.Runtime.Interop.Marshall.ReleaseComObject(rs);
}

5 Congelar y DESCONGELAR los formularios propios durante los momentos de refresco de la información.

Hay que tener en cuenta que si se produce una excepción durante el proceso también debemos descongelar nuestro formulario. Algo así podría valer:

Form oForm = null;
try
{
oForm = kernel.Application.Forms.ActiveForm;
oForm.Freeze(true);
//Trabajar con oForm para (por ejemplo)
//cargar información desde la base de datos
}
catch (Exception ex)
{
//Procesar la excepción y dejar log del error
}
finally
{
if (oForm != null) //Descongelamos el formulario haya habido o no excepción
oForm.Freeze(false);
}

¬ŅConsumir un Web Service NuSOAP en Android?

Primero debemos agregar el permiso:

<uses-permission android:name="android.permission.INTERNET" />

Para nuestro caso vamos ha llamar a la clase ClientesWS, la cual va a ejecutar la función saludar (de nuestro Web Service) con un parámetro (nombre) y recibirá una respuesta:

import java.io.IOException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
 
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
 
public class ClienteWS extends AsyncTask<String, Integer, String> {
 
    private Context context;
     
    private static final String SOAP_ACTION = "SaludoXMLwsdl#Saludar";
    private static final String OPERATION_NAME = "Saludar";
    private static final String WSDL_TARGET_NAMESPACE = "SaludoXMLwsdl";
    public static final String SOAP_ADDRESS = "http://midominio.com/path/to/servicio.php";
 
    public ClienteWS(Context context) {
        this.context = context;
    }
 
    @Override
    protected String doInBackground(String... params) {
 
        String result = null;
 
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);
 
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER10);
 
        // Con esta opción indicamos que el web service no es .net
        envelope.dotNet = false;
 
        envelope.setOutputSoapObject(request);
 
        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
         
        // Enviando un par√°metro al web service
        request.addProperty("nombre", params[0]);
 
        try {
             
            // Enviando la petición al web service
            httpTransport.call(SOAP_ACTION, envelope);
 
            // Recibiendo una respuesta del web service
            SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope
                    .getResponse();
 
            result = resultsRequestSOAP.toString();
 
            httpTransport.getServiceConnection().disconnect();
        } catch (IOException | XmlPullParserException e) {
            Log.v("Error", e.getMessage());
            result = e.getMessage();
        }
 
        return result;
    }
 
    @Override
    protected void onPostExecute(String result) {
        // Mostramos la respuesta del web service
        Toast.makeText(context, result, Toast.LENGTH_LONG).show();
    }
 
}

Luego para probar este cliente solamente tenemos que ejecutar el siguiente código en nuestra Activity:

new ClienteWS(this).execute("ProgramaciónExtrema.com");

Espero que sea de ayuda. Ante cualquier problema no duden en dejar un comentario.

Configura la hora en Windows Server 2016

Para hacer esto tenemos 2 metodos que podemos aplicar

Configuracion automatica del servicio de Hora de Windows

Esto corrige el problema en forma automatica, solo hay que darle clic y descargar el EasyFix de Microsoft

Lo descargars y ejecutas.

Configuracion manual del servicio de Hora de Windows

Para configurar un Controlador de Dominio principal solo tenemos que cambiar en el regedit y forzar a que se actualize la hora, para esto hacemos los siguiente:

  1. Ejecuta el regedit
  2. Luego tiene que ubicar la siguiente clave
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\AnnounceFlags
    
  3. En el panel derecho hacer click-derecho en AnnounceFlags y seleciona Modificar
  4. En el editor selecciona el valor DWORD, y digita A en la caja de texto, y luego click OK
  5. Cerrar el regedit
  6. En el ventana de comandos prompt, digita el siguiente comando para reiniciar el servicio
    net stop w32time && net start w32time
    

Fuente:
https://support.microsoft.com

Directiva de Seguridad Local (no se puede modificar)

Instando Windows Server 2012 Standard y cuando quiero quitar de las Directivas de Seguridad Local\Directivas de cuenta\Directiva de contrase√Īas\La contrase√Īa debe cumplir los requisitos de complejidad (Habilitada); me aparece deshabilitada esta opcion, como que no puedo quitarla. Antes en el WS2008 pod√≠a modificarlo sin problemas, aqui les dejo un Tip’s.

 USE Master
GO
ALTER LOGIN myUser WITH PASSWORD = 'myPassword'
GO
ALTER LOGIN myUser WITH
      CHECK_POLICY = OFF,
      CHECK_EXPIRATION = OFF;

Configurar una IP statica en Centos 7

En el caso de CentOS el archivo de configuracion se encuentar en la carpeta /etc/sysconfig/network-script/ y luego se tiene que modificar la interface que nos indica el ipconfig, en nuestro caso tenemos que modificar el archivo

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
Contenido ORIGINAL

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=8fcae283-8f5c-417c-9d9d-683b82bcb451
DEVICE=eth0
ONBOOT=no
Los datos a modificar son:

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=8fcae283-8f5c-417c-9d9d-683b82bcb451
DEVICE=eth0
ONBOOT=yes
#Ahora aqui agregamos la demas informacion
ONBOOT="yes"
IPADDR="192.168.111.152"
NETMASK="255.255.255.0"
GATEWAY="192.168.111.255"
DNS1="8.8.8.8"

Luego de esto reiniciamos los servicios.

systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl restart network
chkconfig network on

Desinstalando Zimbra

Una manera mas sencilla es:

./install.sh -u

Y tambien no olvidar

rm -rf /opt/zimbra
rm -rf /var/log/*zimbra*
rm -rf /tmp/*zimbra*
rm -rf /tmp/hsperfdata*
rm -rf /tmp/install.*
rm -rf /tmp/*swatch*
rm -rf /tmp/log*

userdel zimbra
userdel postfix
groupdel zimbra
groupdel postfix

La entidad de seguridad de base de datos posee esquemas en la base de datos. No se puede quitar.

Descripción del problema: Cuando ha intentado colocar un usuario, tienes este mensaje:

Error: 15138 La entidad de seguridad de base de datos posee esquemas en la base de datos. No se puede quitar.

Causa: Eso significa, que está intentando eliminar un usuario de poseer un esquema. Con el fin de colocar el usuario, tienes para encontrar el esquema que se ha asignado y a continuación, transferir la propiedad a un otro usuario o para quitarlo.

Resolución: Usted puede corregir el problema después de dos maneras.

Secuencia de comandos: Puede averiguar qué esquema es propiedad de este usuario con la consulta siguiente:

SELECT name FROM  sys.schemas WHERE principal_id = USER_ID(‚ÄėmyUser‚Äô)

A continuación, utilice los nombres que se encuentra desde la anterior consulta a continuación en lugar de la SchemaName a continuación. Y eliminar su usuario.

   
ALTER AUTHORIZATION ON SCHEMA::SchemaName TO dbo 
GO
DROP USER myUser

Con Management Studio:

  • Explorador de objetos >> Expanda el [databasename] >> Seguridad.
  • Haga clic en Esquemas.
  • En la ventana de resumen, determinar que son propiedad de Schema(s) por el usuario y puede cambiar el propietario o quitar el Scheme(s).
  • Si son esquemas de sistema, sugiero a cambiarlos a ‚Äėdbo‚Äô.
  • Quite el usuario.

M√°s detalles acerca de los esquemas en el BOL:
http://msdn2.microsoft.com/es-es/library/ms190387.aspx

Cambiar Unity a Gnome3 en ubuntu 16.04

Para esto sencillamente removemos los siguientes paquetes

sudo apt-get remove --purge unity
sudo apt-get remove --purge gnome-shell
sudo apt-get remove --purge lightdm
sudo apt-get autoremove
sudo reboot

Ahora instamos gnome 3

sudo add-apt-repository ppa:gnome3-team/gnome3
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install gnome3-session
sudo apt-get install gnome-shell

O tambien se puede usar solo el comando

sudo apt-get install gnome-panel