PDA

Ver la Versión Completa : ejemplo completo de ado solo por codigo???


sapoku
09-02-2007, 11:54:32
hola. es mi primer post y les informo que soy bastante newby en delphi.
estoy tratando de hacer un modulo u unit para manejar bases de datos, pero solo mediante codigo.

aqui estan las declaraciones de variables para la unidad.

unit b_d;
interface
uses
ADODB, SysUtils, DB, Messages, Windows;
VAR
// OBJETO PARA LA CONEXION A LA BD
CONEXION: TADOCONNECTION;
STRING_CONEXION: STRING;
// OBJETOS PARA CONECTAR A TABLAS
TABLA_CLIENTE:TADOTABLE;
// OBJETOS PARA FUENTES DE DATOS ---- DATA SOURCE
DS_CLIENTE: TDATASOURCE;

// DECLARACION DE FUNCIONES
FUNCTION INICIAR_CONEXION():BOOLEAN;
PROCEDURE TERMINAR_CONEXION();
FUNCTION INICIAR_CLIENTES():BOOLEAN;
PROCEDURE MSJ_PRUEBA();

luego genero una funcion para inicializar la conexion, la cual anda bien.

FUNCTION INICIAR_CONEXION():BOOLEAN;
VAR
PROVEEDOR, SERVER, DATABASE, UID,PWD :STRING;
BEGIN
PROVEEDOR:='DRIVER={MySQL ODBC 3.51 Driver};';
SERVER:='SERVER=localhost;';
DATABASE:='DATABASE=sistema_apolonia;';
UID:='UID=root;';
PWD:='PWD=marciano;';
String_CONEXION := PROVEEDOR + SERVER + DATABASE + UID + PWD+ ' OPTION=3' ;
try
CONEXION := TADOConnection.Create(nil);
CONEXION.ConnectionString := String_CONEXION;
CONEXION.Open();
MSJ_PRUEBA();
INICIAR_CONEXION := true;
except
INICIAR_CONEXION := false;
end;
end;

mi problema esta en cuando quiero conectar el elemento ttable, para el cual genere una funcion.

FUNCTION INICIAR_CLIENTES():BOOLEAN;
BEGIN
try
TABLA_CLIENTE.Connection := CONEXION;
TABLA_CLIENTE.TableName:= 'ficha_paciente';
TABLA_CLIENTE.Active:= TRUE;
DS_CLIENTE.DataSet := TABLA_CLIENTE;
DS_CLIENTE.Enabled:= TRUE;
MSJ_PRUEBA();
INICIAR_CLIENTES:= TRUE;
finally
INICIAR_CLIENTES:= FALSE;
end;
end;
PROCEDURE MSJ_PRUEBA();
BEGIN
MessageBox(0,
pchar( ''
+#13#10+' BASE INICIADA CORRECTAMENTE '),
pchar('MENSAJE DE PRUEBA'),
MB_OK+MB_ICONINFORMATION);
end;

me da un error cuando trato de entregar el objeto conexion.


cualquier ayuda sera muy agradecida...

ContraVeneno
09-02-2007, 16:44:02
Bienvenido a los foros, date una vuelta por esta página (http://www.clubdelphi.com/foros/guiaestilo.php), y por esta otra (http://www.clubdelphi.com/foros/showthread.php?t=10005).

Ahora bien
¿cuál error es el que te marca?

sapoku
09-02-2007, 21:37:32
He logrado solucionar mi problema.
Solo faltaba crear los objetos.

todo el codigo estaba bien, aca les pongo la funcion para iniciar ttable completamente funcional.

FUNCTION INICIAR_CLIENTES():BOOLEAN;
BEGIN
try
//INICIO DE TABLA
tabla_cliente:= tadotable.Create(tabla_cliente);
TABLA_CLIENTE.Connection := CONEXION;
TABLA_CLIENTE.TableName:= 'ficha_paciente';
TABLA_CLIENTE.Active:= TRUE;

// INICIO DE DATA SOURCE
DS_CLIENTE:= TDATASOURCE.Create(DS_CLIENTE);
DS_CLIENTE.DataSet := TABLA_CLIENTE;
DS_CLIENTE.Enabled:= TRUE;
INICIAR_CLIENTES:= TRUE;
finally
INICIAR_CLIENTES:= FALSE;
end;

end;

:Dno mas errores, y corre.
la idea, es tener un modulo exclusivo para manejar la base de datos.

sl2 y gracias por leerme.

Lord Sappokus
PD: juagadores visiten www.ogame.com.es

sapoku
11-02-2007, 01:10:30
lamentablemente ahora tengo un nuevo problema.
la funcion de filtro no me funciona bien.

me da el siguiente error:

'argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros'

Lo mas raro, es que algunos filtros funcionan otros no.
por ejemplo, este fuciona .

procedure TForm2.BT_BUSCAR_RUTClick(Sender: TObject);
begin
TABLA_CLIENTE.Filter:= 'RUT = ' + E_RUT.Text ;
TABLA_CLIENTE.Filtered :=TRUE;
end;

ahora, el siguiente ya no funciona.

procedure TForm2.BT_BUSCAR_RUTClick(Sender: TObject);
begin
TABLA_CLIENTE.Filter:= 'nombres = claudio' ;
TABLA_CLIENTE.Filtered :=TRUE;
end;

ambos campos en la BD son de tipo varchar(50), la unica diferencia es que rut es clave primaria.

cualquier ayuda sera agradecida..

basti
11-02-2007, 12:50:58
El problema está en las comillas, RUT supongo que es un campo numérico y por eso funciona bien. Nombres supongo que es un campo cadena, así que no te irá bien así, sin comillas en el nombre. Prueba lo siguiente
TABLA_CLIENTE.Filter := 'nombres=' + QuotedStr('claudio');

sapoku
11-02-2007, 20:32:29
hueno, como decia el post, ambos campos tienen el mismo tipo de dato.
pero ahora me dejaste con toda la duda, para que se usa el QuotedStr????

hueno, tratare de todas formas para ver que pasa... sl2

sapoku
12-02-2007, 02:49:51
Estimados...
Ahora les tengo un comportamiento mas extraño todavia.
Logre hacer que el error desapareciera, pero lo interesante es el como....

basta con que el primer caracter ingresado en el edit sea un numero, y el problema se soluciona.. ahora, esto no sirve, dado que estoy tratando de buscar un nombre,...

ahora si que no tengo idea que esta pasando.
Por favor ayudenme..

Obi wan, tu eres mi unnica esperanza,,..

basti
12-02-2007, 12:10:53
Sigo pensando que el problema está en las comillas, lo que te puse antes debería funcionar. No uso ADO, pero en el resto de sistemas de acceso a base de datos funcionaría de esta manera.

Sacado de la ayuda de Delphi:

Use QuotedStr to convert the string S to a quoted string. A single quote character (') is inserted at the beginning and end of S, and each single quote character in the string is repeated.

sapoku
12-02-2007, 20:25:45
Tenias toda la razon...
Trate con el quotedstr y funciono perfecto.
lo unico es que busca coincidencias exactas, creo que hay una opcion del filter que permite busquedas parciales.

hueno, una vez arreglado ese detalle posteo una funcion de busqueda completa.

knife_sj
26-02-2007, 22:34:36
1º no te recomiendo que uses adotable, personalmente prefiero las ADOQuery, el compilador suele tirarme un error con las table cuando se abren.

2º tampoco recomiendo que uses filter, es mejor que uses los querys como por ejemplo:

Código Delphi [-] (http://www.clubdelphi.com/foros/#) ADOQuery1.SQL.Text := 'select * from clientes where nombre like ''%'+Edit1.Text+'%''';


los % son opcionales, si no pones el del principio te buscara todo los registros que empiezen con lo que contenga el edit

y si no pones el del final te busca los que terminen con lo que contenga el edit

sapoku
27-02-2007, 01:57:52
Yo no he tenido problemas, especialmente ahora que se trabaja en codigo.

respecto a usar querys.

El software que estoy desarrollando prefiero que no acceda muchas veces a la BD. Esto se debe a que estoy trabajando con un campo para huellas dactilares, y al momento de hacer busquedas tendria que repetir el query para sacar elemento a elemento, mientras que usando filter, se hace la extraccion solo una vez y luego se mueven los datos en memoria.

Pero esto es un caso especial, dado que las busquedas no las puede realizar un query, si no que las hace un dll especial.

Para que quede constancia, la mayor diferencia de trabajar con filter y query, es netamente que la busqueda por query le da la tarea a la BD, mientras que el filter, filtra la informacion en la aplicacion. Esto produce diferencia en rendimiento y velocidad, y hay que ser muy cuidadoso, especialmente si estas en una BD que trabaja en server con muchos request.