Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Propiedades de una columna (https://www.clubdelphi.com/foros/showthread.php?t=90108)

Angel.Matilla 08-04-2016 11:56:29

Propiedades de una columna
 
Estoy trabajando con una BB.DD. Firebird y necesito saber si en las propiedades de una columna se ha definido un valor por defecto. A través de las tablas RDB$ saco al información de las columnas de las tablas, pero no acabo de ver cómo saber si se ha definido un valor por defecto para una columna concreta y cuál es, llegado el caso, dicho valor.
Código SQL [-]
SELECT RDB$FIELD_NAME, RDB$FIELD_POSITION, RDB$DESCRIPTION, RDB$DEFAULT_VALUE 
FROM RDB$RELATION_FIELDS 
WHERE RDB$RELATION_NAME='PERSONA'
Con este código debería poder ver dicho valor por defecto pero, probando con EMS SQL Manager, no me deja acceder al valor contenido en esa selección RDB$DEFAULT_VALUE. Veo que el "icono" en la rejilla es diferente, pero no puedo ver el contenido.



Yo sé que el valor por defecto de esa columna poblacion es 1, pero ¿cómo puedo "leerlo"?

Casimiro Noteví 08-04-2016 12:18:30

Creo recordar que el campo es "default_source"

ecfisa 08-04-2016 12:32:56

Hola.

Fijate si esto es lo que estas buscando:
Código SQL [-]
SELECT RDB$FIELD_NAME,
       RDB$FIELD_POSITION,
       RDB$DESCRIPTION,
       RDB$DEFAULT_SOURCE
FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME = :TABLE_NAME
  AND RDB$FIELD_NAME    = :COLUMN_NAME
  AND RDB$SYSTEM_FLAG = 0

Saludos :)

Edito: (Casimiro fué mas rápido :D)

Angel.Matilla 08-04-2016 12:34:40

¡Perfecto! Muchas gracias a los dos. No se me ocurría como encontrarlo.

Angel.Matilla 08-04-2016 13:18:39

Pues no logro modificar por código las propiedades. En principio, al crear la base de datos, la columna CODPRV no tiene valor por defecto lo que es un grave error tratándose de un campo de la clave primaria pero no puedo fijarlo desde la creación porque van a haber instalaciones diferentes.

He montado esto:
Código:

Auxiliar->Close();    // Para saber que tablas he de modificar
Auxiliar->SQL->Text = "SELECT A.RDB$RELATION_NAME FROM RDB$RELATION_CONSTRAINTS A JOIN RDB$INDEX_SEGMENTS B ON A.RDB$CONSTRAINT_NAME = B.RDB$INDEX_NAME WHERE A.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND B.RDB$FIELD_NAME = 'CODPRV' ORDER BY RDB$RELATION_NAME";
Auxiliar->Open();
for (; !Auxiliar->Eof; Auxiliar->Next())
{
    Query->Close();    // Comprobar si ya se ha definido el valor DEFAULT
    Query->SQL->Text = "SELECT RDB$DEFAULT_SOURCE FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = :Tabla AND RDB$FIELD_NAME = 'CODPRV' AND RDB$SYSTEM_FLAG = 0";
    Query->ParamByName("Tabla")->AsString = Auxiliar->FieldByName("RDB$RELATION_NAME")->AsString;
    Query->Open();

    if (Query->FieldByName("RDB$DEFAULT_SOURCE")->AsString.IsEmpty())
    {
          // Si no hay valor, establecerlo
          Query->Close();
          Query->SQL->Text = "UPDATE RDB$FIELDS SET RDB$CHARACTER_SET_ID = NULL WHERE RDB$FIELD_NAME = (SELECT RDB$FIELD_SOURCE FROM RDB$RELATION_FIELDS WHERE RDB$FIELD_NAME = "
                            "'CODPRV' AND RDB$RELATION_NAME = :Tabla)";
          Query->ParamByName("Tabla")->AsString = Auxiliar->FieldByName("RDB$RELATION_NAME")->AsString;
          Query->ExecSQL();

          Query->Close();
          Query->SQL->Text = "UPDATE RDB$RELATION_FIELDS SET RDB$COLLATION_ID = NULL WHERE RDB$FIELD_NAME = 'CODPRV' AND RDB$RELATION_NAME = :Tabla";
          Query->ParamByName("Tabla")->AsString = Auxiliar->FieldByName("RDB$RELATION_NAME")->AsString;
          Query->ExecSQL();

          Query->Close();
          Query->SQL->Text = "ALTER TABLE " + Auxiliar->FieldByName("RDB$RELATION_NAME")->AsString + " ALTER COLUMN CODPRV SET DEFAULT '" + ProvTit + "'";
          Query->ExecSQL();
    }
}

ProvTit es un AnsiString que saco del fichero de configuración de la aplicación y tiene valor (en las pruebas que hago 45).

Todo se ejecuta bien, no da ningún error... Pero no modifica la estructura de la columna. Dentro del if los dos primeros querys los he puesto dado que cuando pruebo con EMS SQL Manager a establecer el valor DEFAULT para la columna, monta los tres querys que hay.

Angel.Matilla 08-04-2016 13:49:44

Acepto collejas por todos lados. ¡Se me había olvidado hacer el commit! :o

Casimiro Noteví 08-04-2016 14:29:12


roman 08-04-2016 16:47:11

Cita:

Empezado por Casimiro Notevi (Mensaje 504175)

Deberíamos tener una etiqueta bb para esta imagen :D

LineComment Saludos

Angel.Matilla 08-04-2016 17:35:59

Cita:

Empezado por roman (Mensaje 504180)
Deberíamos tener una etiqueta bb para esta imagen :D

Estoy de acuerdo. :)


La franja horaria es GMT +2. Ahora son las 21:37:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi