Asignar todos los valores de una columna como condición en SQL, ACCESS

Tengo una tabla llamada Big_table de la cual quiero cambiar los valores una columna siempre y cuando cumpla con tres condiciones las dos primeras cumple con los valores asignados, pero la tercera condición es tomar todos los valores de otra columna en otra tabla(Country_Sel) y no lo cumple. Por favor quizás me podrían ayudar .

Private Sub confirmed_Click()

On Error GoTo fehler
Dim Passwort As String
Dim j As Integer
Dim k As String
Dim l As String
Dim ma As String
Passwort = InputBox("Password?", "Passwort")
If Passwort <> "Vencon" Then Exit Sub
MsgBox "sigue"

j = InputBox("Que año", "year")
k = InputBox("que empresa", "empresa", "")
If StrPtr(k) = 0 Then Exit Sub

ma = "UPDATE Big_table SET Big_table.[Zustand]= 'Confirmed' WHERE Year=" & j & " AND [Empresa ]='" & k & "' AND Country= SELECT ALL from Country_Sel where Country is NOT NULL"
CurrentDb.Execute ma
fehler:
Exit Sub
End Sub

1 respuesta

Respuesta
2

Prueba con esta SQL:

ma = "UPDATE Big_table SET Big_table.[Zustand]= 'Confirmed' WHERE Year=" & j & " AND [Empresa ]='" & k & "' AND Country IN (SELECT Country from Country_Sel where Country is NOT NULL)"

Gracias Sveinbjorn por tu rápida respuesta,

Pero con IN no hace ningún cambio en la tabla igual que antes, es decir diría no toma los valores de la otra tabla como condición.

¿

Quizás tienes otra idea de como asignar todos los valores de una columna como condición sin tener que hacerlo uno por uno?

Si haces esta consulta:

SELECT Country from Country_Sel where Country is NOT NULL

¿te devuelve los valores que deseas?

Si es así, puedes añadir antes del ma="..." lo siguiente:

Dim rst as DAO.Recordset

Dim vCountries as String

Set rst=CurrentDB.OpenRecordset("SELECT Country from Country_Sel where Country is NOT NULL")

Do Until rst.EOF

vCountries=vCountries & "','" & rst(0)

rst.MoveNext

Loop

vCountries=Left(vCountries,len(vCountries)-2)

ma = "UPDATE Big_table SET Big_table.[Zustand]= 'Confirmed' WHERE Year=" & j & " AND [Empresa ]='" & k & "' AND Country IN ('" & vCountries & "')"

Esto suponiendo que Country sea un valor de texto en la tabla.

Muchas Gracias Sveinbjorn funciona muy bien!

No hay de qué, para eso estamos!

Hola Sveinbjörn,

disculpame pero tengo otra pregunta, bueno todo funcionaba bien hasta que le coloque otras variantes y ya no filtra , ni se actualiza, ni borra la tabla . Podrías darle un vistazo, de que es lo que estoy haciendo mal? muchas gracias

Private Sub confirmed_Click()

On Error GoTo fehler
Dim Passwort As String
Dim j As Integer
Dim k As String
Dim l As String
Dim ma As String

Passwort = InputBox("Password", "Passwort")
If Passwort <> "Vencon" Then Exit Sub
MsgBox "sigue"

j = InputBox("año", "year")
k = InputBox("Empresa", "Firm", "")
If StrPtr(k) = 0 Then Exit Sub
DoCmd.Close acForm, "import2"
DoCmd.OpenForm "Multi-Country", acNormal, "", "", , acNormal

ma = "UPDATE Big_table SET Big_table.[Zustand]= 'Confirmed' WHERE Jahr=" & j & " AND [Firm ]='" & k & "' AND Country IN (SELECT Country FROM Country_Sel WHERE Country is NOT NULL)"
CurrentDb.Execute ma

DoCmd.DeleteObject acTable, "Country_Sel"
Me.Big.Requery

Muchas Gracias

No te sigo. El código que pones viene a ser similar a la primera opción que te propuse y que decías que no funcionaba (la de WHERE Country IN SELECT...)

Además, en la SQL no veo que añadieses otras variables, sólo cambiaste los nombres de las que usas (Jahr en vez de Year y Firm en vez de empresa).

También veo que borras la tabla Contry_sel. Ignoro si en algún otro momento la creas, pero si no es así, el código sólo te funcionará una vez, pues si no hay tabla nunca se cumplirá la condición del Country In...

Y para acabar con mi "análisis", tampoco entiendo a qué vienen las lineas de cerrar y abrir los formularios "import2" y "Multi-country"

Hi Sveinbjörn,

Bueno si discúlpame, me exprese mal con lo de las variables, lo que pasa es que trato de hacer un formulario multi-country en el cual seleccionas varios países a la vez, crea una tabla llamada Country_Sel y guarda los países seleccionados. Luego en otro Formulario Import2 filtra los datos bajo diferentes criterios como Empresa, año y los diferentes países seleccionados y guardados en Country_Sel son utilizados. Luego de ello deseo eliminar la tabla Country_Sel, para que cada vez se utilice se cree una nueva tabla con lista de países seleccionados.

Pero lo que pasa es que ahora no borra la tabla y cambia el valor a confirmed, solo si es que hago la selección dos o tres veces veces seguidas.

A continuación te mando el otro código de Multi-country:

Muchas gracias por tomarte el tiempo.

Private Sub CountrySel_Click()
Dim varItem As Variant
Dim strCountryList As String
Dim strCriteria As String
Dim ctrl As Control
Dim m As TableDef
Dim db As DAO.Database
Set db = CurrentDb
Set m = db.CreateTableDef("Country_Sel")
With m
.Fields.Append .CreateField("Country", dbText, 50)
End With
db.TableDefs.Append m
Set ctrl = Me.Listcountry
If ctrl.ItemsSelected.Count > 0 Then
For Each varItem In ctrl.ItemsSelected
CurrentDb.Execute ("insert into Country_Sel(Country) values ('" & Listcountry.Column(0, varItem) & "')")
Next varItem
End If
DoCmd.OpenForm "import2", acNormal, "", "", , acNormal
DoCmd.Close acForm, "Multi-Country"
End Sub

Vale, el problema es que tienes que parar la ejecución del código para crear la tabla Country_Sel.

Como la creas desde el formulario Multi-Country, este lo has de abrir como acDialog en vez de acNormal, para que se detenga el código de confirmed_Click() hasta que cierres el formulario Multi-country (y crees por tanto la tabla)

DoCmd. OpenForm "Multi-Country", acNormal, "", "",, acDialog

Además, te diría que la SQL la construyas con la opción del recordset para encadenar los valores de los paises.

Gracias Sveinbjörn,

Ya cambie el código a acdialog y logra crear y borrar la tabla. Ahora solo el cambio de hacia confirmed, recién se realiza después que hago dos veces el filtro. ¿Qué cosa crees podría cambiar para que el valor a confirmed inmediatamente cambie y no hacerlo dos veces?

¿Por qué crees que es mejor encadenarlo con recordset?

Me he dado cuenta que no es necesario hacer dos veces el filtro, para que pueda filtrarlo bajo los criterios , sino que cuando se intenta  en la segunda vez al cambiar de un formulario a otro ya lo filtra. Que creen que debería hacer , te estaría muy agradecido.

Imagino que tu "problema" de actualización viene porque no actualizas el formulario una vez aplicas la consulta de actualización. Prueba añadiendo la linea Me. Requery después del CurrentDb.Execute...

Yo no creo que sea mejor usar el recordset que la sintaxis WHERE Country IN SELECT..., sólo te lo comentaba porque habías dicho que así no te funcionaba, nada más. Son las dos formas válidas de hacer lo mismo, quédate con la que más te guste o mejor entiendas, para poder usarla en un futuro.

¡Gracias! Sveinbjörn,

Por el tiempo que te tomaste, Ya había probado con me.requery, docmd.refresh pero ninguna de las dos funciones actualizaban, luego me di cuenta que después de haber ingresado los datos para el primer intento de filtro al abrir y cerrar el formulario se actualizaba, así que hice que se abriera y se cerrara el formulario en vba y se actualiza justo después de ingresar los datos. Se que no es el método más elegante pero funciona. Muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas