Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas al Crear MDB con Access (https://www.clubdelphi.com/foros/showthread.php?t=40547)

Blackspike 20-02-2007 18:45:20

Problemas al Crear MDB con Access
 
Buenos dias, tengo un problema con delphi 7, estoy haciendo una aplicacion, donde hay unas empresas y cada empresa puede tener unos años, cada año es una base de datos mdb. El problema que tengo es que cuando genero la Base de Datos MDB no se como poner el campo clave. Espero que alguien me pueda ayudar.
Os paso lo que tengo puesto en el codigo. Gracias de antemano.

Código Delphi [-]
 
procedure TfrmEmpresas.CrearMDB(ruta: string);
var
  Catalogo:_Catalog;
  Tabla:_Table;
  DS:String;
begin
    Catalogo:=CreateComObject(StringToGUID('ADOX.Catalog')) as _Catalog;
    DS:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source = '+ruta;
    if FileExists(ruta) then DeleteFile(ruta);
    Catalogo.Create(DS);
    Tabla:=CreateComObject(StringToGUID('ADOX.Table')) as _Table;
    Tabla.Name:='Acabados';
    Catalogo.Tables.Append(tabla);
{campo clave}    Tabla.Columns.Append('Codigo',varInteger,4);
    Tabla.Columns.Append('Descripcion',adVarWChar,50);
    Tabla:=CreateComObject(StringToGUID('ADOX.Table')) as _Table;
    Tabla.Name:='Articulos';
    Catalogo.Tables.Append(tabla);
{campo clave}    Tabla.Columns.Append('Codigo',adVarWChar,15);
    Tabla.Columns.Append('Descripcion',adVarWChar,255);
    Tabla.Columns.Append('Coste',varInteger,255);
    Tabla.Columns.Append('Venta',varInteger,255);
    Tabla.Columns.Append('Tipo',varInteger,255);
end;

waly2k1 20-02-2007 22:15:54

Rta. Campo Clave
 
Núnca creé una BD de esta manera, pero lo que propones podés hacerlo mediante un Alter Table
Así:
Ya sea por un TAdoQuery, TQuery o lo que mas te guste.

sSQL :String;
sSQL := 'ALTER TABLE Articulos ADD CONSTRAINT NombrePK PRIMARY KEY (Codigo)';

Donde NombrePK es el nombre (Opcional sino poné PRIMARYKEY a todas y listo) y entre paréntesis los campos que incluyen en la PK.

Query.SQL.Text := sSQL;
Query.Execute;

Ojo fijate bien la sintaxis del Query, ya que no tengo Delphi acá, como para probar y darte un ejemplo válido. Pero ha de funcionar.

Salu2 y espero te sirva mi Rta.
Walter


Juás acá me robé un pedazo de código de un execute hihi
con lo cual te quedará así:
Query1.Sql.Clear;
Query1.Sql.Text := sSQL;
Query1.ExecSQL;

No puedo probarlo.

fjcg02 20-02-2007 23:41:16

Igual te resulta más fácil copiar un mdb vacío, o el del último año, vaciar las tablas qu necesites y compactarla.

Sólo tienes que probarlo.

Un saludo

Neftali [Germán.Estévez] 21-02-2007 11:10:48

Creo que puedes utilizar el objeto 'ADOX.Key' para añadir la clave primaria a la tabla.
Revisa esta página; Aquí puedes ver un ejemplo de cómo se hace para crear una clave primaria, una clave foránea y algunas cosas más.

De todas formas, creo (como ya te han dicho) que es más sencillo si creas la SQL y la lanzas con un ADOQuery para crear la tabla.

Gagiel 27-02-2007 12:51:57

Hola,

Me estoy valiendo de vuestras ayudas :)
he seguido los consejos para crear una bd nueva y llenarla con tablas y formularios.
El tema esta en que quiero crear una tabla con autoindex y autonumerica (incrementalmente)
Buscando por msdn he encontrado las funciones para crear las bd en access pero al ponerle la propiedad 'Autoincrement' me dice delphi k eso no existe.

Os pongo un trozo del codigo.
Código:

Tabla.Columns.Append('Ordre',adInteger, 255);
Tabla.Columns.Item['Ordre'].Properties.AutoIncrement := True;


waly2k1 27-02-2007 17:15:58

Rta.
 
En sentencias SQL debes usar identity Not Null. Fijate la sintaxis porque además podés especificar de cuanto en cuanto va el autoincremental.

waly2k1 27-02-2007 17:22:13

Está mal
 
Ah est está mal
Tabla.Columns.Append('Ordre',adInteger, 255);

Si es integer, sacá el 255, ya que no debés especificar el tamaño del campo
solo debes hacerlo para los de tipo char/varchar.

Gagiel 28-02-2007 08:12:37

Hola,

Gracias por tu respuesta, el tema del not null no te acabo de comprender, me lo podrias especificar un poco? o poner algún ejemplo.

Gracias.

Gagiel 28-02-2007 09:24:12

Creo que he formulado mal las preguntas....

Queria decir autonumerico, osea automatico, que no tenga yo que ir poniendo valores.

No se si me explico...

Saludos

Neftali [Germán.Estévez] 28-02-2007 13:06:47

Código Delphi [-]
...
          
           Col := CreateOLEObject('ADOX.Column');
          Col.ParentCatalog := Cat;
          Col.Name := sKey;
          Col.Type := adInteger;
          Col.Properties('Autoincrement') := True;
          Table.Columns.Append(Col);

Me olvidé de colocar el Link.

Gagiel 01-03-2007 08:59:41

Hola,

No me funciona el codigo que has pegado, me he mirado la web i no soy capaz de arrancarlo.
Además con el ejemplo que me has pasado tengo que crear una conexión nueva...
Otra cosa,cuando añado una columna tengo que poner todo este carro:
Código:

Tabla.Columns.Append(columna, adInteger, 255);
si intento poner
Código:

Tabla.Columns.Append(columna);
me dice que le faltan parametros.
Sigo sin conseguir poner el campo automatico :(

Neftali [Germán.Estévez] 01-03-2007 13:02:16

Vamos a ver, no puede ser tan difícil.
Basándome en el código inicial, y añadiendo dos columnas, una para PK y otra para un campo entero Autoincremental queda así:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Catalog  : _Catalog;
  Table    : _Table;
  BaseName : String;
  DS       : String;
  col      : _Column;
  key      : _Key;
begin
  // Nombre de la Base de Datos
  BaseName := 'C:\Temp\MiBaseDatos.mdb';
  // Create a Catalog Object
  Catalog := CreateCOMObject(StringToGUID('ADOX.Catalog')) as _Catalog;
  // Set the Connection String
  DS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+BaseName;
  // Check if we already have such a file and delete it
  If FileExists(BaseName) Then begin
    DeleteFile(BaseName);
  end;

  // Create new Access database
  Catalog.Create(DS);

  // Create a Table Object
  Table := CreateCOMObject(StringToGUID('ADOX.Table')) as _Table;
  // Set the name of a table
  Table.Name := 'MiTabla';
  // Append Table into the base
  Catalog.Tables.Append(Table);
  // Now add two columns (fields) into the table
  // Both are Text fields up to 128 characters
  Table.Columns.Append('Nombre', adVarWChar, 128);
  Table.Columns.Append('Apellido', adVarWChar, 128);

  // Creamos el objeto columna para el autoIncremental
  col := CoColumn.Create;
  // BD a la que pertenece
  col.ParentCatalog := Catalog;
  col.Name := 'Auntoincremental';
  // Tipo del campo
  col.Type_ := adInteger;
  // Asignamos que es un AutoIncremental
  col.Properties['AutoIncrement'].Value := True;
  // Añadimos la columna
  Table.Columns.Append(col, adInteger, col.DefinedSize);

  // Columna para la clave primaria
  col := CoColumn.Create;
  // BD a la que pertenece
  col.ParentCatalog := Catalog;
  col.Name := 'ClavePrimaria';
  col.Type_ := adInteger;
  // Añadirla
  Table.Columns.Append(col, adInteger, col.DefinedSize);

  // Creamos la clave primaria
  Key := CoKey.Create;
  Key.Name := 'ClavePrimaria';
  Key.Type_ := adKeyPrimary;
  // Columna que forma parte de la PK
  Key.Columns.Append('ClavePrimaria', adInteger, 0 );
  // Añadirla a la tabla
  Table.Keys.Append(Key, 0, EmptyParam, Unassigned, Unassigned);
end;

Añade al uses ADOX_TLB y ComObj.
A mi me crea la tabla perfectamente con los 4 campos.

Pruébalo y dime algo.

La prueba "del delito". :D :D :D

Gagiel 02-03-2007 08:58:46

Hola!

Muchas gracias!
Funciona a la perfección, el tema estaba en que no usaba las propiedades de Col para definir sus propiedades.

Gracias nuevamente! Eres el Rey! :)

Saludos!

Gagiel 02-03-2007 10:03:50

Holaaaa
Aki el pesado de turno :s

Quiero poner una contraseña a la BD que he creado (o al crearla)

He puesto esto:
Código:

  ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User=Admin;Password=123456;Data Source=' +DATABASENAME;
Pero no funciona, lo he probado sin el user i tampoco funciona.

Saludos!

MaMu 08-05-2007 16:10:59

Cita:

Empezado por Neftali
Vamos a ver, no puede ser tan difícil.
Basándome en el código inicial, y añadiendo dos columnas, una para PK y otra para un campo entero Autoincremental queda así:


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
Catalog : _Catalog;
Table : _Table;
BaseName : String;
DS : String;
col : _Column;
key : _Key;
begin
// Nombre de la Base de Datos
BaseName := 'C:\Temp\MiBaseDatos.mdb';
// Create a Catalog Object
Catalog := CreateCOMObject(StringToGUID('ADOX.Catalog')) as _Catalog;
// Set the Connection String
DS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+BaseName;
// Check if we already have such a file and delete it
If FileExists(BaseName) Then begin
DeleteFile(BaseName);
end;

// Create new Access database
Catalog.Create(DS);

// Create a Table Object
Table := CreateCOMObject(StringToGUID('ADOX.Table')) as _Table;
// Set the name of a table
Table.Name := 'MiTabla';
// Append Table into the base
Catalog.Tables.Append(Table);
// Now add two columns (fields) into the table
// Both are Text fields up to 128 characters
Table.Columns.Append('Nombre', adVarWChar, 128);
Table.Columns.Append('Apellido', adVarWChar, 128);

// Creamos el objeto columna para el autoIncremental
col := CoColumn.Create;
// BD a la que pertenece
col.ParentCatalog := Catalog;
col.Name := 'Auntoincremental';
// Tipo del campo
col.Type_ := adInteger;
// Asignamos que es un AutoIncremental
col.Properties['AutoIncrement'].Value := True;
// Añadimos la columna
Table.Columns.Append(col, adInteger, col.DefinedSize);

// Columna para la clave primaria
col := CoColumn.Create;
// BD a la que pertenece
col.ParentCatalog := Catalog;
col.Name := 'ClavePrimaria';
col.Type_ := adInteger;
// Añadirla
Table.Columns.Append(col, adInteger, col.DefinedSize);

// Creamos la clave primaria
Key := CoKey.Create;
Key.Name := 'ClavePrimaria';
Key.Type_ := adKeyPrimary;
// Columna que forma parte de la PK
Key.Columns.Append('ClavePrimaria', adInteger, 0 );
// Añadirla a la tabla
Table.Keys.Append(Key, 0, EmptyParam, Unassigned, Unassigned);
end;





Añade al uses ADOX_TLB y ComObj.
A mi me crea la tabla perfectamente con los 4 campos.

Pruébalo y dime algo.

La prueba "del delito". :D :D :D

ADOX_TLB ????!?!?!? de donde puedo sacar esa DCU ??? no lo tengo, y necesito crear un MDB por soft.

Te agradezco de antemano.

Saludos

Blackspike 08-05-2007 16:47:41

Mira en este enlace. Te dice como hacerlo.
Espero que te sirva.
http://www.cwgsy.net/private/gocher/samples/adox.htm

Neftali [Germán.Estévez] 08-05-2007 17:08:05

En esta página tienes un ejemplo (Crear un MDB de Access por código) de cómo hacerlo; Te explica cómo importas la librerías para que genere ese fichero

MaMu 09-05-2007 07:18:15

Gracias gente, la verdad que se pasaron con la ayuda, estoy mas bien empezando con las bases de datos, y como la mayoria de las aplicaciones que hago son con cursores de datos locales, access alcanza y sobra. Lo mio mas bien es la electrónica y la robótica, y las aplicaciones que realizo son para tales propósitos. Hace ya varios años que me interese por delphi, me resulta más cómodo que C++ y otros, sobre todo en la captura de exepciones. Fabricar software de control para dispositivos electronicos externos a esta altura mas que trabajo, es un hobbie, me encanta.

Saludos y gracias de nuevo.


La franja horaria es GMT +2. Ahora son las 06:29:44.

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