PDA

Ver la Versión Completa : Error: E2056 String literals may have at most 255 elements


edgar_prospero
08-06-2012, 17:13:54
que hay a ver quien puede echarme la mano tengo un codigo donde me marca string too long algo investigue de porque use mas de 255 caracteres a continuacion agrego el codigo para ver si puede orientarme de como puedo hacerle para tenerlo en varias lineas en la parte de tabla.sql.clear es en donde lo tengo en una sola linea


procedure TForm2.GuardarClick(Sender: TObject);
begin
tabla.SQL.Clear;
tabla.Close;

tabla.SQL.Add('insert into arm0062( codigo, nombre, departamento, folio, unidad, cant_piezas, cant_material, costo, total ) values( :pcodigo, : pnombre, : pdepartamento, : pfolio, : punidad, : pcant_piezas, : pcant_material, : pcosto, :ptotal) on duplicatekey update nombre= :pnombre, departamento= :pdepartamento, unidad= :punidad, cant_piezas= :pcant_piezas, cant_material= : pcan_material, costo= : pcosto, total= :ptotal');

tabla.ParamByName('pcodigo').AsString: =codigo.Text;
tabla.ParamByName('pnombre').AsString: =nombre.Text;
tabla.ParamByName('pdepartamento').AsInteger: =departamento.Text;
tabla.ParamByName('pfolio').AsString: =folio.Text;
tabla.ParamByName('punidad').AsInteger: =unidad.Text;
tabla.ParamByName('pcant_piezas').AsInteger: =folio.Text;
tabla.ParamByName('pcant_material').AsInteger: =cant_material.Text;
tabla.ParamByName('pcosto').AsInteger: =costo.Text;
tabla.ParamByName('ptotal').AsInteger: =total.Text;


tabla.Execute;

maeyanes
08-06-2012, 17:18:04
Hola...

Prueba dividiendo la línea en varias:


tabla.SQL.Add('insert into arm0062');
tabla.SQL.Add('(codigo, nombre, departamento...)');
tabla.SQL.Add('values(:pcodigo, :pnombre, :pdepartamento...)');



Saludos...

dec
08-06-2012, 17:20:46
Hola,

Puedes partir la cadena que añades en "tabla.SQL.Add", puesto que no puede tener más de 255 caracteres. Podría quedarte algo como esto:


tabla.SQL.Add
(
'insert into arm0062( codigo, nombre, departamento, folio, unidad, ' +
'cant_piezas, cant_material, costo, total ) values( codigo, : pnombre, ' +
': pdepartamento, : pfolio, : punidad, : pcant_piezas, : pcant_material, : ' +
'pcosto, total) on duplicatekey update nombre= nombre, departamento= ' +
'departamento, unidad= unidad, cant_piezas= cant_piezas, cant_material= : ' +
'pcan_material, costo= : pcosto, total= total'
);


Edito: O hacer lo que te ha propuesto el compañero más arriba. ;)

edgar_prospero
08-06-2012, 17:42:53
excelentes respuestas las 2 probe con las 2 y me funcionaron bien gracias por su ayuda

maeyanes
08-06-2012, 17:44:45
Hola...

Ahora, el detalle con ese error no es que las cadenas de texto en Delphi tengan que ser de hasta 255 caracteres, sino que una línea en el editor de Delphi no debe contener más de 255 caracteres.


Saludos...

dec
08-06-2012, 17:57:40
Hola...

Ahora, el detalle con ese error no es que las cadenas de texto en Delphi tengan que ser de hasta 255 caracteres, sino que una línea en el editor de Delphi no debe contener más de 255 caracteres.


Saludos...

Eso no es del todo correcto. En realidad yo ignoro el porqué, pero, lo cierto es que no tiene que ver con el editor de Delphi. El caso es que no se pueden emplear "cadenas literales" de más de 255 caracteres. Puedes comprobarlo utilizando el compilador usando la "línea de comandos": si tratas de compilar un programa que contenga una cadena "literal" de más de 255 caracteres obtendrás el error "E2056 String literals may have at most 255 elements".

maeyanes
08-06-2012, 18:00:56
Hola...

Vaya, podría jurar que tenía que ver con el editor. Pero bueno, entonces el detalle es con las constantes (por decirlo de alguna forma) ya que una variable del tipo string si puede tener más de 255 caracteres.

Gracias por la aclaración...


Saludos...

ecfisa
08-06-2012, 18:39:47
Hola.

Según entiendo, las constantes literales son tomadas por Delphi como ShortString (el viejo string de Turbo Pascal o Delphi 1).
El tipo string(viejo) esta representado por un arreglo de 256 bytes donde en el primer elemento reside el valor de la longitud de la cadena, por lo mismo tendríamos un error al intentar:

var
s1: string[256]; // error, sólo hasta 255 ( 256 - 1er Byte)

En las versiones posteriores a Delphi 1, por defecto está activada la opción {$H+}, por lo que el el compilador interpreta el tipo string como AnsiString en las declaraciones; pero no es así con las constantes literales.

var
s1: string; // AnsiString


Para el caso de edgar, la solución es cualquiera de las propuestas por maeyanes o Dec.

Saludos.

dec
08-06-2012, 20:39:22
Hola,

Gracias por la aclaración ecfisa.

ecfisa
09-06-2012, 18:57:55
Hola,

Gracias por la aclaración ecfisa.
De nada Dec, es sólo una entre tantas que te debemos... ;)

Saludos. :)

dec
09-06-2012, 21:27:32
De nada Dec, es sólo una entre tantas que te debemos... ;)

Saludos. :)

Nada... no digas eso, porque, no es verdad. Yo soy el que siempre estaré agradecido. :o