Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Consulta en Tabla (https://www.clubdelphi.com/foros/showthread.php?t=59508)

Abuelo7 29-08-2008 12:47:51

Consulta en Tabla
 
Hola a todos.
Necesitaría un pequeño ejemplo de lo siguiente:

Tengo una base de datos con una tabla.
Dicha tabla tiene varias filas con 6 campos cada una.
El primer campo de nombre "pregunta" y los otros 5 Respuesta1 a Respuesta 5.
Lo que pretendo es iniciar una búsqueda por pregunta y al hallarla visualizar aleatoriamente 1 de las 5 respuestas.

Estoy atascado en este tema y por ello agradecería enormemente un pequeño ejemplo para salir del atasco.

Utilizo el Delphi 7

Gracias por vuestra atención.

Saludos.
Manuel Reixach

Caro 29-08-2008 13:08:03

Hola Abuelo7, puedes utilizar la función Random.

Código Delphi [-]
var
 respuesta : Integer;
 RespuestaCad : String;
begin
  ...................
  //Asumimos que ya tenemos la busqueda
 Randomize;
 respuesta := RandomRange(1,5); 

 Case respuesta of
   1: RespuestaCad := Query1.FieldByName('respuesta1').AsString;
   2: RespuestaCad := Query1.FieldByName('respuesta2').AsString;
   3: RespuestaCad := Query1.FieldByName('respuesta3').AsString;
   4: RespuestaCad := Query1.FieldByName('respuesta4').AsString;
   5: RespuestaCad := Query1.FieldByName('respuesta5').AsString;
  end;

Saluditos

Abuelo7 02-09-2008 11:22:11

Cita:

Empezado por Caro (Mensaje 310170)
Hola Abuelo7, puedes utilizar la función Random.

Código Delphi [-]
var
 respuesta : Integer;
 RespuestaCad : String;
begin
  ...................
  //Asumimos que ya tenemos la busqueda
 Randomize;
 respuesta := RandomRange(1,5); 

 Case respuesta of
   1: RespuestaCad := Query1.FieldByName('respuesta1').AsString;
   2: RespuestaCad := Query1.FieldByName('respuesta2').AsString;
   3: RespuestaCad := Query1.FieldByName('respuesta3').AsString;
   4: RespuestaCad := Query1.FieldByName('respuesta4').AsString;
   5: RespuestaCad := Query1.FieldByName('respuesta5').AsString;
  end;

Saluditos

Hola Caro.
Ante todo perdona el retraso en agradecer tu ayuda.
Me ha quedado muy claro.
He tardado tanto porque estoy batallando con una pequeña prueba pero no sé por que motivo no logro hacer lo que quiero.
Se trata de lo siguiente:
Tengo una tabla Paradox con 2 campos, (pregunta,respuesta).Ambos campos de texto.
He creado un Form con lo siguiente:
1 DataSource
1 Table
1 Edit1
1 Edit2
1 Button para salir
Necesito hacer lo siguiente:
Al introducir un texto (pregunta) en Edit1 que busque en la tabla y si lo encuentra
que aparezca la (respuesta) en el Edit2.
He realizado un montón de intentos y me aclaro.
Supongo que con la edad se me cruzan las neuronas.
Agradecería mucho tu ayuda.
Un cordial saludo.
Manuel Reixach

felipe88 02-09-2008 15:25:15

Intenta un query simple:
Código SQL [-]
select respuesta from tu_tabla where pregunta = 'tu_pregunta'
O si usas la tabla, prueba con un Locate

tcp_ip_es 02-09-2008 15:46:09

en esencia es lo que dice Felipe pero para completar....
En principio el Datasource no te serviría para nada ya que no tienes ningún
control que lo utilice yo utilizaría un Tquery y un database (entendiendo que accedes por BDE a la BD) con lo que nos quedaría:

1 button, 2 Edit, un query y un database

El database lo apuntas a la bd y el query al database y

Código Delphi [-]
//en el onbuttonclick del button
tuquery.clear;
tuquery.add('select respuesta from tu_tabla where pregunta = ''' +Editpregunta.text + '''');
tuquery.open;
if not(tuquery.isempty) then
 editrespuesta.text:=tuquery.fieldbyname('respuesta').asstring
else
 editrespuesta.text:='No existe respuesta a tu pregunta.';
//fin del onbuttonclick del button

Caro 02-09-2008 15:54:28

Hola de nuevo Abuelo7, puedes utilizar la función Locate para buscar la pregunta, si la opción es loPartialKey te hara una busqueda aproximada si es loCaseInsensitive te hara una busqueda exacta sin tomar en cuenta mayusculas y minusculas.

Código Delphi [-]
 //Si el locate nos devuelve True, es porque a encontrado
 if Table1.locate('pregunta',EditPregunta.Text,[loCaseInsensitive]) then  
  begin
    //En esta linea solo estamos colocando otro campo en el edit2
    EditRespuesta.Text := Table1.fieldByName('respuesta').AsString;
 
   //En vez de la anterior linea entraria el codigo que te puse al principio
   //porque ya estamos posicionados sobre esa pregunta
  end;

Yo te aconsejo que utilises un query en vez un table, también trae la función Locate y se usa de la misma forma, ademas que tienes opción para hacer consultas. Una observación, no sería mejor que al usuario le permitieras escoger la pregunta en vez de que la escriba, porque si es una pregunta larga y no la escribe bien, no la encontrara.

Saluditos

Abuelo7 03-09-2008 13:36:09

Hola a todos.
Ante todo muchas gracias a vosotros por vuestra ayuda.Al fin lo conseguí.

Lo he hecho como tú me decías amigo Caro.
En cuanto a lo que me comentas de que el usuario escoja la pregunta, no es posible por una razón.

Lo que estoy empezando a construir es un programa de IA, donde el usuario entrará una frase o palabra y el programa contestará, si encuentra, con alguna frase o palabra asociada.

En principio tengo una tabla para hacer la prueba, que ha resultado bien, la tabla tiene 3 preguntas y tres respuestas.
Buenos días, contesta--muy buenos
Buenas tardes,contesta--buenas las tengas
Hola, contesta--hola amigo.

Esta prueba ha ido perfecta.

Ahora lo siguiente es que tanto la entrada como la salida aparezcan en un ListBox, con lo cual el usuario irá viendo como va la conversación.

Ademas y a ser posible en lugar de una respuesta, habrán varias, y que con un Randomize contestará una de ellas aleatoriamente.

Bueno y muchas mas ideas que tengo para ir haciendo.

Que os parece?

Creo que no está mal para mis 70 años.

Un cordial saludo.

Caro 03-09-2008 13:51:59

Cita:

Empezado por Abuelo7 (Mensaje 311416)
Lo he hecho como tú me decías amigo Caro.

Soy amiga, amiguito Abuelo7.

Sobre añadir al ListBox, tendras que hacerlo, una vez que encuentra la respuesta.

Código Delphi [-]
  ListBoxPreguntas.Items.Add(RespuestaCad);
  ListBoxRespuestas.Items.Add(EditPregunta.Text);

Saluditos

Abuelo7 03-09-2008 14:42:38

Perdona amiga Caro.

Repito gracias por todo.
Estupendo lo del ListBox.

Ya te tendré al corriente de como voy desarrollando el tema.

Saludos cordiales.
Manuel Reixach

yusnerqui 03-09-2008 15:24:43

[quote=Caro]
Soy amiga, amiguito Abuelo7.
[quote]

Menos mal, me tranquiliza que yo no sea el único :)

yusnerqui 03-09-2008 15:57:26

[quote=Caro]
Soy amiga, amiguito Abuelo7.
[quote]

Menos mal, me tranquiliza que yo no sea el único :)

Caro 03-09-2008 16:03:14

Cita:

Empezado por yusnerqui (Mensaje 311481)
Menos mal, me tranquiliza que yo no sea el único :)

No eres el unico amiguito, solo ayer, en 3 hilos me han llamado amigo :( :D.

Cita:

Empezado por Abuelo7 (Mensaje 311434)
Ya te tendré al corriente de como voy desarrollando el tema.

;) Ok

Saluditos

yusnerqui 03-09-2008 16:35:46

Es lo que yo decia, con ese nik :confused: Si al menos pucieras un avatar más aclaratorio/descriptivo :D

yusnerqui 03-09-2008 16:46:47

Abuelo, que tal una tabla de búsqueda para las preguntas y otra para las respuestas con una relacion de uno a varios, así por cada pregunta tienes x cantidad de respuestas y no tienen que ser solo cuatro, esto tiene la posibilidad de ir enriqueciendo las respuestas, porque tu programa me puede preguntar "como estás?", y yo le puedo responder, "aqui guapeando" y entonces el detectar que es una respuesta que no tiene y agregarla al arcenal de respuestas pocibles :)

Claro que eso es solo una idea más, el objetivo es no limitar a solo cuatro respuestas por preguntas y que el programa se retroalimente de las conversaciones.

Saludos

Abuelo7 05-09-2008 10:40:03

Hola amigos y amigas.

Respecto al tema que me está preocupando tengo lo siguiente:
unit PruebaBuena4;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
DataSource1: TDataSource;
Table1: TTable;
EditPregunta: TEdit;
procedure Button1Click(Sender: TObject);
procedure EditPreguntaKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.EditPreguntaKeyPress(Sender: TObject; var Key: Char);

var

respuesta : Integer;
RespuestaCAD : String;
begin
If key=#13 then


begin
Table1.Open;
If Table1.Locate('pregunta',EditPregunta.Text, [loCaseInsensitive]) then
Randomize;
respuesta := Random(5);
Case respuesta of
1: RespuestaCAD := Table1.fieldByName('respuesta1').AsString;
2: RespuestaCAD := Table1.fieldByName('respuesta2').AsString;
3: RespuestaCAD := Table1.fieldByName('respuesta3').AsString;
4: RespuestaCAD := Table1.fieldByName('respuesta4').AsString;
5: RespuestaCAD := Table1.fieldByName('respuesta5').AsString;
end;
Table1.Close;
begin



ListBox1.Items.Add(EditPregunta.Text);
ListBox1.Items.Add(RespuestaCAD);

EditPregunta.Text :='';



end;
end;
end;
end.

Me aparece un problema y es que al introducir una frase o palabra, por ejemplo 'hola' a veces me contesta bien con una de las 5 respuestas posibles, pero a veces falla y no contesta nada.
Lo tengo programado para que en el ListBox aparezca la frase del usuario y la respuesta, con lo cual cuando falla, solo aparece la frase del usuario y una línea en blanco.
Podeís decirme que estoy haciendo mal.?

Gracias.

Manuel Reixach

tcp_ip_es 05-09-2008 11:03:38

existe un begin mal puesto...a parte el ramdom de 5 puede darte valor 0 y no lo tienes contemplado...mejor ponerlo a 4 :D... el procedure quedaría asi.

Código Delphi [-]
procedure TForm1.EditPreguntaKeyPress(Sender: TObject; var Key: Char);
var
 respuesta : Integer;
 RespuestaCAD : String;
begin
 If key=#13 then
 begin
  Table1.Open;
  If Table1.Locate('pregunta',EditPregunta.Text, [loCaseInsensitive]) then
  begin
   Randomize;
   respuesta := Random(4);
   Case respuesta of
    0: RespuestaCAD := Table1.fieldByName('respuesta1').AsString;
    1: RespuestaCAD := Table1.fieldByName('respuesta2').AsString;
    2: RespuestaCAD := Table1.fieldByName('respuesta3').AsString;
    3: RespuestaCAD := Table1.fieldByName('respuesta4').AsString;
    4: RespuestaCAD := Table1.fieldByName('respuesta5').AsString;
   end;
   Table1.Close;
   ListBox1.Items.Add(EditPregunta.Text);
   ListBox1.Items.Add(RespuestaCAD);
   EditPregunta.Text :='';
  end;
 end;
end;

Abuelo7 05-09-2008 11:20:58

Hola Tony.
Gracias por tu ayuda.

De todas formas, he modificado el procedure como tú me indicas y sigue pasando lo mismo, hay alguna frase que no me la contesta.
Supongo que debe haber algo más que esta mal.

Saludos

Manuel

tcp_ip_es 05-09-2008 11:33:49

que raro, lo veo un poco imposible si haces un random de 4 solo puede salir 0,1,2,3,4 con lo que tienes acotada las posibilidades y RespuestaCAD siempre se rellena.... como no sea que en la tabla tengas alguna de las 5 respuestas vacia a alguna pregunta:confused:.....

Abuelo7 05-09-2008 12:35:34

Hola otra vez Tony.

Parece ser que he encontrado el fallo.

En la tabla he tenido que renombrar los campos de respuesta, que estaban de respuesta1 a respuesta5, y poner de respuesta0 a respuesta4.

Y en el case, que estaba todo de 1 a 5, poner de 0 a 4.

Ahora lo he probado varias veces y no ha fallado ninguna.

Saludos.
Manuel

Caro 05-09-2008 13:43:56

Cita:

Empezado por Abuelo7 (Mensaje 311995)
En la tabla he tenido que renombrar los campos de respuesta, que estaban de respuesta1 a respuesta5, y poner de respuesta0 a respuesta4.
Y en el case, que estaba todo de 1 a 5, poner de 0 a 4.
Ahora lo he probado varias veces y no ha fallado ninguna.

Hola de nuevo, como te has dado cuenta al utilizar solo Random te toma en cuenta el 0 mas, es por eso que en el primer codigo que te puse he utilizado RandomRange(1,5); para que siempre nos devuelva un valor entre 1 y 5.

Saluditos


La franja horaria es GMT +2. Ahora son las 10:46:43.

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