Newsgroup: it.comp.lang.vo-clipper
Titolo: è possibile cambiare server in ...

 
          ciao,
la domanda può sembrare stupida ma mi ficco sempre in situazioni
particolari.
sto sviluppando la fatturazione ed ho creato una dataw che contiene alcune
sle che pescano dall'archivio fatture. Nella stessa dataw ci sono due sub
browse:
il primo visulizza i restanti dati dell'archivio fatture, il secondo
relazionato sul primo visualizza il dettaglio del precedente (un classico).
Siccome la gestione delle fatture e delle ricevute fiscali è identica ma su
2 archivi distinti
mi era venuto in mente di mettere in testa alla dataw 2 bei radiobutton:
rbfatture e rbricevute. l'idea era quella che premendo su ricevute tutto si
aggiornasse con un semplice cambio di server.... invece un bel casino.
sigh... credo che non sia invece così banale la cosa... o no?
the fisher
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 sigh... credo che non sia invece cosě banale la cosa... o no?


> spero di essere stato utile
Massimo, mi sei sempre utilisissimo.
avevo già abbozzato una soluzione tipo la tua, solo che io sbagliavo il
sistema per aprire i file. ora ho corretto tutto e funziona quasi tutto....
ho solo un piccolo problema da risolvere.
intanto ho messo come auto i server nella dataw e nei 2 browser, poi un pò
di codice:
  METHOD PostInit(oWindow,iCtlID,oServer,uExtra) CLASS fattura
	//Put your PostInit additions here
	SELF:use(fatture{})
	SELF:oCCrbfatt:Pressed:=TRUE
	SELF:oSFbrowdet:use(vocif{})
	SELF:oSFbrowdoc:use(SELF:Server)
	RETURN NIL
con questo inizializzo la finestra ad aprirsi sulle fatture, passo al browse
dettagli il server
e al browse con l'elenco delle fatture il server della dataw.
pongo il radiobutton fatture a pressed.
poi
METHOD ButtonClick(oControlEvent) CLASS fattura
	LOCAL oControl AS Control
	oControl := IIf(oControlEvent == NULL_OBJECT, NULL_OBJECT,
oControlEvent:Control)
	SUPER:ButtonClick(oControlEvent)
	//Put your changes here
 
	IF ocontrol:NameSym = #rbfatt
 
		SELF:Server:close()
		SELF:oSFbrowdet:Server:close()
                                           SELF:use(Fatture{})
		SELF:oSFbrowdet:use(vocif{})
		SELF:osfbrowdet:SetSelectiveRelation(osfbrowdet,#num)
		SELF:oSFbrowdoc:use(SELF:Server)
                                         SELF:Server:gotop()
		SELF:oSFbrowdoc:Browser:refresh()
		SELF:oSFbrowdet:Browser:refresh()
 
	ELSEIF ocontrol:NameSym = #rbrice
 
                                          SELF:Server:close()
		SELF:oSFbrowdet:Server:close()
		SELF:use(ricevute{})
		SELF:oSFbrowdet:use(vocir{})
		SELF:osfbrowdet:SetSelectiveRelation(osfbrowdet,#num)
		SELF:oSFbrowdoc:use(SELF:Server)
		SELF:Server:gotop()
		SELF:oSFbrowdoc:Browser:refresh()
		SELF:oSFbrowdet:Browser:refresh()
 
	ENDIF
alla pressione di uno o dell'altro rb cambio dei server, relazione e refresh
e tutto funziona.
il problema sta nel fatto che il browsedoc ha un campo codice_cliente che
deve essere cambiato con il cognome e nome.
quindi ho dichiarato una protect ocserver as clienti in definizione di
classe di browdoc,
nel preinit gli ho messo self:ocserver:=clienti{} e infine un
access cserver class browdoc
return self:ocserver.
nella proprietà block della colonna gli ho messo {|x| trovac(x)}
e come block owner: self
poi la funzione:
 FUNCTION trovac(obrowser AS OBJECT) AS STRING
 LOCAL nome AS STRING
   IF obrowser:cserver:seek(obrowser:server:cco)
nome:=RTrim(obrowser:cserver:rs_co)+" "+RTrim(obrowser:cserver:nom)
ELSE
nnome:=""
ENDIF
qui la obrowser:server:cco mi ritorna error 19, variabile non inizializzata
vale a dire obrowser:server non contiene nulla.
al momento in cui scrivo non sono ancora riuscito a sbrogliare il problema
anche se credo che abbia a che fare con questa linea:
SELF:oSFbrowdoc:use(SELF:Server)
booh
ciao
Stefano the.fisher



Di solito io utilizzo dei metodi e non delle funzioni, ma credo che basti 
inserire prima del seek:
IF oBrowser != NULL_OBJECT
endif
Ciao.
                        Francesco

 SELF:oSFbrowdet:Browser:refresh()
quando fai SELF:oSFbrowdoc:use(SELF:Server) stai aprendo un'altra istanza
dello stesso server che è già aperto in SELF:use(Fatture)
non è il massimo, e comunque DEVE essere shared
use vuol dire apri
forse basta un link ad un server già aperto?
aggiungerei comunque dei controlli quando fai una "use" per vedere se è
riuscita l'apertura.... else errore
confermo suggerimenti di Infoservice: meglio dei metodi che delle funzioni
attenzione: se i server sono creati senza gli access / assign dei campi è
meglio usare la Fielget(#nomecampo)
anzichè la sintassi
RTrim(obrowser:cserver:rs_co)+" "+RTrim(obrowser:cserver:nom)
meglio
RTrim(SELF:obrowser:cserver:FIELDGET(#rs_co))+"
"+RTrim(SELF:obrowser:cserver:FIELDGET(#nom))
ricordati di chiudere i server nel metodo Close() della DW


ACCESS CognomeNome CLASS MioServer
RETURN trim(SELF:cognome)+' '+SELF:nome
forse è più breve?


 ha scritto nel messaggio 
news:4433c144$0$18286$4faf...@reader1.news.tin.it...

Non ero entrato nel merito del codice, ma solo nel tipo di approccio e del 
problema...... :-)
Bye
                            Francesco 

> forse basta un link ad un server già aperto?
nel metodo init della finestra e del browser però vengono aperti così, mi
fai un esempio del link?
per quanto rigurda i metodi uso esclusivamente quelli, tranne quando ho un
browser
con un campo numerico che invece deve pescare in un altro archivio una
stringa.
al mio stato di conoscenza ancora non so come farlo senza la funzione che ho
riportato prima.
anche qui 2 righe di codice non ci starebbero male.
il fulcro del problema mi sta nel fatto che quando cambio i server nel
buttonclick, e faccio i refresh l'oggetto obrowser:server passato dal code
block non viene aggiornato.
grazie intanto per le dritte





 Massimo Bighelli


Scusa ma hai provato a usare i dbserver, usando:
setorder o setindex ed un bel seek anzichč istanziarli nell'altra maniera?
Ciao
Massimo
Area Medica Soft 


si, ma non va uguale.
sempre lo stesso problema, quando mi reflesha il browdoc non aggiorna il
server
del block.
in + ho notato questo:
self:server:close() .t.
? self:server -> nada oppure
self:osfbrodoc:ownerserver:close() .t.
? self:server -> nada
self:osfbrowdoc:server:close() .t.
? self:osfbrowdoc:server -> fatture ????????????????
difronte ai misteri della "fede" rinuncio a capire.
mo rimetto tutto come prima stesura, poi per chi volesse dare uno sguardo
non ho problemi a mandare gli aef e i server interessati.
nel frattempo me la progetto come split.
Massimo, grazie cmq.
ciao Stefano


 VITTORIA!!!!!!!!!!
finalmente dopo 8 gg di combattimenti ho raggiunto il mio obiettivo emulando
una split windows
faccio una premessa
la cosa stranissima č che: funzione, metodo, relation che fosse al cambio di
server nonostante acquisisse il valore corretto da visualizzare tramite il
refresh() nel browdoc
poi metteva in tutte le righe l'ultimo cliente selezionato prima del cambio.
essendomi rotto sufficientemente ho fatto cosě:
ho scollegato dalla subform della dw la browdoc (rinominandola browfat), ho
dichiarato una protect
wbrowdoc come datawindow
ed una export con il server dei clienti ed in post init ho messo:
 wbrowdoc:=browfat{SELF:oSFSub1,,SELF:Server)
 wbrowdoc:show()
poi ho creato una 2° dw , browric identica a browfat
al cambio server, metodo buttonclick
ho fatto
        SELF:Server:close()
        SELF:oSFbrowdet:Server:close()
        SELF:wbrowdoc:EndWindow()
        SELF:use(ricevute{})
        wbrowdoc:=browric{SELF:oSFSub1,,SELF:Server}
        wbrowdoc:show()
        SELF:oSFbrowdet:use(vocir{})
        SELF:SetSelectiveRelation(osfbrowdet,#num)
        SELF:oSFbrowdet:Browser:refresh()
in entrambe le finestre nei metodi block e blockowner ho messo
rispettivamente
{|x| trovac(x)} e self:owner
e tutto fila alla perfezione come deve.
l'ultima cosa da provare, per sfizio, e se posso eliminare una finestra. ma
intanto mi va bene cosě. FINALMENTE
stefano - the.fisher
