Prime esperienze (negative) con Access 2021

di il
25 risposte

Prime esperienze (negative) con Access 2021

L'intenzione era di testare il passaggio all'ambiente di sviluppo Access 2021 (64 bit).
Ho preso uno dei tanti mie applicativi scritti per Access 2019 (64 bit).
All'apertura di tutti i forms ottengo errori sui controlli ActiveX.

Se rigenero da zero un form, copio tutto il codice e gli oggetti, il form funziona regolarmente (impensabile farlo per i centinaia di form dei miei applicativi).

Altra situazione particolare, se ho una MsgBox, esce con dei CodePage balordi in pratica mostrando caratteri speciali sulle accentate ecc.

Dopo i primi 'ravanamenti' in Internet, sembra che la cosa si possa risolvere ricreando il DB ed importando tutti gli oggetti.
Sembra una cosa legata alle localizzazioni.

Però In tal caso si comporta come ci fosse un errore dei reference sul DB nuovo.
Nella definizione di un oggetto di tipo Database ad esempio dà errore in compilazione.
Nei Reference uso Microsoft VBA, Microsoft Access 16 Object Library, Microsoft Office 16 Database Engine Object Library.
In pratica con questi Reference usando il vecchio DB compila i tipi Database ad esempio, nel nuovo non compila.

Insomma le prime verifiche sono state un'ecatombe, qualcun altro c'ha provato? Qualche idea?

25 Risposte

  • Re: Prime esperienze (negative) con Access 2021

    Non ho A2021, quindi per ora sono ignaro.
    Per le referenze perse, proverei a fare un ciclo sulla collection References per il ripristino.

    Puoi dare uno sguardo a questo articolo:
    https://stackoverflow.com/questions/5593588/add-references-programmatically

    Ovviamente potrebbe essere un WorkAround in attesa di BugFix di mamma MS.
  • Re: Prime esperienze (negative) con Access 2021

    Qualche news.
    Creando un nuovo DB ed importando tutto sembra funzionare. Putroppo però il problema è che vuole ADO, DAO non funziona più (centinaia di righe di codice da correggere).
    Tenete conto che per avere la massima elasticità nel cambio del DB uso ODBC, cambiare da uno all'altro non è una passeggiata.

    Nei miei programmi leggo un file ini e mi connetto ai DB in essi configurati in modo dinamico.
    Per cui ho una procedura di 'riconnessione' automatica che utilizzo allo spostamento dell'applicativo.
    Ad esempio, passo il programma che in area sviluppo da me aggancia il DB di test con un certo nome in una certa posizione, ad uno che lo ha in una posizione completamente diversa con un nome diverso.
    Al primo ingresso il programma forza una riconnessione che fa tutti i refreshlink (compresa la connessione ad una query che uso per i pass through).
    Questa gestione è tutta in DAO.

    C'è qualcuno che ha tentato qualcosa di simile con ADO?
    Passando via ODBC con ADO anzichè con DAO ci sono rischi sul piano delle prestazioni?

    Penso che alla fine sarò costretto al passaggio (oppure a rimanere con Access 2019).
  • Re: Prime esperienze (negative) con Access 2021

    Stai dicendo che "Microsoft Office 16 Database Engine Object Library" non è supportato...?
    Ha qualche cosa a che vedere con questo:
    https://docs.microsoft.com/it-it/office/troubleshoot/access/cannot-use-odbc-or-oledb
    https://docs.microsoft.com/it-it/office/troubleshoot/access/resolve-reference-issues
  • Re: Prime esperienze (negative) con Access 2021

    Mi permetto di evidenziare alcuni aspetti che forse non erano chiari al momento del post di apertura.

    paoloholzl ha scritto:


    ... vuole ADO, DAO non funziona più...
    ... elasticità nel cambio del DB uso ODBC...
    ... mi connetto ai DB in essi configurati in modo dinamico.
    ... fa tutti i refreshlink (compresa la connessione ad una query che uso per i pass through).
    ... Passando via ODBC con ADO anzichè con DAO
    Hai un applicativo diviso in FE e BE, non si era capito all'inizio. Quale o quali sono i BackEnd? File Access o altro? Da approfondire poi in relazione al discorso "pass through".
    Perché usi ODBC? Che elasticità di permette? Ci sono anche i collegamenti DSN-Less.
    Se anche rispondi non è detto che io sia in grado di aiutarti ma forse si trova la vera origine del problema.
  • Re: Prime esperienze (negative) con Access 2021

    Philcattivocarattere ha scritto:


    ...
    Hai un applicativo diviso in FE e BE, non si era capito all'inizio. Quale o quali sono i BackEnd? File Access o altro? Da approfondire poi in relazione al discorso "pass through".
    Perché usi ODBC? Che elasticità di permette? Ci sono anche i collegamenti DSN-Less.
    Se anche rispondi non è detto che io sia in grado di aiutarti ma forse si trova la vera origine del problema.
    Paolo è un "novellino" di Access... ha fatto domande troppo complesse...
  • Re: Prime esperienze (negative) con Access 2021

    Philcattivocarattere ha scritto:


    Mi permetto di evidenziare alcuni aspetti che forse non erano chiari al momento del post di apertura.

    paoloholzl ha scritto:


    ... vuole ADO, DAO non funziona più...
    ... elasticità nel cambio del DB uso ODBC...
    ... mi connetto ai DB in essi configurati in modo dinamico.
    ... fa tutti i refreshlink (compresa la connessione ad una query che uso per i pass through).
    ... Passando via ODBC con ADO anzichè con DAO
    Hai un applicativo diviso in FE e BE, non si era capito all'inizio. Quale o quali sono i BackEnd? File Access o altro?
    I miei back-end dipendono dalla situazione.
    Il caso più 'incasinato' ha come back-End due database SQL Server, un database Mysql, un database Access ed un database MysQL remoto su un server Web.
    Vedo tutte le tabelle come fossero direttamente linkate.
    All'accesso posso decidere liberamente se usare i DB correnti o switchare su quelli di Test.

    Philcattivocarattere ha scritto:


    Perché usi ODBC? Che elasticità di permette? Ci sono anche i collegamenti DSN-Less.
    E' un tipo di collegamento che non ho mai approfondito, forse perchè da anni uso lo stesso che funziona.
    Così come opero ora non ho avuto problemi ad operare con Back End di tipo differente, SQL Server, MySQL, Postgresql, Oracle, File accdb ecc.
    Il motivo per cui faccio un uso molto limitato delle pass through se non con sintassi elementari e standard, è per mantenere la libertà di saltare da un DB all'altro senza cambiare le sintassi SQL.
    Per cui i miei applicativi di norma non variano al variare del DB di back-end.
    Ogni client è configurato per potersi connettere ad un certo numero di DB (alcuni anche ad altri alternativi, ad esempio quelli di test).
    Il db front-end (che contiene anche tabelle di transito), va in autodistribuzione ad ogni aggiornamento, e prescinde dal collegamento predisposto sui singoli client che fanno la 'riconnessione' al primo accesso.

    Volendo prescindere dai collegamenti ODBC tu come lo faresti? Hai avuto esperienze di collegamenti DSN-Less o altre medodologie che fanno la stessa cosa?

    La cosa mi interessa davvero, grazie.
  • Re: Prime esperienze (negative) con Access 2021

    L'avevo anticipato, ora confermo la tua situazione è troppo complessa per le mie conoscenze.

    paoloholzl ha scritto:


    ...Hai avuto esperienze di collegamenti DSN-Less o altre medodologie che fanno la stessa cosa?
    Ti basta una ricerca sul web e troverai un'infinità di spiegazioni, specifiche per Access e non solo.
    Una delle pagine fondamentali sarà:
  • Re: Prime esperienze (negative) con Access 2021

    Ovviamente non confondiamo DAO e ADO con ODBC e OLEDB... quindi si possono Linkare le Tabelle sia con ODBC usando DAO, classico metodo Tabledefs ecc... ma anche con OLEDB Proveider, in questo caso pero si ricorre ad ADO ed ADOX
    Prova a leggere questo Paolo:
    https://www.tek-tips.com/viewthread.cfm?qid=108191
    https://www.fmsinc.com/free/newtips/access/accesstip3.asp
    https://support.microsoft.com/en-us/office/connect-access-to-sql-server-050d88f3-b2d6-4e76-b6f9-f3c556f139ea
  • Re: Prime esperienze (negative) con Access 2021

    Trovo molto interessanti i link che mi hai girato.
    Non ho avuto il tempo di studiarli bebe ma lo farò sicuramente, sono routines davvero interessanti.

    La premessa è che mentre ODBC è cross-platform e c'è praticamente per tutto e per tutti i DB (Linux Max ecc.), gli OLEDB provider dipendono strettamente da Microsoft, e quindi ad esempio non esistono connessioni OLEDB native per MySql (per me indispensabili).

    Mi ha lasciato molto perplesso questo schema:
    https://support.content.office.net/en-us/media/d4d0c0b3-6133-4423-b699-0a30cfb59661.png

    Questo farebbe intendere che per usare ODBC bisogna usare per forza DAO.
    Ma è proprio così?
    Questo brucerebbe nativamente la mia possibilità di utilizzo di Access 2021.
  • Re: Prime esperienze (negative) con Access 2021

    paoloholzl ha scritto:


    ....
    Mi ha lasciato molto perplesso questo schema:
    https://support.content.office.net/en-us/media/d4d0c0b3-6133-4423-b699-0a30cfb59661.png

    Questo farebbe intendere che per usare ODBC bisogna usare per forza DAO.
    Ma è proprio così?
    Questo brucerebbe nativamente la mia possibilità di utilizzo di Access 2021.
    Si per ODBC si usa DAO, quello che trovo strano è quanto dici relativamente alla versione 2021, non che lo metto in discussione, spero sia ascrivibile ad un BUG...
    Hai provato a scrivere su ICAA dove c'è Karl che sicuramente riesce ad essere aggiornato su eventuali segnalazioni relative...?
  • Re: Prime esperienze (negative) con Access 2021

    Io utilizzo Access con MariaDB e ODBC MySQL /MariaDB (sono fermo ad Access2013).
    Di seguito una mia routine per impostare la connection string :
    
    Public Function ODBCConnectionString(Optional sCnnString As String = "") As String
    
    Dim sProcName As String: sProcName = "Classe : " & sClassName & " - Procedura/Evento : " & "ODBCConnectionString"
    If gHandleErrors Then
        On Error GoTo LblErr
    Else
        On Error GoTo 0
    End If
    
    Dim sCnn        As String
    
        '
        ' ATTENZIONE :
        ' DAO -> "ODBC;resto stringa"               -> ODBC
        ' ADO -> "PROVIDER=MSDASQL;resto stringa"   -> OLEDB
        '
        ' DNS       -> "ODBC;DSN=ProvaDSN;UID=xxx; PWD=yyy;DATABASE=" & sRemoteDB
        ' DNSLESS   -> "ODBC;DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=MaxHome;PORT=3306;UID=xxx; PWD=yyy;DATABASE=" & sRemoteDB
        '
        
        '
        ' MySQL V5.3.11 : gestisce multiple statements.
        '   Ha un bug su campi Text con + di 1024 caratteri -> indica il record come #DELETED#
        '
        'sCnn = "DRIVER={MySQL ODBC 5.3 ANSI Driver}; "
        
        Select Case clsInit.ODBCDriver
        Case 2
            '
            ' MySQL V8.0.23 : gestisce multiple statements.
            '
            sCnn = "DRIVER={MySQL ODBC 8.0 ANSI Driver}; "
        Case Else
            '
            ' MariaDB V3.1.11 : NON gestisce (completamente) multiple statements.
            '
            sCnn = "DRIVER={MariaDB ODBC 3.1 Driver}; "
        End Select
        
        If Len(sCnnString) > 0 Then
            sCnn = sCnn & sCnnString
        Else
            sCnn = sCnn & "SERVER=" & clsInit.MySQLServer & "; "
            sCnn = sCnn & "PORT=" & clsInit.MySQLPort & "; "
            sCnn = sCnn & "UID=" & clsInit.AccUser & "; "
            sCnn = sCnn & "PWD=" & clsInit.AccPwd & "; "
        '
        ' Aggiungere le eventuali opzioni (OPTION=x)
        ' Usare direttamente il nome dell'opzione=1
            
            sCnn = sCnn & clsInit.ODBCOptions
        End If
        ODBCConnectionString = sCnn & "DATABASE=" & clsInit.BEName
        '
    LblExit:
        Exit Function
    
    LblErr:
        ' L'applicazione viene comunque terminata (END o QUIT)
    End Function
    
    La funzione restituisce una connection string alla quale occorre aggiungere in testa :
    - per uso DAO -> "ODBC;" & ConnectionString
    - per uso ADO -> "PROVIDER=MSDASQL;" & ConnectionString
    Nota per ADO :
    in caso di errori potrebbe essere necessario usare : "PROVIDER=MSDASQL.1;", sinceramente non sono in grado di stabilire se/quando serve ...

    Nel caso servissero elenco le opzioni di connessione MySQL :
    
    'Parameter Name         GUI Option                                          Constant Value   2^ Description
    'FOUND_ROWS             Return matched rows instead of affected rows                     2    1 The client cannot handle when MySQL returns the true value of affected rows. If this flag is set, MySQL returns “found rows” instead. You must have MySQL 3.21.14 or newer for this to work.
    'BIG_PACKETS            Allow big result set                                             8    3 Do not set any packet limit for results and bind parameters. Without this option, parameter binding will be truncated to 255 characters.
    'NO_PROMPT              Don't prompt when connecting                                    16    4 Do not prompt for questions even if driver would like to prompt.
    'DYNAMIC_CURSOR         Enable Dynamic Cursors                                          32    5 Enable or disable the dynamic cursor support.
    'NO_SCHEMA              Ignore schema in column specifications                          64    6 Ignore use of database name in db_name.tbl_name.col_name.
    'NO_DEFAULT_CURSOR      Disable driver-provided cursor support                         128    7 Force use of ODBC manager cursors (experimental).
    'NO_LOCALE              Don't use setlocale()                                          256    8 Disable the use of extended fetch (experimental).
    'PAD_SPACE              Pad CHAR to full length with space                             512    9 Pad CHAR columns to full column length.
    'FULL_COLUMN_NAMES      Include table name in SQLDescribeCol()                        1024   10 SQLDescribeCol() returns fully-qualified column names.
    'COMPRESSED_PROTO       Use compression                                               2048   11 Use the compressed client/server protocol.
    'IGNORE_SPACE           Ignore space after function names                             4096   12 Tell server to ignore space after function name and before “(” (needed by PowerBuilder). This makes all function names keywords.
    'NAMED_PIPE             Named Pipe                                                    8192   13 Connect with named pipes to a mysqld server running on NT.
    'NO_BIGINT              Treat BIGINT columns as INT columns                          16384   14 Change BIGINT columns to INT columns (some applications cannot handle BIGINT).
    'NO_CATALOG             Disable catalog support                                      32768   15 Forces results from the catalog functions, such as SQLTables, to always return NULL and the driver to report that catalogs are not supported.
    'USE_MYCNF              Read options from my.cnf                                     65536   16 Read parameters from the [client] and [odbc] groups from my.cnf.
    'SAFE                   Enable safe options                                         131072   17 Add some extra safety checks.
    'NO_TRANSACTIONS        Disable transaction support                                 262144   18 Disable transactions.
    'LOG_QUERY              Log queries to %TEMP%\myodbc.sql                            524288   19 Enable query logging to c:\myodbc.sql(/tmp/myodbc.sql) file. (Enabled only in debug mode.)
    'NO_CACHE               Don't cache results of forward-only cursors                1048576   20 Do not cache the results locally in the driver, instead read from server (mysql_use_result()). This works only for forward-only cursors. This option is very important in dealing with large tables when you do not want the driver to cache the entire result set.
    'FORWARD_CURSOR         Force use of forward-only cursors                          2097152   21 Force the use of Forward-only cursor type. In cases of applications setting the default static/dynamic cursor type and one wants the driver to use noncache result sets, this option ensures the forward-only cursor behavior.
    'AUTO_RECONNECT         Enable automatic reconnect                                 4194304   22 Enables auto-reconnection functionality. Do not use this option with transactions, since an auto-reconnection during a incomplete transaction may cause corruption. An auto-reconnected connection will not inherit the same settings and environment as the original connection. Added in 3.51.13.
    'AUTO_IS_NULL           Enable SQL_AUTO_IS_NULL                                    8388608   23 When AUTO_IS_NULL is set, the driver does not change the default value of sql_auto_is_null, leaving it at 1, so you get the MySQL default, not the SQL standard behavior.
    '                                                                                               When AUTO_IS_NULL is not set, the driver changes the default value of SQL_AUTO_IS_NULL to 0 after connecting, so you get the SQL standard, not the MySQL default behavior.
    '                                                                                               Thus, omitting the flag disables the compatibility option and forces SQL standard behavior.
    '                                                                                               See IS NULL. Added in 3.51.13.
    'ZERO_DATE_TO_MIN       Return SQL_NULL_DATA for zero date                        16777216   24 Translates zero dates (XXXX-00-00) into the minimum date values supported by ODBC, XXXX-01-01. This resolves an issue where some statements will not work because the date returned and the minimum ODBC date value are incompatible. Added in 3.51.17.
    'MIN_DATE_TO_ZERO       Bind minimal date as zero date                            33554432   25 Translates the minimum ODBC date value (XXXX-01-01) to the zero date format supported by MySQL (XXXX-00-00). This resolves an issue where some statements will not work because the date returned and the minimum ODBC date value are incompatible. Added in 3.51.17.
    'MULTI_STATEMENTS       Allow multiple statements                                 67108864   26 Enables support for batched statements. Added in 3.51.18.
    'COLUMN_SIZE_S32        Limit column size to signed 32-bit range                 134217728   27 Limits the column size to a signed 32-bit value to prevent problems with larger column sizes in applications that do not support them. This option is automatically enabled when working with ADO applications. Added in 3.51.22.
    'NO_BINARY_RESULT       Always handle binary function results as character data  268435456   28 When set, this option disables charset 63 for columns with an empty org_table. Added in 3.51.26.
    'DFLT_BIGINT_BIND_STR   Bind BIGINT parameters as strings                        536870912   29 Causes BIGINT parameters to be bound as strings. Microsoft Access treats BIGINT as a string on linked tables. The value is read correctly, but bound as a string. This option is used automatically if the driver is used by Microsoft Access. Added in 5.1.3.
    'NO_INFORMATION_SCHEMA  Don't use INFORMATION_SCHEMA for metadata               1073741824   30 Tells catalog functions not to use INFORMATION_SCHEMA, but rather use legacy algorithms. The trade-off here is usually speed for information quality. Using INFORMATION_SCHEMA is often slow, but the information obtained is more complete. Added in 5.1.7.
    'NO_DATE_OVERFLOW       Ignore data overflow error                                       0      Continue with the query execution rather then return error if the time portion is missing. The server will ignore the time component and the result is the same as if they were zeros. Added in 5.3.8.
    
  • Re: Prime esperienze (negative) con Access 2021

    paoloholzl ha scritto:


    ...Questo farebbe intendere che per usare ODBC bisogna usare per forza DAO.
    Ma è proprio così?
    Questo brucerebbe nativamente la mia possibilità di utilizzo di Access 2021.
    Credo di no, si tratta di compilare correttamente la stringa di connessione :
    DAO + ODBC : "ODBC;" & stringa di connessione
    ADO + ODBC : "PROVIDER=MSDASQL;" & stringa di connessione oppure "PROVIDER=MSDASQL.1;" & stringa di connessione

    Attendo (attendiamo) comunque tue prove.

    Piuttosto, riesci a verificare se i form sono nativamente DAO oppure sono diventati ADO?
    Questa sarebbe una vera notizia ... spiazzante !
  • Re: Prime esperienze (negative) con Access 2021

    Hai ragione Max, lo spiega anche MS, ma è specifico del provider MS che appunto è quello che dicevi MSDASQL.

    Quindi è vero ma solo se... se ho capito bene.

    https://docs.microsoft.com/it-it/sql/ado/guide/appendixes/microsoft-ole-db-provider-for-odbc?view=sql-server-ver15

    Riassumendo:
    Il provider Microsoft ODBC, tuttavia, consente ad ADO di connettersi a qualsiasi origine dati ODBC. Il provider è a thread libero e Unicode abilitato.
  • Re: Prime esperienze (negative) con Access 2021

    Non ne sono ancora uscito, mancando (o non avendo trovato) il componente DAO nell'ultimo Access, i forms devono essere ADO per forza. Sto quindi cercando di fare dei test di 'migrabilità' il più indolore possibile da DAO a ADO.
    Dal punto di vista dei recordsets non sono molto preoccupato (tranne per il fatto che sono centinaia).
    Per connettere il DB via ODBC ci sono varie strade, la più semplice se hai un ODBC già impostato è a mio parere

    -----------
    Sub Test()
    Dim Conn1 As ADODB.Connection
    On Error GoTo ErrorHandler
    Set Conn1 = New ADODB.Connection
    Conn1.Open "NomeDelTuoDB", "NomeDelTuoUser", "PasswordDelTuoUser"
    MsgBox "Stato connessione: " & GetState(Conn1.State)
    Exit Sub

    ErrorHandler:
    If Not Conn1 Is Nothing Then
    If Conn1.State = adStateOpen Then Conn1.Close
    End If
    Set Conn1 = Nothing

    If Err <> 0 Then
    MsgBox "Errore durante la connessione: " & Err.Source & vbCrLf & Err.Description, , "Errore"
    End If
    End Sub
    -----------

    Fino a qui non ho trovato particolari problemi.
    Lo scoglio in cui mi sono imbattuto sta nella possibilità di fare un refreshlink sulle tabelle linkate.

    Il refreshlink (che esisteva in DAO), permetteva di cambiare 'al volo' la connection della tabella linkata.
    Giusto per capire se vai in una struttura della tabella linkata (passando l'avviso di errore), e vai nelle proprietà vedi la stringa di connessione.

    Cosa mi serve? Immaginate ad esempio io entri nel programma e voglia entrare nel DB di test piuttosto che quello di produzione, seleziono su che DB andare e cambio tutte le connections delle Tables (e delle eventuali Stored Procedures).
    Ma non solo, se passo ad un cliente il programma, i riferimenti al suo ODBC non corrispondono al mio per cui la riconnessione è un'esigenza imprescindibile.

    Tutti gli esempi che trovo parlano di ADO ma poi manca sempre qualche reference, oppure usano TableDef (DAO), per cui il codice non è compilabile con ADO.

    Avete visto qualcosa in giro?
Devi accedere o registrarti per scrivere nel forum
25 risposte