PDA

Ver la Versión Completa : dterminar si los datos que se van a enviar ya existen


douglas
30-10-2007, 06:43:51
buenas chicos, aqui miren sigo molestandolos y molestandolos, pero bueno espero que almenos todas mis dudas las aproveche otras personas que foreen, al igual que las aprovecho yo, disculpen la molestia, pero hago lo siguiente, supuestamente para ver si la fecha ya existen en esa tabla, si ya existe que tire un mensaje diciendo que no puede almacenar, y si no existe que almacene, pero no funciona, y no me tira ningun mensaje, perdon chicos, pero me quede crudo con las ideas, les dejo aqui el codigo para que los inspeccionen:

procedure TForm3.Button2Click(Sender: TObject);
var
temp:integer;
a:string;
begin
dbtext1.Field.Text:=getlocald;
query2.Active:=false;
query2.SQL.Text:='select fecha from ciber';
query2.Active:=true;
while not query2.Eof do
begin
a:=query2.Fields[0].Text;
if dbtext1.Field.Text=a then
begin
showmessage('NO SE ACEPTA DUPLICIDAD DE DATOS');
end
ELSE
begin
table2.Append;
showmessage('TODOS LOS DATOS FUERON ALMACENADOS EXITOSAMENTE');
end;
query2.Next;
end;
end;

espero no ponerlos en muchas molestias, de antemano les agradezco por la ayuda y tambien por todas las veces anteriores que me han ayudado.

tefots
30-10-2007, 11:29:26
buenas chicos, aqui miren sigo molestandolos y molestandolos, pero bueno espero que almenos todas mis dudas las aproveche otras personas que foreen, al igual que las aprovecho yo, disculpen la molestia, pero hago lo siguiente, supuestamente para ver si la fecha ya existen en esa tabla, si ya existe que tire un mensaje diciendo que no puede almacenar, y si no existe que almacene, pero no funciona, y no me tira ningun mensaje, perdon chicos, pero me quede crudo con las ideas, les dejo aqui el codigo para que los inspeccionen:



normal que no te funcione , vaya cacao maravillao has montao en esa busqueda.

primero
deberias hacer un query filtrando de la forma

Query2.SQL.Text:='select fecha from ciber where fecha=:f';
Query2.parambyname('f').datatype:=ftdatetime;
Query2.parambyname('f').value:=StrtoDatetime(A);
Query2.open;
if query2.recordcount>0 then Showmessage('Error , la fecha ya existe');
Query2.close;


luego , donde pones table1.append , aqui deberia ir un table1.post , ya que no tiene sentido lo que estas haciendo. las comprobaciones hay que hacerlas antes de guardar datos (post) , el append es para añadir un nuevo registro en blanco.


lo que debes hacer es ,
1º table1.append o table1.edit
2º establecer los valores que quieras en los campos o controles enlazados a los campos de la tabla.
3º antes de hacer table1.post , buscar con el query la fecha , si la encuentras no hacer post y sacar mensaje , sino , puedes hacer post y guardar los cambios.


Saludos.

Lepe
30-10-2007, 11:42:20
Lo normal en estos casos es crear un índice único en la tabla por el campo Fecha. Si intentas insertar una fecha, dará una excepción el motor de Bases de datos por violar la restricción de unicidad.

Así evitas tener que lanzar una consulta, el SGBBDD es más eficiente que tu al buscar por ese índice.

Saludos

douglas
30-10-2007, 15:09:34
Lo normal en estos casos es crear un índice único en la tabla por el campo Fecha. Si intentas insertar una fecha, dará una excepción el motor de Bases de datos por violar la restricción de unicidad.

Así evitas tener que lanzar una consulta, el SGBBDD es más eficiente que tu al buscar por ese índice.

Saludos

perdon pero al escribir lo anterior, te refiere a que en el campo fecha debo colocar una llave principal, eso es lo que te entiendo, y que de esa manera, evitare duplicidad de datos, mira perdon lepe, pero estoy trabajando en access, no sabes si de alguna manera puedo evitar la duplicidad de datos desde access, perdon por las molestias, y gracias por la ayuda chicos.

eduarcol
30-10-2007, 15:38:36
como te decia el amigo LEPE, debes crear una llave principal para que acces se encargue de la duplicidad, y si, si se puede hacer en acces

douglas
30-10-2007, 16:00:04
query2.close;
query2.sql.add('select fecha from ciber');
query2.sql.add(' where fecha between :Fechain and :Fechafin');
query2.parambyname('Fechain').value:=dbtext1.caption;
query2.parambyname('Fechafin').value:=dbtext1.caption;
query2.open;
a:=query2.fields[0].AsString;
query2.close;
if a <> dbtext1.caption then
begin
table2.append;
showmessage('LOS DATOS FUERON ALMACENADOS');
table2.insert;
end
else
begin
showmessage('los datos ya existen')
form3.close;
end;

gracias por la ayuda aqui esta el codigo con el que me funciono la restriccion.

tefots
30-10-2007, 16:33:51
Funcionar funcionar , no lo tengo yo muy claro que te funcione bien...
y no se porque usas un betwen , si con un = seria suficiente.

y como te he dicho , lo normal es comprobar las condiciones (si tal registro existe ) justo antes de hacer el post.


Ademas , revisa lo siguiente a ver que tienes mal , creo que los conceptos de insert, post , edit, etc. no los tienes muy claros...


table2.append;
Showmessage('LOS DATOS FUERON ALMACENADOS')
table2.insert;




como ya te han dicho la mejor solucion es definir el campo para que no puedas almacenar duplicados. en access, puedes definir el campo como indexado sin duplicados , con esto te evitas el tener que buscar y todo lo anterior. aunque no te evitas tener que controlar y capturar el error al hacer post.

saludos.

douglas
30-10-2007, 17:31:09
Funcionar funcionar , no lo tengo yo muy claro que te funcione bien...
y no se porque usas un betwen , si con un = seria suficiente.

y como te he dicho , lo normal es comprobar las condiciones (si tal registro existe ) justo antes de hacer el post.


Ademas , revisa lo siguiente a ver que tienes mal , creo que los conceptos de insert, post , edit, etc. no los tienes muy claros...

Código Delphi [-] (http://www.clubdelphi.com/foros/#)
table2.append;
Showmessage('LOS DATOS FUERON ALMACENADOS')
table2.insert;



como ya te han dicho la mejor solucion es definir el campo para que no puedas almacenar duplicados. en access, puedes definir el campo como indexado sin duplicados , con esto te evitas el tener que buscar y todo lo anterior. aunque no te evitas tener que controlar y capturar el error al hacer post.

saludos.
pues mira, segun yo el table2.append; me funciona pra enviar a bases de datos, pues perdon por mi ignorancia, es que apenas estoy iniciandome en las bases de datos delphi, pues de echo es el primer lenguaje hacia objetos que tomo, y el append me a funcionado, ahora, la cuestion del table2.insert, es que como luego de haber ingresado data a la base de datos, se quedan como que limpios los bdedit, pero me funcionaban, puesto que me envianban de nuevo la misma informacion, por tanto me tiraba error, luego se me ocurrio porner el insert, y woala me funciono, no de una manera bonita ni muy profecional, pero cumple con lo que yo deseaba hacer, como te repito gracias por toda la buena ayuda que me han brindado todos, y ademas que soy un poco ignorante en las bases de datos, no llevo mucho parendiendolas, pero cualquier observacion es bien recibida, y si fueras tan amable de explicarme que otros metodos puedo utilizar para esto