Exportar consultas de Access a Excel eligiendo la ruta




Estoy armando una aplicación en access con consultas especificas. Un formulario con casillas de verificación permiten elegir la consulta que quiero exportar.  
El código que se me ocurrió emplear es el siguiente:

Private Sub Aceptar\_Click()

mensaje = MsgBox("¿Desea bajar a su PC los archivos seleccionados? ", vbYesNo + vbQuestion, "Archivos de análisis")  
 If mensaje = vbYes Then  
 If V1 = -1 Then  
DoCmd. OutputTo acOutputQuery, "Informe A", "Excel97-Excel2003Workbook(*.xls)", "", False, "",, acExportQualityPrint  
 Else  
 End If  
 If V2 = -1 Then  
DoCmd. OutputTo acOutputQuery, "Informe B", "Excel97-Excel2003Workbook(*.xls)", "", False, "",, acExportQualityPrint  
 Else  
 End If  
 If V3 = -1 Then  
DoCmd. OutputTo acOutputQuery, "Informe C", "Excel97-Excel2003Workbook(*.xls)", "", False, "",, acExportQualityPrint  
 Else  
 End If  
 Else  
 Mensaje4 = MsgBox("La acción fue cancelada por el usuario. ", vbInformation, "Información")  
 DoCmd.Close  
 End If




End Sub

Me funciona pero me pide que le confirme el nombre del formulario, pero esto me permite seleccionar también la ruta donde se ha de grabar.  
El problema es que lo hace por cada formulario que tilde y son más de 10. Si le coloco el nombre del formulario en VB lo graba directamente en la ultima ruta y no me permite escoger otra.

Mi pregunta es: ¿Cómo debo hacer para elegir la ruta que deseo y que me la solicite solo una sola vez?. ¿Tal vez el código empleado no es el apropiado.?
¿Por que no pruebas con DoCmd. TransferText?


```
Dim miRuta As String
Dim mensaje as string
mensaje = MsgBox("¿Desea bajar a su PC los archivos seleccionados? ", vbYesNo + vbQuestion, "Archivos de análisis")
If mensaje = vbYes Then
miRuta = InputBox("Escribe la ruta donde quieras exportar")
If StrPtr(miRuta)=0 Then Exit Sub
If V1 = -1 Then
DoCmd.TransferSpreadsheet acExport, 8, "Informe A", miRuta & "\" & "Informe A", True, ""
End If
...

```
Un saludo.





Un nuevo foro de access, visítanos: <http://nksvaccessolutions.com/Foro/>
hola aldo! cómo resolviste esa ruta? estoy buscando información y no encuentro. yo tenía exactamente el mismo requisito. yo tenía mi propio usuario y la función de esquema y no desean migrar a la asp.net membresía esquema pero yo quería usar el asp.net mvc filtros de acción para la comprobación de autorización y las funciones. tuve que hacer una buena cantidad de cavar para encontrar exactamente lo que necesita ser hecho, pero al final fue relativamente fácil. me voy a ahorrar la molestia y diré lo que he hecho. 1) he creado una clase que deriva de sistema.de la web.de seguridad.membershipprovider. membershipprovider tiene un montón de métodos abstractos para todo tipo de autenticación relacionados con funciones como olvidé mi contraseña, cambiar contraseña, crear un nuevo usuario, etc. todo lo que quería era la capacidad de autenticar contra mi propio esquema. así que mi clase contenida principalmente vacía anula. acabo de anuló validateuser: public override bool validateuser(string username, string password) { if (string.isnullorwhitespace(username) || string.isnullorwhitespace(password)) return false; string hash = encryptpassword(password); user user = \_repository.getbyusername(username); if (user == null) return false; return user.password == hash; } 2) he creado una clase que deriva de sistema.de la web.de seguridad.roleprovider. de nuevo, yo sólo había vacío implementaciones para toda la pelusa no me necesita, como la creación y el cambio de roles. acabo de anuló dos métodos: public override string[] getrolesforuser(string username) { user user = \_repository.getbyusername(username); string[] roles = new string[user.role.rights.count + 1]; roles[0] = user.role.description; int idx = 0; foreach (right right in user.role.rights) roles[++idx] = right.description; return roles; } public override bool isuserinrole(string username, string rolename) { user user = \_repository.getbyusername(username); if(user!=null) return user.isinrole(rolename); else return false; } 3) luego he conectado a estas dos clases en mi web.config: eso es todo. el valor predeterminado de autorización de la acción de los filtros de utilizar estas clases. usted todavía tendrá que manejar la página de inicio de sesión y sesión. solo usar la autenticación de formularios de las clases para este como lo haría normalmente. hola compañera. 
felicidades por el esfuerzo. 
sobre tu consulta, podríamos mejorarla especificando el join que por default nos da el sistema, enlazando el encabezado y detalle del mismo documento: 
[imagen] 
por lo tanto, quedaría dela siguiente manera: 

select t0.docentry, t0.docnum, ‘los campos … tienes que comprobar 
  
<http://www.2-waysms.com/?page=delta> Básicamente hay varias cosas que puedes hacer. 

* usando `SqlBulkCopy.WriteToServer` que no funciona muy bien junto con EF, sin embargo, existen varios intentos para crear extensiones
* utilizando un procedimiento almacenado que tomará un registro grande y lo dividirá de acuerdo con alguna lógica
* utilizando parámetros de procedimiento almacenado escritos en la tabla y realice una llamada al procedimiento almacenado (y varias `insert ... select` dentro del procedimiento almacenado)

 En general, prefiero la tercera opción. 

 Marque esta pregunta [Entity Framework Stored Procedure Tabla Valor Parámetro](https://stackoverflow.com/questions/8157345/entity-framework-stored-procedure-table-value-parameter) **Descargo de responsabilidad** : soy el propietario del proyecto [Bulk Operations](http://bulk-operations.net/) 

 En resumen, este proyecto supera las limitaciones de SqlBulkCopy al agregar características IMPRESCINDIBLES como generar un valor de identidad insertado. 

 Debajo del capó, utiliza SqlBulkCopy y un método similar como @Mr Moose answer. 


```
var bulk = new BulkOperation(connection)

// Output Identity Value
bulk.ColumnMappings.Add("CustomerID", ColumnMappingDirectionType.Output);

// Map Column
bulk.ColumnMappings.Add("Code");
bulk.ColumnMappings.Add("Name");
bulk.ColumnMappings.Add("Email");

bulk.BulkInsert(dt);

```
  **EDITAR:** Responder comentario 


>  ¿puedo simplemente obtener una lista IL o simplemente veo que está guardada en la tabla de clientes, pero no hay ninguna variable donde pueda obtenerla? ¿Pueden ayudarme con eso? Entonces, inserto en la tabla Orders.CustomerID 
> 
> 

 Depende, puede mantener una referencia a la fila de datos del cliente denominada `CustomerRef` en la `DataTable` pedido. 

 Entonces, una vez que fusionó a su cliente, puede completar fácilmente una columna `CustomerID` de la columna `CustomerRef` en su Tabla de datos de pedido. 

 Aquí hay un ejemplo de lo que estoy tratando de decir: <https://dotnetfiddle.net/Hw5rf3> El equipo de EF, junto con P&P, se encuentra actualmente en el proceso de desarrollar una implementación de referencia de acceso a datos de EF (versión 4) que utiliza ASP.NET MVC como la interfaz. 

 El proyecto estará disponible de forma iterativa en CodePlex aquí: 

 <http://dataguidance.codeplex.com/> 

 Aún no hemos hecho nuestra primera fuente, pero ocurrirá en las próximas semanas. 

 ACTUALIZACIÓN: ahora hemos eliminado el código; tenga en cuenta que debe considerarse de calidad alfa y está sujeto a cambios. deberías verificar inicialmente si la condición del error es la siguiente:  
<http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q236/2/86.asp&nowebcontent=1>  
  
suerte! Recibí una respuesta de Brice Lambson que trabaja en el equipo central de EF: 


>  Vas en la dirección correcta: abre las conexiones menos. Recuerde, las conexiones SQLite son esencialmente secuencias de archivos, por lo que mantenerlas abiertas por más tiempo no es realmente un problema. 
> 
>  **Si solo hay una instancia de DbContext por conexión, DbContext aún puede ser propietario de la conexión, incluso si se crea externamente. Simplemente disponga la conexión dentro de DbContext.Dispose ().** 
> 
>  Si eso no es suficiente, puede intentar crear un grupo de conexiones. La gestión de la vida puede ser difícil. Lo importante es que una conexión no se usa fuera del hilo en el que se creó. 
> 
>  El uso de Cache = Shared (es decir, [Shared-Cache Mode](https://www.sqlite.org/sharedcache.html) ) también puede ayudar al rendimiento. 
> 
> si vas a consultar cualquier objeto o tabla de sap tienes basicamente 2 vias:

por una consulta select a traves del objeto orecordset de la diapi .

a traves de un select a la db de sap mediante una conexion odbc, ado, jdbc, etc…(dependera del lenguaje usado).

la tabla de condiciones de pago de lo…