FoxPro/Visual FoxPro - Comando Select en Mysql

 
Vista:
sin imagen de perfil

Comando Select en Mysql

Publicado por victor perez (137 intervenciones) el 09/02/2013 19:27:15
Hola Amigos,

Estoy vuelto bolas migrando mi sistema a MySql.

Tengo lo siguiente:

Thisform.conecta (se conecta al servidor...perfectamente)
SQLEXEC=(Lnhandle,"Select * from medicos",_medicos)
SQLDISCONNECT(LNHANDLE)


Hasta aqui, todo de maravillas...el cursor se llena pues la base de datos de Medicos siempre contiene informacion.

Ahora bien, luego ejecuto los siguientes comandos:

Thisform.conecta (se conecta al servidor...perfectamente)
SQLEXEC=(Lnhandle,"Select * from salaespera where &_codigo",_sala)
SQLDISCONNECT(LNHANDLE)

Con esto hago un filtro a SAlaespera....pero si no hay registros que cumplan con el filtro, el cursor no se crea y queda vacio.

El asunto es que necesito usar el cursor...aunque este vacio para las operaciones que siguen ya que cuento los registros del cursor para saber si el paciente con este codigo ya esta en la base de datos de sala de espera. Si el cursor es vacio, no esta en la base y lo agrego.

La otra cosa es llenar el cursor con todos los registros de SALAESPERA y luego hacer una busqueda del "_codigo"...si lo encuentra, está y no lo agrego, si no lo encuentra, pues lo agrega.

El otro asunto es que esta base de datos no siempre tendrá registros porque la mayor parte del tiempo no los tendra, pues de ella se extraen los registros cada vez que un paciente es atendido por el medico....

Alguna idea de como programar esto?

Saludos...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauricio
Val: 471
Plata
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Comando Select en Mysql

Publicado por Mauricio (1541 intervenciones) el 09/02/2013 19:57:56
Victor, te recomendaria que si el cursor (SELECT), esta vacio y lo necesitas vacio, puedes preguntar despues del SELECT si esta vacio, entonces puedes crear el mismo cursor a puro codigo:
CREATE CURSOR (campo1, campo2,....) VALUES ("Valores a cargar en cursor vacio)...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comando Select en Mysql

Publicado por Saul (728 intervenciones) el 09/02/2013 23:31:27
Lo que te dice Mauricio, se usa en DBFs en Mysql no te funcionara, a no ser que necesites hacer tablas o cursores temporales.

Hay te dejo mis rutinas para MYSQL,
Cualquier cosa ya sabes

Att.

Saúl HA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
*- Para conectar MYSQL
	SERVERMYSQL	= "127.0.01"
	USUARIO 	= "root"
	CLAVE   	= "sa"
	BD 			= "TuBase"
 
	lcStringCnxLocal = "DRIVER={MySQL ODBC 3.51 Driver};" + ;
	                   "SERVER="+SERVERMYSQL+";" + ;
	                   "UID="+USUARIO+";" + ;
	                   "PWD="+CLAVE+";" + ;
	                   "DATABASE="+BD+";" + ;
	                   "OPTIONS='';"
 
 
	SQLSETPROP(0,"DispLogin" , 3 )
 
	CnxSde = SQLSTRINGCONNECT(lcStringCnxLocal)
 
IF CnxSde < 0
	 AERROR(laErr)
 	 MESSAGEBOX("No se pudo conectar a mySQL. Error: " + CHR(13) + laErr[2])
 
 	 CLEAR ALL
 	 CLOSE ALL
 	 CANCEL
 	 QUIT
ENDIF
 
_nCodigo = '001'
 
*-Si quiers hacer tu Cursor Seria Asi-
TuCursor = retorna_query("TuBla","*",Codigo = ?_nCodigo)
 
SELECT &TuCursor
 
*- Lo cierras
estruye_query(TuCursor)
 
 
 
****FUNCIONES SQL SERVER*****
**** INSERTA REGISTRO EN LA BASE DE DATOS RECIBIENDO LA TABLA, CADENA DE CAMPOS Y CADENA DE VALORES ****
Function inserta_registro(tabla,campos,valores)
	sql_insert='insert into '+tabla+' ('+campos+' ) '+'values ( '+valores+' ) '
	if sqlexec(CnxSde,sql_insert)=1
		=sqlcommit(CnxSde)
	else
		=sqlrollback(CnxSde)
	endif
Endfunc
 
**** ACTUALIZA REGISTRO EN LA BASE DE DATOS RECIBIENDO LA TABLA, CADENA DE CAMPOS Y CADENA DE VALORES ****
Function actualiza_registro(tabla,campos,condicion)
	sql_actualiza='update '+tabla+ ' set ' +campos+ ' where '+condicion
	if sqlexec(CnxSde,sql_actualiza)=1
		=sqlcommit(CnxSde)
	else
		=sqlrollback(CnxSde)
	endif
Endfunc
 
**** BUSCA SI EXISTE UN VALOR EN LA TABLA****
Function busca_si_existe(nombre_tabla,campo_compara,valor_busca)
	sql_busca='select count('+campo_compara+') as encuentra'+' from '+nombre_tabla+' where '+nombre_tabla+"."+campo_compara+"="+"'"+valor_busca+"'"
 
	sqlexec(CnxSde,sql_busca,'cbusca')
		if cbusca.encuentra<=0
		select cbusca
		use
		return .f.
	else
		select cbusca
		use
		return .t.
	endif
Endfunc
 
 
**** BUSCA SI EXISTE UN VALOR EN LA TABLA Y RETORNA EL CAMPO QUE SE ELIJE****
Function busca_valor(nombre_tabla,campo_elije,condicion)
 
	Tempo='TE'+substr(sys(2015),3,8)
 
	sql_busca_valor='select '+campo_elije+ ' from '+nombre_tabla+ ' where '+condicion
	valor_retorna=''
	sqlexec(CnxSde,sql_busca_valor,tempo)
	if !empty('tempo')
		select &tempo
		combina=&tempo..&campo_elije
		valor_retorna=combina
		use
		return valor_retorna
	else
		use
		return valor_retorna
	endif
Endfunc
 
*** HACE UN CURSOR (TABLA)
Function retorna_query(tablas,campos,condicion)
	tempo='TE'+substr(sys(2015),3,8)
	if !empty(condicion)
		sql_busca='select '+campos+ ' from '+tablas+ ' where '+condicion
	else
		sql_busca='select '+campos+ ' from '+tablas
	endif
	sqlexec(CnxSde,sql_busca,tempo)
	return tempo
Endfunc
 
 
Function destruye_query(query)
	if used ('&query')
		select &query
		use
	endif
Endfunc
 
*.Folio, Correlativo Etc.
Function secuencia(tabla,campo,tipo,longitud)
	tempo='TE'+substr(sys(2015),3,8)
	sql_secuencia='select max'+'('+campo+') as '+campo +' from '+tabla
	sqlexec(CnxSde,sql_secuencia,tempo)
	secuencia=&tempo..&campo
	SELECT &tempo
	use
	if tipo='N'
		return secuencia+1
	else
		res=val(secuencia)+1
		secuencia=replicate("0",longitud-(len(allt(str(res)))))+(allt(str(res)))
		return secuencia
	ENDIF
Endfunc
 
 
*- Para Desconectar- Hasta el Final
*- Para no estar conectar y desconectando cada vez.
 
   *- Se desconecta la Conecion MySQL
	=SQLDISCONNECT(CnxSde)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comando Select en Mysql

Publicado por victor perez (137 intervenciones) el 10/02/2013 05:52:42
Gracias por la información.

Ahora , Saul, quizás escribí mucho al exponer mi problema.

Te lo resumo mas.

1.- Lleno un cursor "A"con los datos de una tabla bajo una condición. Esta condición se cumple en varios registros de la tabla, por lo tanto, el cursor se llena con información.

2.- Lleno otro cursor "B" con los datos de una tabla bajo una condición. En este caso, ningun registro cumple con la condición. El cursor vacio.

Si luego de esto, yo hago un Browse o un Reccount...resulta que se toman los datos del cursor A y se muestra esa información. Eso no es lo que quiero, sino que sencillamente me diga que no hay registros en el cursor "B".

Tengo otra interrogante, como se manipulan las fechas...ejemplo, Quiero llenar un cursor con los registros que cumplan con una fecha dada, o que se encuentren entre dos fechas...tal como funciona el comando Between.

Otra interrogante, cuando hago una consulta larga mediante el uso de la sentencia Text to / EndText...debo poner los ";" al final de cada sentencia? Tal como se hace en MySql.

Son muchas preguntas pero no se donde encontrarlas.

SAludos,

Victor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comando Select en Mysql

Publicado por Saul (728 intervenciones) el 10/02/2013 06:29:41
Si luego de esto, yo hago un Browse o un Reccount...resulta que se toman los datos del cursor A y se muestra esa información. Eso no es lo que quiero, sino que sencillamente me diga que no hay registros en el cursor "B".

Para este cazo, te contesto en dos partes así como tu lo expones, Si quieres hacer dos cursores, obviamente ya los tienes creados o no ¿?

Si ya los tienes creados pues lo que tienes que hacer es un simple SELECT a tu Tabla "B", te comento que cuando Visual Fox crea un cursor vació digamos lo así, siempre crea no se porque razón un registro que no podemos ver y nunca te dice que el RECCOUNT() = 0
para este cazo yo hago esto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
=SQLEXEC(CnxSde,"Select Max(Codigo_Prv) As codigo From ccCatalogoProveedores","Cur_Nuevo")
 
	   SELECT Cur_Nuevo
  	   DELETE FOR ISNULL(codigo)  &&Se borran los campos nulos o si el resultado es ""
   	   GOTO TOP
	   If RECCOUNT() > 0
 		 cValor = PADL(Alltrim(Str(Val(Cur_Nuevo.codigo)+1)),7,"0")
     		If val(cValor) <= 0
	    	    cValor = "0000001"
    	    EndIf
	   ELSE
	    	cValor = "0000001"
   	   ENDIF
   	   USE IN Cur_Nuevo
 
 		m.Codigo_Prv = cValor
	 	This.Value = m.Codigo_Prv
	    This.Refresh


Esto hago, para que realmente borre y deje totalmente vacia

DELETE FOR ISNULL(codigo)

Tengo otra interrogante, como se manipulan las fechas...ejemplo, Quiero llenar un cursor con los registros que cumplan con una fecha dada, o que se encuentren entre dos fechas...tal como funciona el comando Between.

Muy facil hago esto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fFechaFin = ThisForm.fFechaFin
fFechaIni = ThisForm.fFechaIni
 
SET DATE TO YMD
 
	*-----------------Script para bancos -------------------------------------------------------
	 lcSQLcommand = ""
	  TEXT TO lcSQLcommand NOSHOW
			select a.NumDoc_Btr,
			       a.Fecha_Btr,
			       a.Monto_Btr,
			       a.Nombre_Btr,
			  From bTransacciones a
			 Where a.fecha_btr Between ?fFechaIni And ?fFechaFin;
	  ENDTEXT
 
	 *-Conecta MySql
	 =SQLEXEC(CnxSde,lcSQLcommand,"cuLibBan")
  	 *--------------------------------------------------FIN SCRIPT ----------------------------------------
 
SET DATE TO BRITISH


Si te das cuenta al inicio le cambio el modo de mostrar la fecha
SET DATE TO YMD
Esto para que MYSQL lo tome como el lo toma.

Luego al final vuelvo a tomar como lo toma vfox pro
SET DATE TO BRITISH


Otra interrogante, cuando hago una consulta larga mediante el uso de la sentencia Text to / EndText...debo poner los ";" al final de cada sentencia? Tal como se hace en MySql.

No se que nivel tienes de MYSQL pero para cualquier script que hagas en MYSQL en cualquier Administrador que uses para hacerlo o si simplemente lo haces con DOS te recomiendo que uses alguno yo uso MySQL Administrator y allí hay un editor de tus scripts.

Lo que hago yo es hacerlo allí probarlos y luego pasarlos a visual fox.

Y MySQL el interpreta que el Script Termina con ";" No es 100% que lo tengas que poner pero recuerda si te acostumbras con malas técnicas luego cuesta que te los quieten de encima, mejor hazlo como es ";" así se hace.

Aquí estamos Victor cualquier cosa ya sabes

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comando Select en Mysql

Publicado por victor perez (137 intervenciones) el 10/02/2013 15:36:16
Hola Saul,

Excelente tu explicacion. Pero, en el caso de los cursores vacios, yo no creo el cursor...sencillamente el comando Select lo crea, (creo que es asi)

SQLEXEC(CONEXION,Select * from DATABASE where CONDICION,CURSOR)...creo que asi lo crea.

Mi interrogante es que cuando no hay registros, me da la impresion que no lo crea...no se...pero lo que si me llama la atencion, es que si esta vacio y luego de este comando hago un browse, me lista todos los registros del ultimo cursor que tenia datos.

Ejemplo:
abro conexion
sqlexec(lnhandle,"select * from medicos","_medicos")---> tiene registros
cierro conexion

abro conexion
sqlexec(lnhandle,"select * from salaespera where codigo=&codigo","_sala" --> no tiene registros.
cierro conexion

si en este momento hago un browse, me lista los registros del cursor _medico....en lugar de listarme todo en blanco con los datos del cursor _sala...

Esa es mi interrogante... ahora, ya resolvi este punto de otra manera y me quedò bien...

Aparenteme si se crea el cursor vacio pero no puedes hacer operaciones con este tales como browse o reccount() pero si puedes indexarlo,, y hacer una busqueda de manera que si no encuentra el codigo del paciente, sencillamente añade un registro nuevo con los datos a una base de datos a la que se le insertan los registros de pacientes que no estan el Sala de Espera para un determinado medico...porque a veces hay pacientes que necesitan consulta con mas de un medico. (asi que la busqueda la hago por codigo de paciente y codigo del medico).

Ah. <Para evitar seguir consultandote cosas de Mysql por este medio, me podrias dar tu direccion de correo de Windows Live? La mia es [email protected]

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comando Select en Mysql

Publicado por victor perez (137 intervenciones) el 11/02/2013 18:17:13
Hola Saul,

Ya te agregue a windows live pero no te he encontrado conectado.

Mira el siguiente problemita que tengo con fechas.

Hice un form para saber que pacientes cumplen en una determinada fecha.

Hay un textbox que recoge la fecha en formato "dd-mm-yyyyy"...como siempre lo hago.

Luego en el lost focus de ese textbox pongo lo siguiente:

SET DATE JAPAN
SET CENTURY ON

_FECHA=THISFORM.TXTFECHA.VALUE


THISFORM.CONECTA
SQLEXEC(LNHANDLE,"SELECT * FROM patient WHERE RIGHT(NACIMIENTO,5)=RIGHT(?_FECHA,5) ORDER BY CODIGO;","_BIRTHDAY")
SQLDISCONNECT(LNHANDLE)

IF RECCOUNT()=0
MESSAGEBOX("NADIE CUMPLE EN ESA FECHA")
RETURN 0
ENDIF

THISFORM.list1.rowsource="CODIGO,NOMBRES,APELLIDOS,NACIMIENTO,TELEFONO,CELULAR"
Thisform.list1.requery
Thisform.list1.refresh()

SET DATE BRITISH

Si lo hago asi, no me funciona, no me devuelve registros....aun cuando deje la fecha en el dia actual...

Pero si en lugar de ponder ?_fecha pongo alli "current_Date" (forma de mysql de expresar la fecha actual....entonces si me lista a los q cumplen años.

Donde esta el error...lo he intentado de mil formas y nada...

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comando Select en Mysql

Publicado por victor perez (137 intervenciones) el 11/02/2013 19:45:53
Hola,

Parece que soy el unico que trabaja en estos dias...jajajja...

ya encontre el error en el formulario para el calculo de los cumpleañeros.

Parece que el uso de Right para una variable importada desde VFP solo se atiende para una variable character.

Asi que puse _fecha= dtoc(thisform.txtfecha.value) y todo funciono a la perfeccion.

Lo encontre por ensayo y error al tratar desde SQLEXEC que se cumpliese la sentencia
Select right(?_fecha,5) as fecha en el cursor X.... poniendo valores a fecha de diferentes formas: _fecha=thisform.txtfecha.value, _ fecha=dtoc(thisform.txtfecha.value)
ordenaba browse al cursor y siempre la respuesta era los registros como memo...abri memo y observe que aparecia 00-00 en todos...asi que debia haber un error.

si le daba select right(nacimiento,5) from patient....entonces si me aparecia todos los "mm-dd" de todos los registros

Pense, donde esta la diferencia entre usar ?_fecha y usar nacimiento..y la encontre en eso que les explicaba arriba.

Anotense eso para cuando necesiten calcular edades...desde VFP mediante sentencias de SQL.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comando Select en Mysql

Publicado por victor perez (137 intervenciones) el 11/02/2013 19:29:13
Hola. Se sabe que se aprende por ensayo y error.

Dandole vuelta al asunto ya se cual era mi error...es mejor usar "?" para transferir la informacion desde VFP a Mysql al consultar...lo hice asi, y por supuesto, no hay problema...me crea el cursor aunque no tenga datos y me muestra y trabaja con ese cursor.

La sentencia la hice asi,

_codigo= thisform.txtcodigo.value (contiene el valor del codigo a poner como condicion)

thisform.conecta
sqlexec(lnhdandle,"select * from salaespera where codigo=?_codigo;","_sala")
sqldisconnect(lnhdandle)

IF RECCOUNT() <> 0
MESSAGEBOX("PACIENTE YA SE ENCUENTRA EN SALA DE ESPERA")
RETURN 0
ELSE
--- RUTINA PARA AÑADIR UN REGISTRO NUEVO
ENDIF

El error estaba en que no ponia &_codigo sin las comillas sino que lo dejaba asi nomas y el cursor nunca se creaba pues la sentencia no era correcta. Por eso que al no obedecerse la sentencia, el sistema tomaba el ultimo cursor abierto.

Creo que es mejor usar ?_codigo porque alli no tengo que poner comillas .

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar