Newsgroup: it.comp.appl.access
Titolo: Modifica stampante su tutti i report, non si modifica

Vorrei modificare la stampante predefinita usata da tutti i report di 
un'applicazione Access, sostituendovi un'altra stampante tra quelle 
disponibili
Sto tentando di usare il seguente codice:
For count = 0 To Application.CurrentProject.AllReports.count - 1
    DoCmd.OpenReport 
ReportName:=Application.CurrentProject.AllReports(count).Name, 
view:=acViewDesign, windowmode:=acHidden
    Reports(count).UseDefaultPrinter = False
    Reports(count).Printer.DeviceName = Me.cmbStampanteSpecifica
    DoCmd.Close objecttype:=acReport, 
objectname:=Application.CurrentProject.AllReports(count).Name, 
Save:=acSaveYes
    Next count
Mi restituisce errore IMPOSSIBILE ASSEGNARE PROPRIETA' DI SOLA LETTURA sulla 
riga che tenta di modificare il DeviceName
Ma aprendo il report in acViewDesign non dovrebbe essere possibile la 
modifica?
Ciao e grazie
RobertoA

 ha scritto nel messaggio 
news:4b5bfe7d$1...@newsgate.x-privat.org...

Io uso questo in un modulo con ACCESS 2000:
Option Compare Database
Option Explicit
Declare Function GetProfileSection& Lib "kernel32" Alias 
"GetProfileSectionA" (ByVal lpAppName As String, _
  ByVal lpReturnedString As String, ByVal nSize As Long)
Declare Function GetProfileString& Lib "kernel32" Alias "GetProfileStringA" 
(ByVal lpAppName As String, _
  ByVal lpKeyName As String, ByVal lpDefault As String, ByVal 
lpReturnedString As String, ByVal nSize As Long)
Declare Function WriteProfileString& Lib "kernel32" Alias 
"WriteProfileStringA" (ByVal lpszSection As String, _
  ByVal lpszKeyName As String, ByVal lpszString As String)
Public DefaultPrinter As String
'Public Sub ResetDefaultPrinter()
  'reimposta a predefinita la stampante memorizzata nella var globale
'  SetDefaultPrinter (DefaultPrinter)
'End Sub
Public Function SostCar(s As String, C1 As String, c2 As String) As String
  'sostituisce un carattere con un altro in una stringa (solo prima 
occorrenza)
  Dim pos As Integer
  pos = InStr(1, s, C1)
  If pos > 0 Then Mid(s, pos) = c2
  SostCar = s
End Function
Public Sub SetDefaultPrinter(s As String)
On Error GoTo Esci
  'imposta la stampante passata come argomento a predefinita
  Dim x As Long
  If IsNull(s) Or s = "" Then Exit Sub
  x = WriteProfileString("windows", "device", vbNullString)
  DoEvents
  x = WriteProfileString("windows", "device", s)
  DoEvents
Esci:
End Sub
Public Function GetDefaultPrinter() As String
  'ritorna il nome della stampante predefinita
  Dim x As Integer
  Dim buffer As String
  buffer = Space$(255)
  x = GetProfileString("windows", "device", "?", buffer, 255)
  GetDefaultPrinter = Left$(buffer, x)
End Function
Ciao
Graziano 


La proprietï¿œ DeviceName ï¿œ di sola lettura. Devi cambiare il Printer.
Se il nome dello stampante ï¿œ la colonna associata della combo:
Reports(strNomeReport).Printer = _
    Application.Printers(Me!cmbStampanteSpecifica)
Dove strNomeReport ï¿œ una variabile con il nome del Report, perchï¿œ
il tuo metodo con un Count a due insiemi diversi ï¿œ strano e pericoloso.
-- 
HTH
Karl
*********
Access FAQ: 
www.donkarl.com/it
 


Forse mi sono spiegato male
Non desidero modificare la stampante predefinita di sistema
Desidero cambiare le impostazioni di tutti i report che attualmente sono su 
'stampante predefinita'  e metterci 'stampante specifica' ed indicargli la 
stampante richiesta
Ciao e grazie
RobertoA

 il tuo metodo con un Count a due insiemi diversi � strano e pericoloso.
Ti ringrazio per la risposta
Ho provato e mi restituisce l'errore
CHIAMATA DI ROUTINE O ARGOMENTI NON VALIDI
e' l'istruzione  Application.Printers(Me!cmbStampanteSpecifica) a generare 
l'errore, da notare che  Me!cmbStampanteSpecifica mi restituisce 
correttamente la stampante impostata e disponibile tra quelle visibili su 
Stampanti e Fax
Ho provato anche a definire una variabile di tipo Printer e poi assegnarci 
il valore letto da  Application.Printers(Me!cmbStampanteSpecifica)
Stesso errore
Ciao
RobertoA

 ha scritto nel messaggio 
news:4b5c760c$1...@newsgate.x-privat.org...

Secondo me MEGLIO LASCIARE STAMPANTE PREDEFINITA.
In funzione del report che devi stampare IMPOSTI LA STAMPANTE PREDEFINITA 
UGUALE ALLA STAMPANTE SPECIFICA poi la riporti normale
Ciao
Graziano 


Ti ringrazio
Ma in questo caso devo realizzarre la funzione richiesta
Ciao
RobertoA

 Application.Printers(Me!cmbStampanteSpecifica) 
Prova con una variabile stringa:
Dim strPrinter As String 
strPrinter = Me!cmbStampanteSpecifica
Reports(strNomeReport).Printer = Application.Printers(strPrinter)



Ora va
Grazie mille
RobertoA


Si, passano le istruzioni, ma non ottengono l'effetto voluto
Se apro un qualsiasi report in modalita' struttura, vedo sempre il pallino 
su 'Stampante Predefinita'
Il codice che uso e' questo
------------------------------------------------------------------------
stampante = Me!cmbStampanteSpecifica
 For count = 0 To Application.CurrentProject.AllReports.count - 1
         DoCmd.OpenReport 
ReportName:=Application.CurrentProject.AllReports(count).Name, 
view:=acViewDesign, windowmode:=acHidden
         Reports(Application.CurrentProject.AllReports(count).Name).UseDefaultPrinter 
= False
         Reports(Application.CurrentProject.AllReports(count).Name).Printer 
= Application.Printers(stampante)
         DoCmd.Close objecttype:=acReport, 
objectname:=Application.CurrentProject.AllReports(count).Name, 
Save:=acSaveYes
         Next count
------------------------------------------------------------------------
La DoCmd.Close  dovrebbe salvare il report con le impostazioni modificate
Ma in duve l'e' che sbaglio?
RobertoA

 ------------------------------------------------------------------------
Il nome "Count" per una variabile e abbastanza pericoloso.
Come dovresti vedere nel proprio codice � una parola chiave.
� meglio usare prefissi che mostrano il tipo delle variabili.
Inoltre dovrebbe aiutare un commando aggiuntivo per salvare
le impostazioni. Prova cos�:
Dim objAcc As AccessObject
Dim strReport As String, strStampante As String
strStampante = Me!cmbStampanteSpecifica
For Each objAcc In Application.CurrentProject.AllReports
    strReport = objAcc.Name
    DoCmd.OpenReport strReport, acViewDesign, acHidden
    Reports(strReport).UseDefaultPrinter = False
    Reports(strReport).Printer = Application.Printers(strStampante)
    RunCommand acCmdSave
    DoCmd.Close acReport, strReport, acSaveYes
Next objAcc
-- 
cu



Eh si, cosi va proprio bene
A parte il fatto che su un mde, ovviamente non va
Ma come fare per consentire all'utente finale di modificarele stampe senza 
dargli i sorgenti?
Con Crystal Report era una pacchia, sto seriamente pensando di adottarlo 
anche per Access
Ciao e grazie mille
Roberto

 ...
Puoi p.e. offrire le stampanti in una casella combinata
(vedi anche l'apposito codice in 
www.donkarl.com/it?FAQ5.1
)
e/o salvare le stampanti in una tabella.
Poi usa questi valori per cambiare il Printer a runtime senza
salvarlo nel report. Ci sono tanti esempi e varianti nella FAQ 5.1
e nei NG come cambiare o l'Application.Printer o la stampante
del singolo report temporaneamente.
-- 
HTH



Grazie mille per la tua disponibilita' a condividere un'esperienza davvero
invidiabile
Ciao
RobertoA