Abrir siempre mismo informe pero distinto orden

Consulta:
Tengo en una consulta un botón, al cual le programe mediante código que abra un informe, el código es el siguiente.
 DoCmd.OpenReport stDocName, acPreview, , "  " & campox & "  BETWEEN  #" & Format(campo_desde, "dd/mm/yyyy") & "# AND #" & Format(campo_hasta, "dd/mm/yyyy") & "# "
campox = es el campo por el cual hago la consulta, en este caso serian campos tipo fecha.
campo_desde y campo_hasta= reciben una fecha desde una variable   
Quisiera ver la forma de ordenar el informe pero según el campo que yo quiera, en este caso campo_desde y campo_hasta es lo que me interesa. Sé!, que va ORDER BY campo, pero he probado miles de formas y no puedo poner la sentencia, me da error cuando le agrego el ORDER BY..., lo que entiendo es que debería ir detrás del ultimo signo # pero me da error, me podrías corregir donde iría el ORDER BY campo, ya que no doy en la tecla!
No se si el método, arriba mencionado funciona, pero me gustaría a que me des otra idea, sino lo puedo realizar de esa forma!.
Desde ya!.

3 Respuestas

Respuesta
1
De hceho todo l oque realizaste es innecesario :) existen las consultas parametrizadas :)
¿Cómo se hace eso? Bueno simplemente en el generado de consultas pones el formulario desde cual se enviara el parámetro a la consulta
=forms.miformulario.micampo
ahi mismo pones el order by segun el caso cual quieras ordenar :) y no tienes que hacer nada más
Gracias, por tu pronta respuesta, el tema es.. que estoy programando con código y no quería usar ningún tipo de asistente, ya que quiero utilizar esto para un sistema que estoy programando... Osea entiendo a que me indicas que utilice un asistente... ¿es así?
Saludos y gracias
PD: si no es así por favor necesitaría que me aclares tu respuesta...!
Ok algo que puedes hacer y yo lo hago para no complicarme con el SQL es hacer la consulta en el asistente y después darle vista SQL copiar el código y pasarlo a mi proyecto :) de esa forma me evito líos con sintaxis erróneas :) obviamente corro la consulta en el asistente para ver si me devuelve lo que yo necesito :)
mmmmmmmm, pero en el access, ¿cómo veo la sentencia sql?.. ¿En qué parte?, ¿No es algo interno?
Saludos!
Abres la base le das generar consulta generas la consulta y le das Vista Sql (click Derecho sobre la barra de titulo del generado de consultas) no es necesario guades la consulta
Respuesta
1
Lamento comentarte que lo que intentas hacer no lo puedes hacer, porque estás mezclando lenguaje SQL con lo que es simplemente crear un filtro.
Al abrir el report la condición WHERE no es propiamente una instrucción SQL, sino que es filtro (dicho de manera genérica). Ello impide que puedas hacer una ordenación.
Personalmente odio trabajar con los informes porque son "bichos" raros. Sintiéndolo mucho no puedo darte una solución al tema de la ordenación porque el objeto informe lleva su propio sistema de agrupación.
De hecho, si pruebas, por ejemplo, a hacer una consulta y un informe sobre ella, si después ordenas los diferentes campos de la consulta verás que el informe no te hace ni caso. Frustrante, realmente.
De todas maneras te ruego que no cierres la consulta. Estos días voy a hacer una serie de "investigaciones" para ver si hay alguna manera de "toquetear" los informes con código, y concretamente la forma de ordenación de los datos. Si encuentro alguna cosa útil te lo comento, y si no pues te tendré que decir que no ha habido manera :(
Una solución alternativa es, si no son muchos campos los que quieres ordenar, crear varias veces el mismo informe con distintas ordenaciones (a través del asistente, por ejemplo). Así, para llamar al informe, tendrías que incluir en el código del botón que comentabas un bloque IF... ENDIF, o un bloque SELECT CASE, y en función de lo que decida el usuario se abriría un formulario u otro. Si no tienes muy claro cómo se hace eso, y sigues con tu idea inicial (y yo no he podido encontrar cómo manipular el orden de los informes), me lo comentas y yo te lo explico con un poco más de detalle.
Bueno. Estamos en contacto.
Hola experto!, muchas gracias por tu pronta respuesta!, te comento a que una de las soluciones que se me ocurrió fue la de un select case o la del if, pero no quería hacer tantos informes, quería utilizar solo uno, me parece algo más elegante, pero bueno, puedo esperar un poco más y tratar de resolverlo lo más escuetamente posible!
Muchas gracias!, dejo el caso abierto por si se te ocurre otra posibilidad!
Creo que por fin he encontrado algo "potable" que da resultado.
Te explico cómo hacer lo de la ordenación del informe, a ver si funciona.
1.- Crea, en tu formulario, un combo (cancela el asistente).
2.- Sacas sus propiedades, te vas a la pestaña Datos y las configuras así:
...Origen de la fila: Select * from Tabla1
En vez de Tabla1 pones el nombre de tu tabla de trabajo, que contiene los campos por los cuales quieres realizar la ordenación.
... Tipo de origen de la fila: Lista de campos
3.- Te vas a la pestaña Otras->Nombre, y le pones de nombre cboOrdena
4.- Ahora te vas a tu código (el que comentabas en la consulta) y escribes el siguiente código:
---
Private Sub...
    Dim vCampo As Variant
    vCampo = Me.cboOrdena.Value
    If IsNull(vCampo) Then
        MsgBox "No hay ningún campo de ordenación", vbInformation, "SIN CAMPO"
        Me.cboOrdena.SetFocus
        Exit Sub
    End If
    DoCmd.OpenReport stDocName, acPreview, , "  " & campox & "  BETWEEN  #" & Format(campo_desde, "dd/mm/yyyy") & "# AND #" & Format(campo_hasta, "dd/mm/yyyy") & "# "
    Reports!RTabla1.OrderBy = vCampo
    Reports!RTabla1.OrderByOn = True
---
Tienes que cambiar RTabla1 (en negrita) por el nombre de tu informe.
Ahora el combo te permitirá elegir un campo, que será el que fije la ordenación del informe.
Ya me dirás qué tal te ha ido.
Hola Experto, gracias por ayudarme!, te comento que realize el ejemplo como me lo indicas, y funciona, pero con algunas fallas, te muestro como me quedo el código
Dim stDocName As String
   stDocName = "listado_filtrado"
  Dim vCampo As Variant
    vCampo = Me.cboOrdena.Value
    If IsNull(vCampo) Then
        MsgBox "No hay ningún campo de ordenación", vbInformation, "SIN CAMPO"
        Me.cboOrdena.SetFocus
        Exit Sub
    End If
    DoCmd.OpenReport stDocName, acPreview, , "  " & campox & "  BETWEEN  #" & Format(campo_desde, "dd/mm/yyyy") & "# AND #" & Format(campo_hasta, "dd/mm/yyyy") & "# "
    Reports!listado_filtrado.OrderBy = vCampo
    Reports!listado_filtrado.OrderByOn = True
Me gustaría que en el combo box no me muestre directamente los nombres de los campos de la tabla, ¿osea le puedo poner el nombre que yo quiero pero que apunte a un determinado campo? ¿Para el tema de la selección?, imaginate que el usuario no tiene porque conocer los nombres de los campos de la tabla...
Desde ya muchas gracias!
El código que te pasé lo testee en una miniBD y a mí no me provoca ningún error. Si no me dices en qué te falla en principio yo veo el código correcto.
Para el tema que comentas de los valores del combo no hay problema (exceptuando que es un poquito más de trabajo).
Saca las propiedades del combo y te vas a la pestaña Datos. Lo configuras de la siguiente manera:
... Tipo de origen de la fila: lista de valores
... Origen de la fila: -> aquí escribes los valores que quieres que salgan, separados por punto y coma. Suponiendo que escribas dos valores, que me los invento, pondríamos: "Opción1";"Opción2"
Ahora nos vamos al código y tenemos que escribir, entre el END IF y el DOCMD.OPENREPORT, lo siguiente
Select Case vCampo
    Case "Opción1"
        vCampo=NombreCampo1
    Case "Opción2"
        vCampo=NombreCampo2
End Select
Donde NombreCampoX sería el nombre del campo por el que quieres que te ordene. Evidentemente, si tienes 4 opciones sólo tendrías que ir añadiendo los Case correspondientes.
Bueno. Ya me dirás si la cosa funciona ;)
Experto!, ante todo y nuevamente GRACIAS por tu ayuda!, con respecto a el código lo realice como me indicas, pero no se, funciona mal, osea, eroorr de compilación, no es... ejecuta bien, pero el resultado del listado es el que funciona mal...
Private Sub Comando7_Click()
    Dim vCampo As Variant
    vCampo = Me.cboOrdena.Value
    stDocName = "listado_filtrado"
    If IsNull(vCampo) Then
        MsgBox "No hay ningún campo de ordenación", vbInformation, "SIN CAMPO"
        Me.cboOrdena.SetFocus
        Exit Sub
    End If
    Select Case vCampo
    Case "Por Fecha de Ingreso"
        vCampo = "fecha_ingreso"
    Case "Por Fecha de Egreso"
        vCampo = "fecha_egreso"
    End Select
    DoCmd.OpenReport stDocName, acPreview, , "  " & vCampo & "  BETWEEN  #" & Format(campo_desde, "dd/mm/yyyy") & "# AND #" & Format(campo_hasta, "dd/mm/yyyy") & "# "
    Reports!listado_filtrado.OrderBy = vCampo
    Reports!listado_filtrado.OrderByOn = True
End Sub
Si hago una consulta me da un cantidad determinada de registros (si chequeo manualmente, esta mal..!) Y si hago otra consulta me da correcto. ¿Cómo podría monitorear la sentencia select para ver si esta correctamente escrita?, o donde podría seguir controlando para ver el posible error...
Saludos!
Creo que ha llegado el duro momento de decirte que así, "a distancia", no sé qué puede estar funcionando mal sin ver tu BD.
¿Podrías enviarme una copia de tu BD comprimida en zip? Si tienes datos confidenciales puedes borrar los registros, pero por favor déjame algunos, si quieres inventados, para poder hacer pruebas.
Mi correo es [email protected]
Bueno, ya me dirás cosas.
No he tenido noticias tuyas. ¿Todo bien?
Hola experto te envíe el mail, cuando me dijiste...! A esta dirección (xxxxxx)... ¿no te llego?
Pues lamento decirte que no me ha llegado nada. Por favor, vuélvelo a probar ahora, que veo que estás on line. Confírmame en Todoexpertos cuando la hayas enviado (esta segunda vez), y revisaré de nuevo el correo.
La dirección está bien, pero por si acaso te la repito
[email protected]
Te lo acabo de enviar.. nuevamente
Saludos
OK. Recibido.
Te digo cosas.
Te he remitido un mail con la solución. Please, confírmame aquí o por mail que lo has recibido.
Hola!, quería agradecerte por toda tu ayuda!, sos un genio, veo que la tienes muy clara con access, si hubiese más puntuación te doy el doble... Gracias!, te voy a guardar como favorito y seguramente te voy a molestar más adelante..!
SALUDOS..! Y graciasssssssssssssssssssss!
Respuesta
Mirate la sintaxis de docmd. Openreport y verás que no se puede incluir la propiedad Order by.
OK!, y entonces que método me recomendarías, para utilizar siempre un mismo informe, pero con distinto orden de campo, osea, según el valor que tenga la variable que le envío (el valor que enviaría seria el nombre del campo por el cual quiero que la lista salga ordenada).
Saludos
Desconozco las ordenes correctas, pero puedes crear o modificar el origen del informe con la propiedad de recordsource indicándole una orden sql cambiándole el orden y luego llamar al report.
Mirate esta ayuda, puede interesarte.
http://office.microsoft.com/es-hn/access-help/recordsource-propiedad-HA001232789.aspx

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas