PDA

Ver la Versión Completa : Convertir State a tipo String


Marcela
05-10-2006, 02:13:24
:o Hola a todos, requiero que el estado de una tabla (Tabla.State) quede guardado en un campo de tipo string para posteriormente insertarlo en una tabla que realice en Sql donde el campo "Estado" es de tipo varchar(20).

La idea es que en el campo me quede guardado dsBrowse o dsInsert o dsEdit o ds....)

Como hago para poder realizar esto????,

La otra opción podria estar en definir el campo donde va quedar este valor de otra forma (otro tipo que no sea varchar), para que pueda guardarlo directamente, pero no se cual.

Gracias por su colaboracion. :o

Héctor Randolph
05-10-2006, 02:53:57
Una opción:

En el archivo DB.PAS está definido este tipo de datos para los estados del DataSet


TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,
dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead,
dsInternalCalc, dsOpening);


Puedes crear un arreglo que contenga los estados en cadenas de caracteres, pero respetando el mismo orden en el que están definidos




procedure TForm1.Button1Click(Sender: TObject);
const MyArray:array[0..12] of String = ('dsInactive', 'dsBrowse', 'dsEdit',
'dsInsert', 'dsSetKey', 'dsCalcFields', 'dsFilter', 'dsNewValue', 'dsOldValue',
'dsCurValue', 'dsBlockRead', 'dsInternalCalc', 'dsOpening');

begin
//Ejemplo de como usarlo
ShowMessage(MyArray[Ord(IBQuery1.State)]);
end;



Saludos

jachguate
05-10-2006, 02:58:53
Para seguir con la idea de Hector (sin meterse a los abismos de RTTI) podes declarar directamente un vector sobre el tipo enumerado:


function StateToStr(AState: TDataSetState): string;

const StateDesc:array[dsInactive..dsOpening] of String =
('dsInactive', 'dsBrowse', 'dsEdit',
'dsInsert', 'dsSetKey', 'dsCalcFields', 'dsFilter', 'dsNewValue', 'dsOldValue',
'dsCurValue', 'dsBlockRead', 'dsInternalCalc', 'dsOpening');

begin
Result := StateDesc[AState];
end;


Puede que no compile, pues no lo he probado, pero dejo la idea.

Hasta luego.

;)

Héctor Randolph
05-10-2006, 03:00:56
Por otra parte, la instrucción Ord(Query1.State) te devuelve el índice o la posición de cada elemento dentro del arreglo, otra opción es guardar ese índice, es decir, un entero tomando en cuenta lo siguiente

[0] dsInactive
[1] dsBrowse
[2] dsEdit
[3] dsInsert
...


Saludos

roman
05-10-2006, 03:21:55
sin meterse a los abismos de RTTI

Bueno, no es que esté muy profundo :)


uses TypInfo;

function RTTI_StateToStr(State: TDataSetState): String;
begin
Result := TypInfo.GetEnumName(TypeInfo(TDataSetState), Integer(State));
end;


Por otra parte, un tipo enumerado como lo es TDataSetState no es más que un escalar que puede guardarse como entero:

Integer(Table.State)

y recuperarse con el moldeo inverso:

TDataSetState(3)

En otras palabras, ¿para qué guardar el string, que ocupará más espacio? Mejor cambia el tipo de datos a INTEGER.

Eso sí, me pica la curiosidad de por qué alguien querría guardar este dato en una tabla?

Agrego

Por cierto, en la versió jachguatiana, el arreglo


const StateDesc:array[dsInactive..dsOpening] of String = ...


también puede ponerse así:


const StateDesc:array[TDataSetState] of String = ...



// Saludos

Marcela
05-10-2006, 17:20:09
Listo muchas gracias a todos por su colaboracion

jachguate
05-10-2006, 19:38:44
Por cierto, en la versió jachguatiana, el arreglo

:o :o :o :eek: :eek :eek:

nunca había oido cosa semejante... :D:D:D

roman
05-10-2006, 19:43:58
¡Oh! ¿Quizá debí decir jachapina? :rolleyes:

:D

// Saludos

jachguate
05-10-2006, 20:00:38
:D:D:D muy buena!!! :D:D:D