Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Modifica stampante su tutti i report, non si modifica

89 views
Skip to first unread message

RobertoA

unread,
Jan 24, 2010, 3:14:20 AM1/24/10
to
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


Franchi Graziano & Famiglia

unread,
Jan 24, 2010, 6:05:43 AM1/24/10
to
"RobertoA" <amor...@tiscalinet.it> 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


Karl Donaubauer

unread,
Jan 24, 2010, 7:49:31 AM1/24/10
to

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

RobertoA

unread,
Jan 24, 2010, 11:44:27 AM1/24/10
to

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


RobertoA

unread,
Jan 24, 2010, 11:56:04 AM1/24/10
to
>> 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?
>
> 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.

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


Franchi Graziano & Famiglia

unread,
Jan 24, 2010, 1:08:09 PM1/24/10
to
"RobertoA" <amor...@tiscalinet.it> 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


RobertoA

unread,
Jan 24, 2010, 2:15:35 PM1/24/10
to

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


Karl Donaubauer

unread,
Jan 24, 2010, 2:54:00 PM1/24/10
to
RobertoA wrote:
>> ,,,
>> Reports(strNomeReport).Printer = _
>> Application.Printers(Me!cmbStampanteSpecifica)
> ...

> 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)

Prova con una variabile stringa:
Dim strPrinter As String

strPrinter = Me!cmbStampanteSpecifica
Reports(strNomeReport).Printer = Application.Printers(strPrinter)

RobertoA

unread,
Jan 24, 2010, 11:11:25 PM1/24/10
to

Ora va
Grazie mille
RobertoA


RobertoA

unread,
Jan 25, 2010, 1:15:30 AM1/25/10
to

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


Karl Donaubauer

unread,
Jan 25, 2010, 7:15:36 AM1/25/10
to
RobertoA wrote:
> ...

> 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
> ------------------------------------------------------------------------

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

RobertoA

unread,
Jan 26, 2010, 3:51:54 AM1/26/10
to

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

Karl Donaubauer

unread,
Jan 26, 2010, 8:06:55 AM1/26/10
to
RobertoA wrote:
>> ...

>> 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
>
> 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?
> ...

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

RobertoA

unread,
Jan 26, 2010, 1:59:54 PM1/26/10
to

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


0 new messages