In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Cliente MySQL de Xailer incompleto.
Cliente MySQL de Xailer incompleto.
Estoy haciendo un abm de una tabla de MySQL usando la clase TSQLTable y todo va bien excepto porque cuando doy una alta de un renglón cuya clave (primary key) se duplica, el programa aborta. Busco en la clase TSQLTable algún método que me permita hacer el SEEK que prevenga esta situación, pero al parecer a pesar de que es un dataset, en esta clase no existe nada con que verificar si ya existe con anterioridad en el record set la clave que se está dando de alta.
Alguien me puede decir cómo hacer el truco, pues parece que el cliente MySQL de Xailer está incompleto.
Alguien me puede decir cómo hacer el truco, pues parece que el cliente MySQL de Xailer está incompleto.
Saludos amigos.
-
- Mensajes: 148
- Registrado: Mar Dic 18, 2007 4:39 pm
Cliente MySQL de Xailer incompleto.
Saludos amigo... Usa el Metodo LOCATE asi oDS:Locate( "Campo = 123" ) retorna .T. o .F. depende del caso...
Cliente MySQL de Xailer incompleto.
//------------------------------------------------------------------------------
METHOD CveItemExit( oSender, oNextCtl ) CLASS TFormItems
LOCAL cQuery
cQuery:= AppData:oMySqlDSMain:QueryValue( "SELECT id_item FROM articulos WHERE id_item='" + oSender:value + "'" )
IF cQuery == oSender:value
MsgAlert("Clave del artículo ya existe en la tabla... por favor verifique")
RETURN .F.
ENDIF
RETURN Nil
Un Saludo
-
- Mensajes: 266
- Registrado: Mar Oct 28, 2008 4:41 am
Cliente MySQL de Xailer incompleto.
Si trabajas con TSQLTable, puedes usar Locate como te menciona nuestro
camarada Diego Ferreira.
Te pongo algo mas explicado.
cfactura="A0001" //// Esto tambien lo puedes usar con un objeto, Ejemplo
::Factura:Value
If ::miDataset:Locate("documento='"+cfactura+"' "=.t. ////
documento es el campo de la tabla.
Msinfo("El número de factura ya existe")
Return .t.
Endif
Tambien te aconsejo que no uses TSQLTable, en su lugar usa TSQLquery,
puesto TSQLTable al iniciar tu formulario se tarda, claro esto es si en tu
tabla tienes muchos registros.
Espero ser util.
Saludos.
camarada Diego Ferreira.
Te pongo algo mas explicado.
cfactura="A0001" //// Esto tambien lo puedes usar con un objeto, Ejemplo
::Factura:Value
If ::miDataset:Locate("documento='"+cfactura+"' "=.t. ////
documento es el campo de la tabla.
Msinfo("El número de factura ya existe")
Return .t.
Endif
Tambien te aconsejo que no uses TSQLTable, en su lugar usa TSQLquery,
puesto TSQLTable al iniciar tu formulario se tarda, claro esto es si en tu
tabla tienes muchos registros.
Espero ser util.
Saludos.
Cliente MySQL de Xailer incompleto.
Diego, Gabo y Pedro:
Les agradezco cumplidamente su ayuda, voy a modificar mi abm con sus recomendaciones, solo me queda la inquietud de que un Locate puede ser costoso en una tabla muy grande, la solucion de Select es mas rapida, pero siendo TSQLTable un dataset que hereda de la clase TDataSet ¿no deberia tener un metodo Seek como TDbfDataSet?
Gracias por responder.
Les agradezco cumplidamente su ayuda, voy a modificar mi abm con sus recomendaciones, solo me queda la inquietud de que un Locate puede ser costoso en una tabla muy grande, la solucion de Select es mas rapida, pero siendo TSQLTable un dataset que hereda de la clase TDataSet ¿no deberia tener un metodo Seek como TDbfDataSet?
Gracias por responder.
Saludos amigos.
-
- Mensajes: 266
- Registrado: Mar Oct 28, 2008 4:41 am
Cliente MySQL de Xailer incompleto.
Sergio, con gusto apoyamos.
Unos tips que tome de una pagina web fueron:
1.. Consultar solo la informacion necesaria, en vez de hacer select * from
mi_tabla where micampo="A0001" es mejor hacer select campo1,campo2 from
mi_tabla where micampo="A0001". (claro que mi_tabla tiene 10 campos, pero
solo quiero la informacion de los campos 1 y 2, por decir.
2.. Crear tus indices lo mas optimizado posible. (Esto por ejemplo:
Conforme al ejemplo de consulta arriba mencionado, tu indice debe de crearse
por mi_campo)
Otro ejemplo de indice: si hago esto Select campo1,campo2 from
mi_tabla where factura="A0001" and estatus="C" (Tu indice tiene que ser por
factura,estatus)
Te pongo algo que yo utilizo en unos proyectos.
Esto es trabajando con TSQLquery, y lo uso solo para obtener informacion de
una tabla y cargarla en alguna variable.
Asi mismo te recomiendo que hagas tu conexion con tu base de datos desde el
prg principal:
Ejemplo:
AppData:AddData("base",TMariaDBDataSource():Create()) /// utilizo
Mariadb
WITH OBJECT AppData:Base //Defino propiedades del DataSource
:cDatabase :="mi_bd"
:cHost := "mi_servidor" /// tambien puede ir la ip del servidor
:cPassword := "mi_password"
:cUser := "mi_usuario"
:nPort=3306
:lDisplayErrors=.f.
:nTimeOut=1000
IF !:Connect()
MSGSTOP('NO SE PUEDE CONECTAR AL SERVIDOR')
QUIT
else
ENDIF
END WITH
Despues de que ya tienes tu conexion iniciada, la puedes usar desde
cualquier formulario.
Ejemplo:
METHOD BtnBmp3Click( oSender ) CLASS pruebas
Local cConsulta,cFactura,nombre,fecha
cFactura="A001"
cConsulta=AppData:Base:Query("Select campo1,campo2,campo3
from mi_tabla where factura='"+cFactura+"' and estatus='C' ")
cConsulta:Open()
If cConsulta:Reccount()>0 /// ESTO SIGNIFICA QUE
SI SE ENCONTRO REGISTROS EN LA CONSULTA
Msginfo("La factura digitada esta cancelada")
Return .t.
Endif
DE LO CONTRARIO SI NO ESTA CANCELADA LA FACTURA, ENTONCES
PONES LA INFORMACION QUE QUIERAS.
nombre=cConsulta:Campo1
fecha=cConsulta:Campo2
RETURN Nil
De esta manera se que la factura que digito el usuario esta cancelada.
Este metodo me ahorra estar agregando Datasets a un formulario de solo
consulta minima.
Ya si se requiere usar ediciones y agregaciones o borrado de registros, usa
los dataset que pone Xailer (TSQLquery)
Espero no haberme enrollado, esto es solo un ejemplo, pues cada programador
tiene su estilo.
Todo este avance que llevo lo he aprendido aqui con todos los colegas que
disponen de humuldad y conocimiento, y con gusto lo comparten.
Y en verdad te digo, Mysql es muy rapido y tiene las ventajas de conexiones
remotas sin usar software de terceros.
Saludos.
Unos tips que tome de una pagina web fueron:
1.. Consultar solo la informacion necesaria, en vez de hacer select * from
mi_tabla where micampo="A0001" es mejor hacer select campo1,campo2 from
mi_tabla where micampo="A0001". (claro que mi_tabla tiene 10 campos, pero
solo quiero la informacion de los campos 1 y 2, por decir.
2.. Crear tus indices lo mas optimizado posible. (Esto por ejemplo:
Conforme al ejemplo de consulta arriba mencionado, tu indice debe de crearse
por mi_campo)
Otro ejemplo de indice: si hago esto Select campo1,campo2 from
mi_tabla where factura="A0001" and estatus="C" (Tu indice tiene que ser por
factura,estatus)
Te pongo algo que yo utilizo en unos proyectos.
Esto es trabajando con TSQLquery, y lo uso solo para obtener informacion de
una tabla y cargarla en alguna variable.
Asi mismo te recomiendo que hagas tu conexion con tu base de datos desde el
prg principal:
Ejemplo:
AppData:AddData("base",TMariaDBDataSource():Create()) /// utilizo
Mariadb
WITH OBJECT AppData:Base //Defino propiedades del DataSource
:cDatabase :="mi_bd"
:cHost := "mi_servidor" /// tambien puede ir la ip del servidor
:cPassword := "mi_password"
:cUser := "mi_usuario"
:nPort=3306
:lDisplayErrors=.f.
:nTimeOut=1000
IF !:Connect()
MSGSTOP('NO SE PUEDE CONECTAR AL SERVIDOR')
QUIT
else
ENDIF
END WITH
Despues de que ya tienes tu conexion iniciada, la puedes usar desde
cualquier formulario.
Ejemplo:
METHOD BtnBmp3Click( oSender ) CLASS pruebas
Local cConsulta,cFactura,nombre,fecha
cFactura="A001"
cConsulta=AppData:Base:Query("Select campo1,campo2,campo3
from mi_tabla where factura='"+cFactura+"' and estatus='C' ")
cConsulta:Open()
If cConsulta:Reccount()>0 /// ESTO SIGNIFICA QUE
SI SE ENCONTRO REGISTROS EN LA CONSULTA
Msginfo("La factura digitada esta cancelada")
Return .t.
Endif
DE LO CONTRARIO SI NO ESTA CANCELADA LA FACTURA, ENTONCES
PONES LA INFORMACION QUE QUIERAS.
nombre=cConsulta:Campo1
fecha=cConsulta:Campo2
RETURN Nil
De esta manera se que la factura que digito el usuario esta cancelada.
Este metodo me ahorra estar agregando Datasets a un formulario de solo
consulta minima.
Ya si se requiere usar ediciones y agregaciones o borrado de registros, usa
los dataset que pone Xailer (TSQLquery)
Espero no haberme enrollado, esto es solo un ejemplo, pues cada programador
tiene su estilo.
Todo este avance que llevo lo he aprendido aqui con todos los colegas que
disponen de humuldad y conocimiento, y con gusto lo comparten.
Y en verdad te digo, Mysql es muy rapido y tiene las ventajas de conexiones
remotas sin usar software de terceros.
Saludos.
Cliente MySQL de Xailer incompleto.
"SELECT count(*) as nNunReg
FROM articulos WHERE id_item='" + xItem
Y luego preguntar por si nNunReg > 0
El 21/05/2013 3:32, Sergio Garcia Luna escribió:
> Diego, Gabo y Pedro:
>
> Les agradezco cumplidamente su ayuda, voy a modificar mi abm
> con sus recomendaciones, solo me queda la inquietud de que
> un Locate puede ser costoso en una tabla muy grande, la
> solucion de Select es mas rapida, pero siendo TSQLTable un
> dataset que hereda de la clase TDataSet ¿no deberia tener
> un metodo Seek como TDbfDataSet?
>
> Gracias por responder.
--
Tu vecino Manu
FROM articulos WHERE id_item='" + xItem
Y luego preguntar por si nNunReg > 0
El 21/05/2013 3:32, Sergio Garcia Luna escribió:
> Diego, Gabo y Pedro:
>
> Les agradezco cumplidamente su ayuda, voy a modificar mi abm
> con sus recomendaciones, solo me queda la inquietud de que
> un Locate puede ser costoso en una tabla muy grande, la
> solucion de Select es mas rapida, pero siendo TSQLTable un
> dataset que hereda de la clase TDataSet ¿no deberia tener
> un metodo Seek como TDbfDataSet?
>
> Gracias por responder.
--
Tu vecino Manu
Cliente MySQL de Xailer incompleto.
El concepto de indice en SQL es muy diferente al de las DBF.
Ojo porque si se generan muchos indices te ralentiza los procesos. Para
MySQL los indices son "otra" tabla que hay que mantener.
Es mejor crear pocos indices y sólo cuando se necesita hacer muchas
consultas con los campos que use ese indice...
--
Tu vecino Manu
Ojo porque si se generan muchos indices te ralentiza los procesos. Para
MySQL los indices son "otra" tabla que hay que mantener.
Es mejor crear pocos indices y sólo cuando se necesita hacer muchas
consultas con los campos que use ese indice...
--
Tu vecino Manu