Aprire un secondo form con un campo codice uguale al primo form

lunedì 15 novembre 2010 - 22.39
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows XP  |  Visual Studio 2008  |  SQL Server 2005  |  Office 2010  |  Internet explorer 8.0  |  Crystal Reports XI

Zagor60 Profilo | Junior Member

Ho un form principale e un secondario, come faccio ad aprire il secondo form con lo stesso "codice" del primo, cioè se il campo codice nel primo form è uguale a "mela" il secondo form deve aprirmi con tutti in campi compilati con lo stesso codice " mela" , i due form hanno due tabelle di database diverse ma con il campo "mela" uguale. Inoltre chiedo come costruire una query per esempio Select * from tabella WHERE tabella1.campo=tabella2.Campo.
Ringrazio

darkeric Profilo | Senior Member

se vuoi puoi recuperare tutti i valori degli oggetti degli altri form
es. me.textbox2.text = form1.textbox1.text
a quel punto costruisci la query e filtri utilizzando quel valore come parametro.

per la query non so se posso esserti utile perchè io di solito uso gli oggetti integrati al Dataset
come Datatable e Tableadapter
quindi le query me le creo da li

se usi questo metodo pure tu
puoi andare in Dataset Design e aggiungere una query al tableadapter della tabella
ti aiuterà la procedura guidata.


Zagor60 Profilo | Junior Member

Grazie per la procedura, la seguente prodecura mi dà sempre errore nella query, la domanda è questa: nella clausola WHERE come faccio a far leggere il secondo campo . Per es. alla clausola WHERE VALUTA=(quà che codice devo inserire per essere uguale al textbox2.text)?
Grazie

darkeric Profilo | Senior Member

Mi par di capire che le query le scrivi da codice

nel caso

la querystring deve essere una stringa quindi

querystring = "Select * from tabellaX Where Valuta = ' " + textbox1.text + " ' "

se usi invece la query builder del tableadapter devi utilizzare i parametri.

Zagor60 Profilo | Junior Member

Ciao scusa per il disturbo,
esatto creo la query da codice che per la ricerca in una combobox funziona perfettamente anche perchè non c'era la clausola WHERE:
io imposto il seguente codice:
txtIDdipendente.Text = "10"
txtcognome.Text = "tizio"
Dim dstdati As DataSet
Dim adpdati As SqlDataAdapter
Dim cmddati As SqlCommand
cmddati = New SqlCommand()
cmddati.Connection = SqlHelper.ConnessioneDatabase
cmddati.CommandText = "SELECT iddipendente, cognome FROM tabdipendenti WHERE iddipemdente= ' " + txtIDdipendente.Text + " 'AND ' " + txtcognome.Text + " '"
adpdati = New SqlDataAdapter(cmddati)
dstdati = New DataSet
adpdati.Fill(dstdati, "tabdipendenti")
'cmbdati.DataSource = dstdati.Tables(0)
Dove sto sbagliando?
preciso che quest query devi aprirmi un campo determinato dall'iddipendente e cognome scelto ed in pù mi deve compilare anche i rimanenti campi es. nome , data di nascita ecc.
Grazie

darkeric Profilo | Senior Member

txtIDdipendente.Text = "10"
txtcognome.Text = "tizio"
Dim dstdati As DataSet
Dim adpdati As SqlDataAdapter
Dim cmddati As SqlCommand
cmddati = New SqlCommand()
cmddati.Connection = SqlHelper.ConnessioneDatabase
cmddati.CommandText = "SELECT iddipendente, cognome FROM tabdipendenti WHERE iddipemdente= ' " + txtIDdipendente.Text + _
" ' AND cognome = ' " + txtcognome.Text + " '"
adpdati = New SqlDataAdapter(cmddati)
dstdati = New DataSet
adpdati.Fill(dstdati, "tabdipendenti")
'cmbdati.DataSource = dstdati.Tables(0)
il campo iddipendente è stringa o numerico?
se è stringa mi pare corretta
se è numerico devi togliere gli ' (apici) prima e dopo txtIDdipendente.text

Zagor60 Profilo | Junior Member

ciao,
niente non funziona, cioè non filtra i dati, se tolgo la clausola Where allora si che funziona.
Inoltre nel caso funzionasse, come faccio a caricare gli altri dati?, lesempio precedente vale solo per la combobox, se devo riempire hli altri campi, dove devo sosituire " 'cmbdati.DataSource = dstdati.Tables(0)" ?
Grazie

darkeric Profilo | Senior Member

hai provato a filtrare solo con l ID ?

Zagor60 Profilo | Junior Member

ricapitoliamo:
nel form_load ..
mOperazione = TipoOperazione.Nessuna
mPulisciControlli = New SvuotaControlli
Dati = New Tabella(ConnessioneDatabase, "tabdipendenti")
Dati.NomeCampoModifica = "Modifica"
Dati.Ordinamento = "iddipendente"
Dati.CaricaDati()
VisualizzaDati()
end sub
Private Sub VisualizzaDati()

SvuotaCampi()
Dim riga As DataRow = Nothing
If Not Dati.RigaCorrente(riga) Then
'Nessun record presente nella tabella
PreparaVuoto()
Else
'Inserisco i valori nei controlli
txtIddipendente.Text = riga("iddipendente").ToString

If Not riga("cognome") Is DBNull.Value Then
txtcognome.Text = riga("cognome").ToString
Else
txtcognome.Text = String.Empty
End If
If Not riga("nome") Is DBNull.Value Then
txtnome.Text = riga("nome").ToString
Else
txtnome.Text = String.Empty
End If
......omissis...
end if
end sub
Private Sub CaricaRiga()
Dim riga As DataRow = Nothing

If mOperazione = TipoOperazione.Inserimento Then
riga = Dati.RigaNuova
Else
Dati.RigaCorrente(riga)
End If

riga("iddipendente") = txtIddipendente.Text.Trim
If txtcognome.Text.Trim <> String.Empty Then
riga("cognome") = txtcognome.Text.Trim
Else
riga("cognome") = DBNull.Value
End If
If txtnome.Text.Trim <> String.Empty Then
riga("nome") = txtnome.Text.Trim
Else
riga("nome") = DBNull.Value
End If

....omisiss..
end sub

ribadisco che il codice funziona benissimo è solo per creare il filtro che non funziona neanche con L'id.

darkeric Profilo | Senior Member

Quando dici non funziona, significa che ti segnala errore il debug o che ti recupera 0 righe?

se ti va di fare una prova

aggiungi al progetto un dataset
trascinaci la tabella da esplora server
clicca col dx sul tableadapter e scegli aggiungi query
segui la procedura guidata fino a che troverai il pulsante
"generatore di query"
scrivi la query e prova ad eseguirla da li

cmq secondo me a creare tutto da codice vi complicate inutilmente la vita
Visual Basic mette a disposizione gli oggetti proprio per aiutarci nello sviluppo!

cmq spero tu risolva il problema!




Zagor60 Profilo | Junior Member

Ciao,

mi ritorna zero righe, ma senza errori.
Evito sempre di usare i wizards perchè poi è difficile in caso di modifiche o errori gestire il codice ed il programma.
Provo a fare delle modifiche.
Comunque in caso negativo ho codificato con un pulsante ricerca che mi apre un form con due combobox, un pulsante ed una griglia.
Caricando le due combo mi compila la griglia controllo che sia giusto e premento il button mi apre il record desiderato.

Grazie comunque, perchè mi hai insegnato nella ricerca di un textbox nella query.

Poi ti farò sapere come è andata.

darkeric Profilo | Senior Member

Resto in standby allora, ciao!

Zagor60 Profilo | Junior Member

ciao,
ho questo problema:
come leggere il 1° e l'ultimo record di una tabella considerando che c'è un filtro:
Dim dstdata As DataSet
Dim adpdata As SqlDataAdapter
Dim cmddata As SqlCommand
txtdipendente.Text = cmbdipendente.Text
cmddata = New SqlCommand()
cmddata.Connection = SqlHelper.ConnessioneDatabase
cmddata.CommandText = "SELECT dipendente,data_inizio,data_fine from tabdipendentiWhere nave='" + txtdipendenti.Text + "'"
adpdata = New SqlDataAdapter(cmddata)
dstdata = New DataSet
adpdata.Fill(dstdata, "tabdipendenti")
dgv.DataSource = dstdata.Tables(0)
dati.movefirst()
Dim riga As DataRow = Nothing
If Not Dati.RigaCorrente(riga) Then
'Nessun record presente nella tabella
PreparaVuoto()
Else

If Not riga("data_inizio") Is DBNull.Value Then
txtdata1.Text = riga("data_inizio").ToString
Else
txtdata1.Text = String.Empty
End If
dati.movelast()

'If Not Dati.RigaCorrente(riga) Then
'Nessun record presente nella tabella
'PreparaVuoto()
If Not riga("data_fine") Is DBNull.Value Then
txtdata2.Text = riga("data_fine").ToString
Else
txtdata2.Text = String.Empty
End If
End If.
mi restituisce solo il le date di un rigo, a me interessa il 1° record e l'ultimo della tabella.
grazie
poi penserò anche al precdente problema

darkeric Profilo | Senior Member

Provo ad aiutarti

quando filtri la tabella la carichi filtrata su un adapter giusto?

l'adapter dovrebbe avere le righe (Rows) indicizzate

quindi per la prima dovresti scegliere l'indice 0 quindi rows(0)
mentre per l'ultima rows(..adapter.rows.count-1)

spero ti sia di aiuto

Zagor60 Profilo | Junior Member

Ciao,

e quindi come dovrei fare?




darkeric Profilo | Senior Member

dipende quale adapter utilizzi

io uso le Datatable e gli passo i dati filtrati

per esempio

dim DT1 as datatable = tabellaTableadapter.Fillby(textbox1.text)

a questo punto la tabella DT1 contiene tutti i dati filtrati

Primorecord = DT1.rows(0).item("la colonna che vuoi")
Ultimorecord = DT1.rows(DT1.rows.count-1).item("la colonna che vuoi")



Zagor60 Profilo | Junior Member

ciao scusa il ritardo ma ero fuori,
niente da fare mi da errore in tabellaTableadapter
Dim DT1 As DataTable = tabellaTableadapter.Fillby(textbox1.text)
credo che sconvolgero il codice e programma perche nn ce ne esco fuori

darkeric Profilo | Senior Member

o usi

Dim DT1 As DataTable = tabellaTableadapter.Fillby(Dataset.tabella, textbox1.text)

oppure usi

Dim DT1 as datatable = tabellatableadapter.Getdata(textbox1.text)

Fabio

Zagor60 Profilo | Junior Member

ciao Fabio,

credo che il problema è che non uso wizard di vb ma faccio tutto da codice , nel programma ho utilizzato dataset e mai datatable e quantomeno tableadapter, mi protresti gentilmente fare un esempio su come utilizzarli?
Grazie

darkeric Profilo | Senior Member

Non è brevissimo ma provo a darti gli input giusti

anzichè creare la connessione da codice

utilizza la finestra esplora Database
se non la visualizzi vai su visualizza e sceglila dall'elenco

premi sul pulsante + e il wizard ti guiderà alla creazione della connessione al DB
una volta fatto questo, Esplora database ti mostretà la struttura ad albero del tuo DB
a quel punto clicca cul menu progetto e scegli aggiungi nuovo elemento
scegli Dataset, e poi aggiungi.

a questo punto si apre lo schema del dataset
non ti resta che trascinare le tabelle che ti interessano dal DB sulla finestra dellla struttura del dataset
così facendo automaticamente ti verranno create le Datatable e i Tableadapter
cliccando col DX sui tableadapter puoi creare delle query con i wizard o meglio ancora col generatore di query cliccabila al 3° passaggio del wizard stesso
è chiaro che da li puoi anche provarle cosi da non generare errori durante l'esecuzione
come potrai notare la query creata ti genera il metodo fill e il metodo getdata (chiaramente li puoi chiamare come vuoi)
il getdata è quello che a me interessa perchè lo utilizzo per passargli dei dati filtrati
che poi aggancio agli oggetti che hanno la proprietà datasource (listbox, datagridview, combobox, etc)

es.

dim tb1 as datatable = tabellatableadapter.getdata(filtro)
combobox1.datasource= tb1
combobox1.displaymember ="nome del campo della tabella o suo indice - rappresenta il testo del campo da visualizzare"
combobox1.valuemember ="nome del campo della tabella o suo indice - rappresenta il valore restituito dalla combo"

in definitiva la tua datatable la devi vedere come una matrice bidimensionale
es.
c = tb1.rows(0).item(1) - in c verrà passato il valore della riga (0) , colonna(1) del datatable

questo per quanto riguarda la lettura dei dati

per la scrittura invece usi le query di update,insert,delete che crei sempre nel tableadapter
scrivendo
es.
tabellatableadapter.insertquery(parametro1,parametro2, etc.)

spero di essere stato chiaro


Zagor60 Profilo | Junior Member

Ciao Darkeric,
Ho risolto facendo cosi:

inserendo una query...... from... where.. order by iddipendente ASC
e
inserendo una seconda query...... from... where.. order by iddipendente DESC

così in tutti e due i casi prelevo il primo campo.
non è molto elegante sul piano della programmabilità però funziona.

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5