Numerazione tuple tabella

di il
3 risposte

Numerazione tuple tabella

Buongiorno, non riesco in nessun modo a risolvere il problema che cercherò di descrivere e non trovo esempi simili nel forum.

Ho un programma che lavora su una serie di tabelle in un database. Mancando alcune funzioni di interfaccia con il gestionale aziendale (che lavora su un altro database) ho deciso di creare delle sql per copiare i dati da un db all'altro.

Devo effettuare un import su una tabella che ha in prima colonna ID e chiave primaria. Siccome ho bisogno che mi prenda in automatico il numero di tupla, ho impostato Identity su (1,1) nelle proprietà, ma facendo questo il programma non lavora più bene, nel senso che quando provo ad inserire valori, tramite apposita funzione, nella stessa tabella mi viene restituito l'errore "Cannot insert explicit value for Identity column in table 'nome_tabella' when IDENTITY_INSERT is set to OFF'. Questo errore mi sembra sia preso direttamente da sql e ricopiato nella finestra del programma. Non posso in nessun modo modificare il programma stesso.

Allora sposto su NO "specifica Identity" e la funzione torna a viaggiare senza errori.

Ora però provo ad inserire i valori in tabella via sql;

CODICE ESEMPIO

INSERT INTO nome_tabella(A,B,C)
SELECT X,Y,Z
FROM tabella_origine
trascurando la prima colonna ID. Mi viene restituito ovviamente l'errore "Cannot insert the value NULL into column 'ID'; column does not allow nulls. INSERT fails." Come posso fare ad inserire i record con una numerazione sequenziale a seguire dall'ultimo record inserito?
Grazie per un gentile aiuto

3 Risposte

  • Re: Numerazione tuple tabella

    Copiare i dati???
    E' la peggior scelta che tu possa fare, ed infatti hai già iniziato ad avere problemi.
    Poi, lo stesso problema si ripresente per avere i dati aggiornati...

    Vi sono alcune alternative, le migliori sono:
    1 - usare una vista
    2 - collegare l'altro database come 'server collegato'
  • Re: Numerazione tuple tabella

    Concordo certamente con te ma sono obbligato a fare questa scelta.
    Ho due programmi gestionali; quello principale con codici movimenti fatture ordini di produzione e quant'altro e una specie di gestionale per la gestione della produzione. I due gestionali non dialogano tra loro e alcune operazioni nel gestionale produzione è previsto che vengono effettuate manualmente richiedendo troppo tempo e rendendo inutilizzabile il gestionale prod. stesso. Per ovviare a ciò ho deciso di compilare la tabella con query prendendo i dati (che esistono!) dal gestionale principale e riversandoli nella maniera corretta (impostando formati corretti etc etc etc) nella tabella esistente del gestionale produzione.
    Il tutto funziona facendolo via query, ma questo mi disattiva la funzione da programma che volevo tenere comunque attiva per comodità. Non potendo agire sul codice del programma gestionale produzione in modo da fargli accettare la tabella anche con Identity su (1,1) (come sarebbe naturale impostare, secondo me) devo agire lato query, dando un numero a ID che sia progressivo e unico. Il file contiene normalmente già dei record, io devo aggiungerne con insert facendogli prendere un ID corretto e diverso da Null.
    Spero di essere riuscito a spiegarmi chiaramente.
    Idee o suggerimenti?
  • Re: Numerazione tuple tabella

    Ovvio che i due gestionali non dialoghino tra loro.
    Ma i database? Quelli sì che possono dialogare.
    Sono entrambi su SQL Server? O comunque sono entrambi due database 'server', per intenderci no db come SQLite, Access e vari.

    Se entrambi i db sono sullo stesso SQL Server, è semplicissimo accedere ad entrambi contemporaneamente.
    Se invece sono su SQL Server diversi, basta creare un 'linked server'.

    Tanto per farti un esempio l'ultimo lavoro che ho fatto in azienda:
    il nostro gestionale espone a video un tabulato di tutte le scadenze di pagamento (partite aperte); tra l'altro il responsabile mi ha detto che occorrono alcune ore per visualizzare tutto).
    Ma, ovviamente, gli utenti che gestiscono hanno bisogno di elaborarsi tali dati, fare annotazioni, calcoli, ed altre varie operazioni.
    Cosa facevano? Esportazione del tabulato su Excel, poi aggiungevano le colonne mancanti, e giù a scrivere le proprie informazioni.
    Tale foglio veniva passato tra utenti dei vari reparti in modo che ogni utente scrivesse le proprie informazioni.
    Se andava bene, tale processo impiegava 2/3 giorni, prima che il file Excel fosse completato. Il mese successivo, si ripartiva da zero perché logicamente la situazione patrimoniale mutava continuamente.
    Il responsabile mi ha chiesto quindi se potevo creare un 'qualcosa' che permettesse agli utenti non solo di snellire questa procedura, ma anche di non dover ogni mese rifare tutto il lavoro da capo.

    Adesso gli ho fatto un programma in cui:
    1) una query estrapola gli stessi dati dal database del gestionale in tempo reale
    2) li mette in JOIN con una tabella creata 'ad hoc' nel ns. database, che contiene tutti i campi che servono agli utenti per i loro scopi
    3) in tali campi possono, ovviamente, registrare tutte le informazioni che vogliono, filtrarle per cliente, nazione, periodo, ecc.
    4) morale: in 3 secondi ottengono i dati, costantemente aggiornati, senza dover rifare tutto ogni mese!
    Chiaramente, il tutto in rete LAN multi-utenza, con accesso ai soli utenti abilitati.
    10 secondi al posto di 2 giorni.

    Questo è il sistema più semplice da gestire.
    In caso contrario, diventa un bagno di sangue mantenere sincronizzati i dati sulle tabelle dei due database.
    Riflettici su...
Devi accedere o registrarti per scrivere nel forum
3 risposte