Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Consultas sql en access

Estas en el tema de Consultas sql en access en el foro de Bases de Datos General en Foros del Web. Buenos dias. Mi problema es el siguiente Tengo dos tablas, una con edificios y la provincia donde estan esos edificios (solo hay un edificio por ...
  #1 (permalink)  
Antiguo 07/08/2008, 04:25
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 15 años, 8 meses
Puntos: 0
Consultas sql en access

Buenos dias. Mi problema es el siguiente
Tengo dos tablas, una con edificios y la provincia donde estan esos edificios (solo hay un edificio por provincia) y otra con todas las poblaciones de españa y sus provincias.
EJEMPLO
edificios poblaciones

edificio1 MADRID Mostoles MADRID
edificio2 TOLEDO Amurrio ALAVA
edificio3 ZARAGOZA Los Angeles de San Rafael SEGOVIA

Luego tengo otra tabla de excepciones, que son algunos edificios de los de la tabla 1, con la misma información (despues los trataré de diferente manera)

ejemplo
EXCEPCIONES
edificio_excepcion1 TOLEDO
edificio_excepcion2 SEGOVIA

Tengo un formulario donde el usuario introduce la población y lo que quiero sacar de esa entrada es, primero la provincia de la población y así saber el edificio que le corresponde. Una vez que saque el edificio, ver, con un DCount si está en la tabla de excepciones.
Las consultas las hago así
prueba = "SELECT (provincia FROM poblaciones WHERE poblacion = '" & Me.Cuadro_combinado4 & "');"
prueba2 = "SELECT (edificio FROM edificios WHERE provincia = '" & prueba & "');"
cuenta=DCount("*", "excepciones", "edificio_excepciones='" & prueba2 & "'")
Se que algo estoy haciendo mal, pero no tengo claro el que, por favor, alguien me podría ayudar??? GRACIAS!!!
  #2 (permalink)  
Antiguo 07/08/2008, 06:22
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consultas sql en access

Si te he entendido bien tienes:

TablaEdificios
edificio
provincia

TablaPoblaciones
poblacion
provincia

TablaExcepciones
excepcion
provincia

Porque no usas lo siguiente

Código:
"Select TablaEdificios.edificio, " & _
     "TablaPoblaciones.provincia, " & _
     "sum(iif(TablaExcepciones.excepcion is null,0,1)) as cuenta " & _
"FROM (TablaPoblaciones LEFT JOIN TablaEdificios " & _
      "ON TablaPoblaciones.provincia=TablaEdificios.provincia) " & _
      "LEFT JOIN TablaExcepciones " & _
      "ON   TablaPoblaciones.provincia=TablaExcepciones.provincia " & _
"group by TablaEdificios.edificio, TablaPoblaciones.provincia  " & _
"HAVING TablaPoblaciones.poblacion = '" & Me.Cuadro_combinado4 & "';"
Y así lo tienes todo a la primera....

Si solo hay una excepción por provincia todo seria más facil si la pones en la tabla edificios...

TablaEdificios
edificio
excepcion
provincia

Código:
"Select TablaEdificios.edificio, " & _
     "TablaPoblaciones.provincia, " & _
     "TablaEdificios.excepcion " & _
"FROM (TablaPoblaciones LEFT JOIN TablaEdificios " & _
      "ON TablaPoblaciones.provincia=TablaEdificios.provincia) " & _
"WHERE TablaPoblaciones.poblacion = '" & Me.Cuadro_combinado4 & "';"




Quim

Última edición por quimfv; 07/08/2008 a las 06:35
  #3 (permalink)  
Antiguo 07/08/2008, 23:59
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Consultas sql en access

Juas, creo que no lo he entendido muy bien :D, eso funcionaria en mi código visual basic? (lo siento, soy un poco noob)
De todas maneras, creo que me he explicado mal. La tabla excepciones es un subconjunto de la tabla edificios (en la tabla edificios están todos los edificios y en la de excepciones solo unos pocos de esos edificios). Como solo hay un edificio por provincia lo que tengo que hacer es comprobar la provincia de la población introducida y ver si está en la tabla excepciones. Si está lanzo una consulta y sino lanzo otra.

Por cierto, para hacer la consulta, la hago a través de la edición del boton de un formulario. Tengo que usar DAO?? es decir, abrir la bd en el código? es que no lo hago

Muchas gracias

Última edición por s4rk4; 08/08/2008 a las 00:46
  #4 (permalink)  
Antiguo 08/08/2008, 01:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consultas sql en access

Siendo estrictos la tabla excepciones tiene que estar aparte como la planteas tu, puesto que así ahorra espacio, pero si tenemos en cuenta el numero de registros que vas a tener (+ o - 50), a veces es mejor desnormalizar puesto que nos facilita las cosas a la hora de programar. Si lo haces en dos tablas luego el campo excepcion tendra contenido o será nulo en funcion del edificio que se trate de ahí la utilizacion de espació inutil (el espaco reservado para el campo nulo) pero como te he dicho en este caso lo que se pierde es tan poco que compensa la simplificación del esquema, el campo podria ser boleano (true/false) y luego el espacio perdido será mínimo.

La ejecución de cualquiera de las dos consultas te dara tres datos, edificio, provincia, y excepción (este serà nulo o cero segun como lo hagas), luego no podrás asignar el resultado directamente a una variable tendrás que usar DAO o ADO (este es mas moderno) para crear un recordset y tratar los tres valores, una vez almacenados puedes hacer lo que quieras con ellos, mostrarlos o en función del su valor lanzar una consulta u otra como dices....

En cuanto a abrir la bbdd no tines mas remedio si quieres hacerle consultas...

Quim
  #5 (permalink)  
Antiguo 08/08/2008, 02:09
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Consultas sql en access

mira, te muestro las tablas para que te hagas una idea.

EDIFICIOS

Edificio provincia
Madrid MADRID
Avila AVILA
Segovia SEGOVIA
Santa Cruz TENERIFE
Salamanca SALAMANCA
Merida BADAJOZ
Toledo TOLEDO
Ciudad Real CIUDAD REAL
Caceres CACERES
Gran Canaria LAS PALMAS
Barcelona BARCELONA
Logrono LA RIOJA
Santander CANTABRIA
DONOSTIA GUIPUZCOA
Bilbao VIZCAYA
Vitoria ALAVA
Burgos BURGOS
Pamplona NAVARRA
Guadalajara GUADALAJARA
Almeria ALMERIA
Malaga MALAGA
Jaen JAEN
Sevilla SEVILLA
Jerez CADIZ
Cordoba CORDOBA
Granada GRANADA
Huelva HUELVA
Valencia VALENCIA
Castellon CASTELLON
Alicante ALICANTE
Albacete ALBACETE
Murcia MURCIA
Cuenca CUENCA
Palma MALLORCA
Girona GIRONA
Lleida LLEIDA
Huesca HUESCA
Soria SORIA
Zaragoza ZARAGOZA
Tarragona TARRAGONA
Teruel TERUEL
Palencia PALENCIA
Zamora ZAMORA
A Coruna A CORUÑA
Lugo LUGO
Valladolid VALLADOLID
Gijon GIJON
Vigo VIGO
Leon LEON
Orense ORENSE

EXCEPCIONES

EDIFICIO
PALENCIA
TOLEDO
HUESCA
TERUEL
JAEN
SORIA
LOGRONO
SEGOVIA
LUGO
CUENCA

Lo que tengo por el momento es ésto

Dim db As DAO.Database
Dim strSQL As String
Dim strSQL2 As String
Dim strCarpeta As String
Dim strBaseDatos As String
Dim strTabla1 As String
Dim strTabla2 As String

strCarpeta = CurrentProject.Path
strBaseDatos = strCarpeta & "\Cálculo_Alquiler.mdb"
strTabla1 = "poblaciones"
strTabla2 = "edificios"
Set db = OpenDatabase(strBaseDatos)


strSQL = "SELECT provincia FROM strTabla1 WHERE poblacion = '" & Me.Cuadro_combinado4 & "'; "
MsgBox strSQL
strSQL = "SELECT edificio FROM strTabla2 WHERE provincia = & strSQL &"


(El msgBox lo pongo para ver lo que se queda en strSQL, pero no se hace la consulta, porque no se hace la consulta?????)
  #6 (permalink)  
Antiguo 08/08/2008, 03:56
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Consultas sql en access

ya lo tengo!!!!! jejeje con el recorset. Ahora mi duda es como utilizar un recordset dentro de otra consulta de recordset, con " ", con ' ', con & & ... tengo

Set TLB = db.OpenRecordset("Select provincia FROM poblaciones WHERE poblacion = '" & Me.Cuadro_combinado4 & "'")


Set TLB2 = db.OpenRecordset("SELECT edificio FROM dirección_POPS WHERE provincia=' &TLB& ' ")

Pero me dice que "NO HAY NINGÚN REGISTRO ACTIVO" cuando debería de dar el resultado

Muchas gracias (tengo la sensacion que te estoy mareando un poco, sorry :D)
  #7 (permalink)  
Antiguo 08/08/2008, 04:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consultas sql en access

Mientras escribia este rollo veo que ya has encontrado una parte de la solución....

Esto es lo que te proponia...

EDIFICIOS

Edificio provincia Excepcion
Madrid MADRID 0
Avila AVILA 0
Segovia SEGOVIA 1
Santa Cruz TENERIFE 0
Salamanca SALAMANCA 0
Merida BADAJOZ 0
Toledo TOLEDO 1
Ciudad Real CIUDAD REAL 0
Caceres CACERES 0
Gran Canaria LAS PALMAS 0
Barcelona BARCELONA 0
Logrono LA RIOJA 0
Santander CANTABRIA 0
DONOSTIA GUIPUZCOA 0
Bilbao VIZCAYA 0
Vitoria ALAVA 0
Burgos BURGOS 0
Pamplona NAVARRA 0
Guadalajara GUADALAJARA 0
Almeria ALMERIA 0
Malaga MALAGA 0
Jaen JAEN 1
Sevilla SEVILLA 0
Jerez CADIZ 0
Cordoba CORDOBA 0
Granada GRANADA 0
Huelva HUELVA 0
Valencia VALENCIA 0
Castellon CASTELLON 0
Alicante ALICANTE 0
Albacete ALBACETE 0
Murcia MURCIA 0
Cuenca CUENCA 1
Palma MALLORCA 0
Girona GIRONA 0
Lleida LLEIDA 0
Huesca HUESCA 1
Soria SORIA 1
Zaragoza ZARAGOZA 0
Tarragona TARRAGONA 0
Teruel TERUEL 1
Palencia PALENCIA 1
Zamora ZAMORA 0
A Coruna A CORUÑA 0
Lugo LUGO 1
Valladolid VALLADOLID 0
Gijon GIJON 0
Vigo VIGO 0
Leon LEON 0
Orense ORENSE 0
Logroño LOGROÑO 1

Te faltaba Logroño...(creo)


A ver creo que tienes lagunas de base:

Primero yo no trabajaria con el nombre de la provincia como identificador, usaria una tabla

provincias
id_Prov Nombre
8 Barcelona
...

luego tanto edficios como poblaciones seria

Edificios
edificio id_prov excepcion
Barcelona 8 0
...

Poblaciones
Municipio id_Prv
Sabadell 8
....

Vamos a ver tu codigo


Dim db As DAO.Database 'Creas el objeto base de datos
Dim strSQL As String 'Creas una variable cadena de caracteres
Dim strSQL2 As String 'Creas una variable cadena de caracteres
Dim strCarpeta As String ' Idem
Dim strBaseDatos As String ' Idem
Dim strTabla1 As String ' Idem
Dim strTabla2 As String ' Idem



'Llenas con un valor las variables cadena
strCarpeta = CurrentProject.Path
strBaseDatos = strCarpeta & "\Cálculo_Alquiler.mdb"
strTabla1 = "poblaciones"
strTabla2 = "edificios"


'Le asignas al objeto base de datos su recurso
'C:\...loquesea...\Cálculo_Alquiler.mdb


Set db = OpenDatabase(strBaseDatos)

'Das valor a otra cadena de caracteres
strSQL = "SELECT provincia FROM strTabla1 WHERE poblacion = '" & Me.Cuadro_combinado4 & "'; "

'El MsgBox te muestra el contenido de strSQL una cadena de caracteres
'Supongamos que Me.Cuadro_combinado4 es igtual a Sabadell
'El resultado del MsgBox será:
'SELECT provincia FROM strTabla1 WHERE poblacion = 'Sabadell';
'cuando deberia ser
'SELECT provincia FROM poblaciones WHERE poblacion = 'Sabadell';


MsgBox strSQL

strSQL = "SELECT provincia FROM " & strTabla1 & " WHERE poblacion = '" & Me.Cuadro_combinado4 & "'; "

MsgBox strSQL 'Ahora?

strSQL = "SELECT edificio FROM strTabla2 WHERE provincia = & strSQL &"

'Si intentas aquí el MsgBox obtienes

'SELECT edificio FROM strTabla2 WHERE provincia = SELECT provincia FROM strTabla1 WHERE poblacion = 'Sabadell'

'Lo cual no tiene sentido



Cuando asignas un valor a una cadena de texto solo estas haciendo eso dar un valor al texto, si ese texto es o no una sentencia SQL al compilador le da igual puesto que tiene definida una variable de texto y le asignas un texto...

Por eso el MsgBox responde con la sentencia SQL en vez de Barcelona en el caso de Sabadell.

Tienes que decirle al programa que eso se puede ejecutar y que lo ejecute si no simplemente es un texto....

Mientras escribia este rollo veo que ya has encontrado una parte de la solución....

Ahora tu error es usar el objeto recordset como si fuera una variable normal


Intenta esto

Set TLB = db.OpenRecordset("Select provincia FROM poblaciones WHERE poblacion = '" & Me.Cuadro_combinado4 & "'")


Set TLB2 = db.OpenRecordset("SELECT edificio FROM dirección_POPS WHERE provincia=' & TLB!provincia & ' ")


o esto


strSQL="Select TablaEdificios.edificio, " & _
"TablaPoblaciones.provincia, " & _
"TablaEdificios.excepcion " & _
"FROM (TablaPoblaciones LEFT JOIN TablaEdificios " & _
"ON TablaPoblaciones.provincia=TablaEdificios.provinci a) " & _
"WHERE TablaPoblaciones.poblacion = '" & Me.Cuadro_combinado4 & "';"

Set TLB = db.OpenRecordset(strSQL)

MsgBox "Edificio " & TLB!edificio & " Provincia " & TLB!provincia & " Excepcion " & TLB!excepcion

Quim
  #8 (permalink)  
Antiguo 11/08/2008, 01:45
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Consultas sql en access

Tio, eres un crack!!! es justo lo que necesitaba. Te debo unas cañas e?? :D... muchas gracias!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:47.