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

Tema cerradoExtraer texto de campo

 Responder Responder Página  <12
Autor
Mensaje
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 23:13
Hola a todos buenas noches.

Para el caso que nos ocupa, a mi entender hay 3 grupos de registros distintos.
El 1 abarca a los que empiezan por "MANDATORY"
El 2 abarca a los que empiezan por "OPTIONAL" y que contienen "G-"
EL 3 abarca a los que empiezan por "OPTIONAL" y que contienen "E-"

Bajo esa premisa, por favor indicadme si no estoy en lo correcto, tan solo he creado una tabla con tres registros, y uno mas del grupo que he denominado 3, en total 4 registros para la muestra. Este último lo he creado porque el antepenúltimo, el que contiene "GAGE-13581803", es el que nos da la pista (al menos a mi) de que cuando exista "GAGE-......", tan solo precisamos de los dos primeros caracteres que haya después del guión.

Aqui dejo la tabla creada:

ERIKGAMER
DESCRIPCIONES
MANDATORY GAGE G-5060 IS REQUIRED PER PLANT'S SPECIFIC WORK INSTRUCTIONS
OPTIONAL INSPECTION GAGE G-002-61 PER PLANT'S SPECIFIC WORK INSTRUCTIONS
OPTIONAL INSPECTION GAGE-11 PER PLANT'S SPECIFIC WORK INSTRUCTIONS
OPTIONAL INSPECTION GAGE-13581803 PER PLANT'S SPECIFIC WORK INSTRUCTIONS


Aquí dejo la consulta creada para resolverlo. Lo resuelvo a base Replace, con dos expresiones y para el caso de los registros del grupo 3, con un MID:

CONSULTA para ERIKGAMER
Expr1 Expr2
G-5060 IS REQUIRED PER PLANT'S SPECIFIC WORK INSTRUCTIONS G-5060
G-002-61 PER PLANT'S SPECIFIC WORK INSTRUCTIONS G-002-61
GAGE-11 PER PLANT'S SPECIFIC WORK INSTRUCTIONS GAGE-11
GAGE-13581803 PER PLANT'S SPECIFIC WORK INSTRUCTIONS GAGE-13

Y aquí dejo la SQL correspondiente:

SELECT IIf(Mid([DESCRIPCIONES],1,3)="MAN",Replace([DESCRIPCIONES],"MANDATORY GAGE ",""),IIf(InStr([DESCRIPCIONES],"G-")>0,Replace([DESCRIPCIONES],"OPTIONAL INSPECTION GAGE ",""),Replace([DESCRIPCIONES],"OPTIONAL INSPECTION ",""))) AS Expr1, IIf(InStr([DESCRIPCIONES],"IS")>0,Replace([EXPR1]," IS REQUIRED PER PLANT'S SPECIFIC WORK INSTRUCTIONS",""),IIf(InStr([DESCRIPCIONES],"G-")>0,Replace([EXPR1]," PER PLANT'S SPECIFIC WORK INSTRUCTIONS",""),Mid([EXPR1],1,7))) AS Expr2
FROM ERIKGAMER;

Creo que los datos son correctos, si fuera el caso y tengo algún error, pondría todos los registros para repasarlo al completo.

Saludos.

Edito para añadir lo siguiente:

He creado los 4 registros a mano. Quiero decir que no he sabido copiar los que pone Erick Gamer.
Sin embargo ahora cuando yo los he puesto si que puedo copiarlos, es decir, al copiar "literalmente" los registros de la tabla o la consulta, y pegarlos aquí en la página de respuesta, SI que se pueden copiar.
Lo digo por si Erick Gamer fuera tan amable de pegarlos de la misma forma aquí, por si hubiera que copiarlos.... Muchas gracias.


Editado por VIMIPAS - 18/Septiembre/2019 a las 23:21
Gracias
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 23:47
Buenas noches de nuevo.

Al autorepasarme, observo que he usado muchas cosas que no son necesarias:

otraPARAerickGAMER
Expr1 EXTRAER
G-5060 IS REQUIRED PER PLANT'S SPECIFIC WORK INSTRUCTIONS G-5060
G-002-61 PER PLANT'S SPECIFIC WORK INSTRUCTIONS G-002-61
GAGE-11 PER PLANT'S SPECIFIC WORK INSTRUCTIONS GAGE-11
GAGE-13581803 PER PLANT'S SPECIFIC WORK INSTRUCTIONS GAGE-13

Y la Sql:

SELECT IIf(InStr([DESCRIPCIONES],"G-")>0,Mid([DESCRIPCIONES],InStr([DESCRIPCIONES],"G-")),Mid([DESCRIPCIONES],InStr([DESCRIPCIONES],"E-")-3)) AS Expr1, IIf(Mid([EXPR1],1,2)="G-",Mid([EXPR1],1,InStr([EXPR1]," ")-1),Mid([EXPR1],1,7)) AS EXTRAER
FROM ERIKGAMER;

Hay que ver la que lío yo mismo conmigo mismo a veces.

Saludos y perdón, era mas simple todavía.
Gracias
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 19/Septiembre/2019 a las 05:26
Ejemplo de Mihura funcionando, corregi el select en el RecordSet al parecer los nulos me estaban dando problemas así que meti un where y ya esta.

Aqui el codigo con el ajuste:

Function Mihura()

Dim rst As DAO.Recordset
Dim Xs As String

Set rst = CurrentDb.OpenRecordset("SELECT * FROM Tabla1 where Descripciones Is Not Null")
If rst.EOF Then Exit Function
 
Do Until rst.EOF
    Xs = Replace(Nz(rst!Descripciones, ""), "MANDATORY GAGE ", "")
    Debug.Print Xs
    Xs = Replace(Xs, "OPTIONAL INSPECTION GAGE ", "")
    Xs = Replace(Xs, "OPTIONAL INSPECTION ", "")
    rst.Edit
    rst!Extraer = Split(Xs, " ")(0)
    rst.Update
    rst.MoveNext
Loop

rst.Close
Set rst = Nothing

End Function


He visto las aportaciones de Vimipas, las he probado y a simple vista hacen lo que necesitan, mañana revisare con mas calma y les comento.

De momento saludos de corazón y agradecido con todos.

Buenas noches porque creo muchos en España ya están noqueados por Morfeo.

LOL

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 19/Septiembre/2019 a las 10:21

Pues muy buenos días.

Efectivamente Morfeo ataca a ciertas horas..... pero también refresca la cabeza y sus neuronas.... claro que para llegar al final que a continuación propongo, me ha sido preciso andar antes por los distintos ejemplos que puse.

Aquí lo dejo resuelto con una sola expresión, la que he llamado única y exclusivamente "Extraer":

DEFINITIVAerickGAMER

EXTRAER

G-5060

G-002-61

GAGE-11

GAGE-13


Y la Sql es:
 

EXTRAER: SiInm(EnCad([DESCRIPCIONES];"G-")>0 Y EnCad([DESCRIPCIONES];" IS")>0;Medio([DESCRIPCIONES];EnCad([DESCRIPCIONES];"G-");EnCad([DESCRIPCIONES];" IS")-EnCad([DESCRIPCIONES];"G-"));SiInm(EnCad([DESCRIPCIONES];"G-")>0 Y EnCad([DESCRIPCIONES];" PER")>0;Medio([DESCRIPCIONES];EnCad([DESCRIPCIONES];"G-");EnCad([DESCRIPCIONES];" PER")-EnCad([DESCRIPCIONES];"G-"));Medio([DESCRIPCIONES];EnCad([DESCRIPCIONES];"E-")-3;7)))

Lo mas complicado, con tanto paréntesis, es acertar, pero si al final dices voy a sacarlo si o si, se consigue. El método anterior lo que hace es usar las dos expresiones para no recurrir a tanto paréntesis.

Pero quiero explicarlo paso a paso, pues me ha costado lo mío y así lo dejo aquí reflejado para que cualquiera (incluido yo mismo el día de mañana) lo pueda entender. Vamos pues a explicarlo en cristiano.

Esta es la primera pregunta: SiInm(EnCad([DESCRIPCIONES];"G-")>0 Y EnCad([DESCRIPCIONES];" IS")>0... quiere decir que si hay un registro que contenga "G-" y también " IS" ese pertenece a un grupo..... ¿Cómo tratamos ese grupo?:

Así: Medio([DESCRIPCIONES];EnCad([DESCRIPCIONES];"G-");EnCad([DESCRIPCIONES];" IS")-EnCad([DESCRIPCIONES];"G-")).... que quiere decir que del campo Descripciones usando Mid, quiero sacar desde "G-" incluido hasta donde está el " IS". Como resulta que la parte primera de la función Mid nos indica donde empezar a confeccionar la cadena que buscamos y la segunda parte de un Mid nos indica cuantos caracteres queremos recoger a partir de la parte primera, es por lo que resto el valor que sale con Encad de " IS" (que es el valor mayor para este caso) del valor que sale con Encad de "G-". Resuelto.

Esta es la segunda pregunta: SiInm(EnCad([DESCRIPCIONES];"G-")>0 Y EnCad([DESCRIPCIONES];" PER")>0;Medio([DESCRIPCIONES];EnCad([DESCRIPCIONES];"G-");EnCad([DESCRIPCIONES];" PER")-EnCad([DESCRIPCIONES];"G-")).... exactamente lo mismo que en la anterior, pero en vez de usar " IS" que no existe, usamos el " PER" que si existe. Y queda resuelto de la misma manera, el segundo grupo de registros.

Y la tercera pregunta no la hago, sino que es la condición falsa de la segunda pregunta: 

;Medio([DESCRIPCIONES];EnCad([DESCRIPCIONES];"E-")-3;7))). El 7 es el número de caracteres que deberá contener esta cadena que buscamos, es decir “GAGE-“ mas los dos primeros números”. Así queda resuelto el tercer grupo de registros. 

Aclarar que aquí los registros anteriores deberán contener "GAGE-??", por eso, como he buscado desde la "E-", le he restado -3 que son las tres letras GAG que hay antes. He visto muchos GAGE por ahí en medio y he preferido usar este sistema. Hubiera valido igualmente si busco "GAGE-".

Saludos.

Gracias
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 19/Septiembre/2019 a las 19:09
Excelentes aportaciones las de todos en verdad, en esta ocasión me quedo con la ultima Expresion de Vimipas.

Gracias por compartir su tiempo y conocimiento, voy a repasar las demas funciones aportadas les encontrare un uso en mis aplicaciones.

Pueden cerrar el tema y una vez mas agradecido con su valiosa ayuda  Thumbs Up.

Erick Gamer


Aprendiz de todos, maestro de nadie.
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 959
Enlace directo a este mensaje Enviado: 21/Septiembre/2019 a las 11:41
Hola,
Como aún esta abierto el tema, me apunto y dejo una funcion que le pasas la cadena como argumento y te devuelve lo buscado. Un aporte más ....

Function ExtraeCadena(cadena As String) As String
   With CreateObject("vbscript.regexp")
      .Pattern = "GAGE [A0-Z9]*(-[0-9]*)*"
      If .Test(cadena) Then
         ExtraeCadena = .Execute(cadena)(0)
         If Not IsNumeric(Right(ExtraeCadena, Len(ExtraeCadena) - 5)) Then _
               ExtraeCadena = Right(ExtraeCadena, Len(ExtraeCadena) - 5)
      End If
   End With
End Function



Editado por jilo - 21/Septiembre/2019 a las 12:24
Espero te sirva !!!!!!
Iñaki
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 21/Septiembre/2019 a las 13:52
Gracias a Emiliove por abrir este hilo de nuevo para que pudiera colocar una última respuesta.

Hola buenas tardes a todos.

 

Un último ejemplo sobre lo mismo, pero ampliando la posibilidad que nos ofrece Instr de indicarle desde donde debe empezar a buscar aquello que buscamos. Es decir, desde que punto del texto en el que buscamos debe iniciar la búsqueda.

 

Esta es la SQL:

 

SELECT IIf(InStr([DESCRIPCIONES],"G-")>0,Mid([DESCRIPCIONES],InStr(1,[DESCRIPCIONES],"G-"),InStr(InStr([DESCRIPCIONES],"G-"),[DESCRIPCIONES]," ")-InStr([DESCRIPCIONES],"G-")),Mid([DESCRIPCIONES],InStr([DESCRIPCIONES],"GAGE-"),7)) AS [EXTRAER MASsimpleTODAVIA]

FROM ERIKGAMER;

 

Y esta es la descripción del desarrollo.

 

SELECT IIf(InStr([DESCRIPCIONES],"G-")>0,

 

Para obtener dos grupos de registros nada más haremos un IIF nada más. Obtendremos una respuesta verdadera y otra respuesta falsa. (2 grupos).

 

Mid([DESCRIPCIONES],InStr(1,[DESCRIPCIONES],"G-")

 

ESTE  1 que está remarcado ARRIBA en negro, indica el punto desde donde debe empezar a buscar en el campo [DESCRIPCIONES] (Si no lo pongo, también empieza a buscar a partir del primer carácter que exista en [DESCRIPCIONES].

 

 

InStr(InStr([DESCRIPCIONES],"G-"),[DESCRIPCIONES]," ")-InStr([DESCRIPCIONES],"G-")),

Y en esta otra Instr, con lo que está remarcado ARRIBA en negro, en vez del 1 anterior se situará sobre el valor donde encuentre “G-1”, es otra forma de indicar el punto desde donde debe empezar a buscar en el campo [DESCRIPCIONES], con el valor resultante de esa Instr. A continuación buscaremos el “ “ posterior y le restaremos el valor del “G-“, esto nos da el número de caracteres que deseamos en la cadena. (Lo que buscamos). Primer grupo de registros que buscamos.

 

 

Mid([DESCRIPCIONES],InStr([DESCRIPCIONES],"GAGE-"),7))

 

Segundo grupo de registros que buscamos.

 

 

AS [EXTRAER MASsimpleTODAVIA]

FROM ERIKGAMER;

 

 

Saludos.


Gracias
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 26/Septiembre/2019 a las 15:02
Apenas vuelvo a ver el hilo.
Gracias nuevamente he probado esta otra funcion y si que es mas corta y funciona igual de bien.

Tampoco habia visto la funcion de jilo.

Mil Gracias a Todos!!!!!!!

Erick Gamer  Thumbs Up


Aprendiz de todos, maestro de nadie.
Arriba
 Responder Responder Página  <12
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable