Problema Función Dbúsq

Necesito realizar una consulta a través de la cual
localizar aquellos registros que tienen un número determinado de
caracteres, aunque realmente el que me interesa es el anterior a ese
registro.
Me explico mejor: importo un archivo txt a una tabla que únicamente tiene un campo (campo1).
El problema es que en ese campo aparecen los distintos datos que más
tarde tendré que separar en varios campos. Para saber cuando acaban los
datos de un registro y empiezan los de otro lo hago a través de la
función Longitud, ya que el primer dato de un registro tiene una
longitud de 6 caracteres, el segundo tiene una longitud de 10 y el
tercero tiene una longitud de 128 (éste ultimo campo puede ser uno o
varios). Así que lo que quiero es encontrar el registro con 128
caracteres, para después concatenarlo con los 2 anteriores. De esta
forma quiero utilizar la función de esta forma:
Dbúsq([campo1];"tabla1";Longitud([campo]="128" -1))
Pero no consigo que funcione

2 respuestas

Respuesta
1

La función Len() (Longitud()) da como resultado un número, por lo que no tienes que poner la doble comilla

Longitud([campo])=128 - 1

Hola, lo he probado con comillas y sin comillas en la función, con comillas simple en el 128 y sin ella, con paréntesis y sin ellos, pero no hay forma. Me da el siguiente error:

Error de sintaxis en la expresión de consulta .... (y aparecen los datos del primer registro).

Un saludo

La expresión sería:

Dbúsq([campo1];"tabla1";"Longitud([campo1]=128"))

¿Por qué el -1...?

Por más vueltas que le doy no consigo encontrar la solución. Te pongo un ejemplo de lo que pretendo conseguir, a ver si así puedes echarme una mano. Lo que quiero es concatenar el campo con 6 caracteres que está encima del que tiene 128 (el número de caracteres es fijo, o 6 o 128). Como puedes ver el problema reside en que en ocasiones en los que hay más de un registro de 128 caracteres, por lo que debería buscar el registro anterior que tenga 6 caracteres, ya que es un dato común a los registros que tienen 128 caracteres. Espero haberme explicado bien. (He recortado los registros de 128 para que sea más sencillo de ver.)
333893
388859853338383 ROTULFO YISTILLO JUIJ TIOGO 33-33-5383 L33 8353535338 3
333586
388858833589863 OJJUYIVI OSTRUYTURIS TO HORTIGOJ,ES 33-33-5383 L33
388858836596583 IJVIYOJ TO IRIYOJI,S.L.L. 33-33-5383 L33 8353353556 56 38.559,33
333566
388858833536693 LITOJ ROTORO SOHISTIIJ 33-33-5383 L33 8353595568 8 563,35
388858836538355 TOTIJGUOT FORJIJTOT JUIJ YIRLOS 33-33-5383 L33 8353595568 8
388858836593388 IUTO ROYITHIOS LI YIJTI, S.L. 33-33-5383 L39 8353858539 8 966,58
388858833883689 YOJTRO IUTO LOPO,S.L. 33-33-5383 L33 8353595568 5 8.859,53
388858833653568 GIRYII FISYIL IJI TIRII 33-33-5383 L33 8353595568 8 563,35 563,35
388858833633335 PILIYIOS TOSYIJO TOJTOTIYOR 33-33-5383 L33 8353595568 8 56
335889
388858335398635 LIHORIL TOL YILTITO,S.L. 33-33-5383 L33 8353833338 8 359,35
388858833535983 HORTOJO TORI TIJUOL JOSO 33-33-5383 L33 8353833338 8 633,85
388858833859355 IPI TOL IJSTITUTO TO F.P. TOJ HOSY 33-33-5383 L33 8353833338 5
388858833958385 TORO YITPO IGUSTIJ 33-33-5383 L33 8353833338 5 8.333,89
388858835555335 RIVORI LORYI JUIJ YIRLOS 33-33-5383 L33 8353833338 5 5.585,38

Muchas gracias

¿Me puedes mandar un fichero txt y lo miro?

Esto se tiene que hacer con una función, recorriendo los registros del fichero txt.

La función sería:

Function ImportarFichero()
'Declaramos las variables
Dim db As Database

Dim también As TableDef

Dim rs1 As Recordset

Dim rs2 As Recordset

Dim var As String
'Activamos la BD
Set db = CurrentDb
'Miramos si la tabla TablaInicial existe, ni existe la borramos
For Each también In db.TableDefs

If tb.Name = "TablaInicial" Then

DoCmd.DeleteObject acTable, tb.Name

End If

Next también

'Importamos el fichero TablaInicial.txt a la tabla TablaInicial mediante la especificación ImpTablaInicial
DoCmd. TransferText acImportFixed, "ImpTablaInicial", "TablaInicial", "C:\TablaInicial.txt"

'Borramos los registros de TablaFinal DoCmd.RunSQL "delete * from TablaFinal"
'Creamos los recordset
Set rs1 = db.OpenRecordset("select len(trim([campo1])) as Longitud,campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8, campo9 from TablaInicial")

Set rs2 = db.OpenRecordset("TablaFinal")
'Recorremos el recordset basado en TablaInicial e insertamos en Tablafinal
Do While Not rs1.EOF

If rs1!longitud = 6 Then

var = rs1!campo1

rs1.MoveNext

End If
Do While Not rs1.EOF And Len(Trim(rs1!campo1)) > 6

rs2.AddNew

rs2!campo0 = var

rs2 !campo1 = rs1 !campo1

rs2 !campo2 = rs1 !campo2

rs2 !campo3 = rs1 !campo3

rs2 !campo4 = rs1 !campo4

rs2 !campo5 = rs1! campo5

rs2 !campo6 = rs1 !campo6

rs2 !campo7 = rs1 !campo7

rs2 !campo8 = rs1 !campo8

rs2 !campo9 = rs1 !campo9
rs2.Update

rs1.MoveNext

If rs1.EOF Then

Exit Do

End If

Loop

Loop

End Function

Saludos, Angeles

*** Cuando un campo se refiere a un recordset, es rs2! Campo0, sin espacios, he puesto los espacios porque no me dejaba mandar la respuesta.

Respuesta
1

A mi parecer la Función Longitud es para contar la cantidad de bits que tiene un string y no para seleccionarlos.

Lo que tu deseas es seleccionar cierta cadena de caracteres dentro de un campo en este caso como el campo contiene varias columnas inmersas en un solo campo y solo quieres que te seleccione parte del campo es mejor usar la función Izquierda y Derecha anidada.

Mira este ejemplo de separación de caracteres dentro d eun campo.

http://office.microsoft.com/es-es/access-help/funcion-izq-HA001228873.aspx

Usando esta función y la función Der, podrás separar contenido dentro de un campo como el que tienes.

Ejemplo Campo: 2554-254B-3511,

Queremos mostrar solo la B del campo completo sería

Der(Izq(Campo, 9), 1)

Esto entregará la letra B del campo.

Saludos.


Añade tu respuesta

Haz clic para o

Más respuestas relacionadas