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.