PDA

Ver la Versión Completa : Agrandar Campo en ClientDataset mayor de 50 Caracteres


feliz-58
17-12-2021, 14:50:57
Saludos,

Alguna idea de como agrandar un campo de un ClientDataSet que solo me permite un maximo de 50 Caracteres?

Gracias.

kuan-yiu
17-12-2021, 14:54:53
Muchas pero falta información. ¿Por qué solo te permite 50?

feliz-58
17-12-2021, 15:00:27
Muchas pero falta información. ¿Por qué solo te permite 50?

No entiendo por que, el campo es de tipo fkData, y cuando le pongo un valor mayor a 50, y ejecutas el programa o desactivas y activas, se vuelve a poner en 50, y en tiempo de ejecucion no acepta mas de 50.

kuan-yiu
17-12-2021, 15:08:32
¿Y como está definido en la BD? ¿Como está enlazado ese ClientDataSet con la BD? ¿Se modifica el campo en algún otro punto del programa?

feliz-58
17-12-2021, 15:52:16
¿Y como está definido en la BD? ¿Como está enlazado ese ClientDataSet con la BD? ¿Se modifica el campo en algún otro punto del programa?

Utilizo ese ClientdataSet para guardar datos temporales en tiempo de ejecucion, lo lleno con la informacion que consulto de un Query.

Utilizo la siguientes lineas:


Tfactura.Insert;
TFacturaDESCRIPCION.AsString := Fagregarproducto.Qtemp.FieldByname('Descripcion').AsString;

kuan-yiu
21-12-2021, 13:43:02
Faltan datos. No has dicho como está definido en la BD, ni como es la consulta, ni si has dado de alta los campos en el ClientDataSet o los toma dinámicamente de la consulta.
Si el campo es editable con un simple: "micampo.size := longitud" deberías poder cambiarlo. O directamente en el formulario.
Si este cambio no es persistente es porque haces algo más con ese campo.

Revisa que el dato original no tenga esa limitación de tamaño o que utilizas algún paso intermedio que imponga una limitación.
Revisa que el componente de formulario (grid, dbedit...) no tenga una máscara, maxlength, size, displaywidth.
Revisa que no cambies por código el tamaño, o que hagas la carga o definición de los campos una segunda vez que machaque lo que has puesto.
Pon breakpoints en el código, o mensajes o lo que más te guste, para ver en que punto se modifica el size del campo en cuestión.

feliz-58
21-12-2021, 15:37:47
Faltan datos. No has dicho como está definido en la BD, ni como es la consulta, ni si has dado de alta los campos en el ClientDataSet o los toma dinámicamente de la consulta.
Si el campo es editable con un simple: "micampo.size := longitud" deberías poder cambiarlo. O directamente en el formulario.
Si este cambio no es persistente es porque haces algo más con ese campo.

Revisa que el dato original no tenga esa limitación de tamaño o que utilizas algún paso intermedio que imponga una limitación.
Revisa que el componente de formulario (grid, dbedit...) no tenga una máscara, maxlength, size, displaywidth.
Revisa que no cambies por código el tamaño, o que hagas la carga o definición de los campos una segunda vez que machaque lo que has puesto.
Pon breakpoints en el código, o mensajes o lo que más te guste, para ver en que punto se modifica el size del campo en cuestión.

Hola,
1- Como Dije arriba, lo lleno con una consulta de un Query, la cual Hace un Select de la base de datos.
La tabla es Productos.
Mi campo en la tabla es Descripcion Nvarchar 80.
SQL Server.

La consulta es:
'Select Cod, Descripcion, Existencia, Categoria, SubCategoria, Suplidor, '+
'Serie, Cod_Produc_Suplidor as Cod_Suplidor FROM Productos';

Para Trae los datos al ClientDataSet lo hago asi:

Tfactura.Insert;
TFacturaDESCRIPCION.AsString := FAgregarproducto.Qtemp.FieldByname('Descripcion').AsString;

Nota: La unica cosa que hago que tenga que ver con la forma en que se muestra esa columna, es que le doy una alineacion centrada. No tiene que ver pero lo comento.
DBGrid1.Columns[3].Title.Alignment := taCenter;

Cuando en el OnShow del Form, aplico lo de

TfacturaDescripcion.size := 100;
Tafactura.Active;

Me da error de fuera de Rango.


2- Lo del campo original ya mencione que son 80.
3- El DBgrid muestra los datos cuando se habre el ClientDataSet, asi que no estan predefinidos ni delimitados de ninguna clase.
4- No cambio por codigo el tamaño.

Creo que respondi todo.
Gracias.

kuan-yiu
21-12-2021, 16:50:33
A simple vista ya hay algo.
Si en la BD es de 80 no puedes darle de tamaño 100 porque te dará error al guardar.

La tabla es Productos.
Mi campo en la tabla es Descripcion Nvarchar 80.
SQL Server.
(...)
TfacturaDescripcion.size := 100;
Tafactura.Active;

Me da error de fuera de Rango.


Prueba poniendo 80 y determina el punto exacto en el que salta el error o en donde pierde el tamaño.
No es un comportamiento normal que cambie de tamaño así por las buenas.

feliz-58
21-12-2021, 17:54:35
A simple vista ya hay algo.
Si en la BD es de 80 no puedes darle de tamaño 100 porque te dará error al guardar.


Prueba poniendo 80 y determina el punto exacto en el que salta el error o en donde pierde el tamaño.
No es un comportamiento normal que cambie de tamaño así por las buenas.

Ya encontre el problema, la solucion esta en que, cuando modificas el tamaño de un campo, en ves de activar y desactivar el ClientDataSet, hay que dale a crear otra vez. (Clic Derecho, Crear DataSet) y los cambio si se guardan

feliz-58
21-12-2021, 17:55:15
A simple vista ya hay algo.
Si en la BD es de 80 no puedes darle de tamaño 100 porque te dará error al guardar.


Prueba poniendo 80 y determina el punto exacto en el que salta el error o en donde pierde el tamaño.
No es un comportamiento normal que cambie de tamaño así por las buenas.

Gracias por la ayuda y el interes.

movorack
21-12-2021, 23:32:56
¡Hola, feliz-58!

De pronto algo de este helper, pueda serte útil.


uses
System.RegularExpressions;

type
TMyClientDatasetHelper = class helper for TClientDataset
Private
Public
procedure CopyCurrentRecord(DataSet: TDataset; IgnoreFieldNames: array of string); overload;

procedure CopyCurrentRecord(DataSet: TDataset); overload;

procedure CopyData(DataSet: TDataset; IgnoreFieldNames: array of string); overload;

procedure CopyData(DataSet: TDataset); overload;

procedure InicLocal(XMLSource: string = ''; LogChanges: Boolean = False);

procedure FinaLocal(XMLFileName : string = '');
end;

{ TMyClientDatasetHelper }

procedure TMyClientDatasetHelper.CopyCurrentRecord(DataSet: TDataset;
IgnoreFieldNames: array of string);
function IgnoreField(FieldName: string): Boolean;
var
lFieldName : String;
begin
Result := False;
for lFieldName in IgnoreFieldNames do
begin
Result := SameText(FieldName.Trim, lFieldName.trim);
if Result then
Break;
end;
end;
var
lField: TField;
begin
if (not Dataset.Active) or Dataset.IsEmpty then
Exit;

if not (Self.State in [dsEdit, dsInsert]) then
if Self.IsEmpty then
Self.Append
else
Self.Edit;

for lField in Self.Fields do
begin
if IgnoreField(lField.FieldName) then
Continue;

if not Assigned(DataSet.FindField(lField.FieldName)) then
Continue;

if lField.IsBlob then
begin
try
//Se intenta realizar la copia
lField.AsBytes := DataSet.FieldByName(lField.FieldName).AsBytes
except
end;
end
else
if (lField.Value <> DataSet.FieldByName(lField.FieldName).Value) then
lField.Value := DataSet.FieldByName(lField.FieldName).Value;
end;
end;

procedure TMyClientDatasetHelper.CopyCurrentRecord(DataSet: TDataset);
begin
CopyCurrentRecord(DataSet, []);
end;

procedure TMyClientDatasetHelper.CopyData(DataSet: TDataset);
begin
CopyData(DataSet, []);
end;

procedure TMyClientDatasetHelper.CopyData(DataSet: TDataset;
IgnoreFieldNames: array of string);
var
BookMark: TBookmark;
begin
if (not DataSet.Active) or DataSet.IsEmpty then
Exit;

if Self.State in [dsEdit, dsInsert] then
Self.Cancel;

BookMark := nil;
try
DataSet.DisableControls;
Self.DisableControls;
BookMark := DataSet.GetBookmark;

DataSet.First;
while not DataSet.Eof do
begin
Self.Append;
CopyCurrentRecord(Dataset, IgnoreFieldNames);
Self.Post;
Dataset.Next;
end;

Self.First;
finally
if Assigned(BookMark) and Dataset.BookmarkValid(BookMark) then
DataSet.GotoBookmark(BookMark);

DataSet.EnableControls;
Self.EnableControls;
end;
end;

procedure TMyClientDatasetHelper.FinaLocal(XMLFileName: string);
begin
if Self.State in [dsInsert, dsEdit] then
Self.Post;

if not XMLFileName.Trim.IsEmpty then
begin
if FileExists(XMLFileName) then
DeleteFile(XMLFileName);

Self.SaveToFile(XMLFileName, dfXMLUTF8);
end;
end;

procedure TMyClientDatasetHelper.InicLocal(XMLSource: string;
LogChanges: Boolean);
var
lCds: TClientDataSet;
begin
if (not (Self is TClientDataSet))
or Assigned(Self.RemoteServer)
or (not Self.ProviderName.Trim.IsEmpty)
then
Exit;

//Se inicializa el dataset vacio
if Self.DataSize > 0 then
Self.Close;
Self.FieldDefs.Clear;

if Self.FieldCount > 0 then
begin
Self.CreateDataSet;
Self.EmptyDataSet;
end;

if Self.Active then
Self.LogChanges := LogChanges;

if not XMLSource.Trim.IsEmpty then
begin
//Para evitar fallas de carga cuando la estructura del dataset no coincide,
//se crea un dataset temporal para cargar el XML
lCds := TClientDataSet.Create(Self);
try
//Se verifica si es un archivo.
if FileExists(XMLSource) then
begin
try
lCds.LoadFromFile(XMLSource);
except
on E: Exception do
begin
if FileExists(XMLSource) then
DeleteFile(XMLSource);
raise;
end;
end;
end
else
//se verifica que sea una estructura XML
if TRegEx.IsMatch(XMLSource, '\s*\<\?xml', [roIgnoreCase, roMultiLine]) then
begin
lCds.XMLData := XMLSource.Trim;
lCds.Open;
end;

if lCds.Active then
begin
lCds.LogChanges := LogChanges;
Self.CopyData(lCds);
end;
finally
lCds.Free;
end;
end;

if Self.Active and (not Self.IsEmpty) then
Self.First;
end;