Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Nombre largo (https://www.clubdelphi.com/foros/showthread.php?t=89420)

aromigaret 18-11-2015 20:55:45

Nombre largo
 
Hola, tengo un inconveniente con una aplicación que hice. Si la ejecuto en la PC donde tengo instalado Delphi xe5, encuentra y opera con tablas cuyo nombre es de esta característica: PE1234567890123456.dbf, pero al querer ejecutar dicha aplicación en otra pc, no encuentra la tabla. Si achico el nombre a 8 caracteres, la encuentra. Decidí instalar el xe5 en esa otra PC, ejecute la aplicación y anduvo, mi pregunta es si alguien sabe que api o función se instala con el xe5 y es la que permite leer archivos con nombre que supere los 8 caracteres, ya que es ilógico instalar en cada PC el xe5. Desde ya muchas gracias.

Casimiro Notevi 18-11-2015 21:11:53

¿Tiene msdos?

aromigaret 19-11-2015 01:20:31

Hola Casimiro, gracias por responder. Ambas Pcs tienen instalado win7 32bits. Si tu pregunta es si tengo acceso al msdos, la respuesta es si.

AgustinOrtu 19-11-2015 01:49:23

Como buscas el archivo?
Como lo abris?
Que excepción se genera?
Estas usando una ruta absoluta o relativa?
Que pasa si pones el archivo en c:\?

No creo que Delphi instale ninguna API para abrir archivos de nombre largo. Menos en windows 7...

Proba cargar un archivo con "nombre largo" en un string list por ejemplo para despejar dudas

aromigaret 19-11-2015 13:51:30

AgustinOrtu, te comento la operatoria del sistema:

Recibo por Ftp, tablas que contienen un pedido de mercadería, el nombre de la tabla esta conformada por 'PE' + Código Cliente + Código Vendedor + día + mes + hora + min, un ejemplo 'PE0215000119110925.DBF'.
Estas tablas están en el directorio 'C:\pedidos', mismo directorio donde se ejecuta la aplicación. En dicha aplicación, simplemente tengo un adoquery ('pedido') y cargo los datos de esta tabla, para luego procesarlos.

La sentencia para abrir la adoquery es :

Código Delphi [-]
pedido.sql.text:='select * from ' + nombre_tabla;


donde nombre_tabla es un string con el nombre de la tabla a leer.

La excepción que aparece es la siguiente :

Código Delphi [-]
[Microsoft][Controlador ODBC dBase] El motor de base de datos 
Microsoft Jet no pudo encontrar el objeto ''PE0215000119110925.DBF'.
Asegúrese de que el objeto existe, y que ha escrito el nombre y la ruta
de acceso al objeto correctamente.

Como dije antes, yo tampoco creo que haya que instalar xe5 en cada pc, pero es evidente que "algo cambia" al hacerlo. Por eso quisiera saber que es para que funcione la aplicación.

Gracias

Neftali [Germán.Estévez] 19-11-2015 14:54:58

Las RxLib, en la unit FileUtil.pas tienen la siguiente función, que tal vez te sea útil (te pongo la 4):

Código Delphi [-]
function ShortToLongFileName(const ShortName: string): string;
var
  Temp: TWin32FindData;
  SearchHandle: THandle;
begin
  SearchHandle := FindFirstFile(PChar(ShortName), Temp);
  if SearchHandle <> INVALID_HANDLE_VALUE then begin
    Result := string(Temp.cFileName);
    if Result = '' then Result := string(Temp.cAlternateFileName);
  end
  else Result := '';
  Windows.FindClose(SearchHandle);
end;

function LongToShortFileName(const LongName: string): string;
var
  Temp: TWin32FindData;
  SearchHandle: THandle;
begin
  SearchHandle := FindFirstFile(PChar(LongName), Temp);
  if SearchHandle <> INVALID_HANDLE_VALUE then begin
    Result := string(Temp.cAlternateFileName);
    if Result = '' then Result := string(Temp.cFileName);
  end
  else Result := '';
  Windows.FindClose(SearchHandle);
end;

function ShortToLongPath(const ShortName: string): string;
var
  LastSlash: PChar;
  TempPathPtr: PChar;
begin
  Result := '';
  TempPathPtr := PChar(ShortName);
  LastSlash := StrRScan(TempPathPtr, '\');
  while LastSlash <> nil do begin
    Result := '\' + ShortToLongFileName(TempPathPtr) + Result;
    if LastSlash <> nil then begin
      LastSlash^ := char(0);
      LastSlash := StrRScan(TempPathPtr, '\');
    end;
  end;
  Result := TempPathPtr + Result;
end;

function LongToShortPath(const LongName: string): string;
var
  LastSlash: PChar;
  TempPathPtr: PChar;
begin
  Result := '';
  TempPathPtr := PChar(LongName);
  LastSlash := StrRScan(TempPathPtr, '\');
  while LastSlash <> nil do begin
    Result := '\' + LongToShortFileName(TempPathPtr) + Result;
    if LastSlash <> nil then begin
      LastSlash^ := char(0);
      LastSlash := StrRScan(TempPathPtr, '\');
    end;
  end;
  Result := TempPathPtr + Result;
end;

aromigaret 19-11-2015 17:28:30

Neftalí, gracias por tu aporte. Utilice la función longtoshortnamefile y al utilizar el string que dá por resultado la función (la cual queda así 'PE0215~1') en el sql.text, da error de sintaxis en la clausula FROM. Así que no es por esa vía.
Pregunto desde mi ignorancia.... puede ser que al instalar xe5, modifique al Controlador ODBC dBase del motor de base de datos Microsoft Jet ?

AgustinOrtu 19-11-2015 18:10:53

Proba usar la ruta completa en NombreTabla y agregarle comillas (QuotedStr)

roman 19-11-2015 19:00:17

Cita:

Empezado por aromigaret (Mensaje 499605)
puede ser que al instalar xe5, modifique al Controlador ODBC dBase del motor de base de datos Microsoft Jet ?

Yo comenzaría revisando esto. Busca el controlador ODBC para dbase y compara las versiones antes y después de instalar delphi.

// Saludos

aromigaret 19-11-2015 19:59:57

AgustinOrtu, tampoco funciona así.
Roman verifiqué esa opción, y encontré que el administrador de ODBC de una pc donde no esta instalado xe5, no tiene cargado los drivers para manejar ni .dbf .xls ni .mdb. Ahora buscare como cargar esos driver y ver si funciona. Gracias por la pista y si tenes idea de como cargar estos drivers, por favor avísame. Muchas gracias

Casimiro Notevi 20-11-2015 00:02:58

https://www.microsoft.com/es-es/down....aspx?id=21373

Seleccionas tu versión de sistema y listo.

aromigaret 20-11-2015 19:26:01

Bueno, tampoco parece ser el camino por el ODBC. Verifique los drivers instalados y son los mismos que están en la PC donde esta instalado el xe5 y en el administrador del ODBC están todos cargados y configurados igual. Alguna otra idea por favor? Gracias.


La franja horaria es GMT +2. Ahora son las 17:39:22.

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