Hola,
Estoy intentado modificar una hoja excel utilizando la API JDOM. He conseguido poder modificarla sin problemas.
Pero cuando intento que al actualizarla acceda a una base de datos MS Access 2003 despues de hacer bastantes lecturas me da el siguiente error.
Error con conexion:java.sql.SQLException: [Microsoft][Controlador ODBC Microsoft Access] No se pueden abrir más tablas.
Mi hoja excel tiene unas 8000 lineas. Y por cada una de ellas debo acceder a la base de datos de 1 a 8 veces.
Tengo que decir que no se mucho de java. A base de leer por aqui y por alli he conseguido hacer una clase que aparentemente hace lo que quiero salvo el error anterior. He probado a cambiar de posicion en el bucle las instrucciones que generan el ResultSet pero no mejora.
statement = connection.createStatement();
statement.executeQuery(query);
Os pongo mi codigo por si alguno me puede ayudar. He tenido que cortar algo porque sino no entraba en el foro. Pero basicamente son los import y poco mas. Gracias.
public class Prueba {
public static void main(String[] args) {
boolean seguirProceso;
seguirProceso = true;
proceso:
while (seguirProceso) {
DatosGenerales dg = new DatosGenerales();
if (dg.existeDG == false){
break proceso;
}
SAXBuilder saxBuilder = new SAXBuilder();
// start parsing...
// command line should offer URIs or file names
try {
fichero = "prueba3.xml";
Document jdomDocument = saxBuilder.build(fichero);
Prueba prueba = new Prueba(jdomDocument, dg);
} catch (JDOMException e) { // indicates a well-formedness or other error
System.out.println(fichero + " is not a well formed XML document.");
System.out.println(e.getMessage());
} catch (IOException e) { // indicates an IO problem
System.out.println(fichero + " could not be parsed");
System.out.println(e.getMessage());
}
seguirProceso = false;
} // Fin del While que engloba el proceso.
} // fin de metodo main
// Variables de la clase
public Prueba(Document doc, DatosGenerales dg) {
final int lcodArticuloIndex = 2;
final int lpvpRecologicIndex = 6;
final int lpaginasIndex = 7;
final int lproveedorIndex = 8;
final int lmpIndex = 9;
final int lpvcpIndex = 10;
final int lpcdIndex = 11;
boolean proceso = true;
proceso:
while (proceso) {
OrdenReciclado or = new OrdenReciclado(dg);
if (or.existeOR == false){
System.out.println("No existe registro Orden Reciclado");
break proceso;
}
try {
Class.forName(dg.driver);
Connection connection = DriverManager.getConnection(dg.url, dg.username,
dg.password);
Rutinas rutinas= new Rutinas();
String query;
String[] lcamposSelect = new String[30];
int ics;
String lfrom;
String lwhere;
String lorder;
String linnerJoin;
String louterJoin;
String leftJoin;
String rightJoin;
String lon;
// Obtengo Element root
Element root = doc.getRootElement();
// List childrenWS = root.getChildren("Worksheet");
List childrenWS = root.getChildren();
Iterator iteratorWS = childrenWS.iterator();
while (iteratorWS.hasNext()) {
Element worksheet = (Element) iteratorWS.next();
if (worksheet.getQualifiedName() != "Worksheet"){continue;}
List childrenTable = worksheet.getChildren();
Iterator iteratorTable = childrenTable.iterator();
while (iteratorTable.hasNext()) {
Element table = (Element) iteratorTable.next();
if (table.getQualifiedName() != "Table"){continue;}
List childrenRow = table.getChildren();
Iterator iteratorRow = childrenRow.iterator();
while (iteratorRow.hasNext()) {
Element row = (Element) iteratorRow.next();
if (row.getQualifiedName() != "Row"){continue;}
List childrenCell = row.getChildren();
Iterator iteratorCell = childrenCell.iterator();
int numCeldas = 0;
String lcodArticulo = "";
String lpvpRecologic = "";
String lpaginas = "";
String lproveedor = "";
String lmp = "";
String lpvcp = "";
String lpcd = "";
boolean swHayReciclado=false;
celdas:
while (iteratorCell.hasNext()) {
Element cell = (Element) iteratorCell.next();
if (cell.getQualifiedName() != "Cell"){
continue;
}
numCeldas++;
List childrenData = cell.getChildren();
ListIterator iteratorData = (ListIterator) childrenData.iterator();
while (iteratorData.hasNext()) {
Element data = (Element) iteratorData.next();
if (data.getQualifiedName() != "Data"){
continue;
}
String value = data.getTextTrim();
// Si no hay referencia no merece la pena seguir en esta Row
if ((value == null || value.equalsIgnoreCase(""))
&& numCeldas == lcodArticuloIndex) {
break celdas;
}
if (1==1){
// Acceso al articulo reciclado
if (numCeldas == lcodArticuloIndex){
Statement statement;
ResultSet rs;
// Statement statement1;
// ResultSet rs1;
boolean lecturaReciclado = true;
lecturaReciclado:
while (lecturaReciclado) {
// Acceso a los registros que contienen el orden de proveedores de reciclado.
// De acceso a base de datos
// Try de base de datos
try{
for (int i = 0;i <or.longitudOR;i++){
String LScodProveedor;
String LScodArticulo;
// Acceso al articulo reciclado
if (or.ORcodProveedor[i] == null || or.ORcodProveedor[i].equalsIgnoreCase("")){
System.out.println("El proveedor asignado al orden de reciclados esta vacio");
break proceso;
}else{
LScodProveedor=or.ORcodProveedor[i];
}
// Lectura del articulo reciclado relacionado con el articulo de la plantilla
LScodArticulo=value;
ics = 0;lcamposSelect = new String[30];lwhere=null;lorder=null;linnerJoin=null;louterJoi n=null;leftJoin=null;rightJoin=null;lon=null;
lcamposSelect[ics++] = "ARcodProveedor";
lcamposSelect[ics++] = "ARcodArticulo";
lcamposSelect[ics++] = "ARfamilia";
lcamposSelect[ics++] = "ARPVPTextoPre";
lcamposSelect[ics++] = "ARPVP1";
lcamposSelect[ics++] = "ARPVP2";
lcamposSelect[ics++] = "ARPVP3";
lcamposSelect[ics++] = "ARprecioCosto";
lcamposSelect[ics++] = "ARpaginas";
lfrom = "articulos";
// lorder = "ARcodProveedor, ARcodArticulo";
lwhere = "(ARcodProveedor='" + LScodProveedor + "' AND ARcodArticulo='" + LScodArticulo + "' AND ARarticuloActivo=True AND ARpresupuesto=True)";
query = rutinas.crearQuery(lcamposSelect,lfrom,lwhere,lord er,linnerJoin,louterJoin,leftJoin,rightJoin,lon);
statement = connection.createStatement();
rs = statement.executeQuery(query);
while (rs.next()) {
String ARPVPTextoPre = rs.getString("ARPVPTextoPre");
rs.close();
// rs1.close();
break lecturaReciclado;
} // Acceso a articulo Reciclado
rs.close();
} // Lectura de orden reciclado
// rs1.close();
// Posibles errores relacionados con la base de datos.
} catch (SQLException sqle) {
System.err.println("Error con conexion:" + sqle);
} // Fin de catch
lecturaReciclado = false;
} // while de proceso Lectura Reciclado
} // If de que estamos con el valor de referencia
if (true != (lpvpRecologic == null || lpvpRecologic.equalsIgnoreCase(""))){
Object o2 = data.setText(lpvpRecologic);
}
} // 1==0
} //Data
}//Celda
}//Row
}//Table
}//WorkSheet
// Posibles errores relacionados con la base de datos.
connection.close();
} // Fin de Try de base de datos y drivers
catch (ClassNotFoundException cnfe) {
System.err.println("Error cargando driver" + cnfe);
}
catch (SQLException sqle) {
System.err.println("Error con conexion" + sqle);
}
proceso = false;
} // Fin de While de proceso de navegacion por el documento
try {
XMLOutputter out=new XMLOutputter();
FileOutputStream fileOut=new FileOutputStream("//Principal/c-principal/recologic/plantillas marqueting/PRECIOS/productos proveedores/recologic/carga-datos-access/java/prueba4.xml");
out.output(doc,fileOut);
fileOut.flush();
fileOut.close();
}
catch (IOException e) {
System.err.println(e);
}
} // fin de metodo
}// fin de clase