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)
-   -   Post, Crea o modifica? (https://www.clubdelphi.com/foros/showthread.php?t=33782)

krilea 17-07-2006 12:31:53

Post, Crea o modifica?
 
Hola!
Tengo una dudilla que no se como resolverla. Estoy trabajando en delphi 7 con Access.
Cuando quiero ingresar un registro nuevo hago ADOQuery1.insert y cuando quiero modicarlo ADOQuery1.edit. Una vez termino para guardar los canvio hago ADOQuery.post.

El problema está en que cuando hago el post necesitaria saber si he heco el post de un insert o el post de un edit porque tengo que hacer comprovaciones distintas en cada uno de los casos.

Alguien sabe como puedo saberlo?

Muchas Gracias!!

santi33a 17-07-2006 14:49:26

simplemente preguntas
Código Delphi [-]
 if ADOQuery1.state = dsInsert then begin
  // estoy insertando
  end
 else if ADOQuery1.state = dsEdit then begin
 // estoy editando
 end;

Normalmente esto se usa en el evento BeforePost del ADOQuery

Santiago

destrukthor 02-08-2006 09:05:49

Error en dsInsert
 
Siguiendo el hilo me dice el error.

[Error] Compras.pas(417): Undeclared identifier: 'dsInsert'

y el codigo es simple.

Código Delphi [-]
 
 IF (Key=#13) THEN BEGIN
    IF DBGrid1.Fields[0].Value<>Null THEN Begin
      IF MD.tbMovCom.State = dsInsert THEN
        MD.tbMovCom.Post;
    End;
  END;

Es aqui donde se coloca y muestra el error.
¿Porque?
me faltara a algun unit??
Uso tablas paradox 7 y delphi 7.

Sick boy 02-08-2006 09:21:16

Cambia el igual por un IN

Código Delphi [-]
 if ADOQuery1.state in [dsInsert] then
  begin
  // estoy insertando
  end
 else if ADOQuery1.state in [dsEdit] then
 begin
 // estoy editando
 end;

destrukthor 02-08-2006 09:26:01

Persiste ele Error
 
Sorry amigo, pero me sigue dando el mismo error.

[Error] Compras.pas(419): Undeclared identifier: 'dsInsert'

IF (Key=#13) THEN BEGIN
IF DBGrid1.Fields[0].Value<>Null THEN Begin
IF MD.tbMovCom.State IN dsInsert THEN
ShowMessage('Pasa a Modificar')
// MD.tbMovCom.Post;
End;
END;

Gracias ¿me puedes ayudar?

roman 02-08-2006 09:27:12

Cita:

Empezado por destrukthor
me faltara a algun unit??

Agrega la unidad DB.

// Saludos

Sick boy 02-08-2006 09:31:12

Lee mi ejemplo.

El dsInsert debe estar entre corchetes [dsInsert]

Tambien puedes revisar la ayuda de State, es muy sencillo, solo hay que pulsar F1.

Saludos

destrukthor 02-08-2006 09:32:59

Gracias amigos
 
Resuelto el problema, me faltaba el [] y el unit DB.

Muchas gracias nuevamente.:D

roman 02-08-2006 09:37:20

¿Para qué quieren el IN y los []? Bastaba incluir la unidad DB y la comparación que se tenía originalmente:

Código Delphi [-]
IF MD.tbMovCom.State = dsInsert THEN

// Saludos

destrukthor 02-08-2006 09:38:59

Si gracias.
 
ya lo verifique y el codigo inicial estaba bien tb solo faltaba el unit DB.
Gracias...:D

Sick boy 02-08-2006 10:16:09

Cita:

¿Para qué quieren el IN y los []? Bastaba incluir la unidad DB y la comparación que se tenía originalmente:

Tienes razón.

Yo uso el IN, porque el tipo TDataSetState puede tener diferentes valores, y a veces me interesa que se realice una acción si se cumplen alguno de los valores. Usando el IN no tengo que hacer un OR.

Y si usas IN, el tipo a de ir entre corchetes, creo yo....

En este caso concreto no hacia falta el IN, y lo de la unit db no se me había ocurrido, ya que en mi caso, esa unit se añade automaticamente.

roman 02-08-2006 10:25:44

Así es, State puede tener varios valores y cuando interesa saber si es uno de entre varios entonces IN es lo mejor. De hecho, cuando más lo he usado es justo para lo contrario: saber si el DataSet está en edición o inserción sin importar cuál exactamente:

Código Delphi [-]
if DataSet.State in [dsInsert, dsEdit] then

y coincido contigo pues es mucho más cómodo que usando OR.

Por cierto, en esa misma unidad DB se define la constante

Código Delphi [-]
const
  dsEditModes = [dsEdit, dsInsert, dsSetKey];

de manera que de hecho se puede poner

Código Delphi [-]
if DataSet.State in dsEditModes then

para saber si el DataSet se está editando.

// Saludos

Sick boy 02-08-2006 10:47:25

Yo lo uso exactamente para los mismo, para saber cuando esta en modo edición.

Y no conocia dsEditModes, asi que otra cosa más que he aprendido hoy.

destrukthor 02-08-2006 10:51:38

aaa que genail
 
Gracias yo tambien he aprendido algomas y vastante mas.

Una pequeña consulta y para que me aconsejen, yo uso tablas paradox, y aqui he escuchado mucho hablar de SQL o MySql, lo que estoy usando (paradox), me servira para una red o es preferible aprender de inmediato MySql.
Recuerden q soy novato en Delphi.

Gracias por las Ayudas recibidas..:rolleyes:

Sick boy 02-08-2006 11:11:39

La pregunta es tan amplia.......

Paradox en red funciona mal. Se que algunos diran que se puede hacer, pero en mi opinión funciona mal. Paradox no se diseñó para usarlo en red.

En cualquier caso, si utilizas paradox en red, tendrás que utilizar SQL, ya que con objetos TTable es una locura.

SQL es un estandar de lenguaje para acceder a bases de datos.
No es una base de datos en si misma, sino un conjunto de reglas comunes a todas (o casi todas) las bases de datos.

Asi que no tienes que aprender MySQL, sino SQL.

Luego tendrás que decidir que motor de base de datos es mejor para la aplicación que estes desarrollando.

Yo prefiero FireBird antes que MySql, pero es para gustos.

Y para terminar, cada motor de base de datos suele tener sus extensiones a la norma general de SQL, de modo que las sentencias SQL "basicas" son las mismas, pero cada GDB te permitirá ciertas funciones "extendidas".

Mi recomendación, por experiencia propia, cuanto antes migres TODO a SQL mejor, aunque el proyecto sea pequeño, nunca se sabe....

destrukthor 02-08-2006 11:15:26

Mil gracias...
 
Mil gracias por el consejo, terminare este pequeño proyecto de pruebas q estoy haciendo y me pondre en marcha a aprender SQL.
Gracias.. Amigo;)

roman 02-08-2006 17:13:58

Hola, en mi opinión la gran limitante de paradox es la cantidad de usuarios y/o información que puede manejar. No obstante, prácticamente no he tenido problema alguno al usarlo en red. Pero además, sea o no en red, definitivamente paradox está hecho para ser usado con componentes Table. El SQL que maneja no es más que una emulación que trabaja muy lento. SQL es la mejor opción cuando se usa con motores que realmente son cliente-servidor. Con paradox la cosa es alrevés. Las componentes Table están diseñadas para trabajar con los índices que se establecen mientras que TQuery no usa esos índices y cualquier consulta SQL que no use índices es, la más de las veces, muy lenta.

Eso sí, el hecho de no ser cliente-servidor y de haber actualmente varias opciones libres que sí lo son (como las que menciona Sick boy), hace difícil entender que se siga optando por paradox, o access que para el caso es lo mismo.

Por otra parte, destrukthor, te recomiendo que esto último que preguntas lo hagas en otro hilo o busques en los foros porque nos estamos saliendo del tema original.

// Saludos

Sick boy 02-08-2006 17:37:34

Yo ya sabia que hay gente trabajando con paradox en red y que les funciona bien!!!

pero
Cita:

Con paradox la cosa es alrevés. Las componentes Table están diseñadas para trabajar con los índices que se establecen mientras que TQuery no usa esos índices y cualquier consulta SQL que no use índices es, la más de las veces, muy lenta.

Esto si que no lo sabia, y puede ser el motivo por el que nunca consegui que funcionara como yo queria o esperaba, ya que el 90% de la aplicación usaba querys.

No coincido con lo de los indices y los querys, pero puedo estar equivocado.

Con lo que coincido es que ya no tiene mucho sentido usar paradox, y pasarte el dia reconstruyendo indices, reparando autoincrementales y liberando los lck.

Y es cierto que hay que abrir otro hilo, porque esto ya es otro tema.

roman 02-08-2006 17:42:57

Cita:

Empezado por Sick boy
ya no tiene mucho sentido usar paradox, y pasarte el dia reconstruyendo indices, reparando autoincrementales y liberando los lck.

El punto es: normalmente yo no tengo que hacer esta tareas. Nunca. Las únicas veces en que he debido regenerar índices es cuando falla la energía eléctrica y la pc se apaga a la brava. Por ello es que para mi esa no es la razón para no usar paradox.

No obstante, como estamos de acuerdo en ya no usar paradox, pues mal haríamos discutiendo de algo que ninguno va a usar :D

// Saludos

Sick boy 02-08-2006 17:53:23

Cita:

Nunca. Las únicas veces en que he debido regenerar índices es cuando falla la energía eléctrica y la pc se apaga a la brava
Nunca???
O cuando el windows se cuelga....
O cuando intenta enredar en la base de datos desde access...

Cuando el sistema esta vendido a muchos clientes, estos casos "raros" suceden casi a diario.
De hecho, hice una aplicación que detectaba estos cierres "bruscos" y reparaba de forma automatica, lo cual me quitaba muchos dolores de cabeza.

Pero, y cuando de vez en cuando desparecen datos??

Podriamos abrir otro hilo y poner a parir a Paradox, dBase y compañia, y compararlas con las bases de datos libres actuales (FB, MySQL, DB2, ...), que también tienen sus cositas.

Por mi parte, creo que este hilo ha sobrepasado el proposito inicial, no te parece??


La franja horaria es GMT +2. Ahora son las 12:47:54.

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