Oppure

Loading
22/05/12 21:54
alimuzzy
Un saluto a tutti.. ho un problema nell'inserire in due tabelle relazionate dei record gia esistenti nelle tabelle.
La prima tabella si chiama fattura la seconda descrizione e sono collegate con la relazione uno a molti.
sulla tabella fattura c'è il campo num che distingue le varie fatture registrate e altri campi che registrano il destinatario il mittente e cosi via e nella tabella descrizione ci sono i campi che descrivono i gli elementi della fattura (descrizione, unità di misura e quantità;).
La mia applicazione deve avere anche la possibilità di ricopiare gli elementi di una fattura in una nuova fattura con il num progressivo ad esempio la fattura num 5 la devo copiare con tutti i suoi campi nella fattura 6.
L'applicazione e in visual net e il database e in access.
le istruzioni che ho compilato sono le seguenti:

Try

                Dim numero As Integer = NumeroDocumento()
                Dim descrizione As Integer = NunDescrizione()
                Dim Sql, Sql1 As String

                Sql = "INSERT INTO FATTURA (Num, Mittente, Destinatario, Luogo, Causale, Data)" _
 & "select (" & numero & ") as num, mittente, destinatario, luogo, causale, data from fattura where fattura.num= " & Form1.NumeroCombo.Text
               
                Sql1 = "insert into descrizione (idnum, testo, um, quantità)" _
                   & " select (" & descrizione & ") as idnum, testo, um, quantità from fattura inner join descrizione on fattura.id = descrizione.idnum where fattura.num = " & Form1.NumeroCombo.Text

                connection.Open()

                Dim command As New OleDbCommand(Sql, connection)
                Dim command1 As New OleDbCommand(sql1, connection)
                transizione = connection.BeginTransaction


                command.Transaction = transizione
                command.ExecuteNonQuery()

                command1.Transaction = transizione
                command1.ExecuteNonQuery()


                transizione.Commit()

            Catch ex As Exception
                If Not transizione Is Nothing Then
                    transizione.Rollback()
                    Form1.NumeroCombo.Text = NumeroDocumento() - 1
                End If
                MessageBox.Show(ex.Message.ToString())
            Finally
                If connection.State = ConnectionState.Open Then
                    connection.Close()
                End If
            End Try
        Next num


le seguenti mi danno errore con la digitura:< Impossibile aggiungere o modificare i record. Nella tabella fattura è necessario un record correlato.>

Sul form per inserire i dati nella tabella fattura ho dei campi testo e una datagridview per la tabella descrizione.

dove sbaglio? Un consiglio e bene accetto grazie

Ultima modifica effettuata da alimuzzy 23/05/12 7:40
aaa
24/05/12 11:18
ampeg
ti da l'errore anche senza usare le transazioni ?

io userei sempre lo stesso oggetto command per eseguire entrambi gli inserimenti, cambiando ovviamente la proprietà CommandText
aaa
24/05/12 20:55
alimuzzy
Ciao ampeg grazie per la risposta, cmq si ho provato anche senza l'utilizzo della transizione ma il risultato non cambia.
Ho provato ha cambiare la seconda query in questo modo:

Sql1 = "INSERT INTO Descrizione (idnum, testo, um, quantità)" _
                   & " select descrizione.idnum, descrizione.testo, descrizione.um, descrizione.quantità from descrizione inner join fattura on descrizione.idnum = fattura.id where fattura.num= " & Form1.NumeroCombo.Text



cioe al campo idnum non aggiungo 1.
Il risultato dopo la modifica e che nella tabella fattuta mi inserisce i dati voluti, cioe copia quelli esistenti della fatt num 4 in una nuova fattura es. la num 5, mentre con la seconda query i record li copia sulla stessa fattura cioe num 4 cosi mi ritrovo nella fattura num 4 il materiale esistente in precedenza piu la copia.
Come faccio a fare una query che mi copia i campi della tabella descrizione nella nuova fattura? :-|:-|:-|
Grazie
Ultima modifica effettuata da alimuzzy 24/05/12 20:58
aaa
25/05/12 6:53
ampeg
generalmente per operazioni così semplici preferisco fare da codice anziché usare le select nidificate

ovvero immetto i dati di origine in un datatable o li recupero con un datareader e poi li inserisco nella tabella di destinazione, il tutto all'interno della stessa transazione per garantire la coerenza

in questo modo ho tutto sotto controllo e zero sorprese, ma è solo come farei io, ognuno poi fa come preferisce ;)
aaa
25/05/12 10:06
ampeg
scusa ma la join della seconda query non dovrebbe essere tra "descrizione.idnum = fattura.num" ?
perché lo fai tra "descrizione.idnum = fattura.id" cos'è il campo "fattura.id" ?
aaa
25/05/12 13:14
alimuzzy
Ti allego un'immagine del dataset, la relazione e tra l'id della tabella fattura e idnum della tabella descrizione, tra l'altro essendo tutto tipizzato avevo provato con il generare una query di inserimento ma essendo ancora un novello non ci sono riuscito.
Il tuo consiglio lo prenderò in considerazione, penso sia anche la soluzione migliore ma, essendo arrivato molto vicino, volevo sbattere la testa un altro po prima di cambiare tutto..

Ultima modifica effettuata da alimuzzy 25/05/12 13:17
aaa
26/05/12 9:37
alimuzzy
Premetto che la foreign Key della tabella descrizione doveva chiamarsi idFattura e non idnum cmq, alla fine ho risolto inserendo nella prima istruzione sql, il campo id che tramite una funzione mi restituisce l'ultimo id sommato di 1, quindi:


Sql = "INSERT INTO Fattura (id, Num, Mittente, Destinatario, Luogo, Causale, Data)" _
 & "select (" & id() & ") as id, (" & NumeroDocumento() & ") as num, fattura.mittente, fattura.destinatario, fattura.luogo, fattura.causale, fattura.data from fattura where fattura.num= " & Form1.NumeroCombo.Text
               
                Sql1 = "INSERT INTO Descrizione (idnum, testo, um, quantità)" _
                   & " select (" & descrizione & ") as idnum, descrizione.testo, descrizione.um, descrizione.quantità from descrizione inner join fattura on descrizione.idnum = fattura.id where fattura.num= " & Form1.NumeroCombo.Text



la funzione che mi restituisce gli ultimi vlori inseriti sommati di 1 e la seguente:


 Private Function id() As Integer

        Dim Sql As String = "SELECT MAX(id) FROM fattura"

        connection = New OleDbConnection(stringaconn)
        If connection.State = ConnectionState.Closed Then
            connection.Open()
        End If

        Dim command As New OleDbCommand(Sql, connection)
        Dim nid As Object = command.ExecuteScalar()

        Try
            command.ExecuteNonQuery()
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        Finally
            If connection.State = ConnectionState.Open Then
                connection.Close()
            End If

        End Try

        Return Convert.ToInt32(nid) + 1

    End Function



con tre di queste funzioni ottengo gli ultimi valori sommati di 1, sia dell'Id fattura, sia del campo num fattura che del idnum (foreignKey) della tabella descrizione.

Ripeto il tutto mi serviva per aggiungere 1 o piu ddt copiando da un ddt esistente selezionato dall'elenco dei ddt letta sulla combobox.

Probabilmente se avessi seguito il consiglio di ampeg il tutto sarebbe stato piu corretto e penso piu veloce.
Ultima modifica effettuata da alimuzzy 26/05/12 9:41
aaa