runsql run ejemplos ejecutar docmd consultas consulta sql vba access-vba ms-access-2010

run - Acceda a vba sql que coincida solo con uno



select sql access vba (1)

Tengo una mesa que tiene varios registros repetidos. Así que quiero tomar los que se repitieron dos veces y luego verificar si solo uno de ellos tiene un valor de -99 en la columna total, entonces si ambos tienen -99 los ignorará, pero si solo uno de ellos tiene, 99 que tomará los valores del segundo para calcularlos y asignar el resultado al que tiene -99.

--------------------------------------------- Name | N1 | N2 | ---------------------------------------------- A | 500 | 300 | ---------------------------------------------- A | 0 | **-99** | ---------------------------------------------- B | 60 | -99 | ---------------------------------------------- B | 77 | -99 | ---------------------------------------------- C | 0 | -99 | ---------------------------------------------- C | 15 | 100 | ---------------------------------------------- C | 30 | -9 | ----------------------------------------------

Por ejemplo, aquí ignorará B porque ambos tienen -99 AND C porque count = 3, pero para A actualizará la fila -99 a ser: 500-300 = 200

--------------------------------------------- Name | N1 | N2 | ---------------------------------------------- A | 500 | 300 | ---------------------------------------------- A | 0 | **200** | ----------------------------------------------

He hecho algo del código pero no sabía ho para completarlo:

Private Sub GET_TWO_COU() Dim COUs As Variant Dim p As Variant Dim sql As String Dim STR As New ADODB.Recordset sql = "SELECT DISTINCT NAME FROM STR_TBL" STR.Open sql, cnn, adOpenStatic STR.MoveLast STR.MoveFirst COUs = STR.GetRows(STR.RecordCount) STR.Close For Each p In COUs Q1 = "SELECT NAME FROM STR_TBL" STR.Open sql, cnn, adOpenStatic Do Until STR.EOF DoEvents sql = " UPDATE STR_TBL I" _ & "Set I.N2 = IIf(I.N2 = -99, DLookup(""N1 - N2"" ," _ & """STR_TBL"" , ''"[NAME] =''" & p & "'' AND N2<> -99""), N2)" _ & "WHERE I.[NAME] IN (SELECT I.[NAME] FROM STR_TBL I" _ & " GROUP BY I.[NAME] HAVING (Count(I.[NAME]) = 2)" _ & "AND (Min(I.N2) <> Max(I.N2))AND (Min(I.N2) = -99 OR Max(I.N2) = -99))" DoCmd.SetWarnings False DoCmd.RunSQL sql DoCmd.SetWarnings True STR.MoveNext Loop STR.Close NEXT End Sub

NOTA: CÓDIGO ACTUALIZADO

¡El otro problema es que agregará el mismo valor a todas las filas coincidentes! ¿Por qué es ese happing? ¿Estoy haciendo algo mal en mi loop?


Considere una solución SQL pura con una consulta de UPDATE matizada que incluye una subconsulta en la cláusula WHERE , un IIF() condicional y un agregado de dominio, DLookUp .

UPDATE myTable t SET t.N2 = IIF(t.N2 = -99, DLookUp("N1-N2", "myTable", "[Name]=''" & t.[Name] & "'' AND N2 <> -99"), N2) WHERE t.[Name] IN (SELECT t.[Name] FROM myTable t GROUP BY t.[Name] HAVING (Count(t.[Name]) = 2) AND (Min(t.N2) <> Max(t.N2)) AND (Min(t.N2) = -99 OR Max(t.N2) = -99))

Antes de la mesa

Name N1 N2 A 500 300 A 0 -99 B 60 -99 B 77 -99 C 0 -99 C 15 100 C 30 -9

Después de la mesa

Name N1 N2 A 500 300 A 0 200 B 60 -99 B 77 -99 C 0 -99 C 15 100 C 30 -9