PDA

View Full Version : [vb] Aiutooooooooooooooo


nsalnet
03-12-2002, 17:25
come posso fare a collegare due DB in modo che entrambi puntino allo stesso record?
vi spiego meglio la situazione, ho un'oggetto data ed un adodc che puntano allo stesso db e alla stessa tabella, con l'adodc controllo una datagrid e con l'oggetto data controllo una serie di textbox e di Checkbox e dei dbcombo, ho provato ad utilizare solo l'adodc per gestire tutto ma pultroppo il dbcombo mi visualizza il contenuto del campo a cui l'ho assegnato ma non mi visualizza i dati contenuti in un secondo archivio che mi servono per permettere la scelta fra i vari elementi (perchè?? non lo capito, anzi se potete dirmelo voi evito di mettere due oggetti per gastire lo stesso db). ora come devo fare per far andare in sincrono i due db? per esempio l'ogetto data punta il quinto record ed andando a vedere la datagrid (che sfrutta l'adodc) ha selezionato il quinto rigo.
non so se mi sono spiegato chiaramente comunque vi chiedo di darmi una mano!!

bsummer
04-12-2002, 09:55
Mmmmm in effetti non ho capito bene :D

Vado ad intuito... quello che vuoi e' visualizzare + campi di una tabella all'interno di una datacombo?

Beh, se e' cosi', scordatelo :D .

Si puo' fare ma non automaticamente, ti devi creare una piccola funzioncina...ma prima di addentrarmi nell'argomento aspetto una tua conferma, in quanto sarebbe inutile che iniziassi a parlare se non e' quello il problema che hai ;)

Bye

nsalnet
04-12-2002, 10:10
hai fatto bene a fermarti dato che il mio problema è di tipo diverso.
innanzitutto grazie per l'interessamento.
io riesco benissimo a far visualizare più RECORD all'interno di una datacombo, e riesco anche a far visualizare come "selezionato" il valore di un campo del record corrente.
ciò è quello che voglio fare ma con un' unica differenza cioè che voglio prelevare i dati non da un'ogetto data (cosa che rieco a fare) ma bensì da un oggetto adodc, (il quale mi è indispensabile per il corretto funzionamento di una datagrid che mi visualizza l'intero db) solo che se utilizzo la stessa procedra che utilizzo quando ho due oggetti data non mi visualizza i vari elementi del secondo record che mi permettono di effettuare la scelta.
Spero di essere stato un pò più chiaro e spero che possa aiutarmi
ciao e grazie

bsummer
04-12-2002, 10:19
Scusami se sono particolarmente duro di comprendonio:D ...se utilizzi il data allora riesci a visualizzare nella datacombo tutti i dati che vuoi, se utilizzi l'adodc no, e vuoi sapere il perche', ho capito bene?

nsalnet
04-12-2002, 11:12
non sei tu che sei duro di comprendoni sono io che non riesco a spiegarmi bene.
comunque il mio quesito è proprio quello perchè non funziona? eppure nell'help dice che dovrebbe funzionare!
comunque grazie ancora per l'aiuto (e per la pazienza che hai avuto nel decriptare il mio post):D

bsummer
04-12-2002, 12:32
Mi sono imbattuto nel tuo problema quando circa un anno fa ho fatto un programma di fatturazione per una carpenteria.

Dopo aver cercato qua e la' mi ricordo di essermi imbatutto in un comunicato ufficiale di micro$oft che diceva che esisteva un bug nelle datacombo inizializzate tramite adodc che non permetteva di visualizzare + campi contemporaneamente. Il bug non e' risolto nemmeno installando la service pack 5.

Sempre dove ho letto tale notizia (non ricordo il link, mi spiace) veniva descritto come ovviare al problema.

Bisogna in soldoni costruirsi a mano un recordset avente un campo, chiamiamolo "descrizione", di tipo testo nel quale inserisci una stringa ottenuta dalla concatenazione dei vari campi del db che ti interessa visualizzare. Poi al datacombo associ come origine dati il recordset.

Sono a digiuno di Vb, e ora come ora non mi ricordo come fare esattamente,ma la funzione ce l'ho scritta a casa. Stasera la posto, cosi' puoi darle un'occhiata.

Bye

nsalnet
04-12-2002, 16:48
grazie allora aspetto il tuo post di questa sera

bsummer
04-12-2002, 19:29
Bene la funzione è questa:

Private Function copyRecordSet(rs As ADODB.Recordset)
Dim rsCopy As New ADODB.Recordset
Dim saveBookmark As Variant

' se il recordset è vuoto, allora non faccio niente
If rs.EOF = True And rs.BOF = True Then
Exit Function
End If
' creo la struttura del campo: stringa,50 caratteri, aggiornabile
With rsCopy.Fields
.Append "Descrizione", adBSTR, 50, adFldUpdatable
End With
' apro il recordset
rsCopy.Open
' salvo la posizione corrente nel recordset sorgente
saveBookmark = rs.bookmark
' copio i recordset
rs.MoveFirst
Do Until rs.EOF
rsCopy.AddNew
rsCopy("Descrizione") = "N°" & rs!numero & " del " & rs!DataEmissione
rs.MoveNext
Loop
' recupero la posizione del record sorgente
rs.bookmark = saveBookmark
Set copyRecordSet = rsCopy
End Function

Vuole in input un recordset (passagli quello dell'adodc che stai usando, non spaventarti se c'è scritto ADODB.recordset...).
Il trucco è crearsi un recordset "rscopy" contenente un solo campo "descrizione" di tipo stringa.
Una volta creato il recordset, salvo la posizione in cui mi trovo sul db sorgente, mi sposto al primo record del suddetto ed inserisco in rscopy dei nuovi record aventi il campo stringa inizializzato col valore dei campi che mi in teressano.
Una volta passati tutti i record del db sorgente mi riposiziono al record dove mi trovavo prima di iniziare la copia e quindi restituisco il nuovo recordset che dovrà essere assegnato alla proprietà rowsource della datacombo.

Ora il problema è che il campo visualizzato nella datacombo è "descrizione" che non ha collegamenti col tuo db. Resta cmq il fatto che quando selezioni una voce dalla datacombo l'indice di tale voce corrisponderà all'indice del record che hai usato nella tabella per costruirti la stringa stessa: quindi puoi facilmente ricollegarti al campo o al record che ti serve aggiornare.

Un ultima cosa: naturalmente se vengono effettuati dei cambiamenti nella tabella da dove prelevi i dati per creare "descrizione", dovrai richiamare la funzione per aggiornare la lista della datacombo stessa.

Spero di essere stato utile

Bye

nsalnet
04-12-2002, 23:28
mille grazie per il chiarimento

nsalnet
05-12-2002, 16:16
scusa seti disturbo magari puoi aiutarmi!
ho la datagrid di prima, con il relativo adodc e voglio che la datagrid mi visualizzi solo i campi che il valore di un determinato campo sia come dico io, come posso fare???

P.S. per la db combo mi sono inventato una cosa da far rizzare i capelli anche al programmatore più inesperto, ho sovrapposto alla parte destinata al testo della dbcombo una casella di testo lasciando fuori solo il pulsantino, così quando eseguo il programma sembra una normale dbcombo senza dover fare tutta quella trafila, dato che erano parecchie le dbcombo nel programma :D

bsummer
05-12-2002, 21:05
Se ti serve visualizzare nel datagrid solamente le righe che hanno un determinato valore in un determinato campo, allora devi usare la proprietà filter dell'oggetto recordset contenuto nell'adodc che usi per popolare la datagrid.

Attento però perchè il filtro sui dati si estenderà a tutti i controlli che usano tale adodc (mi spiego meglio: se hai 2 datagrid che utilizzano lo stesso adodc e vuoi che uno filtri i dati e l'altro no, se imposti la proprietà filter sull'adodc purtroppo ti troverai coi dati filtrati su entrambi i datagrid).

Per ovviare a questo problema potresti crearti un oggetto recordset al quale assegni il recordset dell'oggetto adodc
Una cosa del tipo:

dim rs as ADODB.Recordset

Set rs = Tuo_ADODC.Recordset

Set rs.Filter = "Nome = 'Pippo'"

In questo modo saranno 'visibili' solo i record che hanno il campo nome uguale a 'pippo'.

Quindi assegni al datagrid il recordset che ti sei creato.

Set datagrid.DataSource = rs

In ogni momento puoi cambiare il filtro assegnando una nuova stringa di condizioni.

Per togliere qualsiasi filtro basta impostare filter a "" , cioè alla stringa vuota.

Occhio ai valori che inserisci nel filtro. Mi pare che le stringhe vanno tra apici, mentre le date ad esempio vanno tra #02/12/2002# . Controlla l'help per vedere i simboli adatti per ogni tipo di dato (putroppo la mia memoria limitata mi impedisce di ricordarli).

Bye

nsalnet
06-12-2002, 01:02
Sei GRANDISSIMO

[color=red] [color]

L'ho provato e funziona alla perfezione :D :D :D :D :D :D

nsalnet
11-12-2002, 18:02
per caso ti ricordi come si fanno a passare i parametri per variabile
ad esempio:
datPrimaryRS.Recordset.Filter = "alimentari = true" è senza variabili ma utilizando il campo ed il valore richiesto

datPrimaryRS.Recordset.Filter = "text1.text = text2.text"
in modo da poter inserire dal programma in esecuzione il campo ed il parametro, solo che così come l'ho scritto non funziona

grazie

bsummer
15-12-2002, 13:37
Originally posted by "nsalnet"

per caso ti ricordi come si fanno a passare i parametri per variabile
ad esempio:
datPrimaryRS.Recordset.Filter = "alimentari = true" è senza variabili ma utilizando il campo ed il valore richiesto

datPrimaryRS.Recordset.Filter = "text1.text = text2.text"
in modo da poter inserire dal programma in esecuzione il campo ed il parametro, solo che così come l'ho scritto non funziona

grazie
Siccome faccio solo una toccata e fuga, se hai bisogno d'aiuto scrivimi sulla mia casella di posta

[email protected]

Risponderò molto più in fretta. ;)

Ora scappo, bye

bsummer
17-12-2002, 14:43
Ecco, oggi ho piu' tempo.

Allora fare quello che ti serve e' estremamente semplice.

DIM s AS Sting

s = "text1.text = " & text2.text

datPrimaryRS.Recordset.Filter = s


:D

Bye