** 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 Invertir el orden de clasificación
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11811
Enlace directo a este mensaje Tema: Referencias duplicadas
    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
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 745
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
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 745
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
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 745
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
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5833
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
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1228
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
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 745
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
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5833
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
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 745
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: 5833
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
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 745
Enlace directo a este mensaje 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
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable