Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Istruzione sql per inserire record in due tabelle relazionate
Forum - C# / VB.NET - Istruzione sql per inserire record in due tabelle relazionate

Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 23:54
Martedì, 22/05/2012
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:
Codice sorgente - presumibilmente VB.NET

  1. Try
  2.  
  3.                 Dim numero As Integer = NumeroDocumento()
  4.                 Dim descrizione As Integer = NunDescrizione()
  5.                 Dim Sql, Sql1 As String
  6.  
  7.                 Sql = "INSERT INTO FATTURA (Num, Mittente, Destinatario, Luogo, Causale, Data)" _
  8.  & "select (" & numero & ") as num, mittente, destinatario, luogo, causale, data from fattura where fattura.num= " & Form1.NumeroCombo.Text
  9.                
  10.                 Sql1 = "insert into descrizione (idnum, testo, um, quantità)" _
  11.                    & " select (" & descrizione & ") as idnum, testo, um, quantità from fattura inner join descrizione on fattura.id = descrizione.idnum where fattura.num = " & Form1.NumeroCombo.Text
  12.  
  13.                 connection.Open()
  14.  
  15.                 Dim command As New OleDbCommand(Sql, connection)
  16.                 Dim command1 As New OleDbCommand(sql1, connection)
  17.                 transizione = connection.BeginTransaction
  18.  
  19.  
  20.                 command.Transaction = transizione
  21.                 command.ExecuteNonQuery()
  22.  
  23.                 command1.Transaction = transizione
  24.                 command1.ExecuteNonQuery()
  25.  
  26.  
  27.                 transizione.Commit()
  28.  
  29.             Catch ex As Exception
  30.                 If Not transizione Is Nothing Then
  31.                     transizione.Rollback()
  32.                     Form1.NumeroCombo.Text = NumeroDocumento() - 1
  33.                 End If
  34.                 MessageBox.Show(ex.Message.ToString())
  35.             Finally
  36.                 If connection.State = ConnectionState.Open Then
  37.                     connection.Close()
  38.                 End If
  39.             End Try
  40.         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 il 23/05/2012 alle 9:40
PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 13:18
Giovedì, 24/05/2012
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

PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 22:55
Giovedì, 24/05/2012
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:
Codice sorgente - presumibilmente C# / VB.NET

  1. Sql1 = "INSERT INTO Descrizione (idnum, testo, um, quantità)" _
  2.                    & " 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 il 24/05/2012 alle 22:58
PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 8:53
Venerdì, 25/05/2012
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 ;)

PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 12:06
Venerdì, 25/05/2012
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" ?

PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 15:14
Venerdì, 25/05/2012
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..



alimuzzy ha allegato un file: Immagine.png (108126 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da alimuzzy il 25/05/2012 alle 15:17
PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 11:37
Sabato, 26/05/2012
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:

Codice sorgente - presumibilmente VB.NET

  1. Sql = "INSERT INTO Fattura (id, Num, Mittente, Destinatario, Luogo, Causale, Data)" _
  2.  & "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
  3.                
  4.                 Sql1 = "INSERT INTO Descrizione (idnum, testo, um, quantità)" _
  5.                    & " 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:

Codice sorgente - presumibilmente VB.NET

  1. Private Function id() As Integer
  2.  
  3.         Dim Sql As String = "SELECT MAX(id) FROM fattura"
  4.  
  5.         connection = New OleDbConnection(stringaconn)
  6.         If connection.State = ConnectionState.Closed Then
  7.             connection.Open()
  8.         End If
  9.  
  10.         Dim command As New OleDbCommand(Sql, connection)
  11.         Dim nid As Object = command.ExecuteScalar()
  12.  
  13.         Try
  14.             command.ExecuteNonQuery()
  15.         Catch ex As Exception
  16.             MessageBox.Show(ex.Message.ToString())
  17.         Finally
  18.             If connection.State = ConnectionState.Open Then
  19.                 connection.Close()
  20.             End If
  21.  
  22.         End Try
  23.  
  24.         Return Convert.ToInt32(nid) + 1
  25.  
  26.     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 il 26/05/2012 alle 11:41
PM Quote