Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

 
 
Herramientas Buscar en Tema Desplegado
  #11  
Antiguo 03-07-2014
pani_alex pani_alex is offline
Miembro
 
Registrado: oct 2005
Posts: 51
Poder: 21
pani_alex Va por buen camino
realmente no lo se pero en el flamerobin tampoco hace caso cuando no se coloca el alias delante de los campos...

dejo aqui mi primer procedimiento aparentemente funcional de lo q estaba buscando, por si a alguien le sea de probecho

Código Delphi [-]
procedure TModGenerico.DB_ControlaDisplayLabel(ve_SqlQyery:TSQLQuery; ve_Cds:TClientDataSet);
var x,y,x_Pos,x_ultimo,x_primero:integer;
    v_campo,v_campo_buscado,v_sql,v_AliasDeTabla,strTemp:string;
    procedure copia_buscado;
    begin
      //exit;
      v_campo_buscado:=copy(v_sql,x_primero,((x_ultimo-x_primero)+1));
      //busca si la palabra encontrada no es una sentencia sql
      if(AnsiMatchStr(v_campo_buscado,['SELECT','END']))then begin
        v_campo_buscado:='';

      end;
    end;
    procedure saca_basura;
    var xx:integer;
    begin
      //exit;
      xx:=pos(#$A,v_sql);
      while xx>0 do begin
        //StringReplace(v_sql,#$A,' ',[rfReplaceAll]);
        //AnsiReplaceStr(v_sql,#$A,' ');
        Delete(v_sql,xx,1);
        insert(' ',v_sql,xx);
        //Insert();
        xx:=pos(#$A,v_sql);
      end;
      xx:=pos(#$D,v_sql);
      while xx>0 do begin
        //StringReplace(v_sql,#$D,' ',[rfReplaceAll]);
        AnsiReplaceStr(v_sql,#$D,' ');
        Delete(v_sql,xx,1);
        insert(' ',v_sql,xx);
        xx:=pos(#$D,v_sql);
      end;
      xx:=pos(#10,v_sql);
      while xx>0 do begin
        //StringReplace(v_sql,#10,' ',[rfReplaceAll]);
        //AnsiReplaceStr(v_sql,#10,' ');
        Delete(v_sql,xx,1);
        insert(' ',v_sql,xx);        
        xx:=pos(#10,v_sql);
      end;      
    end;
begin
  try
    for x:=0 to ve_Cds.FieldCount-1 do begin
      //--cerar variables
      x_ultimo:=0;
      x_primero:=0;
      v_campo_buscado:='';
      v_AliasDeTabla:='0';
      //--
      v_campo:=UpperCase(ve_Cds.Fields[x].FieldName);
      strTemp:=v_campo;
      //ve_Cds.DataSource.com
      v_sql:=uppercase(ve_SqlQyery.SQL.GetText);
      saca_basura;
      x_Pos:=pos(v_campo,v_sql);
      //busca si existe el campo dentro del texto del query, si no existe no puede ser encontrado
      if(x_Pos>0)then begin
        y:=x_Pos-1;
        while y>0 do begin
          //si hay una coma quiere decir q no es un campo alias o q no tiene alias de tabla
          if{(x_Pos=(y+1))and}(v_sql[y]=',')then
            Break;

          //pregunta si es alias de tabla
          if(v_AliasDeTabla='0')and(v_sql[y]='.')then begin
            v_AliasDeTabla:='S';
          end else if(v_AliasDeTabla='0')then begin
            v_AliasDeTabla:='N';
          end;

          if(v_AliasDeTabla='S')then begin
            //y:=y-1;
            if(x_ultimo=0)then x_ultimo:=x_Pos+length(v_campo)-1;
            //busca la primera posicion
            if(x_primero=0)and(x_ultimo>0)and(v_sql[y]=' ')then begin
              x_primero:=y+1;
            end;
            //si ya se encontro el primero y el ultimo ya esta
            if(x_primero>0)and(x_ultimo>0)then begin
              copia_buscado;
              Break;
            end;

          end else begin
            //buscar la ultimo posicion, el primero antes del campo
            if(x_ultimo=0)and(v_sql[y]<>' ')then begin
              x_ultimo:=y;
            end;
            //busca la primera posicion
            if(x_primero=0)and(x_ultimo>0)and((v_sql[y]=' ')or(v_sql[y]=#10))then begin
              x_primero:=y+1;
            end;
            //si ya se encontro el primero y el ultimo ya esta
            if(x_primero>0)and(x_ultimo>0)then begin
              copia_buscado;
              Break;
            end;
          end;
          y:=y-1;
        end;// while y
        if(v_campo_buscado<>'')then begin
          ve_Cds.Fields[x].DisplayLabel:=v_campo_buscado;
          strTemp:=strTemp+' - '+v_campo_buscado;
        end;
      end;// if x_pos
      if(FrmPrincipal.ppt_Desarrollo_Debug)then begin
        FrmPrincipal.mDesarrollo.Visible:=true;
        FrmPrincipal.mDesarrollo.Lines.Add(strTemp);
      end;
    end// for x
  except
    on e:Exception do
    ModPrincipal.MostrarError(Self.Name,'DB_ControlaDisplayLabel','',e.Message);
  end
end;

recien hoy lo hice funcionar en lo que probe, pero tiene limitaciones, no se puede usar *, se deben escribir todos los campos y no detecta campos muy complicados, como los de los case y otros, la parte de desarrollo es solo para ver lo q hace

por dar un ejemplo, esto es lo q hace, recorre los field del clientdataset y busca en el query el campo con su alias al que pertenece y este es el resultado
ID_PERSONA - U.ID_PERSONA
ID_CAJA - U.ID_CAJA
ID_USUARIO - U.ID_USUARIO
ID_SUCURSALAGENCIA
ADMINISTRADOR - U.ADMINISTRADOR
LOGIN - U.LOGIN
DESCRIPCION - SA.DESCRIPCION
CLAVE - U.CLAVE
ROOT - U.ROOT
CORREO - U.CORREO
AUTORIZATIPOCAMBIO - U.AUTORIZATIPOCAMBIO
OMITEDECLARACIONJURADA - U.OMITEDECLARACIONJURADA
MONTOMAXIMOAUTORIZACION - U.MONTOMAXIMOAUTORIZACION
AUTORIZACLIENTE - U.AUTORIZACLIENTE
AUTORIZADOCUMENTOCLIENTE - U.AUTORIZADOCUMENTOCLIENTE
ESTADO - U.ESTADO
CODIGO - SA.CODIGO
DESSUCURSALAGENCIA - SA.DESCRIPCION
CLAVEAUTORIZACIONES - U.CLAVEAUTORIZACIONES
VARIACIONPERMITIDATIPOCAMBIO - U.VARIACIONPERMITIDATIPOCAMBIO
CODCAJA - C.CODIGO
CAJANUMERADOR
DESCAJA
AUTORIZAACTOSYDOC - U.AUTORIZAACTOSYDOC
ID_IMPRESORA - U.ID_IMPRESORA
AUTORIZAIMPRESION - U.AUTORIZAIMPRESION
MONTOVARIACIONPERMITIDA - U.MONTOVARIACIONPERMITIDA
AUTORIZAANULACION - U.AUTORIZAANULACION
AUTORIZAAPERTURA - U.AUTORIZAAPERTURA
AUTORIZACIERRE - U.AUTORIZACIERRE
AUTORIZASALDOS - U.AUTORIZASALDOS
ID_USUARIO_INSERTA - U.ID_USUARIO_INSERTA
ID_USUARIO_MODIFICA - U.ID_USUARIO_MODIFICA
FECHAALTA - U.FECHAALTA
FECHABAJA - U.FECHABAJA
AUTORIZAOTRODIA - U.AUTORIZAOTRODIA
AUTORIZAPRECIOPIZARRA - U.AUTORIZAPRECIOPIZARRA
SEMAFORO - U.SEMAFORO
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
No me dibuja en un label en el tiempo correcto noob Varios 5 11-02-2009 23:15:38
como saber que .dll's necesito en mi aplicacion? federiconqn21 Varios 2 15-09-2006 22:14:57
necesito saber cosas hecla Varios 1 30-06-2006 22:04:26
ayuda, necesito saber 2 instrucciones SQL manolop Firebird e Interbase 2 16-05-2005 12:03:50
Necesito Saber Donde Lo Descargo!! condor Varios 17 21-05-2004 20:48:50


La franja horaria es GMT +2. Ahora son las 06:58:45.


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