** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Ancestros
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Ancestros

 Responder Responder
Autor
Mensaje
feraku Ver desplegable
Nuevo
Nuevo


Unido: 18/Marzo/2013
Estado: Sin conexión
Puntos: 19
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita feraku Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Ancestros
    Enviado: 01/Diciembre/2018 a las 10:00
Buenos días
Tengo una tabla que replesenta una seria de poligonos.
Estos poligonos pueden estar dividisos o no en otros más pequeños, para ello dentro de cada poligono hay un campo de marca su ID dentro del poligono y otro campo que representa sus ancestros
Lo que me gustaría es quitar todos los registros que tienen ancestros, es decir dejar solo los poligonos individuales sin ninguno que haga de contenedor.
Llevo una semana dandole vueltas y no se me ocurre como, gracias
Subo una pequeña parte de la base de datos
https://drive.google.com/file/d/1ecw5aZbIE7c8gD4cLizpWBDcI4V5s2Mf/view?usp=sharing

Gracias
Arriba
prga Ver desplegable
Moderador
Moderador


Unido: 16/Noviembre/2004
Localización: España
Estado: Sin conexión
Puntos: 3059
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita prga Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 01/Diciembre/2018 a las 11:25
Hola.
La verdad es que estoy un poco espeso, pero he leído y visto la tabla y no me acabo de enterar lo que se intenta solucionar.
Veamos sí acierto: Tendríamos que dejar los registros Id_Polygon que no están mencionados en los  Inter_ance correspondientes a ese Id_polygon, considerando que 1,3 se refiere al 1 y al 3, o de otra forma, quedarían los id_polygon----inter_id que sumando sus porcentajes diesen 100
¿Es así?
Ya comentas.
Un saludo a todos
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10485
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 01/Diciembre/2018 a las 12:24
¿Borrando todos los registros que no tengan ID?
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
feraku Ver desplegable
Nuevo
Nuevo


Unido: 18/Marzo/2013
Estado: Sin conexión
Puntos: 19
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita feraku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 01/Diciembre/2018 a las 13:55
Buenas, gracias por vuestra respuesta
Mihura si borrase los registros que no tengan inter_ance no me valdría ya que eleminiaria registros que no tienen "hijo"
prga: "..quedarían los id_polygon----inter_id que sumando sus porcentajes diesen 100." correcto.
Os lo digo con un ejemplo:
Parcela 00008cf0-f0bc-4faf-adfc-9815d7bcc82e, tiene 7 registros, el primero corresponde a la parcela entera y tiene por lo tango de INTER_ID el valor de 1, esa parcela esta dividida, la primera division tiene de valor INTER_ID=2, y de INTER_ANCE = 1 (al ser hija de la parcela 1), este registro a su vez se divide en dos que tienen de INTER_ID los valores de 3 y 4 respectivamente y de INTER_ANCE = 1,2 (es decir sus padres, la parcela de inter_id = 2 y la parcela de inter_id =1)

La idea es que cuando yo haga un group by por parcela la superficie de el 100%

Gracias
Arriba
prga Ver desplegable
Moderador
Moderador


Unido: 16/Noviembre/2004
Localización: España
Estado: Sin conexión
Puntos: 3059
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita prga Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 01/Diciembre/2018 a las 16:21
Hola.
Prueba esta consulta como posible solución, eso sí se utiliza un función creada en VBA.
1º.- La consulta será:

SELECT Hoja1.Id, Hoja1.ID_POLYGON, Hoja1.INTER_ID, Hoja1.INTER_ANCE, Hoja1.SUPERF_HA, Hoja1.SUPERF_POR FROM Hoja1 WHERE (((InStr(agrupaance([id_polygon]),"-" & Trim(Str([INTER_ID])) & "-"))=0));

2º.- La función(agrupaance) se colocará en un módulo normal:

Public Function agrupaance(idpoligono As String)
Dim mrs As Recordset
Dim misql As String
Dim acumula As String
misql = "select inter_ance from hoja1 where id_polygon ='" & idpoligono & "'"
Set mrs = CurrentDb.OpenRecordset(misql)
mrs.MoveFirst
acumula = "-"
Do Until mrs.EOF
 acumula = acumula & Replace(Nz(mrs.Fields(0).Value, 0), ",", "-") & "-"
mrs.MoveNext
Loop
agrupaance = acumula
mrs.Close
Set mrs = Nothing
End Function

En el supuesto que sirva, si es así  seguro que hay soluciones mas sencillas, habría que depurarlo, optimizarlo, etc etc
Ya comentas.
Un saludo a todos

Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 4908
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 01/Diciembre/2018 a las 17:05
Hola!

Yo lo que haría es crear una consulta simple de selección de todos los campos necesarios, ordeno el campo "SUPERF_POR" de forma descendente de esta forma me da los valores de mayor a menor y en criterios pongo el valor 100 y ya lo tienes:

SELECT Hoja1.Id, Hoja1.ID_POLYGON, Hoja1.INTER_ID, Hoja1.INTER_ANCE, Hoja1.SUPERF_HA, Hoja1.SUPERF_POR
FROM Hoja1
WHERE (((Hoja1.SUPERF_POR)=100))
ORDER BY Hoja1.SUPERF_POR DESC;


Editado por mounir - 01/Diciembre/2018 a las 17:06
Un Saludo.
Arriba
feraku Ver desplegable
Nuevo
Nuevo


Unido: 18/Marzo/2013
Estado: Sin conexión
Puntos: 19
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita feraku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 01/Diciembre/2018 a las 17:33
Publicado originalmente por mounir mounir escribió:

Hola!

Yo lo que haría es crear una consulta simple de selección de todos los campos necesarios, ordeno el campo "SUPERF_POR" de forma descendente de esta forma me da los valores de mayor a menor y en criterios pongo el valor 100 y ya lo tienes:

SELECT Hoja1.Id, Hoja1.ID_POLYGON, Hoja1.INTER_ID, Hoja1.INTER_ANCE, Hoja1.SUPERF_HA, Hoja1.SUPERF_POR
FROM Hoja1
WHERE (((Hoja1.SUPERF_POR)=100))
ORDER BY Hoja1.SUPERF_POR DESC;

Gracias mounir, pero con esto digamos que obtengo los registros padres y yo quiero solo los hijos
Arriba
feraku Ver desplegable
Nuevo
Nuevo


Unido: 18/Marzo/2013
Estado: Sin conexión
Puntos: 19
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita feraku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 01/Diciembre/2018 a las 17:34
Publicado originalmente por prga prga escribió:

Hola.
Prueba esta consulta como posible solución, eso sí se utiliza un función creada en VBA.
1º.- La consulta será:

SELECT Hoja1.Id, Hoja1.ID_POLYGON, Hoja1.INTER_ID, Hoja1.INTER_ANCE, Hoja1.SUPERF_HA, Hoja1.SUPERF_POR FROM Hoja1 WHERE (((InStr(agrupaance([id_polygon]),"-" & Trim(Str([INTER_ID])) & "-"))=0));

2º.- La función(agrupaance) se colocará en un módulo normal:

Public Function agrupaance(idpoligono As String)
Dim mrs As Recordset
Dim misql As String
Dim acumula As String
misql = "select inter_ance from hoja1 where id_polygon ='" & idpoligono & "'"
Set mrs = CurrentDb.OpenRecordset(misql)
mrs.MoveFirst
acumula = "-"
Do Until mrs.EOF
 acumula = acumula & Replace(Nz(mrs.Fields(0).Value, 0), ",", "-") & "-"
mrs.MoveNext
Loop
agrupaance = acumula
mrs.Close
Set mrs = Nothing
End Function

En el supuesto que sirva, si es así  seguro que hay soluciones mas sencillas, habría que depurarlo, optimizarlo, etc etc
Ya comentas.
Un saludo a todos


Creo que funcional perfectamente, voy a estudiarlo con detenimiento, no se si llegaré a entenderlo

Mil gracias
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable