** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Mi Medio ni EnCad me extrae correctamente
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoMi Medio ni EnCad me extrae correctamente

 Responder Responder
Autor
Mensaje
marygarci Ver desplegable
Nuevo
Nuevo


Unido: 20/Abril/2020
Localización: Las Palmas
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Tema: Mi Medio ni EnCad me extrae correctamente
    Enviado: 21/Abril/2020 a las 14:11
Hola
Tengo un form que parte de una consulta, donde uno de los campos es la ruta de cada imagen que añado a la DB. Y obtengo lo siguiente, p.e.

1959.09.19-LA(VT)_VISITA NIKITA KHRUSHCHEV EEUU_Cafe de Paris (VNK-CAPA)
1947.xx.xx-XX(PC)_INTERPRETACION CON HELEN SORRELL_Guion desconocido (IHS-GUDE)

y un larguísimo etcétera

Como necesito extraer cada dato de estas subcarpetas, para la categoría, que está en mayúsculas, he usado

Categoria: Medio([Nivel5];EnCad([Nivel5];"_")+1;EnCad([Nivel5];"_")+2)

Lo he revisado muchísimas veces, pero nada :(

Pero no va bien en muchas de ellas, sin embargo, en otras lo hace perfecto (no entiendo nada).. adjunto imágenes para que vean lo que me hace... Por cierto, la categoría la he puesto entre guiones bajos porque al tener antes guiones cortos, lo confundía con la fecha, o puntos, o cualquier otro símbolo ya usado en la carpeta. Además, siempre empezará en el caracter 19, pero su longitud será diferente.
Nivel5 hace referencia a la ruta de donde extraigo la categoría



Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5212
Enlace directo a este mensaje Enviado: 21/Abril/2020 a las 15:28
Quizás algo como esto:
Medio([Nivel5];EnCad(1;[Nivel5];"_")+1;EnCad(EnCad(1;[ Nivel5];"_")+1;[Nivel5];"_")-( EnCad(1;[Nivel5]+1))

Saludos.


Editado por emiliove - 21/Abril/2020 a las 15:31
Arriba
fcoval Ver desplegable
Habitual
Habitual


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 168
Enlace directo a este mensaje Enviado: 21/Abril/2020 a las 15:30
Asi, algo rápido y muy mejorable...

Categoria: Medio([Nivel5];EnCad([Nivel5];"_")+1;EnCad(Medio([Nivel5];21;1000);"_")+1)




Aunque a mi personalmente me gusta mas esta otra, que ya no tiene porque empezar en la posición 19:

Categoria: Medio([Nivel5];EnCad([Nivel5];"_")+1;EnCad(Medio([Nivel5];EnCad([Nivel5];"_")+1;Longitud([Nivel5]));"_")-1)

Editado por fcoval - 21/Abril/2020 a las 15:39
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 745
Enlace directo a este mensaje Enviado: 21/Abril/2020 a las 15:41
inicio=1
primero= instr(me!ensayoycategoria,"_") +1 'nos da la posicion del primer _
segundo=instr(primero,me!ensayoycategoria,"_") ' nos da posicion del segundo _
categoria= mid(me!ensayoycategoria,primero,seguno-primero)


prueba eso



Editado por 01loko - 21/Abril/2020 a las 15:43
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 13015
Enlace directo a este mensaje Enviado: 21/Abril/2020 a las 15:46
El problema está en que EnCad devuelve la posición del carácter buscado. Y tu lo utilizas tanto para el primer argumento de la función Medio que es la que indica la posición inicial (bien) como en el tercer argumento que indica la longitud de caracteres a recuperar a partir del segundo argumento.

Creo que, si alguna vez sale bien, es de pura suerte.

Como ya sabes, las expresiones no son mi fuerte (yo soy más de VBA) pero intentaré hacerlo en una expresión.

Se trata de obtener la parte central (Medio) de la cadena Nivel5 empezando en el caracter siguiente al primer _ y acabando en el caracter anterior al último _ (asumo que solo hay 2)

Si solo queremos el texto a partir del primer _ es sencillo:
Medio([Nivel5];EnCad(1, [Nivel5];"_"))

1959.09.19-LA(VT)_VISITA NIKITA KHRUSHCHEV EEUU_Cafe de Paris (VNK-CAPA) 
-->
VISITA NIKITA KHRUSHCHEV EEUU_Cafe de Paris (VNK-CAPA)

Sobre esa cadena podriamos obtener la parte izquierda hasta la primera aparición de _
Izq(Medio([Nivel5];EnCad(1, [Nivel5];"_"));EnCad(1;Medio([Nivel5];EnCad(1, [Nivel5];"_"))-1)

VISITA NIKITA KHRUSHCHEV EEUU_Cafe de Paris (VNK-CAPA)
-->
VISITA NIKITA KHRUSHCHEV EEUU

Alternativamente podemos hacerlo utilizando InStrRev en lugar de EnCad. InStrRev devuelve la posición de un carácter desde el final de la cadena.
Así pues, la longitud de la cadena a recuperar sera la posición del segundo _ (obtenido por InStrRev -1) menos la posición del primer _ (obtenido por EnCad)

=Medio([Nivel5];EnCad(1;[Nivel5];"_")+1;InStrRev([Nivel5];"_")-1-EnCad(1;[Nivel5];"_"))

Escrito del tirón.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
marygarci Ver desplegable
Nuevo
Nuevo


Unido: 20/Abril/2020
Localización: Las Palmas
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Enviado: 21/Abril/2020 a las 17:29
Gracias @emiliove. Gracias a Xavi, ahora sé que esto es una expresión jejejeje, la que me indicas le faltaba, nada, un par de chorradas, otro paréntesis final y eliminar un espacio de Nivel5. No obstante, da error, no arroja ningún dato, me aparece #Error Pero de verdad, gracias por tu tiempo, no obstante, estudio lo que me indicas

@fcoval. Mil gracias también por tu tiempo. Con tu primera propuesta, consigo prácticamente lo mismo que estoy consiguiendo, es decir, algunas categorías las consigo completas y en otras solo una parte o la primera letra de la categoría, raro, no? Me gusta mucho la sintaxis de la segunda, la veo menos enrevesada, complicada, de hecho, funciona a la perfección. Además, me ha "chivado" con un #¡Función! aquellas categorías que no están cerradas adecuadamente entre guiones bajos. Muchas gracias!

@01loko, gracias también por tu tiempo en ayudarme, desgraciadamente, no entiendo lo que me indicas, mi base la he construido durante años, buscando muuuucha información y ejemplos, pero no entiendo ni de códigos ni de expresiones, intento entender lo que veo, pero no sería capaz de construir un código ni expresión yo solita :(

@xavi, gracias, porque ahora sé la diferencia entre expresión y código VBA ;) Supongo que para ustedes es una chorrada, pero para mí es un pasito más para aprender y entender. Tanto tu expresión como la del otro compañero, funcionan a la perfección, pero no entiendo las diferencias, por qué uno es mejor que otro


MIL GRACIAS A TODOS!


Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5212
Enlace directo a este mensaje Enviado: 21/Abril/2020 a las 18:24
Entonces divide y vencerás, vamos a ver:

En un cuadro de texto pones: EnCad(1;[Nivel5];"_") y te da la posición hasta el "_"  y le das como Nombre: Primero
Si pones otro cuadro de texto: EnCad([Primero]+1;[Nivel5];"_") te da la segunda posición y ya sabes que la resta de ambas te da los caracteres de las palabra entre ambos "_" y le das como Nombre: Segundo
Ahora en otro cuadro de texto solo tienes que buscar con Medio desde donde comienza Primero +1 para quitar el "_" y hasta donde termina (Segundo - Primero+1) y listo lo lograste.

Saludos.




Editado por emiliove - 21/Abril/2020 a las 18:25
Arriba
marygarci Ver desplegable
Nuevo
Nuevo


Unido: 20/Abril/2020
Localización: Las Palmas
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Enviado: 22/Abril/2020 a las 13:17
Hola emiliove, efectivamente, hice algo parecido, pero no como me indicas tú, más a lo chapuza que no sé de código. Lo miro a ver si me va mejor, pero que ya está solucionado jejejeje ;)

muchas gracias
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable