Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#2181
Cita de: digimaribel23 en  3 Septiembre 2018, 15:09 PM
Si hago un recordset de cada fila y la voy insertando a la otra base de datos, se me eterniza, porque hay muchos datos a pasar.
Por eso creí que haciando una copia de un servidor a otro, la operación sería bastante más rápida, no te parece?
Si estamos hablando de Terabytes... sí... si hablamos de unos pocos cientos de Megabytes... pués no.

Por otro lado si la copia es completamente idéntica, o casi (y no solo copiar algunas tablas o ciertos registros de algunas tablas como inicialmente uno supone), poque no la comprimes entera y la trasladas al otro servidor (si no tienes habilitado nada al respecto (ftp por ejemplo), súbelo cifrado a algun site de descargas y luego la descargas desde el otro lado y allí la descomprimes y listo... esto es aún más rápido...



Leyendo otro mensaje... Si la BD debe ser creada con tablas y valores por defecto... hazlo en local en tu equipo, la comprimes y luego cuando se deba recrear en otro lado, la descargas allí, la descomprimes y aplicas los pocos cambios que precisara al momento...
#2182
Pués yo juraría que uno podía plantar en su casa algunas plantas para consumo propio... 1, 2 4...

Si sirve para que se acabe el contrabando de hachís procedente de Africa... pués ya merecería la pena. Por otro lado cada vez hay más estudios que indican (hay quien pondría 'demuestran'), que el hachís si producte efectos negativos a largo plazo en el cerebro... así que al final no me pronuncio ni a favor ni en contra.
Estando a favor parece evitarse mafias, pero también parece que acabará generando gastos médicos...
Tampoco queda claro si la cosa quedará así ya ya, o si luego se seguirá presionando para ir pasos más allá.
#2183
Claro, Orubatosu... pero cuando vienen en un título, sabemos que su intención es hacer creer lo específico (el contenido por el contenido), para atraer lectores al artículo... (que luego saldrán espantados si se sienten engañados por el título). Si no fuera así, el titulo sería más descriptivo y fidedigno a la realidad: "Logran que un virus fabrique manipule partículas de oro"... ahí deja claro que el virus es meramente un 'artesano' y no un 'transmutador' de elementos...
#2184
bueno así a primera vista lo que veo es que tienes 2 BD, llamémoslas BD1 y BD2
...y tienes una conctrinoString para cada una, llamemoslas cs1 y cs2...

Sin embargo, me pregunto si luego las cruzas...
bd1.open cs2
bd2.open cs1
No tendría más importancia salvo si luego una operación que debe ser realizada a una se hace a la otra...


El caso es como no atrapas correctamente el error, no queda claor donde se genera...
Hazlo mejor así:
Código (vb) [Seleccionar]

    ' Hay que atrapar el error en el momento en que se produzca... no ya cuando resulte imposible seguir...
   on local error goto ErrorBd  ' esta línea debe remplazar a tu ' on error resume next'
   ' todo tu código... aquí


    strConexion1 = "DRIVER={MySQL ODBC 3.51 Driver};SERVER=zz.zzz.zzz.zz;DATABASE=NombreBase;USER=Usuario;PASSWORD=Psw"
   strConexion2 = "DRIVER={MySQL ODBC 3.51 Driver};SERVER=xx.xxx.xxx.xx;DATABASE=NombreBase;USER=Usuario;PASSWORD=Psw"
   Dim cAbantisDB As New ADODB.Connection ' <---- pon un "punto de interrupción en esta línea tecla F9
   ' y a partir de aquí vamos paso a paso (tecla F8 con cada línea),
   ' así vmeos que línea falla exactamente, porque el mensaje de error refiere línea 1, y refiere '.tbAccesos2', que no aparece por ninguna parte en tu código... probablemente sea el nombdre de una tabla... pero (yo), no hay forma de saber de qué BD.
   Dim cABDat As New ADODB.Connection
   cABDat.open strConexion1
   cAbantisDB.open strConexion2

   cABDat.Execute "INSERT INTO Tabla SELECT * FROM cAbantisDB.dbo.Tabla"
   '... hay más código, pués ponlo debajo?

   ' al final del código en dicha sub/function
   exit sub ' o function según sea el caso

errorBD:
   debug.print err.Description  
   ' Si se puede corregir el error aquí, entonces
   resume next  
   ' si no parar y arreglarlo...
end sub /function





Por otro lado, porqué no separas la lógica... ???
1 - Por un lado primero obtener un recordset de la BD1  
2 - por el camino, si hay diferencias entre las tablas, antes de la inserción debes adaptarlo, y si es copia fidedigna, debería aceptarlo bien.
3 - y luego insertas ese recordset en la BD2...

Separando claramente los pasos, puedes atajar y atacar mucho mejor cualquier problema que se presente, sobretodo porque sabrás donde sucede el error, en la BD1, en la BD2 ???
#2185
Java / Re: Estructura repititiva while
2 Septiembre 2018, 15:17 PM
CitarMi locale es: de_DE

Eso es alemán (Deutsche)...
#2186
Java / Re: Alguien me puede decir que esta mal.
1 Septiembre 2018, 20:41 PM
Para tu interés, básicamente nunca fuí principiante en Java... Cuando Sun, lo sacó a la luz, incluso reclamaban ayuda al público para ayudarles a crecer y mejorar el lenguaje, me hice una cuenta y ayudaba a ratos... y por aquel entonces Internet estaba en bragas... habían las BBS (lo más parecido a los foros de hoy día), con un ancho de banda de risa...
...No, por aquel entonces lo mejor (igual que hoy día), para aprender un lenguaje de programación desde cero, era comprarse un par de libros sobre el tema. No tenías ayuda de nadie, muchos recurrían a revistas mensuales, pero que no cubrían las dudas de nadie, solo artículos parciales que salína mes a mes... en fin, no sabes de lo que hablas.

Y en realidad he sido más educado de lo que pareces darte cuenta... en general estas cuestiones ni siquiera merecen ser respondidas (de hecho la mayoría ni se responden), porque en realidad suponen una ofensa una falta de respeto a la comunidad (el foro)... preguntar cuestiones por las que básicamente uno no se ha tomado la más mínima molestia... como mínimo, abrir el google translator y poner ahí el mensaje de error... pero es más cómodo copiar y pegar y que me lo expliquen todo masticado y digerido... así créeme que he sido más educado de lo que tu quieres hacer parecer...

Además, después de todo, es abrirle una vía, que tarde o temprano tendrá que utilizar... así que ni siquiera es un comentario que sobre.
#2187
Bien, suponiendo un restaurante que admite reservas....
Un punto a señalar es que solo admite reservas, es deic rsi alguien se presenta sin reservas y hay mesa libre se le ofrece una mesa o se le invita  a irse a otro restaurante...

También queda la duda de dónde desea almacenar los datos... para las reservas de un día, se pueden guardar en memnoria y como copia en un ficherito para prevenir eventualidades fatales, pero teneiendo reservas con meses de antelación, lo razonable es usar una base de datos... así que algunos comentarios y tal harán referencia a una base de datos... PK= Primary Key

La clase/registro Reserva, debe ser simple y debe apuntar a mesa, cliente y fecha (mes + día + hora), etc... es decir solo contiene datos, no métodos.
clase Reserva
    PK codReserva tipo String  // un código único para esta reserva, usando una BD esto s
    FK codCliente tipo  string
    FK codMesa tipo entero
    FK codFecha tipo Fecha
fin clase


Como se ve, solo el campo 'codigoReserva' de una reserva son primary Key (PK), porque puede consultarse las reservas para obtener la reserva específica. El resto de campos en cambio son foreign Key, porque puede pedirse datos ampliados respecto de ellos a otras tablas/colecciones, por ejemplo, para el cliente... podría pedirse todas sus reservas, para mesa, todas las reservas de una mesa para un día concreto incluso la reserva para una fecha concreta de esa mesa, etc...

Cada reserva es una clase, un ítem para una colección ó, un registro de una tabla en una base de datos...

Objeto que guarda todas las reservas, aunque lo razonable es que sea una tabla en una base de datos.
Clase coleccion reservas
     PK codReserva tipo string

     // Se intenta añadir una reserva si fue bien devuelve el código de la reserva, en otro caso un string vacío.
     // Puede indicarse aparte por referencia un valor numérico, que devuelve 0 y cuando haya error
     //    Un valor distinto de 0, que refleja un problema específico por ejemplo:
     //    1: no hay mesas libres para esa hora. 2: Ese día el restaurante no abre. etc...
     string = Add(r tipo Reserva, error tipo entero)

     entero = Borrar(cod tipo string) // pasando el código de una reserva puede borrarse la reserva... debería pedirse confirmación.

     // siendo una base de datos, debería poderse modificar un registro, cambiar por ejemplo, la hora, el día ó el mes... el cambio de mesa no sería elegible por el cliente, si no en función de la que hubiere libre para la nueva fecha...
     reserva = Modificar(cod tipo string, nuevaFecha tipo fecha)
     
     reserva = ConsultarPorCodigo(cod tipo string) // devuelve la reserva por cuyo código se pregunta. si no existe devuelve un objeto vacío.
     reserva = ConsultarPorClienteYFecha(nombreCli tipo string, f tipo fecha)
     // dado el nombre completo dle cliente, busca en la tabla clientes, si hay registros de reservas para el cliente, si los hay busca entre ellos aquel que tenga la fecha reclamada (mes y día),
    //Para buscar reservas en un rango dado (desde mes y dia hasta mes y dia) deberá usarse otra función pués podría devolver más de un registro...

    ... muchos más métodos.
fin clase


En fin, como puedes darte cuenta, la más compleja de todas será la coleccion reservas (o tabla si usas una BD, que es lo acertado)...

Los datos de un cliente se recogerían en una clase específica.... igualmente sol contiene datos, no métodos.
clase Cliente
   PK cod tipo String  // código del Cliente
   nombre tipo String
   apellidos tipo string
   telefono tipo string
   ...etc... más datos cliente
fin clase


Clientes sería una colección de la clase cliente, o una tabla con los registros de los clientes.
Como colección debería tener métodos, para poder manejarla... lo típico:
Añadircliente, Borrarcliente, ModificarDatoscliente, Buscarcliente
coleccion clientes
    PK cod tipo string  // un array, etc... pero mejor una tabla en una bd

    cliente = Buscar(cod tipo string)  // dado su código  decliente, se localiza y se devuelve el registro (datos) del cliente
    buleano = Add(cli tipo Cliente) // Añade un cliente (siempre que no exista).
    buleano = Delete(cod tipo string)  // borra un cliente, si existe y anula sus reservas (si las tiene, pero en tal caso pidiendo confirmación).
    cliente = BuscarPorCodigo(cod tipo string) // localiza y devuelve un registor decliente si existe, un objeto vacío si no, dado el código de cliente.
   cliente = BuscarPorNombre(nombre tipo string, apellidos tipo String) // ídem pero dado su nombre y apellidos...
    // La búsqueda es para obtener el registro/clase del cliente, sea para modificar sus datos o para tomar su código de cliente y con él buscar reservas...
fin colección


La clase mesa es la más sencilla, solo tiene un código asociado a ella.
Clase Mesa
   PK codMesa tipo string
fin clase

En cambio la colección/tabla mesas, almacena objetos/registros de mesa y debe disponer de métodos
coleccion Mesas
    PK codMesa Tipo String  //

    string = Add  // añade una nueva mesa al restaruante se le asocia un nueco código de mesa.
    buleano = Delete(cod tipo string) // intenta eliminar una mesa.
    // si no tiene reservas se elimina, sin problemas, pero...
    //   si tiene reservas, cada reserva se intenta asociar a otra mesa,
    //   si no resulta posible cambiar todas las reservas a otra mesa,
    //   podría verse de cambiar además d ela mesa el horario, pero avisando al cliente consensuado
    //   o se cancelan las reservas o no se puede eliminar la mesa...
    //   devuelve un bucleano, para indicar si se logró eliminar o no.
    //   Eliminar mesas puede implicar cambios de horarios/fecha en las o su anulación,
    //   y llevaría aparejado el añadir eventos en cola, para llamar a los clientes y avisarles/ponerse de acuerdo...

    // podrían añadirse más métodos como consultar mesa libre para una fecha concreta.
    // Aunque ese método, debería ir a la coleccion/tabla reservas...
fin coleccion


En cambio para fechas... no veo la necesidad ni de crear una clse ni una colección... en todo caso simplemente la reserva debe tener claro el horario (de cada día de la semana, si varía según el día), o si algún día el restaurante está cerrado... pero eso puede estar imbuido al hacer la reserva, al eelgir fecha, se restringe el horario y los días a los que estén prefijados...
clase horario
     abre tipo fecha
     cierre tipo fecha
     // nombre dia string  esto es ...opcional....
fin clase

coleccion HorarioPorDias
     Lunes tipo horario
     martes tipo horario
     ...
     domingo tipo horario

     buleano = EstaAbierto(hora tipo numero, dia tipo numero por defecto hoy, mes tipo numero por defecto actual)
     // Señala si para el mes, día y hora indicado está abierto elrestaurante...

     // Devuelve una clase horario, para el mes y día señalado
     horario = HorarioPara(dia tipo numero por defecto hoy, mes tipo numero por defecto actual)

     // no parece necesario que deba tener más métodos.
fin coleccion


Así a grosso modo....
#2188
mmmm... si lo que te falla es el algortimo de ordenamiento, no es preciso poner el resto dle código... cuando el código es largo, y la descripción del problema vago, ahuyenta a cualquiera que tuviera intención de ayudarte... cíñete a algo específico, y no te faltará ayuda...

(ok, acabo de ver que lo has abreviado, en otro mensaje posterior, pero ...
los comentarios aquí se refieren al código de dicha función en tu primer mensaje, de este último, no he mirado, yo le di a responder esta mañana, pero me tuve que ir, y ahora al volver lo he terminado, no me apetece corregirlo (solo el parrafo que iba aquí)


   
Tu error reside en el bucle interno al completo.
Primero en:
Código (cpp) [Seleccionar]

for(j=lista;j->sig!=NULL;j=j->sig){
j=i->sig;

Es decir en el bucle interno, con cada iteración el nodo de dicho bucle es siempre el siguiente al del nodo del bucle externo, es decir no cambia en todo el bucle interno.... antes del bucle debes asignarlo
y dentro del bucle podrías iterarlo, sin embargo es algo que ya le has indicado al bucle que lo haga expresamente por tí, en la parte del avance del bucle (incremento, dirección del bucle: j=j->sig)

...y luego también está mal, la comparación...
parece tonta, aunque encuentres uno menor, tu siempre lo comparas con el valor del primer ítem, parece incapaz de 'aprender'
cambia esto:
Código (cpp) [Seleccionar]

                       if(j->dato < i->dato){
min->dato=j->dato;
min->sig=j->sig;
                       }

por esto (tienes min... que pasa a ser el menor, pués en lo siguiente debes buscar uno menor que el recién hallado).
Y también carece de sentido, ir cambiando los datos de cada nodo... Selección intercambia únicamente el menor hallado (en el bucle interno), por el actual en la posición de avance (del bucle externo)...
Código (cpp) [Seleccionar]

                       if(j->dato < min->dato){
min=j;
                       }

      
para que el bucle interno te quede finalmente así:
Código (cpp) [Seleccionar]

              for(j=i->sig;j->sig!=NULL;j=j->sig){
                       if(j->dato < min->dato){
min=j;
                       }
             }

...vamos que fallando el bucle interno te ha fallado todo, excepto intercambiar los datos.
Revisa que no te dé desbordamiento.



Te pongo un pseudocódigo más elegante, que espero que te resulte fácil de entender y sobre todo ameno...

En el algoritmo de ordenamiento por selección, se localiza el menor (entre los que aún queden sin ordenar), y luego se intercambia por el primero no ordenado aún.

Nota que son los comentarios lo que 'profusan el texto', por lo demás necesarios para que los que están aprendiendo, logren entenderlo bien... si los retiras el código resulta muy breve.

entero i, j, final
entero min, aux //supongamos que min es un valor entero, que no lo sé, podría incluso ser un string.
nodo n, m, tmp  // necesitaremos 3 nodos...
// n es el nodo siendo examinado en el bucle externo.
// tmp es el nodo siendo examinado en el bucle interno.
// m es el nodo que contiene el valor menor hallado hasta el momento.

final = tamaño de la lista-1
n= lista  // el primer nodo de la lista.

// vamos a marcar el recorrido de los bucles con enteros,
// cuando te funcione y lo tengas claro, puedes modificarlo para que sea con nodos.

// el último elemento, no precisa ser buscado...
// cuando se ordenen los previos, el que queda es el mayor, sí o sí, de ahí el -1
bucle i desde 0 hasta final-1 (incrementos de 1)
    // tomamos el menor aún no ordenado. Empezando por el primero
    min = n.dato  // usamos 'min' por velocidad, y claridad...
    tmp = n  // el primero para el bucle interno (nada más iniciar el bucle, saltamos al siguiente).
    m = n  // ahora este es el menor a superar
   
    // bucle para buscar el menor a partir del 'i'ésimo
    //este bucle toma el siguiente y termina uno más allá que el bucle externo.
    bucle j = desde i+1 hasta final (incrementos de 1)  
        tmp= tmp.siguiente  
        // el bucle interno, siempre empieza comparando con el siguiente al índice siendo ordenado
        Si (tmp.dato < min)
            m = tmp  //recordamos el nodo menor,  ahora este es el menor a superar
            min = m.dato    // tomamos su valor (para seguir comparando)            
        fin si
    fin bucle

    // ahora el intercambio n x m  (el del bucle externo, por el que contiene el valor menor)
    //   basta cambiar el dato (si el nodo sólo tiene como miembros a 'dato' y 'siguiente'
    //   pero... si tuviere más o se cambian todos los que proceda o
    //   se intercambian los nodos entre si al completo, excepto las referencias a otros nodos
    //     que deberían mantenerse 'siguiente', 'anterior', etc...)
    aux = n.dato
    n.dato = min
    m.dato = aux

    n = n.siguiente  
fin bucle


No he mirado el resto del código... si declaras que te falla el freno, carece de sentido mirar el motor, etc...

p.d.: Alineación de comentaros para que no exija scroll horizontal...
#2189
mmmm... entre que:
     "fabrique partículas DE oro"
y que:
     "fabrique partículas CON oro"
hay un abismo... que a los "periolistos", les encanta saltarse siempre.
#2190
Java / Re: Estructura repititiva while
31 Agosto 2018, 14:24 PM
Pero has usado "getDecimalSeparator", para saber cual es?.
Es que una cosa es que tu creas que es tal o cual y otra el que realmente se usa...
todo esto está relacionaco con "Locale".

El caso es que la documentación es muy específica y clara...
Citar
public float nextFloat()

Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that matched.

Los modos por los que no pueda ser parseado en un float, es que no los delimitadores no sean los correctos (al margen de la entrada tenga valores no numéricos o esté vacía o se alcance el final), o esté fuera de rango por el tipo... vamos me inclino por el fallo en los separadores si insistes en que has entrado "2.02" ó "2,02" ó "2'02"...

Citar
public class InputMismatchException
extends NoSuchElementException

Thrown by a Scanner to indicate that the token retrieved does not match the pattern for the expected type, or that the token is out of range for the expected type.

El caso es que sin saber el locale que tienes indicado ni los separadores no se puede adivinar exactamente el problema. El genérico es lo que te he señalado.

prueba el siguiente código y dime si te funciona, y espero que esto solvente tus dudas...
Código (java) [Seleccionar]

string valor = "9.3 * 3.0 vaya calor";
string resultado = valor + "= 27.9";

//lo tomamos de un string, en vez del teclado, para asegurarme que el error no esté en lo que entres...
Scanner scanKb = new Scanner(resultado);
scanKb.useLocale(Locale.US); // el de USA que usan punto...

// Ahora observa que como la entrada está 'sucia'... debemos ir saltando...
while (scanKb.hasNext()) {
   scanKb.next();  //obtenemos un token... (el separador por defecto de tokens es el espacio).
       
   if (scanKb.hasNextFloat()) { //si no puede ser parseado como un número flotante, pasamos por alto...
       System.out.println(scanKb.nextFloat());
   }
}

scanKb.close();


Y debería escupir estos valores:
9.3
3.0
27.9