jueves, 18 de enero de 2018

Crear clases java JPA de SQL SERVER.

1. Introducción

Tengo una BD antigua SQL Server 2000 y quiero generar algunas clases JPA para acceder a consulta etc.

Existe en Eclipse una ultilidad llamad JPATools. Se puede ejecutar si tu proyecto tiene la FACET de JPA.

Pero NO va bien en SQL Server versiones antiguas ya que no puede ver el SCHEMA "dbo" que es el esquema por omisión cuando no se crean eschemas. Busca un Catalog y como no hay ninguno creado no muestra nada

Para ello recurrimos a NETBEANS.

2. Proceso

1. Descargar un jar antiguo que pueda manejar esta información como sqljdbc-1.2.0.jar desde Java2s , también se puede utilizar el jtds . Vamos a utilizar ahora jtds.


2. En la pestaña de services arriba a la izquierda (si no está se debe incorporar mediante el menú superior Windows, en DataBases , boton derecho New Connection

Y seleccionamos justo lo que hay en pantalla



3. crear la conexion a SQL Server seleccionando url del servidor, puerto 1433, usuario, contraseña, base de datos y schema "dbo". Probar la conexión con Test Connection y verificar que no hay problemas.



3. Crear un proyecto java, crear un package y en boton derecho sobre el package hacer New Entity From Database, se busca la conexión creada anteriormente , y se seleccionan las tablas. Y voila!!!



Ojo hay que tener creadas primary key!!

=======================================================================
ANEXO (Crear la conexión (TOTALMENTE INUTIL)


1. SQL Server 2000


a. Descargar el fichero sqljdbc-1.2.0.jar desde Java2s



b. Crear una nueva connexion tipo SQL Sever


c. Indicar other driver y buscar el jar en la carpeta de descarga. Se busca el driver desde el primer símbolo que hay des. Ojo estas propiedades de URL etc se definen en el paso d.






Indicar estas propiedades




3. Posibles problemas

Si por algún motivo, en vez de crear restricciones "primary key" en una tabla se ha creado "unique" o "unique index", hay que crear la restricción "primary key" sinó, Netbeans se opnone a crear las clases JPA de dicha tabla, para ello se puede crear. Veamos como de golpe las creamos en 9 tablas, y solucionamos el problema

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
ALTER TABLE RRRR01 ADD CONSTRAINT RRRR01_pk PRIMARY KEY (rr01nume);
ALTER TABLE RRRR02 ADD CONSTRAINT RRRR02_pk PRIMARY KEY (rr02nume);
ALTER TABLE RRRR03 ADD CONSTRAINT RRRR03_pk PRIMARY KEY (rr03nume);
ALTER TABLE RRRR04 ADD CONSTRAINT RRRR04_pk PRIMARY KEY (rr04nume);
ALTER TABLE RRRR05 ADD CONSTRAINT RRRR05_pk PRIMARY KEY (rr05nume);

ALTER TABLE RRRR06 ADD CONSTRAINT RRRR06_pk PRIMARY KEY (rr06nume);
ALTER TABLE RRRR98 ADD CONSTRAINT RRRR98_pk PRIMARY KEY (rr98nume);
ALTER TABLE RRRR99 ADD CONSTRAINT RRRR99_pk PRIMARY KEY (rr99nume);
ALTER TABLE RRRR00 ADD CONSTRAINT RRRR00_pk PRIMARY KEY (rr00nume);


lunes, 15 de enero de 2018

Informática Jurasica (II). Ejecutar comandos MSDOS desde VB6

Saludos,

He tenido muchos problemas con mis antiguas aplicaciones VB6. Uno de los mayores problemas era ejecutar una aplicacion o fichero de comandos ".bat".

Parece ser tal y como  dice C0ding que hay que dar estos pasos:

1. En referencias del proyecto VB6.0 hay que marcar "Microsoft Script Host Object Model"
2. Crear un fichero con extensión ".bat" por ejemplo "provaVB60.bat" en "E:\CONF\KK\" como por ejemplo:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@echo off 
title Hacer media de dos numeros 
echo "El primer parametro es " %1
echo "El segundo parametro es " %2
set/p num1=Cual es el primer numero? 
set/p num2=Cual es el segundo numero? 
set/a media= (%num1% + %num2%) / 2 
echo. 
echo La media es %media% 
java -version
pause >nul 
exit 

Aquí evaluamos si hay 2 parámetros de entrada, pedimos 2 números, sacamos media y tabién probamos a ejecutar java para ver que versión tenemos instalada. Pues parece ser que funciona.

3. Creamos una pantalla y con un boton y el código VB de la pantalla es:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Dim wshThisShell As WshShell
Dim lngRet As Long
Dim strShellCommand As String
Dim strBatchPath As String

Sub EjecutarComando()
  Set wshThisShell = New WshShell
  strBatchPath = "E:\CONF\KK\provaVB6.bat" & """" & " hola guapo" & """"
  strShellCommand = """" & strBatchPath & """"
  lngRet = wshThisShell.Run(strShellCommand, vbNormalFocus, vbTrue)
End Sub

Private Sub Command1_Click()
  Call EjecutarComando
End Sub

En la línea 8 aparece como se llama con parámetros, en este caso hemo colocado también 2 parámetros. Observar que los parámatros se han colocada entre comillas dobles y que el espacio en  blanco es la separación entre parámetros. En este caso detecta 2 parámetros hola y guapo.




lunes, 8 de enero de 2018

Crontab en Ubuntu

Ahora que ya sabemos:

  • crear un jar en Maven
  • localizar recursos dentro de la carpeta donde se encuentra el jar
Podemos realizar un crontab en Ubuntu para que se pueda ejecutar un proceso cada cierto tiempo.


1. Ver los procesos que tenemos programados

crontab -l

Se puede ejecutar como sudo para ver si el administrador ha programado algo. Se ejecuta desde la consola.

2. Editar / crear procesos


crontab -e

Con ello nos pide un editor por omisión, que será mejor utilizar el nano.

Pero con el nano podemos tener algún problemilla si lo utilizamos poco. Por tanto es conveniente copiar le contenido que nos muestra la consola y ejecutamos gedit que es mas fácil y cuando hayamos terminado, copiamos a nano lo que hemos hecho. Con Mayúscula Control o guardamos. Si no queremos guardar Mayúscula Control x.

3. Formato del fichero

Normalmente hay 5 campos para definir fecha y hora (separados por un espacio en blanco) junto con el comando a ejecutar. en concreto los cinco campos de tiempo son:
  • minuto
  • hora
  • día del mes
  • mes
  • dia de la semana
Si hay algún campo que no nos sirve se coloca un asterisco "*".

Se puede colocar un signo menos para indicar un intervalo. Por ejemplo "1-5" en primer campo indica que se repite el comando cada minuto pero solo entre en primer y quito minuto. Si ese mismo valor lo colocamos en día de la semana indica que se ejecutaría de lunes a viernes.

En nuestro caso concreto queremos ejecutar un jar cuya ubicación absoluta es: /home/ximo/misjars/jar01.jar 

Pero queremos ejecutarlo con java 9 y nosotros tenemos por omisión java 8. Para ello tenemos que darle la ruta absoluta del ejecutable de java 9 que en mi caso es:

/usr/lib/jvm/java-9-oracle/bin/java

Si queremos ejecutar el jar de lunes a viernes todas las horas desde las 8 hasta las 16 horas quedaría:



00 08-16 * * 1-5 /usr/lib/jvm/java-9-oracle/bin/java -jar /home/ximo/misjars/jar01.jar


Si queremos ejecutar el jar cada 10 minutos de lunes a viernes todas las horas desde las 8 hasta las 16 horas quedaría: (ver The Geek Stuff).


*/10
00 08-16 * * 1-5 /usr/lib/jvm/java-9-oracle/bin/java -jar /home/ximo/misjars/jar01.jar

Java: Localizar la carpeta que incluye a un proyecto java o a un jar

Lo que voy a decir es un pequeño resumen de lo que se ha comentado en StackOverflow.


Primeramente veamos algunas de las posibilidades manejadas:

1. System.getProperty("user.dir")

En este caso nos indica el directorio donde estamos ahora. Poe ejemplo si estamos en /home/ximo y ejecutamos en la consola : java -jar ./misAplicaciones/aplicacion01.jar , el resultado será /home/ximo y no donde está la aplicación. Por tanto puede ser problemático.


2.  System.getProperty("java.class.path")

Aquí nos indica cada una de las rutas para localizar los jars utilizados. Por tanto a bote pronto, creo que no nos puede servir mucho.

3. La mayor parte de las opciones parten de localizar una clase, y a partir de esta localización ya se busca lo que se quiere. Para obtener la clase desde un método no estático basta con:

    this.getClass()

Pero si estamos en un método estático , las soluciones aportadas en StackOverflow son:


  • MyClass.class(): Permite refactorización, es la más rápida pero no funciona con copia y pega entre 2 clases.
  • MethodHandles.lookup().lookupClass(): Desde Java 7. Parece ser la mejor alternativa, ya que aunque no es tan rápida como la anterior, si permite copia y pega. A continuación ser detallan otras alternativas (para obtener el nombre de la clases) pero su rendimiento puede dar mucho que desear:
  • new Object() { }.getClass().getEnclosingClass().getName();
  • Thread.currentThread().getStackTrace()[1].getClassName();
  • System.getSecurityManager().getClassContext()[0].getName();


4. Si estamos en un jar, se puede obtener la carpeta que contiene el jar, a partir de nuestra clase de esta forma:

   CodeSource codeSource = aClass.getProtectionDomain().getCodeSource();
    File jarFile;
    jarFile = new File(codeSource.getLocation().toURI());
    String s=jarFile.getParentFile().getAbsolutePath();

5. Si estamos en un proyecto MAVEN y ejecutamos un main dentro de Eclipse, hay que tener en cuenta que las clase se guardan en el directorio target y por tanto para obtener la carpeta que incluye a la carpeta que es nuestro proyecto, tenemos que subir 2 veces en el árbol de directorios:

    String path = aClass.getResource(aClass.getSimpleName() + ".class").getPath();
    String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!"));
    jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8");
    jarFile = new File(jarFilePath);
    String s=jarFile.getParentFile().getAbsolutePath();
    if (s.endsWith(File.separator+"target")) { // Maven target directory for 
                                               // compiled classes
s=s.substring(0, s.lastIndexOf(File.separator));
s=s.substring(0, s.lastIndexOf(File.separator));
    }

Finalmente si creamos una clase de utilidades nos queda:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package ximodante.utils;

import java.io.File;
import java.lang.invoke.MethodHandles;
import java.net.URLDecoder;
import java.security.CodeSource;

public class FileUtils {

 /**
  * Folder that contains jar file or folder that contains project folder
  * @return
  * @throws Exception
  */
 public static String getJarContainingFolder() throws Exception {
  Class<?> aClass=MethodHandles.lookup().lookupClass();
  CodeSource codeSource = aClass.getProtectionDomain().getCodeSource();

  File jarFile;

  if (codeSource.getLocation() != null) {
   jarFile = new File(codeSource.getLocation().toURI());
  } else { // It is not a Jar file 
   String path = aClass.getResource(aClass.getSimpleName() + ".class").getPath();
      String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!"));
      jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8");
      jarFile = new File(jarFilePath);
  }
  String s=jarFile.getParentFile().getAbsolutePath();
  System.out.println("S------>:" + s);
  if (s.endsWith(File.separator+"target")) { // Maven target directory for compiled classes
   s=s.substring(0, s.lastIndexOf(File.separator));
   s=s.substring(0, s.lastIndexOf(File.separator));
  } 
  return s;
 }
 
 /**
  * test in main class
  * @param args
  */
 public static void main(String[] args) {
  try {
   System.out.println(getJarContainingFolder());
   System.out.println(System.getProperty("java.class.path"));
   System.out.println(System.getProperty("user.dir"));
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

}