Ir al contenido


Foto

sqlQuery más flexible

sqlquery

  • Por favor identifícate para responder
3 respuestas en este tema

#1 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 12 marzo 2017 - 02:42

El asunto es sobre el componente TSqlQuery de Lazarus, o más exactamente de CodeTyphon.

Este componente permite mediante la sola escritura de una sentencia select en la propiedad SQL (de tipo TStringlist) y la correcta asignación de otras propiedades hacer que se completen automáticamente las otras declaraciones básicas como update, insert, delete o refresh.

Lo correcto es siempre que se quiera hacer uso de las otras cuatro declaraciones, incorporar una clave única a la tabla.

Todo es muy sencillo e incluso más que en Delphi, ya que la propiedad sequence permite fácilmente configurar el incremento automático de una columna mediante el uso de un generador.

 

El problema se da, al menos en mi caso, cuando se intenta mezclar las declaraciones utilizando tablas y vistas (que refieren a la misma tabla)

 

Lo que intento hacer es utilizar una vista para obtener datos más "ricos" en la visualización, por lo que escribo declaraciones sobre esta vista en la propiedad SQL y Refresh, pero uso la tabla referida desde esa vista para las declaraciones para update, insert y delete.

 

Algo así como :


sql
  1. SQL: SELECT * FROM vista1
  2.  
  3. REFRESH: SELECT * FROM vista1 WHERE id_tabla1 = :id_tabla1
  4.  
  5. DELETE: DELETE FROM tabla1 WHERE id_tabla1 = :old_id_tabla1
  6.  
  7. UPDATE: UPDATE tabla1 SET (col1 = :col1, col2 = :col2) WHERE id_tabla1 = :old_id_tabla1
  8.  
  9. INSERT: INSERT INTO tabla1 id_tabla1, col1, col2 VALUES :id_tabla1, :col1, :col2

Y así surge un error que dice que no se puede aplicar las actualizaciones en la tabla, por no recuerdo bien que problema.

 

Supongo que esto tiene que ver con la configuración de las propiedades UsePrimaryKeyAsKey y UpdateMode. Pero no estoy muy seguro.

¿Alguien entiende algo sobre esto para darme algo de luz?

 

Olvidé aclarar que además de generar las "instrucciones" automáticamente, podemos escribirlas.

 

Saludos


Editado por cram, 12 marzo 2017 - 02:45 .

  • 0

#2 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 14 marzo 2017 - 10:38

Al parecer nadie entiende mucho sobre estas cosas. Lo que averigüé es que la propiedad problema es la que hace el refresh, es decir RefreshSQL, no el select como hubiera pensado.

En Delphi es posible combinar vistas de una tabla con la tabla en el mismo Dataset, pero en un sqlQuery de FreePascal esto no es muy simple y según veo hasta ahora imposible.

 

Saludos.


  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 marzo 2017 - 11:48

Al parecer nadie entiende mucho sobre estas cosas.


Yo de Lazarus y/o CT nada de nada.

Lo que averigüé es que la propiedad problema es la que hace el refresh, es decir RefreshSQL, no el select como hubiera pensado.
En Delphi es posible combinar vistas de una tabla con la tabla en el mismo Dataset, pero en un sqlQuery de FreePascal esto no es muy simple y según veo hasta ahora imposible.


Me parece raro, debería haber algo similar, no creo que sea imposible.

Saludos
  • 0

#4 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 14 marzo 2017 - 01:35

Pues bien, este es el error:

 

An error ocurred while applying the updates in a record: qryXXX: Operation not allowed, dataset "qryXXX" is not in an edit or insert state.

 

El problema no es en realidad el estado, ya que si se cambia la vista por tabla seleccionada en primera instancia en la vista o en el misma propiedad SQL, -que se corresponde con SelectSQL de Delphi- el problema desaparece. Supongo, muy a priori, que el error tiene que ver con los joins.

 

En fin, gracias por responder Egostar, apenas tenga alguna solución la escribo.

 

Saludos


  • 0




IP.Board spam blocked by CleanTalk.