Dudas sobre comandos SQL

58 views
Skip to first unread message

Gabriel Sandoval

unread,
Nov 26, 2010, 1:34:53 AM11/26/10
to Comunidad de Visual Foxpro en Español
Hola!! Buenas noches a toda la comunidad, en esta ocasion escribo
porque por ahora tengo dos dudas acerca de los comandos de SQL, las
cuales son:

1. Qué es lo mejor?

por ejemplo para hacer una busqueda siempre he utilizado codigo como
el que sigue:

select 0
use catalogo
set order to clave_art

clavetmp= "ACC027"
if seek(clavetmp)
scatter memvar
messagebox("El articulo "+ m.clave_art+ m.descrip+ " ha sido
encontrado")
else
messagebox("El articulo no existe.")
endif


sin embargo he encontrado que este codigo tambien sirve para lo mismo:


select 0
use catalogo

clavetmp= "ACC027"

select catalogo.claveart, catalogo.descrip from catalogo ;
where catalogo.claveart= clavetmp ;
into table consultatmp.dbf

if _TALLY > 0
messagebox("El articulo "+ consultatmp.clave_art+ consultatmp.descrip
+ " ha sido encontrado")
else
messagebox("El articulo no existe.")
endif


se que la segunda opcion puede ser mas optima, pero mi duda reside en
si existe alguna otra forma aun mas optimizada de hacer la misma
tarea, o si la segunda forma es la mejor, o en que casos es mejor
usarla, o cual elegir, etc.


2. La segunda duda es sobre actualizar un registro de una tabla, por
ejemplo siguiendo el mismo ejemplo anterior, si quiero actualizar solo
la descripcion del articulo, conservando la misma clave y sin repetir
el articulo.

He encontrado el comando INSERT, pero ese comando inserta un nuevo
registro, existe algun comando SQL que me actualice el que ya existe y
solo pueda modificar los campos que uno designe ?


De antemano agradezco sus comentarios. Bendiciones para todos.

Walter R. Ojeda Valiente

unread,
Nov 26, 2010, 2:26:25 AM11/26/10
to publice...@googlegroups.com
Hola Gabriel

Para realizar búsquedas, la primera es la usual en los lenguajes xBase (dBase, Clipper, FoxPro, etc.), la segunda en los motores de bases de datos SQL, cualquiera de ellos puedes usar, el rendimiento es practicamente el mismo pues ambos se basan en árboles de búsquedas binarios, un algoritmo muy conocido. De todas maneras, para asegurarlo es muy fácil: se hace un programa que realice un millón de búsquedas con el primer método y otro millón de búsquedas con el segundo método. Se comparan los tiempos que duró la ejecución de cada uno de ellos y se tendrá la respuesta. Algo como:

T1 = Tiempo actual
Se hace un millón de búsquedas con el método1
T2 = Tiempo actual
Se imprime T2 - T1

T1 = Tiempo actual
Se hace un millón de búsquedas con el método2
T2 = Tiempo actual
Se imprime T2 - T1

En cuanto a reemplazar un campo, en los motores SQL el comando utilizado se llama UPDATE. Ejemplo:

UPDATE Descripcion FROM Catalogo WHERE CodArt = 'ACC027'

En el caso del Firebird, tiene un comando llamado UPDATE OR INSERT. Lo que hace es lo siguiente: si no existe el campo clave que has utilizado (no necesariamente Primary Key, puede ser cualquiera), inserta el registro. Si existe, lo modifica. Es un comando muy útil, ahorra escritura y mejora la legibilidad del código fuente.

Saludos.

Walter.

P.D.: Ya tenemos un predicador por aquí, espero que no te agregues a la lista. Uno es más que suficiente.

Gabriel Sandoval

unread,
Nov 26, 2010, 4:15:09 AM11/26/10
to Comunidad de Visual Foxpro en Español
Hola Walter,

Muchas gracias por tu respuesta, me gustaria mucho iniciar a manejar
el Firebird, tienes algun manual o guia para comenzar a usarlo?

Gracias de antemano.


Walter R. Ojeda Valiente

unread,
Nov 26, 2010, 4:23:42 AM11/26/10
to publice...@googlegroups.com
Hola Gabriel

Si lees inglés te recomiendo el libro "The Firebird Book" de Helen Borrie, es muy bueno, explica claramente todo lo que se necesita saber. Si lees portugués, los libros "Firebird essencial" y "Firebird 2" de Carlos H.. Cantú son muy buenos también.

En www.firebird.com.mx encontrarás bastante material en castellano.

Yo estoy escribiendo un documento titulado: "Visual FoxPro y Firebird SQL", mi idea original era que tuviera unas pocas páginas pero a medida que lo estoy escribiendo voy agregando más y más páginas, siempre me falta algo por decir. Espero no terminar escribiendo un libro.

Cuando esté listo, lo subiré a algún sitio público para que puedan descargarlo.

Saludos.

Walter.

Victor Espina

unread,
Nov 26, 2010, 6:39:10 AM11/26/10
to Comunidad de Visual Foxpro en Español
Hace unas semanas respondi un correo similar a otro colega del grupo.
Te anexo aqui el texto de esa respuesta, que espero sea de utilidad
para ti tambien.

Los que venimos de un antepasado xBase como dBaseIII o FoxBase o
Clipper, crecimos con estos paradigmas:

a) Ubicar un registro en una tabla:
USE tabla ORDER indice
SEEK clave

b) Ingresar un nuevo registro en la tabla
USE tabla
APPEND BLANK
REPLACE campo1 WITH valor1, campo2 WITH valor2

c) Actualizar un registro en una tabla
USE tabla
SEEK clave
REPLACE campo1 WITH valor1, campo2 WITH valor2

d) Eliminar un registro en una tabla
USE tabla
SEEK clave
DELETE

o

USE tabla
DELETE FOR condición


e) Listar registros en una tabla
USE tabla
SCAN FOR condición
ENDSCAN

o

SEEK clave
SCAN WHILE condición
ENDSCAN

Sin embargo, en la epoca moderna de VFP, estos paradigmas deberían ser
cambiados para aprovechar el motor SQL que se incluyó a partir de
FoxPro 2.0:

a) Ubicar un registro en una tabla:
SELECT * FROM tabla WHERE campo = clave INTO CURSOR cursor

b) Ingresar un nuevo registro en la tabla
INSERT INTO tabla (campo1, campo2) VALUES (valor1, valor2)

c) Actualizar un registro en una tabla
UPDATE tabla SET campo1 = valor1, campo2 = valor2 WHERE campo = clave

d) Eliminar un registro de una tabla
DELETE FROM tabla WHERE campo = clave

o

DELETE FROM tabla WHERE condición


e) Listar registros de una tabla
SELECT * FROM tabla WHERE condición INTO CURSOR cursor
SELECT cursor
SCAN
ENDSCAN


Esta práctica hace mucho más sencilla luego la transición a un esquema
cliente-servidor, pues ya el sistema fue diseñado de esa
forma (sobre todo si los accesos a la Base de Datos se encapsulan en
procedimientos o métodos de una clase central).

Por ejemplo, si en lugar de registrar un cliente nuevo así:

INSERT INTO clientes (codigo, nombre) VALUES (cCodigo, cNombre)

lo hacemos asi:

lResult = bizCrearCliente(cCodigo, cNombre)

PROCEDURE bizCrearCliente(pcCodigo, pcNombre)
INSERT INTO clientes (codigo, nombre) VALUES (pcCodigo, pcNombre)
ENDPROC

después, podemos migrar a SQL Server nuestro sistema simplemente
adaptando la funcion bizCrearCliente:

PROCEDURE bizCrearCliente
PARAMETERS pcCodigo, pcNombre
Resultado = SQLEXEC(goDataConn, "INSERT INTO clientes (codigo,
nombre) VALUES (?pcCodigo, ?pcNombre)")
ENDPROC

Incluso mejor; si creamos bizCrearCliente como un método de una clase
en lugar de como un procedure normal, entonces al inicio de nuestro
sistema podríamos hacer algo como esto:

PUBLIC goDBHelper

DO CASE
CASE cDBEngine = "VFP"
goDBHelper = CREATEOBJECT("VFPDatabaseCliente")
CASE cDBEngine = "SQLSERVER"
goDBHelper = CREATEOBJECT("SQLServerDatabaseCliente")
ENDCASE

y al momento de crear un cliente simplemente haríamos:
lOK = goDBHelper.bizCrearCliente(cCodigo, cNombre)

y no sabríamos (ni nos importaría) si ese cliente se está grabando en
una tabla DBF o en una tabla SQL Server. De hecho, podríamos hacer que
nuestro sistema fuera compatible con MySQL simplemente programando una
clase MySQLDatabaseCliente y haciendo el cambio apropiado en el inicio
del sistema; el resto del sistema seguiría funcionando sin necesidad
de hacer ningún cambio.

Espero estas cortas ideas te sean de utilidad para orientarte en lo
que quieres hacer.

Víctor Espina.

lm...@cclf.com.pe

unread,
Nov 26, 2010, 10:50:30 AM11/26/10
to publice...@googlegroups.com
Cuando dice SQL estas hablando de SQL para vfp o SQL server como motor de
base de datos?

Luis

-----Mensaje original-----
From: Gabriel Sandoval
Sent: Friday, November 26, 2010 1:34 AM
To: Comunidad de Visual Foxpro en Espa�ol
Subject: [vfp] Dudas sobre comandos SQL

Hola!! Buenas noches a toda la comunidad, en esta ocasion escribo
porque por ahora tengo dos dudas acerca de los comandos de SQL, las
cuales son:

1. Qu� es lo mejor?

Reply all
Reply to author
Forward
0 new messages