Fórmula excel a consulta en access

Como lo dice el titulo necesito poder pasar una fórmula de excel a una consulta de access, estoy pasando las planillas excel al access para una mayor estabilidad, espero me puedas ayudar.
En este caso necesito insertar el resultado en la tabla o consulta de actualización
=SI(Y(IZQUIERDA(C2;1)="0";P2="B767 C");1;0)
En este caso tambien necesito traer un valor de otra tabla
=SI.ERROR(SI.ERROR(SI(O(P2="B767 C";P2="B767C");"UC";SI(P2<>"B767";SI(IZQUIERDA(C2;2)="LX";"LA";IZQUIERDA(C2;2));BUSCARV(R2;'D:\INDICADOR\[Base B767 Pax con compañia.xlsx]Base'!$A$1:$B$99924;2;FALSO)));BUSCARV(S2;'D:\INDICADOR\[Base B767 Pax con compañia.xlsx]Base'!$A$1:$B$99924;2;FALSO));BUSCARV(T2;'D:\INDICADOR\[Base B767 Pax con compañia.xlsx]Base'!$A$1:$B$99924;2;FALSO))
1

1 respuesta

Respuesta
1
Primeramente, ¿ya definiste tus tablas y tus campos en tu bd de Access? ¿Ya definiste los índices para que no haya problemas de duplicaciones?.
Si lo has hecho, puedes usar consultas anidadas haciendo nuevamente un SELECT dentro de tu propia consulta. En el caso de la actualización, la expresión lógica SI, se convierte a SIInm(expresion; verdadero ; falso ).
En el caso de unir varias tablas podrías generar una consulta única haciendo UNION SELECT o simplemente utilizando la consulta SELECT del sql pero para ello debe haber un campo en común por el cual digas "el valor de esta tabla debe ser igual a el valor de esta otra tabla ya que el identificador en ambas son iguales".
Avisame si ya tienes (el nombre de tu tabla y tus campos).
Hola gracias por la respuesta te comento que sí tengo ya las tablas con sus respectivas llaves las Tablas son: a_prueba_de_errores, atos_runways, matriculas, dso, metares.
En la tabla DSO existen 15.000 con los siguientes campos:Flight Date & Time, A/C Tail, Flight No, Departure Airport, Takeoff Runway, Arrival Airport, Landing Runway, WS, WD, TLA1C_LDG, TLA2C_LDG, TLA3C_LDG, TLA4C_LDG, FLAPC, CONF_LDG. A esta tabla quiero agregarle mas campos con informacion que se encuentra en las otras tablas, por ejemplo quiero agregar el campo fleet, este campo debe llenarse buscando el campo A/C Tail en la tabla matriculas campo matricula (llave) y debe insertar el campo flota fam.
otro campo que quiero agregar es psfw y este campo en excel lo llenaba con la fomula =SI(Y(IZQUIERDA(C77;1)="0";P77="B767 C");1;0) en la tabla DSO en donde C es campo Flight No, P es el campo fleet que deberia haber llenado antes.
¿Cómo inserto estos datos en la tabla DSO o en una nueva tabla?, de antemano gracias.
Saludos.
comencemos haciendo una simple consulta de seleccion que diga mas o menos lo siguiente "SELECT Flight Date & Time, A/C Tail, Flight No, Departure Airport, Takeoff Runway, Arrival Airport, Landing Runway, WS, WD, TLA1C_LDG, TLA2C_LDG, TLA3C_LDG, TLA4C_LDG, FLAPC, CONF_LDG FROM DSO". Esto devolvera todos los datos de la tabla señalada, pero queremos que traiga el campo fleet de la tabla matriculas, lo cual me dices que esta relacionada por A/C Tail, entonces quedaria: SELECT DISTINTC Flight Date & Time, A/C Tail, Flight No, Departure Airport, Takeoff Runway, Arrival Airport, Landing Runway, WS, WD, TLA1C_LDG, TLA2C_LDG, TLA3C_LDG, TLA4C_LDG, FLAPC, CONF_LDG, fleet FROM DSO, matriculas WHERE DSO.A/C Tail = matriculas.A/C Tail.
Si te das cuenta, esta tu consulta con dos tablas donde los campos de llave coincidan y ademas que devuelvan 1 solo registro para cada uno por eso usamos DISTINTC, y si quieres asignar otro campo de tu tabla matricula, solo lo llamas como lo hice con fleet pero no te olvides del WHERE para que coincidan tus llaves primarias.
En cuanto a tu fórmula, esta debemos saber primero si tomas los valores de tu tabla o simplemente es algo calculado, si son valores de tu tabla entonces usa CampoCalculado: SIInm(Left(FlightNo, 1)=0 Y fleet="B767 C");1;0).
Y con eso debería de funcionar. Si no te funciona, has la consulta primero, luego crea otra consulta con base a la primera consulta y pon ahí tu campo calculado.
Hola y gracias por la respuesta, me aparece error de sintaxis (falta operador), en la expresión de consulta 'DISTINCT DSO.[Flight Date & Time] Pero lo hice así:
SELECT DSO.[Flight Date & Time], DSO.[A/C Tail], DSO.[Flight No], DSO.[Departure Airport], DSO.[Takeoff Runway], DSO.[Arrival Airport], DSO.[Landing Runway], DSO.WS, DSO.WD, DSO.TLA1C_LDG, DSO.TLA2C_LDG, DSO.TLA3C_LDG, DSO.TLA4C_LDG, DSO.CONF_LD, DSO.[File No], matricula.[Flota Fam]
FROM matricula INNER JOIN DSO ON matricula.Matrícula = DSO.[A/C Tail];
Ahora tengo otra duda resulta que realice lo siguiente, agregue en un campo nuevo de la consulta lo siguiente: Redondea_id: Redondear([Flight Date & Time], 0) y me aparece el resultado que yo quiero por ejemplo 40391 que corresponde a la fecha 01-08-2010 pero luego agrego otro campo id: [Redondea_id] & [A/C Tail] & [Flight No] pero me cambia el valor antes redondeado a formato de fecha y me deja este resultado 01-08-2010CC-CPILPE257 y yo pretendo obtener este resultado 40391CC-CPILPE257 ¿cómo lo hago?, de antemano muchas gracias.
En cuanto al error de que falta operador, tu select lo hice sin tener los datos, de hecho fue para ilustrarte e iluminar tu camino en el SQL que esta detrás de las consultas que se arman en el modo diseño de Access, aunque me parece raro que te de ese error, seguramente algún campo estuvo mal especificado, o algo no estaba bien. Pero, si te ayude en algo con eso, ya me siento bien. (El distinct es para mostrar valores únicos casi lo mismo que el withowneraccessoption).
En cuanto a la conversión de tipos, utiliza el CDbl(TUCAMPOFECHA) como un 'campo calculado' en tu consulta o simplemente CDoble (creo que es en español en la consulta). Y luego concatena como quieres que sea tu resultado.
Excelente maestro ya esta tomando forma la tabla aun que aun me faltan varios campos que transformar de excel al access, aprovechando el impulso te comento otra duda que me apareció ahora, resulta que tengo un campo que tiene los siguientes datos: SCL-17L, AEP-13, SCL-17L, IQT-06, PMC-1, SCL-09 y yo solo necesito la parte numérica ej: el 13, 17, 6, 1, 9.
En excel tenia algo asi =SI(LARGO(G2)>=6;DERECHA(IZQUIERDA(G2;6);2)*10;"") 
Me sigues desde ya muchas gracas.
Saludos.
Hay algunas funciones en Access para acceder a partes de una cadena, Right o Left son algunas de ellas (creo que podes usar Der para derecha e Izq para izquierda). Su expresión creo que se forma Izq(TUCAMPO, Cantidad de carácter a extraer) por ejemplo = SCL-17L seria Der([Campo];3) y te va devolver 17L y aquí podes jugar con Der o Izq para quitar la parte numérica nuevamente algo como Izq(Der(CAMPO;3);2).
O en todo caso podrias introducir tu formula como SIInm(Longitud(TUCAMPO)>=6;Der(Izq(TUCAMPO;6);2)*10;"")
Excelente estimado complete la fórmula y apareció el campo impecable. Así quedo la fórmula anterior yb funciono impecable. Runway direction: SiInm(Longitud([Landing Runway])>="6",Der(Izq([Landing Runway],6),2),"")*10
Por casualidad sabrás calcular o existirá en access alguna función como en excel llamada radianes tengo que pasar esta fórmula y no logro dar con la función.
=SI(AC2<>"";-H2*COS(RADIANES(I2-AC2));"")
Saludos.
No sé, nunca usé valores de ángulos en mis aplicaciones a lo sumo pi y randomize para valores aleatorios. Creo que aqui podrás encontrar mayor info http://office.microsoft.com/es-hn/access-help/atn-funcion-HA001228789.aspx
Estimado ya calcule los radianes pero ahora tengo problemas para resolver este campo de excel al access. =SI.ERROR(BUSCARV(G2;'D:\base\[Base_ATO.xlsx]ATOs y Runways'!$K$1:$R$806;SI(P2="A320F";2;SI(O(P2="B767";P2="B767 C");3;4));0);BUSCARV(F2;'D:\base\Base_ATO.xlsx]A prueba de errores'!$A$1:$D$236;SI(P2="A320F";2;SI(O(P2="B767";P2="B767 C");3;4));0))
Tengo ATOs y Runways y A prueba de errores como tabla más la tabla de DSO, en access trato de la siguiente manera.
SiInm((EsNulo([Landing Runway]=[atos_runways].[Runway]),SiInm([Flota Fam]="A320F"),([atos_runways].[Flaps A320]),SiInm(or([Flota Fam]="B767",[Flota Fam]="B767 C"),([Flaps B767], [Flaps A340]),0)),SiInm(([Arrival Airport]=[atos_runways].[Runway]),SiInm([Flota Fam]="A320F"),([atos_runways].[Flaps A320]),SiInm(or([Flota Fam]="B767",[Flota Fam]="B767 C"),([Flaps B767], [Flaps A340]),0))
Pero no me funciona Saludos
Podrías replicar la función BuscarV de Excel con la función DBúsq(Campo;TablaENdondeBUSCAR;CondicionWHERE), y la función Error podrías tratarlo con EsError.
Como han dicho en otros post: Utiliza la ayuda sobre DBúsq (o DLookup en VBA) para más información.
Mas o menos: SIinm(EsError(DBúsq(Campo1;TablaENdondeBUSCAR;CondicionWHERE));0;DBúsq(Campo2;TablaENdondeBUSCAR;CondicionWHERE))).
Lo que explicado sería 'si es error en la búsqueda del campo1 que agregue cero, sino que busque en el campo2'.
No me funciona la fórmula la adapte pero no se como completar el where.
SIinm(EsError(DBúsq([Landing Runway],[Atos_runways],WHERE ));0;DBúsq(Arrival Airport;[Atos_runways];CondicionWHERE))).
estoy probando un SiInm pero tampoco me funciona
SiInm((([Landing Runway])=[Atos_runways].[Runway]),SiInm(([Flota Fam]="A320F"),[Atos_runways].[flaps A320]),SiInm(o(([Flota Fam]="B767"),([Flota Fam]="B767 C")),[Atos_runways].[Flaps B767],[Atos_runways].[Flaps A340]),0)
Saludos.
Where es una expresion que dice que haga tal cosa cuando es A=A y B=B aunque la traducción literal del ingles es Dónde.
Entonces si tienes un campo en común -llave- con tu otra tabla (en la que vas a buscar el dato) entonces sería Tabla1. CampoLLave1 = Tabla2. CampoLLave1 ya que campoLlave1 es igual en ambas tablas (o al menos tiene un campo en comun por el cual se pueden relacionar las tablas), igual al WHERE DSO.A/C Tail = matriculas.A/C Tail que te cité en la 4ta respuesta acerca de las consultas.
Saludos,
diego
Estimado no debe ser tan difícil pero no me funciona, te explico lo que quiero hacer. Tengo 2 tablas Tabla 1 y 2 en tabla 1 tengo 2 campos 1 llave otro solo ordenado en tabla 2 tengo muchos campos 1 llave el resto no
tabla 1 campo llave = tabla 2 campo llave ahora pregunto si el campo 1 de la tabla 1 = "A320F" entonces de la tabla 2 tráigame dato en posición de campo llamado Flaps A320. Si no es igual pregunto si el campo 1 de la tabla 1 ="B767" entonces de la tabla 2 tráigame dato en posición de campo llamado Flaps B767. Si no es igual pregunto si el campo 1 de la tabla 1 ="B767 C" entonces de la tabla 2 tráigame dato en posición de campo llamado "Flaps A340".
Si el campo 2 de la tabla 1 = "A320F" entonces de la tabla 2 tráigame dato en posición de campo llamado Flaps A320. Si no es igual pregunto si el campo 2 de la tabla 1 ="B767" entonces de la tabla 2 tráigame dato en posición de campo llamado Flaps B767. Si no es igual pregunto si el campo 2 de la tabla 1 ="B767 C" entonces de la tabla 2 tráigame dato en posición de campo llamado "Flaps A340".
Saludos.
Usuario:
Es sólo una búsqueda anidada que debes ir saltando si no produce tal condición, entiendo de la siguiente manera, si la búsqueda de dato en el campo1 de la tabla1 es igual a por, entonces te debe traer dato y, si no es así que busque otro dato y traiga z, si vuelve a no ser así que busque otro y traiga w, si no cumple con esas condiciones entonces que agregue ww.
Podría ayudarte esto:
NombreCampo:SIinm(DBúsq(campo1;tabla1;tabla1.campoLLAVE1=tabla2.campoLLAVE2)='A320F');tabla2.FLaps A320;SIinm(DBúsq(campo1;tabla1;tabla1.campoLLAVE1=tabla2.campoLLAVE2)='B767');tabla2.Flaps B767;SIinm(DBúsq(campo1;tabla1;tabla1.campoLLAVE1=tabla2.campoLLAVE2)='B767 C');tabla2.Flaps;"ww"))))
Excelente solución estimado ahí si me funciono la búsqueda, sabes tengo otra pregunta con respecto a búsqueda o expresión siinm no se como realizarlo a lo mejor existe alguna función que me sirva.
Tengo el dato PPT40426, 9375 el cual corresponde a un dato concatenado con una fecha covertida a serie, bueno este dato creado debo buscarlo en una tabla que mantiene el mismo campo pero no es exacto por ende la manera de traer algún dato relacionado del registro es buscar el dato más cercano mayor o menor por Ejemplo: PPT40426, 9375 Registro buscado, Registros limites PPT40427, 5625, PPT40425, 9375. Debería traerme el registro más cercano en este caso sería PPT40427, 5625 ya que se encuentra unas horas más cerca del dato buscado.
Saludos.
Podrías usar Like para traer lo aproximado en tu condición where por ejemplo '... like 'PPT4042%'. El cual debería devolverte los datos aproximados o en todo caso hacer un filtro [Between] en tu consulta y establecer ahí los parámetros para el filter.
Hola gracias hice un Between me funciono de esta manera.
New Key: SiInm(Error([genera_dso]![Key Metar] Entre ([Metares]![Estación IATA] & CDoble(Redondear([Fecha],0))+2+SiInm([minuto]>"30",[hora]+"1",[hora])/24) Y ([Metares]![Estación IATA] & CDoble(Redondear([Fecha],0))-2+SiInm([minuto]>"30",[hora]+"1",[hora])/24)),[Metares]![New Key],"NN")
Sabes la búsqueda anterior no estaba bien volví a generar la expresión y me emite mensaje "La expresión que ha especificado contiene una función con un numero incorrecto de argumentos", ¿qué estaré haciendo mal?
dato1: SIinm(DBúsq( [Flota Fam] ,[Genera_dso],[Genera_dso].[Landing Runway]=[atos_runways].[runway])="A320F"),[atos_runways].[FLaps A320],SIinm(DBúsq([Flota Fam] ,[Genera_dso],[Genera_dso].[Landing Runway]=[atos_runways].[runway])="B767"),[atos_runways].[Flaps B767],SIinm(DBúsq([Flota Fam] ,[Genera_dso],[Genera_dso].[Landing Runway]=[atos_runways].[runway])="B767 C"),[atos_runways].[Flaps B767],"0"))))
De antemano gracias.
1. Te falta ; en vez de ,
Access no admite ',' como referencia de fórmulas.
2. Mira tus criterios:
DBúsq( [Flota Fam] ;[Genera_dso];[Genera_dso].[Landing Runway]=[atos_runways].[runway] AND Genera_dso.Landing runway="A320F")
Estas colocando tres igualdades en tu criterio WHERE :
[Genera_dso].[Landing Runway]=[atos_runways].[runway])="B767"
3. Controla tus paréntesis de cierre
Uso access 2007, y el separador de lista de la configuración regional es "," todas las otras fórmulas me han funcionado. La expresión que dejo abajo me pregunta introduzca Genera_Dso también atos_runways!runway y luego me arroja puros #Error
DBúsq([Flota Fam],[Genera_dso],[Genera_dso]![Landing Runway]=[atos_runways]![runway])
¿Necesariamente debo cambiar el separador de listas?
Saludos.
Si te funciona el separador de listas, ok.
Lo de error no sé porque será pero me imagino que sería por el ! (Exclamación) que está en vez de . (punto) en tu sentencia DBúsq (al menos si estas tratando con tablas y no con forms).
Tu código dice:
DBúsq([Flota Fam],[Genera_dso],[Genera_dso]![Landing Runway]=[atos_runways]![runway])
En todo caso deberia ser:
DBúsq([Flota Fam],[Genera_dso],[Genera_dso].[Landing Runway]=[atos_runways].[runway])
Prueba y error...
Probé y no funciona te debo aclarar e Genera_dso es una consulta y no una tabla así como tu me dices que un formulario trabaja on ! ¿Cómo se hace para consultas?, creo que debe ser por eso.
Saludos.
Es bastante raro que te de error. Utiliza el punto en vez de !.
Podría ser también que tu consulta no está generando los datos que espera que genere la otra consulta o no actualiza tus datos de la misma.
Hazlo por separado para no tener dos kilómetros de sql y primero realiza tu consulta, luego crea otra consulta que tenga como base la primera consulta que generaste y la otra consulta 'Genera_dso' y trata de unir ahí los datos con 'las llaves'.
Me decidí y lo realice con el SiInm quedo así.
ATO_OK_Flaps?: SiInm([Landing Runway]=[atos_runways].[Runway],SiInm([Flota Fam]="A320F",[atos_runways].[Flaps A320],SiInm([Flota Fam]="B767" O [Flota Fam]="B767 C",[atos_runways].[Flaps B767],[atos_runways].[Flaps A340])),0)
¿Con respecto a otra consulta realizada la función Between no me sirve exactamente ya que solo trae el valor exacto dentro de un rango y lo que yo necesito es que dentro de un rango me traiga el valor más cercano éxito alguna función o habrá que agreagarle un adicional al between?.
Saludos gracias.
El Between es una forma de agrupamiento 'entre dos valores' digamos que si tienes tu consulta con un campo fecha e introduces un agrupamiento en criterios: Entre #01/01/2010# y #31/01/2010#, ahora lo que quieres hacer creo que es convertir a un double tu fecha, entonces creo que lo ideal sería hacer el criterio: Entre CDbl(AquiTuCampoInicio) Y Cdbl(AquiTuCampoFin) donde CampoInicio y CampoFin podrían ser los campos de un formulario en el cual cargas las fechas. De otra manera lo que podrías hacer es usar valores aleatorios o generar números aleatorios en un intervalo específico.
Aqui puedes chequear mayores detalles de esta función: http://office.microsoft.com/es-es/access-help/funcion-numaleat-HA001228901.aspx
Aunque yo me inclinaría por introducir los valores en un form y convertir las fechas a Dbl.
Todo lo que estoy realizando esta en una sola consulta es para armar un archivo, quiero aclarar la pregunta anterior, resulta que tengo una tabla origen con una columna que tiene datos alfanuméricos como este LIM40391, 1666666667 y una tabla destino con un campo que tiene los siguientes registros: LIM40391, 1666666664, LIM40391, 1666666665, LIM40391, 1666666668, LIM40391, 1666666670, LIM40391, 1666666671, LIM40391, 1666666663, en este caso la función o fórmula debería traerme el registro más cercano "LIM40391, 1666666668" y en el caso que hayan dos más cercanos como por ejemplo "LIM40391, 1666666666", "LIM40391, 1666666668" que traiga cualquiera.
Saludos y gracias.
Lo que se me ocurre es hacer el SELECT pero usando la expresión LIKE para obtener tus resultados, e introducir estos valores como valores de criterio en tu consulta o en un formulario. Si introduces como criterio de tu consulta sería: Como '166666666%' (igual a la expresión Like '166666666%') o si vas a introducir manualmente: Como [Valor a Filtrar] y te va mostrar una pantalla de introducción de parámetro. O en todo caso diseñas un formulario, en él un textbox con nombre Txt1 y un botón.
Al botón le dices que haga en el evento click y que en él abra la consulta con el DoCmd. OpenQuery. Y en tu consulta pones Como Forms! Formulario! Txt1.
Eso es lo que puedes hacer, y ahí te va mostrar tu consulta con esos valores próximos a lo que quieres.
Aqui podrías encontrar mayor info: http://sql.1keydata.com/es/sql-fonciones.php

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas