none
Anexar datos de otra tabla RRS feed

  • Pregunta

  • Cordial saludo.

    Tengo dos tablas en Access 2007: ControlLBF, tiene 93.000 registros, y GeneralNov, tiene 102.000 registros, necesito actualizar ControlLBF, con la informacion de GeneralNov, tengo la siguiente instruccion pero no me funciona, se queda ahi pensando hasta que me aburre y cancelo la operacion.

    si alguien me puede revisar las instrucciones SQL a ver que estoy haciendo mal.

     

    NSERT INTO
    ControlLBF
    (Municipio,
    Folio,
    PrimerNombre,
    SegundoNombre,
    PrimerApellido,
    SegundoApellido,
    TipoId,
    NumeroId,
    TipoMiembro,
    Origen,
    Cohorte,
    Estado,
    Cgs )
    SELECT
    GeneralNov.Municipio,
    GeneralNov.Folio,
    GeneralNov.Primer_nomb,
    GeneralNov.Segundo_nomb,
    GeneralNov.Primer_apellido,
    GeneralNov.Segundo_apellido,
    generalNov.Tipo_doc,
    GeneralNov.Numero_doc,
    GeneralNov.Vinculo_familiar,
    GeneralNov.Origen,
    GeneralNov.Cohorte,
    GeneralNov.Estado,
    GeneralNov.Cgs
    FROM GeneralNov, ControlLBF
    Where ControlLBF.NumeroId NOT IN (Select Numero_doc From GeneralNov)

    Gracias,

    Augusto V.

    martes, 16 de noviembre de 2010 15:38

Todas las respuestas

  • Si lo que quieres es insertar en ControlLBF los datos de GeneralNov que no están en ControlLBF, en SQL Server (no sé si Access permite esa sintaxis) sería algo como

    INSERT ControlLBF

    SELECT g.Municipio,
    g.Folio,
    g.Primer_nomb,
    g.Segundo_nomb,
    g.Primer_apellido,
    g.Segundo_apellido,
    g.Tipo_doc,
    g.Numero_doc,
    g.Vinculo_familiar,
    g.Origen,
    g.Cohorte,
    g.Estado,
    g.Cgs

    FROM GeneralNov g LEFT JOIN ControlLBF c ON c.NumeroId = g.Numero_doc WHERE c.NumeroId IS NULL

    • Propuesto como respuesta Carlos Sacristan martes, 16 de noviembre de 2010 16:22
    martes, 16 de noviembre de 2010 16:21
  • Ok, lo pase a Acces, pero tengo una duda, y es lo siguiente:

    El campo g.Numero_doc, en ocaciones esta vacio, el campo que necesariamente no puede ser nulo es Folio, pero folio se repite.

    a ver, Folio representa un familia, el representante (Padre o Madre) del hogar y sus integrantes(por ejemplo los Hijos) tienen el mismo folio y el campo TipoMiembro, define si es "Integrante" o "Representante".

    No se como hacer....

    martes, 16 de noviembre de 2010 19:09
  • Ok, lo hice así, aun que aun no he comprobado los datos.

      INSERT INTO ControlLBF
    (ControlLBF.Municipio,
    ControlLBF.Folio,
    ControlLBF.PrimerNombre,
    ControlLBF.SegundoNombre,
    ControlLBF.PrimerApellido,
    ControlLBF.SegundoApellido,
    ControlLBF.TipoId,
    ControlLBF.NumeroId,
    ControlLBF.TipoMiembro,
    ControlLBF.Origen,
    ControlLBF.CGS,
    ControlLBF.Cohorte,
    ControlLBF.Estado)
    SELECT  
    GeneralNov.Municipio,
    GeneralNov.Folio,
    GeneralNov.Primer_nomb,
    GeneralNov.Segundo_nomb,
    GeneralNov.Primer_apellido,
    GeneralNov.Segundo_apellido,
    GeneralNov.Tipo_doc,
    GeneralNov.Numero_doc,
    GeneralNov.Vinculo_familiar,
    GeneralNov.Origen,
    GeneralNov.Cgs,
    GeneralNov.Cohorte,
    GeneralNov.Estado

    FROM
    GeneralNov LEFT JOIN ControlLBF  ON ControlLBF.Id = GeneralNov.Id
    WHERE
    ControlLBF.Id is null

     

    domingo, 21 de noviembre de 2010 1:13
  • Hola Augusto, he leído y releído pero no termino de entenderlo. Tengo la impresión que hay un documento principal, el cual puede tener registros relacionados. De ser así, estás frente a una relación de uno a varios, donde un registro de la tabla ppal puede tener varios en la otra parte.

    ?Ventajas? no tienes que guardar x veces la información del registro ppal, también a la hora de actualizar una información del registro ppal, no tendrías que hacerlo en las otros registros.

    domingo, 21 de noviembre de 2010 1:29
  • Bueno, la verdad es la siguiente:

    los datos son los mismos en ControlLBF y GeneralNov, solo que ControlLBF es una base de datos local y GeneralNov es la base de datos que esta en la red y es la que tiene los datos actualizados. mientras de ControlLBF se usa para consultar los datos de manera local por ser mas rapido el acceso.

    Entonces sucede que ControlLBF esta desactualizada y necesito actualizarla con los registros nuevos de GeneralNov. Porque no bajar los datos de GeneralNov nuevamente y olvidarme de actualizar ControlLBF??? pues, porque se han actulizado algunos datos como direccion y telefonos, ademas se han agregado unos campos para llevar unas observaciones. entonces lo que se quiere es no perder esa información.

    ControlLBF  tiene 93.000 registros, y GeneralNov, tiene 102.000, porque tiene mas de 3 meses que no la actualizo. realice la consulta anterior pero no me funciono, pues busque un dato que esta en GeneralNov y no me aparecio en ControlLBF.

    Osea sigo varado....

     

    domingo, 21 de noviembre de 2010 15:25
  • Hola augusto, ahora si entendí (soy lento). Yo, Carlos, lo haría de la siguiente manera:

    1. Cargo un recordset con la tabla original; lleno un arreglo o matríz y cierro la conexión.(A)
    2. Cargo un recordset con la tabla destino (B)
    3. Voy recorriendo cada registro de A e intento insertar en B
    4. Si se produce el error nro ? (no me se los nro de errores) al intentar insertar en B, pasamos a actualizar sus campos

    on error resume next

    Dim conn as new adodb.connection, rst as new adodb.recordset, arreglo

    'abres la conexion

    conn.open......

    'abres el conjunto de registros

    rst.open "select * from tutabla order by uncampo",conn,2,4' 2 y 4 es mas rápido, porque solo 'hacia adelante' y lectura

    if not rst.eof then

    set arreglo=rst.getrows()' lleno el arreglo

    rst.close ' cierro el recordset

    end if

    conn.close ' cierro conexion

    'ahora ABRES la conexion, pero LOCALMENTE

    'recorremos el arreglo

    if isarray(arreglo) then

    for k=0 to ubound(arreglo,k) '

    conn.execute "INSERT INTO tabla destino(campos) select " & arreglo(0,k) & "," & arreglo(1,k) & "," & arreglo(2,k)

    if err.number=-217xxxxxxxx then ' si ya existe...

    conn.execute "update tabladestino ....."

    end if

    next k

    end if

    Lamentablemente mi estación de trabajo está averiada, por lo que no tengo el entorno para ayudarte con mas detalle

    domingo, 21 de noviembre de 2010 15:48
  • Ok, Carlos.

    Pero yo estoy haciendo este proceso en Access solo con consultas, no estoy programando nada, luego intente hacerlo en SQL Server, que es mas rapido, pero no me ha funcionado.

    Aparentemente, el anexa los 8 mil registros a ControlLBF, bueno el inserta los registros pues al mirar la tabla queda con el mismo numero de registros que GeneralNov, pero al buscar un numero de Folio que esta en GeneralNov, no aparece en ControlLBF. entonces no se que estoy haciendo mal en la Instruccion SQL.

     

    domingo, 21 de noviembre de 2010 17:41
  • Bueno, si la idea es pasar todo para local, una manera muy sencilla es borrar los datos en la tabla local, y luego insertar desde el servidor. De esta manera no hay que actualizar, solo eliminar e insertar. Que opinas?
    domingo, 21 de noviembre de 2010 17:55
  • Si, eso haria, si la tabla que tengo local no le hubieran agregado informacion, los compañeros de trabajo le actulizaron mucha información que no corresponde a la que esta en la base que esta en internet, entonces ellos no quieren perder el trabajo de 3 meses, durante los cuales le han estado actualizando las direcciones, telefonos y otros datos a las familias registradas...

    Es que no se mucho de SQL, y estoy confundido, pero debe de ser facil anexar esa información. ya le agregue un indice a las dos tablas, un Id autonumerico.

    domingo, 21 de noviembre de 2010 20:46