[RESUELTO] Cerrar INFORME tras IMPRIMIR (automáticamente)

Discute sobre las herramientas de la base de datos
Responder
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

[RESUELTO] Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por HSEGROD »

Os amenazé con volver... y Siempre cumplo... :knock:

Al Grano.. Formulario... con Botón propio "GUARDAR REGISTRO" que a la vez que guarda, manda a imprimir dos Informes: Uno de Etiquetas (Inf_Etiquetas) y otro de Pulseras (Inf_Pulseras).
Aparte existen otros dos Botones para Imprimir Estos dos informes por separados.
Con distintas macros como la siguiente, se abren los informes (lo ideal es que ni siquiera SE ABRIERAN, ya que no es indispensables verlos) y después sale el Cuadro de Diálogo de Impresión para elegir sólo la impresora de cada Formulario (son distintas).

Código: Seleccionar todo


REM ------------------------------------- ABRIR Informe de Etiquetas
Sub ImprEtiquetas (Evento)

	Dim oForm As Object
	Dim Control as Object
	Dim oRegistro as integer
	Dim oConsulta as Object	
   	Dim oReporte As Object	
	Dim oCampoRegistro As Object
	'El formulario activo
	oForm = Evento.Source.Model.Parent	
	'El campo con el ClavePaciente
	oCampoRegistro = oForm.GetByName("NReg")
	'Debe ser mayor a cero
	If oCampoRegistro.BoundField.Int > 0 Then 
		'La consulta en la que se basa el reporte
		oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")
		'Modificamos la consulta de modo que tome el registro actual				
		oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int
		'El informe a mostrar ------- Etiquetas
		oReporte = ThisDatabaseDocument.ReportDocuments.getByName ("Inf_Etiquetas")	
		'Mostramos el reporte
		oReporte.Open
		 Wait (1000)
		'Abrimos Cuadro de Impresoras
		GlobalScope.BasicLibraries.LoadLibrary("Tools")
   		DispatchSlot(5504)
	end if

End Sub
Funciona todo Bien.. pero tengo varias cuestiones..
1.- Se podría Imprimir directamente sin tener que abrir el Informe?
2.- Se le puede asignar directamente a cada Informe el nombre de la Impresora a la que se dirigiría? (Ahora mismo le pondríamos como nombre "Microsoft Print to PDF")
3.- En caso contrario, Se puede cerrar automáticamente el Informe después de Impreso?


Bueno.. Con el siguiente código (que lo he tenido que quitar) logro que se cierren, después de Impresos, pero SÓLO SI SE ABREN por separados y no Juntos (con el Botón GUARDAR (e Imprimir))

Código: Seleccionar todo

Sub CerrandoInformes()
 oDocumentos = StarDesktop.getComponents()                                                ' Documentos que hay en el escritorio
    oEnumeraDocumentos = oDocumentos.createEnumeration()                                     ' Enumeramos los documentos
    Do While oEnumeraDocumentos.hasMoreElements()                                            ' Mientras haya más elementos
    oDocumento = oEnumeraDocumentos.nextElement()                                            ' Vamos al siguiente
    If HasUnoInterfaces(oDocumento, "com.sun.star.frame.XModel") Then                        ' Si tiene modelo
    If left(oDocumento.getTitle(),4)="Inf_" Then 
    oDocumento.close(True)
    End if
    End if
    Loop
end sub
y eso que hasta lo he Asignado en EDITAR INFORME - HERRAMIENTAS - PERSONALIZAR - IMPRESIÓN DE DOCUMENTOS... pero no hace nada...
He buscado algún Evento "DESPUÉS DE IMPRIMIR" pero no lo encuentro por ningún lado...

Bueno.. si podéis echarle un vistazo... os lo agradecería enormemente...
Un Saludo desde Canarias... 8-)
Adjuntos
DragoOpenOffice.7z
(123.67 KiB) Descargado 216 veces
Última edición por HSEGROD el Jue Abr 26, 2018 12:53 am, editado 1 vez en total.
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por Longi »

Buenas!
El informe, a día de hoy no he sido capaz de imprimirlo sin abrirlo (también tendría su lógica), pero podría intentarse minimizado.
Al abrir el Slot de impresoras estás abriendo un cuadro de diálogo, que deja en StandBy cualquier código hasta que se cierre ese cuadro de diálogo, por lo que de esa manera no es posible lo que pretendes.
Se puede imprimir directamente en la impresora predeterminada, y creo que se puede asignar una impresora en concreto, y sin abrir el Slot, con lo que te dejaría vía libre a la opción de cerrar el documento después de la impresión.

Mira estos hilos:
https://forum.openoffice.org/en/forum/v ... 21&t=56713
https://forum.openoffice.org/es/forum/v ... 31&t=13470

En este último se usa una técnica de 'Mauricio el Grande', en la que en vez de generar un informe se tiene una plantilla en writer, que se rellena con los datos necesarios. También en este caso, conseguimos una impresión sin que aparezca en pantalla el informe (plantilla de writer). No se dirigió a ninguna impresora en particular, por lo que va a la predeterminada, pero supongo que con pequeñas modificaciones no habría problema.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por HSEGROD »

Gracias Longi...

ya he estado trasteando con esas enormes macros que me aconsejaste ... sobre todo con la parte...

Código: Seleccionar todo

Sub Letter_close()
   DIM oDoc AS Object, oCursor AS Object, oText AS Object
   DIM iPageCount AS Integer, n AS Integer
   DIM sPage AS String
   DIM sPrinter AS String
   DIM sActionText AS String

   REM Initiate Errorhandler
   On error GoTo ErrorHandler

   sPrinter= ShowListPrinters()
   oDoc   = ThisComponent

   REM Count the amount of pages
   iPageCount = oDoc.getCurrentController().getPropertyValue("PageCount")

'Print stat
   REM Print the first page
   Print_stat_first(1, sPrinter)

   REM Loop over every next page and print it
   For n = 2 to iPageCount
      Print_stat_rest(n, sPrinter)
   next

'Print copy
   REM Insert timestamp of sending
   sActionText = "KOPIE"
   InsertDTstampFirstPage(sActionText)

   REM Loop over every next page and print it
   For n = 1 to iPageCount
      Print_plain(n, sPrinter)
   next

   REM Remove the copystamp-frame
   RemoveDTstamp()

'Exit
   REM Save and close the document
   closeDocument(oDoc)

'ErrorHandler
Exit Sub
   ErrorHandler:
   Reset
   MsgBox "Error " & Err & ": " & Error$ + chr(13) + "At line : " + Erl + chr(13) + Now , 16 ,"an error occurred"
End Sub
que creo que es la parte que me podría interesar...pero entre mi nefasto inglés y mi nulo alemán.... no he podido hacer que funcione...

Supongo que lo dejaré así y que los compañeros se molesten un poco, aunque sea eso, y elijan LA IMPRESORA, EL NUMERO DE COPIAS Y CIERREN EL INFORME...

Gracias..... :super: :super:
Apache OpenOffice 4.1.5 -- Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por HSEGROD »

Bueno... como soy un cabezota (aparte de Aries)... le he seguido dando vueltas y buscando... y he llegado a este hilo...

https://forum.openoffice.org/en/forum/v ... =5&t=28752

y .. pensando ... (y es aquí donde meto la pata :roll: )...

Se puede poner una macro en OpenOffice (Mis Macros y Dialogos) que al abrir cualquier documento y según el nombre que tenga el documento se imprima...?? o es una locura ponerlo en práctica..??

pero claro no sé que inconvenientes me puede ocasionar al ponerlo en el OpenOffice del trabajo...

La Macro la he puesto en Mis Macros y Dialogos y en Herramientas-Personalizar-Eventos-AbrirDocumento la Acción Asignada :"ImprimimosDirectamente" que según sea el nombre del Documento abierto lo imprime o no...

la macro sería..

Código: Seleccionar todo


Sub ImprimimosDirectamente ()

Dim oDoc As Object
Dim sRuta As String
Dim sDirectorio As String
Dim sNombre As String
Dim mDatos()
Dim sMensaje As String
	REM ------------ Primero averiguamos el nombre del Archivo que se abre -------------------------------
   	 oDoc = ThisComponent
   If oDoc.hasLocation Then
      sRuta = oDoc.URL
      mDatos = Split(sRuta,"/")
      sNombre = mDatos(UBound(mDatos))
      mDatos(UBound(mDatos)) = ""
      sDirectorio = ConvertFromURL(Join(mDatos,"/"))
     sMensaje = "El nombre del archivo es: " & sNombre & Chr(10) & "El directorio es: " & sDirectorio   ' Sólo nos interesa saber el nombre del Archivo que se abre
    ' msgbox sMensaje
     REM --------------------------- Si los archivos abiertos son de los Informes de la Base de Datos... Los mandariamos a Imprimir cada uno en su Impresora ---------- 
      if left (sNombre, 5)= "Inf_E" then 
      Call PrintDoc("Microsoft Print to PDF") ' Pondríamos el nombre de la Impresora de Etiquetas ("PRT11487")
      end if
      
      if Left (sNombre, 5)= "Inf_P" then 
      Call PrintDoc("Microsoft Print to PDF") ' Pondriamos el nombre de la IMpresora de Pulseras  ("PRT09828")
      end if
      
      if Left (sNombre, 5)= "Inf_T" then 
      Call PrintDoc("Microsoft Print to PDF") ' Pondríamos el nombre de la Impresora de Informes  (\\srvprt\jd05047)
      end if
   Else
      MsgBox "El documento no esta guardado"
   End If
End Sub


Sub PrintDoc(PrinterName As String)
DIM oPropertyValue(0) AS New com.sun.star.beans.PropertyValue
Dim oPrinterSettings(0) As New com.sun.star.beans.PropertyValue
DIM oDoc As Object
'DIM oSettings As Object, not needed for basic printing

oDoc = ThisComponent

' *** This works to set which printer I will send output to ***
' ***  I do not yet know how to pass arguments to the Fax server: number to call, cover page info, etc ***
If (LEN(PrinterName) > 1) Then  '*** If printer name supplied, then send output to that printer, otherwise, use default printer ***
   oPrinterSettings(0).Name = "Name"
   oPrinterSettings(0).Value = PrinterName
   oDoc.setPrinter(oPrinterSettings)
EndIf
' *** I do not think oSettings is needed for basic printing.  It looks like it pertains to the document ****
'oSettings = oDoc.createInstance("com.sun.star.text.DocumentSettings")
'   oSettings.PrintPageBackground = False
REM Set some print options
oPropertyValue(0).Name = "CopyCount"
oPropertyValue(0).Value = 1

oDoc.Print(oPropertyValue())
End Sub

Por ahora va semi Bien.... se abren los informes desde la Base... y sale el cuadro de diálogo de Imprimir porque tengo la impresora de pdf asignada, por lo que creo que imprimirian directamente si les asigno las verdaderas (las del Entorno del Trabajo)..

El único problema que se me ha planteado es... si anulo la impresión... al volver querer imprimir SE CIERRA TOTALMENTE el OpenOffice...
Espero que ese sea sólo el único problema...

Bueno .... Dos cuestiones...
1.- alguien se atreve a aventurarme si PUEDEN ocasionarse más problemas añadidos por poner las macro en Mis Macros y Diálogos...?
2.- como puedo cerrar directamente SOLO EL INFORME después de impreso dicho Informe? le he puesto un oDoc.Close(True) ... al final de la macro pero también SE CIERRA TOTALMENTE el OpenOffice...
 Editado: Este último punto ya lo he solventado 
He aplicado esta macro, pero desde El propio Formulario....

Código: Seleccionar todo

Sub CerrandoInformes()
 	oDocumentos = StarDesktop.getComponents()                                                ' Documentos que hay en el escritorio
    oEnumeraDocumentos = oDocumentos.createEnumeration()                                     ' Enumeramos los documentos
    Do While oEnumeraDocumentos.hasMoreElements()                                            ' Mientras haya más elementos
    oDocumento = oEnumeraDocumentos.nextElement()                                            ' Vamos al siguiente
    If HasUnoInterfaces(oDocumento, "com.sun.star.frame.XModel") Then                        ' Si tiene modelo
    REM ------------ Comparo los archivos que hay en el escritorio con los Informes --------------------------------------
    If left(oDocumento.getTitle(),4)="Inf_" Then 
    nombredocumento = oDocumento.getTitle()
    oDocumento.close(True)
    End if
    End if
    Loop
end sub
y parece que va funcionando.....Graciassss otra vezzz... :ucrazy: :ucrazy:
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por Longi »

 Editado: Lo siento, respondí sin ver el último post que colgaste
Si te fijas, en esta macro no se ve el informe cuando lo imprimes, pero no puse nada sobre cerrarlo (que sería 'oDocument.close', ya que esaría trabajando sobre el propio informe -oDocument-).
En cuanto a las cuestiones planteadas decir que no solo puedes escoger según archivo, sino también según usuario, de tal modo que cada usuario podría tener una impresora diferente para imprimir el mismo documento.
No tengo mucha experiencia, pero yo no suelo poner el código en "mis macros", siendo así portable sin problemas. Creo que de otro modo tienes que andar instalando en cada ordenandor lo que tengas en "mis macros" 
Buenas!
Solo tienes que cambiar el nombre de la impresora, y el nombre de la macro para que te imprima etiquetas sin que se vea el informe (o eso creo)
La verdad es que es una macro superinteresante (es de Nocton y FK3Total, ayudado por Mauricio en el sprint final). Si funciona la podríamos colgar como macro de ejemplo para uso general, si los popes no se oponen a ello o la mejoran, claro está.

Código: Seleccionar todo

Sub Imprimir (Evento)
    '------------------------------------------------------------
    ' Adaptado de Nocton, FK3Total y Mauricio

	Dim oForm As Object
	Dim Control as Object
	Dim oRegistro as integer
	Dim oConsulta as Object	
   	Dim oReporte As Object	
	Dim oCampoRegistro As Object

	oForm = Evento.Source.Model.Parent	                                      	' El formulario activo
	oCampoRegistro = oForm.GetByName("NReg")                                	' El campo con el ClavePaciente
	If oCampoRegistro.BoundField.Int > 0 Then                               	' Debe ser mayor a cero
	oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")	' La consulta en la que se basa el reporte
	oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int 	' Modificamos la consulta de modo que tome el registro actual				
	aReportName= "Inf_Etiquetas"                                                ' Nombre del informe
	oConnection=oForm.Activeconnection                                          ' Conexión con el formulario
    oReportsDocuments=oConnection.parent.DatabaseDocument.ReportDocuments       ' Apuntamos al contenedor de informes
    '----------------------------------------------------------------
    ' Manipulamos el informe
   
    dim aProp(3) as new com.sun.star.beans.PropertyValue                        ' Array de propiedades
    dim aProp2                                                                  ' Variante del array anterior
    dim oReportDesign                                                           ' Variable
    aProp(1).Name = "ActiveConnection"                                          ' Nombre de propiedad
    aProp(1).Value = oConnection                                                ' Conexión
    aProp(0).Name = "Hidden"                                                    ' Trabajar escondido
    aProp(0).Value = True                                                       ' Ciertamente trabaja escondido
    aProp(2).Name = "OpenMode"                                                  ' Modo de apertura
    aProp(2).Value = "openDesign"                                               ' Abre en forma de diseño
    let aProp2=aProp                                                            ' Igualamos el array. La razón es porque es posible que los valores cambien al cargar el documento
    '------------------------------------------------------------
    ' Abrimos el informe
    
    oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp()) ' Aunque se abre, queda oculto
    '---------------------------------
    ' Dos valores deben cambiar
    
       aProp2(0).Value = True                                                    ' Es en el segundo array
       aProp2(2).Value = "open"                                                  ' Es en el segundo array

    '---------------------------------------------------------------
    ' Manejamos el documento final, también en segundo plano y escogemos la impresora

    oDocument=oReportsDocuments.loadComponentFromURL(aReportName ,_blank,0,aProp2())
    
    Dim mDI(1) As New com.sun.star.beans.PropertyValue                           ' Array de valores
    Dim mOpc()                                                                   ' Array de opciones
    mDI(0).Name = "Name"                                                         ' Propiedad nombre
    mDI(0).Value = "HP LaserJet 1150 (Copiar 1)"                                 ' Nombre de la impresora
    oDocument.setPrinter( mDI )                                                  ' Establecemos las opciones de la impresora
    oDocument.Print( mOpc() )                                                    ' Enviamos a imprimir

End sub

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por HSEGROD »

Graciassss Longi... Es la mejor que he encontrado...

sólo lo falta un End If al final... :oops: , pero por el resto funciona perfecto..

Yo la he adaptado a mis necesidades:
- 4 informes distintos, por lo que le he asignado el nombre de cada Informe a Botón Pulsado con lo que el .... aReportName= Evento.Source.Model.Tag
- Un número de copias determinado (ncopias) a imprimr en cada informe
- Elección de la Impresora según el nombre del Informe...

Con lo que ME HA QUEDADO DE LUJO... :bravo: :bravo: :bravo:
La macro modificada ha quedado así...

Código: Seleccionar todo

REM ------------- Macro para Imprimir, Según El Botón Pulsado, Cada Informe en Su Impresora, un número de copias determinado 
Sub Imprimir (Evento)
    '------------------------------------------------------------
    ' Adaptado de Nocton, FK3Total y Mauricio

   Dim oForm As Object
   Dim Control as Object
   Dim oRegistro as integer
   Dim oConsulta as Object   
   Dim oReporte As Object   
   Dim oCampoRegistro As Object
   Dim ncop	As Integer
   Dim ncopias As Integer
   	
   oForm = Evento.Source.Model.Parent   		                                         ' El formulario activo
   oCampoRegistro = oForm.GetByName("NReg")   			                                 ' El campo con el ClavePaciente

If oCampoRegistro.BoundField.Int > 0 Then             			                     ' Debe ser mayor a cero
   oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")   ' La consulta en la que se basa el reporte
   oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int    ' Modificamos la consulta de modo que tome el registro actual            
   aReportName= Evento.Source.Model.Tag                               			         ' Nombre del informe, depende del Nombre puesto en la "Información Adicional" del Botón Presionado
  
    oConnection=oForm.Activeconnection                                          		 ' Conexión con el formulario
    oReportsDocuments=oConnection.parent.DatabaseDocument.ReportDocuments     			 ' Apuntamos al contenedor de informes
    '----------------------------------------------------------------
    ' Manipulamos el informe
   
    dim aProp(3) as new com.sun.star.beans.PropertyValue                     			 ' Array de propiedades
    dim aProp2                                                              		     ' Variante del array anterior
    dim oReportDesign                                                        			 ' Variable
    aProp(1).Name = "ActiveConnection"                                    			     ' Nombre de propiedad
    aProp(1).Value = oConnection                                      			         ' Conexión
    aProp(0).Name = "Hidden"                                        			         ' Trabajar escondido
    aProp(0).Value = True                                           			         ' Ciertamente trabaja escondido
    aProp(2).Name = "OpenMode"                                                 			 ' Modo de apertura
    aProp(2).Value = "openDesign"                                               		 ' Abre en forma de diseño
    let aProp2=aProp                                                         			 ' Igualamos el array. La razón es porque es posible que los valores cambien al cargar el documento
    '------------------------------------------------------------
    ' Abrimos el informe
    
    oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp()) 	 ' Aunque se abre, queda oculto
    '---------------------------------
    ' Dos valores deben cambiar
    
       aProp2(0).Value = True        		                                             ' Es en el segundo array
       aProp2(2).Value = "open"              			                                 ' Es en el segundo array

    '---------------------------------------------------------------
    ' Manejamos el documento final, también en segundo plano y escogemos la impresora

    oDocument=oReportsDocuments.loadComponentFromURL(aReportName ,_blank,0,aProp2())
    
    Dim mDI(1) As New com.sun.star.beans.PropertyValue                           ' Array de valores
    Dim mOpc()                                                                   ' Array de opciones
                                                           

   if 	aReportName = "Inf_Etiquetas" then
   mDI(0).Name = "Name"  														'Propiedad nombre
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Cambiar Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 8
   end if
   
   If aReportName = "Inf_Pulseras" then
   mDI(0).Name = "Name"
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 1
   end if
  
   If aReportName = "Inf_Total" or aReportName = "Inf_Justificante" then
   mDI(0).Name = "Name" 
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- InformeTotal y Justificante  ("jd05047")
   ncopias = 1
   end if
 
    oDocument.setPrinter( mDI )                                                  ' Establecemos las opciones de la impresora
    MSGBOX "Se imprimirán " & ncopias & " copias del Informe: " & aReportName  	 ' Desactivar al Implementar Finalmente

	REM ------------------------- Copiamos un número de copias determinado según el Informe elegido
    for ncop = 1 to ncopias
    oDocument.Print( mOpc() )                                                    ' Enviamos a imprimir
    next ncop

end if
End sub


Por lo cual... Doy el Hilo como [RESUELTO] pero si que me gustaría simplemente que me aclaréis si...
a) Los Informes "abiertos" en escondido (Hidden)... Hay que cerrarlos de alguna manera o es que.. ni siquiera están abiertos...??
b) Se pueden poner varias opciones (separadas por coma o guión) en la "Información Adicional" de algún Botón...??

Agradeciendo otra vez .. os Saludo... 8-)
Apache OpenOffice 4.1.5 -- Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por HSEGROD »

Bueno... está claro que... cada vez que intento modificar alguna Maravillosa macro... LA FASTIDIO.... :crazy: :crazy:

Os pongo en situación..
la macro anterior, sugerida por Longi... me funciona de maravilla cuando la efectúo desde cualquier botón adecuado a ella:

- Un botón para imprimir Pulsera (Con el Tag del Botón con el nombre del Informe)
- Un botón para imprimir Etiquetas (Idem)
- Un botón para imprimir Informe Total de pacientes en Urgencias (Idem)

pero el asunto es.. cuando se crea una Entrada de urgencias y se introducen los datos del paciente, tengo un botón para guardar y lo ideal es que después de guardar los datos (que eso lo hace ya bien) se imprima directamente la Pulsera y las Etiquetas (son 8 copias iguales).
Este último Botón (Guardar e IMPRIMIR) No puede tener varios nombres de informes en el TAG, por lo que he hecho otra macro (que es la que no me funciona bien) con un bucle para que me imprima los 2 Informes: Inf_Pulseras y Inf_Etiquetas.

El código es el siguiente:

Código: Seleccionar todo


Sub ImprimirEtiquetasPulsera (Evento)
  
   Dim oForm As Object
   Dim Control as Object
   Dim oRegistro as integer
   Dim oConsulta as Object   
   Dim oReporte As Object   
   Dim oCampoRegistro As Object
   Dim ncop	As Integer
   Dim ncopias As Integer
   Dim nInforme as Integer
   	
   oForm = Evento.Source.Model.Parent   		                                         ' El formulario activo
   oCampoRegistro = oForm.GetByName("NReg")   			                                 ' El campo con el ClavePaciente
   If oCampoRegistro.BoundField.Int > 0 Then             			                     ' Debe ser mayor a cero

  For nInforme =1 to 2
  if nInforme = 1 then
  aReportName = "Inf_Pulseras"
  else
'  wait 1000
  aReportName = "Inf_Etiquetas"
  end if
  
    oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")   ' La consulta en la que se basa el reporte
    oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int    ' Modificamos la consulta de modo que tome el registro actual            
    oConnection=oForm.Activeconnection                                          		 ' Conexión con el formulario
    oReportsDocuments=oConnection.parent.DatabaseDocument.ReportDocuments     			 ' Apuntamos al contenedor de informes
    '----------------------------------------------------------------
    ' Manipulamos el informe
   
    dim aProp(3) as new com.sun.star.beans.PropertyValue                     			 ' Array de propiedades
    dim aProp2                                                              		     ' Variante del array anterior
    dim oReportDesign                                                        			 ' Variable
    aProp(1).Name = "ActiveConnection"                                    			     ' Nombre de propiedad
    aProp(1).Value = oConnection                                      			         ' Conexión
    aProp(0).Name = "Hidden"                                        			         ' Trabajar escondido
    aProp(0).Value = True                                           			         ' Ciertamente trabaja escondido
    aProp(2).Name = "OpenMode"                                                 			 ' Modo de apertura
    aProp(2).Value = "openDesign"                                               		 ' Abre en forma de diseño
    let aProp2=aProp                                                         			 ' Igualamos el array. La razón es porque es posible que los valores cambien al cargar el documento
    '------------------------------------------------------------
    ' Abrimos el informe
    
    oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp()) 	 ' Aunque se abre, queda oculto
    '---------------------------------
    ' Dos valores deben cambiar
    
       aProp2(0).Value = True        		                                             ' Es en el segundo array
       aProp2(2).Value = "open"              			                                 ' Es en el segundo array

    '---------------------------------------------------------------
    ' Manejamos el documento final, también en segundo plano y escogemos la impresora

    oDocument=oReportsDocuments.loadComponentFromURL(aReportName ,_blank,0,aProp2())
    
    Dim mDI(1) As New com.sun.star.beans.PropertyValue                           ' Array de valores
    Dim mOpc()                                                                   ' Array de opciones
                                                           

   if 	aReportName = "Inf_Etiquetas" then
   mDI(0).Name = "Name"  														'Propiedad nombre
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Cambiar Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 8
   end if
   
   If aReportName = "Inf_Pulseras" then
   mDI(0).Name = "Name"
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 1
   end if
  
    oDocument.setPrinter( mDI )                                                  ' Establecemos las opciones de la impresora
 '   MSGBOX "Se imprimirán " & ncopias & " copias del Informe: " & aReportName  

	REM ------------------------- Copiamos el número de copias determinado según el Informe elegido
    for ncop = 1 to ncopias
    oDocument.Print( mOpc() )                                                    ' Enviamos a imprimir
    next ncop

	next nInforme
end if
End sub

lo que ocurre es lo siguiente... Imprime bien la pulsera (primera pasada del Bucle, pero da error en la segunda pasada en la instrucción:

Código: Seleccionar todo

 oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp()) 	 ' Aunque se abre, queda oculto
y se queda abierto el Infome en MODO DISEÑO y con la ventana de error siguente:

:alarm:
Error en tiempo de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.lang.IllegalArgumentException
Message: sequence element is not assignable by given value!
:alarm:

según mi traducción:
¡El elemento de secuencia no es asignable por el valor dado!

y no sé porqué pero me da que es que ESTÁ ABIERTO el informe anterior (Inf_Pulseras de la primera pasada de Bucle) y de ahí el error....

he puesto algún Wait 1000 en algunos sitios, pero no han funcionado

Qué opinais..??
a alguien se le ocurre algo...?? :ucrazy:
 Editado: Bueno... como dicen por aqui... el que busca siempre encuenta...

He encontrado otro hilo con similar problema y solución https://forum.openoffice.org/en/forum/v ... 20&t=42636
Con quitar los DIM fuera del bucle ME FUNCIONÓ LA PRIMERA VEZ, pero en las sucesivas... se imprime la pulsera y... OPENOFFICE deja de funcionar... se Bloquea y hay que crrarlo.

Seguiré buscando

Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por Longi »

Mira a ver si al ir a pasar al siguiente informe, es decir, antes del next informe añades dos tonterías:
oDocument.close
oReportDesing.close
Wait 100
No lo he probado, pero parece lógico cerrar las cosas si ya están impresas.
La otra posibilidad que se me ocurre es una macro que podríamos llamar 'distribuidor': La llamas desde el tag del botón, pero te hace el command de la consulta, y después llama a la macro de un informe en concreto y luego a otra macro para el otro informe. Esto te obliga a tener macros diferentes para cada informe, pero sería otra posible vía.

Ya dirás.

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por HSEGROD »

Hola..
Después de poner las tres lineas ( y haciendo un pequeño intercambio de letras (ng por gn) en la palabra design)... me da un error en la linea oDocument.close con el mensaje final :
:alarm:
Error en tiempo de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.lang.IllegalArgumentException
Message: Arguments len differ!
:alarm:

Así que probaré con la segunda opción que me das... Aunque tengo que madurarla y comprenderla ya que... Tengo una macro individual (y funcionan bien) que coge el nombre del informe del TAG de cada botón... y no sé como hacer la macro "distribuidor" que pase el valor a la otra macro... aunque creo que me estás diciendo (pensandolo ahora mejor) que haga UNA MACRO para cada informe ...
Es eso...??

el código actual es el siguiente...

Código: Seleccionar todo

REM ------------- Macro para Imprimir, Según El Botón Pulsado, Cada Informe en Su Impresora, un número de copias determinado 

Sub Imprimir (Evento)
    '------------------------------------------------------------
    ' Adaptado de Nocton, FK3Total y Mauricio

   Dim oForm As Object
   Dim Control as Object
   Dim oRegistro as integer
   Dim oConsulta as Object   
   Dim oReporte As Object   
   Dim oCampoRegistro As Object
   Dim ncop   As Integer
   Dim ncopias As Integer
      
   oForm = Evento.Source.Model.Parent                                                  ' El formulario activo
   oCampoRegistro = oForm.GetByName("NReg")                                             ' El campo con el ClavePaciente

If oCampoRegistro.BoundField.Int > 0 Then                                           ' Debe ser mayor a cero
   oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")   ' La consulta en la que se basa el reporte
   oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int    ' Modificamos la consulta de modo que tome el registro actual            
   aReportName= Evento.Source.Model.Tag                                                 ' Nombre del informe, depende del Nombre puesto en la "Información Adicional" del Botón Presionado
  
    oConnection=oForm.Activeconnection                                                 ' Conexión con el formulario
    oReportsDocuments=oConnection.parent.DatabaseDocument.ReportDocuments               ' Apuntamos al contenedor de informes
    '----------------------------------------------------------------
    ' Manipulamos el informe
   
    dim aProp(3) as new com.sun.star.beans.PropertyValue                               ' Array de propiedades
    dim aProp2                                                                         ' Variante del array anterior
    dim oReportDesign                                                                  ' Variable
    aProp(1).Name = "ActiveConnection"                                                  ' Nombre de propiedad
    aProp(1).Value = oConnection                                                        ' Conexión
    aProp(0).Name = "Hidden"                                                          ' Trabajar escondido
    aProp(0).Value = True                                                             ' Ciertamente trabaja escondido
    aProp(2).Name = "OpenMode"                                                           ' Modo de apertura
    aProp(2).Value = "openDesign"                                                      ' Abre en forma de diseño
    let aProp2=aProp                                                                   ' Igualamos el array. La razón es porque es posible que los valores cambien al cargar el documento
    '------------------------------------------------------------
    ' Abrimos el informe
    
    oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp())     ' Aunque se abre, queda oculto
    '---------------------------------
    ' Dos valores deben cambiar
    
       aProp2(0).Value = True                                                           ' Es en el segundo array
       aProp2(2).Value = "open"                                                        ' Es en el segundo array

    '---------------------------------------------------------------
    ' Manejamos el documento final, también en segundo plano y escogemos la impresora

    oDocument=oReportsDocuments.loadComponentFromURL(aReportName ,_blank,0,aProp2())
    
    Dim mDI(1) As New com.sun.star.beans.PropertyValue                           ' Array de valores
    Dim mOpc()                                                                   ' Array de opciones
                                                           

   if    aReportName = "Inf_Etiquetas" then
   mDI(0).Name = "Name"                                            'Propiedad nombre
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Cambiar Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 8
   end if
   
   If aReportName = "Inf_Pulseras" then
   mDI(0).Name = "Name"
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 1
   end if
  
   If aReportName = "Inf_Total" or aReportName = "Inf_Justificante" then
   mDI(0).Name = "Name" 
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- InformeTotal y Justificante  ("jd05047")
   ncopias = 1
   end if

    oDocument.setPrinter( mDI )                                                  ' Establecemos las opciones de la impresora
    MSGBOX "Se imprimirán " & ncopias & " copias del Informe: " & aReportName      ' Desactivar al Implementar Finalmente

   REM ------------------------- Copiamos un número de copias determinado según el Informe elegido
    for ncop = 1 to ncopias
    oDocument.Print( mOpc() )                                                    ' Enviamos a imprimir
    next ncop

end if
End sub


Sub ImprimirEtiquetasPulsera (Evento)
  
   Dim oForm As Object
   Dim Control as Object
   Dim oRegistro as integer
   Dim oConsulta as Object   
   Dim oReporte As Object   
   Dim oCampoRegistro As Object
     Dim oCampoPaciente As Object
   Dim ncop	As Integer
   Dim ncopias As Integer
   Dim nInforme as Integer
   Dim aProp(3) as new com.sun.star.beans.PropertyValue                         ' Array de propiedades
   Dim aProp2                                                              	    ' Variante del array anterior
   Dim oReportDesign                                                            ' Variable 	
   Dim mDI(1) As New com.sun.star.beans.PropertyValue                           ' Array de valores
   Dim mOpc()                                                                   ' Array de opciones
   
   
    oForm = Evento.Source.Model.Parent                                          ' El formulario activo
    oCampoRegistro = oForm.GetByName("NReg")                                	' El campo con el Numero de Registro
    if oForm.getByName("txtPaciente").Text = "" then exit sub					' El campo PACIENTE Debe no estar vacio, al estarlo salgo
    If oCampoRegistro.BoundField.Int > 0 Then                                   ' Debe no estar vacio
   
  For nInforme =1 to 2
  if nInforme = 1 then
  aReportName = "Inf_Pulseras"
  else
'  wait 1000
  aReportName = "Inf_Etiquetas"
  end if
  
    oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")   ' La consulta en la que se basa el reporte
    oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int    ' Modificamos la consulta de modo que tome el registro actual            
    oConnection=oForm.Activeconnection                                          		 ' Conexión con el formulario
    oReportsDocuments=oConnection.parent.DatabaseDocument.ReportDocuments     			 ' Apuntamos al contenedor de informes
    '----------------------------------------------------------------
    ' Manipulamos el informe
   

    aProp(1).Name = "ActiveConnection"                                    			     ' Nombre de propiedad
    aProp(1).Value = oConnection                                      			         ' Conexión
    aProp(0).Name = "Hidden"                                        			         ' Trabajar escondido
    aProp(0).Value = True                                           			         ' Ciertamente trabaja escondido
    aProp(2).Name = "OpenMode"                                                 			 ' Modo de apertura
    aProp(2).Value = "openDesign"                                               		 ' Abre en forma de diseño
    let aProp2=aProp                                                         			 ' Igualamos el array. La razón es porque es posible que los valores cambien al cargar el documento
    '------------------------------------------------------------
    ' Abrimos el informe
    wait 2000
    oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp()) 	 ' Aunque se abre, queda oculto
    '---------------------------------
    ' Dos valores deben cambiar
    
       aProp2(0).Value = True        		                                             ' Es en el segundo array
       aProp2(2).Value = "open"              			                                 ' Es en el segundo array

    '---------------------------------------------------------------
    ' Manejamos el documento final, también en segundo plano y escogemos la impresora

    oDocument=oReportsDocuments.loadComponentFromURL(aReportName ,_blank,0,aProp2())
    

                                                           

   if 	aReportName = "Inf_Etiquetas" then
   mDI(0).Name = "Name"  														'Propiedad nombre
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Cambiar Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 8
   end if
   
   If aReportName = "Inf_Pulseras" then
   mDI(0).Name = "Name"
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 1
   end if
  
    oDocument.setPrinter( mDI )                                                  ' Establecemos las opciones de la impresora
 '   MSGBOX "Se imprimirán " & ncopias & " copias del Informe: " & aReportName  

	REM ------------------------- Copiamos el número de copias determinado según el Informe elegido
    for ncop = 1 to ncopias
    oDocument.Print( mOpc() )                                                    ' Enviamos a imprimir
    next ncop

	next nInforme
end if


End sub

Apache OpenOffice 4.1.5 -- Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Cerrar INFORME tras IMPRIMIR (automáticamente)

Mensaje por HSEGROD »

Ya está... Por Fin... no vean lo que me ha costado... y tampoco no es para tanto... :?

Como había sugerido acertadamente Longi...

Ha bastado con poner solo Dos Macros: Una (IMPRIMIR) que es llamada desde cualquier botón de Impresión con el TAG del Impreso a Imprimir y otra Macro (ImprimirPulsera) .
Como lo que quería era que desde un Botón se Imprimieran 2 Informes (Etiquetas y Pulseras) bastó con poner en el Tag el nombre de uno de los informes (puse el de Etiquetas) y al final de la Macro Imprimir un pequeño código que comprobara de qué botón se había mandado a iMPRIMIR.

Código: Seleccionar todo

REM -----------------Compruebo si la macro se ha efectuado desde el Botón "GUARDAR" Para así Imprimir Directamente La Pulsera
		oControl=Evento.Source.getModel
		EtiquetaBoton=	oControl.Label
		If Left(Etiquetaboton,7) = "GUARDAR" Then
		Call ImprimirPulsera (Evento)
		End If
Al comprobar que es el Botón "GUARDAR" se llama a la otra macro y se imprime la Pulsera.. :bravo: :bravo:

Bueno el código completo, por si a alguien le pudiera interesar... es el siguiente...

Código: Seleccionar todo


REM ------------- Macro para Imprimir, Según El Botón Pulsado, Cada Informe en Su Impresora, un número de copias determinado 
Sub Imprimir (Evento)
    '------------------------------------------------------------
    ' Adaptado de Nocton, FK3Total y Mauricio

   Dim oForm As Object
   Dim Control as Object
   Dim oRegistro as integer
   Dim oConsulta as Object   
   Dim oReporte As Object   
   Dim oCampoRegistro As Object
   Dim ncop   As Integer
   Dim ncopias As Integer
   Dim TxtBoton as Object
 
 	Dim oControl As object
	Dim oCampo
	Dim EtiquetaBoton

	      
   oForm = Evento.Source.Model.Parent                                                       ' El formulario activo
   oCampoRegistro = oForm.GetByName("NReg")                                                 ' El campo con el ClavePaciente

If oCampoRegistro.BoundField.Int > 0 Then                                                   ' Debe ser mayor a cero
   oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")   ' La consulta en la que se basa el reporte
   oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int    ' Modificamos la consulta de modo que tome el registro actual            
   aReportName= Evento.Source.Model.Tag                                                     ' Nombre del informe, depende del Nombre puesto en la "Información Adicional" del Botón Presionado
  

    oConnection=oForm.Activeconnection                                                      ' Conexión con el formulario
    oReportsDocuments=oConnection.parent.DatabaseDocument.ReportDocuments       	        ' Apuntamos al contenedor de informes
    '----------------------------------------------------------------
    ' Manipulamos el informe
   
    dim aProp(3) as new com.sun.star.beans.PropertyValue                    	           ' Array de propiedades
    dim aProp2                                                             		           ' Variante del array anterior
    dim oReportDesign                                                           	       ' Variable
    aProp(1).Name = "ActiveConnection"                                              	   ' Nombre de propiedad
    aProp(1).Value = oConnection                                            	           ' Conexión
    aProp(0).Name = "Hidden"                                                    	       ' Trabajar escondido
    aProp(0).Value = True                                                            	   ' Ciertamente trabaja escondido
    aProp(2).Name = "OpenMode"                                          	               ' Modo de apertura
    aProp(2).Value = "openDesign"                                           	           ' Abre en forma de diseño
    let aProp2=aProp                                                            	       ' Igualamos el array. La razón es porque es posible que los valores cambien al cargar el documento
    '------------------------------------------------------------
    ' Abrimos el informe
    
    oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp())  	   ' Aunque se abre, queda oculto
    '---------------------------------
    ' Dos valores deben cambiar
    
       aProp2(0).Value = True                                                      		   ' Es en el segundo array
       aProp2(2).Value = "open"                                                        	   ' Es en el segundo array

    '---------------------------------------------------------------
    ' Manejamos el documento final, también en segundo plano y escogemos la impresora

    oDocument=oReportsDocuments.loadComponentFromURL(aReportName ,_blank,0,aProp2())
    
    Dim mDI(1) As New com.sun.star.beans.PropertyValue                    			       ' Array de valores
    Dim mOpc()                                                            			       ' Array de opciones
                                                           

   If aReportName = "Inf_Etiquetas" then
   mDI(0).Name = "Name"                                          						  'Propiedad nombre
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"              	             ' Cambiar Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 8
   end if
   
   If aReportName = "Inf_Pulseras" then
   mDI(0).Name = "Name"
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- Informes  ("jd05047")
   ncopias = 1
   end if
  
   If aReportName = "Inf_Total" or aReportName = "Inf_Justificante" then
   mDI(0).Name = "Name" 
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Etiquetas ("PRT11487") --- Pulseras  ("PRT09828")---- InformeTotal y Justificante  ("jd05047")
   ncopias = 1
   end if

    oDocument.setPrinter( mDI )                                                 		 ' Establecemos las opciones de la impresora
   REM ------------------------- Copiamos un número de copias determinado según el Informe elegido
    for ncop = 1 to ncopias
    oDocument.Print( mOpc() )                                                		     ' Enviamos a imprimir
    next ncop



end if
	REM -----------------Compruebo si la macro se ha efectuado desde el Botón "GUARDAR" Para así Imprimir Directamente La Pulsera
		oControl=Evento.Source.getModel
		EtiquetaBoton=	oControl.Label
		If Left(Etiquetaboton,7) = "GUARDAR" Then
		Call ImprimirPulsera (Evento)
		End If

End sub

Sub ImprimirPulsera (Evento)

   Dim oForm As Object
   Dim Control as Object
   Dim oRegistro as integer
   Dim oConsulta as Object   
   Dim oReporte As Object   
   Dim oCampoRegistro As Object
   Dim ncop   As Integer
   Dim ncopias As Integer
 	Dim TxtBoton as Object
 
 	Dim oControl As object
	Dim oCampo
	Dim EtiquetaBoton

	      
   oForm = Evento.Source.Model.Parent                                                       ' El formulario activo
   oCampoRegistro = oForm.GetByName("NReg")                                                 ' El campo con el ClavePaciente

If oCampoRegistro.BoundField.Int > 0 Then                                                   ' Debe ser mayor a cero
   oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("conImprimir")   ' La consulta en la que se basa el reporte
   oConsulta.Command = "SELECT * FROM ""Tb_Pacientes"" WHERE ""NReg"" = " & oCampoRegistro.BoundField.Int    ' Modificamos la consulta de modo que tome el registro actual            
   aReportName= "Inf_Pulseras"                                                              ' Nombre del informe
  

    oConnection=oForm.Activeconnection                                                      ' Conexión con el formulario
    oReportsDocuments=oConnection.parent.DatabaseDocument.ReportDocuments       	        ' Apuntamos al contenedor de informes
    '----------------------------------------------------------------
    ' Manipulamos el informe
   
    dim aProp(3) as new com.sun.star.beans.PropertyValue                    	           ' Array de propiedades
    dim aProp2                                                             		           ' Variante del array anterior
    dim oReportDesign                                                           	       ' Variable
    aProp(1).Name = "ActiveConnection"                                              	   ' Nombre de propiedad
    aProp(1).Value = oConnection                                            	           ' Conexión
    aProp(0).Name = "Hidden"                                                    	       ' Trabajar escondido
    aProp(0).Value = True                                                            	   ' Ciertamente trabaja escondido
    aProp(2).Name = "OpenMode"                                          	               ' Modo de apertura
    aProp(2).Value = "openDesign"                                           	           ' Abre en forma de diseño
    let aProp2=aProp                                                            	       ' Igualamos el array. La razón es porque es posible que los valores cambien al cargar el documento
    '------------------------------------------------------------
    ' Abrimos el informe
    
    oReportDesign=oReportsDocuments.loadComponentFromURL(aReportName ,"",0,aProp())  	   ' Aunque se abre, queda oculto
    '---------------------------------
    ' Dos valores deben cambiar
    
       aProp2(0).Value = True                                                      		   ' Es en el segundo array
       aProp2(2).Value = "open"                                                        	   ' Es en el segundo array

    '---------------------------------------------------------------
    ' Manejamos el documento final, también en segundo plano y escogemos la impresora

    oDocument=oReportsDocuments.loadComponentFromURL(aReportName ,_blank,0,aProp2())
    
    Dim mDI(1) As New com.sun.star.beans.PropertyValue                    			       ' Array de valores
    Dim mOpc()                                                            			       ' Array de opciones
                                                           

 
   mDI(0).Name = "Name"
   mDI(0).Value = "HP15D359 (HP ENVY 5540 series)"                              ' Nombre de la impresora ------ Pulseras  ("PRT09828")



    oDocument.setPrinter( mDI )                                                 		 ' Establecemos las opciones de la impresora
    oDocument.Print( mOpc() )                                                		     ' Enviamos a imprimir

End IF

End sub

Gracias a los aportes... y .. saluditos... 8-)
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO] Cerrar INFORME tras IMPRIMIR (automáticamente

Mensaje por Longi »

Me alegro que te haya funcionado.
La idea del distribuidor era algo diferente:
Una primera macro, que llamada desde el tag del botón actualizase la consulta para obtener los datos, y allí finaliza la macro, pero hace llamada a dos macros para imprimir, que iría una detrás de la otra.
Cada macro para imprimir no necesitaría la parte de actualización de la consulta (ya lo hizo la macro 'distribuidor') y funcionaría con la variable 'aReportName'='Nombre de mi informe'. Es decir, que NO necesita el Tag del botón, sino que te abriría el informe en segundo plano, lo diseña, y lo imprime, y después iría a la segunda llamada para hacer lo mismo, en otra macro que tiene la variable 'aReportName' diferente (abre otro informe distinto).
De todos modos si así funcionó, también tienes menos líneas de código.

Gracias por colgar los resultados finales.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Responder