Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [SQL SERVER] Maledetto update

    Cerco di spiegarmi e così potete dirmi tu dove è l'errore e come correggerlo perchè ci sto andando al manicomio.
    Io ho 2 tabelle DOCMAST E DOCDETT così strutturate:

    DOCMAST.codcliente è una chiave
    DOCMAST.numerodoc è una chiave
    e poi ci sono gli altri campi

    DOCDETT.codcliente è una chiave
    DOCDETT.numerodoc è una chiave
    DOCDETT.contarighe è una chiave
    e poi ci sono gli altri campi

    le tabelle sono collegate tra loro così: DOCMAST.codcliente = DOCDETT.codcliente , DOCMAST.numerodoc = DOCDETT.numerodoc
    quindi credo che per un record di DOCMAST ci possono essere molti record di DOCDETT , quindi uno a molti.

    Io devo effettuare un UPDATE contemporaneo su queste 2 tabelle apparentemente facile:
    Ovvero devo aggiornare i campi numerodoc e statodoc su DOCMAST (un record solo)
    e devo aggiornare il solo campo numerodoc su DOCDETT (n possibili record)

    Devo aggiornare solo i campi numerodoc e statodoc (non sto a spiegarti il motivo) che sono uguali a 0 e a T rispettivamente, quindi aggiorno quando trovo numerodoc=0 e statodoc=T

    quindi l'ho scritta così....

    codice:
    qry = "begin transaction" & vbcrlf
    qry = qry & " UPDATE dbo.DOC_MAST "
    qry = qry & " SET DONUMDOC = " + replace(pratica,"'","''") + " , DOSTATO = '" + replace(stato,"'","''") + "' " & vbcrlf
    qry = qry & " WHERE DONUMDOC = " + replace(praticatemp,"'","''") + " AND DOSTATO = '" + replace(statotemp,"'","''") + "' AND DOCODCLI = " + replace(codcli,"'","''") + " " & vbcrlf
    qry = qry & "if @@error <> 0 begin rollback RETURN end" & vbcrlf
    	
    qry = qry & " UPDATE dbo.DOC_DETT "
    qry = qry & " SET DONUMDOC = " + replace(pratica,"'","''") + " " & vbcrlf
    qry = qry & " WHERE DONUMDOC = " + replace(praticatemp,"'","''") + " AND DOCODCLI = " + replace(codcli,"'","''") + " " & vbcrlf
    qry = qry & "if @@error <> 0 begin rollback RETURN end" & vbcrlf
    	
    qry = qry & "COMMIT TRANSACTION" & vbcrlf
    on error resume next
    set objRs = objcon.Execute(qry)
    considerate per esempio che STATO vale G, PRATICA vale 26, PRATICATEMP vale 0, STATOTEMP = T e CODCLI vale 1.

    Su DOCMAST quando trovi un record che ha 0 come praticatemp, T come statotemp e 1 come numero cliente -> allora cambia lo stato da T a G e il numero da 0 a 26 (e ce ne sarà 1 solo di record così)
    Su DOCDETT invece quando trovi un record che ha 0 come praticatemp e 1 come numero cliente -> allora cambia il numero da 0 a 26 (e ce ne possono essere n così)

    Purtroppo non c'è verso di farla girare.
    Ho controllato tutti i campi e i riferimenti e i tipi di campo sono corretti.
    Ho provato a stampare la stringa e mi dà questo:
    begin transaction UPDATE dbo.DOC_MAST SET DONUMDOC = 26 , DOSTATO = 'G' WHERE DONUMDOC = 0 AND DOSTATO = 'T' AND DOCODCLI = 1 if @@error <> 0 begin rollback RETURN end UPDATE dbo.DOC_DETT SET DONUMDOC = 26 WHERE DONUMDOC = 0 AND DOCODCLI = 1 if @@error <> 0 begin rollback RETURN end COMMIT TRANSACTION

    Ho provato ad aggiornare le tabelle una per volta e mi dà questo errore per esempio se provo ad aggiornare solo DOCMAST (viceversa per doc dett)
    Microsoft OLE DB Provider for SQL Server error '80040e2f'
    L'istruzione UPDATE ha generato un conflitto con il vincolo TABLE REFERENCE 'FK_DOC_DETT_1' nel database 'RimorInService', tabella 'DOC_DETT'.

    Che cosa può essere?????
    Aiutooooooo!!!

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Com'è impostata la chiave

    FK_DOC_DETT_1

    ?

    Non è che stai cercando di modificare una chiave primaria?
    Hai detto che DOCMAST.numerodoc è una chiave...
    DOCMAST.numerodoc corrisponde per caso a DONUMDOC ?


    A parte questo, mi chiedo come mai usi ancora Replace(), quando invece sarebbe più semplice, comodo ed efficiente usare Command e Parametri...

    Che linguaggio usi: VB6 ?
    Se sì ti consiglio questo articolo sull'argomento (ma ne trovi a pacchi sul web).

    ADO, Parametri ed affini
    http://nuke.vbcorner.net/Articoli/VB...5/Default.aspx


  3. #3
    E' che sono di molto ignorante in materia.......

    sto programmando nel vecchio ASP e in VBasic ma non so che versione sinceramente......

    Cosa è esattamente Command e Parametri ??

    ciao e grazie

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Basta che leggi l'articolo.
    Non è un concetto che si spiega in poche righe.

  5. #5
    Originariamente inviato da gibra
    Com'è impostata la chiave

    FK_DOC_DETT_1 ?

    Non è che stai cercando di modificare una chiave primaria?
    Hai detto che DOCMAST.numerodoc è una chiave...
    DOCMAST.numerodoc corrisponde per caso a DONUMDOC ?

    Purtroppo non ho accesso al database per poter verificare che tipo di relazione è FK_DOC_DETT_1
    So che è una chiave DOCMAST.DONUMDOC ma non so se è primaria o meno.
    Se fosse primaria non posso fare l'UPDATE vero??
    Però su quella chiave ci faccio una INSERT senza problemi se fosse utile per capire la cosa.
    Potrei fare una INSERT su una chiave primaria??
    Ho notato inoltre che invertendo l'ordine degli UPDATE qualcosa accade....
    Cioè se io nella mia query metto prima DOC_DETT e poi DOC_MAST ho notato che fino a che non c'è niente da aggiornare su DOC_DETT l'update funziona e mi aggiorna DOC_MAST non appena c'è qualcosa da aggiornare su DOC_DETT scatta il problema e non aggiorna nulla.

    Apparte il discorso dei replace la sintassi credo sia corretta quindi deve essere qualche tipo di relazione sul database credo......
    So disperato sigh........

  6. #6
    Vedo che purtroppo nessuno può aiutarmi ma almeno potete rispondere a questa mia semplice domanda da direi ignorante?
    Mettiamo che ho un database con 4 campi
    id -> numerico
    codicecliente -> numerico
    numerodocumento -> numerico
    tipodocumento -> testuale

    mettiamo che dentro a questo DB ci sono 4 record così divisi:

    1
    100
    0
    S

    2
    100
    0
    S

    3
    200
    10
    M

    4
    100
    0
    S

    La mia domanda è questa; io voglio fare una UPDATE di tutti i campi che hanno come codicecliente il 100 e come numerodocumento lo 0, e cambiare lo 0 in 1 e il tipo documento da quello che è a G ..... se faccio una update così ottengo 3 record da cambiare.
    La mia domanda è: posso cambiarli tutti insieme con un colpo solo scrivendo una cosa del genere?
    UPDATE tab set numerodocumento = 1 , tipodocumento = G WHERE numerodocumento = 0 AND codicecliente = 100
    oppure devo fare una specie di ciclo per avere ogni volta un solo ed unico record da aggiornare?

  7. #7
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,522
    Originariamente inviato da marcopaolo79
    La mia domanda è: posso cambiarli tutti insieme con un colpo solo scrivendo una cosa del genere?
    UPDATE tab set numerodocumento = 1 , tipodocumento = G WHERE numerodocumento = 0 AND codicecliente = 100
    Si

    Originariamente inviato da marcopaolo79
    oppure devo fare una specie di ciclo per avere ogni volta un solo ed unico record da aggiornare?
    No

  8. #8
    Perfetto grazie comas17....

    Appurato questo e quindi capito che il problema non dipende da questo mi chiedo:

    posso fare un update su un campo che uso anche nella condizione WHERE ?

    cioè io cerco per il campo numerodocumento, e poi aggiorno proprio questo campo...


    codice:
    SET numerodocumento = 1 .... WHERE numerodocumento = 0
    potrebbe essere questo l'errore o è una cosa che si può fare?

    grazie...

  9. #9
    Io credo che il problema sia dato da una probabile FOREIGN KEY.
    Ecco perchè mi dà l'errore....

    Ho guardato in giro ed ho notato come si possono disattivare temporaneamente queste foreign key.....

    io pensavo di disattivare le foreign key....

    fare l'update.......

    e riattivarle....

    mi confermate che il codice da usare è questo?

    codice:
    -- Disable all table constraints 
    ALTER TABLE MyTable NOCHECK CONSTRAINT ALL 
    -- Enable all table constraints 
    ALTER TABLE MyTable CHECK CONSTRAINT ALL

  10. #10
    Dopo varie prove e controprove credo di aver capito tutto.
    Siccome c'è una FOREIGN KEY e un vincolo referenziale con valori primari io NON posso fare una update singola per ogni tabella ma devo per forza fare tutto in un'unica UPDATE.

    Mi hanno detto di fare una update con una join incorporata.

    Le mie due tabelle sono DOCMAST e DOCDETT
    e i campi per le quali sono unite sono NUMDOC e CODCLI
    io devo aggiornare 2 campi; il campo STATO presente solo su DOCMAST e sopratutto il campo NUMDOC presente sia su DOCMAST che su DOCDETT (quindi devo aggiornare il campo contemporaneamente su tutte e due le tabelle).
    Che rispettano una determinata condizione WHERE.
    La relazione tra DOCMAST e DOCDETT è uno a molti.

    Io ho scritto così ma ci deve essere qualche errore:

    codice:
    qry = qry & " UPDATE dbo.DOC_MAST INNER JOIN dbo.DOC_DETT ON dbo.DOC_MAST.NUMDOC = dbo.DOC_DETT.NUMDOC AND dbo.DOC_MAST.CODCLI = dbo.DOC_DETT.CODCLI "
    qry = qry & " SET dbo.DOC_MAST.NUMDOC = " + request.form(pratica) + " , dbo.DOC_MAST.STATO = '" + request.form(stato) + "' , dbo.DOC_MAST.CODCLI = " + request.form(codcli) + " " & vbcrlf
    qry = qry & " WHERE dbo.DOC_MAST.NUMDOC = " + request.form(praticaold) + " AND dbo.DOC_MAST.CODCLI = " + request.form(codcli) + "  AND dbo.DOC_MAST.STATO = '" + request.form(statoold) + "' " & vbcrlf
    qry = qry & "if @@error <> 0 begin rollback RETURN end" & vbcrlf
    ho provato a fare la query diciamo relativa a questo update ovvero questa e funziona:

    codice:
    SELECT dbo.DOC_MAST.CODCLI, dbo.DOC_MAST.NUMDOC, dbo.DOC_MAST.STATO FROM dbo.DOC_MAST INNER JOIN dbo.DOC_DETT ON dbo.DOC_MAST.NUMDOC = dbo.DOC_DETT.NUMDOC AND dbo.DOC_MAST.CODCLI = dbo.DOC_DETT.CODCLI WHERE dbo.DOC_MAST.CODCLI = ? AND dbo.DOC_MAST.NUMDOC = ? AND dbo.DOC_MAST.STATO = ?"
    però l'aggiornamento non va...... dai che ci sono vicino datemi una mano pleaseeee!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.