Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-02-2012
Paulao Paulao is offline
Miembro
 
Registrado: sep 2003
Ubicación: Rua D 31 Casa 1 - Inhoaíba - Rio de Janeiro - RJ - Brasil
Posts: 637
Poder: 21
Paulao Va por buen camino
Como hacer busqueda en Unit y lo enviar para excel?

Asi. Tengo un sistema legado en Delphi 5 y Sql Server 2008 R2. Mi jefe me lo pidio esto. Que yo devo hacer un programa, que has un lista de todas las tablas de mi banco(sysobjects) y despues pegue el nombre desas tablas del banco de datos y buscar en ese proyecto antigo quales son las Units que usan essas tablas y hacer una lista con: Tabla -> Unit y exportar para excel. Esa aplicacion nueva estas siendo desarrollada en Delphi XE.
Responder Con Cita
  #2  
Antiguo 24-02-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Mediante FindFirst, FindNext, deberás recorrer todos los archivos *.pas y *.dfm.
Por cada archivo:
Cargas cada archivo en un TStringList.
Código Delphi [-]
Lista := TStringList.Create; 
Lista.LoadFromFile(archivo);
Luego recorres cada linea del TStringList buscando las tablas y el nombre de la Unit
Código Delphi [-]
for i := 0 to Lista.Count -1 do
begin
   ...
end;
Responder Con Cita
  #3  
Antiguo 24-02-2012
Paulao Paulao is offline
Miembro
 
Registrado: sep 2003
Ubicación: Rua D 31 Casa 1 - Inhoaíba - Rio de Janeiro - RJ - Brasil
Posts: 637
Poder: 21
Paulao Va por buen camino
Bueno, esto es lo que estoy trabajando y usando TList<String> en lugar de TStringList, que para mi no hace diferencia. La Duda es, tengo que abri el .PAS y hacer yna busqueda asi. Saber en qual Unit, yo tengo el nombre de la tabla, asi: Vamos decir que tengo una tabla que sy llama Cliente. Y esa tabla estas siendo usada en las units: uCliente, uVendas, uCompras(Esto es solo un ejemplo). Y tengo 30 Units. O que yo quiero es que, quando yo impiezar mi busqueda, el va abrinfo las units y percorendo ella para ver si adentro della hay la palavra "Cliente". Si hay, entonces ele graba en una lista y no necesita mas recorer aqulla unit, se va a otra hasta terminar todo y despues el saca otro nombre de tabla y hace otra vez y asi, hasta que tudo se lo termina. No se si fue explicito, pues el idioma no me ayuda mucho, lo mio y los de usteds, pero es mas o menos esto.
Responder Con Cita
  #4  
Antiguo 24-02-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Paulao.

A ver si interpreté bién lo que estas buscando...
Código Delphi [-]
function TextFoundInFile(Ruta: string; const Buscado: string): TStrings;
var
  SR: TSearchRec;
  txt: TextFile;
  Row: string;
  Found: Boolean;
begin
  Result:= TStringList.Create;
  Ruta:= IncludeTrailingPathDelimiter(Ruta);
  if FindFirst(Ruta + '*.PAS', $FF, SR) = 0 then
    repeat
      AssignFile(txt,Ruta + SR.Name);
      Reset(txt);
      Found:= False;
      while not Eof(txt) and not Found do
      begin
        Readln(txt, Row);
        if Pos(Buscado, Row) > 0 then
        begin
          Result.Add(Ruta + SR.Name);
          Found:= True;
        end;
      end;
      CloseFile(txt);
    until FindNext(SR) <> 0;
end;

Llamada de ejemplo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items:= TextFoundInFile(edRuta.Text, edBuscado.Text);
  TextFoundInFile(edRuta.Text, edBuscado.Text).SaveToFile('C:\LISTA.TXT')
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 24-02-2012 a las 17:30:14.
Responder Con Cita
  #5  
Antiguo 29-02-2012
Paulao Paulao is offline
Miembro
 
Registrado: sep 2003
Ubicación: Rua D 31 Casa 1 - Inhoaíba - Rio de Janeiro - RJ - Brasil
Posts: 637
Poder: 21
Paulao Va por buen camino
ecfisa, hizo algunas alteraciones y ahora estas. Una pregunta: Como hago para hacer busqueda en .pas y .dfm al mismo tiempo con FindFirst?
Responder Con Cita
  #6  
Antiguo 29-02-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Paulao Ver Mensaje
ecfisa, hizo algunas alteraciones y ahora estas. Una pregunta: Como hago para hacer busqueda en .pas y .dfm al mismo tiempo con FindFirst?
No se puede hacer con FindFirst en una sola llamada, sin embargo se me ocurre un truco usando TStrings. Podría implementarse de forma recursiva´pero consume más recursos y quizá sea un poco más lento.
Código Delphi [-]
function TextFoundInFile(Ruta: string; const FileMask:string;  const Buscado: string): TStrings;
var
  SR: TSearchRec;
  txt: TextFile;
  Row: string;
  Found: Boolean;
  NroExt: TStrings;
  i: Integer;
begin
  NroExt:= TStringList.Create;
  try
    NroExt.Delimiter:= ';';
    NroExt.DelimitedText:= FileMask;
    Ruta:= IncludeTrailingPathDelimiter(Ruta);
    Result:= TStringList.Create;
    for i:= 0 to NroExt.Count - 1 do
    begin
      if FindFirst(Ruta + NroExt[i], faAnyFile - faDirectory, SR) = 0 then
        repeat
          AssignFile(txt,Ruta + SR.Name);
          Reset(txt);
          Found:= False;
          while not Eof(txt) and not Found do
          begin
            Readln(txt, Row);
            if Pos(Buscado, Row) > 0 then
            begin
              Result.Add(Ruta + SR.Name);
              Found:= True
            end
          end;
          CloseFile(txt);
        until FindNext(SR) <> 0
    end
  finally
    NroExt.Free
  end
end;

Llamada:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 edFileMask.Text:= '*.PAS; *.DFM';  // El separador TIENE que  ser ';'
 ListBox1.Items:= TextFoundInFile(edRuta.Text, edFileMask.Text, edBuscado.Text).SaveToFile('C:\LISTA.TXT')
end;
De ese modo podés pasar la máscara que desees al argumento FileMask, por ejemplo: '*.PAS;*.DFM;*.TXT;*.BAT;*.RC'

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 29-02-2012 a las 17:05:20.
Responder Con Cita
  #7  
Antiguo 29-02-2012
Paulao Paulao is offline
Miembro
 
Registrado: sep 2003
Ubicación: Rua D 31 Casa 1 - Inhoaíba - Rio de Janeiro - RJ - Brasil
Posts: 637
Poder: 21
Paulao Va por buen camino
Hizo estas alteraciones:
Código Delphi [-]
function TForm1.TextFoundInFile(path: string; const FileMask:string; const tipo, tabela: string): TStrings;
var
  SR: TSearchRec;
  txt: TextFile;
  Row: string;
  Found: Boolean;
  i: Integer;
  NroExt: TStrings;
begin
  NroExt:= TStringList.Create;
  try
    NroExt.Delimiter:= ';';
    NroExt.DelimitedText:= FileMask;
    path := IncludeTrailingPathDelimiter(path);
    Result := TStringList.Create;
    for i:= 0 to NroExt.Count - 1 do
    begin
      if FindFirst(path + NroExt[i], faAnyFile - faDirectory, SR) = 0 then
        repeat
          AssignFile(txt,path + SR.Name);
          Reset(txt);
          Found:= False;
          while not Eof(txt) and not Found do
          begin
            Readln(txt, Row);
            if Pos(tabela, Row) > 0 then
            begin
              Result.Add(tipo + ';' + tabela + ';' + SR.Name);
              Found:= True
            end
          end;
          CloseFile(txt);
        until FindNext(SR) <> 0
    end
  finally
    NroExt.Free;
  end
end;
El problema es quando me voy a exportar para excel. No estas funcionando. Abajo la forma como yo hago:
Código Delphi [-]
procedure TForm1.VarrerClick(Sender: TObject);
begin
  ClientDataSet1.Open;
  pth := IncludeTrailingPathDelimiter(edtDir.Directory);
  while not ClientDataSet1.Eof do
  begin
    TextFoundInFile(pth,'*.pas;*.dfm',ClientDataSet1.FieldByName('xtype').AsString,ClientDataSet1.FieldB  yName('name').AsString).SaveToFile('D:\Teste\LISTA.xls');
       ClientDataSet1.Next;
  end;

end;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cómo hacer para retornar valores de una Unit a otra karo Varios 6 14-03-2009 20:57:28
Ayuda para hacer una busqueda radije MySQL 0 30-04-2007 10:19:22
como puedo hacer para cambiar un archivo de excel con versión 2.1 a versión 8.0 RONPABLO Servers 4 23-01-2006 06:02:38
como puedo hacer para enviar un quick report por email?? merlin Internet 1 14-12-2003 20:24:17
como puedo hacer para enviar un quick report por email?? merlin Impresión 4 05-12-2003 18:06:58


La franja horaria es GMT +2. Ahora son las 15:49:12.


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
Copyright 1996-2007 Club Delphi