Ver Mensaje Individual
  #5  
Antiguo 08-04-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita