Consulta SELECT entre una tabla y una consulta existente
ResueltoBiankaBo Mensajes publicados 71 Fecha de registro Estado Miembro Última intervención -
¡Hola a todos!!
¡Soy yo de nuevo!
Necesito ayuda con mi código SQL..
Creo que es imposible hacer una consulta SELECT con una unión entre una tabla y una consulta, ¿no?
Les pondré en contexto, tal vez no estoy procediendo de la manera correcta..
Tengo, por lo tanto, dos tablas adjuntas que contienen cada una una clave primaria que, en condiciones normales, se corresponden, excepto que su tipo de dato las disocia actualmente.
- La tabla 1 (dbo_GPM_N_FACT) contiene el campo [EMPR] en formato texto de 7 caracteres.
- La tabla 2 (dbo_GPM_E_ELE_DOSSIER) contiene el campo [FICHE] en formato numérico, por lo que el número de caracteres varía entre 1 y 7.
Aquí hay un ejemplo de las correspondencias posibles:
[EMPR] => [FICHE]
0001234 => 1234
0078956 => 78956
2145687 => 2145687
Entenderán, por lo tanto, que no soy capaz de establecer una relación entre los dos dado que su tipo de dato no es el mismo y que no puedo cambiar el tipo de los datos contenidos en una tabla adjunta (a menos que me equivoque).
Después de reflexionar, he creado la consulta A (07-01_GPI_SOLDE_ANN_DEM_RECH) a partir de la tabla 1 e inserté una columna calculada EMPR2: [EMPR]+0, lo cual transpone mis datos de formato texto a formato numérico y, por lo tanto, elimina los ceros al principio de los datos. Ahora [EMPR2] corresponde perfectamente a [FICHE]. Si creo manualmente una segunda consulta, o sea la consulta B, para unir mi consulta A a mi tabla 2 insertando una relación entre las columnas correspondientes, me da exactamente lo que necesito! ¡Genial!
Sin embargo, nunca es tan simple.
En lugar de crear mi consulta B manualmente, debo escribirla en SQL y aquí es donde ya no funciona. Pensaba que usar simplemente el código SQL de mi consulta adaptándolo al código VBA funcionaría, pero tengo la impresión de que no puedo hacer una consulta SELECT a partir de una consulta existente, ¿es cierto?
Aquí está mi código SQL no funcional a partir de mi consulta existente A (07-01_GPI_SOLDE_ANN_DEM_RECH) y de mi tabla 2 (dbo_GPM_E_ELE_DOSSIER):
Dim base As DAO.Database Dim enr As DAO.Recordset Dim SqlD As String Set base = CurrentDb SqlD = "SELECT [dbo_GPM_E_ELE_DOSSIER].[FICHE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[NOM], [dbo_GPM_E_ELE_DOSSIER].[PNOM], [07-01_GPI_SOLDE_ANN_DEM_RECH].[ANNEE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[SommeDeSOLDE]" & _ " FROM [dbo_GPM_E_ELE_DOSSIER] INNER JOIN [07-01_GPI_SOLDE_ANN_DEM_RECH] ON [dbo_GPM_E_ELE_DOSSIER].[FICHE] = [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR2]" & _ " WHERE ((([07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR]) " & strRechRef & ") AND (([dbo_GPM_E_ELE_DOSSIER].[NOM]) " & strRechNom & ") AND (([dbo_GPM_E_ELE_DOSSIER].[PNOM]) " & strRechPNom & "));" Set enr = base.OpenRecordset(SqlD)
Error de ejecución 3061 - Demasiados pocos parámetros 2 esperados en la línea: Set enr = base.OpenRecordset(SqlD)
He tratado de simplificar mi código para encontrar la fuente del problema eliminando mi condición WHERE, pero el resultado es el mismo. Por lo tanto, me deja creer que la consulta existente es el problema.
Aquí también está el código de mi consulta existente A por si acaso lo necesitan:
SELECT dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, Sum(dbo_GPM_N_FACT.SOLDE) AS SommeDeSOLDE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 AS EMPR2 FROM dbo_GPM_N_FACT GROUP BY dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 HAVING (((dbo_GPM_N_FACT.ECO)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) AND ((dbo_GPM_N_FACT.ANNEE)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) AND ((Sum(dbo_GPM_N_FACT.SOLDE))>0) AND ((dbo_GPM_N_FACT.STATUT_FACT)<>"X"));
¿Estoy en el buen camino o existe alguna solución milagrosa para todo esto?
¡Muchas gracias de nuevo!
3 respuestas
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención Ambassadeur 1 588
hola,
A primera vista, diría que te encuentras con una limitación que has encontrado recientemente:
No puedes usar en VBA una consulta que utiliza datos de un formulario.
No he (todavía) intentado entender tu lógica general. Así que no sé si estás en el camino correcto.
Suponiendo que estás en el camino correcto, puedes continuar reemplazando, en tu consulta B,
INNER JOIN [07-01_GPI_SOLDE_ANN_DEM_RECH]
por
INNER JOIN ( SELECT dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, Sum(dbo_GPM_N_FACT.SOLDE) AS SommeDeSOLDE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 AS EMPR2 FROM dbo_GPM_N_FACT GROUP BY dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 HAVING (((dbo_GPM_N_FACT.ECO)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) AND ((dbo_GPM_N_FACT.ANNEE)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) AND ((Sum(dbo_GPM_N_FACT.SOLDE))>0) AND ((dbo_GPM_N_FACT.STATUT_FACT)<>"X")) ) AS [07-01_GPI_SOLDE_ANN_DEM_RECH]
Lo que da, creo,
SqlD = "SELECT [dbo_GPM_E_ELE_DOSSIER].[FICHE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[NOM], [dbo_GPM_E_ELE_DOSSIER].[PNOM], [07-01_GPI_SOLDE_ANN_DEM_RECH].[ANNEE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[SommeDeSOLDE]" & _ " FROM [dbo_GPM_E_ELE_DOSSIER] INNER JOIN " & _ " ( SELECT dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, Sum(dbo_GPM_N_FACT.SOLDE) AS SommeDeSOLDE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 AS EMPR2 " & _ " FROM dbo_GPM_N_FACT " & _ " GROUP BY dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 " & _ " HAVING (((dbo_GPM_N_FACT.ECO)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) " & _ " AND ((dbo_GPM_N_FACT.ANNEE)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) " & _ " AND ((Sum(dbo_GPM_N_FACT.SOLDE))>0) AND ((dbo_GPM_N_FACT.STATUT_FACT)<>"X")) ) " & _ " as [07-01_GPI_SOLDE_ANN_DEM_RECH] ON [dbo_GPM_E_ELE_DOSSIER].[FICHE] = [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR2]" & _ " WHERE ((([07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR]) " & strRechRef & ") AND (([dbo_GPM_E_ELE_DOSSIER].[NOM]) " & strRechNom & ") AND (([dbo_GPM_E_ELE_DOSSIER].[PNOM]) " & strRechPNom & "));"
Luego, debes usar la técnica que conoces bien para "sacar" las dos utilizaciones del formulario de la consulta SQL y evaluarlas en VBA.
.
Estoy tratando de entender lo que quieres lograr, para ver si no es posible hacer todo esto de manera más simple.
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención Ambassadeur 1 588
Creo que puedes hacer una unión entre las dos tablas muy fácilmente, sin tocar el contenido de las tablas:
SELECT bnkb_empr.EMPR, bnkb_fiche.FICHE FROM bnkb_empr , bnkb_fiche where [EMPR]+0=FICHE;
Sin embargo, creo que esto no te ayudará realmente, ya que tu problema es el uso de los campos del formulario.
Quizás esto te ayude a simplificar tus consultas.
-
¡Síiiiiiiiiiiii!!!! ¡Es exactamente lo que necesitaba!
¡Funciona a la perfección!
¡Eres excelente! ¡Has entendido perfectamente mi solicitud!
Sabía que se podía hacer esto más sencillo y también sabía que me estaba embarcando en un camino conocido que me resulta difícil de comprender, así que estoy extremadamente contenta con tu respuesta.
Así que probé a pequeña escala tu condición WHERE propuesta arriba y una vez que vi que todo funcionaba como debía, agregué las otras columnas con sus condiciones. Así que se transformó en HAVING, ¡pero es exactamente la fórmula que responde a mi necesidad! Aquí está mi código SQL final:
SqlD = "SELECT [dbo_GPM_N_FACT].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[FICHE], [dbo_GPM_E_ELE_DOSSIER].[NOM], [dbo_GPM_E_ELE_DOSSIER].[PNOM], " & _ "[dbo_GPM_N_FACT].[ECO], [dbo_GPM_N_FACT].[ANNEE], Sum([dbo_GPM_N_FACT].[SOLDE]) AS [SommeDeSOLDE], [dbo_GPM_N_FACT].[STATUT_FACT]" & _ " FROM [dbo_GPM_N_FACT], [dbo_GPM_E_ELE_DOSSIER]" & _ " GROUP BY [dbo_GPM_N_FACT].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[FICHE], [EMPR]+0, [dbo_GPM_E_ELE_DOSSIER].[NOM], " & _ "[dbo_GPM_E_ELE_DOSSIER].[PNOM], [dbo_GPM_N_FACT].[ECO], [dbo_GPM_N_FACT].[ANNEE], [dbo_GPM_N_FACT].[STATUT_FACT]" & _ " HAVING ((([dbo_GPM_N_FACT].[EMPR]) " & strRechRef & ") AND (([EMPR]+0)=[FICHE]) AND (([dbo_GPM_E_ELE_DOSSIER].[NOM]) " & strRechNom & ") " & _ "AND (([dbo_GPM_E_ELE_DOSSIER].[PNOM]) " & strRechPNom & " ) AND (([dbo_GPM_N_FACT].[ECO])='" + CStr([Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) + "') AND (([dbo_GPM_N_FACT].[ANNEE])=" + CStr([Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) + ") AND " & _ "((Sum([dbo_GPM_N_FACT].[SOLDE]))>0) AND (([dbo_GPM_N_FACT].[STATUT_FACT])<>'X'));"
¡Muchísimas gracias por tu rapidez y talento!
¡Que tengas un buen día!