Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   readonly dataset (https://www.clubdelphi.com/foros/showthread.php?t=13834)

n0n3 01-09-2004 09:59:11

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.

__cadetill 01-09-2004 10:12:43

Aunque no he trabajado mucho con DBX, mírate el método

Código Delphi [-]
SQLDataSet1.FieldDefs.Add(......);

n0n3 01-09-2004 11:42:58

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!

__cadetill 01-09-2004 12:01:57

mmmm, espera.... qué es lo que quieres hacer/conseguir?

n0n3 01-09-2004 12:09:23

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.

n0n3 01-09-2004 12:15:32

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().

__cadetill 01-09-2004 13:00:10

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)

n0n3 01-09-2004 14:06:00

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 ;(

__cadetill 01-09-2004 14:34:33

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

guillotmarc 01-09-2004 14:52:21

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.

guillotmarc 01-09-2004 14:57:21

Por cierto, ¿ has probado con alguna evolución del Decision Cube ?. Como por ejeplo, este open source : http://fxds.sourceforge.net/

Saludos.

n0n3 01-09-2004 16:01:47

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

succinil 09-04-2005 16:08:35

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.

CCCP 27-04-2005 01:24:45

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.


La franja horaria es GMT +2. Ahora son las 08:50:49.

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