Como configurar MariaDb para conectarse remotamente

500 views
Skip to first unread message

alvarocastellar

unread,
Sep 9, 2017, 12:20:59 PM9/9/17
to Comunidad de Visual Foxpro en Español
Amigos buenos dias, siguiendo con loa migracion de la base de dtoa nativa de vfp a mariadn(me ha ido muy bien la verdad junto con foxydb ha sido muy sencillo),
me gustaria saber como debo configurar mariaDb para accesarlo remotamente(via internet) a un servidor, trabajo bien de forma local pero no lo he podido hacer de forma remota.
Agradezco toda su ayuda,

Muchas gracias

Alvaro castellar



mapner

unread,
Sep 9, 2017, 3:32:13 PM9/9/17
to Comunidad de Visual Foxpro en Español
Debes abrir el puerto que usa MaríaDB en el router y direccionarlo al servidor

Rafael Carballo

unread,
Sep 9, 2017, 4:07:16 PM9/9/17
to Comunidad de Visual Foxpro en Español
Hola necesito dos codigos de muestra para poder trabajar sin problemas con foxydb
1 como obtener id ultimo creado he usado la sintaxis del manual pero solo me envia
T. Como resultado y yo necesito el numero para asignarlo en detalle de la factura antes de grabarlo.
2 obtener el codigo uuid porque aunque esta en el manual no encontre ningun ejemplo.

Gracias por su respuesta.

alvarocastellar

unread,
Sep 9, 2017, 7:38:59 PM9/9/17
to Comunidad de Visual Foxpro en Español



Hola amigo yo lo hago de esta forma, con una funcion

odb.Id_Name = "CampoId"

If odb.Update("cTablaUpdate")
    odb.Id()
    nUltimoid  = odb.Id_Last  && aqui guardo el ultimo Id, yo lo tengo en una propiedad de mi clase, pero puede ser una variable
    If odb.Commit()
             Messagebox('Registro agregado exitosamente',32,Thisform.Caption)      
    Else
        odb.Rollback()
        lReturn = .F.
        MessageboxOf(odb.error_code,32,"Error en Commit",0,Thisform.SkinFormview.lnStylo)
    Endif
Else
    odb.Rollback()
    lReturn = .F.
    Messagebox(odb.error_code,32,"Error en Update")
Endif

alvarocastellar

unread,
Sep 9, 2017, 7:39:33 PM9/9/17
to Comunidad de Visual Foxpro en Español

HOla mapner,puedes darme un ejemplo?? el puerto esta abierto pero nada no me conecta

Rafael Carballo

unread,
Sep 10, 2017, 9:10:57 AM9/10/17
to publice...@googlegroups.com

Gracias Amigo.

 

Esto me faltaba, ahora creo que puedo iniciar mi nuevo rumbo para cambiar mis dbf a mariadb.

 

Agradeciendo a toda la comunidad por cada uno su valiosa colaboración que aportan que hacen enriquecer el conocimiento de la programación con esta herramienta,  que nos da de comer todavía a muchos.

 

Saludos desde el El Salvador

Antonio Meza

unread,
Sep 10, 2017, 10:09:23 AM9/10/17
to Comunidad de Visual Foxpro en Español
Un comentario, también lo puedes obtener en la misma linea del Update, es decir de esta forma

If odb.Update("cTablaUpdate","CampoId", .t.)
     messagebox(odb.Id_Last)
..
..

La funcion .Update() de FoxyDb le puedes pasar 3 parámetros, el primero es el nombre del Cursor a Actualizar, el segundo es el nombre del Campo AutoIncrementable y el tercer parámetro es para indicar que obtenga el ultimo ID insertado. Ahora bien si el nombre del campo Autoincrementable es "ID" entonces solo pasas 2 parametros asi

If odb.Update("cTablaUpdate", .t.)
     messagebox(odb.Id_Last)
..
..

De igual forma trabaja como lo tienes la diferencia es que en una sola linea obtienes el mismo resultado.

saludos
Antonio Meza

Antonio Meza

unread,
Sep 10, 2017, 10:11:10 AM9/10/17
to Comunidad de Visual Foxpro en Español
Para obtener un UUID solo tienes que hacer lo siguiente

xValor = odb.uuid()

Es decir que la función .UUID() cuando la solicitas te retorna el valor.

saludos
Antonio Meza

El sábado, 9 de septiembre de 2017, 15:07:16 (UTC-5), Rafael Carballo escribió:

Rafael Carballo

unread,
Sep 10, 2017, 10:31:32 AM9/10/17
to publice...@googlegroups.com

Gracias Amigo.

 

De verdad de verdad invertí mas de 3 semanas en sqldata para poder migrar mi base de datos, pedi ayuda al autor porque es bonita la herramienta para trabajar y tiene un ejemplo y me daba la oportunidad de trabajar las técnicas con las mismas dbf y luego solo pasar a mi nueva base de datos a usar, pero en el manejo de id pase mucho tiempo y no logre superarlo,  me ayudaron pero era usando directamente sqlserver pero el propósito era ir poco a poco migrando mi aplicación usando la técnicas de oledb  hasta  finalizarlo y luego solo pasar a mariadb por eso me gustaba bastante.

 

Pero con foxydb aunque no trabaja directamente las técnicas con las tablas veo que migrar no me consumirá mucho tiempo porque no hay que mover mucho código y esa parte me estaba fustrando de nuevo el manejo de id y el ui pero gracias a ti amigo,  hoy puedo comenzar con mis aplicaciones hechas a convertirlas en mariadb y las nuevas a trabajar ya con esta técnica,

 

Muchas gracias por tan valiosa ayuda.

 

 

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Antonio Meza
Enviado el: domingo, 10 de septiembre de 2017 08:11 a.m.
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: [vfp] Re: Como configurar MariaDb para conectarse remotamente

 

Para obtener un UUID solo tienes que hacer lo siguiente

Rafael Carballo

unread,
Sep 10, 2017, 10:33:37 AM9/10/17
to publice...@googlegroups.com

Una última pregunta.

Este número de UUID solo puedo obtenerlo cuando ya está agregado el registro en la base con el update  o en tiempo de edición de cursor en memoria antes de iniciar si hay cambios y aplicar el update.

 

Gracias nuevamente.

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Antonio Meza
Enviado el: domingo, 10 de septiembre de 2017 08:11 a.m.
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: [vfp] Re: Como configurar MariaDb para conectarse remotamente

 

Para obtener un UUID solo tienes que hacer lo siguiente

Antonio Meza

unread,
Sep 10, 2017, 10:46:41 AM9/10/17
to Comunidad de Visual Foxpro en Español
Publica aquí cualquier duda ya que varios usan FoxyDb y te podemos ayudar para que te sea mas fácil.

Una duda a que te refieres con trabaja directamente las técnicas con las tablas?

saludos
Antonio Meza

Antonio Meza

unread,
Sep 10, 2017, 10:49:25 AM9/10/17
to Comunidad de Visual Foxpro en Español
El UUID lo puedes obtener en cualquier momento no es como el Autoincrementable que se genera al momento de insertar un registro, el UUID es un simple valor único universal por lo que no puede haber 2 iguales, por lo tanto lo puedes obtener en cualquier momento que lo necesites. Si ves el codigo fuente de FoxyDb veras que simplemente hacer un Select a MariaDb o Mysql o Firebird para obtenerlo.

saludos
Antonio Meza

Rafael Carballo

unread,
Sep 10, 2017, 11:10:20 AM9/10/17
to publice...@googlegroups.com

Gracias Mi amigo.

 

Te lo agradezco mucho.

 

Saludos

Rafael Carballo

alvarocastellar

unread,
Sep 10, 2017, 12:08:43 PM9/10/17
to Comunidad de Visual Foxpro en Español
me alegra mucho que el amigo rafael haya solucionado el impase, ahora me ayudan con el mio??
Necesito conectarme desde cualquier lado a mi base de datos mariadb que esta en la oficina, el servidor tiene una ip publica. este servidor cuando yo lo hago por conexion de acceso remoto escribo el nombre del equipo o la IP mas un puerto que se le configuro por motivos de seguridad. Entonces mi pregunta es como haria para conectarme a esa base de datos desde mi casa??. esta era la pregunta original de este hilo.... jajajajajjajaja.

Rafael Carballo

unread,
Sep 10, 2017, 12:13:11 PM9/10/17
to publice...@googlegroups.com

Con respecto a esta duda.

 

Una duda a que te refieres con trabaja directamente las técnicas con las tablas?

 

Foxydb trabaja solamente con :

 

Motores de Bases de Datos

·         mySql

·         Valor predeterminado 1

·         mariaDb

·         Valor predeterminado 2

·         fireBird

·         Valor predeterminado 3

·         postgreSql

·         Valor predeterminado 4

·         sqlServer

·         Valor predeterminado 5


La sqldata.dll es una clase desarrollada en Visual FoxPro 9.0 sp2 y ADO.  Con esta clase es posible realizar conexiones al motor de base de datos sql server en sus versiones 2000, 2005,  2008, 2008r2, 2012, 2014,2016.

Tambien mysql,mariadb,firebird,prosgreSQL,Visual Foxpro,Oracle otros servidores sql que tienen conector odbc y también oledb

No sirven los conectores .net

windows 2000,xp,vista,7,8,8.1,10,servidores 2000,2003,2008,2008r2,2012,2012r2,2016,  32 y 64 bits

Esta clase permite hacer todas las técnicas de programación en la misma DBC con ADO sin necesidad de pasar a otra base.

Luego al terminar solo cambio el motor de conexión.

 

A esto me refería amigo.

 

Saludos Cordiales.

Rafael Carballo

unread,
Sep 10, 2017, 12:42:46 PM9/10/17
to publice...@googlegroups.com

Disculpa Amigo, que me metí en tu hilo, en mi desesperación aproveche el tema a mi necesidad.

 

Espero que Antonio Meza, pueda proporcionarte la solución como lo ha hecho conmigo.

 

Saludos a todos.

Antonio Meza

unread,
Sep 10, 2017, 12:48:32 PM9/10/17
to Comunidad de Visual Foxpro en Español
Ya te comentaron lo que tienes que hacer, por otro lado puedes conectarte al servidor mysql desde otra pc en la misma red? esto para verificar que el firewall de tu servidor y usuario de acceso tiene permisos.

Si logras entrar de forma local, entonces lo único que te hace falta es abrir el puerto en tu router que apunte a tu servidor mysql de preferencia usa otro puerto en el router para darle seguridad.

saludos
Antonio Meza

Rafael Carballo

unread,
Sep 11, 2017, 11:33:31 AM9/11/17
to publice...@googlegroups.com

Amigo Antonio Meza.

 

Agradeciendo tu ayuda de publicar acá cualquier duda sobre FoxyDb

 

Tengo una pregunta.

 

Tengo el archivo  tab_clientes con 1,340 registros

Si ejecuto this.odb.sql(“select * from tab_clientes order by id “,”tab_clientes”)  se tarda 52 segundos en cargar

 

Si ejecuto this.odb.use(“tab_clientes”)  Se tarda 56 segundo en  cargar los datos.

 

Habrá alguna manera más rápida para cargar los datos que es una tabla pequeña y ahora con tablas que tengo de 25,000 registros ni idea tengo de cuánto tardará.

 

O que tendría que hacer para optimizar las respuestas de traer datos del servidor al usuarios.

 

Gracias por tu respuesta.

 

Att. Rafael Carballo

HernanCano

unread,
Sep 11, 2017, 1:41:35 PM9/11/17
to Comunidad de Visual Foxpro en Español
Perdón, Rafael y Antonio. Denme un momento doy una opinión.

La respuesta sería: No usar el asterisco en los SELECT que muestras (ya que traen todos los campos), ni dejar de usar el WHERE (que se usa para filtrar y traer sólo algunos registros).

El traer todos los registros y todos los campos es una práctica inadecuada al querer manejar datos en motores de datos externos.
Debes repensar tu programación para sólo traer algunos campos y algunos registros. "Repensar tu estilo de programación" es algo difícil, pero es a lo que estás enfrentando y tendrás que encarar.
Aquí hay material y personal para apoyarte.

alvarocastellar

unread,
Sep 11, 2017, 3:17:59 PM9/11/17
to Comunidad de Visual Foxpro en Español
Hola buenas tardes quiero sar tambien mi opinion para ayudar al amigo rafael, yo en lo personal manejo alguans tablas que tienen 15.000 registros y te aseguro que no demoran mas de tres segundos la carga de datos, como bien lo dice Hernan si la tabla contiene muchos campos no se recomienda usar '*' en la sentencia select sino los campos que se requieren mostrar.aparte de lo que han dicho todos te sugiero revises lo siguiente,

Cuantos campos tiene tu tabla?
Has generado los indices y  relaciones ha dicha tabla?
Ese campo Id es de Tipo Int o Varchar

Lo de los indices es fudnamental no solo para mariadb sino para cualquier motor de base de datos ya que optimizan la velocidad de la consulta

Espero que estas sugerencias te ayuden a solucionar el inconveniente.

saludos

Alvaro castellar



Rafael Carballo

unread,
Sep 11, 2017, 4:58:55 PM9/11/17
to publice...@googlegroups.com

Gracias por toda la ayuda que me están brindando.

Como me indican, tengo que redefinir el concepto actual.

 

En este momento para los mantenimientos aplico dos formularios

 

1.       Muestro todos los datos en un grid y a la vez pueden hacer búsqueda por cualquier campo de la tabla

2.       Pueden crear un nuevo registro o modificar en el posicionado invocando la segunda pantalla y luego retornar a la pantalla anterior.

 

Esa es la razón por la cual presento todos los datos en especial les adiciono las imágenes para que me indiquen que debería mejorar.

 

Lo que sucedía es que con las dbf el filtro de búsqueda no tardaba mucho aprovechando la técnica Rushmore optimización

 

El código de búsqueda de filtro lo hago de la siguiente manera y es rápido en toda la tabla  o cuando filtran el campo el usuario.

Ver el código al final de las imágenes.

 

El código hace búsqueda por defecto en todos los campos que defino en la primera parte, y si el usuario quiere un campo especifico desactiva esta opción y le presento los títulos según el grid para buscar en el la columna que el desee hacer la búsqueda, es la segunda parte del código.

 

 

 

 

 

PARAMETERS xbuscar

PUB_BUSCAR=xbuscar

thisform._sbuscar =PUB_BUSCAR

SELECT (this._tabla)

IF EMPTY(thisform._sbuscar)

      SET FILTER TO

ELSE

IF EMPTY(THISFORM.obj_buscar1.CBOcampos.Value

SET FILTER TO ;

      AT(thisform._sbuscar,UPPER(STR(id)),1)>0 OR ;

      AT(thisform._sbuscar,UPPER(f_idcod),1)>0 OR ;

      AT(thisform._sbuscar,UPPER(f_codigo),1)>0 or ;

      AT(thisform._sbuscar,UPPER(f_codigoi),1)>0 or ;

      AT(thisform._sbuscar,UPPER(f_nombre),1)>0 OR ;

      AT(thisform._sbuscar,UPPER(f_concepto),1)>0

      ****ENCONTRADOS

      WITH THISFORM.GRid1

                          .Column1.DynamicForeColor = ;

                        'IIF(thisform._sBuscar $ UPPER(STR(id)),RGB(255,128,0),RGB(0,0,0))'    

                  .Column2.DynamicForeColor = ;

                        'IIF(thisform._sBuscar $ UPPER(f_idcod),RGB(255,128,0),RGB(0,0,0))'

                  .Column3.DynamicForeColor = ;

                        'IIF(thisform._sBuscar $ UPPER(f_codigo),RGB(255,128,0),RGB(0,0,0))'

                  .Column4.DynamicForeColor = ;

                        'IIF(thisform._sBuscar $ UPPER(f_codigoi),RGB(255,128,0),RGB(0,0,0))'

                  .Column5.DynamicForeColor = ;

                        'IIF(thisform._sBuscar $ UPPER(f_nombre),RGB(255,128,0),RGB(0,0,0))' 

                  .Column6.DynamicForeColor = ;

                        'IIF(thisform._sBuscar $ UPPER(f_concepto),RGB(255,128,0),RGB(0,0,0))' 

                                   

                  .Column1.DynamicFontBold = ;

                       'IIF(thisform._sBuscar $ UPPER(STR(id)),.T.,.F.)'

                  .Column2.DynamicFontBold = ;

                        'IIF(thisform._sBuscar $ UPPER(f_idcod),.T.,.F.)'

                  .Column3.DynamicFontBold = ;

                        'IIF(thisform._sBuscar $ UPPER(f_codigo),.T.,.F.)'

                  .Column4.DynamicFontBold = ;

                        'IIF(thisform._sBuscar $ UPPER(f_codigoi),.T.,.F.)'

                  .Column5.DynamicFontBold = ;

                        'IIF(thisform._sBuscar $ UPPER(f_nombre),.T.,.F.)' 

                  .Column6.DynamicFontBold = ;

                        'IIF(thisform._sBuscar $ UPPER(f_concepto),.T.,.F.)'       

                          

    ENDWITH                   

     

      ELSE

     

           XTITULOGRID=THISFORM.obj_buscar1.Cbocampos.Value

              xcol=thisform.grid1.columncount && cantidad de columnas del grid

            

             FOR S=1 TO XCOL

                  S1=ALLTRIM(STR(S))

                  x_campo=(thisform.grid1.COLUMNS(s).CONTROLSOURCE) && obteniendo el nombre de campo con su tabla

                        XNCAMPO=SUBSTR(x_campo,ATC(".",x_campo)+1,LEN(x_campo)) && solo deja

                  XTCAMPO=thisform.grid1.column&s1..header1.Caption && cabecera titulo

                  XTIPOCAMPO=TYPE(FIELD(XNCAMPO))  && C=CARACTER,N=NUMERICO,D=FECHA,T=FECHA HORA,L=LOGICO,M=CAMPO MEMO,W=(BLOB), Y=MONEDA, B=DOUBLE

                                                   && G=GENERAL I=ENTERO F=FLOAT V=VARCHAR

                       

                     THISFORM.GRid1.Column&S1..header1.backcolor =RGB(192,192,192)

                                                                           

              IF XTCAMPO=XTITULOGRID

                   THISFORM.GRid1.Column&S1..header1.backcolor =RGB(255,128,0)

                    

                     

                  DO CASE            

                        CASE XTIPOCAMPO="C"

                        SET FILTER TO AT(thisform._sbuscar,UPPER(&XNCAMPO),1)>0

                        THISFORM.GRid1.Column&S1..DynamicForeColor ='IIF(thisform._sBuscar $ UPPER(XNCAMPO,RGB(255,128,0),RGB(0,0,0))'         

                        THISFORM.GRID1.Column&S1..DynamicFontBold ='IIF(thisform._sBuscar $ UPPER(XNCAMPO,.T.,.F.)'

                       

                            

                  CASE XTIPOCAMPO="N"       

                         SET FILTER TO AT(thisform._sbuscar,UPPER(STR(&XNCAMPO)),1)>0

                         THISFORM.GRID1.Column&S1..DynamicForeColor = ;

                                    'IIF(thisform._sBuscar $ UPPER(STR(XNCAMPO),RGB(255,128,0),RGB(0,0,0))'      

                         THISFORM.GRID1.Column&S1..DynamicFontBold = ;

                                   'IIF(thisform._sBuscar $ UPPER(STR(XNCAMPO),.T.,.F.)' 

                              

                   CASE XTIPOCAMPO="D"       

                           SET FILTER TO AT(thisform._sbuscar,UPPER(DTOC(&XNCAMPO)),1)>0  

                          THISFORM.GRID1.Column&S1..DynamicForeColor = ;

                                    'IIF(thisform._sBuscar $ UPPER(DTOC(XNCAMPO),RGB(255,128,0),RGB(0,0,0))'     

                          THISFORM.GRid1.Column&S1..DynamicFontBold = ;

                                   'IIF(thisform._sBuscar $ UPPER(DTOC(XNCAMPO),.T.,.F.)' 

                    

                      ENDCASE      

                  EXIT    

              ENDIF  

              NEXT S      

     

ENDIF

endif

 

THISFORM.GRid1.REFRESH

 

*

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de alvarocastellar
Enviado el: lunes, 11 de septiembre de 2017 01:18 p.m.
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: Re: [vfp] Re: Como configurar MariaDb para conectarse remotamente

 

Hola buenas tardes quiero sar tambien mi opinion para ayudar al amigo rafael, yo en lo personal manejo alguans tablas que tienen 15.000 registros y te aseguro que no demoran mas de tres segundos la carga de datos, como bien lo dice Hernan si la tabla contiene muchos campos no se recomienda usar '*' en la sentencia select sino los campos que se requieren mostrar.aparte de lo que han dicho todos te sugiero revises lo siguiente,

image002.png
image001.jpg
image003.jpg
image007.jpg

Rafael Carballo

unread,
Sep 11, 2017, 5:24:41 PM9/11/17
to publice...@googlegroups.com

Con respecto a los índices si, todas las tablas tienen índice e id que es auto incremental en entero automático.

 

Esa es la llave principal.

 

Gracias por las aportaciones he venido queriendo migrar a las bases de datos desde hace más de 3 años y una vez cambie en mi erp todas las pantallas que invertí más de 6 meses y cuando comenzó a fallarme era con sql server 2005  me rendí y sentí que desperdicie 6 meses arduos me mantuve mejor con las dbf, pero ahora con esta herramienta que han puesto a nuestra disposición estoy animándome nuevamente.

 

De verdad agradezco mucho todo el apoyo, porque he visto en el foro que  hay muchos como yo con el miedo de migrar sus aplicaciones de años y preguntan cuál sería el camino menos doloroso, y le comprendo porque a veces son aplicaciones de más de 10 años de irles invirtiendo tiempo, y cambiar todas las pantallas o desarrollarlo nuevamente, es algo que no lo concebimos por varias razones. Tiempo, dinero, y el temor que muchos tienen de que el zorro muera pronto.

 

El temor de perder algún día todo el código y hacer de nuevo nuestra aplicación en otra herramienta, es para muchos y era para mí el temor de invertir más tiempo,  en el zorrito, pero he llegado a una conclusión, si la aplicación es presentable como los menús ribbon, funcional como un ccleaner que trabaja a nivel de pc y se conecta al internet internamente, que en este caso sería mariadb y los demás motores de bases, y ahora que lo podemos compilar a 64 bit y evitar el refox lo único que veo en nuestro zorro es que corra en multiplataforma, pero confiando en Dios y en muchos de la comunidad con tanta destreza en técnicas y conocimiento mayores de programación, creo que no estará tan lejos que alguien pueda agregarnos el compilador para hacerlo multiplataforma y sin cambiar código podamos correr nuestra aplicación en cualquier navegador.

 

Para algunos parece utópico, y que es no querer aceptar el cambio,  podrán haber nuevas herramientas y nuevos lenguajes de programación  pero el ser humano siempre ocupara las  mismas cosas, lo único que hacemos es presentárselas de otra forma.

Y eso es lo que la comunidad ha hecho con el zorro, cada vez que salen nuevos estilos, alguien hace una clase, control o procedimiento y hace al zorro verse igual que las nuevas modas de programación.

 

Ejemplo : Estilo office, estilo Windows metro, estilo Android, estilo Outlook, Gráficos 2d, 3d, Código de Barras etc.

lo único es que muchos nos quedamos atrasados con malas prácticas de programación y por eso no le damos al zorro la calidad con la que podemos presentarlos ante estas herramientas.

 

Que es lo que me están indicando mis amigos con las nuevas prácticas que debo comenzar a utilizar.

 

Gracias a todos a la comunidad mundial que no somos pocos en habla hispana y otros idiomas que trabajamos con el zorro y hacen cosas maravillosa que son dignos de elogio ante tales modelos y diseños en los desarrollo.

 

Rafael Carballo

 

 

 

 

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de alvarocastellar
Enviado el: lunes, 11 de septiembre de 2017 01:18 p.m.
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: Re: [vfp] Re: Como configurar MariaDb para conectarse remotamente

 

Hola buenas tardes quiero sar tambien mi opinion para ayudar al amigo rafael, yo en lo personal manejo alguans tablas que tienen 15.000 registros y te aseguro que no demoran mas de tres segundos la carga de datos, como bien lo dice Hernan si la tabla contiene muchos campos no se recomienda usar '*' en la sentencia select sino los campos que se requieren mostrar.aparte de lo que han dicho todos te sugiero revises lo siguiente,

alvarocastellar

unread,
Sep 11, 2017, 6:01:00 PM9/11/17
to Comunidad de Visual Foxpro en Español
Hol amigo lo que dices es ciertyo y mi consejo es que no renuncies, en mi caso personal te comento que hace unos dos meses comenze la migracion de mi base de datos Dbf a mariaDB  y la verdad el comienzo es duro pero despues que vas cogiendo el ritmo todo es mas sencillo. Otro consejo que te doy es que uses procedimientos almacenado yo lo hago y el tiempo de respuesta es mucho mejor. de otro lado veo que usas set filter  a mi modo de ver no es lo mas optimo. lo ideal es que uses una sentencia Select con clausula Where  y Like es mi consejo.  para ayudarte un poco te regalo un procedimiento almacenado que recibe como parametro el nombre de la tabla, los campos,  where y order by, tambien si lo requieres haces join. te lo paso.  Te sirve para devolver casi que cualquier informacion de tus tablas.

En MariabDb

CREATE DEFINER=`root`@`localhost` PROCEDURE `SpTraerRegistrosJoin`(
    IN `cTabla` VARCHAR(50),
    IN `cCampos` VARCHAR(10000),
    IN `cWhere` VARCHAR(1000),
    IN `cJoin1` VARCHAR(200),
    IN `cJoin2` VARCHAR(200),
    IN `cJoin3` VARCHAR(200)


,
    IN `cOrder` VARCHAR(200)



BEGIN
    Set @cJoin1  = IF(Length(cJoin1) > 0, cJoin1,'');     
    Set @cJoin2  = IF(Length(cJoin2) > 0, cJoin2,'');     
    Set @cJoin3  = IF(Length(cJoin3) > 0, cJoin3,'');     
    Set @cOrder  = IF(Length(cOrder) > 0,Concat(' ORDER BY  ', cOrder),'');     
   
    Set @cCmd = Concat('SELECT  ',  cCampos, ' FROM ', cTabla, @cJoin1, @cJoin2, @cJoin3, ' WHERE True ', cWhere, @cOrder);
     PREPARE sent FROM @cCmd;
     eXECUTE sent;

END



y en vfp lo llamas de esta forma:

Yo tengo una clase que hace las veces de mi capa de negocios  la cual es una clase custom. y tiene este codigo:

Mdb                      Nombre Metodo = TraerRegistrosJoin
PARAMETERS cTabla, cCampos, cWhere, cJoin1, cJoin2, cJoin3, cOrder, cCursora 

odb.Sql("call SpTraerRegistrosJoin('" + cTabla+ "','" + cCampos +  "','" + cWhere + "','" + cJoin1 + "','" + cJoin2 + "','" + cJoin3 + "','" + cOrder + "')",cCursora)


en el formulario donde quiere obtener la cursora lo llamo de esta forma:

cTabla     = " Facturas  M "
cCampos = "Fact_ctco, Clientes.Clie_ctco, Clientes.Nombre As NombreCli, Sald_Ctco As Valor, Abono As Abonos, CAST(0 As Decimal) As Sald_Ctco, Fech_ctco, "+;
                  "Venc_Ctco As Vence,CAST(0 As Decimal) As Ndias, Clie_Id As Ter_Id "
cWhere =  "Facturas.Clie_Id =  " +  Trans(nIdClie) +  " And Facturas.Estado = ''A''  "
cJoin1 = " LEFT Join Clientes On M.Clie_Id = Clientes.Clie_Id  "
cOrder  = Iif(.CmbOrden.ListIndex = 1," Nombrecli ", " Clie_ctco")   

Thisform.Mdb.Traerregistosjoin(cTabla,cCampos,cWhere, cJoin1, cJoin2, cJoin3, cOrder,"cFacturasCliente")

espero te sirva.
Tambien va una imagen del procedimiento almacenado
procal.png

Antonio Meza

unread,
Sep 11, 2017, 9:31:49 PM9/11/17
to Comunidad de Visual Foxpro en Español
Como comenta Hernan siempre debes indicar los nombres de los campos en las consultas y siempre lo recociendo, en el blog de foxydb les comento que uso * para los ejemplos pero siempre deben indicar los campos, esto hace que las consultas sean mucho mas rápidas, pues evitas que MariaDb obtenga los campo y rearme la consulta.

saludos
Antonio Meza

Antonio Meza

unread,
Sep 11, 2017, 9:45:26 PM9/11/17
to Comunidad de Visual Foxpro en Español
Lo mejor de todo es que estas abierto a mejorar, lo difícil es cual hay rechazo a aplicar buenas practicas, como ya te comentaron NUNCA debes traerte todos los registros si no los vas a usar, posiblemente para generar un reporte necesitarías pero lo puedes mejorar usando Procedimientos Almacenados.

Por lo tanto te doy mis recomendaciones personales y no quieren decir que sea la verdad absoluta!!!


1.       Muestro todos los datos en un grid y a la vez pueden hacer búsqueda por cualquier campo de la tabla

R= En vez de mostrar Todos los registros en el Grid, lo que yo hago es que el usuario busque primero y le muestro el resultado que sera mucho menor y mas rápido que traerte toda la tabla, y al buscar nuevamente pues vuelves a traerte solo los registros de la nueva consulta y así cada vez que realice una búsqueda es mil veces mas optimo que traerte todos los registros y estarlos filtrando, imagina que alguien modifica o agrega mas registros y pues estos no los verías solo por darte un detalle de muchos que tendrías y desde luego entre mas registros mas lento seria en la forma que lo trabajas actualmente.

2.       Pueden crear un nuevo registro o modificar en el posicionado invocando la segunda pantalla y luego retornar a la pantalla anterior.

R= Igual que arriba no necesitas traerte incluso todos los campos, solo traes sobre los que el usuario puede buscar o que le vas a mostrar en el listado y no mas, desde luego aquí el campo ID toma mucha importancia y es el que envías en la segunda pantalla para modificar, si envías ID = 0 pues quiere decir que es un registro nuevo obtienes un cursor vació y a trabajar, si envías un valor por ejemplo ID = 10, pues ya te traes todos los campos que ocupas para modificar (Nunca usar *) el registro pero solo traes un registros lo que hace que vuele tu sistema y apliques buenas practicas e incluso puedes retornar un valor desde el segundo formulario para saber si agregaste o modificaste y regenerar la consulta y mostrar datos actuales en el grid. 

saludos
Antonio Meza

Rafael Carballo

unread,
Sep 12, 2017, 5:06:53 AM9/12/17
to publice...@googlegroups.com

Muchas gracias Amigo.

 

Hace unos años hice una aplicación con sqlserver 2000 de producción de materia prima.

La aplicación era funcional, pero como la cantidad de datos era grande, se degradaba el sistema y nunca pude aplicar los procedimientos almacenados que era la falla que tuve y aunque investigue ponerlo en práctica nunca fue lo que logre.

Por eso les agradezco mucho su ayuda, no es que no haya invertido tiempo en pasar a otro motor, pero tantas piedritas en el camino hizo que no siguiera.

Y de verdad este procedimiento que me has pasado, y en especial que es genérico, será de gran ayuda a mis procesos.

Gracias a todos por su apoyo.

 

Porque acabo de estar poniendo en práctica lo que se me dijo definir campos pero por ejemplo:

oDb.sql(“Select id,f_codigo,f_nombre from tab_producto order by id  “,”tab_producto”)

 

Con 9,997 registros se me tarda 1:10 un minuto diez segundos.

 

Espero mejorar ese tiempo con el procedimiento almacenado en especial para reportes que hay que trabajar con históricos.

 

Gracias nuevamente.

alvarocastellar

unread,
Sep 12, 2017, 8:59:05 AM9/12/17
to Comunidad de Visual Foxpro en Español
Hola amigo, definitivamente hay algo raro en tu base de datos o tu tabla, una pregunta si ejecutas esa sentencia directamente en el motor de mariadb cuanto te demora?.
prueba creandole un indice al campo codigo y al campo nombre a ver que ocurre.

Rafael Carballo

unread,
Sep 13, 2017, 4:50:57 AM9/13/17
to publice...@googlegroups.com

Fue de 0.047 segundos

Ver Imagen

image001.png

Daniel Sánchez

unread,
Sep 13, 2017, 9:48:00 AM9/13/17
to Comunidad de Visual Foxpro en Español
Por la cantidad de registros que indicas nunca me ha pasado que demore casi un minuto en traerme los datos ni siquiera con conexión remota e la nube o en otro servidor por internet, y en cuanto a sql2000 es un excelente motor de bd que hasta la actualidad en algunos clientes tengo instalado con varios miles de registros en sus tablas, con bd de 3 o 5 gb corriendo con la misma velocidad que el primer día, el tema de los indices es importante para mantener la mejor performance en cualquier bd.

Así que creo que el problema no va por ahí, ahora en cuanto a traer todos los datos de una tabla no es lo más recomendado pero no falta por ahí un cliente especial que así lo requiera, pero en esos casos no le traigo todos los datos apenas abre el formulario, solo si no pone nada en los filtros de consulta muestra todo, si hay mucha data esta pueda demorar más de lo que el quisiera, así que la próxima vez ya sabe a que atenerse con consultas de ese tipo.

Saludos
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Rafael Carballo

unread,
Sep 13, 2017, 3:28:17 PM9/13/17
to publice...@googlegroups.com

Gracias Amigo.

 

La tabla tiene el índice ID  y he hecho la prueba en el servidor de base de datos la ejecución de la siguiente instrucción con 1,500 registros

 

Select id,f_cuenta,f_nombre from tab_clientes order by id

 

En la base no se tarda ni un segundo

 

oDb.sql(“Select id,f_cuenta,f_nombre from tab_clientes order by id”,”tab_clientes”)

 

Se me tarda 53 segundos.

 

Que estaré hacienda mal, la velocidad con HeidiSql es fenomenal, pero al ejecutarlo desde visual foxpro hace ese tiempo y estoy tomando en cuenta todas las recomendaciones hechas.

 

O será que he instalado mal MariaDB o el conector porque si ustedes dicen que no es normal ese tiempo, algo estare haciendo mal  no en la instrucción porque es la misma sino alguna configuración???

 

Pregunta talvez sea eso :

Hay diferencia de me conecto como localhost ó 127.0.0.1

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Daniel Sánchez
Enviado el: miércoles, 13 de septiembre de 2017 07:48 a.m.
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: Re: [vfp] Re: Como configurar MariaDb para conectarse remotamente

 

Por la cantidad de registros que indicas nunca me ha pasado que demore casi un minuto en traerme los datos ni siquiera con conexión remota e la nube o en otro servidor por internet, y en cuanto a sql2000 es un excelente motor de bd que hasta la actualidad en algunos clientes tengo instalado con varios miles de registros en sus tablas, con bd de 3 o 5 gb corriendo con la misma velocidad que el primer día, el tema de los indices es importante para mantener la mejor performance en cualquier bd.

 

Así que creo que el problema no va por ahí, ahora en cuanto a traer todos los datos de una tabla no es lo más recomendado pero no falta por ahí un cliente especial que así lo requiera, pero en esos casos no le traigo todos los datos apenas abre el formulario, solo si no pone nada en los filtros de consulta muestra todo, si hay mucha data esta pueda demorar más de lo que el quisiera, así que la próxima vez ya sabe a que atenerse con consultas de ese tipo.

 

Saludos

El 12 de septiembre de 2017, 4:08, Rafael Carballo <rafca...@gmail.com> escribió:

Muchas gracias Amigo.

 

Hace unos años hice una aplicación con sqlserver 2000 de producción de materia prima.

La aplicación era funcional, pero como la cantidad de datos era grande, se degradaba el sistema y nunca pude aplicar los procedimientos almacenados que era la falla que tuve y aunque investigue ponerlo en práctica nunca fue lo que logre.

Por eso les agradezco mucho su ayuda, no es que no haya invertido tiempo en pasar a otro motor, pero tantas piedritas en el camino hizo que no siguiera.

Y de verdad este procedimiento que me has pasado, y en especial que es genérico, será de gran ayuda a mis procesos.

Gracias a todos por su apoyo.

 

Porque acabo de estar poniendo en práctica lo que se me dijo definir campos pero por ejemplo:

oDb.sql(“Select id,f_codigo,f_nombre from tab_producto order by id  “,”tab_producto”)

 

Con 9,997 registros se me tarda 1:10 un minuto diez segundos.

 

Espero mejorar ese tiempo con el procedimiento almacenado en especial para reportes que hay que trabajar con históricos.

 

Gracias nuevamente.

 

Antonio Meza

unread,
Sep 13, 2017, 3:38:43 PM9/13/17
to Comunidad de Visual Foxpro en Español
Que versión de Driver Odbc usas, VFP esta instalado en la misma maquina que MariaDb y el HeidiSql también esta instalado en la misma maquina?

Ese tiempo de 58 segundos para 1500 registros se me hace demasiado incluso en red local.

saludos
Antonio Meza

Rafael Carballo

unread,
Sep 14, 2017, 6:45:09 AM9/14/17
to publice...@googlegroups.com

Antonio

 

Si tengo instalado todo en la misma máquina. 

Ocupo  Mariadb 10.2.6 winx64 y mysql.connector-5.1.13 win32.msi en Windows 7 de 64 bit porque el ODBC de 64 no me conecta y en window xp 32 bit ambos se ejecutaron excelentemente a la velocidad de la  luz.

 

 

He detectado el problema que es el ODBC pero no sé cómo solucionarlo.

 

1.       Instale la aplicación en Windows xp 32 bit e instale ODBC 32 y mariadb 32 y se ejecutó el archivo de clientes en menos de 1 segundo.

2.       Lo ejecuto en mi pc que es Windows 7 64bit  y se tarda 1.5 minutos

Revise y desístale MariaDB y ODBC

Al instalar MariaDB de 64 bit corre con HeidiSQL igual que window xp

Instalo ODBC de 64 bit  y no puedo conectarme desde FoxyDb pero en el controlador de ODBC directamente hago un test a las base de datos que me conecta y se conecta sin problema

Pero en el programa no encuentra el nombre de la ODBC y me genera un error de no conexión.

Instalo la ODBC de 32 bit y ya puedo conectarme sin problema a la base de datos pero sigo con el problema de lentitud al bajar datos.

 

La conclusión que he llegado es que es la incopatibilidad de ODBC de 32 bit con Windows 64 bit

Pregunta.

Se resolvería esto si paso Visual Foxpro 10 con 64 bit para trabajar y me tome el ODBC de 64 bit  y solventar el problema o siempre me generara el problema de no poderse conectar al ODBC de 64 bit.

 

Agradecería tu respuesta Antonio,  dime como como me conectaría al drvers de 64 bit o hay otra solución.

 

Saludos

Rafael Carballo

Instalo

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Antonio Meza
Enviado el: miércoles, 13 de septiembre de 2017 01:39 p.m.
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: Re: [vfp] Re: Como configurar MariaDb para conectarse remotamente

 

Que versión de Driver Odbc usas, VFP esta instalado en la misma maquina que MariaDb y el HeidiSql también esta instalado en la misma maquina?

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de alvarocastellar
Enviado el: lunes, 11 de septiembre de 2017 04:01 p.m.
Para: Comunidad de Visual Foxpro en Español <
publice...@googlegroups.com>


Asunto: Re: [vfp] Re: Como configurar MariaDb para conectarse remotamente

 

Hol amigo lo que dices es ciertyo y mi consejo es que no renuncies, en mi caso personal te comento que hace unos dos meses comenze la migracion de mi base de datos Dbf a mariaDB  y la verdad el comienzo es duro pero despues que vas cogiendo el ritmo todo es mas sencillo. Otro consejo que te doy es que uses procedimientos almacenado yo lo hago y el tiempo de respuesta es mucho mejor. de otro lado veo que usas set filter  a mi modo de ver no es lo mas optimo. lo ideal es que uses una sentencia Select con clausula Where  y Like es mi consejo.  para ayudarte un poco te regalo un procedimiento almacenado que recibe como parametro el nombre de la tabla, los campos,  where y order by, tambien si lo requieres haces join. te lo paso.  Te sirve para devolver casi que cualquier informacion de tus tablas.

image001.png

alvarocastellar

unread,
Sep 14, 2017, 9:15:39 AM9/14/17
to Comunidad de Visual Foxpro en Español
Hola rafael como estas  al comienzo tuve un problema parecido y al igual que tu instale tanto mariadb como el Odbc de 64 bits, pero antonio me dijo que  Vfp no trabaja a 64 Bits y por eso no era posible conecrtarse asi que instale TODO de nuevo a 32 Bits, MariaDb y el Odbc de MySql. Que antonio o algun compañero me corrija si estoy equivocado.

Antonio Meza

unread,
Sep 14, 2017, 10:16:58 AM9/14/17
to Comunidad de Visual Foxpro en Español
Hola!!!

Les comento, puedes instalar MariaDb a 64bit, tener windows 64bit, lo que no puedes es usar drivers odbc de 64bit porque VFP solo trabaja a 32bit, es decir si o si debes instalar siempre el driver odbc de 32bit sin importar si tu windows o tu servidor mariadb es de 32bit o 64bit.

Mi maquina tiene windows 10 pro a 64bit (Creator Update), tengo instalado 10.2.6-MariaDB a 64bit y uso el driver odbc 5.1 de 32bit y no tengo problemas con lentitud al consultar datos desde VFP,

Por lo que comentas tu equipo tiene algún problema si usas windows 10 saca respaldo y restaurarlo.

saludos
Antonio Meza
Reply all
Reply to author
Forward
0 new messages