PDA

Ver la Versión Completa : Consulta en Tabla


Abuelo7
29-08-2008, 12:47:51
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.


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
Hola Abuelo7, puedes utilizar la función Random.


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:
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


//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.


//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
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.


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
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.

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.


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
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

Abuelo7
05-09-2008, 17:46:23
Hola Caro

Me pasa una cosa muy curiosa.
Ahora el programa siempre contesta a la frase de entrada y varía la respuesta, pero la respuesta4, que en realidad es la 5 no aparece nunca en ninguna de las 4 frases de entrada que tengo de prueba.

Lo que me comentabas de RandomRange(1,5), el Delphi5 que estoy utilizando no me lo acepta.

Gracias
Saludos amiga.
Manuel

Caro
05-09-2008, 18:31:45
Hola de nuevo amiguito, lo que pasa es que la función Random te va devolver un numero aleatorio que sea mayor o igual a 0 pero menor al parametro que le pasas, por lo tanto no debes pasarle 4 sino 5 Random(5).

Saluditos

Abuelo7
05-09-2008, 18:59:06
Muchas gracias Caro.

Bueno, ahora ya tengo la primera parte. Ahora voy a seguir porque todavía me queda mucho trabajo.
He de ampliar mucho la tabla.
He de tener en cuenta que puede haber solo 1 respuesta o 5 o más.
Debería tener opciones para grabar las conversaciones.

Bueno y muchas más cosas que se me ocurren.

No sé si tú has oído hablar de un programa llamado Zebal, que de verdad te digo que era una maravilla a mi entender.
Recordaba tu nombre, el tiempo que hacía que no conversabas con él.
Si le decías en una conversación por ejemplo algo de 'chocolate', e una próxima sesión, de pronto te decía que porque no le hablabas del chocolate.

Lástima que estaba construído en Clipper y no hay programa fuente y el programador ha desaparecido.

Bueno, no te canso más.

Hasta luego.

Manuel.

Abuelo7
07-09-2008, 10:51:41
Hola amigos/amigas.

La última modificación que he hecho en el programa, ha sido cambiar el ListBox por un Memo. De esta forma, cuando se entabla una conversación con el programa, las frases de preguntas y respuestas van apareciendo en la parte de abajo y desapareciendo por arriba, prescindiendo de lo larga que sea la conversación.
Ahora voy a pelearme con el tema de trabajar con varias tablas a la vez.

Gracias por vuestra atención.

Saludos

Manuel

Abuelo7
07-09-2008, 19:50:20
Hola otra vez.

El asunto de trabajar con 2 tablas ya lo tengo solucionado.

Ahora necesitaría vuestra ayuda para lo siguiente:

Al introducir una frase o cadena de texto en un Edit que pueda separar la cadena por palabras, asignando cada palabra a una variable, para poder trabajar despues con cada una.

En resumen es lo siguiente:

que una vez tenga las variables de las palabras, comprobar una por una si existen en las tablas y en función del resultado, preparar la respuesta.

Gracias
Saludos.
Manuel

Caro
08-09-2008, 02:47:15
Ahora necesitaría vuestra ayuda para lo siguiente:

Al introducir una frase o cadena de texto en un Edit que pueda separar la cadena por palabras, asignando cada palabra a una variable, para poder trabajar despues con cada una.


Hola Manuel, para separar tu cadena en palabras puedes utilizar un stringList y utilizar sus funciones Delimiter y DelimiterText, has esta pruebita y tu ves como lo acomodas a tu codigo.


var
sl : TStringList;
begin
sl := TStringList.Create;

sl.Delimiter := #32; //nuestro delimitador sera el espacio
sl.DelimitedText := Edit1.Text;

for i:=0 to sl.Count-1 do
showmessage('La palabra es: '+sl[i]);

sl.Free;
end;


Saluditos

Abuelo7
09-09-2008, 11:27:30
Hola Caro.

Gracias por tu última ayuda. Ha sido estupenda.

Ahora tengo un problema con el código que te paso.
Como verás en él, quiero que cuando se pregunte 'que hora es?', conteste acertadamente y cuando se pida 'que fecha es hoy' también.

El problema que tengo es que en cuanto a la hora aparece bien en el Memo,
pero si a continuación pregunto la fecha, aparece bien, pero antes sale 0.00.00.

Me puedes revisar el código?

Gracias una vez más.
Manuel

Abuelo7
09-09-2008, 11:28:25
Perdona me olvidé el código.
unit saberHora;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(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.Edit1KeyPress(Sender: TObject; var Key: Char);
var
DateTime : TDateTime;
Str : String;
pregunta : String;
begin
if key=#13 then
begin
pregunta := Edit1.Text;

if pregunta=('que hora es?') then

DateTime := Time; // store the current date and time
str := TimeToStr(DateTime); // convert the time into a string
Memo1.Lines.Add(Str);

Edit1.Text:='';

end;
begin


if pregunta=('que fecha es hoy') then
begin
DateTime := Date;
str := DateToStr(DateTime);

Memo1.Lines.Add(Str);

end;
end;
end;

end.

Caro
09-09-2008, 13:27:04
Manuel te falta un begin en tu if donde preguntas la hora, ademas que veo otro begin volando por ahí.


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
DateTime : TDateTime;
Str : String;
pregunta : String;
begin
if key=#13 then
begin
pregunta := Edit1.Text;

if pregunta=('que hora es?') then
begin //el que falta
DateTime := Time; // store the current date and time
str := TimeToStr(DateTime); // convert the time into a string
Memo1.Lines.Add(Str);
Edit1.Text:='';

end;
//begin //este volando, debes quitarlo
if pregunta=('que fecha es hoy') then
begin
DateTime := Date;
str := DateToStr(DateTime);

Memo1.Lines.Add(Str);

end;
end;
end;


cuando pogas codigo, colocalo entre las etiquetas [ delphi] [ /delphi] , sin los espacios, para que tu codigo se vea mejor y se entienda mucho mas rapido.

Saluditos

Lepe
09-09-2008, 13:39:53
Manuel, te aconsejo cnpacks (http://www.cnpack.org/) es gratuito y colorea el código fuente, de esa forma con solo una visual mirando el color de cada trozo, sabes si te falta un begin o te sobra.

Saludos

Elite237
10-09-2008, 03:21:31
Hola, quisera pedir una ayuda, pues tengo un problema:

Tengo 3 combobox, un stringgrid y un boton. Lo que quiero hacer es que el usuario seleccione un estado, una sucursal y una zona, y que al momento de presionar sobre el boton me muestre los datos que seleccione para despues mandarlos a imprimir.

Espero me haya dado a entender y me tiendan su ayuda.

Abuelo7
10-09-2008, 15:59:05
Hola Caro.

La consulta anterior con tu respuesta el programa funcionó correctamente colocando lo [begin] en su lugar.

Quisiera hacerte otra consulta.

Tengo 2 tablas que estan ya llenas de datos y si lograse aprovecharlas me irían muy bien para el programa que estoy haciendo.

La tabla 1, tiene 2 campos 'palabra' y 'numero'
La tabla 2, tiene 2 campos 'numero' y 'respuesta'

Por lo que he podido analizar, parece ser que el número de la primera tabla se corresponde al numero de la segunda tabla.

Resumiendo, si introduces mediante programa una palabra cuyo numero es 2, enlaza con el numero 2 de la segunda tabla que es la respuesta.

Las tablas son .dbf

Crees que podría utilizarlas?
De que forma podría enlazar estos campos?

Gracias amiga.

Saludos
Manuel

Caro
11-09-2008, 13:56:43
Crees que podría utilizarlas?
De que forma podría enlazar estos campos?


Hola Manuel, deberías poder utilizarlas, yo no he manejado tablas dbf creo que son de DBase verdad. Supongo que ya te has podido conectar a tus tablas y las puedes ver desde delphi, para poder enlazarlas puedes hacer una consulta.


Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text := 'select numero, respuesta from Tabla2 '+
' where numero = '+QuotedStr(Numero);
Query1.Open;

if Not Query1.IsEmpty then //Si hay registro mostramos la respuesta
Showmessage(Query1.FieldByName('respuesta').AsString);


donde numero sería una variable que tenga el numero.

Saluditos

Abuelo7
12-09-2008, 13:11:46
Hola Caro.

He podido solucionar el tema, aunque he empleado otra forma.
Te adjunto el código para que le des un repaso, a ver que tal.



unit pruebazebal2;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
DataSource1: TDataSource;
DataSource2: TDataSource;
Table1: TTable;
Table2: TTable;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(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.Edit1KeyPress(Sender: TObject; var Key: Char);

var
respuesta : String;
respuesta2 : String;
begin
If Key=#13 then
begin
Table1.Open;
If Table1.Locate('palabra',Edit1.Text, [loCaseInsensitive]) then
begin
respuesta := Table1.fieldByName('NUMERO').AsString;
end;
Table1.Close;
Table2.Open;
If Table2.Locate('NUMERO',respuesta,[loCaseInsensitive]) then
begin
respuesta2 := Table2.fieldByName('RESPUESTA').AsString;
end;
Table2.Close;
Memo1.Lines.Add(Edit1.Text);
Memo1.Lines.Add(respuesta2);

Edit1.Text :='';
end;
end;


end.


Muchas gracias.

Manuel

ninguno
12-09-2008, 18:41:49
Hola Abuelo7

A ver qué te parece esta solución:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// si no es la tecla que buscamos, salimos y listo ;-)
if Key <> #13 then Exit;

// abrimos tablas
Table1.Open;
Table2.Open;
// ponemos el código en un bloque try..finally para asegurarnos de que pase lo que pase éstas se cierren
try
// si localizamos lo buscado en Tabla1 y su resultado en Tabla2, lo añadimos al Memo1
// Este if funciona debido a que SOLO se evaluará la segunda condición si la primera
// se cumple (por eso de ser un AND) y si la primera se cumple, ya estamos posicionados
// en el registro buscado (o al menos eso dice la teoría, no lo he probado xD)
if (Table1.Locate('palabra', Edit1.Text, [loCaseInsensitive])) and
(Table2.Locate('NUMERO', Table1.fieldByName('NUMERO').AsString, [loCaseInsensitive])) then
begin
Memo1.Lines.Add(Edit1.Text);
Memo1.Lines.Add(Table2.fieldByName('RESPUESTA').AsString);
end;
finally
Table1.Close;
Table2.Close;
Edit1.Text :='';
end;
end;


En tu código siempre asignas algo al Memo1. Si es lo que quieres, podemos cambiar algo ese código para que así sea. Por otro lado, tu código seguramente te dará algún warning o hint dado que usas respuesta2 sin que ésta esté inicializada (está dentro de un if que no tiene por qué realizarse).

Elite237
13-09-2008, 06:34:18
Hola Caro, gracias por tu tip, ya pude lograr lo del combobox, ahora mi duda es la siguiente, quiero que al momento de hacer doble clic me genere una consulta que me valide que lo que estoy haciendo clic sea igual a otro campo y me la muestre en otro DBgrid. Como le hago?Este es mi codigo de prueba:se que lo tengo que hacer en el evento dblclic, pero me manda un error con la sintaxis.


procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
query1.close;
query1.sql.clear;
query1.sql.add('select scob_ncobros,scob_periodo,scob_vendedor,scob_fecha from TSCOBROS');
query1.sql.add('where scob_vendedor = '''+DBgrid1.cells[6, sgPorVenta.row]+''' and scob_fecha>=''2008-08-01 09:00:00'' and scob_fecha<=''2008-08-31 21:00:00''');
query1.open;
showmessage(IntToStr(query1.recordcount));

Abuelo7
13-09-2008, 18:01:08
Hola ninguno.

Gracias por tu ayuda. En verdad lo he probado y tu código funciona perfectamente.

El problema es que ahora ya estoy trabajando con 4 tablas.

El asunto del Memo tiene que salir siempre la palabra o frase que introduzca el usuario y la respuesta que encuentre en la tabla 2 o en la 4.
Esto es: frase y respuesta.

Si has seguido el hilo verás que lo que estoy intentando es crear un programa de IA, na especie de Chattbot.

La mejor referencia que tengo es de un programa llamado Zebal que se escribió en Clipper. No hay código fuente, pero si las BD y tablas que utilizaba.

Es muy curioso el funcionamiento que se descubre al analizar las tablas.
Si le entras por ejemplo la frase 'estoy frito', te contesta 'que se siente al estar frito' o bien 'dime como es estar frito'. Como verás al detectar la palabra 'estoy' busca en las tablas y si la encuentra contesta con una de las frases vinculadas 'que se siente al estar' o 'dime como es estar' añadiéndole la palabra frito.

Como verás todo un lío.

Ademas hay palabras o frases con una número de clave en la tabla1 que se vinculan en la tabla2 con dicho número de clave, pero que a veces existe 5 o 6 veces. Es decir escoge la respuesta entre ellas ara que no sea siempre la misma.

Bueno además tiene otras lindezas, como preguntar el nombre del usuario, guardarlo y si vuelves a "charlar" al cabo de 3 meses, te dice qye cuanto tiempo sin hablar contigo.

Bueno, no te canso más.

Veremos como salgo de ésta.

Saludos.

Manuel Reixach

ninguno
13-09-2008, 20:34:44
Hola Abuelo7

Me alegra que te funcionara :)

Lo de 2 o 4 tablas es lo de menos, la idea al momento de realizar el if sería la misma :)

Con respecto a lo del memo, puedes hacer algo así


Memo1.Lines.Add(Edit1.Text);
if (Table1.Locate('palabra', Edit1.Text, [loCaseInsensitive])) and
(Table2.Locate('NUMERO', Table1.fieldByName('NUMERO').AsString, [loCaseInsensitive])) then
Memo1.Lines.Add(Table2.fieldByName('RESPUESTA').AsString);


pero tienes que tener en cuenta la posibilidad (aunque sea remota) de que el resultado de la búsqueda no retorno resultado alguno y, en esa situación, retornar algún tipo de respuesta estándar como "no entiendo la palabra X, podría explicármelo de otra forma", algo así


Memo1.Lines.Add(Edit1.Text);
if (Table1.Locate('palabra', Edit1.Text, [loCaseInsensitive])) and
(Table2.Locate('NUMERO', Table1.fieldByName('NUMERO').AsString, [loCaseInsensitive])) then
Memo1.Lines.Add(Table2.fieldByName('RESPUESTA').AsString)
else
Memo1.Lines.Add('no entiendo la palabra X, podría explicármelo de otra forma');


El ejemplo es con las 2 tablas, tendrías que adaptarlo a las 4 que uses ahora claro :)

Abuelo7
14-09-2008, 13:20:41
Hola ninguno.

Tu código ha funcionado perfectamente.
Ya estoy trabajando con las 4 tablas, sin ningún problema.
También he adicionado, en caso de que no encuentre la palabra o frase, el mensaje 'no encuentro lo que me dice, podría definirlo mejor?.Gracias'.

Voy a estar una semana de vacaciones.

De todas formas te comento lo siguiente por si me puedes dar una ayuda.

1.- Quisiera grabar la conversación en una tabla o fichero de texto, según veas mejor.

2.- Como debo hacerlo para que al detectar una palabra que no entiende, dentro de una frase, la guarde para añadirla en la respuesta.
Ejemplo: 'estoy frito'. Hay una frase de respuesta vinculada a 'estoy' que es 'que se siente al estar' y a eso se le ha de añadir 'frito'.

Perdona si estoy abusando mucho de tu amabilidad.
Muchas gracias y un cordial saludo.
Manuel Reixach

P.D. Desde el lugar de vacaciones iré dando un vistazo por el Foro.

ninguno
14-09-2008, 15:23:19
Hola Abuelo7


1.- Quisiera grabar la conversación en una tabla o fichero de texto, según veas mejor.


¿Qué quieres hacer luego con esa información? Es que dependiendo de lo que quieras hacer, será mejor/más fácil una opción u otra.


2.- Como debo hacerlo para que al detectar una palabra que no entiende, dentro de una frase, la guarde para añadirla en la respuesta.
Ejemplo: 'estoy frito'. Hay una frase de respuesta vinculada a 'estoy' que es 'que se siente al estar' y a eso se le ha de añadir 'frito'.


Entiendo que la palabra a buscar que puede fallar es lo escrito en Edit1 (si no es así corrígeme), por lo que será sencillo controlar esa palabra en la frase de respuesta:


Memo1.Lines.Add(Edit1.Text);
if (Table1.Locate('palabra', Edit1.Text, [loCaseInsensitive])) and
(Table2.Locate('NUMERO', Table1.fieldByName('NUMERO').AsString, [loCaseInsensitive])) then
Memo1.Lines.Add(Table2.fieldByName('RESPUESTA').AsString)
else
Memo1.Lines.Add('no entiendo la palabra ' + Edit1.Text + ', podría explicármelo de otra forma');


PD: felices vacaciones

Abuelo7
14-09-2008, 16:06:37
Hola inguno.

El tema de grabación quisiera poder utilizarlo después en futuras conversaciones, por ejemplo recordar nombre de usuario, fecha y demás.

En cuanto al asunto de la respuesta, se trata de lo siguiente:
Parte de lo contenido en el Edit1.Text y que no encuentra, hay que añadirlo al final de la Respuesta que sí ha encontrado.
Es el caso de 'estoy frito'.
Encuentra la respuesta a 'estoy' = 'que se siente al estar'
Le añade 'frito'
Y la respuesta queda así: 'que se siente al estar frito'.

Gracias amigo.

Manuel

Caro
16-09-2008, 03:02:51
ahora mi duda es la siguiente, quiero que al momento de hacer doble clic me genere una consulta que me valide que lo que estoy haciendo clic sea igual a otro campo y me la muestre en otro DBgrid. Como le hago?Este es mi codigo de prueba:se que lo tengo que hacer en el evento dblclic, pero me manda un error con la sintaxis.


Hola Elite237, escribe cual es el error que te sale, que recuerde estas manejando StringGrid verdad, o es que ya lo has cambiado a DBGrid, lo digo por el nombre que tiene "DBgrid1".

Saluditos

ninguno
16-09-2008, 09:22:04
Hola

El tema de grabación quisiera poder utilizarlo después en futuras conversaciones, por ejemplo recordar nombre de usuario, fecha y demás.

Bueno, si es para recordar determinados datos personales y poderlos usar en conversaciones futuras, yo usaría una base de datos (¿Firebird?)

En cuanto al asunto de la respuesta, se trata de lo siguiente:
Parte de lo contenido en el Edit1.Text y que no encuentra, hay que añadirlo al final de la Respuesta que sí ha encontrado.
Es el caso de 'estoy frito'.
Encuentra la respuesta a 'estoy' = 'que se siente al estar'
Le añade 'frito'
Y la respuesta queda así: 'que se siente al estar frito'.


Esta parte es la que no termino de entender. Según el código expuesto anteriormente, tu no buscas palabras contenidas en Edit1, sino que buscas todo el contenido de Edit1. Entonces, ¿cómo puedes saber qué palabra usar? ¿O lo que buscas son frases completas? Si es así, ¿Cómo las comparas?

Abuelo7
16-09-2008, 10:12:09
Hola amigo ninguno.

De acuerdo en lo de utilizar una base de datos con una tabla para almacenar los datos que puedan ser utilizados despues en conversaciones.

En los demas segun he podido averiguar al analizar las tablas, funciona de la siguiente manera.

En principio hay 4 tablas. 2 que contienen frases que puede introducir posiblemente el usuario. y 2 que contestan a esas frases.

Lo que ocurre, creo yo, es que primero busca la frase entera introducida, si no la encuentra, entonces separa las palabras de la frase y busca esas palabras una por una.
Ese es el caso de -estoy frito-, no encuentra la frase, pero luego al separar por palabras encuentra -estoy-, aplica la respuesta que tiene, en este caso -que se siente al estar- y le adjunta la palabra no encontrada, -frito-, con lo cual queda la respuesta completa, -que se siente al estar frito-.
Como veras un poco liado.

Gracias amigo.
Manuel.

Abuelo7
22-09-2008, 16:08:02
Hola amigos.

Ya estoy de vuelta de las mini-vacaciones.
Saludos a todos.

Manuel