consulta MySQL

97 views
Skip to first unread message

Arnaldo Toledano (GMail)

unread,
Mar 7, 2011, 5:15:36 PM3/7/11
to publice...@googlegroups.com
Hola Gente.
Aca en Argentina, algunos disfrutando del "feriado largo" por carnaval, otros trabajando, en los que me incluyo.
Les hago una consulta.
En realidad es mas complejo, pero basicamente es asi.
Supongamos tengo una tabla de Clientes.
Codigo, nombre, direccion, etc,etc,etc,
Y otra tabla de Telefonos.
Donde tengo
CodigoCliente, Tipo Telefono (Particular,Celular,Trabajo,Contacto, Fax,Otros), numero.
Supongamos un cliente que solo tiene telefono Celular, trabajo y Fax, tendria asi
CodCliente   Tipo     Numero
5466            C         351 15594666
5466            T         351 4801111
5466            F         351 4801112
 
 
Necesito sacar "una sola FILA" de clientes en un cursor, con todos los datos del cliente y todos los telefonos.
Como veran, la cantidad de telefonos puede ser Cero o seis telefonos, o mas, puesto que cada tipo
de telefono se puede repetir.
 
Alguien me puede dar una IDEA
 
Arnaldo Toledano
Córdoba
Argentina


__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 5934 (20110307) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

Guillermo MDQ

unread,
Mar 7, 2011, 5:28:55 PM3/7/11
to Comunidad de Visual Foxpro en Español
Arnaldo, me parece que la mejor forma de hacerlo es con una tabla de
referencias cruzadas.
Haces un select normal que te traiga los clientes con los telefonos,
agrupado por cliente, y despues podes usar el Genxtab para hacer la
referencia cruzada.
Te va a dar como resultado un cursor con un cliente por fila y los
telefonos separados en columnas.

Saludos
Guillermo
Mar del Plata, Argentina

On 7 mar, 19:15, "Arnaldo Toledano \(GMail\)"

Mauricio Molinero,

unread,
Mar 7, 2011, 5:31:01 PM3/7/11
to Comunidad de Visual Foxpro en Español
Hola Arnaldo, yo tambien trabajando en estos carnavales, jeje,

Yo haria Subconsultas si quieres un solo registro.

SELECT NOMBRE,DIRECCION,(SELECT NUMERO FROM TELEFONOS TE WHERE
CL.CODCLIENTE=TE.CODCLIENTE AND TIPO='C') AS TEL_CELULAR,
(SELECT NUMERO FROM TELEFONOS TE WHERE CL.CODCLIENTE=TE.CODCLIENTE
AND TIPO='T') AS TEL_TRABAJO,
(SELECT NUMERO FROM TELEFONOS TE WHERE CL.CODCLIENTE=TE.CODCLIENTE
AND TIPO='F') AS TEL_FAX
FROM CLIENTE CL

Saludos!

Mauricio R. Molinero,

Carlos Miguel FARIAS

unread,
Mar 8, 2011, 8:02:52 AM3/8/11
to publice...@googlegroups.com
Aunque no es recomendable, se pueden usar funciones del usuario dentro de un SELECT

SELECT nombre, direccion, campos_etc, fnLosTelefonos( codcliente ) as telefonos
from tabla_clientes

y un archivo de procedimientos activo ( o le mismo prg o uno jerarquicamente "mas arriba" )

function fnLosTelefonos( tnc )
   local lcLstTel, liAreaPrevia
   liAreaPrevia = SELECT(0)  && guardo area trabajo previa
   lcLstTel = ''
   SELECT tipo, numero FROM telefonos WHERE codCliente=tnc INTO CURSOR ldt
   liQ = _TALLY
   if liQ==0
      lcLstTel = '* NO TIENE TELEFONOS *'
   else
      select ldt
      scan
          lcLstTel = lcLstTel + iif( empty( lcLstTel ), '', ', ' ) + 'Tipo:' + tipo + ' #' + numero
      endscan
   endif
   use in 'ldt'
   SELECT ( liAreaPrevia ) && retorno area trabajo previa
   return lcLstTel
endfunc

lo importante, es que la funcion invocada deje las cosas como estaban luego de ser llamados desde el indice, o sea no tocar la tabla/s sobre la que se esta haciendo el select principal, dejar el area de trabajo original, no dejar cursores "colgados", no activar/desactivar indices relacionados con las tablas principales.

Douglas Sánchez Guillén

unread,
Mar 8, 2011, 8:52:38 AM3/8/11
to publice...@googlegroups.com
hola me imagino que tiene dos tablas algo asi como estos cursores, que no es la solucion, claro esta ejemplo para imaginarme tu estructura. 
CREATE CURSOR CLIENTES (NO INT, NOMBRE C(50))
CREATE CURSOR DETALLE (NO INT, TELEFONO1 C(12), TELEFONO2 C(12), TELEFONO3 C(12))

En primer lugar tus tablas estan en mysql.?
Ya me imagino que tiene las conexion. y sabes consultar datos en mysql.
yo lo haria de la siguiente manera, aqui referencias crusada no se utiliza ya que no son nombres q se pueden macrosustituir como mi ejemplo q los numeré.

1 Consultar datos en mysql

2 ya teniendo los cursores o cunsultas en fox en tu entorno de trabajo.

3 Bucle Anidado.
la tabla uno no la tacas ya que es la tabla encabezado por decirte asi, y la que tu quieres es la de detalle, corrigeme y te sigo ayudando...
select detalle
copy estru to detalle2
use detalle2 in 0
Sele detalle &&&& indexa esta tabla por codclientes 1 al N... se asume que esta tabla es tu consulta que tu traes de Mysql
Go Top
Do While !Eof()
xcodclient = codcliente

Do While codcliente = xcodcliente And !Eof()
If !Empty(telefono1)
vartel1 = telefono1
Select detalle2
Appen Blank
Replace codclientes With xcodcliente
Replace telefono With vartel1
Endif
If !Empty(telefono2)
vartel2 = telefono2
Select detalle2
Appen Blank
Replace codclientes With xcodcliente
Replace telefono With vartel2

Endif
If !Empty(telefono3)   &&&& o lo haces sin variables asi como aqui como tu quieras
Select detalle2
Appen Blank
Replace codclientes With xcodcliente
Replace telefono With telefono3
Endif

Sele detalle
Skip
Enddo

Sele detalle
Enddo

Espero le Sirva Saludes...

 
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Movistar: 505 8759 - 5342
Claro: 505 88495476

Reply all
Reply to author
Forward
0 new messages