Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

[ACCESS] Query di cancellazione su tabella collegata SQL SERVER 2008 EXPRESS

  1. #1
    toma83 non  in linea Novello
    Ciao a tutti.

    devo eseguire degli update da un DB Access ad un db SQL SERVER 2008 EXPRESS in maniera periodica.
    Quindi mi stato consigliato di crearmi un db Access d'appoggio collerci all'interno le tabelle dei due DB e poi eseguire le query.
    Fin tanto che devo eseguire le query di accodamento tutto a posto....
    Il problema avviene per su una tabella.
    Infatti questa tabella bisogna prima svuotarla e poi fare l'accodamento.
    Ho provato a fare una query di cancellazione ma mi esce:
    Impossibile eliminare dalle tabelle specificate. (Errore 3086)
    
    In pratica devo eseguire una query di cancellazione su una tabella presente su SQL SERVER 2008 e poi fargli l'accodamento da dati presenti su DB Access...
    Qualcuno sa spiegarmi come risolvere il problema?

  2. #2
    L'avatar di nman
    nman non  in linea Topo di biblioteca
    Quote Originariamente inviato da toma83 Visualizza il messaggio
    Il problema avviene per su una tabella.
    Infatti questa tabella bisogna prima svuotarla e poi fare l'accodamento.
    Il problema lo hai solo su 1 tabella ?

    Quale il motivo per cui devi prima svuotarla e poi fare l'accodamento ?



    Se ho capito bene invece di fare:
    ___ INSERT dei soli record nuovi
    ___ DELETE dei soli record eliminati
    ___ UPDATE dei soli record modificati

    Tu vorresti fare
    ___ DELETE massivo di tutti i record
    ___ INSERT massivo di tutti i record


    Quanti record ha la tabella ?

    se sono molti record
    le query diventano piu pesanti da eseguire
    Vengono frammentati gli indici di SQLServer ( e questo da evitare )


    ___________

    Tutto quanto esposto sopra per dirti che anche se non ho ben chiaro
    il problema cercherei delle strade alternative allo
    svuotamento e ripopolamento periodico di una tabella

    __________________________________________________ _________________




    Quote Originariamente inviato da toma83 Visualizza il messaggio
    Ho provato a fare una query di cancellazione ma mi esce:
    Impossibile eliminare dalle tabelle specificate. (Errore 3086)
    
    Tu hai fatto una DELETE sulla tabella collegata a SQLServer Giusto ?

    Ma se vai sulla tabella in oggetto,
    selezioni un record
    e premi il tasto "Canc" cosa succede ?


    ______

    Ci sono forse delle relazioni nel DB SQLServer fra questa tabella
    e altre tabelle ?

    __________________________________________________ ______________



  3. #3
    toma83 non  in linea Novello
    Ciao grazie mille per l'aiuto. Allora:
    Quote Originariamente inviato da nman Visualizza il messaggio
    Il problema lo hai solo su 1 tabella ?

    Quale il motivo per cui devi prima svuotarla e poi fare l'accodamento ?

    .......

    Quanti record ha la tabella ?

    se sono molti record
    le query diventano piu pesanti da eseguire
    Vengono frammentati gli indici di SQLServer ( e questo da evitare )
    Devo svuotare la tabella per poi ripopolarla perch i record hanno come campo univoco TAGID. MA questo tagid pu modificarsi cambiano completamente l'informazione che porta. Se prima si riferiva a Tizio dopo potrebbe riferirsi a Caio. Quindi non possibile per me fare un aggiornamento perch vorrebbe dire dover fargli fare tutte le volte controlli su tutti i record... in questo momento sono circa 47000 in aumento...
    Per quanto riguarda gli indici al momento non sono ancora stati creati. Anche perch al momento eseguire query solo utilizzando sql ci impiega relativamente poco rispetta ad access.
    Quote Originariamente inviato da nman Visualizza il messaggio
    Tutto quanto esposto sopra per dirti che anche se non ho ben chiaro
    il problema cercherei delle strade alternative allo
    svuotamento e ripopolamento periodico di una tabella
    Se vi una soluzione migliore sarei pi felice anche io. Anche a me non piace questo genere di soluzione. Ma al momento non riesco a trovarne altre.

    Quote Originariamente inviato da nman Visualizza il messaggio
    Tu hai fatto una DELETE sulla tabella collegata a SQLServer Giusto ?

    Ma se vai sulla tabella in oggetto,
    selezioni un record
    e premi il tasto "Canc" cosa succede ?
    Effettivamente non ci avevo pensato... Non mi permette di cancellare i record. E come faccio ora?

    Quote Originariamente inviato da nman Visualizza il messaggio
    Ci sono forse delle relazioni nel DB SQLServer fra questa tabella
    e altre tabelle ?
    Relazioni preimpostate no... Vi sono delle viste che uso per leggere i dati... e le viste sono create da campi tra pi tabelle. E' un problema?

    Grazie mille!

  4. #4
    toma83 non  in linea Novello
    Anzi, tutte le tabelle collegate da SQL SERVER non mi permettono di eseguire cancellazioni... E ora come faccio?

  5. #5
    L'avatar di nman
    nman non  in linea Topo di biblioteca
    Quote Originariamente inviato da toma83 Visualizza il messaggio
    Anzi, tutte le tabelle collegate da SQL SERVER non mi permettono di eseguire cancellazioni...
    E ora come faccio?
    Niente paura,
    Il motivo lo hai gia detto sopra
    "Al momento non hai ancora creato nessun indice in SQLServer"
    Pertanto tutte le tabelle collegate sono
    rigorosamente in sola lettura
    __________________________________________________ ________________


    Quote Originariamente inviato da toma83 Visualizza il messaggio
    Devo svuotare la tabella per poi ripopolarla
    perch i record hanno come campo univoco TAGID.

    MA questo tagid pu modificarsi cambiano completamente
    l'informazione che porta.

    Se prima si riferiva a Tizio dopo potrebbe riferirsi a Caio.

    Quindi non possibile per me fare un aggiornamento perch
    vorrebbe dire dover fargli fare tutte le volte controlli su tutti i record...

    in questo momento sono circa 47000 in aumento...
    Un campo univoco che cambia di valore che va poi a
    riferirsi a Caio invece che Tizio anomalo

    Ma non voglio mettere in discussione la progettazione del DB


    PUOI fare comunque la query di UPDATE
    ___ metti in join su TAGID
    ___ poi verifichi tuti i campi
    _____ se tuti uguali Ok
    _____ se solo 1 diverso fa UPDATE


    Questa soluzione anche se piu laboriosa come programmazione
    e certamente piu facile da eseguire per i DB interessati

    significa che 47.000 record invece di cancellarli e ricopiarli
    vengono semplicemente controllati

    __________________________________________________ __________________

    Quote Originariamente inviato da toma83 Visualizza il messaggio
    Relazioni preimpostate no...
    Vi sono delle viste che uso per leggere i dati...
    e le viste sono create da campi tra pi tabelle.
    E' un problema?
    Non un problema

    __________________________________________________ ________________
    __________________________________________________ ________________
    __________________________________________________ ________________


    Secondo me devi:

    In SQLServer mettere un campo chiave che
    rispecchi quanto hai in Access

    Pero se in Access hai un campo chiave contatore
    autoincrementale in SQLServer rendilo
    Campo chiave Numerico NON Autoincrementale






    Poi fatti un po di pratica solo con una sola coppia
    di tabelle (magari usa quella un po strana )
    e se sei in difficolta facci delle domande piu mirate

    __________________________________________________ ____________


    Un dubbio,
    Per connetterti a SQLServer usi una origine dati ODBC ?



    Saluti

  6. #6
    toma83 non  in linea Novello
    Quote Originariamente inviato da nman Visualizza il messaggio

    Un campo univoco che cambia di valore che va poi a
    riferirsi a Caio invece che Tizio anomalo

    Ma non voglio mettere in discussione la progettazione del DB
    Mi sono spiegato male.
    Ti spiego come funziona la filosofia di questa tabella in ACCESS... Non creata da me ma ereditata e che non posso assolutamente toccare nella struttura e nei contenuti.

    In pratica siamo in una lavanderia. Ad ogni indumento viene applicato un chip questo chip ha un identificativo che appunto TAGID. Ora quando il cliente abbandona la lavanderia viene staccato il chip e applicato ad un nuovo indumento con i nuovi dati. Quindi all'interno della tabella quel chip univoco ma pu essere utilizzato per altri indumenti.

    Quote Originariamente inviato da nman Visualizza il messaggio
    PUOI fare comunque la query di UPDATE
    ___ metti in join su TAGID
    ___ poi verifichi tuti i campi
    _____ se tuti uguali Ok
    _____ se solo 1 diverso fa UPDATE


    Questa soluzione anche se piu laboriosa come programmazione
    e certamente piu facile da eseguire per i DB interessati

    significa che 47.000 record invece di cancellarli e ricopiarli
    vengono semplicemente controllati
    Non ho capito... Dovrei fare una cosa tipo:

    UPDATE tableSqlServer INNER JOIN tableAccess ON tableSqlServer.TagId = TableAccess.TagId
    SET
    tableSqlServer.NomeCampo1 = tableAccess.NomeCampo1
    tableSqlServer.NomeCampo2 = tableAccess.NomeCampo2
    tableSqlServer.NomeCampo3 = tableAccess.NomeCampo3
    tableSqlServer.NomeCampo4 = tableAccess.NomeCampo4
    WHERE
    tableSqlServer.NomeCampo1 != tableAccess.NomeCampo1 AND
    tableSqlServer.NomeCampo2 != tableAccess.NomeCampo2 AND
    tableSqlServer.NomeCampo3 != tableAccess.NomeCampo3 AND
    tableSqlServer.NomeCampo4 != tableAccess.NomeCampo4
    Ma oltre a verificare che qualche tag sia differente devo poi aggiungere quelli nuovi.
    Quindi dovrei fare due query. Giusto.

    Solo che ho provato a fare una query di accodamento...
    INSERT INTO dbo_TAGID00F ( ACTIVE, CMPNUM, CLIEID, TAGID0, MECL00, INSDAT, TAGDE0, WASH00, WASH01, COLO00, COMP00, STAT00 )
    SELECT TAGID00F.ACTIVE, TAGID00F.CMPNUM, TAGID00F.CLIEID, TAGID00F.TAGID0, TAGID00F.MECL00, TAGID00F.INSDAT, TAGID00F.TAGDE0, TAGID00F.WASH00, TAGID00F.WASH01, TAGID00F.COLO00, TAGID00F.COMP00, TAGID00F.STAT00
    FROM TAGID00F
    WHERE (((TAGID00F.TAGID0) Not In (SELECT [dbo_TAGID00F].[TAGID0] FROM [dbo_TAGID00F])));
    Dopo 20 minuti ho dedotto che c'era qualcosa che non andava visto che non aveva restituito nessun risultato rimanendo in loop....

    Quote Originariamente inviato da nman Visualizza il messaggio
    Secondo me devi:

    In SQLServer mettere un campo chiave che
    rispecchi quanto hai in Access

    Pero se in Access hai un campo chiave contatore
    autoincrementale in SQLServer rendilo
    Campo chiave Numerico NON Autoincrementale

    .....
    Un dubbio,
    Per connetterti a SQLServer usi una origine dati ODBC ?
    Partiamo dall'ultima domanda: S utilizzo un collegamento ODBC

    Access, purtroppo, non lo posso toccare....

    Grazie mille.
    Ultima modifica di toma83; 14-06-2012 13:43 

  7. #7
    L'avatar di nman
    nman non  in linea Topo di biblioteca
    Caspita Una lavanderia con 47.000 "TagId"
    deve essere bella grossa.


    Anni fa ho costruito dalle parti di Cremona una lavanderia
    per un Istituto Ospedaliero


    La sola lavatrice di marca Milnor era lunga 25 mt e alta 4

    arrivata apposta dagli Stati Uniti di America

    __________________________________________________ __________________


    a parte la divagazione se le cose stanno cosi giusto che
    il TagId sia strutturato in quel modo.

    __________________________________________________ __________________



    Hai centrato il principio della query di UPDATE
    ma devi fargli 4 perfezionamenti:

    1) Nella clausola WHERE hai usato And invece di Or
    perche tu vuoi i record che
    __ O su un campo
    __ O sullaltro campo
    __ O sullaltro ancora sono diversi

    2) Ancora nella WHERE devi usare la funzione Nz
    Leggiti la guida in linea in alto a Dx ( cerca nz )

    3) Ancora nella WHERE hai usato il carattere " != "
    per significare diverso,
    In Access devi usare " <> "

    4) Non hai usato la " , " per separare fra di loro i campi nella SET


    alla fine la query di UPDATE viene cosi:
    UPDATE 
      tableSqlServer 
    INNER JOIN 
      tableAccess 
    ON 
      tableSqlServer.TagId = tableAccess.TagId 
    SET 
      tableSqlServer.NomeCampo1 = tableAccess.NomeCampo1, 
      tableSqlServer.NomeCampo2 = tableAccess.NomeCampo2, 
      tableSqlServer.NomeCampo3 = tableAccess.NomeCampo3, 
      tableSqlServer.NomeCampo4 = tableAccess.NomeCampo4 
    WHERE 
      ( 
        (Nz(tableSqlServer.NomeCampo1,0)) <> (Nz(tableAccess.NomeCampo1,0)) 
      Or 
        (Nz(tableSqlServer.NomeCampo2,0)) <> (Nz(tableAccess.NomeCampo2,0)) 
      Or 
        (Nz(tableSqlServer.NomeCampo3,0)) <> (Nz(tableAccess.NomeCampo3,0)) 
      Or 
        (Nz(tableSqlServer.NomeCampo4,0)) <> (Nz(tableAccess.NomeCampo4,0)) 
      ) 
    ;
    

    __________________________________________________ _______________________

    la query di DELETE invece questa:
    DELETE 
      tableSqlServer.TagId
    FROM 
      tableSqlServer
    WHERE 
      tableSqlServer.TagId 
    IN 
      (SELECT tableSqlServer.TagId FROM tableAccess RIGHT JOIN tableSqlServer ON tableAccess.TagId = tableSqlServer.TagId WHERE (((tableAccess.TagId) Is Null)))
    ;
    

    __________________________________________________ __________________________


    Per la INSERT che ci hai proposto io eviterei di inserire tutti i campi.
    Ti basta inserire il campo chiave ( TagId ) dopo quando esegui
    la UPDATE gli altri campi vengono automaticamente aggiornati

    Questo ci semplifica la vita


    la INSERT potrebbe essere:
    INSERT INTO 
      tableSqlServer 
        ( TagId )
    SELECT 
      tableAccess.TagId AS TagId
    FROM 
      tableAccess 
    LEFT JOIN 
      tableSqlServer 
    ON 
      tableAccess.TagId=tableSqlServer.TagId
    WHERE 
      (((tableSqlServer.TagId) Is Null))
    ;
    
    __________________________________________________ __________________________

    ho esitato prima di rispondere

    Spero di non avere troppo infranto il regolamento che
    "disapprova" di passare le soluzioni finite.

    ma del resto questa una Demo, tu la devi ancora adattare alle tue tabelle.

    e comunque ci hai passato qualche bel pezzo di codice scritto da te

    Io comunque ho cercato di essere chiaro e di spiegare dove
    ho visto delle lacune

    __ Con questo non voglio assolutamente mettermi sul piedistallo
    __ io ho moltissimo da imparare

    __________________________________________________ _____________________





    Ti manca una Macro o routine che per ogni coppia di tabelle:
    ___ disabilita i messaggi di sistema per eliminare la fastidiosa conferma
    ___ lancia la DELETE
    ___ lancia la INSERT
    ___ lancia la UPDATE
    ___ ricordati di RIabilitare i messaggi di sistema

    NB: UPDATE deve essere l'ultima della tripletta




    Facci sapere




    MI CORREGGO La query di UPDATE va perfezionata,

    Il problema sta in:
    ___ (Nz(tableSqlServer.NomeCampo3,0)) <> (Nz(tableAccess.NomeCampo3,0))

    se da una parte c' scritto 0 e dall'altra parte c' scritto Nulla
    la query non rileva la differenza e non aggiorna.

    Quindi
    ___ se i campi sono a compilazione obbligatoria puoi omettere il Nz
    ___ se i campi sono numerici puoi scrivere per esempio
    (Nz(tableSqlServer.NomeCampo3,"x")) <> (Nz(tableAccess.NomeCampo3,"x"))
    ___ se i campi sono formato testo(10) puoi scrivere per esempio
    (Nz(tableSqlServer.NomeCampo3,"xxxxxxxxxxx")) <> (Nz(tableAccess.NomeCampo3,"xxxxxxxxxxx"))

    Il principio che il valore che la query ti inserisce se il campo Nullo
    non deve poter essere dall'altra parte

    In questo momento non ho altre idee
    Ultima modifica di nman; 14-06-2012 22:54 

  8. #8
    toma83 non  in linea Novello
    Purtroppo ritorno sempre al punto di partenza... appena provo a fare il delete mi esce
    Impossibile eliminare dalle tabelle specificate. (Errore 3086)
    Stavolta per l'indice l'ho creato.
    Naturalmente ne ho creato uno che conteneva solo il TAGID. E' l'unico dato univoco su tutta la tabella

  9. #9
    L'avatar di nman
    nman non  in linea Topo di biblioteca
    Hai creato l'indice bene,

    Il collegamento hai detto che ODBC e va bene.

    __________________________________________________ _


    Ma nella applicazione di Access la tabelle la avevi collegata
    quando eri senza indice.


    Quindi devi aggiornare i collegamenti delle tabelle.


    __ clik Dx sulla tabella collegata
    in fondo c' " gestione tabelle collegate "
    selezioni la tua tabella ( meglio tutto )
    OK


    se non basta allora elimina la tabella collegata e la ricrei




    se ancora non basta significa che devi modificare l'indice
    e trasformarlo in PrimaryKey



    Saluti
    Ultima modifica di nman; 15-06-2012 13:25 

  10. #10
    toma83 non  in linea Novello
    Effettivamente.... Adesso funziona il delete!
    Adesso per controllo il discorso dell'update e insert into perch al momento non hanno intenzione di eseguire la query. Si bloccano come se ci fosse un loop... Mah vedr meglio.
    GRAZI MILLE DI TUTTO INTANTO!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 2
    Ultimo Post: 28-04-2014, 11:43
  2. Risposte: 4
    Ultimo Post: 23-10-2012, 14:30
  3. [VB2010 Express] Collegare DB SQl server 2008 a VB, si pu?
    Da e.manfredi nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 15-02-2012, 13:11
  4. Risolto: Non si installa SQL SERVER 2008 EXPRESS R2
    Da sistemista nel forum Microsoft Windows
    Risposte: 8
    Ultimo Post: 16-09-2011, 16:59
  5. [MsSQL]Istanze SQL server 2008 express.
    Da guil nel forum Microsoft SQL Server
    Risposte: 1
    Ultimo Post: 08-03-2010, 13:59