Problema collegamento Access su SQL

di il
29 risposte

29 Risposte - Pagina 2

  • Re: Problema collegamento Access su SQL

    29/04/2025 - Fabio76 ha scritto:

    Partiamo che il mio scopo in queste tabelle è solo interrogare e non aggiornare.

    Come dice max, una soluzione potrebbe essere l'aggiunta di una colonna sulle 4 tabelle che ho a livello di server sql?  Su due piedi non dovrebbe succedere niente ma non ho mai provato, non vorrei far casino.

    Se non devi aggiornare direi che il campo rowversion non ti serve : concentrati sul bigint (credo che Access non sia in grado di gestire un campo così grande - ma va verificato in funzione della versione di Access (2013/2016 ...) , di 32/64 bit (di Access) e del driver ODBC).

  • Re: Problema collegamento Access su SQL

    Allora tenendo conto delle varie osservazioni che abbiamo fatto , direi che possiamo scrivere una cosa di questo tipo:

    CREATE VIEW View_lists_result_int AS
    SELECT
      CAST(id AS INT) AS id,
      recordStatus,
      recordWritingDate,
      recordimportationDate,
      plantid,
      response,
      listType,
      listNumber,
      lineNumber,
      item,
      batch,
      serialNumber,
      requestedQty,
      processedQty,
      errorCause,
      wmsGenerated,
      auxText01,
      auxText02,
      auxText03,
      auxText04,
      auxText05,
      auxText06,
      auxText07,
      auxText08,
      auxText09,
      auxText10,
      auxint01,
      auxint02,
      auxint03,
      auxint04,
      auxint05,
      auxint06,
      auxint07,
      auxint08,
      auxint09,
      auxint10,
      auxDated1,
      auxDate02,
      auxDate03,
      auxDate04,
      auxDate05,
      auxDate06,
      auxDate07,
      auxDate09,
      auxDate10,
      auxBit01,
      auxBit02,
      auxBit03,
      auxBit04,
      auxBit05,
      auxBit06,
      auxBit07,
      auxBit08,
      auxBit09,
      auxBit10,
      auxNum01,
      auxNum02,
      auxNum03,
      auxNum04,
      auxNum05,
      auxNum06,
      auxNum07,
      auxNum08,
      auxNum09,
      auxNum10
    FROM lists_result;
    
    1. Vai in SSMS e apri il database e sulla tabella lists_result (se ho capito bene il suo nome)  click destro e creare nuova query
    2. Nella nuova query scrivere la query sopra riportata ... verificarei nomi delle colonne e se ritieni opportuno inserisci solo le colonne che ti interessano
    3. Eseguire la query in modo possa essere salvata come View che ritroverai nel database in questione alla voce "Views"
    4. Nelle Views troverai la tua vista appena creata con nome "View_lists_result_int"
    5. Adesso vai in MsAccess ed esegui la procedura per creare il collegamento alle tabelle e dall'elenco delle tabelle selezionare la tua nuova vista di nome "View_lists_result_int", come vedrai viene tratta come se fosse una tabella.
    6. Quando viene richiesto selezionare come chiave primaria la colonna id

    .
    Fatto, adesso verifica se ti restituisce #Eliminato oppure se è tutto OK

    Ovviamente la tratterai come una qualsiasi tabella collegata... e se non ci sono particolari join e/o altro dovrebbe essere possibile anche aggiornare i dati... da verificare.

  • Re: Problema collegamento Access su SQL

    29/04/2025 - max.riservo ha scritto:

    Se non devi aggiornare direi che il campo rowversion non ti serve : concentrati sul bigint (credo che Access non sia in grado di gestire un campo così grande - ma va verificato in funzione della versione di Access (2013/2016 ...) , di 32/64 bit (di Access) e del driver ODBC).

    Esatto Max ... bigint 64bit e int 32bit ... MsAccess esegue il mapping con il 32 , cioè di tipo int. Presumo proprio che sia questo il problema legato alla questione #Eliminato.

    Non ho la possibilità adesso di ricreare questo tipo di problema, ma come abbiamo sospettato deve essere questa la limitazione.

  • Re: Problema collegamento Access su SQL

    Innazitutto vorrei ringraziare entrambi.

    Ho questa idea però:

    Siccome i DB sono 2 (credo uno sia il master e l'altro, quello chiamato (FGWmsERP) è quello creato per essere letto scritto dall'erp, potrei chiedere al fornitore del db se, posso cambiare il tipo id  (dubito alquanto credo vada cambiato in entrambi i DB, al riguardo ho appena aperto la segnalazione vediamo se mi chiamano oggi)

    Per quanto riguarda la procedura di Franco, intendi questo per il punto 2?

  • Re: Problema collegamento Access su SQL

    Ciao,

    Se adotti la Vista (View) non devi modificare le strutture attuali delle tabelle del database, questo è un vantaggio

    Per creare una View

    1. aprire SSMS
    2. andare sul database e sulla tabella che interessa e fare Click Destro
      1. Selezionare per esempio: SELECT To - New Query Editor Windows
      2. Nell'editor elimina la Select e inserisci il comando CREATE VIEW:
      3. al termine dell'inserimento premere il button "Excute" ... in questo modo, se non ci sono errori, viene creata la nuova VIEW
      4. per visualizzare la VIEW appena creata, eseguire un Refresh e aprire il ramo Views :

    .
    Fatto ... adesso andare in MsAccess e Collegare la View appena creata.
    La troveremo nell'elenco delle tabelle da collegare e si può trattare come una qualsiasi tabella.

    Nell'esempio sopra ho eseguito il processo su un mio database e tabella... tu lo farai sul tuo database e sulla tua tabella.
    Possono essere inclusi nella View anche le solo colonne che interessano e non necessariamente tutte.

    Se si apre in struttura la View creata, si possono aggiungere e togliere le colonne che si desiderano.

  • Re: Problema collegamento Access su SQL

    Grazie Infinite.......(bellissimo il copia incolla in questo forum di una comodità incredibile)

  • Re: Problema collegamento Access su SQL

    30/04/2025 - Fabio76 ha scritto:

    Grazie Infinite.......

    Prego... 

    ma quindi ..... adesso funziona come desideravi ?

  • Re: Problema collegamento Access su SQL

    Attenzione !!!

    Per validare il tutto, ricordati di eseguire una verifica se l'attuale "id" di tipo bigint supera il limite massimo di un tipo int

    Esempio:

    SELECT id
    FROM lists_result
    WHERE id > 2147483647
    

    .
    Quindi se supera i 2 miliardi, allora devi escogitare un altro sistema

    Però è Normale e/o Standard usare il tipo int per le PrimaryKey... ma non si sa mai... per sicurezza una verifica la farei.  ;-)

  • Re: Problema collegamento Access su SQL

    Sì, nel post sopra ho incollato la vista della tabella creata con la tua guida, la nuova tabella collegata ad access ed il risultato del doppio click sulla tabella viewLISTS_RESULT che visualizza correttamente tutti i record, presumo quindi che facendo una query di selezione  ora funzioni tutto e possa interrogare facilmente i record.

    Non capisco il significato ultima query: se non superasse il test, il programma che scrive il file tiene in pancia e poi inizia ad eliminare i record dopo tre mesi, presumo quindi di non superare i 2 miliardi di record.

    Appena torno al lavoro lunedì provo.

  • Re: Problema collegamento Access su SQL

    30/04/2025 - Fabio76 ha scritto:

    Sì, nel post sopra ho incollato la vista della tabella creata con la tua guida, la nuova tabella collegata ad access ed il risultato del doppio click sulla tabella viewLISTS_RESULT che visualizza correttamente tutti i record, presumo quindi che facendo una query di selezione  ora funzioni tutto e possa interrogare facilmente i record.

    Bene bene bene... allora possiamo confermare che il problema era effettivamente dato dal tipo bigint

    dove MsAccess non va oltre i 32bit e quindi il massimo che può trattare sarà il tipo int 

    30/04/2025 - Fabio76 ha scritto:

    Non capisco il significato ultima query: se non superasse il test, il programma che scrive il file tiene in pancia e poi inizia ad eliminare i record dopo tre mesi, presumo quindi di non superare i 2 miliardi di record.

    Capisco... mi spiego... non è detto che tu abbia raggiunto e superato i 2 miliardi di records, magari adesso ne hai qualche centinaio, migliaio o milioni.

    Ma essendo una chiave univoca di tipo contatore incrementale, può essere che sia cresciuto tanto nel tempo per le semplici azioni di inserisci ed elimina records.

    Poniamo che tu abbia 1 milione di records, ma il contatore della PrimaryKey è arrivato a 3 miliardi a forza di inserire e cancellare i records.

    In questo caso convertire il bigint in int non andrà bene perchè il tipo int arriva a poco più di 2 miliardi. 
    C'è anche da dire che in molti casi non si arriva a queste cifre... però è sempre meglio saperlo e controllare. 

    Per esempio poniamo che la tua tabella contenga l'anagrafica della popolazione mondiale.
    In questo caso il tipo int non potrà essere utilizzato e si dovrà impostare il tipo bigint per definire una chiave univoca di tipo contatore. ;-)

  • Re: Problema collegamento Access su SQL

    Salve,

    30/04/2025 - Fabio76 ha scritto:

    Non capisco il significato ultima query: se non superasse il test, il programma che scrive il file tiene in pancia e poi inizia ad eliminare i record dopo tre mesi, presumo quindi di non superare i 2 miliardi di record.

    aggiungo, a quanto gia' correttamente indicato da Franco, che il fatto di "cancellare" righe all'interno della tabella non ti porta alcun beneficio (in questo senso)... il "tipo contatore incrementale" e', come da definizione, "sempre incrementale", ed avere "buchi liberi" non ne comporta il riutilizzo... per questo, arrivando ad esempio all'ultimo ID inserito = 2.000.000.000 e poi cancellando anche la totalita' delle righe, il prossimo inserimento avra' ID =  2.000.000.001  e non semplicemente 1.

    In SQL Server e' possibile effettuare un reseed della proprieta' identity, ma bisogna starci attenti per non creare ulteriori problemi di valori duplicati... la proprieta' identity, infatti, non impone un vincolo di univocita', laddove la chiave primaria che hai imposto sulla colonna invece lo fa...
    quindi, supponendo di avere ad esempio delle data islands nella tabella:

    10.000 <> 201.999  poi 500.000 <> 500.999, con il tuo ultimo ID arivato a 600.000..
    effettui il reseed della colonna ID a 9.9999..... il prossimo ID che verra' proposto da SQL Server sara' 10.000... ma tu hai gia' una riga con quella chiave... quindi verra' sollevato un'eccezione di violazione di chiave primaria... 
    il successivo ID che verra' proposto da SQL Server sara' quindi 10.001, ma anche questo sollevera' la medesima eccezione, e questo fino a raggiungere la fine della data island, che sara' al valore di 202.000, dove avrai slot liberi fino a 499.999...

    salutoni romagnoli
    -- 
    Andrea

  • Re: Problema collegamento Access su SQL

    30/04/2025 - By65Franco ha scritto:

    Attenzione !!!

    Per validare il tutto, ricordati di eseguire una verifica se l'attuale "id" di tipo bigint supera il limite massimo di un tipo int

    Esempio:

    SELECT id
    FROM lists_result
    WHERE id > 2147483647
    

    .
    Quindi se supera i 2 miliardi, allora devi escogitare un altro sistema

    Però è Normale e/o Standard usare il tipo int per le PrimaryKey... ma non si sa mai... per sicurezza una verifica la farei.  ;-)

    Scusa, ma se attualmente il campo id è a 3000 record circa il risultato della query sopra è nullo.

    Se ho capito bene, il problema è che access non gestisce il campo begint, quindi se un giorno nella tabella creata nelle viste di sql, mi si presenta il problema nuovamente che non visualizzo i record perchè superiori ai 2 miliardi, sono fregato.

    Magari nel frattempo però access gestirà il campo? :)

  • Re: Problema collegamento Access su SQL

    06/05/2025 - Fabio76 ha scritto:

    Magari nel frattempo però access gestirà il campo? :)

    Aspetta....

    non solo devi tenere in cosiderazione i records attualmente presenti nella Tabella

    Un conto sono i records attuali e un altro conto è il numeratore ID chiave primaria 

    Per esempio :

    Puoi avere 10 records nella tabella

    e l'ID chiave primaria si è incrementata fino a oltre 2 miliardi 

    Allora in questo caso inizierai ad avere il problema.

    .

    Dovresti verifcare in Opzioni Access se hai questi valori da spuntare :

    Se hai questa opzione e se funziona, allora non dovrai crearti una vista con la conversione da BigInt a Int... in tal caso non devi fare nulla...

    Ti basterà spuntare l'opzione e sarai a posto (se funziona... io non ho mai avuto necessità di provarla)

  • Re: Problema collegamento Access su SQL

    Cazzarola, attivato ora senza collegare la tabella della vista, ma quella "originale" con il campo id =bigint

    Ed al doppio click

    Poco male, ho imparato a farmi generare, in caso di necessità, una vista di una tabella sul server sql

  • Re: Problema collegamento Access su SQL

    06/05/2025 - Fabio76 ha scritto:

    Cazzarola, attivato ora senza collegare la tabella della vista, ma quella "originale" con il campo id =bigint

    Perfettooooo !!! 

    come vedi con un pò di studio, riflessione e ricerche, alla fine se esiste una soluzione la si trova sempre.

    06/05/2025 - Fabio76 ha scritto:

    ho imparato a farmi generare, in caso di necessità, una vista di una tabella sul server sql

    ehhhh si.... le Views sono semplici e potenti soprattutto se devi o convertire dei valori o per collegarsi alle solo colonne che interessano, etc.... 
    Se per esempio per una Tabella con 50 colonne ho necessità di lavorare solo con 5 colonne, costruirsi una View solo con le 5 colonne migliora tantissimo le performance, l'uso della memoria, etc... , e poi tutto il lavoro, in questo caso, viene demandato al motore di Sql Server che è molto più prestante....un pò come  avviene conl'uso delle Stored Procedure.

Devi accedere o registrarti per scrivere nel forum
29 risposte