PDA

Ver la Versión Completa : Dudas en la creación de un archivo de texto desde FireBird


teletranx
04-03-2004, 02:30:48
:confused:
Premisas:

1.- Estoy utilizando Delphi 6 y FireBird 1.5 versión final.
2.- Trabajando solamente con sp.
3.- Utilizando "execute statement"
4.- Windows 2000 professional como administrador.

Caso:


Tengo que obtener la información de cualquier tabla, para lo cual tengo un sp que que clona la tabla con todos sus campos, con el cual creo la tabla temporal.
Posteriormente creo en otro sp paso la información deseada a la tabla temporal.
Ya que estoy trabajando con string para construir la tabla externa, en la opción External File '<NombreTablaExterna>', no la puedo utilizar por ' ', utilizo la siguiente
Update RDB$RELATIONS Set RDB$EXTERNAL_FILE = :TablaSal Where
RDB$RELATION_NAME = :TablaPaso;

Donde
TablaSal es la Tabla de salida "C:\tabla.txt"
Tablapaso esla tabla temporal "Paso<Tabla>"


Cuando utilizo el procedimiento sin el Update RDB$RELATIONS ...., me crea la tabla con la información, pero cuando lo activo sale el siguiente mensaje.
Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Access to external file "C:\TABF22.TXT " is denied by server administrator.


No me crea la tabla de salida ni la temporal con la información.
He leido la información al respecto en el foro creo que lo estoy haciendo bien. Creo?
Sin otro particular, pero con dudas

Juan Carlos

jachguate
04-03-2004, 02:45:11
No he trabajado con tablas externas... pero me llama la atención que actualices manualmente el diccionario de datos. Que no debieras hacer un

Create table external file 'filespec' etc, etc.

???

Por otro lado, estas seguro que el usuario con el que corre el servidor de interbase tiene permisos para crear un archivo en la raiz del disco C??

Hasta luego.

;)

teletranx
04-03-2004, 19:30:41
Juan Antonio

Respondiendo a tus preguntas
te envio sp que clona tablas

CREATE PROCEDURE P_CLONATABLA (
TABLA VARCHAR(10),
NEDES INTEGER)
AS
DECLARE VARIABLE CAMPO VARCHAR(100);
DECLARE VARIABLE SOURCE VARCHAR(100);
DECLARE VARIABLE TOTALCAMPOS INTEGER;
DECLARE VARIABLE CONTADOR INTEGER;
DECLARE VARIABLE LARGO INTEGER;
DECLARE VARIABLE SCALE INTEGER;
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE SUBTIPO INTEGER;
DECLARE VARIABLE NPRECISION INTEGER;
DECLARE VARIABLE CTIPO VARCHAR(20);
DECLARE VARIABLE SQL VARCHAR(32000);
DECLARE VARIABLE BORRAR VARCHAR(100);
DECLARE VARIABLE TABLAPASO VARCHAR(20);
DECLARE VARIABLE TABLASAL CHAR(20);
begin
TablaPaso = 'PASO' || TABLA;
TablaSal = 'C:\' || TABLA || '.TXT';
Select Count(*)
From rdb$relation_fields
where rdb$relation_name = :TablaPaso
into :TotalCampos;
if (TotalCampos = 0) then
Begin
Sql = 'CREATE TABLE ' || TablaPaso || ' (';

Contador = 1;
Select Count(*)
From rdb$relation_fields
where rdb$relation_name = :TABLA
into :TotalCampos;
For
Select R.RDB$Field_Name, r.rdb$Field_Source, f.rdb$Field_Length,
f.rdb$Field_Scale, f.rdb$Field_Type, f.rdb$Field_Sub_Type,
f.rdb$Field_Precision From rdb$relation_fields R, rdb$Fields f
where R.rdb$relation_name = :Tabla and r.rdb$Field_Source = f.rdb$Field_Name
ORDER BY R.rdb$field_position
Into :Campo, :Source, :Largo, :Scale, :Tipo, :SubTipo,
:nPrecision
Do
Begin
if (substr(f_lrtrim(Source),1,4) <> 'RDB$') then
Begin
if (Contador < TotalCampos) then
begin
Sql = Sql || F_LRTRIm(Campo)|| ' ' || F_LRTRIm(Source) || ',';
end
else
begin
Sql = Sql || F_LRTRIm(Campo)|| ' ' || F_LRTRIm(Source);
end
End
else
Begin
Scale = Abs(Scale);
if (Tipo = 7) Then cTipo = 'SMALLINT';
if (Tipo = 8) THEN cTipo = 'INTEGER';
if (Tipo = 10) Then cTipo = 'FLOAT';
if (Tipo = 27) Then cTipo = 'DOUBLE PRECISION';
if (Tipo = 12) THEN cTipo = 'DATE';
if (Tipo = 13) Then cTipo = 'TIME';
if (Tipo = 35) Then cTipo = 'TIMESTAMP';
if (Tipo = 14) THEN cTipo = 'CHAR(' || f_lrtrim(Cast (Largo as VarChar(5))) || ')';
if (Tipo = 37) THEN cTipo = 'VARCHAR(' || f_lrtrim(Cast (Largo as VarChar(5))) || ')';
if (((Tipo = 8) or (Tipo = 16)) and
(SubTipo = 1)) Then cTipo = 'NUMERIC('|| f_lrtrim(Cast (nPrecision as VarChar(5))) ||
',' || f_lrtrim(Cast (Scale as VarChar(5))) || ')';
if (((Tipo = 8) or (Tipo = 16)) and
(SubTipo = 2)) Then cTipo = 'DECIMAL('|| f_lrtrim(Cast (nPrecision as VarChar(5))) ||
',' || f_lrtrim(Cast (Scale as VarChar(5))) || ')';
if ((Tipo = 261) and (SubTipo = 0)) Then cTipo = 'BLOB SUB_TYPE 0 SEGMENT SIZE 80';
if ((Tipo = 261) and (SubTipo = 1)) Then cTipo = 'BLOB SUB_TYPE 1 SEGMENT SIZE 80';
if (Contador < TotalCampos) then
begin
Sql = Sql || F_LRTRIm(Campo)|| ' ' || F_LRTRIm(cTipo) || ',';
end
else
begin
Sql = Sql || F_LRTRIm(Campo)|| ' ' || F_LRTRIm(cTipo);
end
End
Contador = Contador + 1;
End
Sql = Sql || ')';
execute statement Sql;
--Update RDB$RELATIONS Set RDB$EXTERNAL_FILE = :TablaSal Where
-- RDB$RELATION_NAME = :TablaPaso;
End
Else
Begin
Borrar = 'Delete from ' || TablaPaso || ' Where Ne =' || Cast(NeDes as VarChar(5));
execute statement Borrar;
End
end

:D Este sp clona tabla si existe, con FireBird 1.5

Lo otro estoy de administrador del equipo

Juan Carlos

guillotmarc
04-03-2004, 22:07:25
Comprueba la variable ExternalFileAccess del fichero de configuración de Firebird, si está a None cámbialo a Full

En las Release Notes encontrarás más información (en este link las encontrarás en castellano) http://www.ibphoenix.com/downloads/Firebird_v15.108_ReleaseNotesSpanish.pdf

Saludos.

guillotmarc
04-03-2004, 22:08:16
Por cierto, el fichero de configuración es el firebird.conf.

teletranx
05-03-2004, 00:49:49
lei el pdf con la configuración de los Archivos Externos (External Files), probe Full, :confused: nada, también probe Restrict C:\ExternalTables, :( nada

aún tengo el mismo problema:(

guillotmarc
05-03-2004, 10:15:00
¿ Has quitado el símbolo # (comentario) al principio de la línea ?. Creo que debes reiniciar el Servidor Firebird una vez configurado el cambio.

Saludos.

teletranx
05-03-2004, 15:10:24
Si lo hice, lo de eliminar #, y también de reiniciar la máquina pero igual me sale el mismo mensaje de que el se ha negado el acceso por el administrador del servidor :confused:


Saludos.

:( Juan Carlos

jachguate
05-03-2004, 16:23:44
estoy de administrador del equipo

Pues el usuario que realmente importa es bajo el que corre el servicio de firebird.

Hasta luego.

;)

teletranx
05-03-2004, 16:48:01
:D Perdon se me olvido señalar que esta corriendo en mi máquina, en forma local.

saludos...

teletranx
09-03-2004, 01:20:04
:( He seguido todos los datos que que me han dado, pero aún no tengo los resultados deseados.


Todo los estoy trabajando en forma local con Ib expert version 2004.03.01

Saludos a todos, más a los que me puedan ayudar, Gracias


Juan Carlos:D

teletranx
10-03-2004, 16:29:49
Aún no he encontrado la respuesta, pero sigo buscandola...


Juan Carlos:)

teletranx
15-03-2004, 20:40:52
:) Un miembro del foro me hablo que ya hace tiempo, un aliado (otro miembro del foro), escribio una solución al respecto, pero no se acuerda en que fecha, pero habla de respaldo en archivos txt desde FireBird o InterBase en procedimientos almacenados


Lo que les tipo si alguien sale del link, que lo coloque como respuesta, o directamente que coloque la rutina:D

Gracias a todos

Juan Carlos

teletranx
19-03-2004, 16:20:14
Aún sigo con el mismo problema.

Me pregunto, no será la versión de FireBird?
Voy a probar con la versión 1.0.3.


Saludos

Juan Carlos:rolleyes: