Ver Mensaje Individual
  #11  
Antiguo 03-07-2014
pani_alex pani_alex is offline
Miembro
 
Registrado: oct 2005
Posts: 51
Reputación: 19
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