Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda para el uso de TQuery (https://www.clubdelphi.com/foros/showthread.php?t=9021)

miguel_fr 10-04-2004 19:43:02

Ayuda para el uso de TQuery
 
hola espero me puedan dar una mano
Estoy comensando a programar en Sql y necesito un poco de ayuda.

Tengo un procedimiento que recibe y almacena un String en mi BD, yo necesitaria realizar un control de "no existencia" de dicho String en la Tabla para asi poder almacenarlo y no se como realizar esto.
Usando Ttable realizaba lo siguiente

Código:

{para controlar que no se repita}
with tabla1 do
 Begin
  first;
  while Not EOF do
  Begin
        if (Texto_a_ingresar = tabla1.fieldbyname('Mi_Campo').asstring) then
        Begin
          Application.MessageBox('ya existe el texto','Error'
          ,MB_DEFBUTTON1);
          exit; {salia}
        end;
        next;
  end;
 end;
{si llegaba aqui era porque no existia}
 tabla1.insert; // Ponia la tabla en modo insertar...
 tabla1.fieldbyname('Mi_Campo').asstring:=Texto_a_ingresar;
 tabla1.post; {guarda}

yo tengo entendido que todo eso se puede achicar muchisimo en Sql, me podrian dar una mano?

roman 10-04-2004 20:12:53

Esto lo puedes "achicar" aún usando un TTable. Tú realizas manualmente la búsqueda pero la componente TTable ya tiene métodos para realizar búsquedas como Locate o FindKey:

Código:

tabla1.open;
if tabla1.locate('Mi_Campo', Texto_a_ingresar) then
  Application.MessageBox('ya existe el texto','Error' ,MB_DEFBUTTON1);
else
begin
 tabla1.insert;
 tabla1.fieldbyname('Mi_Campo').asstring:=Texto_a_ingresar;
 tabla1.post;
end;

Con un Query podrías poner la siguiente sentencia:

select * from tabla where Mi_Campo=Texto_a_ingresar

y ejecutas la consulta con Query.Open. Si la consulta te regresa por lo menos un registro es que ya existe uno con el texto. Si no te regresa ningún registro entonces lo insertas.

// Saludos

__cadetill 10-04-2004 20:18:42

achicar a nivel de código.... no, pero sí que verás/notarás cambio en el rendimiento

Código:

Query.Close;
Query.SQL.Clear;
Query.SQL.Add('select * from tabla where campo = ' + QuoteStr('mi_txto') );
Query.Open;
if Query.IsEmpty then
  Añadir

Por supuesto, faltaría el control de errores con try...except..end;

miguel_fr 10-04-2004 20:52:22

Código:

Query.Close; {supongo que siempre se tiene que cerrar el quiery antes de cambiar las lineas de sql? }
Query.SQL.Clear;
Query.SQL.Add('select * from tabla where campo = ' + QuoteStr('mi_texto') );
{no entiendo el uso de "QuoteStr('mi_texto')"
no se puede poner solamente "'mi_texto'" ?}
Query.Open; {para ejecutar mi Sql? }
 
if Query.IsEmpty then
Añadir

Muchas gracias me ayudo mucho estas lineas de codigo

Por supuesto, faltaría el control de errores con try...except..end;[/quote]

roman 10-04-2004 21:01:01

Cita:

Empezado por miguel_fr
no entiendo el uso de "QuoteStr('mi_texto')"
no se puede poner solamente "'mi_texto'" ?

Sí se puede. Lo que sucede es que muchas veces el texto a comparar provendrá de una variable de tipo string en lugar de poner directamente el texto. En esos casos deberás agregar las comillas dobles tú mismo o usar QuotedStr que lo hace por tí y permite mayor legibilidad del código.

Una observación. La idea de que con sql se logra mejor rendimiento es cierta cuando usas una base de datos "real". Si usas Paradox, normalmente el uso de TTable es más eficiente ya que está diseñado para ello. Paradox es particularmente lento con consultas sql que involucran campos de texto como en tu caso. Yo te recomiendo que hagas pruebas para ver cuál te resulta más rápido.

// Saludos

miguel_fr 10-04-2004 22:31:45

Cita:

Empezado por roman
En esos casos deberás agregar las comillas dobles tú mismo o usar QuotedStr que lo hace por tí y permite mayor legibilidad del código.

yo utiliso una variable, me sirve mucho la explicacion del QuotedStr
Cita:

Empezado por roman
Una observación. La idea de que con sql se logra mejor rendimiento es cierta cuando usas una base de datos "real".

no me queda muy claro lo de BD "real"
Cita:

Empezado por roman
Si usas Paradox, normalmente el uso de TTable es más eficiente ya que está diseñado para ello. Paradox es particularmente lento con consultas sql que involucran campos de texto como en tu caso. Yo te recomiendo que hagas pruebas para ver cuál te resulta más rápido.

Yo tengo hasta ahora solamente 3 tablas en Paradox
para usar sql tendria que generar las tablas del tipo SQL Server?

Los datos que voy a utilizar son solamente texto "nombres"
, rangos predefinidos "ej. pista = "hum" o "moj" o etc " y algunos numeros "enteros"
que me recomiendan que utilice? Ttable o Tquery
gracias de nuevo :)

__cadetill 11-04-2004 10:40:25

Cita:

Empezado por miguel_fr
no me queda muy claro lo de BD "real"

Con una BD "real" supongo que Román se referirá a una BD transaccional estilo Firebird, Interbase, SQL Server, Oracle,.....

Cita:

Empezado por miguel_fr
Yo tengo hasta ahora solamente 3 tablas en Paradox
para usar sql tendria que generar las tablas del tipo SQL Server?

No, con Paradox puedes usar también SQL, lo que pasa es que, como bien dice Román, el SQL en Paradox es más lento.

Cita:

Empezado por miguel_fr
Los datos que voy a utilizar son solamente texto "nombres"
, rangos predefinidos "ej. pista = "hum" o "moj" o etc " y algunos numeros "enteros"
que me recomiendan que utilice? Ttable o Tquery

Supongo que todo dependerá de lo que quieras hacer

miguel_fr 11-04-2004 13:43:48

Cita:

Empezado por cadetill
No, con Paradox puedes usar también SQL, lo que pasa es que, como bien dice Román, el SQL en Paradox es más lento.

entonces que tipo de BD deveria de usar para obtener todos los beneficios de SQL?¡
Cita:

Empezado por cadetill
Supongo que todo dependerá de lo que quieras hacer

Aprender a manejar SQL, almenos lo basico por ahora :p

__cadetill 11-04-2004 20:20:01

Si es para empezar y hacer pruebas (no complicandote demasiado la vida), con Paradox te vale. Pero más adelante, te recomiendo hagas el paso a un SGBD de los mencionados anteriormente

Nota: todos de pago menos Firebird (con licencia IPL Interbase Public Licence)

roman 13-04-2004 04:09:37

Cita:

Empezado por cadetill
... a un SGBD de los mencionados anteriormente

Nota: todos de pago menos Firebird (con licencia IPL Interbase Public Licence)

Entonces añadamos MySql a la lista :p

Sí, sí, ya sé, MySql carece de muuuuchas cosas pero lo que maneja lo hace muy acorde al estándar y para empezar (y yo diría muchas veces continuar) es bastante bueno.

// Saludos

__hector 13-04-2004 04:56:28

Yo diria que te valieras de una llave para el campo (primaria o restriccion UNIQUE del campo), intentaras insertar el valor, y manejaras la excepcion con un try/except

Asi, te evitarias tener que hacer la consulta cada vez, incluso cuando el valor no existe en la tabla. Seguro que el motor de la base de datos en su interior tiene metodos mas eficientes para detectar cuando el incumple o no una de sus restricciones.

jachguate 13-04-2004 08:15:56

Yo difiero en opinión a mi amigo cadetill en este punto. Creo que si aún no has empezado... es buena idea que comences de una vez con una base de datos SQL "real", como ya te han explicado por aqui.

interbase/firebird es muy buena opción... fácil de instalar, prácticamente libre de mantenimiento, y te enseñará de una vez a batallar en un campo mucho mas fertil que paradox... donde, según mi manera de ver, tenes mas riesgo de adquirir vicios y prácticas que luego no te valdrán al pasar a bases de datos c/s. Además, al inicar asi, tendrás de una vez la ventaja que tus proyectos serán mucho mas escalables, pues cuando tus clientes crezcan, podrán montarse en red, con acceso multiusuario, con mucho menos cambios (o quizas ninguno, si te preocupas de una vez por cuestiones de concurrencia) que si lo haces con Paradox. Además, aprenderás desde el principio a lidiar con los asuntos de estas bases de datos (en todos lados se cuecen habas.. ciertamente).

Hasta luego.

;)

miguel_fr 13-04-2004 15:04:50

Cita:

Empezado por jachguate
interbase/firebird es muy buena opción...

ok, ya estoy buscando sobre estas BD y encontre este enlace que les puede ayudar a los novatos como yo
http://www.interbase.com.mx/obtener_ib.php

Yo ya programe algo en paradox (muy basico), pero ahora queria entrar mas en el mundo de SQL, que a mi entender es lo mejor para BD.
muchas gracias por sus comentarios


La franja horaria es GMT +2. Ahora son las 17:44:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi