Newsgroup: it.comp.lang.visual-basic
Titolo: ADODB.Recordset

Salve a tutti.
Inizio la settimana con la domanda.
Sto usando un ADODB.Recordset la cui sintassi SQL di apertura è la seguente.
SELECT task.*,left(task.dati_op,4) FROM task;
Lo apro col cursore sul Client e con blocco ottimistico.
Fin qui ci siamo (Ah, il DB è Access)
Questo è il Recordset che uso nella mia form.
Allora:
- Invocando il metodo Addnew Nessun Problema
- Invocando il metodo MovePrevious succede che mi muove il cursore
all'indietro di una posizione, ma se richiamo moveprevious una seconda volta
succede un putiferio!!! (Roba del tipo - Impossibile individuare la riga
specificata per l'aggiornamento)
Qualche idea?

 Qualche idea?
Detto cosě pare che tu abbia dentro solo 2 record.
Col primo passo indietro vai al primo, col secondo vai sul nulla e da
errore...
Alex\magari č troppo facile come spiegazione...

[*Spugna* : 
skate...@libero.it
] ha scritto:

Parrebbe (caratteristica di ADO e non di DAO) che lui tenti di aggiornare il
record corrente prima di abbandonarlo per un altro. Ti risulta che siano
state fatte variazioni sui campi (basta un'assegnazione)?
In ogni caso la "roba del tipo" è più che giustificabile se non si prevede
(per ogni tabella) un indice con chiave univoca.

In effetti io prima di spostarmi chiamo il metodo update, però assegno al
recordset dei valori presi dai controlli presenti nella form.
Se può aiutare lo schema della tabella è il seguente:
(SELECT task.*,left(task.dati_op,4) AS numero_isp FROM task;)
quando - TimeStamp
serialno - Varchar(14) NOT Null
dati_op - Varchar(30)
e l'altro campo (numero_isp) come si vede dalla query è calcolato.
Secondariamente...
Sul Recordset ho impostato un filter ("numero_isp='" & Expr " OR
numero_isp=NULL"

 recordset dei valori presi dai controlli presenti nella form.
Non è chiaro: Fai un Update per aggiornare e poi assegni dei campi, oppure
il contrario?
Nel primo caso è chiaro: Tu aggiorni e poi assegni valori. ADO, alla
richiesta di spostamento del record, fa un Update implicito e, se non hai
una chiave univoca su quella tabella, ti dice "Qual è il record da
aggiornare? Io non lo so!"...
Hai un indice con chiave univoca su qualla tabella? Prevedilo, per TUTTE le
tabelle.

 Qualche idea?
prova e poi dimmi!
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

Wodka40° wrote:
Ehm amico
una cosa.....ha ragione anche Lupo eh!
SE e ripeto SE
fai un addnew...e lasci il campo chiave univoca vuota o a un valore
duplicato e poi fai Update (vero che lo fai e non ti sposti...ma solo dopo
ti sposti vero???) per forza si arrabbia!
e allora una delle 2
a) Dai sempre una chiave diversa (o la imposti come contatore e ci pensa
access)
b) Oppure togli la chiave primaria e ti trovi in caso di click sbagliato un
sacco di doppioni!
......... :-? :-D
--
Il Wodkino Nazionale č a : 
www.martek.it


Vi posto il codice della mia Form.
Option Explicit
Dim frm_rs As ADODB.Recordset
Dim chl_rs As ADODB.Recordset
Dim ShowPopUp As Boolean
Dim n_Record As Boolean
Dim Tot_campione As Integer
Dim n_campione As Integer
Private Sub Commands_Click(Index As Integer)
    Salva_Record
    If Index = 0 Then
        If commands(Index).Tag = "F" Then
            Unload Me
        Else
            frm_rs.MoveNext
            If frm_rs.EOF Then InputParametri Else Leggi_Record
        End If
    Else
        frm_rs.MovePrevious
        Leggi_Record
    End If
End Sub
Private Sub Form_Activate()
    If ShowPopUp Then
        InputParametri
        ShowPopUp = False
    End If
End Sub
Private Sub InputParametri()
    frmPopUpSerialNo.Show 1, Me
    ResetCtrls
    n_campione = n_campione + 1
    SetLabels
    frm_rs.AddNew
End Sub
Sub ShowMe(ByVal TotaleCampione As Integer)
    Tot_campione = TotaleCampione
    DB.task
    Set frm_rs = DB.rstask
    frm_rs.Filter = "numero_isp='" & HexStr(num_ispezione, 4) & "' OR
numero_isp=NULL"
    ShowPopUp = frm_rs.EOF
    initCTRLS
    Me.Show 1, frmStep1
End Sub
Sub initCTRLS()
    Set chl_rs = New ADODB.Recordset
    chl_rs.Fields.Append "prova", adVarChar, 255
    chl_rs.Fields.Append "fail", adBoolean
    chl_rs.Open
    DB.voci_checklist
        While Not DB.rsvoci_checklist.EOF
            lstCheckList(DB.rsvoci_checklist("id_categoria") - 1).AddItem
DB.rsvoci_checklist("descrizione")
            lstCheckList(DB.rsvoci_checklist("id_categoria") -
1).ItemData(lstCheckList(DB.rsvoci_checklist("id_categoria") - 1).NewIndex)
= DB.rsvoci_checklist("id_voce_checklist")
            DB.rsvoci_checklist.MoveNext
        Wend
    DB.rsvoci_checklist.Close
End Sub
Sub ResetCtrls()
    Dim n As Integer
    Dim j As Integer
    For j = 0 To 1
        For n = 0 To lstCheckList(j).ListCount - 1
            lstCheckList(j).Selected(n) = False
        Next
    Next
End Sub
Private Sub Form_Unload(Cancel As Integer)
    frm_rs.Close
    Set frm_rs = Nothing
End Sub
Private Sub Leggi_Record()
        s_codice = frm_rs("serialno")
        n_campione = Hex2Dec(Mid(frm_rs("dati_op"), 5, 2))
        SetLabels
End Sub
Private Sub Salva_Record()
    If IsNull(frm_rs("quando")) Then frm_rs("quando") = Date & " " & Time
    frm_rs("serialno") = s_codice
    frm_rs("id_operazione") = id_operazione
    frm_rs("dati_op") = HexStr(num_ispezione, 4) & HexStr(n_campione, 2)
    frm_rs.Update
End Sub
Private Sub SetLabels()
    lbCampione.Caption = n_campione & " di " & Tot_campione
    lbSerialNo.Caption = s_codice
    If n_campione = Tot_campione Then
        commands(0).Caption = "&Fine [F10]"
        commands(0).Tag = "F"
    Else
        commands(0).Caption = "&Avanti [F10]>>"
        commands(0).Tag = ""
    End If
    If n_campione = 1 Then commands(1).Enabled = False Else
commands(1).Enabled = True
End Sub
'OK.... Si parte da showme e si passa per commands_Click

Spugna wrote:
mi spiace amico non mi ci metto a debuggare il tuo codice...il problema è
tuo non mio!(non prendertela eh! :-) )
ti dico solo controlla bene il percorso logico....se fai un addnew devi
metter un update....controlla che la sequenza dei tuoi tasti e procedure sia
corretta.....
pensa che il cliente potrebbe schiacciare insert e per sicurezza caso mai
fare un doppio click...(2 volte addnew sarebbe disastroso no?)....insomma
non pensare quello che per te è logico...ma quello che effettivamente
potrebbe succedere!
Ciao!
--
Il Wodkino Nazionale è a : 
www.martek.it


[*Spugna* : 
skate...@libero.it
] ha scritto:
Ipotizzando che NON usi controlli Data-eccetera, posso darti un consiglio?
Non fare mai, mai, mai una qualsiasi azione sul recordset che possa essere
seguita da pause caffè, chiacchiere e palpatine varie. Per esempio, il
bottone (o la procedura operativa) per aggiungere un record non dovrebbe
fare l'AddNew, ma semplicemente ripulire/preparare la maschera. Il bottone
per variare ... non c'è proprio. C'è invece quello di eliminazione.
Il bottone di conferma/registrazione (uno solo, valido per aggiunta e per
variazione) effettua innanzi tutto un controllo (dai campi correnti della
maschera) per verificare se il record esiste già. Se sì lo carica e lo
varia, se no fa l'AddNew. Poi recupera i campi dalla maschera e li assegna a
quelli del recordset. Infine Update.
In tal modo non c'è intervento dell'operatore fra l'inizio delle operazioni
(Addnew o assegnazioni dei campi) e la fine delle stesse (Update), non c'è
il rischio di spostamenti (se non per errori logigi nel codice) dal record
corrente e l'eventuale blocco è limitato a quel tempo macchina e non alle
pause caffè...
Prova a rivedere il tuo codice alla luce di queste cose e vedrai, tu che
l'hai scritto, che con 4/5 correzioni otterrai qualcosa di più pulito e
funzionale.

Grazie... cmq dalla mia domanda iniziale siamo finiti a come devo fare il
mio programma...
il mio problema comunque resta ancora il cursore...
il percorso logico è corretto ma quando chiamo il metodo move si incarta
tutto.

Ti dico solo che se non metti un campo chiave o se un campo non permette il
null...e ti sposti senza averlo imputato da errore...
come puoi far ciò????
un addnew e uno spostamento senza imputazione
....dei lisbox non inizializzati bene...o non inizializzati ad un valore di
default valido.....
un doppio click
IL CURSORE non c'entra una mazza!
sei tu che nel tuo programma lasci vuoto in qualche punto dei campi...o fai
l'addnew dell'addnew
STOP
ciao!


    chl_rs.Open
chiedi banane e porti piselli???BOH!
speriamo sia il caldo!
Di nuovo ciao!
--
Il Wodkino Nazionale č a : 
www.martek.it


 STOP
Si va' Fermati che è meglio.
E se proprio vuoi parlare di UMILTA'

frm_rs = Punta al recordset di un DECommand (che guarda caso ha quella
sintassi SQL descritta nel mio primo post).
chl_rs = č lě per sbaglio.

 sintassi SQL descritta nel mio primo post).
Cos'è un DECommand?

E' un oggetto command del Data Environment...

 E' un oggetto command del Data Environment...
Ah! Scusa la battuta, ma ... è troppo facile: Getto la ... Spugna.
PS: Quando la capirete di lasciar perdere tutto ciò che inizia con Data sarà
sempre troppo tardi. Sinceramente.

> E se proprio vuoi parlare di UMILTA'...
...Scusa mi son perso... meglio che vado a lavorare.

Hai ragione, tutto quello che inizia con data può essere fastidioso... però
quando hai fretta non puoi fare altrimenti...
Per quanto mi riguarda devo fare 12 programmi in 1 mese e se non uso DE non
ce ne vado fuori... anche perché nella maggior parte dei casi per inserire e
modificare record uso statement SQL parametrici, quindi gestendo tutto da
codice dovrei farmi una funzione per ogni query.
DE invece mi permette di risparmiare un sacco di lavoro.
Solo che quando devo gestire il recordset a manina (come dal mio primo post)
allora saltano fuori le magagne.
Comunque ti Ringrazio della disponibilità.
Ciao!

 Ciao!
La disponibilità (quando c'è il tempo) non è un problema. Ma (lungi da me da
voler fare/apparire il maestrone), volevo dire che a volte val la pena
scrivere qualcosa di riutilizzabile, certo, perdendo un po' di tempo, ma
stare tranquilli per sempre. ... Senza contare le revisioni, l'obsolescenza
e la "chiusura" dei controlli "pronti".

 ...Scusa mi son perso... meglio che vado a lavorare.
bah fa come ti pare!
tanto !
spero che riuscirai a capire la cazzata di quello che dici......
un recordset sparato in memoria non ha nessun vincolo se non la memoria!(a
meno che tu lo costruisca)
Un recordset legato AD un database a parecchi vincoli (pensa una conn che
cade)...oltra a quelli che metti tu (primary key...relazioni...integrita
referenziale etc etc)
Fare un progetto bound perchè non si ha tempo....ok!Storco il naso...al
limite però con il datacommand(o equivalente ADO)
(Consiglio: se usi solo access e rimarrà tutto in access fallo in
DAO!!!perchè? prova a indovinare....)
12 programmi in un mese son fattibili se son piccoli e se hai parecchia
esperienza( come diceva Lupo hai già i mattoncini pieni e pronti)
Se come mi par di comprendere hai solo voglio di fare ma scarsa
esperienza...sei nella biiip fino al collo!
Tutta la parte DataEnvironment ...è comoda per i newbie ma terribilmente
lenta e farraginosa per chi sale un gradino!
E molto "suscettibile" appena fai query un po + complesse!
Un dEcommand...lo sostituisci con l'oggetto Command e campi Mooooolto più
tranquillo!
Una DeConnection con una connection!...etc etc
come diceva Lupo se sai cosa fare è un attimo...son 3 righe
non le vuoi/sai usare
telchi alcune
http://www.it-lang-vb.com/wodka/default.asp?cosa=area13&nome=Articoli
Certo che il DE è comodo per chi non sa una mazza di SQL...
ma permettimi...è ancor più comodo Access
Fatti la query in access...poi una volta che funziona...clikka su SQL (lo
sai che ci son 3 modi nel query editor no? design visualizzazione e SQL) e
incolla nel tuo progetto l'SQL
cmq fai te mio lucido amico!
però....
ripeto...
 BOUND non ti funziona perche non imputi tutti i campi!
sarò presuntuoso....ma tu sei duro!
Ciao e buon lavoro!
:-)


 DE non ce ne vado fuori...
Ma non diciamo cazzate, per cortesia.
Se l'applicativo lo fai per tenere l'archivio dei tuoi CD, va bene qualunque
cosa.
Ma se lo devi dare ad un cliente (e immagino sia questo il caso, visto che
dici "DEVO FARE"), la parte più lunga non è tanto lo sviluppo puro e
semplice, quanto il test finale ed il debug.
E qui, col dataenvironment e altra roba bound, non ci salterai mai fuori.
Morale: facendo così, risparmi qualche giorno di sviluppo, ma li stai già
pagando tutti coi primi test.
Per non parlare di quanti casini avrai in produzione, con relativa perdita
di tempo per assistenza, patch, service pack, bla bla bla...
Ciao
Alberto

 Alberto
Ciao
Alessandro
-- 
Morfeus®
Free Joint
 :PII

Scusa sono un cretino.
Non so programmare.

oh, qualcuno ha capito :)

 oh, qualcuno ha capito :)
Bastava dirlo all'inizio e almeno evitavamo di perdere tempo a risponderti.
Al limite puoi anche mettere dei raiseerror a date prestabilite,
rigorosamente scaduti i due anni di garanzia.
Cosě la categoria ne guadagna in immagine.
Ciao
Alberto

 oh, qualcuno ha capito :)
finchč non si incazza il cliente e ti sostituisce con un altro programmatore
o con un altra swHouse....o ti licenziano!
Occhio a fare questi giochetti!
Che mi fanno incazzare di brutto...lo sai perchč?
Un cattivo programmatore...fa danno solo a se stesso,alla sua azienda,al suo
datore di lavoro e stop!
Un FURBO(nel senso di poco etico) programmatore....fa danno a tutta la
categoria!
il mix Cattivo e Furbo poi!
In questo senso una bacchetta sulle dita anche a Morfeus!
--
Il Wodkino Nazionale č a : 
www.martek.it



Non dire eresie Albe...."non invitare il matto a fare a sassate"
questo ora scopre Raise Error.....
LOL
cmq la degna conclusione del 3ad potrebbe essere:
Accidenta ai Lamer di tutto il mondo!
Che li si potesse fulminare la ventolina della Cpu seduta stante!
Che li si potesse incastare il dito medio nella fessura del floppy e il dito
indice dell'altra mano incastrare nel CdRom mentre installano l'ultimo
pornazzo...nel mentre che la madre bussa per chiamarli a salutare lo zio
Cardinale venuto in visita al nipote per regalargli il pellegrinaggio a
Lourdes per guarire dall'alito pesante!
ROTFL
--
Il Wodkino Nazionale č a : 
www.martek.it


 oh, qualcuno ha capito :)
Solo una domanda: Stai scherzando o no?

 ROTFL
Meglio del Decamerone
ROTFL


 In questo senso una bacchetta sulle dita anche a Morfeus!
Ahia,
E io che cientro io evidenziavo,mica sono furbo
Io faccio cose che devono funzionare,non mi va di uscire per clienti con
questo caldo poi...
Nelle mie evoluzioni programmistiche metto sempre un gestore di errori
che salva l'errore e me lo manda via e-mail(previ telefonata del cliente che
mi chiede come mandare l'e-mail!!!)...dopo rimando se il caso
la patch sempre via Web...eheheh e si che sono furbio io
(che belle le eccezzioni di .Net)
Sono FURBOOOOOO
espressione della mia faccia
Static Faccia Morfeus= :-|
:-P


 E' un oggetto command del Data Environment...
A morte gli ungheresi
Un Morfeus che ancora non si riesce ad abituare al lavoro :(


 ... (che belle le eccezzioni di .Net)
'A Morph, proprio glielo vuoi fare un invito a "faccina"...

 Solo una domanda: Stai scherzando o no?
Certo che scherzo.

 'A Morph, proprio glielo vuoi fare un invito a "faccina"...
Sai sono suscettibile quando mi si corregge la Z di Zorro
;)
O volete che mi trasformi di nuovo,ho appena risentito il mio
poucher :)
Rotfl


 Certo che scherzo.
Ah, ecco...

Comunque mi domando...
Perché tante polemiche perché uno usa DE?
Non è forse un componente di sviluppo come tutti gli altri?

 Non è forse un componente di sviluppo come tutti gli altri?
NO!!!
Tutti i DATA-eccetera sono lassativi.
Una volta c'era (ma tu non lo puoi sapere) il "Confetto Falqui", poi l'
"Amaro Giuliani".
Oggi ci sono i Data-eccetera.
Segateli, sabotateli, ignorateli, persino masturbateli ma, tutto, tutto,
tutto meno nche usarli.


Non sono d'accordo.


Lupo è un po' drastico.
Tuttavia, se ti rileggi il mio post delle 11.00, qualcosa ti sarà più
chiaro.
Sostanzialmente, il DE è uno strumento molto potente e molto veloce, ma non
deve assolutamente essere usato per sviluppare applicazioni da dare in mano
ai clienti, visto l'elevatissimo numero di problematiche che presenta.
Nell'ottica di mantenere un livello minimo di decenza nel nostro lavoro,
occorre che tutti quanti ci sforziamo per eliminare quella sgradevole
associazione fra software-house e pasticcioni, che spesso genera sfiducia e
diffidenza nella clientela.
Se perdi dei dati di un tuo db ad uso personale, fatti tuoi. Ma se un
cliente perde dei dati, il suo pensiero sarà "Maledetti computer, facendo
tutto a mano non perdevo niente". E col cavolo che investirà in un software
'più migliore'. Al limite disinstalla e fa a manina.
Ciao
Alberto

[*Spugna* : 
skate...@libero.it
] ha scritto:

Come vuoi. Ne hai facoltą.
Auguri.

 Tutti i DATA-eccetera sono lassativi.
Ehehehe... anch'io ero arrivato a questa conclusione un po' di annetti fa...
:-)))
Figurati che io ci aggiungerei anche i DB-eccetera... :-)))
--
Er Roscio.