Ver Mensaje Individual
  #5 (permalink)  
Antiguo 21/11/2013, 14:48
marcusaurelio
 
Fecha de Ingreso: enero-2007
Mensajes: 285
Antigüedad: 17 años, 3 meses
Puntos: 21
Respuesta: APPLET enviar datos a php

Gracias Xerelo, pido disculpas por los errores en mi pregunta... y vamos de nuevo.

lo que hago es leer un xls, por medio de jxl-2.6.3.jar, ese xls linea por linea lo voy pasando a php.

las columnas de este no son siempre iguales.. y las paso por medio de un string al applet. esto es apra poder usarlo en varias paginas sin modificar el codigo.

Lo que pasa es que a veces hay xls de 5000 o mas filas. Esto no es un problema para el java pero si para el php. Según veo el applet termina por estresar el servidor..

Yo ahora luego de unas semanas de ver. Estoy pensando en hacer un wait cada 100 filas para que descanse unos 5 segundos y siga… pero en realidad me gustaria ver si hay una posibilidad de hacerlo de corrido.

para esto configuro el applet asi

Código:
<APPLET code="upxlssintabla.filechooser.class" archive="filechooser/lib/jxl-2.6.3.jar, filechooser/upXLSsintabla.jar" width="100%" height="378">
<PARAM name="DB_campos" value="p_codigo,p_detalle,p_marca,p_unidad,p_precio1,p_precio2,p_precio3,p_rubro,p_subrubro,p_cambioprecio,p_foto" />
<PARAM name="FILE_proceso" value="filechooser_response.php" />

</APPLET>
Donde DB_campos es el string con los campos.

El xls es mas o menos asi… en este caso.. en otro puede ser diferecnte… tener mas o menos campos.. incluso con mas o menos texto cada campo.

imagen


Luego vamos al tema del java..

En el init tomo las variables pasadas al applet

Código:
iniciarVaciar=getParameter("DB_vaciar");
paramVaciar = getParameter("DB_vaciar");
paramCampos = getParameter("DB_campos");
paramTabla = getParameter("DB_tabla");
paramFileProceso = getParameter("FILE_proceso");
urlProceso = getCodeBase() + paramFileProceso;
El metodo filechooser recorre el xls, tambien hace varios procesos.. y llama a varios metodos, para comprobar, si hay conexión con la db, generar el string de salida, mandar el string a php, etc.

Código:
public synchronized void filechooser(final String archivo) {
        botonProceso.setEnabled(false);
        varInicioFilas = Integer.parseInt(saltarInicio.getText());
        varCaracteresCode = Integer.parseInt(caracteresCode.getText());
        varOmitirPalabras = palabrasOmitir.getText();
        Runnable miRunnable = new Runnable() {
            public void run() {
                try {
                    try {
                        botonDetener.setEnabled(true);
                        int rowGral = 0;
                        Workbook archivoExcel = Workbook.getWorkbook(new File(archivo));
                        int filasdecadahoja = 0;
                        int nhoja = archivoExcel.getNumberOfSheets();
                        for (int sheetNo = 0; sheetNo < archivoExcel.getNumberOfSheets(); sheetNo++) {
                            Sheet hojax = archivoExcel.getSheet(sheetNo);
                            filasdecadahoja += hojax.getRows();

                        }
                        total.setText("" + filasdecadahoja);
                        for (int sheetNo = 0; sheetNo < archivoExcel.getNumberOfSheets(); sheetNo++) 
                        {
                            hoval.setText("" + nhoja);
                            int rowHoja = 0;
                            Sheet hoja = archivoExcel.getSheet(sheetNo);
                            int numColumnas = hoja.getColumns();
                            int numFilas = hoja.getRows();
                            for (int fila = 0; fila < numFilas; fila++) {
                                if (!procesoActivo) {
                                    iniciar();
                                    jProgressBar1.setValue(0);
                                    procesoActivo = true;
                                    botonDetener.setEnabled(false);
                                    Thread.currentThread().stop();

                                }
                                rowHoja++;
                                rowGral++;
                                filahoja.setText("" + rowHoja);
                                filatotal.setText("" + rowGral);
                                int resto = filasdecadahoja - rowGral;
                                restan.setText("" + resto);
                                int porc = (rowGral * 100) / filasdecadahoja;
                                primerCampo = hoja.getCell(0, fila).getContents();
                                Integer largo = primerCampo.length();

                                if (rowHoja > varInicioFilas) {
                                    
                                     String sale = null; 
                                    if (largo >= varCaracteresCode) {
                                        if (varOmitirPalabras != "") {

                                            String[] arra = varOmitirPalabras.split(",");

                                            if (!in_array(primerCampo, arra)) {
                                                sale = parametizar(hoja, fila, paramVaciar);
                                                pasarBD(sale);
                                                paramVaciar = "0";
                                            }
                                        } else {
                                            sale = parametizar(hoja, fila, paramVaciar);
                                            pasarBD(sale);
                                            paramVaciar = "0";
                                        }
                                        
                                    }
                                }

                                if (porc == 100) {
                                    String mensajex;
                                    mensajex ="PROCESO COMPLETADO\r\n";
                                    mensajesSalida(mensajex);

                                    campoArchivo.setText("");
                                    botonProceso.setEnabled(true);
                                    paramVaciar = iniciarVaciar;
                                    botonDetener.setEnabled(false);
                                }
                                jProgressBar1.setValue(porc);

                            }

                        }

                    } catch (Exception ioe) {
                        iniciar();
                        botonProceso.setEnabled(true);
                        mensajesSalida("Error con el archivo: " + ioe.getMessage());
                        botonDetener.setEnabled(false);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    mensajesSalida("Error con el archivo: " + e.getMessage());
                    botonDetener.setEnabled(false);
                }
            }
        };

        Thread hilo = new Thread(miRunnable);
        hilo.start();
    }
El metodo parametrizar, lo que hace es tomta paramCampos, que es el string que le paso al applet como DB_campos, hacer un splits por las comas y armar la salida de con los datos del xls. Por orden.. Osea que tranforma esto

p_codigo,p_detalle,p_marca,p_unidad,p_precio1,p_pr ecio2,p_precio3,p_rubro,p_subrubro,p_cambioprecio, p_foto

en esto

p_codigo=datos&p_detalle=datos&p_marca=datos, etc.

Código:
public String parametizar(Sheet hoja, int fila, String vaciar) {

        String campos = paramCampos;
        String tabla = "&DB_tabla=" + paramTabla;
        String vaciart = "&DB_vaciar=" + vaciar;
        String camposs = campos.replace(",", "=%s&") + "=%s" + tabla + vaciart;
        String[] cc = campos.split(",");
        String[] ff = new String[cc.length + 1];

        for (int i = 0; i < cc.length; i++) {

            ff[i] = hoja.getCell(i, fila).getContents();

        }

        return String.format(camposs, (Object[]) ff);

    }
Luego lo genrado por parametrizar(), es enviado al metodo pasarBD() y este lo que hace mandar esos datos a otro metodo requestFromDB(), que envia los datos a php y camptura la respuesta, en la variable reto. Si el valor de esta variable es 1 seguimos corriendo, si no es 1 lo que hace es hacer un wait y cada 3 segundos y hacer un reintento hasta 10 si en alguno de esos 10 vuelve a dar 1 sigue corriendo, y el contador se reestablece a cero.

Código:
public void pasarBD(String sale) throws InterruptedException {

        String reto;
        int salimero = 1;
        int ReintentosNum = 10;
        try {
            reto = requestFromDB(sale);
            String expose;

            if (!reto.equals("1")) {

                if (Intentos < ReintentosNum) {
                    mensajesSalida("Error de conexión, el servidor no da respuesta: reintento " + (Intentos + 1) + " de " + ReintentosNum);
                    Intentos++;
                    Thread.currentThread().sleep(3000);
                    pasarBD(sale);

                } else {
                    String mensajex;
                    mensajex = "ERROR EN EL PROCESO";
                    mensajesSalida(mensajex);
                    botonProceso.setEnabled(true);

                    botonDetener.setEnabled(false);
                    Intentos = 0;
                    Thread.currentThread().stop();

                }

            } else {
               
                Intentos = 0;
            }

        } catch (Exception ex) {
            Logger.getLogger(filechooser.class.getName()).log(Level.SEVERE, null, ex);
        }

    }