Imprimir página | Cerrar ventana

Extraer texto de campo

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84709
Fecha de impresión: 26/Marzo/2026 a las 17:41


Tema: Extraer texto de campo
Publicado por: Erick Gamer
Asunto: Extraer texto de campo
Fecha de publicación: 17/Septiembre/2019 a las 20:15
Saludos una vez mas,

Tengo un campo descripciones como la siguiente imagen, de la cual requiero extraer en otra columna parte de ese texto. Los campos mostrados son solo aquellos en los que quiero aplicar la funcion, tengo parte de la funcion con Like, IIF y Mid pero me falta completar la funcion para extraer la información deseada.

Extraer: IIf([Descripciones] Like "*GAGE*",Mid([Descripciones],16,6),"")

Los primeros nueve registros los extraje con la funcion arriba mencionada, porque la longitud de ellos es constante pero el resto de los registros tienen variantes al principio de la cadena. Hay alguna forma de extraer los textos requeridos.

NOTA: Requiero extraer los textos resaltados en color rojo.

Extraer






































Erick Gamer


-------------
Aprendiz de todos, maestro de nadie.



Respuestas:
Publicado por: emiliove
Fecha de publicación: 17/Septiembre/2019 a las 21:22
Hola Erick
Puedes usar las funciones de texto para obtener lo que quieres, por ejemplo con InStr puedes sacar en que posición comienza GAGE y sabiendo eso puedes buscar el siguiente espacio en blanco también con InStr y una vez que tienes ambos resultados con Mid obtienes el resultado, teniéndolo a una parte de ellos le quieres quitar GAGE, pero eso te lo voy a dejarte a ti que lo intentes solo te diré con con IIf vas bien.

Saludos.


Publicado por: Erick Gamer
Fecha de publicación: 17/Septiembre/2019 a las 23:15
Creo ahi va emiliove:

Extraer: IIf([Descripciones] Like "*GAGE*",Mid([Descripciones],InStr(11,[Descripciones],"GAGE")+4))

Extraer

Me estoy comiendo el GAGE en los primeros seis registros como lo muestra la imagen.
Y como corto el texto marcado en rojo a la derecha, asumo que un Right?

Erick Gamer


-------------
Aprendiz de todos, maestro de nadie.


Publicado por: xavi
Fecha de publicación: 17/Septiembre/2019 a las 23:39
A mi me parece que no es tan sencillo. 

Yo he optado por partir la cadena en busca del fragmento que contenga un - 

Esto me funciona (lo he tratado como si estuviera en una tabla):

Function Erick()
    Dim rst As DAO.Recordset
    Dim arrParts    As Variant
    Dim i           As Integer
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM Tabla1")
    
    Do Until rst.EOF
        arrParts = Split(rst!Descripciones, " ")
        For i = 0 To UBound(arrParts)
            If InStr(1, arrParts(i), "-") Then
                rst.Edit
                rst!Extraer = arrParts(i)
                rst.Update
                Exit For
            End If
        Next
        rst.MoveNext
    Loop
    
    rst.Close
    Set rst = Nothing
End Function




-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Erick Gamer
Fecha de publicación: 17/Septiembre/2019 a las 23:59
Gracias Xavi por el aporte, 

Trate de comentar el codigo con los elementos que entiendo favor de corregirme si estoy mal.

Otra cosa no me corrio la funcion me marco error comentado en el codigo:

Function Erick()
    Dim rst As DAO.Recordset
    Dim arrParts    As Variant
    Dim i           As Integer
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM Tabla1") 'Sustitui por el nombre de mi tabla
    
    Do Until rst.EOF
    'Parte la cadena separandolo por espacios y metiendolos al array
        arrParts = Split(rst!Descripciones, " ") '<-- Me marca error 94 Invalid use of null
        'Recorre el array en busca del "-"
        For i = 0 To UBound(arrParts)
            If InStr(1, arrParts(i), "-") Then
            'Pone la tablae en modo edición
                rst.Edit
                'Que hace en esta parte?
                rst!Extraer = arrParts(i)
                'Que actualiza exacamente?
                rst.Update
                Exit For
            End If
        Next
        rst.MoveNext
    Loop
    
    rst.Close
    Set rst = Nothing
End Function

Erick Gamer


-------------
Aprendiz de todos, maestro de nadie.


Publicado por: emiliove
Fecha de publicación: 18/Septiembre/2019 a las 00:17
Con consultas
Lo voy a hacer separado para que veas: tenemos la tabla 1

Tabla1
Id Nombre
1 Mandatory GAGE G-305 is requered per plant specific work instruction
2 Mandatory GAGE G-315 is requered per plant specific work instruction
3 Mandatory GAGE G-318 is requered per plant specific work instruction
4 Mandatory GAGE G-3222 is requered per plant specific work instruction
5 Optinal inspection GAGE G-002-14 per plant specific work instruction
6 Optinal inspection GAGE G-005-14 per plant specific work instruction
7 Optinal inspection GAGE G-002-204 per plant specific work instruction
8 Optinal inspection GAGE 15 per plant specific work instruction
9 Optinal inspection GAGE 18 per plant specific work instruction

Y sacamos con InStr los dos datos que requerimos el donde inicia GAGE y el del espacio después de los números, después los usamos en Mid y listo

SELECT Tabla1.Id, Tabla1.Nombre, InStr([Nombre],"GAGE") AS otro, InStr([otro]+5,[Nombre]," ") AS otro1, Mid([Nombre],[otro],[otro1]-[otro]) AS Obtener, IIf(Len([Obtener])>8,Right([Obtener],Len([obtener])-5),[obtener]) AS Expr1
FROM Tabla1;

Obtenemos:
Consulta2
Id Nombre otro otro1 Obtener Expr1
1 Mandatory GAGE G-305 is requered per plant specific work instruction 11 21 GAGE G-305 G-305
2 Mandatory GAGE G-315 is requered per plant specific work instruction 11 21 GAGE G-315 G-315
3 Mandatory GAGE G-318 is requered per plant specific work instruction 11 21 GAGE G-318 G-318
4 Mandatory GAGE G-3222 is requered per plant specific work instruction 11 22 GAGE G-3222 G-3222
5 Optinal inspection GAGE G-002-14 per plant specific work instruction 20 33 GAGE G-002-14 G-002-14
6 Optinal inspection GAGE G-005-14 per plant specific work instruction 20 33 GAGE G-005-14 G-005-14
7 Optinal inspection GAGE G-002-204 per plant specific work instruction 20 34 GAGE G-002-204 G-002-204
8 Optinal inspection GAGE 15 per plant specific work instruction 20 27 GAGE 15 GAGE 15
9 Optinal inspection GAGE 18 per plant specific work instruction 20 27 GAGE 18 GAGE 18

Saludos.




Publicado por: xavi
Fecha de publicación: 18/Septiembre/2019 a las 00:26
Emilio: el quid de la cuestion es que no siempre la palabra GAGE debe ser extraida (o eso entiendo yo del primer post)

Erick
Si te marca error es porque tienes un registro dónde el campo Descripciones es nulo. Cambia la línea por esta:
arrParts = Split(Nz(rst!Descripciones, ""), " ")


rst!Extraer = arrParts(i)

Al recorrer el array en busca de un elemento que contenga el caracter "-" y encontrarlo, simplemente almacena ese valor en el campo Extraer de la tabla (he asumido que en la tabla tenemos un campo Descripciones y otro Extraer)



-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: emiliove
Fecha de publicación: 18/Septiembre/2019 a las 00:34
Hola Xavi

En mi ejemplo solo el registro 8 y 9 se extrae el GAGE. como lo quiere Erick

Saludos.


Publicado por: xavi
Fecha de publicación: 18/Septiembre/2019 a las 00:41
Sorry! lo lei mal 

-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: emiliove
Fecha de publicación: 18/Septiembre/2019 a las 00:48
Pero tienes razón, lo vi mal, aparentemente todos comienzan después de GAGE con una G y los que son con numero si va la palabra GAGE, si así es correcto yo revisaría si es numero y actuaria en consecuencia.

Edito:
Algo así:
SELECT Tabla1.Id, Tabla1.Nombre, InStr([Nombre],"GAGE") AS otro, InStr([otro]+5,[Nombre]," ") AS otro1, Mid([Nombre],[otro],[otro1]-[otro]) AS Obtener, IIf(Len([Obtener])>8,Right([Obtener],Len([obtener])-5),[obtener]) AS Expr1, IsNumeric(Mid([obtener],6,1)) AS esnumero, IIf(([esnumero])=0,Right([Obtener],Len([obtener])-5),[obtener]) AS Expr2
FROM Tabla1;

Consulta2
Id Nombre otro otro1 Obtener Expr1 esnumero Expr2
1 Mandatory GAGE G-305 is requered per plant specific work instruction 11 21 GAGE G-305 G-305 0 G-305
2 Mandatory GAGE G-315 is requered per plant specific work instruction 11 21 GAGE G-315 G-315 0 G-315
3 Mandatory GAGE G-318 is requered per plant specific work instruction 11 21 GAGE G-318 G-318 0 G-318
4 Mandatory GAGE G-3222 is requered per plant specific work instruction 11 22 GAGE G-3222 G-3222 0 G-3222
5 Optinal inspection GAGE G-002-14 per plant specific work instruction 20 33 GAGE G-002-14 G-002-14 0 G-002-14
6 Optinal inspection GAGE G-005-14 per plant specific work instruction 20 33 GAGE G-005-14 G-005-14 0 G-005-14
7 Optinal inspection GAGE G-002-204 per plant specific work instruction 20 34 GAGE G-002-204 G-002-204 0 G-002-204
8 Optinal inspection GAGE 15 per plant specific work instruction 20 27 GAGE 15 GAGE 15 -1 GAGE 15
9 Optinal inspection GAGE 18 per plant specific work instruction 20 27 GAGE 18 GAGE 18 -1 GAGE 18

Saludos.


Publicado por: Mihura
Fecha de publicación: 18/Septiembre/2019 a las 09:00
Yo optaría por otro camino.

- memorizo el literal completo:
Xs = Literal

- elimino el literal de inicio que no quiero:
Xs = replace(xs, "MANDATORY GAGE ", "")
Xs = replace(xs, "OPTIONAL INSPECTION GAGE ", "")
Xs = replace(xs, "OPTIONAL INSPECTION ", "")

importante el blanco final de la cadena a eliminar y hacer los cambios en este orden

- nos quedamos con la primera palabra del literal que nos queda:
Resultado = split(Xs, " ") (0)


Ojo escrito todo ello al vuelo, si se hace con un recordset se puede dejar tal cual, si es con una consulta habría que crear una función




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Erick Gamer
Fecha de publicación: 18/Septiembre/2019 a las 16:13
He probado las aportaciones publicadas (Xavi, emiliove) y funcionan de maravilla, salvo el codigo de Mihura que no lo he podido adaptar estoy metiendole en un RecordSet obteniendo el siguiente error:

Sub Mihura()

Dim rst As DAO.Recordset
Dim Literal As String
Dim Xs As String
Dim Resultado As String

Xs = Literal
Set rst = CurrentDb.OpenRecordset("Select * from Tabla1")
If rst.RecordCount = 0 Then Exit Sub




rst.MoveLast
rst.MoveFirst
 
Do Until rst.EOF
    Xs = Replace(Xs, "MANDATORY GAGE ", "")
    Xs = Replace(Xs, "OPTIONAL INSPECTION GAGE ", "")
    Xs = Replace(Xs, "OPTIONAL INSPECTION ", "")
    'rst.Update
    rst.MoveNext
    Loop
Resultado = Split(Xs, " ")(0) 'Aqui obtengo el error<---Lo almacena en una variable, o tengo que actualizar directamente el campo de la tabla?
  


rst.Close
Set rst = Nothing

End Sub

Erick Gamer


-------------
Aprendiz de todos, maestro de nadie.


Publicado por: emiliove
Fecha de publicación: 18/Septiembre/2019 a las 16:54
Como que te falta hacer todo ya tienes el recordset te vas al primer registro y tienes que tener un campo para rellenar dentro del bucle y guardar el Resultado en él, actualizar la tabla, ir al siguiente registro, etc....

Saludos.


Publicado por: xavi
Fecha de publicación: 18/Septiembre/2019 a las 17:08
Con todo respeto el código de Mihura lo has metido con calzador en un procedimiento que no veo yo muy fino...
Sub Mihura()

Dim rst As DAO.Recordset
Dim Xs As String

Set rst = CurrentDb.OpenRecordset("Select * from Tabla1")
If rst.EOF Then Exit Sub
 
Do Until rst.EOF
    Xs = Replace(rst!Descripciones, "MANDATORY GAGE ", "")
    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 Sub

Consejo (de buen rollo): analiza cada una de las lineas de código que te hemos dado (en cualquiera de las opciones) para entender que hace cada una de ellas. De esa forma verás que lo que haces en tu "mezclado" no tiene coherencia.

Un saludo


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Erick Gamer
Fecha de publicación: 18/Septiembre/2019 a las 20:24
Una mas tomando la idea de Mihura:

SELECT Tabla1.Descripciones, IIf([Descripciones] Like "*GAGE*",Replace([Descripciones],"OPTIONAL INSPECTION ","")) AS r1, IIf([r1] Like "*GAGE*",Replace([r1],"MANDATORY GAGE ","")) AS r2, IIf([Descripciones] Like "*GAGE*",Replace([r2]," IS REQUIRED PER PLANT'S SPECIFIC WORK INSTRUCTIONS","")) AS r3, IIf([Descripciones] Like "*GAGE*",Replace([r3]," PER PLANT'S SPECIFIC WORK INSTRUCTIONS","")) AS r4, IIf([Descripciones] Like "*GAGE*",Replace([r4]," IS REQUIRED PER PLANT'S SPEC. WORK INST.","")) AS r5
FROM Tabla1;

rst!Extraer = Split(Xs, " ")(0), me esta devolviendo null y me lanza este error:
Error9, SubScript out of range

La ayuda de access menciona que "Usted declaró una matriz pero no especificó el número de elementos."
Ha hecho referencia a un miembro de la colección inexistente. Intente usar la construcción For Each ... Next en lugar de especificar elementos de índice.

Erick Gamer


-------------
Aprendiz de todos, maestro de nadie.


Publicado por: VIMIPAS
Fecha de publicación: 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.


-------------
Gracias


Publicado por: VIMIPAS
Fecha de publicación: 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


Publicado por: Erick Gamer
Fecha de publicación: 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.


Publicado por: VIMIPAS
Fecha de publicación: 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


Publicado por: Erick Gamer
Fecha de publicación: 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.


Publicado por: jilo
Fecha de publicación: 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



-------------
Espero te sirva !!!!!!
Iñaki


Publicado por: VIMIPAS
Fecha de publicación: 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


Publicado por: Erick Gamer
Fecha de publicación: 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.



Imprimir página | Cerrar ventana