Da access 2007 ad Access 365

di il
23 risposte

Da access 2007 ad Access 365

Salve ho spostato un programma fatto da un pc con Win10 64Bit ma che esegue access 2007 su un pc Win10 64Bit con Access 365

ovviamente quando l'ho eseguito ho dovuto correggere varie cose di incompatibilita' da 32 bit a 64

ora pero' mi da un altro errore: "errore di compilazione: tipo non corrispondente  per l'argomento Byref

questa e' la funzione dove da l'errore, e non ci sono errori perche' su l'altro pc con access 2007 funziona

qualcuno sa aiutarmi su come modificarla per renderla compatibile con access 365? oppure potrebbe essre un problema di libreria installata sul pc? se cosi' fosse come faccio a saperlo? siccome e' stato installato anni fa , e non da me no so dove guardare per capire quali librerie ci voglono

grazie

Function MSAccessDimensioneFinestra(UM As String, Direzione As String) As LongLong
' UM è l'unità di misura ritornata:  PX ritorna pixel - TW ritorna twips
' Direzione ritorna: X larghezza finestra - Y Altezza finestra
Dim wp As WM_WINDOWPLACEMENT
On Error Resume Next

 wp.Length = Len(wp)
 '* This function retrieves the size of the restored window.
 If WM_apiGetWindowPlacement(xg_GetAccesshWnd(), wp) Then
   'MsgBox "The Access window is at:  left = " & wp.rcNormalPosition.Left & " top = " & wp.rcNormalPosition.Top
   'MsgBox "The width is " & (wp.rcNormalPosition.Right - wp.rcNormalPosition.Left)
   'MsgBox "The height is " & (wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top)
   If UCase(Direzione) = "X" Then MSAccessDimensioneFinestra = (wp.rcNormalPosition.Right - wp.rcNormalPosition.Left)
   If UCase(Direzione) = "Y" Then MSAccessDimensioneFinestra = (wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top)
 End If
If UCase(UM) = "TW" Then
 MSAccessDimensioneFinestra = fPixelsToTwips(MSAccessDimensioneFinestra, 0)
End If
End Function

23 Risposte

  • Re: Da access 2007 ad Access 365

    Ciao,

    se pensi sia un problema legato alle Librerie, allora in VBA vai su Riferimenti e controlla se nell'elenco delle librerie referenziate esiste la segnalazione [Mancante] o una cosa simile

  • Re: Da access 2007 ad Access 365

    No non dice nulla quindi a sto punto e' un problema di modifica del codice per adattarlo al 64bit?

    io una modifica l'ho gia' fatta dove ho aggiungo LongLong e altri parametri ma ora non mi da nessuna indicazione si dove intervenire tranne nella funzione dove da errore

  • Re: Da access 2007 ad Access 365

    Function MSAccessDimensioneFinestra(UM As String, Direzione As String) As LongLong
    ' UM è l'unità di misura ritornata:  PX ritorna pixel - TW ritorna twips
    ' Direzione ritorna: X larghezza finestra - Y Altezza finestra
    Dim wp As WM_WINDOWPLACEMENT
    On Error Resume Next
     wp.Length = Len(wp)
     '* This function retrieves the size of the restored window.
     If WM_apiGetWindowPlacement(xg_GetAccesshWnd(), wp) Then
       'MsgBox "The Access window is at:  left = " & wp.rcNormalPosition.Left & " top = " & wp.rcNormalPosition.Top
       'MsgBox "The width is " & (wp.rcNormalPosition.Right - wp.rcNormalPosition.Left)
       'MsgBox "The height is " & (wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top)
       If UCase(Direzione) = "X" Then MSAccessDimensioneFinestra = (wp.rcNormalPosition.Right - wp.rcNormalPosition.Left)
       If UCase(Direzione) = "Y" Then MSAccessDimensioneFinestra = (wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top)
     End If
    If UCase(UM) = "TW" Then
     MSAccessDimensioneFinestra = fPixelsToTwips(MSAccessDimensioneFinestra, 0)
    End If
    End Function

    12/05/2023 - miami71it ha scritto:


    ora pero' mi da un altro errore: "errore di compilazione: tipo non corrispondente  per l'argomento Byref

    “tipo non corrispondente” è un classico errore che si genera quando la stessa variabile viene definita con tipi diversi in momenti diversi

    Verifica il parametro UM come viene passato e se viene dichiarato con un tipo diverso da String così come se lo aspetta la Function che richiami.

    Stessa cosa vale per il ritorno del valore da parte della Function. Dove vai ad assegnare il valore della Function? ad una variabile dello stesso tipo?

  • Re: Da access 2007 ad Access 365

    Ma puo' essere che sul pc con access 2007 funziona senza problema e invece su access365 da questi errori? il problema delle variabili che dici tu su access 2007 non c'e'? e' meno pignolo? :)

  • Re: Da access 2007 ad Access 365

    Miami71it,
    il messaggio presentato "errore di compilazione: tipo non corrispondente  per l'argomento Byref" indica che stai passando un parametro tramite riferimento (Byref) mentre probabilmente stai passando alla UDF un dato ByVal (per valore) oppure di tipo diverso o non specificato (con una conversione di default) fra parameto chiamante o restituito dalla funzione-
    https://learn.microsoft.com/it-it/dotnet/visual-basic/programming-guide/language-features/procedures/passing-arguments-by-value-and-by-reference
    https://learn.microsoft.com/it-it/dotnet/visual-basic/language-reference/error-messages/copying-the-value-of-byref-parameter-back-to-the-matching-argument-narrows

    Impiegare le API (per determinare le dimensioni della finestra da ripristinare) implica una buona conoscenza del sistema ed in particolare la gestione desli handle, inoltre il codice non è solo nella funzione presentata ma molto più esteso come puoi osservare in questo link:
    https://www.experts-exchange.com/questions/20746173/Position-of-a-form-in-the-window.html
    As esempio vanno esaminati tutti gli oggetti ad esempio il tipo WM_WINDOWPLACEMENT con la struttura che lo compone ed i rifermenti agli elementi correlati-

    Per quanto riguarda le versioni a 32 e 64 bit di Access devi considerare che la versione 2007 era probabilmente a 32 bit  ed installato su sistema operativo sempre a 32 bit.
    La versione a 64 bit di Microsoft 365 (come riportato nella documentazione) viene installata automaticamente a meno che non si selezioni esplicitamente la versione a 32 bit prima di iniziare il processo di installazione:
    https://www.experts-exchange.com/questions/20746173/Position-of-a-form-in-the-window.html

    Ora se si vogliono impiegare le API di Windows (che sono a 32 bit) vi è necessità di convertire tutte le funzioni e relativo codice, con i criteri necessari per il passaggio da 32 a 64 bit o ancora meglio sarebbe impiegare la compilazione condizionale in modo da avere l'opportunità di entrambe le versioni (32/64 bit). In tal caso ti possono essere utili questi link:
    https://www.iprogrammatori.it/forum-programmazione/access/database-access-2007-con-office-365-bit-t48837.html
    https://www.devhut.net/access-x32-vs-x64-compatibility/
    https://github.com/MicrosoftDocs/office-developer-client-docs/blob/main/docs/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office.md
    https://codekabinett.com/rdumps.php?Lang=1&targetDoc=windows-api-deklaration-vba-64-bit

  • Re: Da access 2007 ad Access 365

    12/05/2023 - willy55 ha scritto:


    il messaggio presentato "errore di compilazione: tipo non corrispondente  

    Ciao Willy,
    perdona un piccolo OT….  a proposito di versione access e quindi Office. Io sono fermo alla Vr.13 Pro Plus licenza Full Time , non ho particolari esigenze, esclusivamente private.
    Mi conviene fare il salto, e verso quali versioni Office?  attuale OS Windows10 32/64bit…
    Che mi suggeriresti ? 

  • Re: Da access 2007 ad Access 365

    12/05/2023 - By65Franco ha scritto:


    Ciao Willy,
    perdona un piccolo OT….  a proposito di versione access e quindi Office. Io sono fermo alla Vr.13 Pro Plus licenza Full Time , non ho particolari esigenze, esclusivamente private.
    Mi conviene fare il salto, e verso quali versioni Office?  attuale OS Windows10 32/64bit…
    Che mi suggeriresti ? 

    Ciao Franco, ti consiglio di rimanere alla versione 2013, più che sufficiente in ambito personale/rete locale (le nuove release non hanno hanno implementato funzionalità significative e la versione 365, nella politica Microsoft, mira agli abbonamenti).
    Se vuoi sviluppare in ambito Web va cambiato il prodotto.

  • Re: Da access 2007 ad Access 365

    12/05/2023 - willy55 ha scritto:


    12/05/2023 - By65Franco ha scritto:


    Ciao Willy,
    perdona un piccolo OT….  a proposito di versione access e quindi Office. Io sono fermo alla Vr.13 Pro Plus licenza Full Time , non ho particolari esigenze, esclusivamente private.
    Mi conviene fare il salto, e verso quali versioni Office?  attuale OS Windows10 32/64bit…
    Che mi suggeriresti ? 

    Ciao Franco, ti consiglio di rimanere alla versione 2013, più che sufficiente in ambito personale/rete locale (le nuove release non hanno hanno implementato funzionalità significative e la versione 365, nella politica Microsoft, mira agli abbonamenti).
    Se vuoi sviluppare in ambito Web va cambiato il prodotto.

    Allora rimango ancorato dove sono anche se non è più supportato da questo mese la vr13 …. me lo faccio bastare ;))))
    Le applicazioni poi le faccio in Visual Studio e mi basta….  mica ho tanta voglia di fare molto di più ;)))

    Gentilissimo come sempre Willy…. grazieeee  mileeeee, mi hai dato una conferma su quello che in parte già era mia opinione.

  • Re: Da access 2007 ad Access 365

    Ciao Willy ti ringrazio del tuo intervento

    volevo pero' precisare che il PC dove e' attualmente installato e' Win10-64Bit e utilizzano Access 2007 , quindi presumo a 32 bit e non ha nessun tipo di problema 

    quindi a questo punto se installo la versione 2007 a 32bit non dovrei avere problemi°?

  • Re: Da access 2007 ad Access 365

    Se il SO è 64Bit ed Office 32 non dovresti avere alcun problema se il codice è scritto correttamente, da A2007 tuttavia le API vanno modificate usando il PtrSafe… ora le API del SO a 64Bit vanno usate come tali… e, ad esempio il WM_WINDOWPLACEMENT come anche la stessa funzione [MSAccessDimensioneFinestra], andrebbero incluse nella Compilazione condizionale come anche le dichiarazioni API… tutte cose che purtroppo tu nel codice non mostri, quindi temo possa esserti sfuggito qualche cosa…!

    Mentre il SO è a 64Bit e riconosce il LongLong, Office è a 32 e nemmeno sa cosa sia il LongLong, quindi la tua Funzione non potrà mai funzionare se non modifichi in Long… 

    Function MSAccessDimensioneFinestra(UM As String, Direzione As String) As Long

    Per questo serve capire bene la differenza tra SO ed applicativo, e come usare la Compilazione Condizionale.

    Alla luce di tutto, la probabilità tu abbia fatto un po di confusione è molto probabile…!

    Ora faccio una considerazione molto più banale… cosa ottieni con quel codice che non puoi ottenere con questo…?

    Msgbox Me.WindowWidth 

    Saluti

  • Re: Da access 2007 ad Access 365

    Allora si un po' di confusione la sto facendo io , diciamo che io no sono un programmatore di Access VBA, sono un sistemista e volevo sistemare questa spiacevole situazione a un mio cliente.

    il LongLong PtrSafe lo avevo gia' sistemato io perche' il primo errore era quello e lo avevo sistemato perche' non partiva nemmeno

    dopo il programma parte, posso lavorarci su , ad esempio aggiungere un nuovo cliente ma come faccio delle operazioni che vengono aperte delle finestre , o cose simili, mi compare questo errore e vedo che si blocca in quella funzione che ti ho mandato lo screen.

    Ovvio che magari va corretto in vari punti ma , per la mia competenza ovviamente, e' correggere vari punti come ho fatto con PtrSafe o LongLong, e un conto e' stravolgere il programma , li diventerebbe piu' complicato

  • Re: Da access 2007 ad Access 365

    Devi vedere se quelle API hanno senso… se non lo hanno basta toglierle… peraltro credo che capire come gestire la Compilazione Condizionale non sia cosa così banale, mi pare sia già evidente…!

    Vedi tu… buon lavoro.

  • Re: Da access 2007 ad Access 365

    Le API sono di Windows giusto? che sono quelle che permettono di far fare cose al sistema, lo capisco , ma se nel PC originario e' sempr eun Windows 10 64Bit allora sono un problema di Access

  • Re: Da access 2007 ad Access 365

    15/05/2023 - miami71it ha scritto:


    Le API sono di Windows giusto? che sono quelle che permettono di far fare cose al sistema, lo capisco , ma se nel PC originario e' sempr eun Windows 10 64Bit allora sono un problema di Access

    Se utilizzi le chiamate API dal VBA di Office che è a 32Bit devi scrivere codice che il VBA 32Bit capisca… e non modificarlo a prescindere verso il 64Bit solo perchè i SO è a 64Bit… tant'è che appunto il LongLong non andava ma anche un LongPtr come può essere un Handle Pointer non sarà ovviamente tale…

    Insomma non si modifica codice senza capire nel concreto perchè e cosa serve fare a mio avviso per farlo funzionare, ed i tentativi per approssimazione vanno bene se hai tempo da perdere.

    Come ti dicevo la Compilazione condizionale, per chi la conosce e sono pochi, serve proprio a scrivere codice che possa adattarsi al Versioning, ma questo è un discrorso da fare a chi scrive codice VBA per i prodotti che poi sviluppa… nel tuo caso, avrei dato il prodotto in mano ad un tecnico competente del prodotto.

    Saluti

Devi accedere o registrarti per scrivere nel forum
23 risposte