Newsgroup: it.comp.lang.vo-clipper
Titolo: Se vi interessa !!!

Cari amici :
Per necessità personali io mi sono creato due metodi che usando l'array
aControls() con il FieldSpec, mi permettono di inserire dati in un DataBase
e di prelevarli ...
Per chi non lo sapesse l'array aControls contiene tutti i controlli di una
finestra e viene generato dalla finestra stessa.  Un FieldSpec contiene
tutte le caratteristiche di un campo di DataBase. Quando si generano i
controlli su una finestra con l'autolayout e scegliendo il DBServer, essi
vengono assegnati automaticamente ad ogni controllo che ne assume le
caratteristiche.  Con questi due metodi risparmio molto codice. Naturalmente
la condizione è che tutti i controlli che prevedono l'associazione ad un
FieldSpec, ne siano provvisti (Per i RadioButton si scrive il codice a
mano).
ecco il codice :
METHOD PutData() CLASS xxxEditWindow
   LOCAL a AS DWORD    // contatore dell'array
 FOR a := 1 UPTO ALen(SELF:aControls)
        IF ! Empty(SELF:aControls[a]:FIELDSpec)
   SELF:Server:FIELDPUT(AsString(SELF:Acontrols
;[a]:FIELDSpec:HyperLabel:Name),SELF:aControls[a]:Value)
  ENDIF
 NEXT
RETURN NIL
-------------------------------------------------------------
METHOD GetData() CLASS xxxEditWindow
 LOCAL a AS DWORD
 FOR a := 1 UPTO ALen(SELF:aControls)
  IF ! Empty(SELF:aControls[a]:FIELDSpec)
   IF ClassName(SELF:aControls[a]) == #MultiLineEdit
    SELF:aControls[a]:Value := AllTrim(SELF:Server:FIELDGET(AsString
;(SELF:Acontrols[a]:FIELDSpec:HyperLabel:Name)))
   ELSE
    SELF:aControls[a]:Value :=  SELF:Server:FIELDGET(AsString(SELF:Acontrols
;[a]:FIELDSpec:HyperLabel:Name))
   ENDIF
  ENDIF
 NEXT
RETURN NIL
Enio Donci

 ha scritto nel messaggio
news:dtMb7.140397$Pb6.7...@news1.tin.it...


Sarebbe utile parametrizzare i metodi per più di un server (e non solo per
self:server) instanziando i server che utilizza la finestra nella propria
classe.
Buona Idea ... molto stimolante !!!
Forse è possibile farlo poiché ogni FieldSpec, se creato all'interno di un
DBServer, ovviamente conosce a quale DBServer appartiene quindi....
A presto con questo ritocchino (se nel frattempo qualcuno si vuole
cimentare...ben venga)
Enio

 ha scritto nel messaggio
news:i3Ub7.139002$Qf6.8...@news2.tin.it...


Nell'implementazione dell'interfaccia per MySql ho implementato la
bufferizzazione dei dati ragionando così:
i dati vengono letti e popolano i controlli, il metodo notify del o dei
server se riceve un notifyfieldchange incrementa un array delle modifiche,
solo se decido di registrare le modifiche vengono effettivamnete scritte,
raggruppate in un unico comando update, insert o delete.
Questo è possibile perchè una tabella SQL non lavora mai direttamente sulla
tabella fisica.
L'array contiene {{la tabella, il campo,il valore variato, il record su cui
lavoro}}, così facendo viene inviato al server solo i comandi indispensabili
per apportare le modifiche.(L'array viene lavorato nel suo complesso) e non
riga per riga.
Ovviamente il discorso nella realtà è un pò più complesso, deve tenere conto
di ripensamenti dell'operatore, nuovi inseriemnti etc,concellazioni e
recall, ma funziona e genera solo il traffico di rete effettivamente
necessario.
Per i BDF non è difficile fare la stessa cosa.
Per i campi non presenti nelle finestre ho due metodi : AllaRegistrazione e
ARegistrazioneAvvenuta che completano il quadro.
La mia regola è toccare le tabelle solo per quello che è necessario non un
Byte di più, soprattutto in rete o in accesso remoto.
Danilo Giuliani