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)
-   -   Ultima Linea del DbGrid (https://www.clubdelphi.com/foros/showthread.php?t=69902)

Er0s 16-09-2010 20:17:34

Ultima Linea del DbGrid
 
Hola a todos de nuevo!!



Esto es lo que me ocurre cuando intento meter un cliente nuevo. El codigo que utilizo es el siguiente:

En el botón Nuevo:

Código Delphi [-]
datamodule1.clientes.last;
datamodule1.clientes.insert;

Y en este momento me pongo a rellenar DBedits. Utilizo el .INSERT antes de rellenar dbedits porque me los deja limpios. Si utilizo el .INSERT después de rellenar dbedits (en el botón aceptar) la funcion .Clear de los DBedits me los limpia pero en cuanto pico encima de cualquier dbedit, con el ratón, estos se llenan con los datos del ultimo cliente.

Lo que quiero es que cuando yo le de al botón "nuevo", la linea que en la foto se pone entre el último y el penúltimo registro, sea posterior al ultimo registro.

No se si me he explicado.

Gracias

Caral 16-09-2010 20:20:30

Hola
Tal vez:
Código Delphi [-]
datamodule1.clientes.append;
Saludos

Er0s 16-09-2010 20:26:54

Con que simplicidad y precisión explicáis las cosas........ que envidia.

Ahora el problema es que cuando me pongo a rellenar DBedits reaparecen los datos del ultimo cliente

Caral 16-09-2010 20:39:52

Hola
No se como llamas a la tabla.
Que usas: Table o query??
Esta ligado el DBGrid con los DBEdit??
Al Insertar haces un refresh??
Saludos

Casimiro Notevi 16-09-2010 20:47:32

Cita:

Empezado por Er0s (Mensaje 376658)
[..] Ahora el problema es que cuando me pongo a rellenar DBedits reaparecen los datos del ultimo cliente

¿Cómo es eso? :confused:

Por cierto, el datamodule1.clientes.last; sobra, no sirve para nada.

Er0s 16-09-2010 20:49:25

Utilizo una TADOTable y un datasource. El DataSource, a su vez,esta ligado a la DBGrid y a los DBedits.

Con el .append para realizar una insercción debo hacer lo siguiente.

- Nuevo cliente. Los DBedits aparecen todos limpios.
- Pico con el raton para empezar a rellenar datos y me aparecen los datos del ultimo cliente insertado.
- Cancelo
- Nuevo cliente de nuevo y ahora si funciona.

Es decir que para insertar un cliente, ahora mismo, debo presionar tres botones NUEVO CLIENTE,CANCELAR y NUEVO CLIENTE otra vez

Eso si el problema de la linea blanca entre dos registros se ha solucionado.

Er0s 16-09-2010 20:53:12

Cita:

Empezado por Casimiro Notevi (Mensaje 376660)
¿Cómo es eso? :confused:

Por cierto, el datamodule1.clientes.last; sobra, no sirve para nada.


si no ponia el .Last la linea blanca aparecia entre el cliente que en ese momento estubiese señalado y el anterior y por eso pense en la funcion LAST a ver si me solucionaba el problema

Caral 16-09-2010 20:55:17

Hola
Bien:
BD access?
Saludos

Er0s 16-09-2010 20:56:31

Cita:

Empezado por Caral (Mensaje 376664)
Hola
Bien:
BD access?
Saludos

Si BD de access

Caral 16-09-2010 20:59:51

Hola
Bien:
El programa y la bd son grandes?.
Si no son muy grandes quilate el EXE, pon el codigo y la BD en un ZIP y colocalo aqui, lo reviso con gusto, me sera mas facil dar con el asunto.
Saludos
PD: Lo unico que no me gusta es que usas componentes de tercero para los botones.

Er0s 16-09-2010 21:05:34

Todo comprimido no llegará a los 3 megas.

Advierto que el programa no esta optimizado y repito muchas instrucciones en lugar de hacer un procedimiento para no repetir tanto. (Lo dejo para cuando termine con los clientes y tenga todo claro)

Bueno cuando llegue a casa lo cuelgo y a ver que me decís.

Caral 16-09-2010 21:07:55

Hola
Bien; Cuando tengas tiempo lo pones.
Me extraña que sea tan grande, debes haber trabajado mucho.
Saludos

Caral 16-09-2010 22:18:17

Hola
Como tengo algo de tiempo me hice un ejemplo usando AdoTable y AdoQuery en master detail, para mi es la mejor manera de hacerlo ya que es SQL.
El ejemplo hace lo que se requiere:
Modifica, Elimina, Agrega, Guarda.
Como veo que en tu caso el cliente tiene un codigo me imagino que este deberá de ser unico, por eso el programita cuando agrega un nuevo cliente de una vez le da el numero que le corresponde asi se evitan duplicados.
Ademas se conecta por un ini, no se si el tuyo lo hara pero es mejor.
Espero te sirva de algo el ejemplo.
Saludos

Er0s 17-09-2010 00:18:29

Na... las imágenes es lo que mas pesa.

Ahi te dejo el programa.... no me metas mucha caña :P

http://www.megaupload.com/?d=OPREQMXN

Er0s 17-09-2010 01:14:43

Acabo de echar un cigarro en la terraza, pensando en el dichoso problemita.

Tenia que pulsar como he dicho antes el botón nuevo , cancelar y nuevo otra vez. Pues acabo de solucionar el problema

Código Delphi [-]
datamodule1.clientes.append;
datamodule1.clientes.append;

Es absurdo, raro, sin logica...... pero funciona. Ahora ya puedo insertar un cliente al final del DBGrid y sin que los DBEdits se llenen con los datos del ultimo cliente insertado.


Caral no te quemes la cabeza...seguro que en las próximas tablas todo rula sin estos absurdos.


Gracias

Casimiro Notevi 17-09-2010 01:33:20

Cita:

Empezado por Er0s (Mensaje 376684)
[..] Tenia que pulsar como he dicho antes el botón nuevo , cancelar y nuevo otra vez. Pues acabo de solucionar el problema
Código Delphi [-]
datamodule1.clientes.append;
datamodule1.clientes.append;
Es absurdo, raro, sin logica...... pero funciona. Ahora ya puedo insertar un cliente al final del DBGrid y sin que los DBEdits se llenen con los datos del ultimo cliente insertado.
Caral no te quemes la cabeza...seguro que en las próximas tablas todo rula sin estos absurdos.
Gracias

Amigo Er0s, aunque parezca absurdo y raro... seguro que sí tiene lógica si se encuentra el problema, ten en cuenta que estos errores son los que después en cualquier momento te vuelven loco porque el programa deja de funcionar y no sabes el motivo. Hay que encontrar el problema... sí ó sí, además que seguro que es algo simple, ya verás.
Es como si le dices a tu mecánico: "déjalo, no te quemes las pestañas, si frena a la segunda, pues le doy dos veces y se acabó. El problema es que hay un problema... y en cualquier momento dejará de frenar a la segunda y no frenará ;)

Er0s 17-09-2010 02:11:11

Por supuesto..que el problema hay que solucionarlo, pero para enseñar mañana el programita a mi colega, me vale de momento.

Gracias por vuestra ayuda y seguimos buscando el problema.

Caral 17-09-2010 04:42:05

Hola
Correcciones que hice:
1- Se creo un archivo INI para hacer la conexion (si tienes dudas, pregunta).
2- Se elimino la necesidad de las imagenes (se usaron los botones).
3- Se eliminaron los codigos innecesarios (muchos).
4- Se modifico los nombres de los campos( es importante).
5- El Campo ClienteID hay que cambiarlo de autoincremetal a numerico (no esta hecho todavía)
Por lo demas es un programa en proceso asi que es poco lo que se puede hacer.
Todo quedo funcionando igual que estaba, solo que ahora se entiende mejor.
Espero te sirva para mejorar tu codigo que para ser de un Aprendiz esta muy bien.
Saludos
PD: Mira la diferencia en el peso del programa, con todo e imagenes.;)

Casimiro Notevi 17-09-2010 10:09:01

Cita:

Empezado por Caral (Mensaje 376690)
[..] PD: Mira la diferencia en el peso del programa, con todo e imagenes.;)

Eso me hace falta a mí, ponerme a dieta, que me sobran un montón de kilos :)

Er0s 17-09-2010 11:45:26

Cita:

Empezado por Caral (Mensaje 376690)
Hola
Correcciones que hice:
1- Se creo un archivo INI para hacer la conexion (si tienes dudas, pregunta).
2- Se elimino la necesidad de las imagenes (se usaron los botones).
3- Se eliminaron los codigos innecesarios (muchos).
4- Se modifico los nombres de los campos( es importante).
5- El Campo ClienteID hay que cambiarlo de autoincremetal a numerico (no esta hecho todavía)

1- Ya habia visto eso lo del archivo ini por en el foro y todavía no lo habia aplicado, ya preguntare cuando me ponga a ello.
2- Las imagenes son necesarias, puesto que la posibilidad de meterlas en speedbuttons hace que tenga que transformar PNG o JPG a BMP y pierdo las transparencias .... por lo cual es mucho mas vistoso, a mi modo de ver.
3- Soy un desastre... pero al final lo coloco todo :D
4- Porque el cambio de nombres? cual es tu razón.
5- El campo ClienteId lo dejo Autoincremental puesto que dejare que el programa autoasigne la ID al cliente.... La única duda que me cabe aquí es la siguiente:
- Digamos que tenemos 10 Clientes. Si elimino el cliente 5 y el 7 me quedaran 8 clientes pero las IDS ya no serán seguidas. Eso se soluciona compactando la base de datos, lo que no se es como hacerlo desde el programa. Ya planteare la duda en otro hilo y lo discutimos.

Por lo demás he probado lo que has mandado y al compilar me da un montón de errores que he solucionado, casi todos en las llamadas a las imágenes y lo del INI no rula, ya miraremos porque. Introducir Clientes tampoco :S, debe ser de delphi 2006 a 2010, cualquier pijada, porque no pongo en duda tu sabiduria en el tema.

Gracias por haberte tomado la molestia de corregir mis errores

jafera 17-09-2010 13:54:45

Hola Eros.

Vigila con lo de compactar y cambiar las ID ya que si este campo se usa para relacionar tablas, vas a perder toda relacion que tengas y no te van a concordar los datos.

Si realmente quieres tener siempre el numero de clientes al dia, tienes que poner otro campo clave para futuras relaciones de tablas.

Es decir IdCliente como autoincremetal y seguido un Codigo Cliente que NO PUEDE VARIAR NUNCA.

Espero te sirva

Josep

Er0s 17-09-2010 15:59:35

Jafera no tengo las tablas relacionadas... pero gracias por la apreciación.

Casimiro.... el doble frenado acaba de fallar :S

Casimiro Notevi 17-09-2010 16:54:42

Cita:

Empezado por Er0s (Mensaje 376712)
Jafera no tengo las tablas relacionadas... pero gracias por la apreciación.

Una gran fuente de problemas :eek:

Cita:

Empezado por Er0s
Casimiro.... el doble frenado acaba de fallar :S

No me extraña, la verdad :(

Caral 17-09-2010 17:31:53

Hola
Las modificaciones las hice en un rato, sabia que tendrian algunos inconvenientes pero no me preocuparon por ser muy sencillos de solucionar.
Si te apetece solucionamos los problemas de una vez por todas para que el programa quede bien.
Por cierto: Lo del cambio de los nombres de los campos es por que para sql no caminan bien como los tenias.
Saludos

Er0s 18-09-2010 01:45:03

Cita:

Empezado por Caral (Mensaje 376720)
Si te apetece solucionamos los problemas de una vez por todas para que el programa quede bien.


Ok .... por mi no hay problema. Hago copia y borro código para empezar de 0.

Cita:

Empezado por Caral (Mensaje 376720)
Por cierto: Lo del cambio de los nombres de los campos es por que para sql no caminan bien como los tenias.

Sigo con BD de access, en SQL no he trabajado nunca, por ahora.

Caral 18-09-2010 01:48:26

Hola
Bien:
Que quieres hacer?
Que Quieres que modifiquemos? ( por mi todo esta bien).
Dime que hacemos paso a paso y le damos a esto.
Saludos
PD: Sql es el lenguaje para la BD, independientemente de access.

Er0s 18-09-2010 02:00:46

Casimiro... como voy a empezar un segundo diseño del programa, voy aprobar a diseñar de nuevo la BD relacionando las tablas. a ver si chapo la fuente de problemas. ;)

Er0s 18-09-2010 02:03:04

Cita:

Empezado por Caral (Mensaje 376763)
Hola
Bien:
Que quieres hacer?
Que Quieres que modifiquemos? ( por mi todo esta bien).
Dime que hacemos paso a paso y le damos a esto.
Saludos
PD: Sql es el lenguaje para la BD, independientemente de access.

Pues si te parece rediseño la BD relacionando las tablas y me das o me dais vuestra opinión?

Caral 18-09-2010 02:08:54

Hola
Me parece algo apresurado hacer una relacion de las tablas ya que lo que tienes son solamente 3 y por ningun lado veo una necesidad de relacion.
Tal vez cuando necesites hacer algun reporte entonces el mismo access te pedira la relacion, de ser necesaria.
Access es un archivo, no una bd de verdad, no amerita hacer cosas innecesariamente.
Es mi opinion.
Saludos

Er0s 18-09-2010 02:13:25

Que me dices de los nombres de los campos... me recomendaste cambiarlos

Dame un ejemplo de como lo harías y porque plz

Caral 18-09-2010 02:18:59

Hola
Los nombres de los campos los UNI osea:
Tu campo = CLiente ID
El mio = ClienteID.
Como ves, simplemente juntas las palabras; Por que?, por que al hacer una sentencia sql esta ve el contenido de los datos como string, palabra por palabra, en otra ocasion podriamos ampliar el por que, pero estoy seguro que empezando con sql tu mismo te darias cuenta de la razon.

Para mi es mas importante en este proceso saber:
1- Que quieres que haga el programa.?
2- Para que va a servir, que trabajo hara?.
3- Que apariencia quieres, la actual?.

Con estos tres puntos empezaríamos y vamos dandole forma.
Es un programa muy sencillo y pequeño, pero lo que me interesa es que entiendas el por que de cada cosa, no simplemente hacerlo.
Saludos

Er0s 18-09-2010 02:38:37

Los nombres de los campos siempre los he puesto como una sola palabra, esta ha sido la primera vez que las he hecho separadas...de aqui en adelante todo junto.

Cita:

Empezado por Caral (Mensaje 376769)

Para mi es mas importante en este proceso saber:
1- Que quieres que haga el programa.?
2- Para que va a servir, que trabajo hara?.
3- Que apariencia quieres, la actual?.

Como tu bien dices el programa es muy sencillo.

1 y 2. El programa es para hacer un estudio de la trazabilidad de la recogida de la aceituna. Desde los clientes que la recolectan hasta la exportación, pasando por los depósitos y la composición química de los mismos para su posterior envase.
De momento quiero almacenar los Clientes que nos entregan las aceitunas, cuantos kg de aceituna, de que calidad es la aceituna 1ª,2ª o 3ª cuantos kilos de cada calidad entrega y a que depósitos irá cada clase, entre otros datos de interés.

3. Quiero mantener la misma apariencia, mas que nada por su sencillez de manejo, quiero complicarle la vida lo menos posible al que se va a dedicar a meter datos.

Caral 18-09-2010 02:45:36

Hola
Te parece si abrimos un hilo nuevo para empezar con el programa paso a paso?.
De ser asi puedes abrirlo, en este mismo foro con el nombre que gustes, ojala alusivo al programa.
O me dices y lo abro yo.
Saludos

Caral 18-09-2010 04:08:56

Hola
De momento estoy haciendo algunos cambios en las tablas, en las imágenes que se presentan en los botones y otros.
Voy a dejar el programa funcionando con los cambios que me parecen lógicos, de ahí en adelante ya dirás que es lo que necesitas.
Saludos

Er0s 19-09-2010 01:56:17

Día Largo.......

De la apariencia cambiarias algo?

Caral 19-09-2010 16:14:50

Hola
Los cambios:
1- El archivo ini.
Este es un archivo con el nombre BD que esta en la carpeta, ahi solamente se cambia la ruta en la que la BD va a estar y se guarda.
Con esto la BD podra estar en donde quieras que el programa leera el archivo y buscara la bd en esa ruta.
2- Los botones ya muestran las imagenes mejor.
3- Todos los botones funcionan correctamente.
4- El boton de buscar:
Este boton habilita dos opciones: buscar por ID o por nombre.
Con solo cambiar el nombre o id filtrara la busqueda.

Todo el programa funciona.
Crea un nuevo cliente, modifica, elimina, busca, acepta, cancela.

Saludos

Er0s 20-09-2010 12:07:37

Caral ..... para la BD. Y si esa carpeta o ruta no existe en el PC? a mi no me la encuentra y tengo que decirle donde esta. No seria mejor que en el evento ONcreate capturásemos la ubicación del exe y le pasemos al datamodule donde está?

Ya tengo todo el programa ordenado y rulando casi a la perfección, el único fallo es el de siempre, cuando abro la ventana clientes y doy a nuevo me saca los datos del anterior cliente, cancelo, nuevo y ya no vuelve a fallar a no ser que cierre la ventana clientes y la vuelva a abrir. Es decir que el fallo solo ocurre la primera vez que le doy a Nuevo después de abrir la ventana Clientes.

Puede ser que al sacar la ventana Clientes y crear un cliente nuevo la tabla no estubiese abierta? voy a probarlo

Er0s 20-09-2010 12:13:42

Esto ... ejem..... como capturo la ruta del exe?

Er0s 20-09-2010 13:12:37

Mas datos...

Esa primera vez que se abre la ventana de Clientes y le doy por primera vez a "Nuevo Cliente" en el DBgrid aparece la nueva linea para dicho cliente y cuando pulso en los DBedits para empezar a meter datos y aparecen los datos del ultimo cliente, en el DBgrid se booraa la linea blanca y se pasa al ultimo cliente anteriormente añadido.

Caral 20-09-2010 18:15:57

Hola
Si quieres eliminar el archivo ini (que para mi es un error) y quieres colocar la BD en la misma carpeta del programa, entonces cambias en el datamodule, de esto:
Código Delphi [-]
procedure TDataModule1.DataModuleCreate(Sender: TObject);
Var BaseDeDatos, ConStr : String;
    IniFile: TIniFile;
begin
   // Obtiene la ruta y el nombre de la base de datos
   IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'BD.ini');
   BasedeDatos := IniFile.ReadString('BD','Path','');
   If BasedeDatos = '' then ShowMessage('Error al cargar Base de Datos');
   ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
             'Data Source='+BaseDeDatos+';'+
             'Persist Security Info=False;'+
             'Jet OLEDB: Database Password=admin';
   AC1.ConnectionString := ConStr;
   AC1.Open;

end;

A esto:
Código Delphi [-]
procedure TDataModule1.DataModuleCreate(Sender: TObject);
Var 
BaseDeDatos, ConStr : String;
begin
   BaseDeDatos := ExtractFilePath(Application.ExeName)+'Datos.MDB';
   If BasedeDatos = '' then ShowMessage('Error al cargar Base de Datos');
   ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
             'Data Source='+BaseDeDatos+';'+
             'Persist Security Info=False;'+
             'Jet OLEDB: Database Password=admin';
   AC1.ConnectionString := ConStr;
   AC1.Open;

end;

El dia que quieras colocar la BD en red, volverás al INI.
Saludos


La franja horaria es GMT +2. Ahora son las 15:39:55.

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