Access - Numeración de columna hasta que cambie valor de otra

 
Vista:
sin imagen de perfil

Numeración de columna hasta que cambie valor de otra

Publicado por Dany (40 intervenciones) el 25/09/2015 20:00:36
Saludos cordiales a todos.

Tengo mi tablla llamada "Mitabla", en ella tengo los campos:
Ship Texto
Seq Numerico
Lead Codes Texto

En esta tabla tengo "X" cantidad de datos y el campo "Seq" lo tengo vacio, lo que quiero hacer es llenar el campo "Seq" con numeros consecutivos hasta que el valor del campo Ship cambie, o sea primeramente seria ordenar con una consulta SQL la tabla mas o menos asi:

rstSQL="SELECT * FROM MiTabla ORDER BY MiTabla.Ship, MiTabla.[Lead Codes] ASC"

Despues con un recordset actualizar el campo "Seq", tengo esta parte del recordset me falta controlar cuando el campo Ship cambia de valor. Este es el codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub mirsttest()
 
'Declaramos las variables
Dim dbs As DAO.Database
Dim rst As DAO.RecordSet
Dim strSQL As String
Dim i As Integer
 
'Definimos las variables
'strSQL = "SELECT FROM * MiTabla MiTabla.Ship, MiTabla.[Lead Codes] ORDER BY ASC;"' Esta parte no me la reconoce en el record set por eso abro
' la tabla directamente con Set rst = dbs.OpenRecordset("MiTabla", dbOpenDynaset)
 
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("MiTabla", dbOpenDynaset)
'Nos movemos al primer registro
rst.MoveFirst
'Hasta que no llegues al final del recordset, haz...
i = 0
Do Until rst.EOF
i = i + 1
With rst
'Do Until rst2.EOF
.Edit
.Fields(1).Value = i
.Update
End With
'Nos movemos al siguiente registro
rst.MoveNext
Loop
'Cerramos conexiones y liberamos memoria
rst.Close
dbs.Close
Set rst = Nothing
Set dbs = Nothing
 
End Sub

Edito agreo imagen ya que creo mi navegador distorciona los datos agregados abajo:

hwd2lt
Mi tabla originalmente esta asi:

Ship Seq Lead Codes
L7753862 L7753860
L2504987 L2504986
L7753820 L7753819
L7753862 L7753861
L2504987 L2504985
L7753820 L7753818

Quiero con el recordset dejarla asi:

Ship Seq Lead Codes
L2504987 1 L2504985
L2504987 2 L2504986
L7753862 1 L7753860
L7753862 2 L7753861
L7753820 1 L7753818
L7753820 2 L7753819

Lo que he conseguido hasta el momento es esto:

Ship Seq Lead Codes
L2504987 1 L2504985
L2504987 2 L2504986
L7753862 3 L7753860
L7753862 4 L7753861
L7753820 5 L7753818
L7753820 6 L7753819

Espero me halla explicado y puedan ayudarme se los agradezco de antemano.

Saludos

DS
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Numeración de columna hasta que cambie valor de otra

Publicado por Enrique Heliodoro (1664 intervenciones) el 25/09/2015 21:56:29
Elimina la variable 'DBS' (que no es necesaria dado que: su valor se puede asignar directamente y solo se hace una única vez) y en su lugar crea una para almacenar el 'valor actual' de Ship (o no podrás controlar cuando cambia).

Ya que te 'estas inventando' la SQL, un consejo:
.- Abre una nueva consulta
.- añade la tabla 'mi tabla' (supongo que el nombre es inventado)
.- selecciona UNICAMENTE los campos que vas utilizar (a los demás 'si los utilizas' les quitas la marca, cuanta menos 'paja' mejor funcionan las cosas)
.- Añade el orden que quieras
.- Ejecútala para ver si cumple con lo esperado
¿Ha cumplido?
.- No ==> verifica lo que has hecho volviendo al paso uno
.- SI ==> localiza en el menú lo 'vista SQL'
.- Copia el contexto, es una SQL correcta (que podrás comparar con la inventada) y utilizar en su lugar.

El Codigo (en mi versión):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim rst As DAO.RecordSet, i As Integer, Actual As String
Set rst = CurrentDb.OpenRecordset("aquí lo copiado de la consulta")
'Nos movemos al primer registro
If rst.RecordCount = 0 Then Exit Sub ' o lo que corresponda, si no hay registros ....
With rst
' por aquello de 'agítese antes de usar'
.Movelast
.MoveFirst
 
Do Until .Eof
    i = i + 1
    IF !Ship <> Actual Then i =1: Actual =!Ship
    .Edit
    !Seq = i
    .Update
    .MoveNext
    Loop
 
End With
rst.Close
Set rst = Nothing

No inicializo las variables, porque 'por defecto' las numéricas nacen a cero y las de texto con una cadena vacía
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Numeración de columna hasta que cambie valor de otra

Publicado por Dany (40 intervenciones) el 25/09/2015 22:40:49
Gracias por contester Enrique.

He realizado las correciones necesarias,y me esta arrojando el error 3027 que me indica que la BDD o el objeto es de solo lectura deteniendose el codigo en la linea:

.Edit

La consulta en vista SQL quedo asi:

SELECT Mitabla.Ship, Mitabla.[Lead Codes]
FROM Mitabla
GROUP BY Mitabla.Ship, Mitabla.[Lead Codes]
ORDER BY Mitabla.Ship, Mitabla.[Lead Codes];

Edito:

Haria falta un dbOpenTable o dbOpenDynaset en el RecordSet....?


Quite la variable "DBS", cual seria el error....?

Gracias de antemano

DS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Numeración de columna hasta que cambie valor de otra

Publicado por Enrique Heliodoro (1664 intervenciones) el 25/09/2015 23:28:52
Una consulta de selección NO ES LO MISMO que una de agrupación y me parece que agrupar lo que se ha de tratar de forma individual es tan absurdo como ponerle unos guantes a 'Eduardo manos tijeras'.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Numeración de columna hasta que cambie valor de otra

Publicado por Dany (40 intervenciones) el 26/09/2015 00:16:34
Gracias por tu aportación y disculpar mi error, funciona bien y el resultado es el esperado.

Muchas gracias Enrique.

Saludos

DS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar