Aggiungere un record ricopiandolo da uno esistente dentro una tabella ...

lunedì 28 luglio 2014 - 11.36
Tag Elenco Tags  VB.NET  |  SQL Server Express

alimuzzy Profilo | Newbie

Un saluto a tutti,
premetto che ho due tabelle relazionate, ho scritto una query in cui devo aggiungere un nuovo record sulla tabella padre ricopiandoli da quelli esistenti compresi quelli in relazione con la tabella figlio.


1086x574 206Kb


ho fatto due query una per la tabella padre, ed un altra per la tabella figlio.

Questa e la query per la tabella figlio che non va:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

es.: tabella padre(fattura) alla fattura n°2 corrispondono n°2 descrizioni con la query sopra mi ricopia le due descrizioni sempre in corrispondenza della fattura n°2 avendo in questo modo 4 descrizioni sulla fattura 2
il mio scopo e riopiare le due descrizioni in una nuova fattura.
Spero di essere stato chiaro

Grazie
Massimo


boccia75 Profilo | Junior Member

Ciao Massimo,
scrivi le righe presenti nelle due tabelle (almeno quelle relative alla fattura 2 di cui parli) ed il risultato che vuoi ottenere.
Ciao.

alimuzzy Profilo | Newbie

Ciao boccia,
grazie per la risposta, sotto ho inserito le due tabelle e l'associazione e tra la colonna Num della tabella fattura e la colonna Idnum della tabella descrizione, per cui ad ogni num possono corrispondono diversi idnum
In questo caso la colonna Num = 2 della tabella fattura è associata alla colona IDNum = 2 della tabella descrizione che riporta sabbia e sabbione.


984x195 61Kb



534x225 30Kb


la mia intenzione e quella di aggiungere una nuova fattura, in questo caso la Num=6, ricopiando tutti i dati dal record Num=2 della tabella fattura e i record IDNum=2 della tabella Descrizione.

Grazie

boccia75 Profilo | Junior Member

Ok, ma il record finale come deve essere?
Dalla tabella principale otteniamo
6 IMPRESA A IMPRESA B SASSARIVIA VENDITA 2014/07/20
ma dalla tabella figlio ottengo 2 righe.
Quali informazioni vuoi inserire?
Le qta si possono sommare, ma quali dei 2 testi vorresti inserire?
sabbia oppure sabbione?
E poi , nel caso in cui nel campo um ci fossero 2 valori differenti (in questo caso c'è solamente m3), quali dei due vorresti inserire?
il problema è tutto lì.
Potrei (semplicemente/stupidamente) dirti di prendere il max dei due campi però non so se è quello che vuoi ottenere.
Ciao.

alimuzzy Profilo | Newbie

Boccia,
perdonami se non riesco a descrivere bene la mia richiesta, il risultato finale e quello di
ottenere solo le due righe la riga sabbia e la riga sabbione nella tabella descrizione con idnum = 6 tutto qui, senza nessuna somma. Il max l'ho inserito per dire al database di copiare le due righe dalla posizione idnum = 2 alla posizione con idnum = 6 della tabella descrizione.
i risultato delle immagini sotto sono stati filtrati alla sesta fattura, quindi alla fattura 6 sono associati i due record della tabella descrizione con idnum = 6
tutto qui.

La query proposta nel primo post è stata realizzata con la inner join che serve per prendere la riga da copiare e metterla in quella nuova quindi la 6.


783x122 28Kb



544x155 21Kb


Di nuovo grazie


boccia75 Profilo | Junior Member

Ciao,
prova con questa query:

insert ........
SELECT (select max(Fattura.idNum) + 1 from Fattura) AS IDNum, Descrizione.Testo, Descrizione.Um, Descrizione.Qta
FROM Descrizione INNER JOIN
Fattura ON Descrizione.IDNum = Fattura.idNum
WHERE (Fattura.idNum = @p1)
GROUP BY Descrizione.Qta, Descrizione.Um, Descrizione.Testo

In questo modo otterrai le 2 righe con il numero di fattura uguale al numero max+1 reperito dalla tabella fatture : il +1 lo fai se non hai ancora inserito la nuova fattura nella tabella Fatture, altrimenti ti basta solamente il max.
Spero di averti aiutato.
Ciao!

alimuzzy Profilo | Newbie

Boccia,
in effetti avevo fatto un tentativo di questo genere ma mi genera l'errore riportato dall'immagine sotto


1185x684 459Kb


Ciao..

boccia75 Profilo | Junior Member

Non so proprio cosa dirti.
Se provo a lanciare la query che ti ho postato dal management studio non ricevo nessun errore....e la query funziona correttamente.
Ma l'ultima query che hai postato non è quella che hai provato ad utilizzare, vero?
In quella query vedo che:
hai dato un alias alla tabella Descrizione chiamandola Descrizione_1, tuttavia per alcuni campi richiami la Descrizione_1 per il campo qta la Descrizione
inserisci in descrizione il campo Quantità ma nella query richiami il campo qta
Questa query non dovrebbe girare.
Come ti ho detto sopra, se lancio la query che ti ho postato, gira e non genera nessun messaggio di errore.
Ciao.

alimuzzy Profilo | Newbie

Ti allego il file del database Sql server compact e l'immagine dell'applicazione di sql server managment con cui ho effettuato le prove.


1090x600 375Kb


ho modificato un po la query perche ad esempio sulla tabella descrizione non c'è la colonna qta lo stesso sulla tabella fattura, la colonna idnum in realtà e la Num.
il select lo punti sulla tabella fattura, ma in realtà i record interessati dalla select devono essere quelli della tabella descrizione.

Ciao..

boccia75 Profilo | Junior Member

Non so che dirti , la stessa query lanciata su un motore 2008 R2 lavora correttamente , non vorrei fossero limiti della versione compact (ma sto tirando a caso)
Prova a dichiarare una variabile per reperire il numero massimo della fattura ed utilizzare quella in fase di insert.
quindi

DECLARE @NUMFATT DECIMAL(10,0) (il tipo dato deve essere quello dell'Idnum)

SET @NUMFATT=(select max(Fattura.idNum) + 1 from Fattura)

e poi la
INSERT...........
SELECT @NUMFATT AS IDNum, Descrizione.Testo, Descrizione.Um, Descrizione.Qta
FROM Descrizione INNER JOIN
Fattura ON Descrizione.IDNum = Fattura.idNum
WHERE (Fattura.idNum = @p1)
GROUP BY Descrizione.Qta, Descrizione.Um, Descrizione.Testo

Prova così.
Ciao.

alimuzzy Profilo | Newbie

come da immagine sotto riscontro cmq l'errore in questo caso sul declare. Penso sia dovuto ad una incompatibilità del server compact. Proverò a fare i test direttamente sul motore server 2008R2, se non dovessi riscontrare errori dovro cercare un alternativa al compact.
Ti farò sapere a test avvenuto

1173x658 459Kb

Grazie

alimuzzy Profilo | Newbie

Ciao Boccia,
dopo aver installato sql server 2008r2 e testando la tua query in effetti funziona tutto.

INSERT INTO Descrizione
SELECT (SELECT MAX(IDNum) +1 AS MaxIDNum
FROM Descrizione AS descrizione_1) AS IDNum, descrizione_1.Testo, descrizione_1.Um, descrizione_1.Quantità
FROM Descrizione AS descrizione_1 INNER JOIN
Fattura ON descrizione_1.IDNum = Fattura.Num
WHERE (Fattura.Num = @p1)

Questa query con il database Server compact edition non funziona, a meno che non lo adopero in altro modo. fino ad ora ho usato la configurazione guidata e il generatore di query.
Diversamente, faro una verifica inserendo la query da codice ..

A presto

boccia75 Profilo | Junior Member

Ciao.
se è tutto a posto metti il thread come Risolto.
Ciao.

alimuzzy Profilo | Newbie

sto testando una soluzione con il server compact edition, se riesco posto il risultato del test, sto anche testando una soluzione con access.
Spero di avere al piu presto una risposta cosi da poterla postare e chiudere il thread

Grazie
Ciao..
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5