Access - Recordset nombre de campo variable

 
Vista:
sin imagen de perfil
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Recordset nombre de campo variable

Publicado por Pablo (328 intervenciones) el 04/09/2022 13:21:48
Hola a todos:
Tengo un recordset (rst) con un sólo campo (campo1), este recordset lo creo con una sql (select campo from tabla order by campo), que construyo con dos c de t,:txttabla y txtcampo, que pregunto antes. Lo que quiero hacer es saber lo que está en el campo1, rst!txtcampo, probé a poner rst! & txtcampo y no funciona, a la hora de construir la sql sí, ¿alguien sabe como se soluciona este problema?
Gracias
Pablo
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

Recordset nombre de campo variable

Publicado por Anonimo (3316 intervenciones) el 04/09/2022 15:25:46
Si el campo en la Select se le denomina 'CAMPO' ¿de donde sale 'CAMPO1'?

Si la SQL se crea en tiempo de ejecución preguntado que campo y tabla se utilizaran, para que el campo se llame 'CAMPO1' (independiente de su nombre real), seria una SQL con esta sintaxis:
select campo AS Campo1 from tabla order by Campo1

Quiero suponer que se construye algo así:
Un cuadro de texto para el campo (El_Campo), otro para la tabla (LA_TABLA) y con ellos esta SQL:

Dim MiSql as String, Rs As DAO.REcorset
MiSql = "Select " & Me.El_Campo & " FROM " & Me.LA_TABLA & " order by " & Me.El_Campo

Asignamos origen de datos al recorset:
Set Rs = CurrentDb.OpenRecordset (MiSql)

¿Cual es el campo original utilizado?:
MsgBox Rs.Fields(0).Name (el primer campo y en este caso único de la tabla es el cero, detrás vendrán el uno, dos, tres ....)

¿Qué valor contiene ese campo?:
MsgBox Rs.Fields(0).Value

Si la respuesta no se corresponde con la inquietud, para poder interpretarla necesitaría mas datos
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
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Recordset nombre de campo variable

Publicado por Pablo (328 intervenciones) el 05/09/2022 18:35:42
Hola Anónimo
Trataré de ser más claro. Quiero saber qué números faltan en el campo codigo(entero) de una tabla. En un formulario tengo 2 cuadros de texto: txttabla y txtcampo. Construyo la sql y el recordset con sql="select " & txtcampo & " from " & txttabla & " order by " & txtcampo & "", después: set rst=currentdb.openrecordset(sql)
Do while rst.eof=false
- - - - -
codigo_anterior=rst!codigo_muestra
rst.movenext
codigo_actual= rst!codigo_muestra
si la diferencia de códigos es >1 then me meto en un For Next que pinta las falta correctamente en un cuadro de texto
Loop
Puse un punto de interrupción en codigo_anterior... y en la ventana inmediato tengo
?rst!codigo_muestra
69
?txtcampo
codigo_muestra
?rst&txtcampo->El caracter de declaración no coincide con el tipo de datos indicado
Cómo concateno rst! y txtcampo?
Espero haber sido claro en la exposición, no queda un poco larga de más?
También tengo problemas con el eof, puedo cambiar el while rst.eof=false al loop?, también se me ocurre en vez de while poner until
Gracias
Pablo
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

Recordset nombre de campo variable

Publicado por Anonimo (3316 intervenciones) el 05/09/2022 22:27:48
Creo que intentando sujetar mas fuerte, has aflojado una vuelta.

La Sql parece que da el resultado que necesitabas y puedes acceder a un conjunto cualquiera de tabla + campo

La segunda parte es recorrerlo y verificar si hay huecos en un correlativo ascendente, si los hay, con un bucle se envían a un cuadro de texto

Lo que se desea es obtener el nombre del campo y el valor que contiene para enviarlo al cuadro de texto, seria algo como:

Me.ElCuadroDeTexto = Me.ElCuadroDeTexto & VbCrLF & txtcampo & "-----") & rst!codigo_muestra

Si lo que buscas es rellenar los huecos, te ofrezco esta función para que la adaptes a tu entorno.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Function rellenar(mCampo As String, mTabla As String)
Dim Anterior As Long, Tbl_Temp As DAO.Recordset, BUcle As Long
Set Tbl_Temp = CurrentDb.OpenRecordset("select " & mCampo & " From " & mTabla & " order by " & mCampo)
With Tbl_Temp
.MoveFirst
Anterior = .Fields(0).Value
.MoveNext
Do Until .EOF
    If .Fields(0).Value < Anterior Then Exit Do
    If .Fields(0).Value - Anterior > 1 Then
       For BUcle = Anterior + 1 To .Fields(0).Value - 1
       .AddNew
       .Fields(0) = BUcle
       .Update
       Next BUcle
       End If
    Anterior = .Fields(0)
    .MoveNext
    Loop
.Close
Set Tbl_Temp = Nothing
End With
End Function

en la ventana de inmediato ....
?rellenar("codigo_muestra","tabla2")

En esta linea:

1
If .Fields(0).Value < Anterior Then Exit Do
Se detecta la entrada en un bucle (se esta manipulando el recordset activo)
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
Imágen de perfil de Eduardo

Recordset nombre de campo variable

Publicado por Eduardo (317 intervenciones) el 05/09/2022 22:36:16
Le dejo este ejemplo con una función que recibe 2 parámetros, el nombre de la tabla y el nombre del campo

falta_nros_01


Observe que faltan los codigo 3,4,6,8,10,11


falta_nros_02

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
Function faltanros(strTabla As String, strCampo As String)
 
    Dim rst As DAO.Recordset
    Dim num As Integer
    Dim flag As Boolean
    Dim dbID As Long
    Dim strFaltan As String
    Dim strSQL  As String
 
    strSQL = "SELECT " & strCampo & " FROM " & strTabla & " ORDER BY " & strCampo & ""
 
    Set rst = CurrentDb.OpenRecordset(strSQL)
 
    For num = 1 To DMax(strCampo, strTabla)
        flag = False
        Do While Not rst.EOF
            dbID = rst(0)
            If dbID = num Then
                flag = True
            End If
            rst.MoveNext
        Loop
        If flag = False Then
            strFaltan = strFaltan & num & ","
        End If
        rst.MoveFirst
    Next
 
    MsgBox Mid(strFaltan, 1, Len(strFaltan) - 1), vbInformation, "Faltantes"
 
End Function

Puede cambiar la función para que retorne una cadena y suprimir el MsgBox, para asignar el texto devuelto a un control
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
Imágen de perfil de Eduardo

Recordset nombre de campo variable

Publicado por Eduardo (317 intervenciones) el 06/09/2022 16:30:59
Le dejo esta función más completa, permite registrar en una tabla los faltantes o adicionar en la tabla principal los números o solo ver por pantalla los faltantes.


falta_nros_01

FORMULARIO


falta_nros_formulario

CÓDIGO DEL FORMULARIO

1
2
3
4
5
6
7
8
9
10
Option Compare Database
Option Explicit
 
Private Sub btnFaltan_Click()
  Call completanros(Me.txttabla, Me.txtcampo, Nz(Me.opc_adiciona), Nz(Me.opc_completar))
End Sub
 
Private Sub btnSalir_Click()
  DoCmd.Close acForm, Me.Name
End Sub

CÓDIGO DE LA NUEVA FUNCIÓN

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
Public Function completanros(strTabla As String, strCampo As String, _
Optional bool_entabla As Boolean, Optional bool_completar As Boolean)
 
'Función determinar números faltantes en una serie
'Elaborada por: EDUARDO PÉREZ FERNÁNDEZ
'Versión; 1.0
'Fecha: 08/09/2022
'Parámetros:
'           strTabla           ---> Nombre de la tabla
'           strCampo           ---> Nombre de la tabla que contiene la serie
'           bool_entabla       ---> Opcional, True, guarda los faltantes en tblfaltantes
'           bool_completar     ---> Opcional, True, Adicionar los faltantes en strTabla
 
'Ejemplos de llamada:
 
'    1. Obtener por pantalla los números faltantes
'                   completanros("tblrecibos2","codigo",False,False) o
'                   completanros("tblrecibos2","codigo")
'    2. Adicionar en la tabla tblfaltantes los números que faltan en las serie
'                   completanros("tblrecibos2","codigo",True,False) o
'                   completanros("tblrecibos2","codigo",True)
'    3. Adicionar en la tabla tblfaltantes y en strTabla los números que faltan en las serie
'                   completanros("tblrecibos2","codigo",True,True)
'    4. Adicionar en la tabla strTabla los números que faltan en las serie
'                   completanros("tblrecibos2","codigo",False,True) o
'                   completanros("tblrecibos2","codigo",,True)
 
On Error GoTo hay_error
 
    Dim rst As DAO.Recordset
    Dim num As Integer
    Dim flag As Boolean
    Dim dbID As Long
    Dim strFaltan As String
    Dim strSQL  As String
 
 
    CurrentDb.Execute "DELETE FROM tblfaltantes"
 
    strSQL = "SELECT " & strCampo & " FROM " & strTabla & " ORDER BY " & strCampo & ""
 
    Set rst = CurrentDb.OpenRecordset(strSQL)
 
    For num = 1 To DMax(strCampo, strTabla)
        flag = False
        Do While Not rst.EOF
            dbID = rst(0)
            If dbID = num Then
                flag = True
                Exit Do
            End If
            rst.MoveNext
        Loop
        If flag = False Then
          If bool_entabla Then
            CurrentDb.Execute "INSERT INTO tblfaltantes(faltante) VALUES(" & num & ")"
          End If
          If bool_completar Then
            rst.AddNew
            rst(0) = num
            rst.Update
          End If
            strFaltan = strFaltan & num & ","
        End If
        rst.MoveFirst
    Next
 
    rst.Close
    Set rst = Nothing
 
     If Len(strFaltan) = 0 Then
       MsgBox "No faltan números en la serie", vbInformation, "Faltantes"
       Exit Function
     End If
 
 
    If bool_entabla = False And bool_completar = False Then
        If Len(strFaltan) > 0 Then
          MsgBox Mid(strFaltan, 1, Len(strFaltan) - 1), vbInformation, "Faltantes"
        End If
    ElseIf bool_entabla = True And bool_completar = False And Len(strFaltan) > 0 Then
        MsgBox "Se adicionaron los faltantes en la tabla tblfaltantes", vbInformation, "Faltantes"
    ElseIf bool_entabla = False And bool_completar = True And Len(strFaltan) > 0 Then
        MsgBox "Se adicionaron los faltantes en la tabla " & strTabla, vbInformation, "Faltantes"
    Else
       MsgBox "Se adicionaron los faltantes en las tablas tblfaltantes y " & strTabla, vbInformation, "Faltantes"
    End If
 
 
 
hay_error_exit:
 Exit Function
 
 
hay_error:
   MsgBox "Ocurrió el error " & Err.Number & vbCrLf & vbCrLf & Err.Description, vbCritical, "Error..."
   Resume hay_error_exit
 
 
End Function

TABLA FALTANTES

falta_nros_001

Si quiere el ejemplo lo puede solicitar a [email protected]
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
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Recordset nombre de campo variable

Publicado por Pablo (328 intervenciones) el 06/09/2022 18:29:07
Hola
Private Sub buscar_Click()
Dim codigo_anterior As Integer
Dim codigo_actual As Integer
Dim codigo_maximo As Integer
Dim codigo_minimo As Integer
Dim registros As Integer: registros = 0
Dim diferencia As Integer
Dim sql As String
Dim rst As DAO.Recordset
sql = "select " & txtcampo & " from " & txttabla & " order by " & txtcampo & ""
Set rst = CurrentDb.OpenRecordset(sql)
rst.MoveLast: codigo_maximo = rst.Fields(0)
rst.MoveFirst: codigo_minimo = rst.Fields(0)
'buscar las faltas
Do
Dim i As Integer: i = 1
Dim j As Integer
codigo_anterior = rst.Fields(0)
registros = registros + 1
rst.MoveNext
codigo_actual = rst.Fields(0)
If (codigo_actual - codigo_anterior) > 1 Then '=>hay salto
For j = 1 To codigo_actual - codigo_anterior - 1
txtfaltan = txtfaltan & codigo_anterior + j & ", "
Next j
End If
Loop Until rst.EOF <> False
rst.Close
Set rst = Nothing
End Sub
Hice una copia-pega del programa que tengo en otro ordenador que no se conecta a internet, con rst.Fields(0) tengo solucionado el primer problema, ahora me falta el segungo: que cuando acabe(EOF=true?) salga del bucle.
Supongo que rst.EOF<>False es lo mismo que rst.EOF=true, no?
Gracias
Pablo
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
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Recordset nombre de campo variable

Publicado por Pablo (328 intervenciones) el 06/09/2022 19:16:49
Hola otra vez
Al final solucioné el tema cambiando la instrucicón: codigo_actual=rst,Fields(0) por: If rst.EOF=False then codigo_actual=rst,Fields(0)
Tema solucionado, se puede cerrar
Gracias
Pablo
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
Imágen de perfil de Eduardo

Recordset nombre de campo variable

Publicado por Eduardo (317 intervenciones) el 06/09/2022 19:23:24
Es decir el aporte de Animo y el mio de nada le sirvio. Tenga cuidado con el número máximo de caracteres a almacenar en txtfaltan, igualmente, cuando la tabla es de gran tamaño, por ejemplo, 500 mil registros.

Lo importante es que lo ha solucionado.
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

Recordset nombre de campo variable

Publicado por Anonimo (3316 intervenciones) el 06/09/2022 20:35:59
El fin del bucle lo define la condición que se le imponga.

Suelo aplicar la condición al inicio :

1
Do Until .EOF

(Sin el With seria: Do Until Tbl_Temp .EOF, traducido: continúa hasta llegar al final del conjunto de datos)

Si no se añaden nuevos registros finalizara al llegar al final del conjunto

Si se añaden registros, estos se añadirán al final del conjunto inicial y cuando finalice el conjunto inicial habrá dos posibilidades:
.- Que no se encontrasen huecos (y se alcanza el EOF)
.- O que tras el último de los iniciales comiencen los nuevos insertados (su valor siempre será inferior al ultimo de los iniciales) por lo que se cumple:

1
If .Fields(0).Value < Anterior Then Exit Do

Razonado: si el valor del anterior (que es el ultimo de los iniciales y el mas alto del conjunto) es superior al actual (que es el primero de los insertados y por ello su valor es inferior) aborta el bucle (Exit Do).

El bucle tendrá en todo caso el menor numero de iteraciones (una por cada elemento de los iniciales y otra por cada uno de los creados para rellenar el hueco).

En mi ejemplo añado en tiempo de ejecución los registros que faltan, puede hacerse otra cosa tal como tomar nota de el y al no añadir datos en el recordset activo sobra la línea antes comentada.
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
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Recordset nombre de campo variable

Publicado por Pablo (328 intervenciones) el 06/09/2022 22:00:03
Hacia Do while rst.eof=False
codigo_anterior=rst!codigo_muestra
rst.MoveNext
codigo_actual=rst!codigo_muestra->Aqui es donde daba el error por eso puse el if then
Cuando estoy en el último registro EOF es false, no?
Cuando le digo que se mueva al siguiente EOF es true,no?
No hay ninguna instrucción para saber si estoy en el último registro?
Gracias
Pablo
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
Imágen de perfil de Eduardo

Recordset nombre de campo variable

Publicado por Eduardo (317 intervenciones) el 06/09/2022 22:31:43
Pablo, con todo respeto como lo hace no es la forma de programar y no es por imponer, siga el ejemplo que le explico.
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

Recordset nombre de campo variable

Publicado por Anonimo (3316 intervenciones) el 07/09/2022 01:59:29
Un Recordset activa sus propiedades BOF y EOF cuando alcanza (o esta) 'antes' del primer registro o 'después' del último registro.

En un Recordset vacío, se da la circunstancia de que ambas propiedades (BOF y EOF) están activas....

Ese estado o propiedad no es la de ningún registro, es la de todo el conjunto de registros (estén ordenados o desordenados, sean sus registros del tipo que sean y tengan los valores que tengan).

Por asociación, se podría decir que esas propiedades son 'las tapas del libro' (las hojas los registros).

Cuando estoy en el último registro EOF es false, no?
Si, porque 'aun' está en un registro, un MoveNext más (no dará error, está en la tapa posterior) y la propiedad EOF (del Recordset) activada (EOF= TRUE)

No hay ninguna instrucción para saber si estoy en el último registro?
SI, pero con condiciones.

En cuanto se asigna un origen de datos a un Recordset no se cargan todos su contenido, solo se inicia y aun no 'sabe' cuantos registros tiene.

Sabe que tiene registros, porque su propiedad 'AbsolutePosition' no es (-1, valor imposible), si tiene registros (no importa cuántos) normalmente dará cero (el primero), su propiedad 'RecordCount' no es fiable (aún).

Si 'agitamos' el Recordset (MoveLast) la propiedad RecordCount ya es fiel y 'AbsolutePosition' (que comienza en cero) será igual a (RecordCount - 1).

Abrimos un Recordset, verificamos que tiene registros y si los tiene 'agitamos' el Recordset (lo mas habitual es un MoveLast seguido de un MoveFirst) y todas sus propiedades serán fieles.

En estas condiciones (con el Recordset bajo control) para saber si estamos en el último registro de ese conjunto basta comparar el actual con la cuenta de registros menos uno, si son iguales la conclusión es:
SI, estamos en el último pues se cumple Rs.AbsolutePosition = Rs.RecordCount -1
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
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Recordset nombre de campo variable

Publicado por Pablo (328 intervenciones) el 09/09/2022 14:54:18
No conocía absoluteposition, y por aquello de q la igualas a recordcount-1 supongo q empieza desde 0 no desde1
Gracias
Un saludo
Pablo
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