Java Expert....Java/Open Source Addict

Redes Sociales

twitterlinkedinrss feedemail youtube

Mostrando entradas con la etiqueta bdd. Mostrar todas las entradas
Mostrando entradas con la etiqueta bdd. Mostrar todas las entradas

martes, 24 de octubre de 2023

Habilitar acceso remoto a Postgres


 Estimados amig@s, en esta oportunidad les quiero compartir como habilitar el acceso remoto a Postgres, para lo cual utilizaré el siguiente escenario.

Máquina desde donde se accede: MacOS

Máquina donde está instalado Postgres: Ubuntu 20

Para poder habilitar el acceso remoto con superusuario realizar  lo siguiente:

1. Ubicarse en el directorio donde se instaló Postgres en Linux, que generalmente es la siguiente ubicación /etc/postgresql/<version_bdd>/main; donde <version_bdd> equivale a la versión que se haya instalado de postgres. Para mi ejemplo tomando en cuenta que tengo la versión 14, quedaría el directorio de la siguiente manera /etc/postgresql/14/main

 


2. Dentro del directorio de postgres proceder a editar el archivo postgresql.conf, en el cual se debe activar el acceso a todas las máquinas de la red modificando la variable listen_address con el valor de *, tal como se muestra a continuación.


3. Posterior a esto se debe actualizar el archivo pg_hba.conf incluyendo una instrucción para que se puedan conectar a la base de datos desde cualquier dirección IP.

 


4. Luego se debe proceder a reiniciar los servicios de postgres utilizando el siguiente comando service postgresql restart


5. Se debe abrir el puerto 5432, agregando la regla en el firewall. Para lo cual se debe ejecutar el siguiente comando ufw allow 5432 y posterior recargar el firewall con el comando ufw reload. Posterior a esto continuación verificar que la regla se haya añadido a través del comando ufw status verbose


6.  Finalmente, se debe validar el acceso remoto (MacOS), ejecutando en primera instancia el comando telnet <numero_ip_bdd> 5432 para verificar que el puerto esté disponible y posterior establecer la conexión con la base de datos utilizando algún IDE. En este caso se utilizó Dbeaver.






lunes, 3 de junio de 2019

Creación Cuenta Talend Cloud


Estimad@s amig@s en esta oportunidad voy a mostrarles como crear una cuenta en Talend Cloud que permitirá generar tareas de integración desde la nube. Para lo cual se debe realizar lo siguiente:

1.- Dirigirse a la página Talend Cloud y seleccionar cuenta gratuita (disponible durante 14 días), la cual redireccionará a otra página para el proceso de registro como se aprecia en la figura a continuación.


2.- Ingresar una cuenta de correo, validar que se trate de una persona en el check I'm not robot y presionar el botón Start Your Trial, con lo que se enviará un correo con un hipervínculo donde se deberá completar el registro del usuario.





3.- Registrar todos los valores para completar el registro y presionar el botón Complete Registration.

4.- Finalmente una vez realizado estos pasos se presentará la pantalla principal de Talend Cloud donde se podrá comenzar a trabajar en las tareas de integración, la cual se muestra a continuación.



Espero les sirve de mucho, no olviden cualquier comentario, sugerencia pueden realizarla aquí

miércoles, 8 de mayo de 2019

Conectarse a Oracle Cloud desde SQL Developer


Estimad@s amig@s en esta oportunidad quiero mostrarles como realizar la conexión a una base de datos creada en Oracle Cloud a través del SQL Developer, para lo cual se tiene que realizar lo siguiente:

1.-  Seleccionar la opción Procesamiento de Transacciones Autónomo  en la sección de Base de Datos, a lo que aparecerá todas las bases de datos que se tienen creadas y seleccionar la base de datos a la cual se quiere conectar.





2.- Seleccionar la opción Conexión de Base de Datos, a lo que aparecerá una pantalla solicitándo se descarga las credenciales de cartera y las cadenas de conexión a utlizar según las necesidades de operación y rendimiento.



3.- Presionar el botón Descargar de la sección Descargar credenciales de cliente (cartera) y escribir una contraseña en la ventana que aparecer, la cual será utilizada conjuntamente con este archivo para establecer la conexión a la base de datos a través del SQL Developer. Una vez realizado esto se procederá a descargar una archivo .zip con toda la configuración de credenciales.



4.- Abrir un SQL Developer (Se debe previamente haber instalado el SQL Developer, el cual pueden descargarlo de este enlace) y crear una nueva conexión de base de datos en la cual se va a configurar de la siguiente manera:
  • Usuario: Se debe colocar el valor de admin, el cual es el usuario por defecto que se crea en el Oracle Cloud.
  • Contraseña: En contraseña se debe colocar la contraseña que se configuró en el paso anterior.
  • Tipo de Conexión: Seleccionar la opción Cartera de Cloud.
  • Archivo de Configuración: Cargar el archivo Wallet_Facturacion.zip configurado en el paso anterior.
  • Servicio: Seleccionar el servicio según sus necesidades, para el ejemplo he seleccionado facturacion_medium
 



5.- Finalmente una vez realizado esto, se podrá apreciar la conexión a la base de datos del cloud con todos sus elementos como se aprecia en la figura a continuación.



Crear una base de datos transaccional en Oracle Cloud


Estimad@s amig@s en este post vamos a revisar como crear una base de datos en el Oracle Cloud, para lo cual se tiene que realizar lo siguiente.

1.- Una vez conectado a su cuenta de Oracle Cloud, si no la tienen pueden revisar el post Creando Cuenta Oracle Cloud,  seleccionar la opción Procesamiento de Transacciones Autónomo



2.-  Una vez seleccionada la opción aparecerá un conjunto de secciones que se deberá llenar, entre esas lo primero que se deberá elegir será el tipo de base de datos a trabajar. En la cual se tiene una base de datos datawarehouse o transaccional, elegiremos la opción AUTONOMOUS TRANSACTION PROCESSING.



3.- Ingresaremos la información reelevante de nuestra base de datos a crear, en la cual seleccionaremos en la opción compartimiento Raiz utilizado para cuentas free, modificaremos el nombre de la base de datos. Se puede modificar el número de cpus y espacio de almacenamiento. Sin embargo los valores por defecto están bien para comenzar.


4.-  Posterior a esto ingresaremos las credenciales de Administrador, necesarias para conectarnos a la base de datos.



5.-  Seleccionamos el tipo de licencia por defecto e ingresamos una etiqueta que permitirá  organizar nuestros recursos de manera ágil.



6.- Una vez realizado los pasos descritos anteriormente se debe presionar el botón Crear Base de datos autónoma con lo cual se procederá a provisionar la base de datos en el Cloud y una vez lista estára disponible para utilizarle.







Creando Cuenta Oracle Cloud


Estimad@s amig@s les quiero compartir como crear una cuenta en Oracle Cloud para que pueden probar los diferentes servicios que ofrecen, entre uno de ellos tener una base de datos en la nube para el manejo de sus aplicaciones. Para lo cual se tiene que realizar lo siguiente.

1.- Dirigirse a la página de Oracle Cloud y presionar el icono Try for Fre.


2.- Proceder a crear una cuenta ingresando un correo electrónico válida, el país donde se reside y presionando el botón NEXT para aceptar los términos de uso.



3.-  Posterior a esto se debe ingresar el tipo de cuenta el cual será de Personal Use, el nombre de la cuenta que es un alias para representar su espacio en la nube, su ubicación más cercana, sus datos personales como Nombre, Apellido, Dirección y el número telefónico con el código de área que es muy importante ya que se enviará un código para verificar su cuenta.


 

Una vez llenada la información presionar el botón Next Verify Mobile Number a lo cual aparecerá un popup  mostrando la dirección ingresada añadido el número de código postal el cual podrá editarse en ese momento o posteriormente, luego de esto presionar el botón Use Validated  a lo que aparecerá una pantalla para ingresar el código enviado al número de celular ingresado.







En el caso de que el código no se enviado después de algunos intentos, se puede comunicarse con el Chat Support y solicitar un código, lo cual puede suceder por su operadora telefónica. En mi caso en particular tengo CNT y tuve ese problema. 

4.- Posteriormente a esto el siguiente paso es ingresar el mecanismo de pago utilizando una tarjeta de crédito el cual solo se efectuará si nosotros deseamos actualizar el plan gratuito que nos brinda Oracle Cloud.


Una vez ingresado los valores se verificará los mismos y se realizará un cobro de un 1 dólar a su tarjeta. Finalmente para la creación de la cuenta se debe aceptar los términos y condiciones y presionar el botón Complete Sign-Up.




5.- El proceso de creación de la cuenta durará en activarse alrededor de 5 a 15 minutos, a lo cual se les enviará un correo electrónico con los detalles de su cuenta como el nombre del usuario que es su correo electrónico y una clave temporal, la cual deberán cambiar una vez que se autentifiquen por primera vez.


6. Una vez logeado se podrá comenzar a utilizar los diferentes servicios que nos brinda el Oracle Cloud para lo cual se tiene $300 dólares de créditos y 30 dìas disponibles para efectuar las pruebas.







jueves, 18 de febrero de 2016

Composite id with FK – JPA


Muchas veces se necesite crear una clave primaria utilizando más de una columna ya sea que ésta este formado por dos columnas simples o que una de ellas represente un FK de otra tabla. Para representar esto en JPA utilizaremos el siguiente ejemplo relacional.

En este caso la tabla Mat_Tarea tiene dos PK y una de ellas es FK de la tabla Mat_Proyecto; para realizar el respectivo mapeo en JPA se debe realizar lo siguiente:
  • Crear los EntityBean para cada tabla

  • Proyecto [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; import java.util.Date; import java.util.Set; /** * The persistent class for the Mat_Proyecto database table. * */ @Entity @Table(name="Mat_Proyecto") public class Proyecto implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int idProy; private String desProy; @Temporal( TemporalType.TIMESTAMP) private Date fecFinProy; @Temporal( TemporalType.TIMESTAMP) private Date fecIniProy; private String nomProy; //bi-directional many-to-one association to Tarea @OneToMany(mappedBy="matProyecto") private Set<Tarea> matTareas; public Proyecto() { } public int getIdProy() { return this.idProy; } public void setIdProy(int idProy) { this.idProy = idProy; } public String getDesProy() { return this.desProy; } public void setDesProy(String desProy) { this.desProy = desProy; } public Date getFecFinProy() { return this.fecFinProy; } public void setFecFinProy(Date fecFinProy) { this.fecFinProy = fecFinProy; } public Date getFecIniProy() { return this.fecIniProy; } public void setFecIniProy(Date fecIniProy) { this.fecIniProy = fecIniProy; } public String getNomProy() { return this.nomProy; } public void setNomProy(String nomProy) { this.nomProy = nomProy; } public Set<Tarea> getMatTareas() { return this.matTareas; } public void setMatTareas(Set<Tarea> matTareas) { this.matTareas = matTareas; } } [/code] Tarea [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; import java.util.Date; import java.util.Set; /** * The persistent class for the Mat_Tarea database table. * */ @Entity @Table(name="Mat_Tarea") public class Tarea implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId private TareaPK id; @Temporal( TemporalType.TIMESTAMP) private Date fechaFinTar; @Temporal( TemporalType.TIMESTAMP) private Date fechaIniTar; private String nomTarea; //bi-directional many-to-one association to Proyecto @ManyToOne @JoinColumn(name="idProy", insertable=false, updatable=false) private Proyecto matProyecto; public Tarea() { } public TareaPK getId() { return this.id; } public void setId(TareaPK id) { this.id = id; } public Date getFechaFinTar() { return this.fechaFinTar; } public void setFechaFinTar(Date fechaFinTar) { this.fechaFinTar = fechaFinTar; } public Date getFechaIniTar() { return this.fechaIniTar; } public void setFechaIniTar(Date fechaIniTar) { this.fechaIniTar = fechaIniTar; } public String getNomTarea() { return this.nomTarea; } public void setNomTarea(String nomTarea) { this.nomTarea = nomTarea; } public Proyecto getMatProyecto() { return this.matProyecto; } public void setMatProyecto(Proyecto matProyecto) { this.matProyecto = matProyecto; } } [/code]
  • Cuando se tiene más de una columna como PK se debe crear una clase por tabla donde se asocia todos los atributos que representan la PK y relacionarlo con la clase padre. En este caso se creará una clase llamada TareaPK como se muestra a continuación.
  • [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; /** * The primary key class for the Mat_Tarea database table. * */ @Embeddable public class TareaPK implements Serializable { //default serial version id, required for serializable classes. private static final long serialVersionUID = 1L; private int idTarea; private int idProy; public TareaPK() { } public int getIdTarea() { return this.idTarea; } public void setIdTarea(int idTarea) { this.idTarea = idTarea; } public int getIdProy() { return this.idProy; } public void setIdProy(int idProy) { this.idProy = idProy; } public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof TareaPK)) { return false; } TareaPK castOther = (TareaPK)other; return (this.idTarea == castOther.idTarea) && (this.idProy == castOther.idProy); } public int hashCode() { final int prime = 31; int hash = 17; hash = hash * prime + this.idTarea; hash = hash * prime + this.idProy; return hash; } } [/code]
  • Como último paso se tiene que aumentar los atributos insertable=false y updatable=false en el mapeo de la relación existente en el POJO Tarea con Proyecto para realizar la dependencia.
  • [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; import java.util.Date; import java.util.Set; /** * The persistent class for the Mat_Tarea database table. * */ @Entity @Table(name="Mat_Tarea") public class Tarea implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId private TareaPK id; @Temporal( TemporalType.TIMESTAMP) private Date fechaFinTar; @Temporal( TemporalType.TIMESTAMP) private Date fechaIniTar; private String nomTarea; //bi-directional many-to-one association to Proyecto @ManyToOne @JoinColumn(name="idProy", insertable=false, updatable=false) private Proyecto matProyecto; ....... } [/code]
Saludos

CRUD Java Basico sin BDD


Estimad@s amig@s,

En este post se realizará un ejemplo básico de manejo de operaciones CRUD pero sin base de datos todo manejado a través de collections y bloques estáticos. La aplicación se utilizará es para manejar la compra de vehículos.El proyecto definirá la siguiente arquitectura:

  • Tres capas lógicas representadas en tres packages basados en un modelo MVC
  • Una clase llamada MemoriaBDD.java que representará nuestra BDD
Cada capa lógica o package tiene su ámbito basado en la siguiente especificación de patrón:
  •  El package modelo representará los objetos persistentes o tablas de la BDD .
  • El package controlador contendrá toda la lógica de negocio, en esta caso las operaciones CRUD y demás.
  • El package vista contendrá las interfaces o formularios que el usuario final llenará o interactuará, en este caso es una clase llamada Principal que recepta los datos desde consola.
 Comenzaré explicando la clase MemoriaBDD.java que se encuentra en el package modelo y que representa nuestra Base de Datos. A continuación se muestra la misma.

MemoriaBdd.java
[code] /** * Clase que representa la badse de Datos * @author martosfre * @see www.matoosfe.com */ public class MemoriaBDD { public static Set<vehiculo> vehiculos; public static Set<cliente> clientes; public static Set<factura> facturas; static{ //Inicilializar Facturas facturas = new HashSet<factura>(); //Inicializar Vehiculos vehiculos = new HashSet<vehiculo>(); Moto motoUno = new Moto("azul","PBB-987","QMC","2007", new BigDecimal(1567.45d)); Moto motoDos = new Moto("verde","PAL-747","HONDA","2010", new BigDecimal(1000.45d)); vehiculos.add(motoUno); vehiculos.add(motoDos); Trailer trailerUno = new Trailer("rojo","UBJ-098","MERCEDES BENZ","2005", new BigDecimal(144000)); Trailer trailerDos = new Trailer("azul","XJT-233","MERCEDES BENZ","2004", new BigDecimal(124000)); vehiculos.add(trailerUno); vehiculos.add(trailerDos); Buseta busUno = new Buseta("amarilla","GYT-9889","HYUNDAI","2002", new BigDecimal(75000)); Buseta busDos = new Buseta("amarilla","PKT-956","CHEVROLET","1999", new BigDecimal(55000)); vehiculos.add(busUno); vehiculos.add(busDos); //Inicializar clientes clientes = new HashSet<cliente>(); Cliente clienteUno = new Cliente("Vazquez", "Juan", "1111111189", "Las Casas", "098890988"); Cliente clienteDos = new Cliente("Sanchez", "Luis", "1234567890", "El Dorado", "097090988"); Cliente clienteTres = new Cliente("Prado", "Maria Fernanda", "222222220", "Carapungo", "2345659"); clientes.add(clienteUno); clientes.add(clienteDos); clientes.add(clienteTres); } } [/code]En esta clase se hizo uso de bloque estático que permite inicializar objetos o ejecutar procesos automáticos. Para este caso permitirá inicializar los objetos o “tablas” de nuestro BDD pero en memoria es decir luego de que la aplicación se cierre todas las operaciones o los nuevos registros (objetos colocados en cada collection adicional a los que ya se inicilizan) se perderán.
Ahora voy a explicar la lógica de negocio la cual será implementada en el package controlador en la clases AdminFactura.java, AdminVehiculo.java, AdminCliente.javalas cuales contendrán todas los métodos de negocio. A continuación se muestra las clases en cuestión. AdminCliente.java [code] package com.matoosfe.controlador; import com.matoosfe.modelo.Cliente; /** * Esta clase permitirá manejar toda la lógica de negocio relacionada con clientes * @author martosfre * @see www.matoosfe.com */ public class AdminCliente { /** * Método para guardar un cliente * @param cliente * @return */ public static String guardarCliente(Cliente cliente){ MemoriaBDD.clientes.add(cliente); return "Registro Guardado Satisfactoriamente"; } /** * Método para buscar un cliente por la cédula de identidad * @param cedIn * @return */ public static Cliente buscarClienteByCedula(String cedIn) { Cliente clienteDev = null; for(Cliente cli: MemoriaBDD.clientes){ if(cli.getCedula().equals(cedIn)){ clienteDev = cli; break; } } return clienteDev; } /** * Método para actualizar un cliente * @param cedIn * @param clienteAct * @return */ public static String actualizarCliente(String cedIn, Cliente clienteAct){ guardarCliente(clienteAct); return "Registro actualizado Satisfactoriamente"; } /** * Método para eliminar un cliente * @param cedIn * @return */ public static String eliminarCliente(String cedIn) { Cliente clienteOri = buscarClienteByCedula(cedIn); boolean confEli = MemoriaBDD.clientes.remove(clienteOri); if(confEli){ return "Registro eliminado Satisfactoriamente"; }else{ return "No se pudo eliminar el cliente"; } } } [/code] AdminVehiculo.java [code] package com.matoosfe.controlador; import com.matoosfe.modelo.Vehiculo; /** * * Esta clase permite manipular todas las operaciones relacionadas con Vehiculo * @author martosfre * @see www.matoosfe.com * Aug 18, 2010 */ public class AdminVehiculo { /** * Método para guardar un vehículo * @param vehiculoGen * @return */ public String guardarVehiculo(Vehiculo vehiculoGen){ MemoriaBDD.vehiculos.add(vehiculoGen); return "Registro Guardado Satisfactoriamente"; } /** * Método para buscar un vehículo de acuerdo a la placa y tipo * @param placa * @param tipo * @return */ public static Vehiculo buscarVehiculoPorPlaca(String placa) { Vehiculo vehDev = null; for (Vehiculo veh : MemoriaBDD.vehiculos) { if(veh.getPlaca().equals(placa)){ vehDev = veh; break; } } return vehDev; } } [/code] AdminFactura.java [code] package com.matoosfe.controlador; import java.util.ArrayList; import java.util.List; import com.matoosfe.modelo.Factura; /** * * Esta clase permitirá manejar todas las operaciones relacionadas con Factura * @author martosfre * @see www.matoosfe.com * Aug 18, 2010 */ public class AdminFactura { /** * Método para guardar una factura * @param factura * @return */ public static String guardarFactura(Factura factura){ MemoriaBDD.facturas.add(factura); return "Factura registrada Exitosamente"; } /** * Métodos para buscar facturas por cliente de acuerdo * a la cédula * @param cedCliente * @return */ public static List<factura> buscarFacturasPorCliente(String cedCliente){ List<factura> facturasCliente = new ArrayList<factura>(); for (Factura factura : MemoriaBDD.facturas) { if(factura.getCliente().getCedula().equals(cedCliente)){ facturasCliente.add(factura); } } return facturasCliente; } } [/code] En estas clases se puede apreciar que todas las operaciones CRUD están relacionadas directamente con la clase MemoriaBDD.java en sus atributos representados como collections que para este caso son las tablas de la base de datos. Por último se explicará la clase Formulario.java que se encuentra en el package vista que representa el formulario que será manipulado por el usuario final.
Formulario.java [code] package com.matoosfe.vista; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.matoosfe.controlador.AdminCliente; import com.matoosfe.controlador.AdminFactura; import com.matoosfe.controlador.AdminVehiculo; import com.matoosfe.modelo.Cliente; import com.matoosfe.modelo.DetalleFactura; import com.matoosfe.modelo.Factura; import com.matoosfe.modelo.Vehiculo; /** * * Esta clase representa el formulario de ingreso de la información * para la gestión de la compra de los vehículos * @author martosfre * @see www.matoosfe.com * Aug 18, 2010 */ public class Formulario { public void registrarFactura(){ //Recibo los datos del vehiculos que son los detalles, cliente BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ingrese el cliente que va a comprar:"); try { String cedIn = br.readLine(); Cliente cliente = AdminCliente.buscarClienteByCedula(cedIn); Factura facturaCompra = new Factura(); List<detallefactura> detallesFactura = new ArrayList<detallefactura>(); BigDecimal subtotal = new BigDecimal(0.0d); BigDecimal total = new BigDecimal(0.0d); System.out.println("\n*************DATOS VEHICULO************"); String placaVeh = "1"; //Registro los vehículos que se vayan a comprar while(!placaVeh.equals("0")){ System.out.print("Ingrese vehículo codigo:"); placaVeh = br.readLine(); //Buscamos al vehículo para registrarlo Vehiculo vehTmp = AdminVehiculo.buscarVehiculoPorPlaca(placaVeh); //Verificamos que si se encontró el vehiculo guardamos el detalle if(vehTmp != null){ //Ingresando cada detalle DetalleFactura detalleTmp = new DetalleFactura(); detalleTmp.setCantidad(1); detalleTmp.setFactura(facturaCompra); detalleTmp.setVehiculo(vehTmp); detalleTmp.setPrecio(vehTmp.getPrecio()); detallesFactura.add(detalleTmp); subtotal = subtotal.add(vehTmp.getPrecio()); } } //Añado detalles y calculo el IVA facturaCompra.setDetalles(detallesFactura); total = subtotal.add(subtotal.multiply(new BigDecimal(0.12d))); //Registro la factura siempre que haya minimo un detalle if(facturaCompra.getDetalles().size() &gt; 1){ facturaCompra.setCliente(cliente); facturaCompra.setFechaCompra(new Date()); facturaCompra.setNumeroFactura(String.valueOf(Math.random())); facturaCompra.setDetalles(detallesFactura); facturaCompra.setSubtotal(subtotal); facturaCompra.setTotal(total); } //Guardamos la factura AdminFactura.guardarFactura(facturaCompra); //Imprimir Registro Compra System.out.println("\n*************DATOS COMPRA************"); System.out.println("Cliente:" + cliente.getNombres() + " " + cliente.getApellidos()); for (Factura fac : AdminFactura.buscarFacturasPorCliente(cliente.getCedula())) { System.out.println("Factura:" + fac.getNumeroFactura()); System.out.println("Total Factura:" + fac.getTotal()); //Imprimir Vehiculos comprados for (DetalleFactura det : fac.getDetalles()) { System.out.println("Vehiculo Marca:" + det.getVehiculo().getMarca()); System.out.println("Vehiculo Modelo:" + det.getVehiculo().getModelo()); System.out.println("Vehiculo Placa:" + det.getVehiculo().getPlaca()); } } } catch (NumberFormatException e) { System.out.println("Error Formato"); e.printStackTrace(); } catch (IOException e) { System.out.println("Error Lectura"); e.printStackTrace(); } //Aqui ya tengo el cliente y todos los vehiculos que quiere comprar } public static void main(String[] args) { Formulario pr = new Formulario(); pr.registrarFactura(); } } [/code]
En esta clase se buscará al cliente que va a comprar el vehículo, luego se registrarán todos los vehículos que se comprarán como un ítem del detalle, asociando al final todos los detalles junto con el cliente a la factura que se guardará o procesará.&

Espero les sirve de mucho, no olviden comentar, compartir. Además les recordamos revisar y subscribirse al canal de Youtube. Saludos

miércoles, 6 de mayo de 2015

Error AbstractMethodError: com.microsoft.sqlserver.jdbc.SQLServerResultSet


Estimad@s amigos, que gusto volver a postear algo luego de tanto tiempo perdido.... lamento no hacerlo. Estuve preparándome para unos exámenes de certificación de java y android... pero ya estoy de vuelta.

En esta oportunidad quiero compartirles la solución a un error que se presentó el día de hoy al subir a producción un módulo de pre-facturación que realice para un cliente. El escenario fue el siguiente:

Problema:
Al subir una aplicación desarrollada en RichFaces 3.4 en un servidor de aplicación glassfish 3.1 que utiliza JEE 5.0 con los motores de base de datos sqlserver 2008 y postgres 9.1, todo estuvo correcta hasta que se genero un reporte que utiliza un procesamiento muy fuerte en primera instancia sobre SQLServer a nivel de JDBC para un tema batch. Generandome el siguiente error:

Error SQLServerResultSet Driver JDBC SQLServer V1.0
Solución:

La solución al problema fue cambiar el driver de SQLServer que se tenia configurado en el Pool de Conexión, el cual era el sqljdbc.jar que correspondía a la versión 1.0 por el driver sqljdbc4.jar correspondiente a la versión 4. Debido a que en el driver inicial no se tenia el método isClosed() del objeto ResultSet.