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.
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))
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.
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  .
------------- 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 
------------- Aprendiz de todos, maestro de nadie.
|
|