** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Referencias duplicadas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoReferencias duplicadas

 Responder Responder
Autor
Mensaje
01loko Ver desplegable
Asiduo
Asiduo


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 452
Enlace directo a este mensaje Tema: Referencias duplicadas
    Enviado: 09/Marzo/2018 a las 17:17
Veamos fenomenos, que llego con otra cosa de estas raras que solo me pasan a mi:

Tengo una tabla "articulos" donde (por razones que desconozco, gracias a Dios no fui yo) alguien dejo que la referencia pudiera duplicarse.
Ahora pretendo separar las referencias de la siguiente manera:

que cuando encuentre una referencia repetida, la cambie por la ultima referencia usada +1 :

ejem:
Ref ant Articulo Ref nueva
1 melocoton 1
2 pimiento 2
3 berenjena 3
3 berenjena gorda 8
4 judia 4
5 tomate 5
5 tomate raff 9
5 tomate "pata negra" 10
6 fresa 6
7 melon 7
                           

Como siempre, solo pido una ayuda de por donde empezar  e igualmente daos las gracias
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 4703
Enlace directo a este mensaje Enviado: 09/Marzo/2018 a las 17:54
Hola!

Si no te importa el orden de los artículos, yo lo que haría es insertar un campo "Autonumérico" en la tabla y listo.
Un Saludo.
Arriba
01loko Ver desplegable
Asiduo
Asiduo


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 452
Enlace directo a este mensaje Enviado: 10/Marzo/2018 a las 17:12
Hola Mounir, gracias por contestar:

Lo cierto es que si que es importante guardar el maximo de referencias (que son cientos) ya que este campo relaciona con otra tabla (lineas factura) y no quisiera reconstruir de nuevo todo.


Recordar de que soy nuevo y estoy aprendiendo.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 4703
Enlace directo a este mensaje Enviado: 10/Marzo/2018 a las 17:54
Hola!

Ok, yo haría lo siguiente:

1- Insertas un campo en la tabla "artículos", si quieres que sea Autonumérico para que te asigna automáticamente la numeración.
2- En la tabla "Líneas Factura" insertas un campo Numérico "Id_Nuevo".
3- Creas una consulta de actualización que actualice "Id_Nuevo" con los valores del IdAutonuméricos de la tabla "Artículos" y en criterios debajo del campo Artículo de la tabla "Líneas Factura" pones =[Artículos].[Articulo] y debajo del campo Referencia de la tabla "Líneas Factura" pones =[Artículos].[Referencia anterior].

Resumen: Actualizar la segunda tabla con el nuevo campo de la primera tabla y con dos criterios. Espero no haberte liado.
Un Saludo.
Arriba
01loko Ver desplegable
Asiduo
Asiduo


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 452
Enlace directo a este mensaje Enviado: 12/Marzo/2018 a las 19:51

he llegado hasta aqui:

cuenta = 1
Dim rs As DAO.Recordset
Dim ms As DAO.Recordset
maximo = DMax("REFERENCIA", "Frutas") 'numero maximo de referencias
Set rs = CurrentDb.OpenRecordset("frutas")
If rs.RecordCount > 0 Then
Do While Not rs.EOF
If Not IsNull(rs!REFERENCIA) Then
'miro si la referencia ya esta en ref_nueva
ct = DCount([ref_nueva], "frutas", "ref_nueva= " & rs!REFERENCIA)

If ct > 0 Then 'si existe la referencia nueva es igual a la mas alta +1

stsql = ""
stsql = stsql & " UPDATE FRUTAS SET FRUTAS.ref_nueva "
stsql = stsql & "    = " & maximo + cuenta
stsql = stsql & " WHERE (((FRUTAS.id)=" & rs!id & ")); "
cuenta = cuenta + 1

Else ' si no existe la referencia nueva es igual a la antigua
stsql = ""
stsql = stsql & " UPDATE FRUTAS SET FRUTAS.ref_nueva "
stsql = stsql & "    = " & rs!REFERENCIA
stsql = stsql & " WHERE (((FRUTAS.id)=" & rs!id & ")); "


DoCmd.SetWarnings False
DoCmd.RunSQL stsql
DoCmd.SetWarnings True
End If
End If

 rs.MoveNext
 Loop
 rs.Close
End If


Pero los repetidos me los pone como "0"

Recordar de que soy nuevo y estoy aprendiendo.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 583
Enlace directo a este mensaje Enviado: 12/Marzo/2018 a las 20:46
Una aproximación:

Sub ActFrutas()
    Dim rst As DAO.Recordset
    Dim lngMax As Long
    Dim lngActual As Long
   
    'Referencia máxima
    lngMax = DMax("ref_ant", "FRUTAS")
   
    'Abrimos la tabla
    Set rst = CurrentDb.OpenRecordset("SELECT ref_ant, ref_nueva FROM FRUTAS ORDER BY ref_ant;")
   
    With rst
        'Mientras haya registros...
        Do While Not .EOF
            If .Fields("ref_ant") <> lngActual Then
                'Cambia la referencia -> actualizamos la referencia que usamos
                lngActual = .Fields("ref_ant")
               
                'Esto en teoría no hace falta, porque se supone que vamos a
                'actualizar el mismo campo. Pero en las pruebas viene bien
                'para ver lo que estamos haciendo
                .Edit
                .Fields("ref_nueva") = .Fields("ref_ant")
                .Update
            Else
                'No cambia la referencia -> la cambiamos
                lngMax = lngMax + 1
                'En teoría se va a actualizar el mismo campo. Pero en las pruebas
                'usamos 2 campos: cuando se vea que todo va bien, actualizamos el
                'bueno
                .Edit
                .Fields("ref_nueva") = lngMax
                .Update
            End If
           
            'Siguiente registro
            .MoveNext
        Loop
       
        'Cerrar la tabla
        .Close
    End With
   
    'Limpiar memoria
    Set rst = Nothing
End Sub

Se supone que en la tabla FRUTAS hay 2 campos: ref_ant y ref_nueva. En ref_ant están los códigos duplicados, y en ref_nueva se guardan los nuevos códigos.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 4703
Enlace directo a este mensaje Enviado: 12/Marzo/2018 a las 21:20
Hola!

No has intentado algo así:

UPDATE Articulos
INNER JOIN
ON Articulos.[Ref Anterior] = [Lineas Factura].IdAntiguo
SET [Lineas Factura].IdNuevo = Articulos.[Ref Nueva];


Creo que así valdría.
Un Saludo.
Arriba
01loko Ver desplegable
Asiduo
Asiduo


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 452
Enlace directo a este mensaje Enviado: 13/Marzo/2018 a las 20:47
he implementado la solucion de Pitxyku:
Sub ActFrutas()
    Dim rst As DAO.Recordset
    Dim lngMax As Long
    Dim lngActual As Long
   
    'Referencia máxima
    lngMax = DMax("ref_ant", "FRUTAS")
   
    'Abrimos la tabla
    Set rst = CurrentDb.OpenRecordset("SELECT ref_ant, ref_nueva FROM FRUTAS ORDER BY ref_ant;")
   
    With rst
        'Mientras haya registros...
        Do While Not .EOF
            If .Fields("ref_ant") <> lngActual Then
                'Cambia la referencia -> actualizamos la referencia que usamos
                lngActual = .Fields("ref_ant")
               
                'Esto en teoría no hace falta, porque se supone que vamos a
                'actualizar el mismo campo. Pero en las pruebas viene bien
                'para ver lo que estamos haciendo
                .Edit
                .Fields("ref_nueva") = .Fields("ref_ant")
                .Update
            Else
                'No cambia la referencia -> la cambiamos
                lngMax = lngMax + 1
                'En teoría se va a actualizar el mismo campo. Pero en las pruebas
                'usamos 2 campos: cuando se vea que todo va bien, actualizamos el
                'bueno
                .Edit
                .Fields("ref_nueva") = lngMax
                .Update
            End If
           
            'Siguiente registro
            .MoveNext
        Loop
       
        'Cerrar la tabla
        .Close
    End With
   
    'Limpiar memoria
    Set rst = Nothing
End Sub

funciona perfectamente, dejando la primera referencia encontrada renombrando las siguientes

La solucion de Mounir, que intente primero, si que funciona, pero me obligaba a cambiar todas las referencias (aunque es cierto que renombraba tambien las lineas de factura)
Gracias por la ayuda
Se puede cerrar el hilo


Editado por 01loko - 13/Marzo/2018 a las 20:47
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
01loko Ver desplegable
Asiduo
Asiduo


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 452
Enlace directo a este mensaje Enviado: 15/Marzo/2018 a las 22:00
como ya dije este hilo se puede cerrar, muchas gracias.Wink


Editado por 01loko - 16/Marzo/2018 a las 20:48
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
01loko Ver desplegable
Asiduo
Asiduo


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 452
Enlace directo a este mensaje Enviado: 17/Marzo/2018 a las 19:36
En vista de que meignorais Censored

Os lo repito, que luego me dice que tengo treintaytantosmiles de mensajes abiertos

Este hilo se puede cerrar Hug
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10269
Enlace directo a este mensaje Enviado: 18/Marzo/2018 a las 09:13
Ni te ignoramos, ni te censuramos, ni ..... 

Lo que pasa es que estamos todos de FINDE.  LOL



Editado por Mihura - 18/Marzo/2018 a las 09:13
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable