FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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); 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. |
#3
|
|||
|
|||
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; |
#4
|
|||
|
|||
mmmm, espera.... qué es lo que quieres hacer/conseguir?
|
#5
|
|||
|
|||
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. |
#6
|
|||
|
|||
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().
|
#7
|
|||
|
|||
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) |
#8
|
|||
|
|||
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 ;(
|
#9
|
|||
|
|||
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 |
#10
|
||||
|
||||
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). |
#11
|
||||
|
||||
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). |
#12
|
|||
|
|||
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 |
#13
|
|||
|
|||
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.
|
#14
|
|||
|
|||
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. |
|
|
|