Newsgroup: it.comp.lang.vo-clipper
Titolo: Problema con MySQL e BrowseView

Ho dei problemi utilizzando una subdatawindow per il browse di una
tabella MySQL con le librerie di Danilo Giuliani.
Ho una finestra (DataWindow) associata a un server MySQLSelect
In questa finestra metto un bottone "AGGIUNGI RECORD" e una
subdatawindow che usa lo stesso server della finestra owner (share
owner). Se clicco sul bottone viene chiamato un metodo che fa
semplicemente SELF:SERVER:APPEND()
Non funziona. Mi compare una nuova riga nel database ma se provo a
scriverci sopra mi da errore, se do il commit() la riga nuova scompare
e nel database il record non viene aggiunto. Per funzionare (e con
qualche problema) devo scollegare il server dalle due finestre, fare
l'append e ricollegarlo. Se uso gli ODBC funziona tutto alla
perfezione.
Tra l'altro la tabella per poter funzionare nell'append deve avere per
forza un campo chiave e se non sbaglio anche un campo
autoincrementante. Inoltre dopo l'append devo OBBLIGATORIAMENTE
assegnare un valore ad almeno un campo altrimenti il record non viene
memorizzato, e col commit la riga sparisce.
Qualcuno puo' darmi una mano? Mi dispiacerebbe dover abbandonare le
librerie di Danilo, che per il resto funzionano benissimo e sono pure
molto piu' veloci degli ODBC.
 
-- 
Ignazio GSS© * More than 90 HiRes images in my home page  
http://www.ipuddu.it
200 Images of digestive endoscopy
http://www.areamedica.com/Atlante/Atlante.htm

 ha scritto nel messaggio 
news:rdjhq0htak33uv0la...@4ax.com...


Per la browse controlla bene perchè non vedo problemi
Ho controllato un milione di volte, la subdatawindow da problemi
enormi. Se non faccio un self:USE() prima dell'append() mi succede un
casino
in pratica, mettiamo che le finestre siano 
Wind1  (Finestra principale owner di Wind2)
Wind2 (Subdatawindow)
Entrambe usano lo stesso oServer (ottenuto con una MySQLSelect)
Se metto un bottone [AGGIUNGI] su Wind1 che chiama il codice
SELF:SERVER:APPEND()
non funziona, non appende nulla, appare una riga e se ci clicco sopra
per immettere un dato mi da errore).
Per farlo funzionare devo fare
LOCAL oServ as MySQLServer
oServ:SELF:SERVER
SELF:Use()
oSFWind2:USE()
oServ:Append()
SELF:USE(oServ)
oSFWind2:USE(oServ)
Un po' scomodo mi pare.
E poi un altra cosa. Se ho una browseview e modifico un record, passo
a un altro record e lo modifico, e poi provo a rimodificare il primo
appena ci clicco sopra mi riporta il valore che aveva PRIMA dellla mia
modifica. Con gli ODBC questo non avviene e si comporta normalmente
come coi DBF (stesso codice). Sbaglio qualcosa io?
Se vuoi metto online una piccola applicazione d'esempio.


Per farlo funzionare devo fare
Avevo dimenticato qualche riga: occorre anche mettere un valore in un
campo. 
La finestra OWNER (una DataDialog) contiene una SubDataWindow (una
datawindow) che si chiama Sub_Form1. Titolo e' un campo di tipo
VarChar "ALLOW NULL".
Il codice funzionante e':
LOCAL oErrBox AS ErrorBox
LOCAL MioSrv AS MySqlSelect
MioSrv:=SELF:Server
// Togliendo la riga successiva che scollega il server dalla 
// finestra subdatawin si ottiene errore.
oSFSub_Form1:Use()
IF !MioSrv:Append()
	oErrBox := ErrorBox{SELF, "Non riesco ad aggiungere il
Record"}
	oErrBox:Show()
	RETURN
ENDIF
MioSrv:Titolo:="Nuovo Record"
MioSrv:Commit()
oSFSub_Form1:Use(MioSrv)
L'errore che si ottiene se non si sconnette il server dalla
subdatawindow e':
=======================================
Error message:
--------------
Error Code:  33 [ DATA TYPE ERROR ]
Subsystem: BASE
Function: SEND
Argument: {(0x0000)0xCCCC0047} CLASS InValidVoObject
Type: OBJECT
Argument Number: 1
CallStack: 
APP:START (Line: 5)
START (Line: 8)
Error Object created:
--------------------
SubSystem       :BASE
SubCode         :0
GenCode         :Data type error
OsCode          :0
ArgType         :OBJECT
FuncPtr         :0x0002D321
ArgNum          :1
FuncSym         :SEND
Severity        :0
CanDefault      :.F.
CanRetry        :.F.
CanSubstitute   :.T.
Operation       :
Description     :
FileName        :
Tries           :0
FileHandle      :0
SubCodeText     :
Arg             :{(0x0000)0xCCCC0047} CLASS InValidVoObject
ArgTypeReq      :OBJECT
MaxSize         :0
SubstituteType  :NIL
CallFuncSym     :
--------------------


Ignazio come apri il server?
Danilo
Per l'aggiunta di uno vuoto fai direttamente da un qualsiasi gestore di 
database
insert into miatabella e vedi se funziona,
non può e NON DEVE funzionare che senso ha una riga vuota. A che serve se 
non ad appesantire e basta.
Danilo 

 Pero' con gli ODBC funziona. Ricontrollero'.
Forse dipende dai vincoli che hai imposto alla tabella nel database
stesso? Se hai posto anche un solo campo come obbligatorio allora non
puoi ovviamente inserire un record vuoto.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

non ad appesantire e basta.
Ma per riempirla questa benedetta riga, la dovro' prima creare vuota o
no? :-)
Ho una finestra di browse, e devo aggiungere una riga per poter
consentire di inserire nuovi dati nel nuovo record. 
Nota bene che lo stesso codice con gli ODBC funziona perfettamente.
Prova e vedi.
Comunque non e' solo questo il problema, il problema grosso e' che se
creo un nuovo record in un server collegato a una subdatawindow in
browse, ottengo errore. Per funzxionare il server devo scollegarlo e
poi ricollegarlo alla finestra. E' scomodo, anche se funziona.
Poi c'e' un altro problema. Se aggiungo un record a una tabella che ha
almeno un record tutto va bene, se invece la tabella e' completamente
vuota nella browse dopo il primo append() appare solo il primo record
aggiunto e per vedere gli altri creati devo chiudere la finestra e
riaprirla.


puoi ovviamente inserire un record vuoto.
Ma il problema principale non e' il record vuoto (basta mettere un
valore "dummy" in un campo e poi il commit funziona). Il problema VERO
e' che con le subdatawin ci sono grossi guai durante l'append, da'
proprio errore se non sganci il server dalla subdatawin.


 proprio errore se non sganci il server dalla subdatawin.
Scusa, allora non posso aiutarti.


Scusa, allora non posso aiutarti.
Ho fatto un altro passo avanti:
Basta sospendere le notifiche del server durante l'append fino a che
non metto un valore nel campo e cosi' funziona:
METHOD Aggiungi( ) CLASS ProvaSQL
LOCAL oErrBox AS ErrorBox
LOCAL oMioSrv AS MySqlSelect
oMioSrv:=SELF:Server
oMioSrv:SuspendNotification()
IF !oMioSrv:Append()
    oErrBox := ErrorBox{SELF, "Non riesco ad aggiungere il Record"}
    oErrBox:Show()
    RETURN
ENDIF
oMioSrv:Titolo:="Nuovo Record"
oMioSrv:ResetNotification()
oMioSrv:Commit()


non metto un valore nel campo e cosi' funziona:
Probabilmente la subdatawin fa un commit() in automatico quando gli
arriva la notifica dell'append prima che venga messo un valore in un
campo e questo fa crashare il programma.
