Consulta Select con MYSQL

206 views
Skip to first unread message

Enrique

unread,
Apr 18, 2022, 9:08:11 AM4/18/22
to Comunidad de Visual Foxpro en Español

Hola y buenos días a todos. Continuando con el tema de pasar de DBF a MySQL. Por concejos de este mismo grupo. Estoy atorado en comprender la sintaxis con Mysql. Miro algunos ejemplos y no doy con la solución. El tema es lo siguiente:

En un Hosting, tengo una base de datos de nombre municipa_2021 y dos tablas de nombre (Todos y Gente). Luego de realizar la conexión a la base de datos, puedo consultar separadamente y de forma correcta cualquiera de las dos tablas de esa base de datos. A qui todo bien. Prepare un formulario y corre bien eso.

Continuando con los demás formularios, necesito unir dos tablas (todos y gentes) y tengo la siguiente consulta, pero solo trae los registros de una sola tabla:

   PUBLIC cnram as String     
        _dsn="Prueba;"
        _server="168.194.197.2;"
        _UID="municipa;"
        _PWD="913#*Q1pBdItqV;"
        _Database="municipa_2021;"
        _Port="3306"

        
dsn_="DSN="+_dsn+"SERVER="+_server+"UID="+_uid+"PWD="+_pwd+"DATABASE="+_Database+"PORT="+_Port
          cnram=SQLSTRINGCONNECT("&dsn_") 


     
   IF cnram<1
          MESSAGEBOX('NO HAY CONEXIÓN CON LA DB'+_Database,16,'Conexión Fallida!') 

           ENDIF


  Note: Aquí comienzan mis problema  tratando de unir estas dos tablas

SQL=sqlexec(cnram,"SELECT a.nom_muni,a.nom_serv,a.cod_subti,a.nom_subti,a.ppto_actua,b.municipalidad,b.hombres,b.mujeres,b.totales,b.alcaldes","MiCursor") 

Brow

 Solo muestra los registros de la tabla Todos y a la ves todos los campos, ni siquiera solamente los campos seleccionados en la consulta y no muestra ningún campos de la tabla Gente.

 

Pregunta: Como puedo unir dos tablas mediante una consulta con MySQL y luego seleccionar el cursor creado (MiCursor)?

Esta misma consulta con tablas nativas funciona perfectamente, algo así necesito:

 Select a.nom_muni,a.cod_subti,a.nom_subti,a.nom_serv,a.ppto_actua,b.comuna,b.hombres,b.mujeres,b.totales,b.alcaldes ;
FROM TABLAPRE a,gente b;        
 where a.nom_muni = b.comuna AND mCombo2= a.nom_muni AND a.nom_serv="GESTION MUNICIPAL" ;
 Order By a.nom_muni,a.cod_subti,a.nom_serv ;
  into cursor vista7 READWRITE 

 select  vista7

brow

*****************************

Por otra parte, leyendo preguntas similares en el grupo. Vi que tengo que cerrar la conexión cada vez que termina un proceso y volver abrir nuevamente cuando se requiere hacer otra consulta o proceso.. ¿eso es correcto?. 

Para lo anterior, solo agrego este comando al terminar cada rutina: sqldisconnect(0)

¿Eso quiere decir que en cada botón de comandos (Grabar,Eliminar,cancelar,etc.) tengo que cerrar con el comando sqldisconnect(0) ?

Muchas gracias a todos por su atención y ayuda.

Carlos Miguel FARIAS

unread,
Apr 18, 2022, 9:23:03 AM4/18/22
to Grupo Fox
En tu consulta a MySQL, donde figura las instrucciones para indicar las tablas y el join de ellas?

--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/fe07bea8-2a54-461e-b961-5a935078baadn%40googlegroups.com.

Enrique

unread,
Apr 18, 2022, 10:04:00 AM4/18/22
to Comunidad de Visual Foxpro en Español
Hola Miguel. Bueno con la que estaba probando era esta:
SQL=sqlexec(cnram,"SELECT a.nom_muni,a.nom_serv,a.cod_subti,a.nom_subti,a.ppto_actua,b.municipalidad,b.hombres,b.mujeres,b.totales,b.alcaldes","MiCursor")

También pruebo con esta y tampoco resulta: Supongo que preguntas por esta;

SQLExec(cnram, "SELECT nom_muni,nom_serv,cod_subti,nom_subti,ppto_actua FROM municipa_2021.todos UNION ALL SELECT municipalidad,hombres,mujeres,totales,alcaldes FROM municipa_2021.gente", "MiCursor7")

Muchas gracias

HernanCano

unread,
Apr 18, 2022, 11:56:52 AM4/18/22
to Comunidad de Visual Foxpro en Español
Aún falta info para poder apoyarte.

Te solicito un BROWSE (imagen) de cada una de las dos tablas que mencionas para saber cómo proceder.

La frase "unir dos tablas" aún no es suficientemente clara, pues se necesita saber si las tablas tienen campos concordantes o complementarios.

Enrique

unread,
Apr 18, 2022, 12:01:14 PM4/18/22
to Comunidad de Visual Foxpro en Español
Tratando de tomar otros ejemplos di con una solución.

SQL=SQLEXEC(cnram,"Select todos.nom_muni,todos.nom_serv,todos.cod_subti,todos.nom_subti,todos.ppto_actua, gente.nom_muni,gente.hombres,gente.mujer,gente.total,gente.alcaldes From todos Inner Join gente On todos.nom_muni = gente.nom_muni  ;")

ahora muestra los registros de las dos tablas.
Me gustaría saber como le agrego un cursor y como lo selecciono después dicho cursor, tal como lo hace uno con tablas nativas, como la siguiente consulta;

 select a.nom_muni,a.cod_subti,a.nom_subti,a.nom_serv,a.ppto_actua,b.comuna,b.hombres,b.mujeres,b.totales,b.alcaldes ;

         FROM TABLAPRE a,gente b;        
          where a.nom_muni = b.comuna AND mCombo2= a.nom_muni AND a.nom_serv="GESTION MUNICIPAL" ;
          Order By a.nom_muni,a.cod_subti,a.nom_serv ;
         into cursor MiCursor READWRITE

Muchas gracias.

Enrique

unread,
Apr 18, 2022, 12:06:09 PM4/18/22
to Comunidad de Visual Foxpro en Español
Hola Hernan. Si las dos tablas tienen un campo en comun (nom_muni) y la consulta quedo asi:

SQL=SQLEXEC(cnram,"Select todos.nom_muni,todos.nom_serv,todos.cod_subti,todos.nom_subti,todos.ppto_actua, gente.nom_muni,gente.hombres,gente.mujer,gente.total,gente.alcaldes From todos Inner Join gente On todos.nom_muni = gente.nom_muni  ;")

Ahora muestra los registros.
 Por ahora me gustaría saber como le agrego un cursor a esta consulta y luego saber si cada vez que realizo una consulta, debo cerra con el comando sqldisconnect(0),  vale decir que en cada botón de comandos (Grabar,Eliminar,cancelar,etc.) tengo que cerrar con el comando sqldisconnect(0) ?

Muchas gracias

Enrique

unread,
Apr 18, 2022, 1:22:44 PM4/18/22
to Comunidad de Visual Foxpro en Español
Hernan. Te adjunto imagen del Browser, luego de realizar la consulta:
SQL=SQLEXEC(cnram,"Select todos.nom_muni,todos.nom_serv,todos.cod_subti,todos.nom_subti,todos.ppto_actua, gente.nom_muni,gente.hombres,gente.mujeres,gente.totales,gente.alcaldes From todos Inner Join gente On todos.nom_muni = gente.nom_muni  ;","micursor")

select micursor
resultado.png
Y lo que necesito es hacer es la siguiente consulta y que no puedo realizar ahora (claro tengo un avance, que puedo unir dos tablas), pero lo que necesito hacer es aprender como es la sintaxis como la siguiente consulta;
Desde un botón combo, selecciono una municipalidad y luego traer los registros: Así la realizo con tablas DBF y lo que no se, es como puedo hacer algo similar con MYSQL:

select a.nom_muni,a.cod_subti,a.nom_subti,a.nom_serv,a.ppto_actua,b.comuna,b.hombres,b.mujeres,b.totales,b.alcaldes ;
         FROM TODOS a,Gente b;        
         where a.nom_muni = b.comuna AND Combo1= a.nom_muni AND a.nom_serv="GESTION MUNICIPAL" ;
         Order By a.nom_muni,a.cod_subti,a.nom_serv ;
         into cursor micursor READWRITE

Como le comentaba, tengo un avance con esta consulta:
SQL=SQLEXEC(cnram,"Select todos.nom_muni,todos.nom_serv,todos.cod_subti,todos.nom_subti,todos.ppto_actua, gente.nom_muni,gente.hombres,gente.mujeres,gente.totales,gente.alcaldes From todos Inner Join gente On todos.nom_muni = gente.nom_muni  ;","micursor")

No se donde tengo que agregar el código después del Where como lo hacia con la consulta en DBF

Muchas gracias por tu ayuda.

Ignacio Debole

unread,
Apr 18, 2022, 1:35:05 PM4/18/22
to publice...@googlegroups.com

Marcelo Barberis

unread,
Apr 18, 2022, 2:46:09 PM4/18/22
to publicesvfoxpro
hola buenas tardes, yo tengo una vista donde uso tres tablas todas estan relacionadas con un campo

tbl_productos.id_producto,
tbl_productos.id_empresa,
tbl_productos.id_rubro,
tbl_productos.id_marca,
tbl_productos.id_unidad,
tbl_productos.id_prod_sin,
tbl_productos.cod_original,
tbl_productos.cve_producto,
tbl_productos_sin.cod_prod_sin,
tbl_productos.nombre_producto,
tbl_rubros.nombre_rubro,
tbl_marcas.nombre_marca,
tbl_productos.descripcion_adicional,
tbl_productos.precio_costo,
tbl_productos.precio_venta,
tbl_productos.stock_actual,
tbl_productos.stock_minimo,
tbl_productos.no_controla_stock,
tbl_productos.prod_compuesto,
tbl_productos.imagen_producto
FROM
tbl_productos
LEFT JOIN tbl_rubros ON tbl_productos.id_rubro = tbl_rubros.id_rubro
LEFT JOIN tbl_marcas ON tbl_productos.id_marca = tbl_marcas.id_marca
LEFT JOIN tbl_productos_sin ON tbl_productos.id_prod_sin = tbl_productos_sin.id_prod_sin
WHERE
tbl_productos.susp_venta = 0 AND
tbl_productos.uso_interno = 0



--
Marcelo Barberis Gutierrez
Sistemas Informaticos
Villa Montes - Bolivia
Telef.: +591-76830544

Marcelo Barberis

unread,
Apr 18, 2022, 2:49:54 PM4/18/22
to publicesvfoxpro
si estas trabajando con mysql puede usar algun administrador y te puedes crear una vista donde tengas todas las tablas que vas a usar y como te puse arriba pues me olvide de poner el select aqui esta completo

SELECT

Marcelo Barberis

unread,
Apr 18, 2022, 2:52:38 PM4/18/22
to publicesvfoxpro
si usas mysql puede crearte una vista con algun administrador de mysql lo puedes hacer, las vista son tomadas como tablas igual, aqui te paso casi igual a lo anterior pero aqui le aumente un Select

Enrique

unread,
Apr 18, 2022, 3:55:00 PM4/18/22
to Comunidad de Visual Foxpro en Español
Muchas gracias Alerm.
 Pero en que parte en su rutina  esta SQL=SQLEXEC(cnram......

Eso es lo que no entiendo, Mi idea es hacer una consulta similar a las con dbf. pero con
 SQL=SQLEXEC(cnram...
o bien con
=sqlexec(m.lnHandle,"SELECT nom_muni FROM todos Group By  nom_muni Order By nom_muni","curClientes")

Con dbf las realizo de esta forma y funcionan bien.

select a.nom_muni,a.cod_subti,a.nom_subti,a.nom_serv,a.ppto_actua,b.comuna,b.hombres,b.mujeres,b.totales,b.alcaldes ;
         FROM TABLAPRE a,gente b;        
          where a.nom_muni = b.comuna AND mCombo2= a.nom_muni AND a.nom_serv="GESTION MUNICIPAL" ;
          Order By a.nom_muni,a.cod_subti,a.nom_serv ;
         into cursor MiCursor READWRITE

entonces ahora necesito saber como uso o agrego el comando SQL=SQLEXEC(cnram......o Bien 
=sqlexec(m.lnHandle,"SELECT ...")

Muchas gracias

 

HernanCano

unread,
Apr 18, 2022, 5:24:13 PM4/18/22
to Comunidad de Visual Foxpro en Español
Enrique:
Nos confundes.
(( la imagen que pones ya es innecesaria, porque ya resolviste esa parte de tu necesidad ))

Dices que necesitas "unir dos tablas". Pero por un lado tienes una instrucción en la que involucras dos tablas: TABLAPRE y GENTE; y luego otra en la que involucras: TODOS y GENTE.

A pesar de la confusión, te paso lo sgte intentando resolver tu pregunta relacionada con el WHERE:

**
** Primero: involucrando TABLAPRE y GENTE:
**
private M.lcCombo1
M.lcCombo1 = alltrim(Thisform.cmbMunicipio.Value)

local M.cSQL
text to M.cSQL noshow pretext 15

   select a.nom_muni,a.cod_subti,a.nom_subti,a.nom_serv,a.ppto_actua,b.comuna,b.hombres,b.mujeres,b.totales,b.alcaldes  
     FROM TABLAPRE a, gente b        
     where a.nom_muni = b.comuna AND a.nom_muni=?lcCombo1 AND a.nom_serv="GESTION MUNICIPAL"
     Order By a.nom_muni,a.cod_subti,a.nom_serv  

endtext

** **
** ** ** Otra alternativa:
** **
** ** text to M.cSQL noshow textmerge pretext 15
** **
** **    select a.nom_muni,a.cod_subti,a.nom_subti,a.nom_serv,a.ppto_actua,b.comuna,b.hombres,b.mujeres,b.totales,b.alcaldes  
** **      FROM TABLAPRE a,gente b        
** **      where a.nom_muni = b.comuna AND a.nom_muni="<<M.lcCombo1>>" AND a.nom_serv="GESTION MUNICIPAL"
** **      Order By a.nom_muni,a.cod_subti,a.nom_serv  
** **
** ** endtext
** **

*!* Para enviar al motor:
*!* =SQLExec ( m.lnHandle, M.cSQL, "MiCursor2022" )

**
** Segundo: involucrando TODOS y GENTE:
**
private M.lcCombo1
M.lcCombo1 = alltrim(Thisform.cmbMunicipio.Value)

local M.cSQL2
text to M.cSQL2 noshow pretext 15

   Select todos.nom_muni,todos.nom_serv,todos.cod_subti,todos.nom_subti,todos.ppto_actua
     , gente.nom_muni,gente.hombres,gente.mujeres,gente.totales,gente.alcaldes
    From todos
    Inner Join gente On todos.nom_muni = gente.nom_mun
    where todos.nom_muni = gente.comuna AND todos.nom_muni=?lcCombo1 AND todos.nom_serv="GESTION MUNICIPAL"

endtext

*!* Para enviar al motor:
*!* =SQLExec ( m.lnHandle, M.cSQL2, "MiCursor2022" )


Enrique

unread,
Apr 18, 2022, 6:44:57 PM4/18/22
to Comunidad de Visual Foxpro en Español
Hernan. Muchas gracias. Si eso era lo que necesito y también Para enviar al motor:
*!* =SQLExec ( m.lnHandle, M.cSQL, "MiCursor2022" )

Necesito aprender este tipo de consultas con mysql es bien distinto a la consultas dbf y mas difícil y me cuesta.

Hernan, que significa este código en la consulta;
local M.cSQL2                                        ????
text to M.cSQL2 noshow pretext 15   ????

Y Disculpa por la tablapadre y la confucion. Esa es otra consulta que tendré que exponer.

Finalmente. Debo cerrar cada vez que termine la consulta o evento con este comando sqldisconnect(0)?

Muchas gracias a todos y especialmente Hernan.

HernanCano

unread,
Apr 20, 2022, 3:12:48 AM4/20/22
to Comunidad de Visual Foxpro en Español
>>> Hernan. Muchas gracias. Si eso era lo que necesito y también Para enviar al motor:
>>> *!* =SQLExec ( m.lnHandle, M.cSQL, "MiCursor2022" )

Ah, bueno.



>>> Necesito aprender este tipo de consultas con mysql es bien distinto a la consultas dbf y mas difícil y me cuesta.

Los comandos SQL son diferentes entre cada motor, es decir entre VFP, MySQL/MariaDb, M$ SQL Server, Oracle, FireBird, PostgreSQL, SQLite, Access, y desafortunadamente con el lenguaje SQL standard (no debía serlo, pero cada motor --es decir los fabricantes de ese motor-- le pone características al lenguaje SQL que implementa, por lo que se hace incompatible con el stándard y con los demás).

Moraleja: si aprendes uno, no necesariamente puedes usarlo de forma "exacta" con otro (por avances de la misma tecnología, la única excepción --por ahora-- es entre MySQL y MariaDb, es decir: por ahora sí con compatibles los lenguajes SQL entre ellos).



>>> Hernan, que significa este código en la consulta;
>>> local M.cSQL2                                        ????
>>> text to M.cSQL2 noshow pretext 15   ????

Con esta pregunta se nota que no eres programador, por lo tanto todos nuestros esfuerzos en ayudarte serán en vano. La respuesta la encuentras en la ayuda de VFP.

LOCAL es el comando para declarar local una variable.
TEXT es un comando para iniciar una "estructura" en la que se va a definir una variable de caracteres de varios renglones; se usa extensivamente para armar comandos SQL.



>>> Debo cerrar cada vez que termine la consulta o evento con este comando sqldisconnect(0)?

No es estrictamente necesario usar SQLDISCONNECT(0) cada que se termina de obtener datos de un motor. Todo depende de tu escenario, es decir tus necesidades, las necesidades del motor que uses, de la red que hay en tu empresa cliente, y de muchas cosas más.
Esta consulta tuya nos lleva a otros terrenos, como por ejm las "buenas prácticas", lo cual da para todo un curso de programación de computadores........

El cero que hay en ese comando SQLDISCONNECT(0) indica que se cierren todas las conexiones que hay abiertas por la aplicación en el momento que lo estás usando. Si sólo es una, pues se cierra esa única conexión; pero si hay varias pues se cierran todas; ésto no es problema si sabes qué es lo que estás haciendo (recuerda: si no eres programador, ésto nos lleva a intrincados terrenos difíciles de cruzar).

Cristian Novoa

unread,
Apr 20, 2022, 7:01:29 AM4/20/22
to Comunidad de Visual Foxpro en Español
SQLEXEC.zip
Reply all
Reply to author
Forward
0 new messages