Capitolo 42. ADO_SDF

 42.1 Apertura di un SDF in VB6

                                                                                                                                                                                                  

Ora che abbiamo imparato a creare i Database SDF ed eventualmente a convertire l database MDB in Database SDF (con tecnologia .NET), vogliamo provare ad aprire un SDF da VB6 e creare un Recordset ADO appoggiato su una Tabella di questo Database.

Creaimo allora una nuova Cartella "ESERCIZIO_39_ADO_SDF" e copiamo integralmente il contenuto della Cartella "SOLUZIONE_08_09_10".

Aggiungiamo in Dichiarazioni del "MODULO1" un riferimento al nuovo path e alla nuova Connessione:                 

Global pathsdf
Global CnSDF As New ADODB.Connection

e modifichiao in "APRIPROGETTO" del "MODULO1" il riferimento al database da aprire:

Sub apriprogetto()

'generali
'--------------------
pathsdf = "C:\GRIGLIE_ADO\ARCHIVIODATI\MAGFILE.SDF"
acapo = Chr$(13) + Chr$(10)

'ordinamento
'--------------------
artordi = 1

End Sub

Scriviamo ora la nuova Connection String nel "FORM_LOAD" dell'"ARTSK1":

Sub Form_Load()

'apertura progetto
'--------------------
apriprogetto

'Connessione
'---------------------
CnSDF.CursorLocation = adUseClient
CnSDF.Provider = "Microsoft.SQLSERVER.CE.OLEDB.3.5"
CnSDF.Open pathsdf

'Cn.Open "data Provider=Microsoft.Jet.OLEDB.4.0;Provider=MSDataShape.1;" & _
' "Data Source=" & pathmdb

'definizione del Recordset
'---------------------
Selezione = "Select * from ARTFILE order by ARTCODI"
art11.Open "" & Selezione & "", CnSDF, adOpenStatic, adLockOptimistic
Set DataGrid1.DataSource = art11

Lanciando il Progetto vedremo il DataGrid dell' "ARTSK1" riempirsi dei Records della Tabella SDF, preparata come al Capitolo precedente.

Fin qui tutto bene, crediamo che non occorra altro, proprio come era successo con i Database "MDB" visti al Capitolo 39.

Nulla di piu' falso, purtroppo. Infatti, contrariamente al "SQL EXPRESS", il "SQL CE" non risponde alla istruzione piu' semplice e fondamentale dei Recordset ADO:

art11.ARTCODI = 33
art11.Update

con la quale abbiamo aggiunto e modificato sempre i Records dei recordset ADO.

Per convincersi e toccare con mano le dimensioni del disatro basta preparare una micro Routine aggiungendo al progetto un nuovo Form "MENU", da cui partiremo con tutte le operazioni sotto descritte ed aggiungere un Bottone di test con le seguenti istruzioni:

Private Sub cmdNew_Click()

'Connessione SQL
'---------------------
Dim CnSDF As New ADODB.Connection
CnSDF.Provider = "Microsoft.SQLSERVER.CE.OLEDB.3.5"
pathsdf = "C:\GRIGLIE_ADO\ARCHIVIODATI\MAGFILE.SDF"
CnSDF.Open pathsdf
CnSDF.CursorLocation = adUseClient

' Recordset
'---------------------------
Dim Rs11 As New ADODB.Recordset
Selezione = "Select * from ARTFILE"
Rs11.Open "" & Selezione & "", CnSDF, adOpenStatic, adLockOptimistic
MsgBox (Rs11!ARTNOME)   'fin qui tutto bene

'new record
'---------------------------
Rs11.AddNew
Rs11!ARTCODI = 100
Rs11!ARTNOME = "VINO REFOSK"
Rs11.Update

End Sub
 

Messaggio di errore con un blaterio sconclusionato ed inconcludente, con inevitabile rimando alle stramaledette MSDN. Morale, siamo fermi, non si passa.

L'unico modo di superare l'impasse e' di giocare su un altro tavolo, quello delle Query "SQL". Modifichiamo il nostro bottone di prova come segue:

'new record
'---------------------------
'Rs11.AddNew
'Rs11!ARTCODI = 100
'Rs11!ARTNOME = "VINO REFOSK"
'Rs11.Update

txtartcodi = 100
txtartnome = "VINO REFOSK"

RsSQL = "INSERT INTO ARTFILE (ARTCODI,ARTNOME)" & _
" VALUES (" & txtartcodi & "," & _
"'" & txtartnome & "' )"

CnSDF.Execute RsSQL
 

Se ora clikkiamo questo Bottone e poi lanciamo l'"ARTSK1", per esempio con un altro Bottone sul "MENU", vedremo che il Record con Codice "ARTCODI" pari a 100 e' entrato tranquillamente  e ci osserva con un sorriso serafico.

Abbiamo capito che qui c'e' del lavoro da fare, cioe' che dobbiamo modificare i frammenti di "ARTSK1" ed "ARTSK2" relativi alla aggiunta e alla modifica dei Records al Recordset ADO "ART11" in modo da introdurre qui le istruzioni "SQL".

 

 42.2 Passaggio da MDB a SDF con VB6

Il linguaggio "SQL" e' una brutta bestia. Le sue istruzioni sono di una semplicita' verginale. Ad esempio:

INSERT INTO ARTFILE Campo1, Campo2 VALUES (Valore1, Valore2)

Beh, che ccce vo' ?  Si, pero'  appena si cerca di lavorare sul serio, per esempio inserire i dati di un Form, diciamo "ARTSK2" , che avremo lanciato e riempito  in tutte le sue "TextBox" onde aggiungere un nuovo Record con tutti i suoi Campi Testo, Date, Numeri, Float etc,  le istruzioni diventano a dir poco spaventose, da far tremare le vene ai polsi.

Esagerato ? Ah si ? Bene, cominciamo con qualcosa di semplice, tanto per farci la mano.

Vogliamo preparare una Routine che, in modo analogo a quanto visto in ambiente VB.NET, trasporti i dati della Tabella "ARTFILE" di "MAGFILE.MDB" , tramite Recordset "RS11" ,  alla Tabella "ARTFILE" di "MAGFILE.SDF", pero' questa volta usando il caro buon vecchio VB6.

Aggiungiamo un nuovo Bottone al nostro "MENU ("CMDSDF") e scriviamo:

Sub cmdSDF_Click()

'Connessione MDB
'---------------------
pathmdb = "C:\GRIGLIE_ADO\ARCHIVIODATI\MAGFILE.MDB"
Cn.Open "data Provider=Microsoft.Jet.OLEDB.4.0;Provider=MSDataShape.1;" & _
"Data Source=" & pathmdb
Cn.CursorLocation = adUseClient

'Connessione SQL
'---------------------
pathsdf = "C:\GRIGLIE_ADO\ARCHIVIODATI\MAGFILE.SDF"
CnSDF.Provider = "Microsoft.SQLSERVER.CE.OLEDB.3.5"
CnSDF.Open pathsdf
CnSDF.CursorLocation = adUseClient

'ARTFILE SDF
'svuota
'------------------------
ARTQ1 = "delete from ARTFILE"
CnSDF.Execute ARTQ1
DoEvents

' Recordset MDB
'---------------------------
Selezione = "Select * from ARTFILE"
Rs11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

'Ciclo
'----------------------------
Do While Not Rs11.EOF
ART_MDB_SDF
CnSDF.Execute RsSQL
Rs11.MoveNext
Loop
Rs11.Close

'esce
'------------------------------
Cn.Close
CnSDF.Close
Artsk1.Show

End Sub

L'"ARTFILE" SDF viene svuotata e poi si apre con la Tabella "ARTFILE" MDB un Recordset "RS11"  il quale viene percorso da cima a fondo. Ad ogni Record si scive la Query ("ART_MDB_SDF") per trasferire i dati alla tabella "ARTFILE" SDF e poi si lancia un "EXECUTE" di questa Query.

Ecco la Query (posta in "MENU" oppure in "MODULO1"):

Sub ART_MDB_SDF()

If Len(Rs11!ARTCODI)<>0 Then
zARTCODI = Str(Rs11!ARTCODI)
Else
zARTCODI ="Null"
Endif

If IsDate(Rs11!DATAGG) Then
zDATAGG = "'" & Year(Rs11!DATAGG) & "-" & Month(Rs11!DATAGG)& "-" & Day(Rs11!DATAGG)&"'"
Else
zDATAGG ="Null"
End If

If Len(Rs11!STOCK)<>0 Then
zSTOCK = Str(Rs11!STOCK)
Else
zSTOCK ="Null"
Endif

If Len(Rs11!COSBANETTO)<>0 Then
zCOSBANETTO = Str(Rs11!COSBANETTO)
Else
zCOSBANETTO ="Null"
Endif

If Len(Rs11!ALIVA)<>0 Then
zALIVA = Str(Rs11!ALIVA)
Else
zALIVA ="Null"
Endif

If Len(Rs11!IVABASE)<>0 Then
zIVABASE = Str(Rs11!IVABASE)
Else
zIVABASE ="Null"
Endif

If Len(Rs11!COSBALORDO)<>0 Then
zCOSBALORDO = Str(Rs11!COSBALORDO)
Else
zCOSBALORDO ="Null"
Endif


If Len(Rs11!ARTQTY)<>0 Then
zARTQTY = Str(Rs11!ARTQTY)
Else
zARTQTY ="Null"
Endif

If Len(Rs11!NETTOVERO)<>0 Then
zNETTOVERO = Str(Rs11!NETTOVERO)
Else
zNETTOVERO ="Null"
Endif

If Len(Rs11!TOTNETTO)<>0 Then
zTOTNETTO = Str(Rs11!TOTNETTO)
Else
zTOTNETTO ="Null"
Endif

If Len(Rs11!FLIPRETE)<>0 Then
zFLIPRETE = Str(Rs11!FLIPRETE)
Else
zFLIPRETE ="Null"
Endif

'-------------------
RsSQL = "INSERT INTO ARTFILE (ARTCODI,DATAGG,ARTNOME,TIPO,UM,STOCK,COSBANETTO,PROCOGN,PRONOME,ALIVA,IVABASE,

COSBALORDO,ARTQTY,OK,NETTOVERO,TOTNETTO,FLIPRETE)" & _
"VALUES (" & zARTCODI & "," & _
"" & zDATAGG & "," & _
"'"& Rs11!ARTNOME &"'," & _
"'"& Rs11!TIPO &"'," & _
"'"& Rs11!UM &"'," & _
"" & zSTOCK & "," & _
"" & zCOSBANETTO & "," & _
"'"& Rs11!PROCOGN &"'," & _
"'"& Rs11!PRONOME &"'," & _
"" & zALIVA & "," & _
"" & zIVABASE & "," & _
"" & zCOSBALORDO & "," & _
"" & zARTQTY & "," & _
"'"& Rs11!OK &"'," & _
"" & zNETTOVERO & "," & _
"" & zTOTNETTO & "," & _
"" & zFLIPRETE & ""&")"

End Sub

Ci si chiedera': ma perche' cosi' complicata ?

E' che bisogna trasferire tutti i campi e bisogna fare i conti con i vari tipi di campo.

I campi numerici, im particolare i Float con i decimali, hanno il problema che il sistema Italiano usa la virgola, mentre il SQL vuole i punti. Inoltre il relativo TextBox puo' essere stato lasciato blank e bisogna introdurre nel campo un valore "Null". Occorre allora "congelare " il punto al posto della virgola e tener conto del Null.

Si ha quindi questo blocchetto tipico, che va scritto per ogni campo numerico, Intero o Float tanto per non sbagliare,  che definisce la variabile "ZCAMPO":

If Len(Rs11!STOCK)<>0 Then
zSTOCK = Str(Rs11!STOCK)
Else
zSTOCK ="Null"
Endif

Dopodiche' la variabile del campo Numerico viene inserito nei "VALUES" della Query come segue, cioe' senza apici semplici:

"" & zSTOCK & "," & _

I campi Data invece hanno il problema che debbono esssere inseriti solo con il format ISO, cioe' Anno, Mese, Anno, separati con trattino e con due apici ai lati:

'YYYY-MM-DD'

da cui la necessita' del blocchetto che ricalcola la Data ed aggiunge i trattini e gli gli apici:

If IsDate(Rs11!DATAGG) Then
zDATAGG = "'" & Year(Rs11!DATAGG) & "-" & Month(Rs11!DATAGG)& "-" & Day(Rs11!DATAGG)&"'"
Else
zDATAGG ="Null"
End If

Il loro inserimento nella Query avviene senza apici, perche' la variabile "ZDATA" gia' ce li ha.

"" & zDATAGG & "," & _

I campi testo non hanno problemi ma naturalmente vanno inseriti con gli apici:

"'"& Rs11!ARTNOME &"'," & _

Insomma qui bisogna che qualch'uno ci aiuti a scivere la Query

 

42.3 La Query XXX_MDB_SDF

Se abbiamo scritto il nostro Progetto con le convenzioni descritte nel corso dei vari Capitoli ed in particolare se l'ultimo dei campi della Tabella e' il campo "FLIPRETE", potremo ricorrere ancora una volta al nostro "MAKETEXTSDF" (visto nel Capitolo precedente) in cui avremo scritto la seguente Routine:

'XXX_MDB_SDF
'----------------------------------------------------------------------------------------------------------------------
Open Trim(txtTesti) & "\" & XXX & "_MDB_SDF.TXT" For Output As #1

Print #1, "Sub " & XXX & "_MDB_SDF()"
Print #1, ""

Set txtdb = OpenDatabase(DDD, False, False, "")
Set txtrcset = txtdb.OpenRecordset(XXX & "FILE")

'MDB numeri per values
'------------------
For i = 0 To txtrcset.Fields.Count - 1
nome = txtrcset.Fields(i).Name
'--
Select Case txtrcset.Fields(i).Type

Case 7 'numero
testo = "If Len(Rs11!" & nome & ")<>0 Then"
Print #1, testo
testo = "z" & nome & " = Str(" & "Rs11!" & nome & ")"
Print #1, testo
testo = "Else"
Print #1, testo
testo = "z" & nome & " =" & Chr(34) & "Null" & Chr(34)
Print #1, testo
testo = "Endif"
Print #1, testo
Print #1, ""

Case 8 'data
testo = "If IsDate(Rs11!" & nome & ")" & " Then"
Print #1, testo

testo = "z" & nome & " = " & Chr(34) & "'" & Chr(34) & " & Year(Rs11!" & nome & ") & "
testo = testo & Chr(34) & "-" & Chr(34) & " & Month(Rs11!" & nome & ")& "
testo = testo & Chr(34) & "-" & Chr(34) & " & Day(Rs11!" & nome & ")&" & Chr(34) & "'" & Chr(34)
Print #1, testo

testo = "Else"
Print #1, testo

testo = "z" & nome & " =" & Chr(34) & "Null" & Chr(34)
Print #1, testo

testo = "End If"
Print #1, testo
Print #1, ""
'---
End Select
Next i

'MDB insert
'--------------------
testo = "'-------------------"
Print #1, testo
testo = "RsSQL = " & Chr(34) & "INSERT INTO " & XXX & "FILE ("

For i = 0 To txtrcset.Fields.Count - 1
'--
testo = testo & txtrcset.Fields(i).Name
If txtrcset.Fields(i).Name <> "FLIPRETE" Then
testo = testo & ","
Else
testo = testo & ")"
End If 'FLIPRETE
'--
Next

testo = testo & Chr(34) & " & _ "
Print #1, testo

'MDB values
'-----------------
testo = Chr(34) & "VALUES ("

For i = 0 To txtrcset.Fields.Count - 1
nome = txtrcset.Fields(i).Name
'--
Select Case txtrcset.Fields(i).Type
Case 7 'numero
testo = testo & Chr(34) & " & z" & nome & " & " & Chr(34)

Case 8 'data
testo = testo & Chr(34) & " & z" & nome & " & " & Chr(34)

Case Else 'testo
testo = testo & "'" & Chr(34) & "& Rs11!" & nome & " &" & Chr(34) & "'"
End Select
'---
If txtrcset.Fields(i).Name <> "FLIPRETE" Then
testo = testo & "," & Chr(34) & " & _"
Else
testo = testo & Chr(34) & "&" & Chr(34) & ")" & Chr(34)
End If 'FLIPRETE
'---
Print #1, testo
testo = Chr(34)
Next i
'------------
Print #1, ""
Print #1, "End Sub "
Close #1
 

Provare per credere, nella sottoCartella "TESTI" della sottoCartella "MAKETEXTSDF" troveremo il nostro file TXT, "ART_MDB_SDF.TXT" bell'e che pronto e le sue istruzioni  potranno essere aggiunte al nostro Progetto con un semplice Copia e Incolla.

Ovviamente lo stesso si puo' fare con la Tabella "CLIFILE" ed anche qui si usera' un Recordset ADO, sempre a nome "RS11" dopo aver sostituito nella Routine del Bottone "cmdSDF_Click()" tutti gli "ART" con "CLI".

E cosi' via per le atre Tabelle di "MAGFILE.MDB".

 

42.4 Inserimento di un Nuovo Record

Siamo pronti ad affronatre la sfida: modifichiamo in "ARTSK2" le istruzioni di aggiunta Record, Bottone "CMDCONFNEW"::

Private Sub cmdConfNew_Click()

'campi non validi
'-----------------------
flaart = True
artcheck
If flaart = False Then
Exit Sub
End If

'controlla artcodi duplicato
'----------------------
zARTCODI = Val(txtartcodi.Text)
artfresca

If Not art11.EOF Then
MsgBox (zARTCODI & " gi esiste!")
Exit Sub
End If

'aggiunge il Record
'----------------------------------
ARTINSERT
CnSDF.Execute RsSQL
DoEvents

'art11.AddNew
'ARTrepla
'art11.Update

'rinfresca il RecordSet
'----------------------------------
artfresca

'torna a video list
'----------------------------------
artvuoto = False
Artsk1.buttrue
Artsk1.Enabled = True
Unload Artsk2

End Sub

Come si vede, abbiamo sostituito le istruzioni di "ADDNEW" con una Query "ARTINSERT" che passa il comando all'"EXECUTE".

Ecco la Query (posta nel "MODULO1"):

Sub ARTINSERT()

If Len(Artsk2.txtartcodi.Text) <> 0 Then
zARTCODI = Str(virvalore(Artsk2.txtartcodi.Text))
Else
zARTCODI = "Null"
End If

If IsDate(Artsk2.txtdatagg.Text) Then
zDATAGG = "'" & Year(Artsk2.txtdatagg.Text) & "-" & Month(Artsk2.txtdatagg.Text) & "-" & Day(Artsk2.txtdatagg.Text) & "'"
Else
zDATAGG = "Null"
End If

If Len(Artsk2.txtstock.Text) <> 0 Then
zSTOCK = Str(virvalore(Artsk2.txtstock.Text))
Else
zSTOCK = "Null"
End If

If Len(Artsk2.txtcosbanetto.Text) <> 0 Then
zCOSBANETTO = Str(virvalore(Artsk2.txtcosbanetto.Text))
Else
zCOSBANETTO = "Null"
End If

zFLIPRETE = 0

'-------------------
RsSQL = "INSERT INTO ARTFILE (ARTCODI,DATAGG,ARTNOME,TIPO,UM,STOCK,COSBANETTO,PROCOGN,PRONOME,FLIPRETE)" & _
" VALUES (" & _
"" & zARTCODI & "," & _
"" & zDATAGG & "," & _
"'" & Artsk2.txtartnome.Text & "'," & _
"'" & Artsk2.txttipo.Text & "'," & _
"'" & Artsk2.txtum.Text & "'," & _
"" & zSTOCK & "," & _
"" & zCOSBANETTO & "," & _
"'" & Artsk2.txtprocogn.Text & "'," & _
"'" & Artsk2.txtpronome.Text & "'," & _
"" & zFLIPRETE & "" & ")"

End Sub

Questa Query ricorda la "ART_MDB_SD" vista in un Paragrafo precedente, solo che qui essa lavora sui TextBox di "ARTSK2" Valgono ancora le stesse considerazioni sulla necissita' di tenere conto dei vari tipi di Campo.

Anche qui la "MAKETEXTSDF" ci viene in soccorso creando un altro TXT,  "ARTINSERT.TXT":

'XXXINSERT
'------------------------------------------------------------------------------------------------------------------------
Open Trim(txtTesti) & "\" & XXX & "INSERT.TXT" For Output As #1
Print #1, "Sub " & XXX & "INSERT()"
Print #1, ""

Set txtdb = OpenDatabase(DDD, False, False, "")
txttab = "select * from " & XXX & "FILE"
Set txtrcset = txtdb.OpenRecordset(txttab)

For i = 0 To txtrcset.Fields.Count - 1
'--
nome = txtrcset.Fields(i).Name
DIME = txtrcset.Fields(i).Size

'INSERT numeri per values
'------------------
If txtrcset.Fields(i).Name <> "FLIPRETE" Then
Select Case txtrcset.Fields(i).Type

Case 7 'numero
testo = "If Len(" & XXX & "sk2.Txt" & nome & ".Text" & ")<>0 Then"
Print #1, testo
testo = "z" & nome & " = Str(virvalore(" & XXX & "sk2.Txt" & nome & ".Text" & "))"
Print #1, testo
testo = "Else"
Print #1, testo
testo = "z" & nome & " =" & Chr(34) & "Null" & Chr(34)
Print #1, testo
testo = "Endif"
Print #1, testo
Print #1, ""

Case 8 'data
testo = "If IsDate(" & XXX & "sk2.Txt" & nome & ".Text)" & " Then"
Print #1, testo

testo = "z" & nome & " = " & Chr(34) & "'" & Chr(34) & " & Year(" & XXX & "sk2.Txt" & nome & ".Text) & "
testo = testo & Chr(34) & "-" & Chr(34) & " & Month(" & XXX & "sk2.Txt" & nome & ".Text)& "
testo = testo & Chr(34) & "-" & Chr(34) & " & Day(" & XXX & "sk2.Txt" & nome & ".Text)&" & Chr(34) & "'" & Chr(34)
Print #1, testo

testo = "Else"
Print #1, testo

testo = "z" & nome & " =" & Chr(34) & "Null" & Chr(34)
Print #1, testo

testo = "End If"
Print #1, testo
Print #1, ""

End Select
'---
Else
testo = "ZFLIPRETE=0"
Print #1, testo
End If 'FLIPRETE
Next i

'INSERT insert
'--------------------
Print #1, ""
testo = "'-------------------"
Print #1, testo
testo = "RsSQL = " & Chr(34) & "INSERT INTO " & XXX & "FILE ("

For i = 0 To txtrcset.Fields.Count - 1
'--
testo = testo & txtrcset.Fields(i).Name

If txtrcset.Fields(i).Name <> "FLIPRETE" Then
testo = testo & ","
Else
testo = testo & ")"
End If 'FLIPRETE
'--
Next

testo = testo & Chr(34) & " & _ "
Print #1, testo

'INSERT values
'-----------------
testo = Chr(34) & " VALUES (" & Chr(34) & " & _ "
Print #1, testo
testo = Chr(34)

For i = 0 To txtrcset.Fields.Count - 1
nome = txtrcset.Fields(i).Name
'--
Select Case txtrcset.Fields(i).Type

Case 7, 8 'numero,data
testo = testo & Chr(34) & " & z" & nome & " & " & Chr(34)

Case Else 'testo
testo = testo & "'" & Chr(34) & "& " & XXX & "sk2." & "Txt" & nome & ".Text" & " &" & Chr(34) & "'"
End Select
'---
If txtrcset.Fields(i).Name <> "FLIPRETE" Then
testo = testo & "," & Chr(34) & " & _"
Else
testo = testo & Chr(34) & "&" & Chr(34) & ")" & Chr(34)
End If 'FLIPRETE
'---
Print #1, testo
testo = Chr(34)
Next i
'------------
Print #1, ""
Print #1, "End Sub "
Close #1
 

L'"ARTINSERT" cosi' generato va comunque ripulito dai campi che sono presenti nella Tabella ma non lo sono nell'"ARTSK2".

 

42.5 Modifica di un Record

Anche per la modifica di un record bisogna ricorrere al SQL.

Cominciamo con "ARTSK1" in cui in "CMDEDIT" bisogna bloccare "FLIPRETE" per impedire la modifica ad altro utente di rete.

Private Sub cmdEdit_Click()

On Error GoTo errori

'rinfresca
'----------------
arttext
artfresca
arttext

'controlla rete
'----------------
If art11!FLIPRETE = 1 Then
MsgBox ("il Record in uso. attendere e ritentare")
Exit Sub
End If

'blocca rete
'----------------
zARTCODI = art11!ARTCODI
RsSQL = "UPDATE ARTFILE set FLIPRETE=1 WHERE ARTCODI= " & zARTCODI & " "
CnSDF.Execute RsSQL
DoEvents

'art11!FLIPRETE = 1
'art11.Update

'mostra maschera
'----------------
Artsk2.txtartcodi.Enabled = False
Artsk2.cmdConfEdit.Visible = True
Artsk2.cmdAbandon.Visible = True
Artsk2.Show
Artsk1.Enabled = False

'routine errori
'------------------
Exit Sub
errori:
Select Case Err
Case 3167, 3021
MsgBox ("sorry. il Record nel frattempo stato" & acapo & " cancellato da un altro utente !")
art11.MoveFirst
Case Else
MsgBox ("errore imprevisto No. " & Err)
End Select

End Sub

 Passiamo ora a "ARTSK2" nel "CMDCONFEDIT":

Private Sub cmdConfEdit_Click()

'campi non validi
'----------------------
flaart = True
artcheck
If flaart = False Then
Exit Sub
End If

'modifica Record
'-------------------------
ARTUPDATE
CnSDF.Execute RsSQL
DoEvents

'ARTrepla
'art11.Update

artfresca

'sblocco rete
'----------------------
'art11!FLIPRETE = 0
'art11.Update

'ritorna a video lista
'---------------------------
Artsk1.Enabled = True
Unload Artsk2

End Sub

La Routine "ARTREPLA" che avevamo studiato se ne va via e si introduce la Query "ARTUPDATE" che  lavora anch'essa con i TextBox di "ARTSK2":

Sub ARTUPDATE()

If Len(Artsk2.txtartcodi.Text) <> 0 Then
zARTCODI = Str(virvalore(Artsk2.txtartcodi.Text))
Else
zARTCODI = Str(0)
End If

If IsDate(Artsk2.txtdatagg.Text) Then
zDATAGG = "'" & Year(Artsk2.txtdatagg.Text) & "-" & Month(Artsk2.txtdatagg.Text) & "-" & Day(Artsk2.txtdatagg.Text) & "'"
Else
zDATAGG = "Null"
End If

If Len(Artsk2.txtstock.Text) <> 0 Then
zSTOCK = Str(virvalore(Artsk2.txtstock.Text))
Else
zSTOCK = Str(0)
End If

If Len(Artsk2.txtcosbanetto.Text) <> 0 Then
zCOSBANETTO = Str(virvalore(Artsk2.txtcosbanetto.Text))
Else
zCOSBANETTO = Str(0)
End If

zFLIPRETE = 0
'-------------------
RsSQL = "UPDATE ARTFILE SET " & _
"ARTCODI=" & zARTCODI & "," & _
"DATAGG=" & zDATAGG & "," & _
"ARTNOME= '" & Artsk2.txtartnome & "' ," & _
"TIPO= '" & Artsk2.txttipo & "' ," & _
"UM= '" & Artsk2.txtum & "' ," & _
"STOCK=" & zSTOCK & "," & _
"COSBANETTO=" & zCOSBANETTO & "," & _
"PROCOGN= '" & Artsk2.txtprocogn & "' ," & _
"PRONOME= '" & Artsk2.txtpronome & "' ," & _
"FLIPRETE=0 WHERE ARTCODI= " & art11!ARTCODI & ""

End Sub

Anche qui si fa ricorso a "MAKETEXTSDF":

'XXXUPDATE
'------------------------------------------------------------------------------------------------------------------------
Open Trim(txtTesti) & "\" & XXX & "UPDATE.TXT" For Output As #1
Print #1, "Sub " & XXX & "UPDATE()"
Print #1, ""

Set txtdb = OpenDatabase(DDD, False, False, "")
txttab = "select * from " & XXX & "FILE"
Set txtrcset = txtdb.OpenRecordset(txttab)

For i = 0 To txtrcset.Fields.Count - 1
'--
nome = txtrcset.Fields(i).Name
DIME = txtrcset.Fields(i).Size

'UPDATE numeri per values
'------------------
If txtrcset.Fields(i).Name <> "FLIPRETE" Then
Select Case txtrcset.Fields(i).Type

Case 7 'numero
testo = "If Len(" & XXX & "sk2.Txt" & nome & ".Text" & ")<>0 Then"
Print #1, testo
testo = "z" & nome & " = Str(virvalore(" & XXX & "sk2.Txt" & nome & ".Text" & "))"
Print #1, testo
testo = "Else"
Print #1, testo
testo = "z" & nome & " = Str(0)"
Print #1, testo
testo = "Endif"
Print #1, testo
Print #1, ""

Case 8 'data
testo = "If IsDate(" & XXX & "sk2.Txt" & nome & ".Text)" & " Then"
Print #1, testo

testo = "z" & nome & " = " & Chr(34) & "'" & Chr(34) & " & Year(" & XXX & "sk2.Txt" & nome & ".Text) & "
testo = testo & Chr(34) & "-" & Chr(34) & " & Month(" & XXX & "sk2.Txt" & nome & ".Text)& "
testo = testo & Chr(34) & "-" & Chr(34) & " & Day(" & XXX & "sk2.Txt" & nome & ".Text)&" & Chr(34) & "'" & Chr(34)
Print #1, testo

testo = "Else"
Print #1, testo

testo = "z" & nome & " =" & Chr(34) & "Null" & Chr(34)
Print #1, testo

testo = "End If"
Print #1, testo
Print #1, ""

End Select
'---
Else
testo = "zFLIPRETE=0"
Print #1, testo
End If 'FLIPRETE
Next i

'UPDATE update
'--------------------
Print #1, ""
testo = "'-------------------"
Print #1, testo
testo = "RsSQL = " & Chr(34) & "UPDATE " & XXX & "FILE SET " & Chr(34) & " & _ "
Print #1, testo

For i = 0 To txtrcset.Fields.Count - 1
nome = txtrcset.Fields(i).Name
If txtrcset.Fields(i).Name <> "FLIPRETE" Then

Select Case txtrcset.Fields(i).Type
'--
Case 7, 8 'numero, data
testo = Chr(34) & nome & "=" & Chr(34) & "&" & " " & "z" & nome & " &" & Chr(34) & "," & Chr(34) & " & _ "

Case Else 'testo
testo = Chr(34) & nome & "= '" & Chr(34) & " & " & XXX & "sk2.txt" & nome & " &" & Chr(34) & "' ," & Chr(34) & " & _ "
End Select
'---
Else
testo = Chr(34) & "FLIPRETE=0 WHERE ARTCODI= " & Chr(34) & " & art11!ARTCODI & " & Chr(34)
'---
End If 'FLIPRETE
Print #1, testo

Next
'------------
Print #1, ""
Print #1, "End Sub "
Close #1

Anche qui l' "ARTUPDATE" cosi' generato va ripulito dai campi che sono presenti nella Tabella ma non lo sono nell'"ARTSK2".

Se si cambia Tabella, per esempio "CLIFILE", si puo' usare ancora "MAKETEXTSDF" con la stessa Routine ma bisogna avere l'avvertenza di modificare la parte "WHERE ARTCODI" con "WHERE CLICODI". Per "FOUFILE",  ci vorranno entrambi i campi di ricerca, cioe' un "WHERE FOUANNO", un " AND" ed un "FOUNUM", etc.

42.6 Cancellazione di un Record

Per cancellare un Recordi dobbiamo ancora una volta bloccare "FLIPRETE" in "ARTSK1":

Private Sub cmdDele_Click()

On Error GoTo errori

'prepara maschera
'----------------
arttext
artfresca
arttext

'controlla rete
'----------------
If art11!FLIPRETE = 1 Then
MsgBox ("il Record in uso. attendere e ritentare")
Exit Sub
End If

'blocca rete
'--------------------
zARTCODI = art11!ARTCODI
RsSQL = "UPDATE ARTFILE set FLIPRETE=1 WHERE ARTCODI= " & zARTCODI & " "
CnSDF.Execute RsSQL
DoEvents

'art11!FLIPRETE = 1
'art11.Update

'mostra maschera
'--------------------
Artsk2.cmdConfDele.Visible = True
Artsk2.cmdAbandon.Visible = True
Artsk2.Show
Artsk1.Enabled = False

'routine errori
'------------------
Exit Sub
errori:
Select Case Err
Case 3167, 3021
MsgBox ("sorry. il Record nel frattempo stato" & acapo & " cancellato da un altro utente !")
art11.MoveFirst
Case Else
MsgBox ("errore imprevisto No. " & Err)
End Select

End Sub

Dopdiche' si procede alla cancellazione in "ARTSK2":

Private Sub cmdconfdele_Click()

'cancella
'-------------------------
zARTCODI = art11!ARTCODI
RsSQL = "DELETE FROM ARTFILE WHERE ARTCODI= " & zARTCODI & " "
CnSDF.Execute RsSQL
DoEvents
artfresca
art11.MoveFirst

'art11.Delete
'DoEvents

'bof
'--------------------------
If art11.BOF() Then
artvuoto = True
Artsk1.butfalse
Artsk1.cmdExit.Enabled = True
Artsk1.cmdNew.Enabled = True
Artsk1.Enabled = True
Unload Artsk2
End If

'ritorna a video lists
'------------------------
Artsk1.Enabled = True
Unload Artsk2

End Sub

E' necessario rinfrescare il Recordset e spostarsi sul primo record del DataGrid.

Se si cambia idea e si rinuncia alla cancellazione (lo stesso vale per la modifica) , occorre riportare il "FLIPRETE" a zero:

Private Sub cmdAbandon_Click()

If cmdConfEdit.Visible = True Or cmdConfDele.Visible = True Then
zARTCODI = art11!ARTCODI
RsSQL = "UPDATE ARTFILE set FLIPRETE=0 WHERE ARTCODI= " & zARTCODI & " "
CnSDF.Execute RsSQL
DoEvents

'art11!FLIPRETE = 0
'art11.Update
End If

Artsk1.Enabled = True
Unload Artsk2

End Sub

L'esempio sviluppato in questo Esercizio e' il piu' semplice possibile, per non sovraccaricare la didattica. Se se ne ha voglia ci si puo' cimentare, con gli strumenti qui appresi, su Progetti piu' ambiziosi.

Noi restiamo con VB6 e MDB.

 

Fine del Capitolo 42. ADO_SDF