Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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:
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
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 il 24/05/2012 alle 22:58
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
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" ?
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..
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:
&"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:
Codice sorgente - presumibilmente VB.NET
PrivateFunction id()AsInteger
Dim Sql AsString="SELECT MAX(id) FROM fattura"
connection =New OleDbConnection(stringaconn)
If connection.State= ConnectionState.ClosedThen
connection.Open()
EndIf
DimcommandAsNew OleDbCommand(Sql, connection)
Dim nid AsObject=command.ExecuteScalar()
Try
command.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
Finally
If connection.State= ConnectionState.OpenThen
connection.Close()
EndIf
EndTry
Return Convert.ToInt32(nid)+ 1
EndFunction
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