Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-02-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 0
delphijm Va por buen camino
Aplicacion distribuida Modificar TSQLDataSet en servidor

Hola a todos,

Estoy desarrolando una aplicacion de 3 capas con DBExpress y TWebConnection via HTTP...

En el lado del servidor tengo el DataModule remoto donde estan ubicados los TSQLDataSet con sus correspondientes TDatasetProvider, a los que accedo desde el lado del cliente...

El tema esta en que en algunos casos me interesaria poder modificar el DataSet que me genera el TSQLDataSet (select * from xxx) antes de enviarlo al cliente...

En concreto me interesaria poder añadir un nuevo campo que no proviene de la base de datos y alimentarlo con el valor que me interese...

No se como hacer esto, si debo hacerlo en algun evento del TSQLDataSet o en alguno del TDataSetProvider...

El hecho es que lo he intentado, por ejemplo, en el evento AfterOpen del TSQLDataSet y tambien en el OnGetData del TDataSetProvider y en ambos casos me lanza un "error catastrofico"...

Alguien sabe como podria imlementar esto??

Gracias
Responder Con Cita
  #2  
Antiguo 11-02-2011
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
Una opción es activar en el Provider la propiedad "AllowCommandText". Con esto ya puedes modificar cualquier sentencia SQL en "ClientDataset.CommandText" que estés usando en el lado cliente.

Saludos
Responder Con Cita
  #3  
Antiguo 12-02-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 0
delphijm Va por buen camino
Cita:
Empezado por ElKurgan Ver Mensaje
Una opción es activar en el Provider la propiedad "AllowCommandText". Con esto ya puedes modificar cualquier sentencia SQL en "ClientDataset.CommandText" que estés usando en el lado cliente.

Saludos
Hola ElKurgan,

Con esta propiedad que me comentas puedo cambiar el CommandText del TSQLDataSet desde el lado del cliente, si, asi cuando haces el open del TClientDataSet en el cliente provoca que el TSQLDataSet en el servidor ejecute el CommandText asignado desde el cliente...

Ya uso esto actualmente para determinar que sentencia SELECT usar pero el tema esta en que cuando el TSQLDataSet del servidor ya ha obtenido el conjunto de datos y se los envia al TDataSetProvider, ANTES de que este se los envie por la "red" al TClientDataSet, y TODAVIA en el lado del servidor, me interesa actuar en el dataset en el sentido de añadir un nuevo campo fkInternalCalc y recorrer todo el dataset para asignarle un valor...

El valor que quiero asignar a esta nueva columna lo tengo que recuperar de una tabla de la BBDD y claro, no quiero hacer esto en el cliente y empezar a lanzar solicitudes por la red para cada registro...

La cuestion es, en que evento del TDataSetProvider del lado del servidor, puedo modificar el dataset antes de que este se envie al cliente?

Gracias y Un saludo
Responder Con Cita
  #4  
Antiguo 12-02-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por delphijm Ver Mensaje
En concreto me interesaria poder añadir un nuevo campo que no proviene de la base de datos y alimentarlo con el valor que me interese...
Cita:
Empezado por delphijm Ver Mensaje
El valor que quiero asignar a esta nueva columna lo tengo que recuperar de una tabla de la BBDD [...]
¿Tendrá o no tendrá esa columna información extraída de la base de datos?
Responder Con Cita
  #5  
Antiguo 12-02-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 0
delphijm Va por buen camino
Hola Al,

En el dataset quiero añadir un nuevo campo de tipo fkInternalCalc (para poder hacer con el lo que quiera sin afectar a la BBDD), asi acabare teniendo en este dataset, los campos de la tabla + este nuevo campo...

Con esto, quiero recorrer el dataset desde el primer hasta el ultimo registro (first, while not eof, next,....) y asignar un valor a este nuevo campo...

Este valor lo obtendre de la base de datos a traves de un TClientDataSet + TDataSetProvider + TSQLDataSet diferentes...

En concreto, la tabla principal es, por ejemplo, una tabla de facturas con varios campos, uno de ellos, el codigo del cliente... Pero yo quiero añadir tambien el nombre del cliente...

Este nuevo campo es para almacenar el nombre del cliente que obtendre de la tabla de clientes...

Gracias Al

Josep Mª
Responder Con Cita
  #6  
Antiguo 13-02-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
En ese caso lo más adecuado sería añadir el nombre del cliente en las columnas de la consulta SQL, y luego, en el objeto campo correspondiente desactivar las banderas pfInUpdate y pfInWhere. Esto es otra manera de hacer que un campo no se considere a la hora de aplicar los cambios a la base de datos.
Responder Con Cita
  #7  
Antiguo 13-02-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 0
delphijm Va por buen camino
Hola Al,

Mañana lo probare...

La sentencia select la construyo en tiempo de ejecucion por lo que en tiempo de diseño no conozco los campos que existiran en el dataset...

En algun evento del TSQLDataSet del lado del servidor cambiare estos flags del campo "añadido"... Esto esta claro...

Lo que no veo tan claro es en que evento del TSQLDataSet o quizas mejor del TDataSetProvider, siempre en el lado del servidor, podre asignar valor a esta columna... Como decia en el primer mensaje, me lanzaba un "error catastrofico" cuando intentaba crear el campo y asignarle valor en algunos eventos... Pero quizas el problema estaba en el momento de crear el nuevo campo... Como asi como indicas el campo ya vendra creado quizas me funcione...

Lo probare y ya te contare...

Gracias
Responder Con Cita
  #8  
Antiguo 18-02-2011
delphijm delphijm is offline
Miembro
 
Registrado: abr 2008
Posts: 47
Poder: 0
delphijm Va por buen camino
Hola Al,

Ya me funciona perfectamente... Intento exponer el tema por si sirve de ayuda para alguien...

El tema esta en lo siguiente:

La sentencia select la construyo en el lado del cliente segun mis necesidades y modifico la propiedad "commandtext" del TSQLDataSet del lado del servidor a traves del metodo AS_Execute del interface AppServer del clientDataset asi:

CDSPedidos.AppServer.AS_Execute(provider, commandSQL, params, own)

donde "commandSQL" es la sentencia select que obtengo, ahora no viene al caso como, pero era de un tipo asi:

select PED.*, CLI.nombre as NombreCliente from TABLAPedidos PED
join TABLAClientes CLI on PED.idCliente=CLI.idCliente

Por mas que hacia nunca conseguia que la consulta me devolviera la columna con el nombre del cliente...

Lo siento, me ofusque en enfocar el problema en el join pensando que quizas no podia incluirse join en la propiedad "CommandText"...

El problema es que, en el TSQLDataSet del servidor habia hecho persistentes todos los campos de la tabla PED sin incluir el campo NombreCliente, asi, al ser persistentes todos los campos menos este, claro, nunca me llegaba...

Simplemente he acabado asignando un valor a la propiedad Commandtext del TSQLDataSet del servidor "generica", es decir de un tipo como el anterior, asi al hacer los campos persistentes ya me incluye el nombre del cliente... De hecho lo unico "dinamico" que añado segun mis necesidades en el select es todo lo correspondiente a la clausula "where"...

Y ya esta... pagando la inexperiencia en Delphi, pero persistire en el intento de dominarlo...

Gracias por vuestra ayuda ElKurgan y Al

Josep Mª
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Base de datos distribuida Vlady Conexión con bases de datos 1 09-02-2011 09:30:34
Ayuda sobre una aplicacion distribuida myj Varios 0 24-04-2010 20:28:56
Cliente servidor vs aplicación distribuida felixgo Providers 10 27-10-2006 20:21:47
modificar documento word desde un servidor joaquinmol Internet 0 31-03-2005 19:41:23
Numero de fila en TSQLDataSet andre Conexión con bases de datos 2 26-06-2003 16:52:42


La franja horaria es GMT +2. Ahora son las 22:35:54.


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
Copyright 1996-2007 Club Delphi