Newsgroup: it.comp.appl.access
Titolo: lentezza esasperante da client con windows 8

Ciao a tutti
FE file adp Xp (lo stesso problema cmq si verifica con acc 2003) 
collaudatissimo da anni
BE MSDE 2000 su un "server" con windows xp
 
Su tutti i client da win 2000 a win 7 il client ADP ï¿œ un fulmine nel 
aprire le maschere, fare ricerche etc
 
Solo il client con windows 8 ï¿œ di una lentezza esasperante..si parla di 
decine di secondi per popolare una banale maschera fatture che negli 
altri client impiega mezzo secondo
 
Sul client il problema si presenta sia con il runtime, sia con AccessXP 
completo sia con Access 2003 Completo.
 
Come test ho provato ad installare MSDE/SQL Server anche nel client con 
windows 8, per farlo lavorare in locale...e con gli archivi in locale il 
client ï¿œ un fulmine.
 
A questo punto quindi penso sia un problema di rete...ma cosa???
I firewall su entrambi i pc sono disattivati come pure l'antivirus
 
Task manager alla mano si notano solo dei picchi al 100% di utilizzo 
della rete...ram e cpu nella norma.
 
Ho provato allora debuggare la parte di codice che va a popolare la 
maschera...e vedo che si ferma a pensare 4-5 secondi su istruzioni tipo 
me.dataentry=false  oppure su exit sub
 
Avevo dato per scontato che potesse essere un problema di rete interno 
di quel cliente ma ora che ho sotto mano un portatile con windows 8 ho 
potuto appurare che il problema si verifica anche da me
 
Sottolineo che con gli archivi in locale il problema svanisce
 
ben accetti suggerimenti :-)
 
BFS

> A questo punto quindi penso sia un problema di rete...ma cosa???
 
 
scambia l'attuale posizione in rete del pc W8 con un altro pc ( cioč scambi 
il jack di connessione della presa di rete) per escludere problemi nel cavo 
di rete e nella porta di rete presente sullo switch a cui sono collegati i 
pc.
 
Inoltre dovresti disinstallare l'antivirus su W8, a volte non basta 
disattivarlo in quanto alcuni componenti sono sempre attivi in background( 
mi č capitato con Norton) . Poi lo reinstalli se necessario.
 
 
 

 BFS
 
mmmm... ma se le tabelle del BE sono source dirette di Form (senza passare
per alcuna ricerca, codice o altro), il problema di lentezza te lo da lo
stesso?
 
-- 
------------
Pablitomf
Napoli sempre nel "Q"uore!
"mammasantissima" si nasce, non si diventa.
 
TheSpaceCowboy : 
Britos deve recuperare per arrivare in forma al prossimo
infortunio - 24/10/12
 


 
provo
 
ciao


 
no. le form che poggiano direttamente su tabelle senza codice sono 
velocissime
 
BFS

 BFS
 
 
se può essere utile a qualcuno ho risolto il problema.
eseguendo la connessione al server non con il nome del pc ma con il suo 
indirizzo ip il problema scompare.
non capisco cosa possa centrale con il fatto che  una istruzione tipo 
me.dataentry=true ci impieghi 15 secondi quando il client è connesso con 
il nome e un fulmine quando è connesso con l'ip
 
ciao
BFS
 
 
 
 
 
 

 il nome e un fulmine quando ï¿œ connesso con l'ip
 
sara' un problema legato ai diritti LAN nella risoluzione del NomePC di rete.



 
un eventuale errore nella risoluzione dei nomi non mi farebbe neppure 
connettere a sql server. ï¿œ un bel mistero che solo alcune form e solo 
alcune istruzioni generino questa lentezza incredibile.
 
vabbï¿œ l'importante era per me risolvere o me la sarei vista brutta con 
windows 8
 
BFS
 
 

BFS <B...@BFSBFS.it> ha scritto:

non errore nel senso letterario della parola, nel nostro caso lentezza di
risoluzione nome ma esclusivamente da vba, non in generale...
 
 
Facciamo cosï¿œ... crea un nuovo DB e chiamalo PING.
 
Crei 3 moduli di classe.
 
**** Il primo lo chiami "clsFBISocket" (sotto il codice da incollare)
 
Option Compare Database
Option Explicit
 
Private Const WSADESCRIPTION_LEN = 256
Private Const WSASYS_STATUS_LEN = 128
 
Private Type WSADATA
    bVersionL As Byte
    bVersionH As Byte
    bHighVersionL As Byte
    bHighVersionH As Byte
    szDescription(0 To WSADESCRIPTION_LEN) As Byte
    szSystemStatus(0 To WSASYS_STATUS_LEN) As Byte
    wMaxSockets As Integer
    wMaxUDPDG As Integer
    dwVendorInfo As Long
End Type
 
    Private Const SocketSuccess = 0
    Private Const SocketErrNotResponding = 1
    Private Const SocketErrUnsupportedVer = 2
    Private Const SocketErrNotEnoughSockets = 3
    Private Const SocketErrOnCleanUp = 4
 
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired
As Long, lpWSADATA As WSADATA) As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
 
Private WSAD As WSADATA
Private m_MinSockets As Integer
Private m_LastError As Long
Private m_IgnoreErrors As Boolean
Private m_WSAInitialized As Boolean
 
Public Event Error(ByVal ErrorCode As Long, ByVal Description As String, ByRef
Cancel As Boolean)
 
Private Sub Class_Initialize()
    m_MinSockets = 1
    m_IgnoreErrors = False
    Call RequestVersion(1, 1)
End Sub
 
Private Sub Class_Terminate()
    If m_WSAInitialized Then Call CleanUp
End Sub
Public Function ErrorDescription(ByVal ErrorCode As Long) As String
    Select Case ErrorCode
        Case SocketSuccess: ErrorDescription = "Nessun errore"
        Case SocketErrNotResponding: ErrorDescription = "L'ambiente Windows
Socket 32 non risponde correttamente"
        Case SocketErrUnsupportedVer: ErrorDescription = "Versione di Windows
Socket non supportata"
        Case SocketErrNotEnoughSockets: ErrorDescription = "Numero di socket
supportati insufficiente"
        Case SocketErrOnCleanUp: ErrorDescription = "Errore durante il CleanUp"
    End Select
End Function
 
Public Function HandleError(ByVal ErrorCode As Long, Optional Description As
String) As Boolean
    Dim blnCancel As Boolean
    Dim strError As String
    m_LastError = ErrorCode
    If Not m_IgnoreErrors Then
        strError = IIf(Len(Description) = 0, ErrorDescription(ErrorCode),
Description)
        RaiseEvent Error(ErrorCode, strError, blnCancel)
        If Not blnCancel Then MsgBox "Errore " & CStr(ErrorCode) & vbNewLine & _
            strError, vbCritical Or vbOKOnly
    End If
End Function
Public Function RequestVersion(ByVal LowVer As Byte, ByVal HighVer As Byte) As
Boolean
    Dim lngVersionReq As Long
    lngVersionReq = HighVer * &H100 + LowVer
    If m_WSAInitialized Then CleanUp
    If WSAStartup(lngVersionReq, WSAD) <> 0 Then
        m_WSAInitialized = False
        Call HandleError(SocketErrNotResponding)
    Else
        m_WSAInitialized = True
        With WSAD
            If (.bVersionH < HighVer) Or _
                (.bVersionH = HighVer And .bVersionL < LowVer) Then _
                Call HandleError(SocketErrUnsupportedVer)
            If (.wMaxSockets < m_MinSockets) Then _
                Call HandleError(SocketErrNotEnoughSockets)
        End With
    End If
    RequestVersion = m_WSAInitialized
End Function
Private Function CleanUp() As Boolean
    If m_WSAInitialized Then CleanUp = (WSACleanup = 0)
    If Not CleanUp Then Call HandleError(SocketErrOnCleanUp)
End Function
Public Property Get Version() As String
    Version = CStr(WSAD.bVersionH) & "." & CStr(WSAD.bVersionL)
End Property
 
Public Property Get MaxVersion() As String
    MaxVersion = CStr(WSAD.bHighVersionH) & "." & CStr(WSAD.bHighVersionL)
End Property
 
Public Property Get MaxSocketSupported() As Integer
    MaxSocketSupported = WSAD.wMaxSockets
End Property
Public Property Get MinSockets() As Integer
    MinSockets = m_MinSockets
End Property
 
Public Property Let MinSockets(ByVal newValue As Integer)
    m_MinSockets = newValue
End Property
 
Public Property Get LastError() As Long
    LastError = m_LastError
End Property
 
Public Property Let LastError(ByVal newValue As Long)
    m_LastError = newValue
End Property
 
Public Property Get IgnoreErrors() As Boolean
    IgnoreErrors = m_IgnoreErrors
End Property
 
Public Property Let IgnoreErrors(ByVal newValue As Boolean)
    m_IgnoreErrors = newValue
End Property
 
 
**** Il secondo lo chiami "clsFBISocketInfo" (sotto il codice da incollare)
 
Option Compare Database
Option Explicit
 
Private Const SOCKET_ERROR As Long = -1
Private Const AF_INET As Long = 2
 
Private Type HOSTENT
    hName As Long
    hAliases As Long
    hAddrType As Integer
    hLen As Integer
    hAddrList As Long
End Type
 
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (pDst As
Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function lstrlenA Lib "KERNEL32" (ByVal Ptr As Any) As Long
Private Declare Function lstrcpy Lib "KERNEL32" Alias "lstrcpyA" (ByVal
lpString As String, ByVal lPtr As Long) As Long
Private Declare Function gethostname Lib "WSOCK32" (ByVal szHost As String,
ByVal dwHostLen As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32" (ByVal szHost As String)
As Long
Private Declare Function gethostbyaddr Lib "WSOCK32" (haddr As Long, ByVal
hnlen As Long, ByVal addrtype As Long) As Long
Private Declare Function gethostdate Lib "WSOCK32" (year As Long, month As
Long, day As Long) As Long
 
Private WithEvents fbiSocket As clsFBISocket
 
Private Host As HOSTENT
Private lpHost As Long
 
Public Event Erroraccio(ByVal ErrorCode As Long, ByVal Description As String,
ByRef Cancel As Boolean)
 
Private Sub Class_Initialize()
    Set fbiSocket = New clsFBISocket
End Sub
 
Private Sub Class_Terminate()
    Set fbiSocket = Nothing
End Sub
 
Private Sub fbiSocket_Error(ByVal ErrorCode As Long, ByVal Description As
String, Cancel As Boolean)
    'RaiseEvent Erroraccio(ErrorCode, Description, Cancel)
End Sub
 
Public Property Get socket() As clsFBISocket
    Set socket = fbiSocket
End Property
 
Public Function LongToIP(ByVal Host As Long) As String
    LongToIP = CStr(Host And &HFF) & "." & CStr(Host \ &H100 And &HFF) & "." &
CStr(Host \ &H10000 And &HFF) & "." & CStr(Host \ &H1000000 And &HFF)
End Function
 
Public Property Get LocalHost() As String
    LocalHost = Space$(256)
    If gethostname(LocalHost, Len(LocalHost)) = SOCKET_ERROR Then _
        Call fbiSocket.HandleError(11, "Impossibile recuperare l'host locale")
    LocalHost = Left$(LocalHost, InStr(1, LocalHost, vbNullChar) - 1)
End Property
 
Public Function IPToHost(ByVal IP As String) As String
    lpHost = gethostbyaddr(HostToLong(IP, 0), 4, AF_INET)
    If lpHost <> 0 Then
        CopyMemory Host, ByVal lpHost, Len(Host)
        IPToHost = Space$(lstrlenA(ByVal Host.hName))
        Call lstrcpy(ByVal IPToHost, ByVal Host.hName)
    End If
End Function
 
Public Property Get IPCount(ByVal HostName) As Long
    lpHost = gethostbyname(HostName)
    If lpHost <> 0 Then
        CopyMemory Host, ByVal lpHost, Len(Host)
        IPCount = -1
        Do
            IPCount = IPCount + 1
            CopyMemory lpHost, ByVal Host.hAddrList + 4 * IPCount, 4
        Loop Until lpHost = 0
    End If
End Property
 
Public Function HostToLong(ByVal HostName As String, ByVal Index As Long) As Long
    If Index >= IPCount(HostName) Then Exit Function
    lpHost = gethostbyname(HostName)
    If lpHost <> 0 Then
        CopyMemory Host, ByVal lpHost, Len(Host)
        CopyMemory lpHost, ByVal Host.hAddrList + Index * 4, 4
        If lpHost <> 0 Then CopyMemory lpHost, ByVal lpHost, 4
        HostToLong = lpHost
    End If
End Function
 
Public Function HostToIP(ByVal HostName As String, ByVal Index As Integer) As
String
    If Index >= IPCount(HostName) Then Exit Function
    HostToIP = LongToIP(HostToLong(HostName, Index))
End Function
 
Public Function DateToIP(ByVal HostName As String, ByVal Index As Integer) As
String
    DateToIP = LongToIP(HostToLong(HostName, Index))
End Function
 
**** Il terzo lo chiami "clsFBISocketPing" (sotto il codice da incollare)
 
Option Compare Database
Option Explicit
 
Private Type ICMP_OPTIONS
    TTL             As Byte
    Tos             As Byte
    Flags           As Byte
    OptionsSize     As Byte
    OptionsData     As Long
End Type
 
Private Type ICMP_ECHO_REPLY
    Address         As Long
    Status          As Long
    RoundTripTime   As Long
    DataSize        As Integer
    Reserved        As Integer
    DataPointer     As Long
    Options         As ICMP_OPTIONS
    Data            As String * 256
End Type
 
Private Declare Function IcmpCreateFile Lib "ICMP.DLL" () As Long
Private Declare Function IcmpCloseHandle Lib "ICMP.DLL" (ByVal IcmpHandle As
Long) As Long
Private Declare Function IcmpSendEcho Lib "ICMP.DLL" (ByVal IcmpHandle As
Long, ByVal DestinationAddress As Long, ByVal RequestData As String, ByVal
RequestSize As Integer, RequestOptions As ICMP_OPTIONS, ReplyBuffer As
ICMP_ECHO_REPLY, ByVal ReplySize As Long, ByVal Timeout As Long) As Long
 
Private WithEvents fbiSocket As clsFBISocketInfo
Private echoReply As ICMP_ECHO_REPLY
Private icmpOptions As ICMP_OPTIONS
Private m_Timeout As Long
 
Public Event Error(ByVal ErrorCode As Long, ByVal Description As String, ByRef
Cancel As Boolean)
 
Private Sub Class_Initialize()
    Set fbiSocket = New clsFBISocketInfo
    m_Timeout = 1000
    icmpOptions.TTL = 255
End Sub
 
Private Sub Class_Terminate()
    Set fbiSocket = Nothing
End Sub
 
Private Sub fbiSocket_Error(ByVal ErrorCode As Long, ByVal Description As
String, Cancel As Boolean)
    RaiseEvent Error(ErrorCode, Description, Cancel)
End Sub
 
Public Function Ping(ByVal Host As String, ByVal Data As String) As Long
    Dim hFile As Long
    Data = Left(Data, Len(echoReply.Data))
    hFile = IcmpCreateFile
    Ping = -1
    If hFile = 0 Then
        Call fbiSocket.socket.HandleError(21, "Impossibile creare un handle
valido")
    Else
        If IcmpSendEcho(hFile, fbiSocket.HostToLong(Host, 0), Data, Len(Data),
icmpOptions, echoReply, Len(echoReply), m_Timeout) <> 0 Then _
            Ping = echoReply.Status
        Call IcmpCloseHandle(hFile)
    End If
End Function
 
Public Property Get Timeout() As Long
    Timeout = m_Timeout
End Property
 
Public Property Let Timeout(ByVal newValue As Long)
    m_Timeout = newValue
End Property
 
Public Property Get TTL() As Byte
    TTL = icmpOptions.TTL
End Property
 
Public Property Let TTL(ByVal newValue As Byte)
    icmpOptions.TTL = newValue
End Property
 
Public Property Get EchoAddress() As String
    EchoAddress = fbiSocket.LongToIP(echoReply.Address)
End Property
 
Public Property Get TripTime() As Long
    If echoReply.Status = 0 Then TripTime = echoReply.RoundTripTime
End Property
 
Public Property Get Reply() As String
    If echoReply.Status = 0 Then Reply = Left$(echoReply.Data, echoReply.DataSize)
End Property
 
Public Property Get TTLReply() As Byte
    TTLReply = echoReply.Options.TTL
End Property
 
Public Property Get Status() As Long
    Status = echoReply.Status
End Property
 
Public Property Get StatusDescription() As String
    Select Case echoReply.Status
        Case 0: StatusDescription = "Successo"
        Case 200: StatusDescription = "Tempo massimo superato"
        Case 11001: StatusDescription = "Buffer troppo piccolo"
        Case 11002: StatusDescription = "Rete di destinazione irraggiungibile"
        Case 11003: StatusDescription = "Host di destinazione irraggiungibile"
        Case 11004: StatusDescription = "Protocollo di destinazione
irraggiungibile"
        Case 11005: StatusDescription = "Porta di destinazione irraggiungibile"
        Case 11006: StatusDescription = "Risorse insufficienti"
        Case 11007: StatusDescription = "Opzioni errate"
        Case 11008: StatusDescription = "Errore hardware"
        Case 11009: StatusDescription = "Pacchetto troppo grande"
        Case 11010: StatusDescription = "Richiesta scaduta"
        Case 11011: StatusDescription = "Richiesta errata"
        Case 11012: StatusDescription = "Rotta errata"
        Case 11013: StatusDescription = "TTL scaduto nella trasmissione"
        Case 11014: StatusDescription = "TTL scaduto nel riassemblaggio"
        Case 11015: StatusDescription = "Errori nei parametri"
        Case 11016: StatusDescription = "Origine spenta"
        Case 11017: StatusDescription = "Opzioni troppo grandi"
        Case 11018: StatusDescription = "Destinazione errata"
        Case 11019: StatusDescription = "Indirizzo cancellato"
        Case 11050: StatusDescription = "Errore generale"
        Case Else: StatusDescription = "Errore sconosciuto"
    End Select
End Property
 
 
**** Crea un Form che chiami "LISTA_IP"
 
Aggiungi un campo "txtindirizzo"
 
4 pulsanti chiamati "cmdHostToIP", "cmdIPToHost", "cmdHostToLong" e "cmdLongToIP"
 
Aggiungi un campo "txtrisultato"
 
incolla il codice sottostante nella maschera:
 
Option Compare Database
Option Explicit
 
Private socket As clsFBISocketInfo
 
Private Sub Form_Load()
    Dim intLoop As Integer
    Dim strLocalHost As String
    Set socket = New clsFBISocketInfo
    With socket
        strLocalHost = .LocalHost
        lblServerLocaleVal.Caption = "SERVER LOCALE : " & strLocalHost
        For intLoop = 0 To .IPCount(strLocalHost) - 1
            If Left(lbIPLocali.RowSource, 1) = "" Then
                lbIPLocali.RowSource = .HostToIP(strLocalHost, intLoop)
            Else
                lbIPLocali.RowSource = (lbIPLocali.RowSource) & ";" &
HostToIP(strLocalHost, intLoop)
            End If
        Next intLoop
    End With
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    Set socket = Nothing
End Sub
 
Private Sub cmdHostToIP_Click()
Me.txtindirizzo.SetFocus
    txtrisultato = socket.HostToIP(txtindirizzo.Text, 0)
If Me.txtrisultato = "" Then Me.txtrisultato = "INDIRIZZO NON RAGIUNGIBILE"
End Sub
 
Private Sub cmdHostToLong_Click()
Me.txtindirizzo.SetFocus
    txtrisultato = socket.HostToLong(txtindirizzo.Text, 0)
    If Me.txtrisultato = "" Then Me.txtrisultato = "INDIRIZZO NON RAGIUNGIBILE"
End Sub
 
Private Sub cmdIPToHost_Click()
Me.txtindirizzo.SetFocus
    txtrisultato = socket.IPToHost(txtindirizzo.Text)
    If Me.txtrisultato = "" Then Me.txtrisultato = "INDIRIZZO NON RAGIUNGIBILE"
End Sub
 
Private Sub cmdLongToIP_Click()
Me.txtindirizzo.SetFocus
    txtrisultato = socket.LongToIP(Val(txtindirizzo.Text))
    If Me.txtrisultato = "" Then Me.txtrisultato = "INDIRIZZO NON RAGIUNGIBILE"
End Sub
 
Private Sub lbIPLocali_Click()
Me.txtindirizzo = Me.lbIPLocali
End Sub
 
Salva il form, aprilo, nel primo campo mettici l'indirizzo IP della macchina
da raggiungere, clicca su "cmdIPToHost" e vedi se ti restituisce il nome
macchina e in quanto tempo.



me lo restituisce istantaneamente
 
ciao
BFS


mmmmm... strano... posta un pï¿œ il codice che ti crea problemi, e indica i
"riferimenti" attivi che hai.


            If Left(lbIPLocali.RowSource, 1) = "" Then
 
Qui a me dice che le variabili   lblServerLocaleVal  e lbIPLocali non sono 
definite.
Cosa sono,etichette da piazzare nel form?
 
ciao 
 
 

 ha scritto:

sono refusi del mio form... io ho anche altri controlli... lasciali perdere.



 
sull'evento dopo aggiornamento di una combo che presenta i numeri 
fattura dell'anno, presente nel piede della maschera fatture:
 
Me.DataEntry = False
Me.RecordSource = "SELECT * FROM FATTURE where idfattura=" & Me.Combo62
If Me.NumFattura = "0" Then
     Me.RecordsetType = 1
     Me![DettaglioFattura].Form.RecordsetType = 1
     Me![DettaglioIVA].Form.RecordsetType = 1
     Me![DettaglioScadenze].Form.RecordsetType = 1
     Else
     Me.RecordsetType = 2
     Me![DettaglioFattura].Form.RecordsetType = 2
     Me![DettaglioIVA].Form.RecordsetType = 2
     Me![DettaglioScadenze].Form.RecordsetType = 2
End If
 
 
in pratica richiamo la fattura..già la prima istruzione ci impiega 15 
secondi se ho connesso a sqlserver tramite il nome del server. 
Istantanea se connesso con l'ip
 
 
riferimenti:
Visual basic for applications
microsoft access 10 object library
ole automatio
microsoft activex data object 2.5 library
ole guid andi interface definition
Microsoft SQLDMO Object library
Microsoft Scripting Runtime
 
 
poi ho degli ocx fatti da me usati in altre form...ma come prova avevo 
impotato in un nuovo db solo la maschera fatture con i riferimenti 
minimali e il problema persisteva
 
Se metto il server sql in locale su windows 8 il problema non si 
presenta anche se collego via nome e non via ip. MI vien da pensare a 
qualcosa sui protocolli di rete
 
ciao
BFS
 
 
 
 
 
 
 

 qualcosa sui protocolli di rete
 
Era in effetti cio' che ti avevo detto.
