Problema inserimento record multipli

venerdì 18 settembre 2009 - 12.40

miomiomio Profilo | Junior Member

salve a tutti con l'aiuto di Speed-X ho realizzato un database per la raccolta delle presenze.
http://www.dotnethell.it/forum/messages.aspx?ThreadID=32322
adesso sto interfacciandolo con il sito della scuola.
la lettura da database l'ho fatta ma l'inserimento mi crea problemi (come sempre...)
ho fatto l'inserimento di un record per volta e funziona.
solo che volevo che nella pagina ci fossero tutti i campi con tutti gli utente di una classe da poter fare in un colpo solo.
allora ho fatto ripetere il recordset per elencare tutti gli alunni di quella classe e funziona.
solo che quando clicco inserisci e quindi il modulo viene inviato ed eseguito il codice di inserimento mi aggiunge tutti i valori nello stesso record separando i valori con le virgole...

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

come mai? come posso far inserire ogni valore dell'alunno in record distinti?
grazie

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

alx_81 Profilo | Guru

>salve a tutti
Ciao

>solo che quando clicco inserisci e quindi il modulo viene inviato
>ed eseguito il codice di inserimento mi aggiunge tutti i valori
>nello stesso record separando i valori con le virgole...
Non è che con il recordset vai a creare campi con lo stesso nome ripetuti? Se sì, una request di questi valori è una stringa concatenata.
Se tu crei N input text con lo stesso nome, ad esempio "pippo", la request("pippo") poi varrà tutti i valori di ogni campo testo separato da una virgola.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

si faccio proprio questo.
ma posso fare una sorta di split prima dell'inserimento e memorizzare i dati in campi distinti?

grazie

alx_81 Profilo | Guru

>ma posso fare una sorta di split prima dell'inserimento e memorizzare i dati in campi distinti?
Sì e puoi pure crearti una stringa di insert multipli
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

potresti illuminarmi?

magari con qualche riga di codice

io intanto provo a vedere su google

alx_81 Profilo | Guru

>potresti illuminarmi?
Basta fare la SPLIT della request del campo:
http://www.w3schools.com/vbscript/func_split.asp

Poi, per ogni elemento, creare una stringa che esegue più insert.
Non è una cosa superveloce da passarti nel forum. Intanto tu fai un ciclo for each che scorre un array di stringhe (in cui metti i nomi dei campi, ad esempio "nome", "cognome").
Per ogni ciclo fai la request, splitti e crei passo passo una stringa con la insert, poi la esegui con un ADODB.Command.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

mi sa che hai troppe stelline caro guru!!!

non riesco a starti dietro!!

l'inserimento lo faccio così
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
di cosa lo faccio il ciclo?

tipo questo che ho trovato?
<% If len(trim(Request.Form("DataPresenza"))) > 0 Then Dim SQLStmt, x SQLStmt = "" for x = 1 to request.form("DataPresenza").count SQLStmt = SQLStmt & "INSERT INTO kek (tone) VALUES('"request.form("DataPresenza")(x) & "';" next conn.execute(SQLStmt) end if %>

non capisco cosa e come devo iterare. scusami e abbi taaanta pazienza!
lo sto facendo per gioco ma mi piacerebbe riuscire a realizzare questa cosa che dubito verrà approvata dalla scuola!
ma ho già imparato molto, ora se riuscissi a raccapezzarmi anche in questo sarebbe veramente tanta roba!

alx_81 Profilo | Guru

>mi sa che hai troppe stelline caro guru!!!
LOL

>non capisco cosa e come devo iterare. scusami e abbi taaanta pazienza!
A monte tu sai quanti sono i campi giusto? Prendiamo un esempio, immagina di avere una form con 3 campi txtNome, 3 txtCognome e 3 txtEta.

Per prima cosa salvi i valori di ogni campo in un array
Dim arrayNomi arrayNomi = Split(Request("txtNome"), ",") Dim arrayCognomi arrayCognomi = Split(Request("txtCognome"), ",") Dim arrayEta arrayEta = Split(Request("txtEta"), ",")

in questo modo ottieni 3 array per comporre la stringa sql. Spero per te che siano campi obbligatori, così potrai sapere che nell'array, in posizione 0 hai il nome, in posizione 1 il cognome e in 2 l'età.
Dovresti così poter facilmente creare la tua insert..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

quindi il mio arrai dovrà essere questo
<% Dim arrayID_Alunno arrayID_Alunno = Split(Request("ID_Alunno"), ",") Dim arrayDataPresenza arrayDataPresenza = Split(Request("DataPresenza"), ",") Dim arrayPresente arrayPresente = Split(Request("Presente"), ",") Dim arrayRitardi arrayRitardi = Split(Request("Ritardi"), ",") Dim arrayaltrecomunic arrayaltrecomunic = Split(Request("altrecomunic"), ",") %>

e la insert la faccio con gli array?

MM_editCmd.CommandText = "INSERT INTO Presenze (ID_Alunno, DataPresenza, Presente, Ritardi, altrecomunic) VALUES (arrayID_Alunno, arrayDataPresenza, arrayPresente, arrayRitardi, arrayaltrecomunic)"

e poi questo arrai dove lo devo mettere? hai visto sopra come è strutturata la pagina, l'array lo metto dopo il form?

grazie

alx_81 Profilo | Guru

>e la insert la faccio con gli array?
No, nell'array hai posizionalmente i valori per ogni insert, sempre che siano tutti inseriti:

arrayID_Alunno(0) --> avrai il valore dell'id alunno per la prima insert
arrayID_Alunno(1) --> avrai il valore dell'id alunno per la seconda insert
...
e così per arrayPresente, arrayRitardi e arrayaltrecomunic
quindi:

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


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

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

per il momento ho sostituito N che avevi messo te con il numero di righe che ho che sono 4.


ma ricevo un errore
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.

alx_81 Profilo | Guru

>ma ricevo un errore
>Multiple-step OLE DB operation generated errors. Check each OLE
>DB status value, if available. No work was done.
La EXECUTE deve essere all'interno del ciclo, un'esecuzione alla volta.


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

ottimo!!!!!
finalmente funziona!!!
e ho anche capito il metodo!!
in effetti l'ho capito solo ora!
array(i) non mi era chiaro!! che ciuo!

un piccolo problema però!
mi inserisce degli spazi nei campi

ad esempio se il form raccoglie gli id
1,5,7,8
nei record trovo (metto asterisco al posto degli spazi per farti capire)

1
*5
*7
*8

come mai?

ho provato così ma ovviamente...non va
Dim arrayID_Alunno, arrayID2_Alunno arrayID_Alunno = Split(Request("ID_Alunno"), ",") replace(arrayID_Alunno, " ", "")


grazie

alx_81 Profilo | Guru

>ottimo!!!!!
>finalmente funziona!!!
>e ho anche capito il metodo!!
>in effetti l'ho capito solo ora!
>array(i) non mi era chiaro!! che ciuo!
>un piccolo problema però!
>mi inserisce degli spazi nei campi
Questo è dovuto dal fatto che la request probabilmente ti torna i valori separati da uno spazio più una virgola. Quindi la split ti mette anche quello spazio se il separatore è la sola virgola. A prescindere da questo, hai un serio problema di tipizzazione. Da come sembra hai tutti campi nvarchar.. Perchè invece non scegli il tipo corretto per ogni campo?
Detto questo, per quello che hai già, prova la funzione TRIM, che elimina gli spazi sia a destra sia a sinistra:
http://www.w3schools.com/vbscript/func_trim.asp
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

ho gia risolto, il metodo funziona ma conviene?
ti incollo il rigirio che ho scelto di fare
dentro al ciclo ho inserito i valori singoli dell'array e l'ho messi in una variabile
poi ho fatto il replace cercando gli spazi e sostituendoli con nulla!
credi mi convenga il trim?
almeno per i campi ritardi e altre comunicazioni comunque di sicuro altrimenti se scrivo parole staccate me le appiccica tutte
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

alx_81 Profilo | Guru

>ho gia risolto, il metodo funziona ma conviene?
Quello che fai rimpiazza anche spazi interni, la trim solo a sinistra e destra..
vedi tu.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

utilizzo il replace per date e id così corregge eventuali errori di inserimento (se mai verrà usato!) e il trim per altro e altrecomunic.

questo è come ho sistemato la pagina.

ma se flaggo la casella per il presente fa l'inserimento e nel database scrive 1

se la deflaggo mi dà errore
Subscript out of range: '3'
alla riga 141 ovvero puntando qui
xi=arrayPresente(i)
xi = replace(xi, " ", "")

perche???


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

sei stato davvero paziente, davvero GURU, davvero un angelo!!!

grazie per tutto il supporto che mi hai dato

alx_81 Profilo | Guru

>Subscript out of range: '3'
Era quello che ti dicevo all'inizio. Se vuoi l'accesso posizionale all'array per utilizzare i valori in esso inseriti devi sempre valorizzarli tutti (per questo dicevo, spero per te che siano obbligatori, altrimenti avresti dovuto studiare qualcosa). Quando non selezioni un check la request non vale nulla. E stavolta non è una semplice gestione.
Puoi:
- fare una select (combobox) che, per suo comportamento standard, con un'opzione almento, vale sempre un valore anche quando la voce è "non cambiata"
- fare in modo che comunque la request torni un valore (e devi trovare un modo per appoggiare un valore in un campo hidden, se la checkbox non è selezionata)
- crearti una matrice un po' più complessa, per fare in modo di segnarti quale campo vale e quale non vale. Ma qui cominciamo a spingerci in un algoritmo un po' lungo

Il problema ti si ripropone non appena avrai dei campi che non riempi.
Considera che forse, la cosa migliore è controllare se non sono valorizzati ed, in tal caso creare dei default in modo che poi la request porta con se i default valorizzati sui campi.

Altrimenti, pensandoci bene, potresti ripensare la logica di creazione delle righe a monte, non chiamando i campi nello stesso modo, ma creando a runtime anche il nome sempre diverso e univoco (ad esempio IDAlunno1, IDAlunno2, ecc..). In questo modo, nell'altra pagina il ciclo è il medesimo, ma poi la request è diretta sui campi, senza un particolare bisogno di split o array. Dall'altra parte fai solo le request di "IDAlunno" & i, posizionalmente, e sai sempre quello che hai. Nel caso in cui il valore non esista, allora metti il default. Eh sì.. credo sia la soluzione migliore, e più agile
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

ok sei stato chiarissimo.

i campi sono tutti obbligatori e quando la checkbox non è selezionata comunque dovrebbe inserire "0" o "no" o "assente"

e allora perche la considera vuota?

inoltre se lascio altro e altrecomunic vuoto fa l'inserimento tranquillamente

cmq sai cosa faccio? ci metto dei menu select con i valori assente presente e seleziono di default il valore presente e faccio aggiungere 1 (0 per assente)

alx_81 Profilo | Guru

>e allora perche la considera vuota?
è il comportamento normale della checkbox, se non la valorizzi non la passa

>inoltre se lascio altro e altrecomunic vuoto fa l'inserimento tranquillamente
perchè probabilmente è un campo di testo e quando non lo valorizzi vale blank, che è comunque un valore valido

>cmq sai cosa faccio? ci metto dei menu select con i valori assente
>presente e seleziono di default il valore presente e faccio aggiungere
>1 (0 per assente)
io seguirei l'ultima strada, ma c'è più lavoro. Con la combobox hai fatto. Ma non è una bellissima soluzione.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

dato che non ho scadenze in effetti converrebbe sperimentare.

ma con un controllo if non c'è modo?

tipo:(dentro al for)
if checkbox1=false then
var=0
else var=1

poi nell'insert invece di inserire l'array inserisco var
MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param3", 202, 1, 255, var) ' adVarWChar

se questo modo non è fattibile allora sperimento quello che mi haiu suggerito

puoi mandarmi anche a quel paese so di stressarti da giorni!
grazie davvero

alx_81 Profilo | Guru

>se questo modo non è fattibile allora sperimento quello che mi haiu suggerito
se non arriva la checkbox, non puoi proprio controllarla. E posizionalmente non puoi sapere se ti è arrivato il valore di chi.

>puoi mandarmi anche a quel paese so di stressarti da giorni! grazie davvero
ma va, se non volessi rispondere smetterei
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5