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
|
|||
|
|||
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.
|
#8
|
|||
|
|||
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. |
|
|
|