Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-09-2004
n0n3 n0n3 is offline
Registrado
 
Registrado: sep 2004
Posts: 8
Poder: 0
n0n3 Va por buen camino
readonly dataset

Hola, estoy intentado crear los "fields" (campos?) de un sqldataset dinamicamente, y me da el siguiente error ->

SQLDataSet1: Cannot modify a read-only dataset

El codigo es el siguiente ->

Código:
 
var i: Integer;
var T: TStringField;
begin
SQLDataSet1.Open;
SQLDataSet1.Edit;
SQLDataSet1.ClearFields;
SQLDataSet1.CommandText := 'SELECT '+'ov_cia.cia AS Companyia, '+'od_hospitalitzacio.data AS Dat, '
+'oa_data.SETMANA_DEL_ANY AS S, '+'oa_data.MES_DEL_ANY AS M, '
+'oa_data.TRIMESTRE AS Trimestre, '+'SUM(od_hospitalitzacio.ingressats) AS Ingr, '
+'SUM(od_hospitalitzacio.altes) AS Alt, '+'SUM(od_hospitalitzacio.ingressos) AS Ingres '
+'FROM '+'od_hospitalitzacio, '+'ov_cia, '+'oa_data '+'WHERE '
+'od_hospitalitzacio.id_cia = ov_cia.id_cia AND '
+'od_hospitalitzacio.data = oa_data.DATA AND '
+'oa_data.ANY4 = TO_NUMBER(TO_CHAR(SYSDATE-1, ' + QuotedStr('YYYY')
+ ')) '+'GROUP BY '+'od_hospitalitzacio.data, '+'oa_data.SETMANA_DEL_ANY, '
+'oa_data.MES_DEL_ANY, '+'oa_data.TRIMESTRE, '+'ov_cia.cia';
SQLDataSet1.Close;
T := TStringField.Create(SQLDataSet1);
T.FieldName := 'Prueba';
T.Name := SQLDataSet1.Name + T.FieldName;
T.Index := SQLDataSet1.FieldCount;
T.DataSet := SQLDataSet1;
SQLDataSet1.FieldDefs.UpDate;
SQLDataSet1.Open;
ShowMessage('Fields :' + IntToStr(SQLDataSet1.FieldCount));
for i := 0 to SQLDataSet1.FieldCount - 1 do
	ShowMessage(SQLDataSet1.Fields[i].FieldName);
No he tocado mucho estos temas en delphi, y he estado buscando en google informacion sobre este error pero no encuentro nada ;( Tampoco se si hago bien el tema de crear los "fields", es lo que encontre en la ayuda del delphi... pero como me falla al principio pues tampoco he podido probar si es correcto.

PD: He puesto intros en el query para que no sea tan largo.

Última edición por n0n3 fecha: 01-09-2004 a las 10:02:06.
Responder Con Cita
  #2  
Antiguo 01-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Aunque no he trabajado mucho con DBX, mírate el método

Código Delphi [-]
SQLDataSet1.FieldDefs.Add(......);
Responder Con Cita
  #3  
Antiguo 01-09-2004
n0n3 n0n3 is offline
Registrado
 
Registrado: sep 2004
Posts: 8
Poder: 0
n0n3 Va por buen camino
Gracias, estoy probando con eso ahora, lo que pasa es que no consigo que me haga caso, intento limpiar los fields que ya hay definidos y con "ClearFields" me pide que este en modo Edit o Insert y me da el error del read-only. Si uso FieldDefs.Clear no me los limpia tampoco. Y si añado un campo con FieldDefs.Add usando el siguiente codigo ->

Código:
var i: Integer;
var T: TStringField;
begin
  with SQLDataSet1 do
  begin
	CommandText := 'SELECT '+'ov_cia.cia AS Companyia, '
+'od_hospitalitzacio.data AS Dat, '+'oa_data.SETMANA_DEL_ANY AS S, '
+'oa_data.MES_DEL_ANY AS M, '+'oa_data.TRIMESTRE AS Trimestre, '
+'SUM(od_hospitalitzacio.ingressats) AS Ingr, '+'SUM(od_hospitalitzacio.altes) AS Alt, '
+'SUM(od_hospitalitzacio.ingressos) AS Ingres '+'FROM '+'od_hospitalitzacio, '
+'ov_cia, '+'oa_data '+'WHERE '+'od_hospitalitzacio.id_cia = ov_cia.id_cia AND '
+'od_hospitalitzacio.data = oa_data.DATA AND '
+'oa_data.ANY4 = TO_NUMBER(TO_CHAR(SYSDATE-1, ' + QuotedStr('YYYY')
+ ')) '+'GROUP BY '+'od_hospitalitzacio.data, '+'oa_data.SETMANA_DEL_ANY, '
+'oa_data.MES_DEL_ANY, '+'oa_data.TRIMESTRE, '+'ov_cia.cia';
	ExecSQL;
	FieldDefs.Clear;
	FieldDefs.Add('Datos', ftString, 0, True);
  end;
Con esto pasa totalmente de mi, no limpia y no añade, sigue usando los que ya fueron definidos a mano. Alguien sabe porque me hace esto!? Gracias!
Responder Con Cita
  #4  
Antiguo 01-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
mmmm, espera.... qué es lo que quieres hacer/conseguir?
Responder Con Cita
  #5  
Antiguo 01-09-2004
n0n3 n0n3 is offline
Registrado
 
Registrado: sep 2004
Posts: 8
Poder: 0
n0n3 Va por buen camino
Estoy intentando hacer funcionar un DecisionCube, y quiero que se creen dinamicamente los campos que aparecen. He seguido este tutorial para hacer funcionar el DecisonCube -> http://www-106.ibm.com/developerwork...0304swart.html

y poniendole a mano a cada objeto lo que tiene que hacer, me funciona el cubo.
Lo que intento ahora es crearlo dinamicamente. Lo primero que necesito es que el SQLDataSet me pille los campos para pasarselos al ClientDataSet y luego pasarselo al DecisionCube. Ahora mismo me falla al principio, no consigo definir los campos dinamicamente.
Responder Con Cita
  #6  
Antiguo 01-09-2004
n0n3 n0n3 is offline
Registrado
 
Registrado: sep 2004
Posts: 8
Poder: 0
n0n3 Va por buen camino
Casi se me olvida! Lo de definir los campos a mano, tambien es porque el query me devuelve los SUM() como Binary Decimal y la fecha como SQLDate y el decisioncube solo se traga, interger, string y float. Necesito crear unos campos puente del tipo float y string para guardar la fecha y los SUM().
Responder Con Cita
  #7  
Antiguo 01-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
ya que usas una sentencia SQL.... pq no usas un Query para sacar la info que quieras? así te olvidas de los campos.

No se, es una idea (ya te digo que no he jugado mucho con los DBX)
Responder Con Cita
  #8  
Antiguo 01-09-2004
n0n3 n0n3 is offline
Registrado
 
Registrado: sep 2004
Posts: 8
Poder: 0
n0n3 Va por buen camino
Con SQLQuery tengo exactamente el mismo problema, necesito convertir los campos que me devuelve el query de BinaryDecimal y SQLDate, a Float y String respectivamente, porque el DecisionCube solo se traga Float, Integer y String. Con lo cual con el SQLQuery tambien necesitaria crear campos puente ;(
Responder Con Cita
  #9  
Antiguo 01-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Y si creas campos calculados en el CDS y en ellos haces la transformación?

Luego le pasas al Cubo los campos calculados y listo!!

Prueba a ver
Responder Con Cita
  #10  
Antiguo 01-09-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola.

Además también puedes intentar transformar los datos en la consulta.

Es decir en lugar de : select sum(importe) from ....

Pones : select cast(sum(importe) as numeric(15, 2) from ...

Y las fechas : select cast(fecha as varchar(10)) from ...

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #11  
Antiguo 01-09-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Por cierto, ¿ has probado con alguna evolución del Decision Cube ?. Como por ejeplo, este open source : http://fxds.sourceforge.net/

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #12  
Antiguo 01-09-2004
n0n3 n0n3 is offline
Registrado
 
Registrado: sep 2004
Posts: 8
Poder: 0
n0n3 Va por buen camino
Ya probe lo de que el query me devolviese ya los datos en el formato que yo necesito, pero resulta que el objeto lo convierte solo a BinaryDecimal ;/

Ahora mismo me estoy bajando el FDS, a ver que tal va. Intentare a ver si con eso lo consigo hacer funcionar y me dejo de comer la cabeza. Muchas gracias
Responder Con Cita
  #13  
Antiguo 09-04-2005
succinil succinil is offline
Registrado
 
Registrado: abr 2005
Posts: 1
Poder: 0
succinil Va por buen camino
Hola, no tengo mucha experiencia, pero me ha ocurrido el mismo error al intentar conectar un SQLQuery enlazado con una base Access. Y al querer modificar un registro en la base me daba el siguiente error "cannot modify a read-only dataset", u otro que me decía que "el Dataset no se encontraba en Edit or Insert Mode", así que después de mucho revisar, comencé a probar. Y finalmente pude modificar mis registros pero CAMBIANDO el SQLQuery, por un "ADOQuery", y estableciendo un ADOConnection. Supongo yo que de esa manera hay un solo acceso a la base y el sistema no produce un bloqueo mutuo. No sé realmente y quizás digo alguna ganzada, pero lo cierto es que así funcionó, y no encontré ninguna respuesta en internet. Espero que les sirva. Saludos a todos.
Responder Con Cita
  #14  
Antiguo 27-04-2005
CCCP CCCP is offline
Miembro
 
Registrado: dic 2004
Ubicación: Barcelona
Posts: 38
Poder: 0
CCCP Va por buen camino
Assign

Prueba con el XXX.fields.Assign.
creo que era asi. Te creas un TFIELD como quieras y se lo asignas al que quieres cambiar.
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


La franja horaria es GMT +2. Ahora son las 14:52:00.


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