varias unir una tablas solo sola relacion registros horizontalmente consultas consulta concatenar sql excel vba access-vba access

una - unir dos tablas sql server



Instrucción de unión interna condicional(VBA/SQL) para generar valores múltiples (2)

Soy bastante nuevo en VBA / SQL y estoy tratando de ejecutar una unión interna condicional.

Tengo dos tablas con una columna en común ("CRM" y "CodeCRM") y me gustaría obtener una dirección de correo electrónico de la tabla 2 ("Escritorios") cuando algo se desencadena (CodeBlocage = 101) en la tabla 1 ("Flux") para agregarlo a un correo electrónico automático.

Dim StrDestinataire As String Select Case Strtable Case "Flux", "GAFIJOUR" Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Y As String Dim sSql As String Set cn = CurrentProject.Connection sSql = "Select AddMailCRM from Desks Inner Join Flux on Desks.CODECRM = Flux.CRM WHERE Flux.CODEBLOCAGE = ''101''" Set rs = cn.Execute(sSql) If Not rs.BOF And Not rs.EOF Then Y = rs.Fields("AddMailCRM").Value End If StrDestinataire = Y cn.Close

Todo funciona bien, excepto que debería devolver más de un valor para la dirección de correo electrónico. ¿Alguna pista?

Gracias


Hay tres palabras clave que pueden causar confusión:

SELECCIONAR en sql

SELECT determina las columnas en el conjunto de registros resultante. Si su instrucción SQL es SELECT Name, Number FROM Employees , la parte SELECCIONAR le dice que el conjunto de registros resultante tendrá dos columnas llamadas Nombre y Número.

Seleccione Case en VBA

Select Case es una construcción de programación para condicionales. Lo usarías cuando no quieras usar un montón de declaraciones de If..ElseIf..Else, pero cualquier cosa que puedas hacer con If puedes hacer con Select Case.

Select Case A Case "Flux" Execute these VBA statements when the variable A = Flux Case "Capacitor" Execute these statements when A = Capacitor Case Else Execute these statements when A is neither Flux nor Capacitor End Select

CASO en sql

La palabra clave CASE en sql es como Select Case en VBA, pero se usa en la lista de campos de una instrucción SELECT sql (para uno).

SELECT Name, CASE WHEN Number = 1 THEN ''One'' ELSE ''Two'' END MyNum FROM Employees

Si ejecuta este conjunto de registros, obtendrá dos columnas (Nombre, MiNum). El campo MyNum contendrá el texto One cuando Número es 1 para ese registro y el texto Two si Número es cualquier cosa menos 1.

Conjuntos de registros

Tienes etiquetas Excel y Access, así que supongo que estás usando ADO en cualquiera de ellas. Su extracto

Y = Select email from table2 Inner Join table1 on table2.Crm = table1.Crm WHERE table1.Code = 1

No hace nada, no compilaría. Supongamos que desea que una variable, Y , contenga el correo electrónico que se devolvería si ejecutara ese enunciado sql.

Sub GetEmail() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Y As String Dim sSql As String Set cn = New ADODB.Connection cn.Open "MyConnectionStringGoesHere" sSql = "Select email from table2 Inner Join table1 on table2.Crm = table1.Crm WHERE table1.Code = 1" Set rs = cn.Execute(sSql) If Not rs.BOF And Not rs.EOF Then Y = rs.Fields("email").Value End If End Sub

En este caso, tengo que crear un conjunto de registros y ejecutar ese conjunto de registros para una determinada conexión. Presumiblemente, la cláusula join y WHERE asegura que solo devolverá un registro. Pero si devuelve más, este ejemplo solo usará el correo electrónico del primer registro.

Antes de tomar el valor del campo de correo electrónico, me aseguro de que el conjunto de registros devuelva al menos un registro. Si está al principio del archivo (BOF) y al final del archivo (EOF) al mismo tiempo, eso significa que no hay registros en el conjunto de registros.


Resuelto

Dim StrDestinataire As String Select Case Strtable Case "Flux", "GAFIJOUR" Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Y As String Dim sSql As String Set cn = CurrentProject.Connection sSql = "Select AddMailCRM from Desks Inner Join Flux on Desks.CODECRM = Flux.CRM WHERE Flux.CODEBLOCAGE = ''101''" Set rs = cn.Execute(sSql) If Not rs.BOF And Not rs.EOF Then Y = rs.Fields("AddMailCRM").Value End If StrDestinataire = Y cn.Close