Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Mysql, ZeosDB (https://www.clubdelphi.com/foros/showthread.php?t=82097)

steelha 25-01-2013 18:51:10

Mysql, ZeosDB
 
Buenas, podría alguien explicar que sucede. Tengo un data modulo con los un Tzconection y varios tzquery, al buscar información no he tenido ningún problema, el problema se me presento al intentar modificar el valor de un campo el cual no se modifica. Es la primera ves que utilizo estos componentes.

Datos adicionales:
Delphi 7, ZeosDb
cnprincipal(Tzconection) : los parametros se cargan desde un inifile. (sin problema)
sqlsecuencias(tzquery) : SQL (Select * from tblsecuencias).

Codigo:

Código Delphi [-]
procedure TfrmAdmision.guardar_Datos(tipguard: Integer);
var hc  : string;
    hcn :Integer;
begin
  hcn := 0;
    if tipguard = 1 then     //Nuevo registro
    begin
      //Preguntar si es automatico o manual
      if Application.MessageBox( 'Asignación Número de Historia', 'Desea Asignala Manual', MB_ICONQUESTION OR MB_YESNO ) = ID_YES then
      begin
          //Obtener historia clinica manualmente
          repeat
            InputQuery('Historia Clinica Manual', 'Número de Historial ', hc);
          until ((Trim(hc) <> '') and (StrToInt(hc) > 0));
      end
      else
      begin
        //Obtener secuencia historial clinico automatico
        dmConexiones.sqlSecuencias.Close;
        dmConexiones.sqlSecuencias.Open;                                                  
          dmConexiones.sqlSecuencias.First;                                                
          hcn := dmConexiones.sqlSecuenciasHistoriaClinica.Value + 1;            
          dmConexiones.sqlSecuencias.Edit;
          dmConexiones.sqlSecuenciasHistoriaClinica.Value := hcn;
        dmConexiones.sqlSecuencias.Post;
        dmConexiones.sqlSecuencias.Close;
      end;

      If ((Trim(hc) <> '') and (StrToInt(hc) > 0)) then
        hcn := StrToInt(Trim(hc));

      edthcn.Text := IntToStr(hcn);
    end;

    if tipguard = 2 then     //Datos Modificados
    begin

    end;
end;

El programa no me da ningún error pero no me modifica el registro

Casimiro Notevi 25-01-2013 20:58:44

¿Y qué sentencia de edición estás usando?

ozsWizzard 25-01-2013 23:43:04

Desde luego, si le asignas el "Número de Historia" de forma manual, no lo va a cambiar puesto que el edit y el post están en el else.

Un saludo.

steelha 29-01-2013 15:45:11

Me disculpo por no haber leído el post lo mas rápido posible, pero el caso es el siguiente el la tabla secuencia existe un registro previo con los valores de cada campo inicializado en 0, cada pantalla incrementara el campo correspondiente dependiendo de la actividad (facturas, HCN, deduciones, ND, NC, etc,etc).

Si es nuevo y es manual no debe leer el campo secuencia, de lo contrario si es automático debe leer la tabla secuencia e incrementar el campo HCN en uno y guardar dicho valor. Lo siguiente extraño es que si inicializo la variable hcn a cero siempre, cuando hago varios guardar automático veo que se incrementa pero el la tabla el campo esta en cero.

ozsWizzard 29-01-2013 16:49:36

¿Este trozo de código solamente sirve para saber calcular el hcn?

Ahora mismo no veo donde ha de actualizarse el registro.

Por otra parte, en este código:

Código Delphi [-]
     
    dmConexiones.sqlSecuencias.Close;
    dmConexiones.sqlSecuencias.Open;                                                  
    dmConexiones.sqlSecuencias.First;                                                
    hcn := dmConexiones.sqlSecuenciasHistoriaClinica.Value + 1;            
    dmConexiones.sqlSecuencias.Edit;
    dmConexiones.sqlSecuenciasHistoriaClinica.Value := hcn;
    dmConexiones.sqlSecuencias.Post;
    dmConexiones.sqlSecuencias.Close;

No sé si tiene que ser así o no pero veo algo raro. Abres "SqlSecuencias" pero calculas en base a "sqlSecuenciasHistoriaClinica" y lo guardas en "sqlSecuenciasHistoriaClinica". ¿Para qué se abre SqlSecuencias entonces?

Casimiro Notevi 29-01-2013 16:52:02

Yo no entiendo nada de lo que estás diciendo :confused:

steelha 29-01-2013 16:56:49

dmConexiones.sqlSecuencias es el query o conexión a la tabla de secuencias donde se encuentra el campo HistorialClinica el cual es el que me interesa por ahora. Pero para acceder a su valor lo debo hacer completo según entiendo es dmConexiones.sqlSecuenciasHistoriaClinica.Value. Si verificas el dmConexiones.sqlSecuencias.post es para guardar los cambios realizados según se. Reitero nunca haber trabajado con los zeos pero en ADO me funcionan muy bien

duilioisola 10-02-2013 21:59:09

El problema parece estar en que sqlSecuencias es un Query y por lo tanto tiene unsolo SQL asignado.
En este caso el SQL es un 'SELECT ... FROM TABLA'. TZQuery al ser un SELECT solo devuelve valores, pero no sabe como hacer updates, inserts ni deletes. Es un componente que sirve para ejecutar una instrucción en la base de datos.
Supongo que deberías utilizar el componente TZUpdateSQL. Este componente tiene un SQL para cada acción que necesita.

Mira esta web

Cita:

TZUpdateSQL

A TZUpdateSQL object provides statements to modify the data of a result set that is retrieved by a TZQuery object. The TZUpdateSQL component is comparable to BDE's TUpdateSQL component. Here is an example how to define the statements of an SQL statement with corresponding update statements (based on a dialect 3 database):

SQL.Sql:

SELECT * FROM names

UpdateSQL.InsertSql:

INSERT INTO names (recno, name)
VALUES (:recno, :name)

UpdateSQL.ModifySql:

UPDATE names
SET recno = :RecNo,
name = :name
WHERE recno = :old_recno

UpdateSQL.DeleteSql:

DELETE FROM names
WHERE recno = :old_recno



The "OLD_" parameter prefix for SQL statements

The "old_" prefix is handled according to the handling with BDE components. By using "OLD_" as prefix for a fieldname you are able to access the value of the field before it was changed. This is very helpful if you have to compare fieldvalues in a WHERE clause.


Queries with read only resultsets

In geneal a TZUpdateSQL object is assigned to a TZQuery object that has a read only resultset. This makes it possible to change its data. Such read only queries are queries that join multiple tables. But also with "normal" "RequestLive" resultsets you may use TZUpdateSQL (see: TZQuery).

steelha 11-02-2013 13:34:15

Ok ya entiendo duilioisola, voy a probar

AzidRain 12-02-2013 01:05:36

La belleza de ZeosDB es que te permite hacer esto:
Código Delphi [-]
  TZQuery.SQL.Add('SELECT * FROM REGISTROS WHERE CLAVE=:CLAVE');
  TZQery.ParambyName('CLAVE').AsInteger := 1;
  TZQuery.Open;
  TZQuery.Edit;
  TZQuery.FieldBYName('NOMBRE').AsString := 'NUEVO NOMBRE';
  TZQuery.Post;
  TZQuery.Close;

Yo quitaría eso de asignación de secuecina manual y se lo dejo a MySQL con un campo autoincrementado, no veo la utilidad de darle al usuario la potestad de poder decidir que número siguen en la secuencia cuando lo que necesitas es un número único por cada historia clínica. Creo que en todo caso falta revisar el model de BD que hiciste.

steelha 12-02-2013 14:26:37

Gracias por la ayuda AzidRain, pero es una tabla donde estaran todas las secuencias para todos los documentos, y configuraciones que necesiten, como el caso del IVA, etc

AzidRain 12-02-2013 22:42:59

Es lo mismo que te mencionaba, no necesitas tener una tabla para guardar en que numero va cada documento. Aparte de impráctico corres el riesgo de que si no diseñaste bien la BD, termines con folios desfasados.

Te recomiendo colocar un campo intenger sin signo tipo autoincrementando en todas las tablas que requieran tener un número consecutivo para identificar cada registro. Además así es más fácil de mantener las relaciones entre tablas. Y no tienes que hacer nada en tu código ya que MySQL se encargará de ir generando los numeros de forma automática.

steelha 15-02-2013 14:58:05

Ok, entendí tu idea ... pero a veces no es que uno quiera si no lo que le pidan, simplemente estoy codificando las ideas de una persona no fui yo quien diseño los modelos de las DB y asi me las pasaron con los diseños de como serian cada pantalla... pero hablare a ver que me dicen. Muchas gracias por molestarte en contestar y a todos aquellos que de una u otra forma han ayudado.

ozsWizzard 18-02-2013 17:15:33

Cita:

Empezado por ozsWizzard (Mensaje 454183)
¿Este trozo de código solamente sirve para saber calcular el hcn?

Ahora mismo no veo donde ha de actualizarse el registro.

Por otra parte, en este código:

Código Delphi [-]
     
    dmConexiones.sqlSecuencias.Close;
    dmConexiones.sqlSecuencias.Open;                                                  
    dmConexiones.sqlSecuencias.First;                                                
    hcn := dmConexiones.sqlSecuenciasHistoriaClinica.Value + 1;            
    dmConexiones.sqlSecuencias.Edit;
    dmConexiones.sqlSecuenciasHistoriaClinica.Value := hcn;
    dmConexiones.sqlSecuencias.Post;
    dmConexiones.sqlSecuencias.Close;

No sé si tiene que ser así o no pero veo algo raro. Abres "SqlSecuencias" pero calculas en base a "sqlSecuenciasHistoriaClinica" y lo guardas en "sqlSecuenciasHistoriaClinica". ¿Para qué se abre SqlSecuencias entonces?

Cita:

Yo no entiendo nada de lo que estás diciendo :confused:
Me estoy releyendo y la verdad es que tienes razón. Las prisas y el intentar no ofender fueron una mala combinación.

Lo que realmente quería decir es que creía que había un error a la hora de usar los querys pero no quería tirarme mucho al agua.

ozsWizzard 18-02-2013 17:20:58

Cita:

Empezado por AzidRain (Mensaje 454868)
La belleza de ZeosDB es que te permite hacer esto:
Código Delphi [-]
  TZQuery.SQL.Add('SELECT * FROM REGISTROS WHERE CLAVE=:CLAVE');
  TZQery.ParambyName('CLAVE').AsInteger := 1;
  TZQuery.Open;
  TZQuery.Edit;
  TZQuery.FieldBYName('NOMBRE').AsString := 'NUEVO NOMBRE';
  TZQuery.Post;
  TZQuery.Close;
.

Si TZQuery es el nombre del objeto, ¿qué diferencia hay con ADO o DBExpres?, yo eso mismo lo tengo hecho con ambos. A menos que TZQuery sea el nombre de la clase y no tengas instanciado el objeto, en cuyo caso más que una ventaja lo vería como una aberración.

Un saludo


La franja horaria es GMT +2. Ahora son las 18:00:30.

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