Sintaxis correcta de una cadena de sql

Tengo este código:

Public Function AlEliminarUnConceptoTPV(FName As Form)
Dim rst As DAO.Recordset
Dim contador As Integer
contador = 1
Set rst = CurrentDb.OpenRecordset("SELECT Posicion, ID FROM T10TPVSubtabla WHERE CodigoTicket = '" & FName.CodigoTicket & "' ORDER BY ID")
If rst.RecordCount = 0 Then Exit Function
rst.MoveFirst
Do Until rst.EOF
    With rst
     .Edit
     !Posicion = contador
     .Update
     .MoveNext
     contador = contador + 1
    End With
Loop
rst.Close
Set rst = Nothing
End Function

que me gustaría generalizarlo para, con el mismo código, me sirva la misma función para utilizarlo en dos formularios distintos, pues solo varía en el nombre de la tabla y el nombre del código.

Para ello, estoy probando así:

Set rst = CurrentDb.OpenRecordset("SELECT Posicion, ID FROM " & Tabla & " WHERE CodigoPresupuesto = '" & Forms(Formulario).Controls(Codigo) & "' ORDER BY ID")

1. Mi problema viene con "Tabla", que la tengo declarada como string y me da error.

Public Function AlEliminarUnConcepto(FName As Form, Tabla As String, Formulario As String, Codigo As String)

En el formulario, llamo a la función de la siguiente manera:

    Call AlEliminarUnConcepto(Me, "T11PresupuestoSubtabla", "F11Presupuesto", "CodigoPresupuesto")

2. ¿Hay alguna otra manera de hacer referencia a un campo del subformulario, u otra manera más sencilla de simplificarlo? Es decir, si utilizo:

Forms(Formulario). Controls(Codigo)

En la llamada que hago desde el formulario, tengo que poner el nombre del formulario principal; porque si no el del subformulario, me da error.

1 respuesta

Respuesta
1

Te respondo a la primera: tanto al SQL que construyes al crear el recordset como la declaración del procedimiento, están correctas. Dices que te da error, pero no dices qué error ni en qué linea, por lo que, quizás, el error no esté donde dices que está...

Respecto a la segunda:

Forms(Formulario).Controls(ControlSubForm).Form.Controls(Control)

Donde:

Formulario sería una variable de texto que contiene el nombre del formulario principal

ControlSubForm sería el nombre del control que contiene al subformulario, no el nombre del formulario (pueden coincidir o no, depende de cómo lo hayas hecho)

Control sería el nombre del control del subformulario al que quieres hacer referencia

Si quieres usar la variable FName, así también te debería servir:

FName.Controls(ControlSubForm).Form.Controls(Control)

A ver. Vamos por partes.

1. Es cierto que no te he dicho el fallo. Entonces, si yo, en la función que te he puesto antes, la cambio en estas dos líneas a esto:

Public Function AlEliminarUnConceptoTPV(FName As Form, Tabla As String, Subform As String, Codigo As String)
[...]
Set rst = CurrentDb.OpenRecordset("SELECT Posicion, ID FROM " & Tabla & " WHERE " & Codigo & "= '" & FName.CodigoTicket & "' ORDER BY ID")

Me da este error:

Nota: sé que ese error se debe a "Tabla" porque si comento la línea activa donde establezco rst, y activo de abajo (idéntica salvo la introducción de "Tabla"), funciona.

2. Estoy probando lo que me has dicho de FName.Controls(ControlSubForm).Form.Controls(Control).

Para ello, no lo introduzco en la instrucción, sino que lo pruebo en un MsgBox para comprobar que me da un valor correcto.

Si pruebo con esto:

Public Function AlEliminarUnConceptoTPV(FName As Form, Tabla As String, Subform As String, Codigo As String)
[...]
MsgBox FName.Controls(Subform).Form.Controls(Codigo)

Supongo que ese "Subform" es el que tengo señalado en este imagen:

Entonces, me da el siguiente error:

En los dos casos, estoy llamando a la función desde el formulario así:

    Call AlEliminarUnConceptoTPV(Me, "T10TPV", "TPVSubformulario", "CodigoTicket")

¡Gracias!

Por más que lo intento no consigo que me dé el error de que faltan pocos parámetros: http://www.filebig.net/files/ArwZncEBEp

La única explicación posible que se me ocurre es que el control al que haces referencia en la parte derecha del WHERE (el valor por el que se ha de filtrar) esté vacío en el formulario o subformulario (no tengo claro dónde lo tienes situado)

En cuanto a la sintaxis del subformulario, funcionar funciona, como puedes ver en el ejemplo. No veo por qué a ti no

Estoy haciendo pruebas tomando como referencia lo que tú me has pasado.

El problema es que a veces coge el código y otras veces no. Este código es el que vincula el formulario principal con el subformulario. Aparece en el formulario principal en un campo, pero en el subformulario no hay ningún campo con ese código (está en la consulta de origen del subformulario). Mira, este es el formulario y el código es CodigoTicket:

Entonces, me doy cuenta de que no te he dicho en qué evento utilizo esta función: Después de confirmar la eliminación. Y creo que ahí radica el problema, que no coge correctamente el Codigo.

Ya tengo claro que "Tabla" lo coge correctamente.

¿Es posible que el evento en donde lo uso esté afectando a que coja el Codigo?

¡Gracias!

Para que entiendas lo que hace es código.

He realizado ya varias base de datos para hacer facturas, presupuestos y albaranes.

Entonces, es importante que se respete el orden de entrada de cada uno de los conceptos. Para ello, he añadido un campo Posicion. Cada vez que se añade un concepto, añade la posición. Pero, si se elimina un registro, tengo el código que pegue al principio para que vuelva a reordenar los conceptos.

Disculpa que vaya plasmando la duda en varias respuestas, pero a medida que me surge, lo voy escribiendo.

Entonces, para solucionar ese problema de que no coge bien el Codigo (CodigoTicket) del subformulario (porque cuando elimino, lo hago de un registro del subformulario), yo había pensado en coger el Codigo (CodigoTicket) del formulario padre, pero no soy capaz.

Por lo que dices, entiendo que el problema lo tienes en esta parte de la SQL del recordset:

 & FName. CodigoTicket & "' ORDER BY ID")

Si al procedimiento "AlEliminar..." lo llamas desde un evento del sunformulario, FName te cogerá el subformulario, y ahí tienes dos problemas: primero, que tu mismo dices que no existe el control CodigoTicket, y segundo, al hacerlo en el evento "después de confirmar la eliminación", es probable que el registro ya se haya eliminado y no tenga datos que coger.

Para hacer referencia al formulario "principal", usa FName. Parent. CodigoTicket

Lo acabo de arreglar. Te lo juro, es para matarme. ¿Sabes donde estaba el fallo? En el nombre que le estaba pasando de la tabla. Le decía "T10TPV", que es el padre, cuando es el hijo, osea, "T10TPVSubtabla".

Al final, queda así:

Set rst = CurrentDb.OpenRecordset("SELECT Posicion, ID FROM " & Tabla & " WHERE " & Codigo & "= '" & FName.Parent.Controls(Codigo) & "' ORDER BY ID")

Muchas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas