Página 1 de 1
oDBBrowse:Insert() no funciona correctamente
Publicado: Sab Oct 22, 2016 11:59 am
por XeviCOMAS
Buenas, mucho tiempo sin escribir... sera por que hasta hoy no me he dado de canto con los dientes
Pues liado con el tema de hacer mi aplicación funcional ya sea con DBFs, SQLite o MariaDB, segun me de el caso de mis clientes o hasta no ser 100% operativo a los 3 motores, seguira funcionando con mis queridas DBFs...
Resulta que por mas que pruebo, estoy atorado y me decido a probarlo en el Sample de Xailer, cuando veo que no es error de mi programación, sinó que en ese Sample también ocurre.
Decir que estoy utilizando Xailer 3.3.1.
El problema esta en el método Insert() de un DBBrowse. Su funcionamiento correcto seria de "INSERTAR" una linea para editar un nuevo registro... pues no es así, el comportamiento de INSERT() en el DBBrowse es el de APPEND(), o sea se va al final del browse a crear ese nuevo registro.
de hecho, en el BrwEdit de Samples de Xailer, he añadido un boton nuevo en la pestaña DataSets que OnClick = {|| ::oDBBrowse1:Insert() }
y refleja perfectamente esta anomalia.
El comportamiento en el DbfBrowse es correcto, como el ArrayBrowse, NO así el DBBrowse
adjunto sample con el añadido.
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Sab Oct 22, 2016 2:53 pm
por jvtecheto
Hola amigo:
Yo creo que es debido a que la propiedad lAllowInsert esta asignada a .F. (False) en modo diseño, puedes cambiarla a .T. y veras como funciona bien
Al menos a mi, si que me funciona.
Saludos y feliz fin de semana.
Jose Vte.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Sab Oct 22, 2016 7:30 pm
por XeviCOMAS
Jose,
No, NO es eso... el sample que he adjuntado, aunque se cambie la propiedad lAllowInsert a .T. el metodo Insert() continua comportándose como el Append()
Si a ti te funciona el Sample que he adjuntado, por favor, dime en que version de Xailer lo estas compilando, porque corriendo con la 3.3.1 no funciona correctamente.
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Dom Oct 23, 2016 12:42 pm
por XeviCOMAS
Acabo de descargar la DEMO de la version 4 de Xailer, con su respectivo Harbour...
El comportamiento anómalo persiste.
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Dom Oct 23, 2016 3:34 pm
por jvtecheto
Cierto Xevi.
No funciona, pero te puedo asegurar que ayer me funcionaba perfectamente.
Hoy volviendo a instalar el ejemplo limpio sin ninguna modificación y probando con el botón no funciona.
Se comporta como un Append().
Tienes razón, lo que no se es porque ayer funciono. :oops: , perdona por la información errónea.
Saludos.
Jose Vte.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Mar Oct 25, 2016 2:29 pm
por XeviCOMAS
Ignacio,
alguna solución???
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Lun Oct 31, 2016 5:31 pm
por XeviCOMAS
Vaya, vaya... ni p*** caso!!!

Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Lun Nov 07, 2016 7:14 pm
por XeviCOMAS
Arriba!!!
A ver alguien del equipo lo ve y lo contesta.
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Mié Nov 16, 2016 5:34 pm
por XeviCOMAS
Otra vez arriba!!!
A ver si alguien puede contestar este mensaje, si se trata de bug, clase inacabada,...
En fin, así sigo.
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Mié Nov 16, 2016 10:07 pm
por jvtecheto
Hola amigo Xevi:
Dos cosas, una la gente no esta mucho por ayudar, ya se que es libre y tal no perdáis tiempo, otra si es un bug como parece el equipo Xailer debería de tenerlo en cuenta.
Raro es que nadie se haya dado cuenta hasta ahora de dicho comportamiento.
A ver si acotamos el problema.
En la ayuda de Xailer La clase TDBBrowse no tiene explicado el método Insert, supongo que será porque deriva de TBrowse y allí si esta explicado pero dice que no tiene ningún parámetro y si
vamos a los fuentes del DBBrowse tiene este código:
METHOD Insert( lFromUser ) CLASS XDBBrowse
LOCAL xRet
xRet := ::OnInsert()
IF Valtype( xRet ) == "L" .AND. !xRet
RETURN .F.
ENDIF
RETURN ::Append( lFromUser )
Como podemos ver se le puede pasar un parámetro lógico, también a Append(lFromUser), Delete....
Mirando el código vemos esta línea
xRet := ::OnInsert()
Con lo poco de Xailer que se...
OnInsert() es un evento y se refiere al formulario ¿No?, esto debería de devolver un valor lógico,
pero el formulario no tiene el evento OnInsert(), al menos eso creo....
pero si seguimos investigando vemos que al final comprobando que xRet no tenga valor .T. o .F.
RETURN ::Append (lFromUser)
creo que significa que el método Insert al final llama al método Append
con lo cual seria un Bug y el equipo Xailer debería arreglarlo.
No se si te he aclarado algo o te he liado mas, de todas formas estoy contigo.
saludos.
Jose Vte.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Jue Nov 17, 2016 4:01 am
por gabo1
Xavi,
Quizas nadie conteste, por que la mayoria (incluyendome a mi) damos por sentado que el metodo <Insert> hace un <append> a la tabla.Quizas en concepto deberia ser tal y como el metodo se indica "Insertar" un registro en la posicion que se encuentre el cursor. pero si no estoy equivocado el metodo insert siempre se portado haciendo un append. Para que se realice un proceso como tu quieres, te lo tienes que trabajar con codigo. De manera automatica no existe para las tablas o al menos yo no lo conozco.
Saludos!
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Vie Nov 18, 2016 12:45 pm
por Carlos Ortiz
Estimados no es un error, Insert siempre fue un append a la tabla, si queres insertar algo entre medio tendras que hacerlo, como tal no existe ni existió en ninguna version de Xailer ni similares anteriores (desde clipper S 87 a la fecha) si hubo en las nanfor lib un browse que hacia eso o algun browse recontra tuneado de manuel mercado pero son todas cosas de terceros.
Saludos
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Vie Nov 18, 2016 2:35 pm
por jvtecheto
Carlos, Gabo
Gracias por participar, supongo que teneis razón en lo del Metodo Insert() y mas viendo el código de la clase. Desde luego en Clipper
no existio nunca , al menos yo nunca tuve constancia de ello.
Pero entonces..., ¿Cuál es la necesidad del mismo?, si hace lo mismo que el Append(), no logro entenderlo, si hay que programarlo
ya se lo hara el que lo necesite., tampoco estaría de mas que se añadiera, a ver si el equipo Xailer tiene un segundo y nos dice
su opinión sobre el asunto.,
Carlos , tengo que comentarlo, Has hablado de Manuel Mercado, que se hizo de este, era gran programador, bueno para mi,
hizo aportes a la comunidad luego prometio un IDE Visual y algo paso.
luego que no supe mas de el.
Saludos.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Vie Nov 18, 2016 3:00 pm
por ignacio
Solo funciona con matrices, es decir, con TArrayBrowse. En el resto de los casos su comportamiento es idéntico a Append. No obstante se pueden sobrecargar los eventos de la clase para conseguir el efecto deseado, según el caso.
Saludos
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Vie Nov 18, 2016 4:57 pm
por XeviCOMAS
Ignacio, como bien dices, funciona con TArrayBrowses...
PERO, también con TDbfBrowses, por lo que lo he estado usando hasta hoy perfectamente.
El cambio que estoy haciendo ahora de utilizar directamente los DataControls i Datasets que me proviene Xailer es ahí que echo en falta este evento, pues la carencia de él me cambia el sistema de entrada de datos que tengo acostumbrados a mis clientes.
Si no es mucho pedir, la implementación de ese evento... para vosotros, equipo Xailer es tarea fàcil, creo. Si me pongo yo en ello, voy a estropear más que arreglar
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Sab Nov 19, 2016 12:40 pm
por ignacio
Las operaciones de inserción no tienen mucho sentido en Dbfs debido a los índices activos y a la imposibilidad de los ficheros dbf de insertar registros. Cualquier operación de este tipo debe de tratarse íntegramente con código ad-hoc.
Un saludo
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Mar Nov 22, 2016 10:02 am
por XeviCOMAS
Ignacio,
pues te puedo asegurar que en TDbfBrowses està funcionando perfectamente el método Insert, refrescando perfectamente el Browse con el índice activo.
Yo me estoy peleando con el método en la clase TDBBrowse, pero no me sale.
Gracias.
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Mar Nov 29, 2016 2:42 pm
por XeviCOMAS
Teneis previsto que funcione, (de manera al ArryaBrowse o TDbfBrowse), Insert() en los TDBBrowses en la próxima versión???
Un Saludo,
Xevi.
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Mié Nov 30, 2016 9:58 am
por ignacio
Buenos días Xavi,
De forma categórica te digo que no. Y no porque no quiera, sino porque no se puede. Es imposible dar una solución general a este problema. He intentado explicarme y no lo he conseguido.

Siento no saber explicarme mejor.
Un saludo
Re: oDBBrowse:Insert() no funciona correctamente
Publicado: Jue Dic 01, 2016 7:01 pm
por XeviCOMAS
Ignacio,
igual he sido yo quien no me he explicado lo suficiente. No veo demasiada complicación en adaptar ese evento en el DBBrowse por un equipo como el vuestro.
Yo me he puesto hoy a "toquetear" las clases, y después de detectar que alguna clase facilitada en los fuentes no "cuadran" con las que son funcionales en mi Xailer 3.3.1... me he salido con la mia
Visto lo poco que se y entiendo, ya tengo funcionando y operativo el Insert en los DBBrowses, funcionando en DBFs, SQLite (MariaDB supongo que tambien, lo provaré)
Seguro que lo he hecho "a palos", pero funciona. Seguro que si le hechais una hojeada lo pulís como maestros que sois, vaya, si quereis.
Adjunto el Sample de Xailer Browses, modificado, funcionando, incluso si se ordenan las columnas, al insertar el registro se posiciona correctamente en su orden, esto es cosa del Browse mismo.
el código...
CLASS TDBBrowse FROM XDBBrowse
METHOD Insert( lFromUser )
ENDCLASS
//--------------------------------------------------------------------------
METHOD Insert( lFromUser ) CLASS TDBBrowse
//Metodo Insert de TDbfBrowse
LOCAL xRet
DEFAULT lFromUser TO .F.
xRet := ::OnInsert()
IF Valtype( xRet ) == "L" .AND. !xRet
RETURN .F.
ENDIF
IF ! ::lAllowInsert .AND. lFromUser
RETURN .F.
ENDIF
IF ::lEditMode .OR. ! ::IsEditable()
RETURN .F.
ENDIF
::DrawLine( Nil, .F. )
::nEditMode := beINSERT
::nPhantomRow := ::nRowSel
::Refresh()
* ::Edit( lFromUser ) //No entramos en edición
//Fin evento Insert de TDbfBrowse
If ::oDataSet:ClassName() == "TDbfDataSet"
//Metodo Append de TDBBrowse... modificando Append por Edit
//Funciona en DBBrowses DBFs, però no en SQLite ni MariaDB
IF ::oDataset == Nil .OR. !::oDataSet:lOpen .OR. ::oDataset:lReadOnly
RETURN .F.
ENDIF
* IF !::Super:Append( lFromUser )
IF !::Super:Edit( lFromUser )
RETURN .F.
ELSE
IF ::lAutoSave .AND. !::oDataSet:AddNew() // AddNew... lanza error "Already in Edit Mode [#0]"
RETURN .F.
ENDIF
ENDIF
::Refresh()
//Fin evento Append de TDbfBrowse
Else //::oDataSet:ClassName() == "TSQLTable"
::Edit( lFromUser )
AEval( ::aCols, {|x| x:oGridEdit:cText := "" } )
::oDataSet:Blank()
::oDataSet:oRecords:AddNew()
::Refresh()
EndIf
RETURN .T.
Un Saludo,
Xevi.